From ba2430b5778b5b2414b94b818354fa1ff7cfd0db Mon Sep 17 00:00:00 2001 From: Pascal Kriete Date: Wed, 20 Apr 2011 21:44:13 -0400 Subject: [PATCH 0001/5397] Adding tests directory and initial implemenation draft. --- tests/readme.txt | 113 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 tests/readme.txt diff --git a/tests/readme.txt b/tests/readme.txt new file mode 100644 index 00000000000..eaad2c480bb --- /dev/null +++ b/tests/readme.txt @@ -0,0 +1,113 @@ +# Do not merge to default until this is blank # + +- Clean up naming conventions +- Figure out config stuff +- Figure out database testing + + + +# -------------- CodeIgniter Testing (4/20/2011) -------------- # + + +# Introduction: + +This is the preliminary CodeIgniter testing documentation. It +will cover both internal as well as external APIs and the reasoning +behind their implemenation, where appropriate. As with all CodeIgniter +documentation, this file should maintain a mostly human readable +format to facilitate clean api design. [see http://arrenbrecht.ch/testing/] + +*FIRST PUBLIC DRAFT: EVERYTHING IS SUBJECT TO CHANGE* + +# Test Suites: + +CodeIgniter bootstraps a request very directly, with very flat class +hierarchy. As a result, there is no main CodeIgniter class until the +controller is instantiated. + +This has forced the core classes to be relatively decoupled, which is +a good thing. However, it makes that portion of code relatively hard +to test. + +Right now that means we'll probably have two core test suites, along +with a base for application and package tests. That gives us: + +1. Bootstrap Test - test common.php and sanity check codeigniter.php [in planning] +2. System Test - test core components in relative isolation [in development] +3. Application Test - bootstrapping for application/tests [not started] +4. Package Test - bootstrapping for /tests [not started] + + +## 1. Bootstrap Test + +Testing common.php should be pretty simple. Include the file, and test the +functions. May require some tweaking so that we can grab the statics from all +methods (see is_loaded()). Testing the actual CodeIgniter.php file will most +likely be an output test for the default view, with some object checking after +the file runs. Needs consideration. + + +## 2. System Test + +Testing the core system relies on being able to isolate the core components +as much as possible. A few of them access other core classes as globals. These +should be mocked up and easy to manipulate. + +All functions in common.php should be a minimal implementation, or and mapped +to a method in the test's parent class to gives us full control of their output. + + +### CodeIgniterTestCase Documentation + + +Test cases should extend CodeIgniterTestCase. This internally +extends PHPUnit_Framework_TestCase, so you have access to all +of your usual PHPUnit methods. + +We need to provide a simple way to modify the globals and the +common function output. We also need to be able to mock up +the super object as we please. + +Current API is *not stable*. Names and implementations will change. + +$this->ci_instance($obj) + set the object to use as the "super object", in a lot + of cases this will be a simple stdClass with the attributes + you need it to have. + +$this->ci_set_instance_var($name, $val) + add an attribute to the super object. This is useful if you + set up a simple instance in setUp and then need to add different + class mockups to your super object. + +$this->ci_core_class($name) + Get the _class name_ of a core class, so that you can instantiate + it. The variable is returned by reference and is tied to the correct + $GLOBALS key. For example: + $cfg =& $this->ci_core_class('cfg'); // returns 'CI_Config' + $cfg = new $cfg; // instantiates config and overwrites the CFG global + +$this->ci_set_core_class($name, $obj); + An alternative way to set one of the core globals. + + +## 3. Application Test: + +Not sure yet, needs to handle: +- Libraries +- Helpers +- Models +- MY_* files +- Controllers (uh...?) +- Views? (watir, selenium, cucumber?) + +- Database Testing + + +## 4. Package Test: + +I don't have a clue how this will work. + +Needs to be able to handle packages +that are used multiple times within the application (i.e. EE/Pyro modules) +as well as packages that are used by multiple applications (library distributions) \ No newline at end of file From 69c97a71476e4eaa6c629022fcd4ec7f36d4ec0d Mon Sep 17 00:00:00 2001 From: Pascal Kriete Date: Wed, 20 Apr 2011 21:44:54 -0400 Subject: [PATCH 0002/5397] Adding early bootstrap ideas for core test suite --- tests/Bootstrap.php | 21 +++ tests/codeigniter/Setup_test.php | 13 ++ tests/codeigniter/core/Config_test.php | 107 +++++++++++++ tests/codeigniter/core/Lang_test.php | 31 ++++ tests/codeigniter/core/Loader_test.php | 144 ++++++++++++++++++ .../codeigniter/helpers/Array_helper_test.php | 49 ++++++ tests/codeigniter/libraries/Parser_test.php | 125 +++++++++++++++ tests/lib/ci_testcase.php | 110 +++++++++++++ tests/lib/common.php | 120 +++++++++++++++ tests/phpunit.xml | 17 +++ 10 files changed, 737 insertions(+) create mode 100644 tests/Bootstrap.php create mode 100644 tests/codeigniter/Setup_test.php create mode 100644 tests/codeigniter/core/Config_test.php create mode 100644 tests/codeigniter/core/Lang_test.php create mode 100644 tests/codeigniter/core/Loader_test.php create mode 100644 tests/codeigniter/helpers/Array_helper_test.php create mode 100644 tests/codeigniter/libraries/Parser_test.php create mode 100644 tests/lib/ci_testcase.php create mode 100644 tests/lib/common.php create mode 100644 tests/phpunit.xml diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php new file mode 100644 index 00000000000..ca63ff788f3 --- /dev/null +++ b/tests/Bootstrap.php @@ -0,0 +1,21 @@ +markTestIncomplete('not implemented'); + // ensure that our bootstrapped test environment + // is a good representation of an isolated CI install + //die('here'); + } + +} \ No newline at end of file diff --git a/tests/codeigniter/core/Config_test.php b/tests/codeigniter/core/Config_test.php new file mode 100644 index 00000000000..628fc630bc1 --- /dev/null +++ b/tests/codeigniter/core/Config_test.php @@ -0,0 +1,107 @@ +ci_core_class('cfg'); + + $stub = $this->getMock($cls, NULL, array(), '', FALSE); + + //I would prefer this, but it currently + // does not work as when you try to pass + // null to setMethods it fails on an internal + // function call that expects an array =( + /* + $stub = $this->getMockBuilder($cls) + ->disableOriginalConstructor() + ->setMethods(null) + ->getMock(); + */ + + + // set predictable config values + $stub->config = array( + 'index_page' => 'index.php', + 'base_url' => 'http://example.com/', + 'subclass_prefix' => 'MY_' + ); + + $this->config = $stub; + } + + // -------------------------------------------------------------------- + + public function testItem() + { + $this->assertEquals('http://example.com/', $this->config->item('base_url')); + + // Bad Config value + $this->assertFalse($this->config->item('no_good_item')); + + // Index + $this->assertFalse($this->config->item('no_good_item', 'bad_index')); + $this->assertFalse($this->config->item('no_good_item', 'default')); + } + + // -------------------------------------------------------------------- + + public function testSetItem() + { + $this->assertFalse($this->config->item('not_yet_set')); + + $this->config->set_item('not_yet_set', 'is set'); + + $this->assertEquals('is set', $this->config->item('not_yet_set')); + } + + // -------------------------------------------------------------------- + + public function testSlashItem() + { + // Bad Config value + $this->assertFalse($this->config->slash_item('no_good_item')); + + $this->assertEquals('http://example.com/', $this->config->slash_item('base_url')); + + $this->assertEquals('MY_/', $this->config->slash_item('subclass_prefix')); + } + + // -------------------------------------------------------------------- + + public function testSiteUrl() + { + $this->assertEquals('http://example.com/index.php', $this->config->site_url()); + + $base_url = $this->config->item('base_url'); + + $this->config->set_item('base_url', ''); + + $q_string = $this->config->item('enable_query_strings'); + + $this->config->set_item('enable_query_strings', FALSE); + + $this->assertEquals('/index.php/test', $this->config->site_url('test')); + $this->assertEquals('/index.php/test/1', $this->config->site_url(array('test', '1'))); + + $this->config->set_item('enable_query_strings', TRUE); + + $this->assertEquals('/index.php?test', $this->config->site_url('test')); + $this->assertEquals('/index.php?0=test&1=1', $this->config->site_url(array('test', '1'))); + + $this->config->set_item('base_url', $base_url); + + $this->assertEquals('http://example.com/index.php?test', $this->config->site_url('test')); + + // back to home base + $this->config->set_item('enable_query_strings', $q_string); + } + + // -------------------------------------------------------------------- + + public function testSystemUrl() + { + $this->assertEquals('http://example.com/system/', $this->config->system_url()); + } + +} \ No newline at end of file diff --git a/tests/codeigniter/core/Lang_test.php b/tests/codeigniter/core/Lang_test.php new file mode 100644 index 00000000000..82e279a525d --- /dev/null +++ b/tests/codeigniter/core/Lang_test.php @@ -0,0 +1,31 @@ +ci_core_class('lang'); + $this->lang = new $cls; + } + + // -------------------------------------------------------------------- + + public function testLoad() + { + // get_config needs work + $this->markTestIncomplete('get_config needs work'); + //$this->assertTrue($this->lang->load('profiler')); + } + + // -------------------------------------------------------------------- + + public function testLine() + { + $this->markTestIncomplete('get_config needs work'); + + $this->assertEquals('URI STRING', $this->lang->line('profiler_uri_string')); + } + +} \ No newline at end of file diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php new file mode 100644 index 00000000000..fd9c63216f2 --- /dev/null +++ b/tests/codeigniter/core/Loader_test.php @@ -0,0 +1,144 @@ +ci_core_class('load'); + $this->_loader = new $cls; + + // mock up a ci instance + $this->ci_obj = new StdClass; + + // Fix get_instance() + CodeIgniterTestCase::$test_instance =& $this; + $this->ci_instance($this->ci_obj); + } + + // -------------------------------------------------------------------- + + public function testLibrary() + { + // Mock up a config object until we + // figure out how to test the library configs + $config = $this->getMock('CI_Config', NULL, array(), '', FALSE); + $config->expects($this->any()) + ->method('load') + ->will($this->returnValue(TRUE)); + + // Add the mock to our stdClass + $this->ci_set_instance_var('config', $config); + + // Test loading as an array. + $this->assertEquals(NULL, $this->_loader->library(array('table'))); + $this->assertTrue(class_exists('CI_Table'), 'Table class exists'); + $this->assertAttributeInstanceOf('CI_Table', 'table', $this->ci_obj); + + // Test no lib given + $this->assertEquals(FALSE, $this->_loader->library()); + + // Test a string given to params + $this->assertEquals(NULL, $this->_loader->library('table', ' ')); + } + + // -------------------------------------------------------------------- + + public function testModels() + { + // Test loading as an array. + $this->assertEquals(NULL, $this->_loader->model(array('foobar'))); + + // Test no model given + $this->assertEquals(FALSE, $this->_loader->model('')); + + // Test a string given to params + $this->assertEquals(NULL, $this->_loader->model('foobar', ' ')); + } + + // -------------------------------------------------------------------- + + public function testDatabase() + { + $this->assertEquals(NULL, $this->_loader->database()); + $this->assertEquals(NULL, $this->_loader->dbutil()); + } + + // -------------------------------------------------------------------- + + public function testView() + { + // I'm not entirely sure this is the proper way to handle this. + // So, let's revist it, m'kay? + try + { + $this->_loader->view('foo'); + } + catch (Exception $expected) + { + return; + } + } + + // -------------------------------------------------------------------- + + public function testFile() + { + // I'm not entirely sure this is the proper way to handle this. + // So, let's revist it, m'kay? + try + { + $this->_loader->file('foo'); + } + catch (Exception $expected) + { + return; + } + } + + // -------------------------------------------------------------------- + + public function testVars() + { + $vars = array( + 'foo' => 'bar' + ); + + $this->assertEquals(NULL, $this->_loader->vars($vars)); + $this->assertEquals(NULL, $this->_loader->vars('foo', 'bar')); + } + + // -------------------------------------------------------------------- + + public function testHelper() + { + $this->assertEquals(NULL, $this->_loader->helper('array')); + $this->assertEquals(NULL, $this->_loader->helper('bad')); + } + + // -------------------------------------------------------------------- + + public function testHelpers() + { + $this->assertEquals(NULL, $this->_loader->helpers(array('file', 'array', 'string'))); + } + + // -------------------------------------------------------------------- + + // public function testLanguage() + // { + // $this->assertEquals(NULL, $this->_loader->language('test')); + // } + + // -------------------------------------------------------------------- + + public function testLoadConfig() + { + $this->assertEquals(NULL, $this->_loader->config('config', FALSE, TRUE)); + } + + + +} \ No newline at end of file diff --git a/tests/codeigniter/helpers/Array_helper_test.php b/tests/codeigniter/helpers/Array_helper_test.php new file mode 100644 index 00000000000..bbefdb49db5 --- /dev/null +++ b/tests/codeigniter/helpers/Array_helper_test.php @@ -0,0 +1,49 @@ +my_array = array( + 'foo' => 'bar', + 'sally' => 'jim', + 'maggie' => 'bessie', + 'herb' => 'cook' + ); + } + + // ------------------------------------------------------------------------ + + public function testElementWithExistingItem() + { + $this->assertEquals(FALSE, element('testing', $this->my_array)); + + $this->assertEquals('not set', element('testing', $this->my_array, 'not set')); + + $this->assertEquals('bar', element('foo', $this->my_array)); + } + + // ------------------------------------------------------------------------ + + public function testRandomElement() + { + // Send a string, not an array to random_element + $this->assertEquals('my string', random_element('my string')); + + // Test sending an array + $this->assertEquals(TRUE, in_array(random_element($this->my_array), $this->my_array)); + } + + // ------------------------------------------------------------------------ + + public function testElements() + { + $this->assertEquals(TRUE, is_array(elements('test', $this->my_array))); + $this->assertEquals(TRUE, is_array(elements('foo', $this->my_array))); + } + +} \ No newline at end of file diff --git a/tests/codeigniter/libraries/Parser_test.php b/tests/codeigniter/libraries/Parser_test.php new file mode 100644 index 00000000000..a8de108f027 --- /dev/null +++ b/tests/codeigniter/libraries/Parser_test.php @@ -0,0 +1,125 @@ +load->library('parser'); + self::$cls = get_class($CI->parser); + } + + // -------------------------------------------------------------------- + + public function setUp() + { + $cls = self::$cls; + $this->parser = new $cls; + } + // -------------------------------------------------------------------- + + public function testSetDelimiters() + { + // Make sure default delimiters are there + $this->assertEquals('{', $this->parser->l_delim); + $this->assertEquals('}', $this->parser->r_delim); + + // Change them to square brackets + $this->parser->set_delimiters('[', ']'); + + // Make sure they changed + $this->assertEquals('[', $this->parser->l_delim); + $this->assertEquals(']', $this->parser->r_delim); + + // Reset them + $this->parser->set_delimiters(); + + // Make sure default delimiters are there + $this->assertEquals('{', $this->parser->l_delim); + $this->assertEquals('}', $this->parser->r_delim); + } + + // -------------------------------------------------------------------- + + public function testParseSimpleString() + { + $data = array( + 'title' => 'Page Title', + 'body' => 'Lorem ipsum dolor sit amet.' + ); + + $template = "{title}\n{body}"; + + $result = implode("\n", $data); + + $this->assertEquals($result, $this->parser->parse_string($template, $data, TRUE)); + } + + // -------------------------------------------------------------------- + + public function testParse() + { + $this->_parse_no_template(); + $this->_parse_var_pair(); + $this->_mismatched_var_pair(); + } + + // -------------------------------------------------------------------- + + private function _parse_no_template() + { + $this->assertFalse($this->parser->parse_string('', '', TRUE)); + } + + // -------------------------------------------------------------------- + + private function _parse_var_pair() + { + $data = array( + 'title' => 'Super Heroes', + 'powers' => array( + array( + 'invisibility' => 'yes', + 'flying' => 'no'), + ) + ); + + $template = "{title}\n{powers}{invisibility}\n{flying}{/powers}"; + + $result = "Super Heroes\nyes\nno"; + + $this->assertEquals($result, $this->parser->parse_string($template, $data, TRUE)); + } + + // -------------------------------------------------------------------- + + private function _mismatched_var_pair() + { + $data = array( + 'title' => 'Super Heroes', + 'powers' => array( + array( + 'invisibility' => 'yes', + 'flying' => 'no'), + ) + ); + + $template = "{title}\n{powers}{invisibility}\n{flying}"; + + $result = "Super Heroes\n{powers}{invisibility}\n{flying}"; + + $this->assertEquals($result, $this->parser->parse_string($template, $data, TRUE)); + } + + // -------------------------------------------------------------------- + + // -------------------------------------------------------------------- + + // -------------------------------------------------------------------- + +} \ No newline at end of file diff --git a/tests/lib/ci_testcase.php b/tests/lib/ci_testcase.php new file mode 100644 index 00000000000..a8a272db27c --- /dev/null +++ b/tests/lib/ci_testcase.php @@ -0,0 +1,110 @@ + 'bm', + 'config' => 'cfg', + 'hooks' => 'ext', + 'utf8' => 'uni', + 'router' => 'rtr', + 'output' => 'out', + 'security' => 'sec', + 'input' => 'in', + 'lang' => 'lang', + + // @todo the loader is an edge case + 'loader' => 'load' + ); + + function __construct() + { + parent::__construct(); + } + + // -------------------------------------------------------------------- + + // Change what get_instance returns + function ci_instance($obj) + { + $this->ci_instance = $obj; + } + + // -------------------------------------------------------------------- + + function ci_set_instance_var($name, $obj) + { + $this->ci_instance->$name =& $obj; + } + + // -------------------------------------------------------------------- + + // Set a class to a mock before it is loaded + function ci_library($name) + { + + } + + // -------------------------------------------------------------------- + + /** + * Grab a core class + * + * Loads the correct core class without extensions + * and returns a reference to the class name in the + * globals array with the correct key. This way the + * test can modify the variable it assigns to and + * still maintain the global. + */ + function &ci_core_class($name) + { + $name = strtolower($name); + + if (isset(self::$global_map[$name])) + { + $class_name = ucfirst($name); + $global_name = self::$global_map[$name]; + } + elseif (in_array($name, self::$global_map)) + { + $class_name = ucfirst(array_search($name, self::$global_map)); + $global_name = $name; + } + else + { + throw new Exception('Not a valid core class.'); + } + + if ( ! class_exists('CI_'.$class_name)) + { + require_once BASEPATH.'core/'.$class_name.'.php'; + } + + $GLOBALS[strtoupper($global_name)] = 'CI_'.$class_name; + return $GLOBALS[strtoupper($global_name)]; + } + + // -------------------------------------------------------------------- + + // convenience function for global mocks + function ci_set_core_class($name, $obj) + { + $orig =& $this->ci_core_class($name); + $orig = $obj; + } + + // -------------------------------------------------------------------- + + static function ci_config($item) + { + return ''; + } +} + +// EOF \ No newline at end of file diff --git a/tests/lib/common.php b/tests/lib/common.php new file mode 100644 index 00000000000..482721a9ae2 --- /dev/null +++ b/tests/lib/common.php @@ -0,0 +1,120 @@ +ci_instance; +} + +// Config Stuff | @todo High priority! +// -------------------------------------------------------------------- + +function get_config() { die('implement me'); } + +function config_item($item) +{ + return CodeIgniterTestCase::ci_config($item); +} + +// -------------------------------------------------------------------- + +function load_class($class, $directory = 'libraries', $prefix = 'CI_') +{ + if ($directory != 'core' OR $prefix != 'CI_') + { + throw new Exception('Not Implemented: Non-core load_class()'); + } + + $test = CodeIgniterTestCase::$test_instance; + + $obj =& $test->ci_core_class($class); + + if (is_string($obj)) + { + throw new Exception('Bad Isolation: Use ci_set_core_class to set '.$class.''); + } + + return $obj; +} + +// This is sort of meh. Should probably be mocked up with +// controllable output, so that we can test some of our +// security code. The function itself will be tested in the +// bootstrap testsuite. +// -------------------------------------------------------------------- + +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; +} + + +// Clean up error messages +// -------------------------------------------------------------------- + +function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') +{ + throw new Exception('CI Error: '.$message); +} + +function show_404($page = '', $log_error = TRUE) +{ + throw new Exception('CI Error: 404'); +} + +function _exception_handler($severity, $message, $filepath, $line) +{ + throw new Exception('CI Exception: '.$message.' | '.$filepath.' | '.$line); +} + + +// We assume a few things about our environment ... +// -------------------------------------------------------------------- + +function is_php($version = '5.0.0') +{ + return ! (version_compare(PHP_VERSION, $version) < 0); +} + +function is_really_writable($file) +{ + return is_writable($file); +} + +function is_loaded() +{ + throw new Exception('Bad Isolation: mock up environment'); +} + +function log_message($level = 'error', $message, $php_error = FALSE) +{ + return TRUE; +} + +function set_status_header($code = 200, $text = '') +{ + return TRUE; +} + +// EOF \ No newline at end of file diff --git a/tests/phpunit.xml b/tests/phpunit.xml new file mode 100644 index 00000000000..9e5e10d591f --- /dev/null +++ b/tests/phpunit.xml @@ -0,0 +1,17 @@ + + + + + + codeigniter/Setup_test.php + codeigniter/core + + + + + \ No newline at end of file From c5d93cb3d4d8909507cbed548620e58d26c7c4bd Mon Sep 17 00:00:00 2001 From: Pascal Kriete Date: Thu, 21 Apr 2011 00:58:51 -0400 Subject: [PATCH 0003/5397] Removing some lefover code form experimenting with process isolation. --- tests/Bootstrap.php | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index ca63ff788f3..5a5eb645888 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -3,18 +3,10 @@ ini_set('display_errors', 1); error_reporting(E_ALL | E_STRICT); -if ( ! defined('PROJECT_BASE')) -{ - define('PROJECT_BASE', realpath(dirname(__FILE__).'/../').'/'); - - define('BASEPATH', PROJECT_BASE.'system/'); - define('APPPATH', PROJECT_BASE.'application/'); -} -// define('EXT', '.php'); - -// @todo provide a way to set various config options - +define('PROJECT_BASE', realpath(dirname(__FILE__).'/../').'/'); +define('BASEPATH', PROJECT_BASE.'system/'); +define('APPPATH', PROJECT_BASE.'application/'); // set up a highly controlled CI environment require_once './lib/common.php'; From fe372e30a8f05ec4a77dc9a5ea2ec471b3488bd3 Mon Sep 17 00:00:00 2001 From: Pascal Kriete Date: Thu, 21 Apr 2011 00:59:45 -0400 Subject: [PATCH 0004/5397] Fixing up the scope soup, and adding a way to set core config items. --- tests/lib/ci_testcase.php | 74 ++++++++++++++++++++++++++++++++++----- tests/lib/common.php | 18 ++++++---- 2 files changed, 78 insertions(+), 14 deletions(-) diff --git a/tests/lib/ci_testcase.php b/tests/lib/ci_testcase.php index a8a272db27c..04216e2a88e 100644 --- a/tests/lib/ci_testcase.php +++ b/tests/lib/ci_testcase.php @@ -4,10 +4,8 @@ // Need a way to change dependencies (core libs and laoded libs) // Need a way to set the CI class -class CodeIgniterTestCase extends PHPUnit_Framework_TestCase { +class CI_TestCase extends PHPUnit_Framework_TestCase { - public $ci_instance; - public static $test_instance; public static $global_map = array( 'benchmark' => 'bm', 'config' => 'cfg', @@ -23,23 +21,62 @@ class CodeIgniterTestCase extends PHPUnit_Framework_TestCase { 'loader' => 'load' ); - function __construct() + protected $ci_config = array(); + + protected $ci_instance; + protected static $ci_test_instance; + + + public function __construct() { parent::__construct(); } // -------------------------------------------------------------------- - // Change what get_instance returns - function ci_instance($obj) + /** + * Overwrite runBare + * + * PHPUnit instantiates the test classes before + * running them individually. So right before a test + * runs we set our instance. Normally this step would + * happen in setUp, but someone is bound to forget to + * call the parent method and debugging this is no fun. + */ + public function runBare() { + self::$ci_test_instance = $this; + parent::runBare(); + } + + // -------------------------------------------------------------------- + + public static function instance() + { + return self::$ci_test_instance; + } + + // -------------------------------------------------------------------- + + function ci_instance($obj = FALSE) + { + if ( ! is_object($obj)) + { + return $this->ci_instance; + } + $this->ci_instance = $obj; } // -------------------------------------------------------------------- - function ci_set_instance_var($name, $obj) + function ci_instance_var($name, $obj = FALSE) { + if ( ! is_object($obj)) + { + return $this->ci_instance->$name; + } + $this->ci_instance->$name =& $obj; } @@ -101,7 +138,28 @@ function ci_set_core_class($name, $obj) // -------------------------------------------------------------------- - static function ci_config($item) + function ci_set_config($key, $val = '') + { + if (is_array($key)) + { + $this->ci_config = $key; + } + else + { + $this->ci_config[$key] = $val; + } + } + + // -------------------------------------------------------------------- + + function ci_config_array() + { + return $this->ci_config; + } + + // -------------------------------------------------------------------- + + function ci_config_item($item) { return ''; } diff --git a/tests/lib/common.php b/tests/lib/common.php index 482721a9ae2..994e9bc22ae 100644 --- a/tests/lib/common.php +++ b/tests/lib/common.php @@ -4,18 +4,24 @@ function &get_instance() { - $test = CodeIgniterTestCase::$test_instance; - return $test->ci_instance; + $test = CI_TestCase::instance(); + $instance = $test->ci_instance(); + return $instance; } -// Config Stuff | @todo High priority! // -------------------------------------------------------------------- -function get_config() { die('implement me'); } +function &get_config() { + $test = CI_TestCase::instance(); + $config = $test->ci_config_array(); + + return $config; +} function config_item($item) { - return CodeIgniterTestCase::ci_config($item); + $test = CI_TestCase::instance(); + return $test->ci_config_item($item); } // -------------------------------------------------------------------- @@ -27,7 +33,7 @@ function load_class($class, $directory = 'libraries', $prefix = 'CI_') throw new Exception('Not Implemented: Non-core load_class()'); } - $test = CodeIgniterTestCase::$test_instance; + $test = CI_TestCase::instance(); $obj =& $test->ci_core_class($class); From 10ba64f9b76a25a77182d72a0a09413ccba12770 Mon Sep 17 00:00:00 2001 From: Pascal Kriete Date: Thu, 21 Apr 2011 01:00:27 -0400 Subject: [PATCH 0005/5397] Renamed the main test class, fixing test cases. --- tests/codeigniter/core/Config_test.php | 26 ++++++-------------------- tests/codeigniter/core/Lang_test.php | 2 +- tests/codeigniter/core/Loader_test.php | 5 ++--- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/tests/codeigniter/core/Config_test.php b/tests/codeigniter/core/Config_test.php index 628fc630bc1..b04dd67fac4 100644 --- a/tests/codeigniter/core/Config_test.php +++ b/tests/codeigniter/core/Config_test.php @@ -1,33 +1,19 @@ ci_core_class('cfg'); - - $stub = $this->getMock($cls, NULL, array(), '', FALSE); - - //I would prefer this, but it currently - // does not work as when you try to pass - // null to setMethods it fails on an internal - // function call that expects an array =( - /* - $stub = $this->getMockBuilder($cls) - ->disableOriginalConstructor() - ->setMethods(null) - ->getMock(); - */ - - + // set predictable config values - $stub->config = array( + $this->ci_set_config(array( 'index_page' => 'index.php', 'base_url' => 'http://example.com/', 'subclass_prefix' => 'MY_' - ); - - $this->config = $stub; + )); + + $this->config = new $cls; } // -------------------------------------------------------------------- diff --git a/tests/codeigniter/core/Lang_test.php b/tests/codeigniter/core/Lang_test.php index 82e279a525d..f65b335b083 100644 --- a/tests/codeigniter/core/Lang_test.php +++ b/tests/codeigniter/core/Lang_test.php @@ -1,6 +1,6 @@ ci_obj = new StdClass; // Fix get_instance() - CodeIgniterTestCase::$test_instance =& $this; $this->ci_instance($this->ci_obj); } @@ -30,7 +29,7 @@ public function testLibrary() ->will($this->returnValue(TRUE)); // Add the mock to our stdClass - $this->ci_set_instance_var('config', $config); + $this->ci_instance_var('config', $config); // Test loading as an array. $this->assertEquals(NULL, $this->_loader->library(array('table'))); From f5aee9d1532b175d2dbfbb66f56e8861f34cd861 Mon Sep 17 00:00:00 2001 From: Pascal Kriete Date: Thu, 21 Apr 2011 01:20:40 -0400 Subject: [PATCH 0006/5397] some basic bootstrap cleanup --- tests/Bootstrap.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index 5a5eb645888..94dafdce401 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -1,13 +1,20 @@ Date: Thu, 21 Apr 2011 01:21:27 -0400 Subject: [PATCH 0007/5397] a bit of shuffling around in CI_TestCase --- tests/lib/ci_testcase.php | 89 +++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 51 deletions(-) diff --git a/tests/lib/ci_testcase.php b/tests/lib/ci_testcase.php index 04216e2a88e..c8c6bc9002d 100644 --- a/tests/lib/ci_testcase.php +++ b/tests/lib/ci_testcase.php @@ -5,8 +5,12 @@ // Need a way to set the CI class class CI_TestCase extends PHPUnit_Framework_TestCase { + + protected $ci_config; + protected $ci_instance; + protected static $ci_test_instance; - public static $global_map = array( + private $global_map = array( 'benchmark' => 'bm', 'config' => 'cfg', 'hooks' => 'ext', @@ -21,39 +25,25 @@ class CI_TestCase extends PHPUnit_Framework_TestCase { 'loader' => 'load' ); - protected $ci_config = array(); - - protected $ci_instance; - protected static $ci_test_instance; - - public function __construct() { parent::__construct(); + + $this->ci_config = array(); } // -------------------------------------------------------------------- - /** - * Overwrite runBare - * - * PHPUnit instantiates the test classes before - * running them individually. So right before a test - * runs we set our instance. Normally this step would - * happen in setUp, but someone is bound to forget to - * call the parent method and debugging this is no fun. - */ - public function runBare() - { - self::$ci_test_instance = $this; - parent::runBare(); - } - - // -------------------------------------------------------------------- - - public static function instance() + function ci_set_config($key, $val = '') { - return self::$ci_test_instance; + if (is_array($key)) + { + $this->ci_config = $key; + } + else + { + $this->ci_config[$key] = $val; + } } // -------------------------------------------------------------------- @@ -80,14 +70,6 @@ function ci_instance_var($name, $obj = FALSE) $this->ci_instance->$name =& $obj; } - // -------------------------------------------------------------------- - - // Set a class to a mock before it is loaded - function ci_library($name) - { - - } - // -------------------------------------------------------------------- /** @@ -103,14 +85,14 @@ function &ci_core_class($name) { $name = strtolower($name); - if (isset(self::$global_map[$name])) + if (isset($this->global_map[$name])) { $class_name = ucfirst($name); - $global_name = self::$global_map[$name]; + $global_name = $this->global_map[$name]; } - elseif (in_array($name, self::$global_map)) + elseif (in_array($name, $this->global_map)) { - $class_name = ucfirst(array_search($name, self::$global_map)); + $class_name = ucfirst(array_search($name, $this->global_map)); $global_name = $name; } else @@ -136,32 +118,37 @@ function ci_set_core_class($name, $obj) $orig = $obj; } + // -------------------------------------------------------------------- + // Internals // -------------------------------------------------------------------- - function ci_set_config($key, $val = '') + /** + * Overwrite runBare + * + * PHPUnit instantiates the test classes before + * running them individually. So right before a test + * runs we set our instance. Normally this step would + * happen in setUp, but someone is bound to forget to + * call the parent method and debugging this is no fun. + */ + public function runBare() { - if (is_array($key)) - { - $this->ci_config = $key; - } - else - { - $this->ci_config[$key] = $val; - } + self::$ci_test_instance = $this; + parent::runBare(); } // -------------------------------------------------------------------- - function ci_config_array() + public static function instance() { - return $this->ci_config; + return self::$ci_test_instance; } // -------------------------------------------------------------------- - function ci_config_item($item) + function ci_get_config() { - return ''; + return $this->ci_config; } } From 88b296311090acdb84719148d3c722ca30bd3ed7 Mon Sep 17 00:00:00 2001 From: Pascal Kriete Date: Thu, 21 Apr 2011 01:21:55 -0400 Subject: [PATCH 0008/5397] Making config_item work again after I pulled it from CI_TestCase --- tests/lib/common.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/lib/common.php b/tests/lib/common.php index 994e9bc22ae..6d29eb0d616 100644 --- a/tests/lib/common.php +++ b/tests/lib/common.php @@ -13,15 +13,21 @@ function &get_instance() function &get_config() { $test = CI_TestCase::instance(); - $config = $test->ci_config_array(); + $config = $test->ci_get_config(); return $config; } function config_item($item) { - $test = CI_TestCase::instance(); - return $test->ci_config_item($item); + $config =& get_config(); + + if ( ! isset($config[$item])) + { + return FALSE; + } + + return $config[$item]; } // -------------------------------------------------------------------- From 34bc0896ea283fefdba5213a67e6db6134b982b6 Mon Sep 17 00:00:00 2001 From: Pascal Kriete Date: Thu, 21 Apr 2011 01:22:23 -0400 Subject: [PATCH 0009/5397] Updating changes in the readme --- tests/readme.txt | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/tests/readme.txt b/tests/readme.txt index eaad2c480bb..27871478bf6 100644 --- a/tests/readme.txt +++ b/tests/readme.txt @@ -57,12 +57,12 @@ All functions in common.php should be a minimal implementation, or and mapped to a method in the test's parent class to gives us full control of their output. -### CodeIgniterTestCase Documentation +### CI_TestCase Documentation -Test cases should extend CodeIgniterTestCase. This internally -extends PHPUnit_Framework_TestCase, so you have access to all -of your usual PHPUnit methods. +Test cases should extend CI_TestCase. This internally extends +PHPUnit_Framework_TestCase, so you have access to all of your +usual PHPUnit methods. We need to provide a simple way to modify the globals and the common function output. We also need to be able to mock up @@ -70,12 +70,16 @@ the super object as we please. Current API is *not stable*. Names and implementations will change. +$this->ci_set_config($key, $val) + Set the global config variables. If key is an array, it will + replace the entire config array. They are _not_ merged. + $this->ci_instance($obj) set the object to use as the "super object", in a lot of cases this will be a simple stdClass with the attributes - you need it to have. + you need it to have. If no parameter, will return the instance. -$this->ci_set_instance_var($name, $val) +$this->ci_instance_var($name, $val) add an attribute to the super object. This is useful if you set up a simple instance in setUp and then need to add different class mockups to your super object. @@ -87,9 +91,18 @@ $this->ci_core_class($name) $cfg =& $this->ci_core_class('cfg'); // returns 'CI_Config' $cfg = new $cfg; // instantiates config and overwrites the CFG global -$this->ci_set_core_class($name, $obj); +$this->ci_set_core_class($name, $obj) An alternative way to set one of the core globals. +$this->ci_get_config() __internal__ + Returns the global config array. Internal as you shouldn't need to + call this (you're setting it, after all). Used internally to make + CI's get_config() work. + +CI_TestCase::instance() __internal__ + Returns an instance of the current test case. We force phpunit to + run with backup-globals enabled, so this will always be the instance + of the currently running test class. ## 3. Application Test: From 25a6690724751d1937a8adc867ca630830b2eb6f Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 09:24:16 -0500 Subject: [PATCH 0010/5397] Updating requirements for unit tests in readme.txt --- tests/readme.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/readme.txt b/tests/readme.txt index 27871478bf6..b1e9b732f04 100644 --- a/tests/readme.txt +++ b/tests/readme.txt @@ -19,6 +19,17 @@ format to facilitate clean api design. [see http://arrenbrecht.ch/testing/] *FIRST PUBLIC DRAFT: EVERYTHING IS SUBJECT TO CHANGE* +# Requirements + +1. PHP Unit + - pear channel-discover pear.phpunit.de + - pear install phpunit/PHPUnit + +2. vfsStream + - pear channel-discover pear.php-tools.net + - pear install pat/vfsStream-alpha + + # Test Suites: CodeIgniter bootstraps a request very directly, with very flat class From 8da69039f6d855eb4f88de73702155e6899d2d23 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 11:28:27 -0500 Subject: [PATCH 0011/5397] Working on tests in the loader. Have generic model mocking working with vfsStream. --- tests/codeigniter/core/Loader_test.php | 134 +++++++++++++++++-------- tests/lib/ci_testcase.php | 4 +- 2 files changed, 92 insertions(+), 46 deletions(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index c7085c43925..2aa1b8cb90e 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -1,5 +1,38 @@ models_dir = vfsStream::newDirectory('models')->at(vfsStreamWrapper::getRoot()); + $this->libs_dir = vfsStream::newDirectory('libraries')->at(vfsStreamWrapper::getRoot()); + $this->helpers_dir = vfsStream::newDirectory('helpers')->at(vfsStreamWrapper::getRoot()); + $this->views_dir = vfsStream::newDirectory('views')->at(vfsStreamWrapper::getRoot()); + + $this->_ci_ob_level = ob_get_level(); + $this->_ci_library_paths = array(vfsStream::url('application').'/', BASEPATH); + $this->_ci_helper_paths = array(vfsStream::url('application').'/', BASEPATH); + $this->_ci_model_paths = array(vfsStream::url('application').'/'); + $this->_ci_view_paths = array(vfsStream::url('application').'/views/' => TRUE); + } +} + + class Loader_test extends CI_TestCase { private $ci_obj; @@ -7,8 +40,7 @@ class Loader_test extends CI_TestCase { public function setUp() { // Instantiate a new loader - $cls = $this->ci_core_class('load'); - $this->_loader = new $cls; + $this->load = new Extended_Loader(); // mock up a ci instance $this->ci_obj = new StdClass; @@ -32,53 +64,67 @@ public function testLibrary() $this->ci_instance_var('config', $config); // Test loading as an array. - $this->assertEquals(NULL, $this->_loader->library(array('table'))); + $this->assertEquals(NULL, $this->load->library(array('table'))); $this->assertTrue(class_exists('CI_Table'), 'Table class exists'); $this->assertAttributeInstanceOf('CI_Table', 'table', $this->ci_obj); // Test no lib given - $this->assertEquals(FALSE, $this->_loader->library()); + $this->assertEquals(FALSE, $this->load->library()); // Test a string given to params - $this->assertEquals(NULL, $this->_loader->library('table', ' ')); + $this->assertEquals(NULL, $this->load->library('table', ' ')); } // -------------------------------------------------------------------- + public function testNonExistentModel() + { + $this->setExpectedException( + 'Exception', + 'CI Error: Unable to locate the model you have specified: ci_test_nonexistent_mode.php' + ); + + $this->load->model('ci_test_nonexistent_mode.php'); + } + + // -------------------------------------------------------------------- + public function testModels() { - // Test loading as an array. - $this->assertEquals(NULL, $this->_loader->model(array('foobar'))); + $this->ci_set_core_class('model', 'CI_Model'); + + $content = 'withContent($content) + ->at($this->load->models_dir); + + $this->assertNull($this->load->model('unit_test_model')); // Test no model given - $this->assertEquals(FALSE, $this->_loader->model('')); + $this->assertEquals(FALSE, $this->load->model('')); // Test a string given to params - $this->assertEquals(NULL, $this->_loader->model('foobar', ' ')); + // $this->assertEquals(NULL, $this->load->model('foobar', ' ')); } // -------------------------------------------------------------------- - public function testDatabase() - { - $this->assertEquals(NULL, $this->_loader->database()); - $this->assertEquals(NULL, $this->_loader->dbutil()); - } + // public function testDatabase() + // { + // $this->assertEquals(NULL, $this->load->database()); + // $this->assertEquals(NULL, $this->load->dbutil()); + // } // -------------------------------------------------------------------- - public function testView() + public function testNonExistentView() { - // I'm not entirely sure this is the proper way to handle this. - // So, let's revist it, m'kay? - try - { - $this->_loader->view('foo'); - } - catch (Exception $expected) - { - return; - } + $this->setExpectedException( + 'Exception', + 'CI Error: Unable to load the requested file: ci_test_nonexistent_view.php' + ); + + $this->load->view('ci_test_nonexistent_view', array('foo' => 'bar')); } // -------------------------------------------------------------------- @@ -86,10 +132,9 @@ public function testView() public function testFile() { // I'm not entirely sure this is the proper way to handle this. - // So, let's revist it, m'kay? try { - $this->_loader->file('foo'); + $this->load->file('foo'); } catch (Exception $expected) { @@ -105,39 +150,40 @@ public function testVars() 'foo' => 'bar' ); - $this->assertEquals(NULL, $this->_loader->vars($vars)); - $this->assertEquals(NULL, $this->_loader->vars('foo', 'bar')); + $this->assertEquals(NULL, $this->load->vars($vars)); + $this->assertEquals(NULL, $this->load->vars('foo', 'bar')); } // -------------------------------------------------------------------- - public function testHelper() - { - $this->assertEquals(NULL, $this->_loader->helper('array')); - $this->assertEquals(NULL, $this->_loader->helper('bad')); - } + // public function testHelper() + // { + // $this->assertEquals(NULL, $this->load->helper('array')); + // $this->assertEquals(NULL, $this->load->helper('bad')); + // } // -------------------------------------------------------------------- public function testHelpers() { - $this->assertEquals(NULL, $this->_loader->helpers(array('file', 'array', 'string'))); + $this->assertEquals(NULL, $this->load->helpers(array('file', 'array', 'string'))); } // -------------------------------------------------------------------- // public function testLanguage() // { - // $this->assertEquals(NULL, $this->_loader->language('test')); + // $this->assertEquals(NULL, $this->load->language('test')); // } // -------------------------------------------------------------------- - public function testLoadConfig() - { - $this->assertEquals(NULL, $this->_loader->config('config', FALSE, TRUE)); - } - - - -} \ No newline at end of file + // public function testLoadConfig() + // { + // $this->assertEquals(NULL, $this->load->config('config', FALSE, TRUE)); + // } +} + + + + diff --git a/tests/lib/ci_testcase.php b/tests/lib/ci_testcase.php index c8c6bc9002d..10539a3af79 100644 --- a/tests/lib/ci_testcase.php +++ b/tests/lib/ci_testcase.php @@ -20,9 +20,9 @@ class CI_TestCase extends PHPUnit_Framework_TestCase { 'security' => 'sec', 'input' => 'in', 'lang' => 'lang', - // @todo the loader is an edge case - 'loader' => 'load' + 'loader' => 'load', + 'model' => 'model' ); public function __construct() From 98357c5865dbec43bcb79fb114469d40cf2f5367 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 11:30:23 -0500 Subject: [PATCH 0012/5397] Swap from assertEquals(FALSE, x) to just assertFalse(). Silly Greg. --- tests/codeigniter/core/Loader_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index 2aa1b8cb90e..83ee68777e5 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -101,7 +101,7 @@ public function testModels() $this->assertNull($this->load->model('unit_test_model')); // Test no model given - $this->assertEquals(FALSE, $this->load->model('')); + $this->assertFalse($this->load->model('')); // Test a string given to params // $this->assertEquals(NULL, $this->load->model('foobar', ' ')); From deab6ad864f05367e2c122906f63d24286b731d1 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 11:44:11 -0500 Subject: [PATCH 0013/5397] Buttoning up model loader tests. --- tests/codeigniter/core/Loader_test.php | 39 +++++++++++++------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index 83ee68777e5..d84928ecab2 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -64,7 +64,7 @@ public function testLibrary() $this->ci_instance_var('config', $config); // Test loading as an array. - $this->assertEquals(NULL, $this->load->library(array('table'))); + $this->assertNull($this->load->library(array('table'))); $this->assertTrue(class_exists('CI_Table'), 'Table class exists'); $this->assertAttributeInstanceOf('CI_Table', 'table', $this->ci_obj); @@ -100,11 +100,11 @@ public function testModels() $this->assertNull($this->load->model('unit_test_model')); - // Test no model given - $this->assertFalse($this->load->model('')); + // Was the model class instantiated. + $this->assertTrue(class_exists('Unit_test_model')); - // Test a string given to params - // $this->assertEquals(NULL, $this->load->model('foobar', ' ')); + // Test no model given + $this->assertNull($this->load->model('')); } // -------------------------------------------------------------------- @@ -132,14 +132,8 @@ public function testNonExistentView() public function testFile() { // I'm not entirely sure this is the proper way to handle this. - try - { - $this->load->file('foo'); - } - catch (Exception $expected) - { - return; - } + // $this->load->file('foo'); + } // -------------------------------------------------------------------- @@ -156,15 +150,22 @@ public function testVars() // -------------------------------------------------------------------- - // public function testHelper() - // { - // $this->assertEquals(NULL, $this->load->helper('array')); - // $this->assertEquals(NULL, $this->load->helper('bad')); - // } + public function testHelper() + { + $this->assertEquals(NULL, $this->load->helper('array')); + + $this->setExpectedException( + 'Exception', + 'CI Error: Unable to load the requested file: helpers/bad_helper.php' + ); + + + $this->load->helper('bad'); + } // -------------------------------------------------------------------- - public function testHelpers() + public function testLoadingMultipleHelpers() { $this->assertEquals(NULL, $this->load->helpers(array('file', 'array', 'string'))); } From 321768d902f68a929a55ef9480c22cb54d40bd34 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 12:09:33 -0500 Subject: [PATCH 0014/5397] Testing view loading. --- tests/codeigniter/core/Loader_test.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index d84928ecab2..782751cd765 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -117,6 +117,23 @@ public function testModels() // -------------------------------------------------------------------- + public function testLoadView() + { + $this->ci_set_core_class('output', 'CI_Output'); + + $content = 'This is my test page. '; + $view = vfsStream::newFile('unit_test_view.php')->withContent($content) + ->at($this->load->views_dir); + + // Use the optional return parameter in this test, so the view is not + // run through the output class. + $this->assertEquals('This is my test page. World!', + $this->load->view('unit_test_view', array('hello' => "World!"), TRUE)); + + } + + // -------------------------------------------------------------------- + public function testNonExistentView() { $this->setExpectedException( From 6858fb92133afa127eff6f11dd29abf554e1b2d1 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 12:27:23 -0500 Subject: [PATCH 0015/5397] Adding mock testing of libraries in the application directory --- tests/codeigniter/core/Loader_test.php | 58 ++++++++++++++++++++------ 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index 782751cd765..1e32c7e0aad 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -53,15 +53,7 @@ public function setUp() public function testLibrary() { - // Mock up a config object until we - // figure out how to test the library configs - $config = $this->getMock('CI_Config', NULL, array(), '', FALSE); - $config->expects($this->any()) - ->method('load') - ->will($this->returnValue(TRUE)); - - // Add the mock to our stdClass - $this->ci_instance_var('config', $config); + $this->_setup_config_mock(); // Test loading as an array. $this->assertNull($this->load->library(array('table'))); @@ -73,22 +65,58 @@ public function testLibrary() // Test a string given to params $this->assertEquals(NULL, $this->load->library('table', ' ')); - } + } + + // -------------------------------------------------------------------- + + public function testLoadLibraryInApplicationDir() + { + $this->_setup_config_mock(); + + $content = 'withContent($content) + ->at($this->load->libs_dir); + + $this->assertNull($this->load->library('super_test_library')); + + // Was the model class instantiated. + $this->assertTrue(class_exists('Super_test_library')); + } // -------------------------------------------------------------------- + private function _setup_config_mock() + { + // Mock up a config object until we + // figure out how to test the library configs + $config = $this->getMock('CI_Config', NULL, array(), '', FALSE); + $config->expects($this->any()) + ->method('load') + ->will($this->returnValue(TRUE)); + + // Add the mock to our stdClass + $this->ci_instance_var('config', $config); + } + + // -------------------------------------------------------------------- + + public function testNonExistentModel() { $this->setExpectedException( 'Exception', - 'CI Error: Unable to locate the model you have specified: ci_test_nonexistent_mode.php' + 'CI Error: Unable to locate the model you have specified: ci_test_nonexistent_model.php' ); - $this->load->model('ci_test_nonexistent_mode.php'); + $this->load->model('ci_test_nonexistent_model.php'); } // -------------------------------------------------------------------- + /** + * @coverts CI_Loader::model + */ public function testModels() { $this->ci_set_core_class('model', 'CI_Model'); @@ -117,6 +145,9 @@ public function testModels() // -------------------------------------------------------------------- + /** + * @coverts CI_Loader::view + */ public function testLoadView() { $this->ci_set_core_class('output', 'CI_Output'); @@ -134,6 +165,9 @@ public function testLoadView() // -------------------------------------------------------------------- + /** + * @coverts CI_Loader::view + */ public function testNonExistentView() { $this->setExpectedException( From 4d2bb09cbb4fc66dc4881c2ffdeee7dbaf0a3a3b Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 12:33:12 -0500 Subject: [PATCH 0016/5397] config CI_Loader tests. --- tests/codeigniter/core/Loader_test.php | 36 +++++++++++++++++++------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index 1e32c7e0aad..55ab9a4e55c 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -195,8 +195,8 @@ public function testVars() 'foo' => 'bar' ); - $this->assertEquals(NULL, $this->load->vars($vars)); - $this->assertEquals(NULL, $this->load->vars('foo', 'bar')); + $this->assertNull($this->load->vars($vars)); + $this->assertNull($this->load->vars('foo', 'bar')); } // -------------------------------------------------------------------- @@ -230,12 +230,30 @@ public function testLoadingMultipleHelpers() // -------------------------------------------------------------------- - // public function testLoadConfig() - // { - // $this->assertEquals(NULL, $this->load->config('config', FALSE, TRUE)); - // } -} - - + public function testLoadConfig() + { + $this->_setup_config_mock(); + + $this->assertNull($this->load->config('config', FALSE)); + } + + // -------------------------------------------------------------------- + public function testLoadBadConfig() + { + $this->_setup_config_mock(); + + $this->setExpectedException( + 'Exception', + 'CI Error: The configuration file foobar.php does not exist.' + ); + + $this->load->config('foobar', FALSE); + } + // -------------------------------------------------------------------- + + + + +} \ No newline at end of file From 56106630e172203858d58325dea5d2e81b226f87 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 13:10:19 -0500 Subject: [PATCH 0017/5397] load->file() tests. --- tests/codeigniter/core/Loader_test.php | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index 55ab9a4e55c..49679e241e0 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -101,7 +101,6 @@ private function _setup_config_mock() // -------------------------------------------------------------------- - public function testNonExistentModel() { $this->setExpectedException( @@ -182,8 +181,22 @@ public function testNonExistentView() public function testFile() { - // I'm not entirely sure this is the proper way to handle this. - // $this->load->file('foo'); + $content = 'Here is a test file, which we will load now.'; + $file = vfsStream::newFile('ci_test_mock_file.php')->withContent($content) + ->at($this->load->views_dir); + + // Just like load->view(), take the output class out of the mix here. + $load = $this->load->file(vfsStream::url('application').'/views/ci_test_mock_file.php', + TRUE); + + $this->assertEquals($content, $load); + + $this->setExpectedException( + 'Exception', + 'CI Error: Unable to load the requested file: ci_test_file_not_exists' + ); + + $this->load->file('ci_test_file_not_exists', TRUE); } @@ -210,7 +223,6 @@ public function testHelper() 'CI Error: Unable to load the requested file: helpers/bad_helper.php' ); - $this->load->helper('bad'); } From b567947d38a20960aade96f9179ad6bc21f22646 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 14:34:31 -0500 Subject: [PATCH 0018/5397] Moving tests/codeigniter/helpers/Array_helper_test.php to be lower cased. Adding html_helper_test.php as well. --- tests/Bootstrap.php | 8 +++ ..._helper_test.php => array_helper_test.php} | 0 .../codeigniter/helpers/html_helper_test.php | 67 +++++++++++++++++++ tests/phpunit.xml | 5 +- 4 files changed, 78 insertions(+), 2 deletions(-) rename tests/codeigniter/helpers/{Array_helper_test.php => array_helper_test.php} (100%) create mode 100644 tests/codeigniter/helpers/html_helper_test.php diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index 94dafdce401..db5ffbd5227 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -17,4 +17,12 @@ require_once $dir.'/lib/common.php'; require_once $dir.'/lib/ci_testcase.php'; + +// Omit files in the PEAR & PHP Paths from ending up in the coverage report +PHP_CodeCoverage_Filter::getInstance()->addDirectoryToBlacklist(PEAR_INSTALL_DIR); +PHP_CodeCoverage_Filter::getInstance()->addDirectoryToBlacklist(PHP_LIBDIR); + +// Omit Tests from the coverage reports. +// PHP_CodeCoverage_Filter::getInstance() + unset($dir); \ No newline at end of file diff --git a/tests/codeigniter/helpers/Array_helper_test.php b/tests/codeigniter/helpers/array_helper_test.php similarity index 100% rename from tests/codeigniter/helpers/Array_helper_test.php rename to tests/codeigniter/helpers/array_helper_test.php diff --git a/tests/codeigniter/helpers/html_helper_test.php b/tests/codeigniter/helpers/html_helper_test.php new file mode 100644 index 00000000000..3b7f2b34261 --- /dev/null +++ b/tests/codeigniter/helpers/html_helper_test.php @@ -0,0 +1,67 @@ +assertEquals('

foobar

', heading('foobar')); + } + + // ------------------------------------------------------------------------ + + public function testUl() + { + $expect = << +
  • foo
  • +
  • bar
  • + + +EOH; + + $expect = ltrim($expect); + + $list = array('foo', 'bar'); + + $this->assertEquals($expect, ul($list)); + + + $expect = << +
  • foo
  • +
  • bar
  • + + +EOH; + + $expect = ltrim($expect); + + $list = array('foo', 'bar'); + + $this->assertEquals($expect, ul($list, ' class="test"')); + + $this->assertEquals($expect, ul($list, array('class' => 'test'))); + } + + // ------------------------------------------------------------------------ + + public function testNBS() + { + $this->assertEquals('   ', nbs(3)); + } + + // ------------------------------------------------------------------------ + + public function testMeta() + { + $this->assertEquals("\n", meta('test', 'foo')); + + $expect = "\n"; + + $this->assertEquals($expect, meta(array('name' => 'foo'))); + + } + +} \ No newline at end of file diff --git a/tests/phpunit.xml b/tests/phpunit.xml index 9e5e10d591f..1e712a1bb17 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -1,17 +1,18 @@ codeigniter/Setup_test.php codeigniter/core - + codeigniter/helpers + \ No newline at end of file From 9071573bc510f127fa22ddd367b2ff46a60242cc Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 14:36:26 -0500 Subject: [PATCH 0019/5397] Adding text_helper_test --- .../codeigniter/helpers/text_helper_test.php | 151 ++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 tests/codeigniter/helpers/text_helper_test.php diff --git a/tests/codeigniter/helpers/text_helper_test.php b/tests/codeigniter/helpers/text_helper_test.php new file mode 100644 index 00000000000..aa6660ea069 --- /dev/null +++ b/tests/codeigniter/helpers/text_helper_test.php @@ -0,0 +1,151 @@ +_long_string = 'Once upon a time, a framework had no tests. It sad. So some nice people began to write tests. The more time that went on, the happier it became. Everyone was happy.'; + } + + // ------------------------------------------------------------------------ + + public function testWordLimiter() + { + $this->assertEquals('Once upon a time,…', word_limiter($this->_long_string, 4)); + $this->assertEquals('Once upon a time,…', word_limiter($this->_long_string, 4, '…')); + $this->assertEquals('', word_limiter('', 4)); + } + + // ------------------------------------------------------------------------ + + public function testCharacterLimiter() + { + $this->assertEquals('Once upon a time, a…', character_limiter($this->_long_string, 20)); + $this->assertEquals('Once upon a time, a…', character_limiter($this->_long_string, 20, '…')); + $this->assertEquals('Short', character_limiter('Short', 20)); + $this->assertEquals('Short', character_limiter('Short', 5)); + } + + // ------------------------------------------------------------------------ + + public function testAsciiToEntities() + { + $strs = array( + '“‘ “test”' => '“‘ “test”', + '†¥¨ˆøåß∂ƒ©˙∆˚¬' => '†¥¨ˆøåß∂ƒ©˙∆˚¬' + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, ascii_to_entities($str)); + } + } + + // ------------------------------------------------------------------------ + + public function testEntitiesToAscii() + { + $strs = array( + '“‘ “test”' => '“‘ “test”', + '†¥¨ˆøåß∂ƒ©˙∆˚¬' => '†¥¨ˆøåß∂ƒ©˙∆˚¬' + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, entities_to_ascii($str)); + } + } + + // ------------------------------------------------------------------------ + + public function testCensoredWords() + { + $censored = array('boob', 'nerd', 'ass', 'fart'); + + $strs = array( + 'Ted bobbled the ball' => 'Ted bobbled the ball', + 'Jake is a nerdo' => 'Jake is a nerdo', + 'The borg will assimilate you' => 'The borg will assimilate you', + 'Did Mary Fart?' => 'Did Mary $*#?', + 'Jake is really a boob' => 'Jake is really a $*#' + ); + + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, word_censor($str, $censored, '$*#')); + } + + // test censored words being sent as a string + $this->assertEquals('test', word_censor('test', 'test')); + } + + // ------------------------------------------------------------------------ + + public function testHighlightCode() + { + $code = ''; + $expect = "\n<?php var_dump(\$this); ?> \n\n"; + + $this->assertEquals($expect, highlight_code($code)); + } + + // ------------------------------------------------------------------------ + + public function testHighlightPhrase() + { + $strs = array( + 'this is a phrase' => 'this is a phrase', + 'this is another' => 'this is another', + 'Gimme a test, Sally' => 'Gimme a test, Sally', + 'Or tell me what this is' => 'Or tell me what this is', + '' => '' + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, highlight_phrase($str, 'this is')); + } + } + + // ------------------------------------------------------------------------ + + public function testEllipsizing() + { + $strs = array( + '0' => array( + 'this is my string' => '… my string', + "here's another one" => '…nother one', + 'this one is just a bit longer' => '…bit longer', + 'short' => 'short' + ), + '.5' => array( + 'this is my string' => 'this …tring', + "here's another one" => "here'…r one", + 'this one is just a bit longer' => 'this …onger', + 'short' => 'short' + ), + '1' => array( + 'this is my string' => 'this is my…', + "here's another one" => "here's ano…", + 'this one is just a bit longer' => 'this one i…', + 'short' => 'short' + ), + ); + + foreach ($strs as $pos => $s) + { + foreach ($s as $str => $expect) + { + $this->assertEquals($expect, ellipsize($str, 10, $pos)); + } + } + } + + // ------------------------------------------------------------------------ + +} \ No newline at end of file From 052b01d9398de56e23300242f25d5317afcacf82 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 14:38:03 -0500 Subject: [PATCH 0020/5397] Adding string helper and inflector helper tests --- .../helpers/inflector_helper_test.php | 91 ++++++++++++++ .../helpers/string_helper_test.php | 117 ++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 tests/codeigniter/helpers/inflector_helper_test.php create mode 100644 tests/codeigniter/helpers/string_helper_test.php diff --git a/tests/codeigniter/helpers/inflector_helper_test.php b/tests/codeigniter/helpers/inflector_helper_test.php new file mode 100644 index 00000000000..5e2fae9fdf2 --- /dev/null +++ b/tests/codeigniter/helpers/inflector_helper_test.php @@ -0,0 +1,91 @@ + 'telly', + 'smellies' => 'smelly', + 'abjectnesses' => 'abjectness', + 'smells' => 'smell' + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, singular($str)); + } + } + + // -------------------------------------------------------------------- + + public function testPlural() + { + $strs = array( + 'telly' => 'tellies', + 'smelly' => 'smellies', + 'abjectness' => 'abjectness', + 'smell' => 'smells', + 'witch' => 'witches' + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, plural($str)); + } + } + + // -------------------------------------------------------------------- + + public function testCamelize() + { + $strs = array( + 'this is the string' => 'thisIsTheString', + 'this is another one' => 'thisIsAnotherOne', + 'i-am-playing-a-trick' => 'i-am-playing-a-trick', + 'what_do_you_think-yo?' => 'whatDoYouThink-yo?', + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, camelize($str)); + } + } + + // -------------------------------------------------------------------- + + public function testUnderscore() + { + $strs = array( + 'this is the string' => 'this_is_the_string', + 'this is another one' => 'this_is_another_one', + 'i-am-playing-a-trick' => 'i-am-playing-a-trick', + 'what_do_you_think-yo?' => 'what_do_you_think-yo?', + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, underscore($str)); + } + } + + // -------------------------------------------------------------------- + + public function testHumanize() + { + $strs = array( + 'this_is_the_string' => 'This Is The String', + 'this_is_another_one' => 'This Is Another One', + 'i-am-playing-a-trick' => 'I-am-playing-a-trick', + 'what_do_you_think-yo?' => 'What Do You Think-yo?', + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, humanize($str)); + } + } +} \ No newline at end of file diff --git a/tests/codeigniter/helpers/string_helper_test.php b/tests/codeigniter/helpers/string_helper_test.php new file mode 100644 index 00000000000..71449f64a2c --- /dev/null +++ b/tests/codeigniter/helpers/string_helper_test.php @@ -0,0 +1,117 @@ + 'Slashes//\\', + '/var/www/html/' => 'var/www/html' + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, trim_slashes($str)); + } + } + + // -------------------------------------------------------------------- + + public function testStripSlashes() + { + $this->assertEquals("This is totally foo bar'd", trim_slashes("This is totally foo bar'd")); + } + + // -------------------------------------------------------------------- + + public function testStripQuotes() + { + $strs = array( + '"me oh my!"' => 'me oh my!', + "it's a winner!" => 'its a winner!', + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, strip_quotes($str)); + } + } + + // -------------------------------------------------------------------- + + public function testQuotesToEntities() + { + $strs = array( + '"me oh my!"' => '"me oh my!"', + "it's a winner!" => 'it's a winner!', + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, quotes_to_entities($str)); + } + } + + // -------------------------------------------------------------------- + + public function testReduceDoubleSlashes() + { + $strs = array( + 'http://codeigniter.com' => 'http://codeigniter.com', + '//var/www/html/example.com/' => '/var/www/html/example.com/', + '/var/www/html//index.php' => '/var/www/html/index.php' + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, reduce_double_slashes($str)); + } + } + + // -------------------------------------------------------------------- + + public function testReduceMultiples() + { + $strs = array( + 'Fred, Bill,, Joe, Jimmy' => 'Fred, Bill, Joe, Jimmy', + 'Ringo, John, Paul,,' => 'Ringo, John, Paul,' + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, reduce_multiples($str)); + } + + $strs = array( + 'Fred, Bill,, Joe, Jimmy' => 'Fred, Bill, Joe, Jimmy', + 'Ringo, John, Paul,,' => 'Ringo, John, Paul' + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, reduce_multiples($str, ',', TRUE)); + } + } + + // -------------------------------------------------------------------- + + public function testRepeater() + { + $strs = array( + 'a' => 'aaaaaaaaaa', + ' ' => '          ', + '
    ' => '









    ' + + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, repeater($str, 10)); + } + } + + // -------------------------------------------------------------------- + +} \ No newline at end of file From b4d93dbab7253f98613ab10e75e0ed20f06eaf19 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 14:42:33 -0500 Subject: [PATCH 0021/5397] Updating helper test classes to extend CI_TestCase --- tests/codeigniter/helpers/array_helper_test.php | 2 +- tests/codeigniter/helpers/html_helper_test.php | 2 +- tests/codeigniter/helpers/inflector_helper_test.php | 2 +- tests/codeigniter/helpers/string_helper_test.php | 2 +- tests/codeigniter/helpers/text_helper_test.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/codeigniter/helpers/array_helper_test.php b/tests/codeigniter/helpers/array_helper_test.php index bbefdb49db5..fd306cee8bf 100644 --- a/tests/codeigniter/helpers/array_helper_test.php +++ b/tests/codeigniter/helpers/array_helper_test.php @@ -4,7 +4,7 @@ require_once(BASEPATH.'helpers/array_helper.php'); -class Array_helper_test extends PHPUnit_Framework_TestCase +class Array_helper_test extends CI_TestCase { public function setUp() { diff --git a/tests/codeigniter/helpers/html_helper_test.php b/tests/codeigniter/helpers/html_helper_test.php index 3b7f2b34261..8c0e53301ea 100644 --- a/tests/codeigniter/helpers/html_helper_test.php +++ b/tests/codeigniter/helpers/html_helper_test.php @@ -2,7 +2,7 @@ require_once(BASEPATH.'helpers/html_helper.php'); -class Html_helper_test extends PHPUnit_Framework_TestCase +class Html_helper_test extends CI_TestCase { public function testHeading() { diff --git a/tests/codeigniter/helpers/inflector_helper_test.php b/tests/codeigniter/helpers/inflector_helper_test.php index 5e2fae9fdf2..e59875e4ac3 100644 --- a/tests/codeigniter/helpers/inflector_helper_test.php +++ b/tests/codeigniter/helpers/inflector_helper_test.php @@ -2,7 +2,7 @@ require_once(BASEPATH.'helpers/inflector_helper.php'); -class Inflector_helper_test extends PHPUnit_Framework_TestCase { +class Inflector_helper_test extends CI_TestCase { public function testSingular() diff --git a/tests/codeigniter/helpers/string_helper_test.php b/tests/codeigniter/helpers/string_helper_test.php index 71449f64a2c..00ba5dec767 100644 --- a/tests/codeigniter/helpers/string_helper_test.php +++ b/tests/codeigniter/helpers/string_helper_test.php @@ -2,7 +2,7 @@ require_once(BASEPATH.'helpers/string_helper.php'); -class String_helper_test extends PHPUnit_Framework_TestCase +class String_helper_test extends CI_TestCase { public function testTrimSlashes() { diff --git a/tests/codeigniter/helpers/text_helper_test.php b/tests/codeigniter/helpers/text_helper_test.php index aa6660ea069..22c834bcf31 100644 --- a/tests/codeigniter/helpers/text_helper_test.php +++ b/tests/codeigniter/helpers/text_helper_test.php @@ -2,7 +2,7 @@ require_once(BASEPATH.'helpers/text_helper.php'); -class Text_helper_test extends PHPUnit_Framework_TestCase +class Text_helper_test extends CI_TestCase { private $_long_string; From a7f9b251b03f7fb17251951d3024cb11fc1f881f Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 14:54:59 -0500 Subject: [PATCH 0022/5397] Parser test. --- tests/codeigniter/libraries/Parser_test.php | 42 ++++++++------------- tests/phpunit.xml | 1 + 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/tests/codeigniter/libraries/Parser_test.php b/tests/codeigniter/libraries/Parser_test.php index a8de108f027..3f63bd5899d 100644 --- a/tests/codeigniter/libraries/Parser_test.php +++ b/tests/codeigniter/libraries/Parser_test.php @@ -2,24 +2,19 @@ // OLD TEST FORMAT: DO NOT COPY -class Parser_test extends PHPUnit_Framework_TestCase -{ - static $cls; - protected $parser; - - public static function setUpBeforeClass() - { - $CI = get_instance(); - $CI->load->library('parser'); - self::$cls = get_class($CI->parser); - } +require BASEPATH.'libraries/Parser.php'; - // -------------------------------------------------------------------- +class Parser_test extends CI_TestCase +{ public function setUp() { - $cls = self::$cls; - $this->parser = new $cls; + $obj = new StdClass; + $obj->parser = new CI_Parser(); + + $this->ci_instance($obj); + + $this->parser = $obj->parser; } // -------------------------------------------------------------------- @@ -61,23 +56,23 @@ public function testParseSimpleString() } // -------------------------------------------------------------------- - + public function testParse() { $this->_parse_no_template(); $this->_parse_var_pair(); $this->_mismatched_var_pair(); } - + // -------------------------------------------------------------------- - + private function _parse_no_template() { $this->assertFalse($this->parser->parse_string('', '', TRUE)); } - + // -------------------------------------------------------------------- - + private function _parse_var_pair() { $data = array( @@ -95,9 +90,9 @@ private function _parse_var_pair() $this->assertEquals($result, $this->parser->parse_string($template, $data, TRUE)); } - + // -------------------------------------------------------------------- - + private function _mismatched_var_pair() { $data = array( @@ -117,9 +112,4 @@ private function _mismatched_var_pair() } // -------------------------------------------------------------------- - - // -------------------------------------------------------------------- - - // -------------------------------------------------------------------- - } \ No newline at end of file diff --git a/tests/phpunit.xml b/tests/phpunit.xml index 1e712a1bb17..e07aa96a7f1 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -8,6 +8,7 @@ codeigniter/Setup_test.php codeigniter/core codeigniter/helpers + codeigniter/libraries But no!'; + $expect = '

      But no!

    '; + + $this->assertEquals($expect, $this->type->auto_typography($str)); + } + + // -------------------------------------------------------------------- + + private function _protect_pre() + { + $str = '

    My Sentence

    var_dump($this);
    '; + $expect = '

    My Sentence

    var_dump($this);
    '; + + $this->assertEquals($expect, $this->type->auto_typography($str)); + } + + // -------------------------------------------------------------------- + + private function _no_opening_block() + { + $str = 'My Sentence
    var_dump($this);
    '; + $expect = '

    My Sentence

    var_dump($this);
    '; + + $this->assertEquals($expect, $this->type->auto_typography($str)); + } + + // -------------------------------------------------------------------- + + public function _protect_braced_quotes() + { + $this->type->protect_braced_quotes = TRUE; + + $str = 'Test {parse="foobar"}'; + $expect = '

    Test {parse="foobar"}

    '; + + $this->assertEquals($expect, $this->type->auto_typography($str)); + + $this->type->protect_braced_quotes = FALSE; + + $str = 'Test {parse="foobar"}'; + $expect = '

    Test {parse=“foobar”}

    '; + + $this->assertEquals($expect, $this->type->auto_typography($str)); + + + } +} \ No newline at end of file From 9512ab8a22ff14a3789cba6e5ace03aed4196e23 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Thu, 21 Apr 2011 15:10:48 -0500 Subject: [PATCH 0025/5397] Adding user agent library test. Needs some work, but is a good start. --- .../codeigniter/libraries/User_agent_test.php | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 tests/codeigniter/libraries/User_agent_test.php diff --git a/tests/codeigniter/libraries/User_agent_test.php b/tests/codeigniter/libraries/User_agent_test.php new file mode 100644 index 00000000000..d1d950cd9d8 --- /dev/null +++ b/tests/codeigniter/libraries/User_agent_test.php @@ -0,0 +1,91 @@ +_user_agent; + + $obj = new StdClass; + $obj->agent = new CI_User_agent(); + + $this->ci_instance($obj); + + $this->agent = $obj->agent; + } + + // -------------------------------------------------------------------- + + public function testAcceptLang() + { + $_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'en'; + + $this->assertEquals('en', $this->agent->accept_lang()); + + unset($_SERVER['HTTP_ACCEPT_LANGUAGE']); + } + + // -------------------------------------------------------------------- + + public function testMobile() + { + // Mobile Not Set + $_SERVER['HTTP_USER_AGENT'] = $this->_mobile_ua; + $this->assertEquals('', $this->agent->mobile()); + unset($_SERVER['HTTP_USER_AGENT']); + } + + // -------------------------------------------------------------------- + + public function testUtilIsFunctions() + { + $this->assertTrue($this->agent->is_browser()); + $this->assertFalse($this->agent->is_robot()); + $this->assertFalse($this->agent->is_mobile()); + $this->assertFalse($this->agent->is_referral()); + } + + // -------------------------------------------------------------------- + + public function testAgentString() + { + $this->assertEquals($this->_user_agent, $this->agent->agent_string()); + } + + // -------------------------------------------------------------------- + + public function testBrowserInfo() + { + $this->assertEquals('Mac OS X', $this->agent->platform()); + $this->assertEquals('Safari', $this->agent->browser()); + $this->assertEquals('533.20.27', $this->agent->version()); + $this->assertEquals('', $this->agent->robot()); + $this->assertEquals('', $this->agent->referrer()); + } + + // -------------------------------------------------------------------- + + public function testCharsets() + { + $_SERVER['HTTP_ACCEPT_CHARSET'] = 'utf8'; + + $charsets = $this->agent->charsets(); + + $this->assertEquals('utf8', $charsets[0]); + + unset($_SERVER['HTTP_ACCEPT_CHARSET']); + + $this->assertFalse($this->agent->accept_charset()); + } + + // -------------------------------------------------------------------- + +} \ No newline at end of file From 68286a4dcc1ed4d904ad992173c1b3621bf6fced Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Thu, 21 Apr 2011 22:00:33 -0400 Subject: [PATCH 0026/5397] Reworked unit tests to match rest of framework and added a few more. --- tests/codeigniter/Setup_test.php | 2 +- tests/codeigniter/core/Common_test.php | 16 +++++++++++ tests/codeigniter/core/Config_test.php | 12 ++++---- tests/codeigniter/core/Lang_test.php | 6 ++-- tests/codeigniter/core/Loader_test.php | 28 +++++++++---------- .../codeigniter/helpers/array_helper_test.php | 8 +++--- .../codeigniter/helpers/email_helper_test.php | 16 +++++++++++ .../codeigniter/helpers/html_helper_test.php | 19 ++++++++++--- .../helpers/inflector_helper_test.php | 10 +++---- .../helpers/number_helper_test.php | 13 +++++++++ .../helpers/string_helper_test.php | 27 +++++++++--------- .../codeigniter/helpers/text_helper_test.php | 26 +++++++++++------ tests/codeigniter/helpers/xml_helper_test.php | 13 +++++++++ tests/codeigniter/libraries/Parser_test.php | 8 +++--- tests/codeigniter/libraries/Table_test.php | 26 ++++++++--------- .../codeigniter/libraries/Typography_test.php | 8 +++--- .../codeigniter/libraries/User_agent_test.php | 14 +++++----- tests/lib/ci_testcase.php | 22 +++++++++++++++ 18 files changed, 187 insertions(+), 87 deletions(-) create mode 100644 tests/codeigniter/core/Common_test.php create mode 100644 tests/codeigniter/helpers/email_helper_test.php create mode 100644 tests/codeigniter/helpers/number_helper_test.php create mode 100644 tests/codeigniter/helpers/xml_helper_test.php diff --git a/tests/codeigniter/Setup_test.php b/tests/codeigniter/Setup_test.php index e088b51d30e..550245f2f24 100644 --- a/tests/codeigniter/Setup_test.php +++ b/tests/codeigniter/Setup_test.php @@ -2,7 +2,7 @@ class Setup_test extends PHPUnit_Framework_TestCase { - function testNonsense() + function test_nonsense() { $this->markTestIncomplete('not implemented'); // ensure that our bootstrapped test environment diff --git a/tests/codeigniter/core/Common_test.php b/tests/codeigniter/core/Common_test.php new file mode 100644 index 00000000000..cec12982d83 --- /dev/null +++ b/tests/codeigniter/core/Common_test.php @@ -0,0 +1,16 @@ +assertEquals(TRUE, is_php('1.2.0')); + $this->assertEquals(FALSE, is_php('9999.9.9')); + } + +} \ No newline at end of file diff --git a/tests/codeigniter/core/Config_test.php b/tests/codeigniter/core/Config_test.php index b04dd67fac4..b6c57da70b3 100644 --- a/tests/codeigniter/core/Config_test.php +++ b/tests/codeigniter/core/Config_test.php @@ -2,7 +2,7 @@ class Config_test extends CI_TestCase { - public function setUp() + public function set_up() { $cls =& $this->ci_core_class('cfg'); @@ -18,7 +18,7 @@ public function setUp() // -------------------------------------------------------------------- - public function testItem() + public function test_item() { $this->assertEquals('http://example.com/', $this->config->item('base_url')); @@ -32,7 +32,7 @@ public function testItem() // -------------------------------------------------------------------- - public function testSetItem() + public function test_set_item() { $this->assertFalse($this->config->item('not_yet_set')); @@ -43,7 +43,7 @@ public function testSetItem() // -------------------------------------------------------------------- - public function testSlashItem() + public function test_slash_item() { // Bad Config value $this->assertFalse($this->config->slash_item('no_good_item')); @@ -55,7 +55,7 @@ public function testSlashItem() // -------------------------------------------------------------------- - public function testSiteUrl() + public function test_site_url() { $this->assertEquals('http://example.com/index.php', $this->config->site_url()); @@ -85,7 +85,7 @@ public function testSiteUrl() // -------------------------------------------------------------------- - public function testSystemUrl() + public function test_system_url() { $this->assertEquals('http://example.com/system/', $this->config->system_url()); } diff --git a/tests/codeigniter/core/Lang_test.php b/tests/codeigniter/core/Lang_test.php index f65b335b083..dcc3d08797d 100644 --- a/tests/codeigniter/core/Lang_test.php +++ b/tests/codeigniter/core/Lang_test.php @@ -4,7 +4,7 @@ class Lang_test extends CI_TestCase { protected $lang; - public function setUp() + public function set_up() { $cls = $this->ci_core_class('lang'); $this->lang = new $cls; @@ -12,7 +12,7 @@ public function setUp() // -------------------------------------------------------------------- - public function testLoad() + public function test_load() { // get_config needs work $this->markTestIncomplete('get_config needs work'); @@ -21,7 +21,7 @@ public function testLoad() // -------------------------------------------------------------------- - public function testLine() + public function test_line() { $this->markTestIncomplete('get_config needs work'); diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index 49679e241e0..9ba870b7d55 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -37,7 +37,7 @@ class Loader_test extends CI_TestCase { private $ci_obj; - public function setUp() + public function set_up() { // Instantiate a new loader $this->load = new Extended_Loader(); @@ -51,7 +51,7 @@ public function setUp() // -------------------------------------------------------------------- - public function testLibrary() + public function test_library() { $this->_setup_config_mock(); @@ -69,7 +69,7 @@ public function testLibrary() // -------------------------------------------------------------------- - public function testLoadLibraryInApplicationDir() + public function test_load_library_in_application_dir() { $this->_setup_config_mock(); @@ -101,7 +101,7 @@ private function _setup_config_mock() // -------------------------------------------------------------------- - public function testNonExistentModel() + public function test_non_existent_model() { $this->setExpectedException( 'Exception', @@ -116,7 +116,7 @@ public function testNonExistentModel() /** * @coverts CI_Loader::model */ - public function testModels() + public function test_models() { $this->ci_set_core_class('model', 'CI_Model'); @@ -147,7 +147,7 @@ public function testModels() /** * @coverts CI_Loader::view */ - public function testLoadView() + public function test_load_view() { $this->ci_set_core_class('output', 'CI_Output'); @@ -158,7 +158,7 @@ public function testLoadView() // Use the optional return parameter in this test, so the view is not // run through the output class. $this->assertEquals('This is my test page. World!', - $this->load->view('unit_test_view', array('hello' => "World!"), TRUE)); + $this->load->view('unit_test_view', array('hello' => "World!"), TRUE)); } @@ -167,7 +167,7 @@ public function testLoadView() /** * @coverts CI_Loader::view */ - public function testNonExistentView() + public function test_non_existent_view() { $this->setExpectedException( 'Exception', @@ -179,7 +179,7 @@ public function testNonExistentView() // -------------------------------------------------------------------- - public function testFile() + public function test_file() { $content = 'Here is a test file, which we will load now.'; $file = vfsStream::newFile('ci_test_mock_file.php')->withContent($content) @@ -202,7 +202,7 @@ public function testFile() // -------------------------------------------------------------------- - public function testVars() + public function test_vars() { $vars = array( 'foo' => 'bar' @@ -214,7 +214,7 @@ public function testVars() // -------------------------------------------------------------------- - public function testHelper() + public function test_helper() { $this->assertEquals(NULL, $this->load->helper('array')); @@ -228,7 +228,7 @@ public function testHelper() // -------------------------------------------------------------------- - public function testLoadingMultipleHelpers() + public function test_loading_multiple_helpers() { $this->assertEquals(NULL, $this->load->helpers(array('file', 'array', 'string'))); } @@ -242,7 +242,7 @@ public function testLoadingMultipleHelpers() // -------------------------------------------------------------------- - public function testLoadConfig() + public function test_load_config() { $this->_setup_config_mock(); @@ -251,7 +251,7 @@ public function testLoadConfig() // -------------------------------------------------------------------- - public function testLoadBadConfig() + public function test_load_bad_config() { $this->_setup_config_mock(); diff --git a/tests/codeigniter/helpers/array_helper_test.php b/tests/codeigniter/helpers/array_helper_test.php index fd306cee8bf..62559de838a 100644 --- a/tests/codeigniter/helpers/array_helper_test.php +++ b/tests/codeigniter/helpers/array_helper_test.php @@ -6,7 +6,7 @@ class Array_helper_test extends CI_TestCase { - public function setUp() + public function set_up() { $this->my_array = array( 'foo' => 'bar', @@ -18,7 +18,7 @@ public function setUp() // ------------------------------------------------------------------------ - public function testElementWithExistingItem() + public function test_element_with_existing_item() { $this->assertEquals(FALSE, element('testing', $this->my_array)); @@ -29,7 +29,7 @@ public function testElementWithExistingItem() // ------------------------------------------------------------------------ - public function testRandomElement() + public function test_random_element() { // Send a string, not an array to random_element $this->assertEquals('my string', random_element('my string')); @@ -40,7 +40,7 @@ public function testRandomElement() // ------------------------------------------------------------------------ - public function testElements() + public function test_elements() { $this->assertEquals(TRUE, is_array(elements('test', $this->my_array))); $this->assertEquals(TRUE, is_array(elements('foo', $this->my_array))); diff --git a/tests/codeigniter/helpers/email_helper_test.php b/tests/codeigniter/helpers/email_helper_test.php new file mode 100644 index 00000000000..7324e8109cc --- /dev/null +++ b/tests/codeigniter/helpers/email_helper_test.php @@ -0,0 +1,16 @@ +assertEquals(FALSE, valid_email('test')); + $this->assertEquals(FALSE, valid_email('test@test@test.com')); + $this->assertEquals(TRUE, valid_email('test@test.com')); + $this->assertEquals(TRUE, valid_email('my.test@test.com')); + } + +} \ No newline at end of file diff --git a/tests/codeigniter/helpers/html_helper_test.php b/tests/codeigniter/helpers/html_helper_test.php index 8c0e53301ea..706874f9ee6 100644 --- a/tests/codeigniter/helpers/html_helper_test.php +++ b/tests/codeigniter/helpers/html_helper_test.php @@ -4,14 +4,25 @@ class Html_helper_test extends CI_TestCase { - public function testHeading() + + // ------------------------------------------------------------------------ + + public function test_br() + { + $this->assertEquals('

    ', br(2)); + } + + // ------------------------------------------------------------------------ + + public function test_heading() { $this->assertEquals('

    foobar

    ', heading('foobar')); + $this->assertEquals('

    foobar

    ', heading('foobar', 2, 'class="bar"')); } // ------------------------------------------------------------------------ - public function testUl() + public function test_Ul() { $expect = << @@ -47,14 +58,14 @@ public function testUl() // ------------------------------------------------------------------------ - public function testNBS() + public function test_NBS() { $this->assertEquals('   ', nbs(3)); } // ------------------------------------------------------------------------ - public function testMeta() + public function test_meta() { $this->assertEquals("\n", meta('test', 'foo')); diff --git a/tests/codeigniter/helpers/inflector_helper_test.php b/tests/codeigniter/helpers/inflector_helper_test.php index e59875e4ac3..34bc34ebbe9 100644 --- a/tests/codeigniter/helpers/inflector_helper_test.php +++ b/tests/codeigniter/helpers/inflector_helper_test.php @@ -5,7 +5,7 @@ class Inflector_helper_test extends CI_TestCase { - public function testSingular() + public function test_singular() { $strs = array( 'tellies' => 'telly', @@ -22,7 +22,7 @@ public function testSingular() // -------------------------------------------------------------------- - public function testPlural() + public function test_plural() { $strs = array( 'telly' => 'tellies', @@ -40,7 +40,7 @@ public function testPlural() // -------------------------------------------------------------------- - public function testCamelize() + public function test_camelize() { $strs = array( 'this is the string' => 'thisIsTheString', @@ -57,7 +57,7 @@ public function testCamelize() // -------------------------------------------------------------------- - public function testUnderscore() + public function test_underscore() { $strs = array( 'this is the string' => 'this_is_the_string', @@ -74,7 +74,7 @@ public function testUnderscore() // -------------------------------------------------------------------- - public function testHumanize() + public function test_humanize() { $strs = array( 'this_is_the_string' => 'This Is The String', diff --git a/tests/codeigniter/helpers/number_helper_test.php b/tests/codeigniter/helpers/number_helper_test.php new file mode 100644 index 00000000000..02fc49c3d34 --- /dev/null +++ b/tests/codeigniter/helpers/number_helper_test.php @@ -0,0 +1,13 @@ +assertEquals('456 Bytes', byte_format(456)); + } + +} \ No newline at end of file diff --git a/tests/codeigniter/helpers/string_helper_test.php b/tests/codeigniter/helpers/string_helper_test.php index 00ba5dec767..5e0ee45deb1 100644 --- a/tests/codeigniter/helpers/string_helper_test.php +++ b/tests/codeigniter/helpers/string_helper_test.php @@ -4,7 +4,7 @@ class String_helper_test extends CI_TestCase { - public function testTrimSlashes() + public function test_trim_slashes() { $strs = array( '//Slashes//\/' => 'Slashes//\\', @@ -17,16 +17,9 @@ public function testTrimSlashes() } } - // -------------------------------------------------------------------- - - public function testStripSlashes() - { - $this->assertEquals("This is totally foo bar'd", trim_slashes("This is totally foo bar'd")); - } - // -------------------------------------------------------------------- - public function testStripQuotes() + public function test_strip_quotes() { $strs = array( '"me oh my!"' => 'me oh my!', @@ -41,7 +34,7 @@ public function testStripQuotes() // -------------------------------------------------------------------- - public function testQuotesToEntities() + public function test_quotes_to_entities() { $strs = array( '"me oh my!"' => '"me oh my!"', @@ -56,7 +49,7 @@ public function testQuotesToEntities() // -------------------------------------------------------------------- - public function testReduceDoubleSlashes() + public function test_reduce_double_slashes() { $strs = array( 'http://codeigniter.com' => 'http://codeigniter.com', @@ -72,7 +65,7 @@ public function testReduceDoubleSlashes() // -------------------------------------------------------------------- - public function testReduceMultiples() + public function test_reduce_multiples() { $strs = array( 'Fred, Bill,, Joe, Jimmy' => 'Fred, Bill, Joe, Jimmy', @@ -97,7 +90,7 @@ public function testReduceMultiples() // -------------------------------------------------------------------- - public function testRepeater() + public function test_repeater() { $strs = array( 'a' => 'aaaaaaaaaa', @@ -114,4 +107,12 @@ public function testRepeater() // -------------------------------------------------------------------- + + public function test_random_string() + { + $this->assertEquals(16, strlen(random_string('alnum', 16))); + $this->assertEquals(32, strlen(random_string('unique', 16))); + $this->assertInternalType('string', random_string('numeric', 16)); + } + } \ No newline at end of file diff --git a/tests/codeigniter/helpers/text_helper_test.php b/tests/codeigniter/helpers/text_helper_test.php index 22c834bcf31..a0866e638f6 100644 --- a/tests/codeigniter/helpers/text_helper_test.php +++ b/tests/codeigniter/helpers/text_helper_test.php @@ -6,14 +6,14 @@ class Text_helper_test extends CI_TestCase { private $_long_string; - public function setUp() + public function set_up() { $this->_long_string = 'Once upon a time, a framework had no tests. It sad. So some nice people began to write tests. The more time that went on, the happier it became. Everyone was happy.'; } // ------------------------------------------------------------------------ - public function testWordLimiter() + public function test_word_limiter() { $this->assertEquals('Once upon a time,…', word_limiter($this->_long_string, 4)); $this->assertEquals('Once upon a time,…', word_limiter($this->_long_string, 4, '…')); @@ -22,7 +22,7 @@ public function testWordLimiter() // ------------------------------------------------------------------------ - public function testCharacterLimiter() + public function test_character_limiter() { $this->assertEquals('Once upon a time, a…', character_limiter($this->_long_string, 20)); $this->assertEquals('Once upon a time, a…', character_limiter($this->_long_string, 20, '…')); @@ -32,7 +32,7 @@ public function testCharacterLimiter() // ------------------------------------------------------------------------ - public function testAsciiToEntities() + public function test_ascii_to_entities() { $strs = array( '“‘ “test”' => '“‘ “test”', @@ -47,7 +47,7 @@ public function testAsciiToEntities() // ------------------------------------------------------------------------ - public function testEntitiesToAscii() + public function test_entities_to_ascii() { $strs = array( '“‘ “test”' => '“‘ “test”', @@ -59,10 +59,18 @@ public function testEntitiesToAscii() $this->assertEquals($expect, entities_to_ascii($str)); } } + + // ------------------------------------------------------------------------ + + function test_convert_accented_characters() + { + $this->assertEquals('AAAeEEEIIOOEUUUeY', convert_accented_characters('ÀÂÄÈÊËÎÏÔŒÙÛÜŸ')); + $this->assertEquals('a e i o u n ue', convert_accented_characters('á é í ó ú ñ ü')); + } // ------------------------------------------------------------------------ - public function testCensoredWords() + public function test_censored_words() { $censored = array('boob', 'nerd', 'ass', 'fart'); @@ -86,7 +94,7 @@ public function testCensoredWords() // ------------------------------------------------------------------------ - public function testHighlightCode() + public function test_highlight_code() { $code = ''; $expect = "\n<?php var_dump(\$this); ?> \n\n"; @@ -96,7 +104,7 @@ public function testHighlightCode() // ------------------------------------------------------------------------ - public function testHighlightPhrase() + public function test_highlight_phrase() { $strs = array( 'this is a phrase' => 'this is a phrase', @@ -114,7 +122,7 @@ public function testHighlightPhrase() // ------------------------------------------------------------------------ - public function testEllipsizing() + public function test_ellipsizing() { $strs = array( '0' => array( diff --git a/tests/codeigniter/helpers/xml_helper_test.php b/tests/codeigniter/helpers/xml_helper_test.php new file mode 100644 index 00000000000..49f49e1661a --- /dev/null +++ b/tests/codeigniter/helpers/xml_helper_test.php @@ -0,0 +1,13 @@ +assertEquals('<tag>my & test - </tag>', xml_convert('my & test - ')); + } + +} \ No newline at end of file diff --git a/tests/codeigniter/libraries/Parser_test.php b/tests/codeigniter/libraries/Parser_test.php index 44269ad2c12..b4580a4b124 100644 --- a/tests/codeigniter/libraries/Parser_test.php +++ b/tests/codeigniter/libraries/Parser_test.php @@ -5,7 +5,7 @@ class Parser_test extends CI_TestCase { - public function setUp() + public function set_up() { $obj = new StdClass; $obj->parser = new CI_Parser(); @@ -16,7 +16,7 @@ public function setUp() } // -------------------------------------------------------------------- - public function testSetDelimiters() + public function test_set_delimiters() { // Make sure default delimiters are there $this->assertEquals('{', $this->parser->l_delim); @@ -39,7 +39,7 @@ public function testSetDelimiters() // -------------------------------------------------------------------- - public function testParseSimpleString() + public function test_parse_simple_string() { $data = array( 'title' => 'Page Title', @@ -55,7 +55,7 @@ public function testParseSimpleString() // -------------------------------------------------------------------- - public function testParse() + public function test_parse() { $this->_parse_no_template(); $this->_parse_var_pair(); diff --git a/tests/codeigniter/libraries/Table_test.php b/tests/codeigniter/libraries/Table_test.php index ded4c22c17d..133179f3a06 100644 --- a/tests/codeigniter/libraries/Table_test.php +++ b/tests/codeigniter/libraries/Table_test.php @@ -5,7 +5,7 @@ class Table_test extends CI_TestCase { - public function setUp() + public function set_up() { $obj = new StdClass; $obj->table = new CI_table(); @@ -19,7 +19,7 @@ public function setUp() // Setter Methods // -------------------------------------------------------------------- - public function testSetTemplate() + public function test_set_template() { $this->assertFalse($this->table->set_template('not an array')); @@ -31,13 +31,13 @@ public function testSetTemplate() $this->assertEquals($template, $this->table->template); } - public function testSetEmpty() + public function test_set_empty() { $this->table->set_empty('nada'); $this->assertEquals('nada', $this->table->empty_cells); } - public function testSetCaption() + public function test_set_caption() { $this->table->set_caption('awesome cap'); $this->assertEquals('awesome cap', $this->table->caption); @@ -47,7 +47,7 @@ public function testSetCaption() /* * @depends testPrepArgs */ - public function testSetHeading() + public function test_set_heading() { // uses _prep_args internally, so we'll just do a quick // check to verify that func_get_args and prep_args are @@ -69,7 +69,7 @@ public function testSetHeading() /* * @depends testPrepArgs */ - public function testAddRow() + public function test_add_row() { // uses _prep_args internally, so we'll just do a quick // check to verify that func_get_args and prep_args are @@ -95,7 +95,7 @@ public function testAddRow() // Uility Methods // -------------------------------------------------------------------- - public function testPrepArgs() + public function test_prep_args() { $expected = array( array('data' => 'name'), @@ -139,7 +139,7 @@ public function testPrepArgs() 'attributes'); } - public function testDefaultTemplateKeys() + public function test_default_template_keys() { $deft_template = $this->table->_default_template(); $keys = array( @@ -158,7 +158,7 @@ public function testDefaultTemplateKeys() } } - public function testCompileTemplate() + public function test_compile_template() { $this->assertFalse($this->table->set_template('invalid_junk')); @@ -177,7 +177,7 @@ public function testCompileTemplate() $this->assertEquals('', $this->table->template['table_close']); } - public function testMakeColumns() + public function test_make_columns() { // Test bogus parameters $this->assertFalse($this->table->make_columns('invalid_junk')); @@ -213,7 +213,7 @@ public function testMakeColumns() $this->markTestSkipped('Look at commented assertFalse above'); } - public function testClear() + public function test_clear() { $this->table->set_heading('Name', 'Color', 'Size'); @@ -240,7 +240,7 @@ public function testClear() } - public function testSetFromArray() + public function test_set_from_array() { $this->assertFalse($this->table->_set_from_array('bogus')); $this->assertFalse($this->table->_set_from_array(array())); @@ -281,7 +281,7 @@ public function testSetFromArray() ); } - function testSetFromObject() + function test_set_from_object() { $this->markTestSkipped('Not yet implemented.'); } diff --git a/tests/codeigniter/libraries/Typography_test.php b/tests/codeigniter/libraries/Typography_test.php index 242a6e9442d..a0533bae08c 100644 --- a/tests/codeigniter/libraries/Typography_test.php +++ b/tests/codeigniter/libraries/Typography_test.php @@ -5,7 +5,7 @@ class Typography_test extends CI_TestCase { - public function setUp() + public function set_up() { $obj = new StdClass; $obj->type = new CI_Typography(); @@ -22,7 +22,7 @@ public function setUp() * * this can and should grow. */ - public function testFormatCharacters() + public function test_format_characters() { $strs = array( '"double quotes"' => '“double quotes”', @@ -46,7 +46,7 @@ public function testFormatCharacters() // -------------------------------------------------------------------- - public function testNl2brExceptPre() + public function test_nl2br_except_pre() { $str = <<_blank_string(); $this->_standardize_new_lines(); diff --git a/tests/codeigniter/libraries/User_agent_test.php b/tests/codeigniter/libraries/User_agent_test.php index d1d950cd9d8..277c12ed044 100644 --- a/tests/codeigniter/libraries/User_agent_test.php +++ b/tests/codeigniter/libraries/User_agent_test.php @@ -9,7 +9,7 @@ class UserAgent_test extends CI_TestCase protected $_user_agent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27'; protected $_mobile_ua = 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7'; - public function setUp() + public function set_up() { // set a baseline user agent $_SERVER['HTTP_USER_AGENT'] = $this->_user_agent; @@ -24,7 +24,7 @@ public function setUp() // -------------------------------------------------------------------- - public function testAcceptLang() + public function test_accept_lang() { $_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'en'; @@ -35,7 +35,7 @@ public function testAcceptLang() // -------------------------------------------------------------------- - public function testMobile() + public function test_mobile() { // Mobile Not Set $_SERVER['HTTP_USER_AGENT'] = $this->_mobile_ua; @@ -45,7 +45,7 @@ public function testMobile() // -------------------------------------------------------------------- - public function testUtilIsFunctions() + public function test_util_is_functions() { $this->assertTrue($this->agent->is_browser()); $this->assertFalse($this->agent->is_robot()); @@ -55,14 +55,14 @@ public function testUtilIsFunctions() // -------------------------------------------------------------------- - public function testAgentString() + public function test_agent_string() { $this->assertEquals($this->_user_agent, $this->agent->agent_string()); } // -------------------------------------------------------------------- - public function testBrowserInfo() + public function test_browser_info() { $this->assertEquals('Mac OS X', $this->agent->platform()); $this->assertEquals('Safari', $this->agent->browser()); @@ -73,7 +73,7 @@ public function testBrowserInfo() // -------------------------------------------------------------------- - public function testCharsets() + public function test_charsets() { $_SERVER['HTTP_ACCEPT_CHARSET'] = 'utf8'; diff --git a/tests/lib/ci_testcase.php b/tests/lib/ci_testcase.php index 10539a3af79..8ca71fdf251 100644 --- a/tests/lib/ci_testcase.php +++ b/tests/lib/ci_testcase.php @@ -25,6 +25,8 @@ class CI_TestCase extends PHPUnit_Framework_TestCase { 'model' => 'model' ); + // -------------------------------------------------------------------- + public function __construct() { parent::__construct(); @@ -34,6 +36,26 @@ public function __construct() // -------------------------------------------------------------------- + public function setUp() + { + if (method_exists($this, 'set_up')) + { + $this->set_up(); + } + } + + // -------------------------------------------------------------------- + + public function tearDown() + { + if (method_exists($this, 'tear_down')) + { + $this->tear_down(); + } + } + + // -------------------------------------------------------------------- + function ci_set_config($key, $val = '') { if (is_array($key)) From fd5667c9d74549bb92f0ffbd74262e525e4830f9 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Fri, 22 Apr 2011 10:01:56 -0500 Subject: [PATCH 0027/5397] dropping in PHPUnit version requirements --- tests/readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/readme.txt b/tests/readme.txt index b1e9b732f04..9a299544ae1 100644 --- a/tests/readme.txt +++ b/tests/readme.txt @@ -21,7 +21,7 @@ format to facilitate clean api design. [see http://arrenbrecht.ch/testing/] # Requirements -1. PHP Unit +1. PHP Unit >= 3.5.6 - pear channel-discover pear.phpunit.de - pear install phpunit/PHPUnit From 5de50ec2fefc7dad1fd768573ca3f47538fd8988 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Fri, 22 Apr 2011 10:02:17 -0500 Subject: [PATCH 0028/5397] Updates to test Bootstrap --- tests/Bootstrap.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index db5ffbd5227..657671ab07b 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -21,8 +21,10 @@ // Omit files in the PEAR & PHP Paths from ending up in the coverage report PHP_CodeCoverage_Filter::getInstance()->addDirectoryToBlacklist(PEAR_INSTALL_DIR); PHP_CodeCoverage_Filter::getInstance()->addDirectoryToBlacklist(PHP_LIBDIR); +PHP_CodeCoverage_Filter::getInstance()->addDirectoryToBlacklist(PROJECT_BASE.'tests'); // Omit Tests from the coverage reports. -// PHP_CodeCoverage_Filter::getInstance() +// PHP_CodeCoverage_Filter::getInstance()->addDirectoryToWhiteList('../system/core'); +PHP_CodeCoverage_Filter::getInstance()->addFileToBlackList('../system/core/CodeIgniter.php'); unset($dir); \ No newline at end of file From ffa07349d31334f76e1398921f40b954cdf6ddcb Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Fri, 22 Apr 2011 11:31:17 -0500 Subject: [PATCH 0029/5397] Ignoring tests/output/* for code coverage reports --- .hgignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgignore b/.hgignore index 5ee4d823ebb..80c21c0bde1 100644 --- a/.hgignore +++ b/.hgignore @@ -1,6 +1,7 @@ syntax: glob .DS_Store +tests/output/* syntax: regexp application/cache/(?!index\.html|\.htaccess) From d92277d650139af381a856cfa8f23a42b8ce04cb Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Fri, 22 Apr 2011 12:56:22 -0500 Subject: [PATCH 0030/5397] Initial commit of file helper tests. --- .../codeigniter/helpers/file_helper_test.php | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 tests/codeigniter/helpers/file_helper_test.php diff --git a/tests/codeigniter/helpers/file_helper_test.php b/tests/codeigniter/helpers/file_helper_test.php new file mode 100644 index 00000000000..a596a0375f6 --- /dev/null +++ b/tests/codeigniter/helpers/file_helper_test.php @@ -0,0 +1,157 @@ +_test_dir = vfsStreamWrapper::getRoot(); + } + + // -------------------------------------------------------------------- + + public function test_read_file() + { + $this->assertFalse(read_file('does_not_exist')); + + $content = 'Jack and Jill went up the mountain to fight a billy goat.'; + + $file = vfsStream::newFile('my_file.txt')->withContent($content) + ->at($this->_test_dir); + + $this->assertEquals($content, read_file(vfsStream::url('my_file.txt'))); + } + + // -------------------------------------------------------------------- + + public function test_octal_permissions() + { + $content = 'Jack and Jill went up the mountain to fight a billy goat.'; + + $file = vfsStream::newFile('my_file.txt', 0777)->withContent($content) + ->lastModified(time() - 86400) + ->at($this->_test_dir); + + $this->assertEquals('777', octal_permissions($file->getPermissions())); + } + + // -------------------------------------------------------------------- + + /** + * More tests should happen here, since I'm not hitting the whole function. + */ + public function test_symbolic_permissions() + { + $content = 'Jack and Jill went up the mountain to fight a billy goat.'; + + $file = vfsStream::newFile('my_file.txt', 0777)->withContent($content) + ->lastModified(time() - 86400) + ->at($this->_test_dir); + + $this->assertEquals('urwxrwxrwx', symbolic_permissions($file->getPermissions())); + } + + // -------------------------------------------------------------------- + + public function test_get_mime_by_extension() + { + $content = 'Jack and Jill went up the mountain to fight a billy goat.'; + + $file = vfsStream::newFile('my_file.txt', 0777)->withContent($content) + ->lastModified(time() - 86400) + ->at($this->_test_dir); + + $this->assertEquals('text/plain', + get_mime_by_extension(vfsStream::url('my_file.txt'))); + + // Test a mime with an array, such as png + $file = vfsStream::newFile('foo.png')->at($this->_test_dir); + + $this->assertEquals('image/png', get_mime_by_extension(vfsStream::url('foo.png'))); + + // Test a file not in the mimes array + $file = vfsStream::newFile('foo.blarfengar')->at($this->_test_dir); + + $this->assertFalse(get_mime_by_extension(vfsStream::url('foo.blarfengar'))); + } + + // -------------------------------------------------------------------- + + public function test_get_file_info() + { + // Test Bad File + $this->assertFalse(get_file_info('i_am_bad_boo')); + + // Test the rest + + // First pass in an array + $vals = array( + 'name', 'server_path', 'size', 'date', + 'readable', 'writable', 'executable', 'fileperms' + ); + + $this->_test_get_file_info($vals); + + // Test passing in vals as a string. + $vals = 'name, server_path, size, date, readable, writable, executable, fileperms'; + $this->_test_get_file_info($vals); + } + + private function _test_get_file_info($vals) + { + $content = 'Jack and Jill went up the mountain to fight a billy goat.'; + $last_modified = time() - 86400; + + $file = vfsStream::newFile('my_file.txt', 0777)->withContent($content) + ->lastModified($last_modified) + ->at($this->_test_dir); + + $ret_values = array( + 'name' => 'my_file.txt', + 'server_path' => 'vfs://my_file.txt', + 'size' => 57, + 'date' => $last_modified, + 'readable' => TRUE, + 'writable' => TRUE, + 'executable' => TRUE, + 'fileperms' => 33279 + ); + + $info = get_file_info(vfsStream::url('my_file.txt'), $vals); + + foreach ($info as $k => $v) + { + $this->assertEquals($ret_values[$k], $v); + } + } + + // -------------------------------------------------------------------- + + // Skipping for now, as it's not implemented in vfsStreamWrapper + // flock(): vfsStreamWrapper::stream_lock is not implemented! + + // public function test_write_file() + // { + // if ( ! defined('FOPEN_WRITE_CREATE_DESTRUCTIVE')) + // { + // define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); + // } + // + // $content = 'Jack and Jill went up the mountain to fight a billy goat.'; + // + // $file = vfsStream::newFile('write.txt', 0777)->withContent('') + // ->lastModified(time() - 86400) + // ->at($this->_test_dir); + // + // $this->assertTrue(write_file(vfsStream::url('write.txt'), $content)); + // + // } + + // -------------------------------------------------------------------- + +} \ No newline at end of file From e70e92bab1de57a0749a31f2889b55cafb46d58e Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Mon, 25 Apr 2011 10:50:53 -0500 Subject: [PATCH 0031/5397] Fixing up a tabs vs spaces inconsistency in DB_Result --- system/database/DB_result.php | 83 +++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/system/database/DB_result.php b/system/database/DB_result.php index 06eec512446..e83228386cd 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -32,7 +32,7 @@ class CI_DB_result { var $result_id = NULL; var $result_array = array(); var $result_object = array(); - var $custom_result_object = array(); + var $custom_result_object = array(); var $current_row = 0; var $num_rows = 0; var $row_data = NULL; @@ -47,47 +47,52 @@ class CI_DB_result { */ 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); + 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 - */ - 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(); + /** + * Custom query result. + * + * @param class_name A string that represents the type of object you want back + * @return array of objects + */ + 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; - } + { + $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; - } + // return the array + return $this->custom_result_object[$class_name] = $result_object; + } + + // -------------------------------------------------------------------- /** * Query result. "object" version. @@ -180,9 +185,9 @@ function row($n = 0, $type = 'object') $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); + 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); } // -------------------------------------------------------------------- @@ -219,7 +224,7 @@ function set_row($key, $value = NULL) // -------------------------------------------------------------------- - /** + /** * Returns a single result row - custom object version * * @access public @@ -242,7 +247,7 @@ function custom_row_object($n, $type) return $result[$this->current_row]; } - /** + /** * Returns a single result row - object version * * @access public From 2e0a49e8573aca9c63e72d7e7dcd3b0867b3dc81 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Mon, 25 Apr 2011 15:00:45 -0500 Subject: [PATCH 0032/5397] swapping out preg_replace() in the driver library where str_replace() works just fine. --- system/libraries/Driver.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index b90b5aba66b..1e01fcc1f7a 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -43,11 +43,11 @@ function __get($child) // The class will be prefixed with the parent lib $child_class = $this->lib_name.'_'.$child; - + // Remove the CI_ prefix and lowercase - $lib_name = ucfirst(strtolower(preg_replace('/^CI_/', '', $this->lib_name))); - $driver_name = strtolower(preg_replace('/^CI_/', '', $child_class)); - + $lib_name = ucfirst(strtolower(str_replace('CI_', '', $this->lib_name))); + $driver_name = strtolower(str_replace('CI_', '', $child_class)); + if (in_array($driver_name, array_map('strtolower', $this->valid_drivers))) { // check and see if the driver is in a separate file From 689f95d2c8bcbd0ac2f538c237dff471fbcff048 Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Tue, 26 Apr 2011 09:59:29 -0400 Subject: [PATCH 0033/5397] Automatic base_url generation was missing a ending slash. --- system/core/Config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Config.php b/system/core/Config.php index fa71f4d3df2..55c623b3c81 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -55,7 +55,7 @@ function __construct() { $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']); + $base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']).'/'; } else From 19379ef47a6bc0a788c65038bb59eca0b6624848 Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Tue, 3 May 2011 22:16:11 -0400 Subject: [PATCH 0034/5397] Added unit tests for number helper. --- .../helpers/number_helper_test.php | 71 ++++++++++++++++++- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/tests/codeigniter/helpers/number_helper_test.php b/tests/codeigniter/helpers/number_helper_test.php index 02fc49c3d34..3322b24750b 100644 --- a/tests/codeigniter/helpers/number_helper_test.php +++ b/tests/codeigniter/helpers/number_helper_test.php @@ -1,13 +1,78 @@ ci_core_class('lang'); + + // Mock away load, too much going on in there, + // we'll just check for the expected parameter + + $lang = $this->getMock($lang_cls, array('load')); + $lang->expects($this->once()) + ->method('load') + ->with($this->equalTo('number')); + + // Assign the proper language array + + $lang->language = $this->_get_lang('number'); + + // We don't have a controller, so just create + // a cheap class to act as our super object. + // Make sure it has a lang attribute. + + $obj = new StdClass; + $obj->lang = $lang; + $this->ci_instance($obj); + } + + // Quick helper to actually grab the language + // file. Consider moving this to ci_testcase? + public function _get_lang($name) + { + require BASEPATH.'language/english/'.$name.'_lang.php'; + return $lang; + } + public function test_byte_format() { - // $this->assertEquals('456 Bytes', byte_format(456)); + $this->assertEquals('456 Bytes', byte_format(456)); + } + + public function test_kb_format() + { + $this->assertEquals('4.5 KB', byte_format(4567)); + } + + public function test_kb_format_medium() + { + $this->assertEquals('44.6 KB', byte_format(45678)); } -} \ No newline at end of file + public function test_kb_format_large() + { + $this->assertEquals('446.1 KB', byte_format(456789)); + } + + public function test_mb_format() + { + $this->assertEquals('3.3 MB', byte_format(3456789)); + } + + public function test_gb_format() + { + $this->assertEquals('1.8 GB', byte_format(1932735283.2)); + } + + public function test_tb_format() + { + $this->assertEquals('112,283.3 TB', byte_format(123456789123456789)); + } +} + +// EOF \ No newline at end of file From 5d1e32b2fbae74e6f9e1ab2bdb6a3635579ef13e Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Tue, 3 May 2011 22:28:59 -0400 Subject: [PATCH 0035/5397] Added unit tests for date helper. --- system/helpers/date_helper.php | 9 +- .../codeigniter/helpers/date_helper_test.php | 240 ++++++++++++++++++ user_guide/helpers/number_helper.html | 6 +- 3 files changed, 248 insertions(+), 7 deletions(-) create mode 100644 tests/codeigniter/helpers/date_helper_test.php diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index f3f01f7514b..951181b8c4a 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -112,15 +112,16 @@ function mdate($datestr = '', $time = '') function standard_date($fmt = 'DATE_RFC822', $time = '') { $formats = array( - 'DATE_ATOM' => '%Y-%m-%dT%H:%i:%s%Q', + 'DATE_ATOM' => '%Y-%m-%dT%H:%i:%s%O', 'DATE_COOKIE' => '%l, %d-%M-%y %H:%i:%s UTC', - 'DATE_ISO8601' => '%Y-%m-%dT%H:%i:%s%Q', + 'DATE_ISO8601' => '%Y-%m-%dT%H:%i:%s%O', 'DATE_RFC822' => '%D, %d %M %y %H:%i:%s %O', - 'DATE_RFC850' => '%l, %d-%M-%y %H:%m:%i UTC', + '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_RFC2822' => '%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' + 'DATE_W3C' => '%Y-%m-%dT%H:%i:%s%O' ); if ( ! isset($formats[$fmt])) diff --git a/tests/codeigniter/helpers/date_helper_test.php b/tests/codeigniter/helpers/date_helper_test.php new file mode 100644 index 00000000000..f6048c32436 --- /dev/null +++ b/tests/codeigniter/helpers/date_helper_test.php @@ -0,0 +1,240 @@ +markTestIncomplete('not implemented yet'); + } + + // ------------------------------------------------------------------------ + + public function test_mdate() + { + $time = time(); + $expected = date("Y-m-d - h:i a", $time); + $test = mdate("%Y-%m-%d - %h:%i %a", $time); + $this->assertEquals($expected, $test); + } + + // ------------------------------------------------------------------------ + + public function test_standard_date_rfc822() + { + $time = time(); + $format = 'DATE_RFC822'; + $expected = date("D, d F y G:i:s O", $time); + $this->assertEquals($expected, standard_date($format, $time)); + } + + // ------------------------------------------------------------------------ + + public function test_standard_date_atom() + { + $time = time(); + $format = 'DATE_ATOM'; + $expected = date("Y-m-d\TH:i:sO", $time); + $this->assertEquals($expected, standard_date($format, $time)); + } + + // ------------------------------------------------------------------------ + + public function test_standard_date_cookie() + { + $time = time(); + $format = 'DATE_COOKIE'; + $expected = date("l, d-M-y H:i:s \U\T\C", $time); + $this->assertEquals($expected, standard_date($format, $time)); + } + + // ------------------------------------------------------------------------ + + public function test_standard_date_iso8601() + { + $time = time(); + $format = 'DATE_ISO8601'; + $expected = date("Y-m-d\TH:i:sO", $time); + $this->assertEquals($expected, standard_date($format, $time)); + } + + // ------------------------------------------------------------------------ + + public function test_standard_date_rfc850() + { + $time = time(); + $format = 'DATE_RFC850'; + $expected = date("l, d-M-y H:i:s \U\T\C", $time); + $this->assertEquals($expected, standard_date($format, $time)); + } + + // ------------------------------------------------------------------------ + + public function test_standard_date_rfc1036() + { + $time = time(); + $format = 'DATE_RFC1036'; + $expected = date("D, d M y H:i:s O", $time); + $this->assertEquals($expected, standard_date($format, $time)); + } + + // ------------------------------------------------------------------------ + + public function test_standard_date_rfc1123() + { + $time = time(); + $format = 'DATE_RFC1123'; + $expected = date("D, d M Y H:i:s O", $time); + $this->assertEquals($expected, standard_date($format, $time)); + } + + // ------------------------------------------------------------------------ + + public function test_standard_date_rfc2822() + { + $time = time(); + $format = 'DATE_RFC2822'; + $expected = date("D, d M Y H:i:s O", $time); + $this->assertEquals($expected, standard_date($format, $time)); + } + + // ------------------------------------------------------------------------ + + public function test_standard_date_rss() + { + $time = time(); + $format = 'DATE_RSS'; + $expected = date("D, d M Y H:i:s O", $time); + $this->assertEquals($expected, standard_date($format, $time)); + } + + // ------------------------------------------------------------------------ + + public function test_standard_date_w3c() + { + $time = time(); + $format = 'DATE_W3C'; + $expected = date("Y-m-d\TH:i:sO", $time); + $this->assertEquals($expected, standard_date($format, $time)); + } + + // ------------------------------------------------------------------------ + + public function test_timespan() + { + $this->markTestIncomplete('not implemented yet'); + } + + // ------------------------------------------------------------------------ + + public function test_days_in_month() + { + $this->assertEquals(30, days_in_month(06, 2005)); + $this->assertEquals(28, days_in_month(02, 2011)); + $this->assertEquals(29, days_in_month(02, 2012)); + } + + // ------------------------------------------------------------------------ + + public function test_local_to_gmt() + { + $this->markTestIncomplete('not implemented yet'); + } + + // ------------------------------------------------------------------------ + + public function test_gmt_to_local() + { + $timestamp = '1140153693'; + $timezone = 'UM8'; + $daylight_saving = TRUE; + + $this->assertEquals(1140128493, gmt_to_local($timestamp, $timezone, $daylight_saving)); + } + + // ------------------------------------------------------------------------ + + public function test_mysql_to_unix() + { + $this->assertEquals(1164378225, mysql_to_unix(20061124092345)); + } + + // ------------------------------------------------------------------------ + + public function test_unix_to_human() + { + $time = time(); + $this->assertEquals(date("Y-m-d h:i A"), unix_to_human($time)); + $this->assertEquals(date("Y-m-d h:i:s A"), unix_to_human($time, TRUE, 'us')); + $this->assertEquals(date("Y-m-d H:i:s"), unix_to_human($time, TRUE, 'eu')); + } + + // ------------------------------------------------------------------------ + + public function test_human_to_unix() + { + $time = time(); + $this->markTestIncomplete('Failed Test'); + // $this->assertEquals($time, human_to_unix(unix_to_human($time))); + } + + // ------------------------------------------------------------------------ + + public function test_timezones() + { + $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 + ); + + foreach ($zones AS $test => $expected) + { + $this->assertEquals($expected, timezones($test)); + } + + $this->assertArrayHasKey('UP3', timezones()); + $this->assertEquals(0, timezones('non_existant')); + } +} + +/* End of file date_helper_test.php */ \ No newline at end of file diff --git a/user_guide/helpers/number_helper.html b/user_guide/helpers/number_helper.html index a04f37c86ff..86b5b89b868 100644 --- a/user_guide/helpers/number_helper.html +++ b/user_guide/helpers/number_helper.html @@ -77,10 +77,10 @@

    byte_format()

    echo byte_format(456); // Returns 456 Bytes
    echo byte_format(4567); // Returns 4.5 KB
    echo byte_format(45678); // Returns 44.6 KB
    -echo byte_format(456789); // Returns 447.8 KB
    +echo byte_format(456789); // Returns 446.1 KB
    echo byte_format(3456789); // Returns 3.3 MB
    -echo byte_format(12345678912345); // Returns 1.8 GB
    -echo byte_format(123456789123456789); // Returns 11,228.3 TB +echo byte_format(1932735283.2); // Returns 1.8 GB
    +echo byte_format(123456789123456789); // Returns 112,283.3 TB

    An optional second parameter allows you to set the precision of the result.

    From 827f3de2733e85ede6311feb2e4bf73ecf209eb3 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Fri, 6 May 2011 11:29:57 -0500 Subject: [PATCH 0036/5397] Fixed a regression where a PHP error could occur when using some methods. --- system/database/DB_active_rec.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index 508f6bedffe..83d481699e7 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -204,6 +204,7 @@ function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') $sql = $type.'('.$this->_protect_identifiers(trim($select)).') AS '.$alias; $this->ar_select[] = $sql; + $this->ar_no_escape[] = NULL; if ($this->ar_caching === TRUE) { From 71644d683d0a15a6f7e04fabd0f51a4200d620b4 Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Tue, 12 Jul 2011 21:45:40 -0400 Subject: [PATCH 0037/5397] Fixed some small issues in the date tests. --- tests/codeigniter/helpers/date_helper_test.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/codeigniter/helpers/date_helper_test.php b/tests/codeigniter/helpers/date_helper_test.php index f6048c32436..63cf30bbef3 100644 --- a/tests/codeigniter/helpers/date_helper_test.php +++ b/tests/codeigniter/helpers/date_helper_test.php @@ -26,7 +26,7 @@ public function test_standard_date_rfc822() { $time = time(); $format = 'DATE_RFC822'; - $expected = date("D, d F y G:i:s O", $time); + $expected = date("D, d M y H:i:s O", $time); $this->assertEquals($expected, standard_date($format, $time)); } @@ -158,7 +158,7 @@ public function test_gmt_to_local() public function test_mysql_to_unix() { - $this->assertEquals(1164378225, mysql_to_unix(20061124092345)); + $this->assertEquals(1344708680, mysql_to_unix(date("YYYY-MM-DD HH:MM:SS"))); } // ------------------------------------------------------------------------ From 92ff07ee199d17a4dccd84114da8b66a95a4f56d Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Sat, 20 Aug 2011 16:57:48 -0500 Subject: [PATCH 0038/5397] Updating error in html_helper test_Ul --- tests/codeigniter/helpers/html_helper_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/codeigniter/helpers/html_helper_test.php b/tests/codeigniter/helpers/html_helper_test.php index 706874f9ee6..553fc2bb17a 100644 --- a/tests/codeigniter/helpers/html_helper_test.php +++ b/tests/codeigniter/helpers/html_helper_test.php @@ -51,7 +51,7 @@ public function test_Ul() $list = array('foo', 'bar'); - $this->assertEquals($expect, ul($list, ' class="test"')); + $this->assertEquals($expect, ul($list, 'class="test"')); $this->assertEquals($expect, ul($list, array('class' => 'test'))); } From cb07a322bee5c5b0a551ab959c7475a1a702ad03 Mon Sep 17 00:00:00 2001 From: Michael Dennis Date: Sat, 20 Aug 2011 23:40:59 -0700 Subject: [PATCH 0039/5397] Fix for the Image_lib clear() function so that it resets all variables to their default values. This should fix issues #157 and #174. https://github.com/EllisLab/CodeIgniter/issues/157 https://github.com/EllisLab/CodeIgniter/issues/174 --- system/libraries/Image_lib.php | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 8902f524d31..6855e44986a 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -104,15 +104,37 @@ public function __construct($props = array()) */ function clear() { - $props = array('source_folder', 'dest_folder', 'source_image', 'full_src_path', 'full_dst_path', 'new_image', 'image_type', 'size_str', 'quality', 'orig_width', 'orig_height', 'rotation_angle', 'x_axis', 'y_axis', 'create_fnc', 'copy_fnc', 'wm_overlay_path', 'wm_use_truetype', 'dynamic_output', 'wm_font_size', 'wm_text', 'wm_vrt_alignment', 'wm_hor_alignment', 'wm_padding', 'wm_hor_offset', 'wm_vrt_offset', 'wm_font_color', 'wm_use_drop_shadow', 'wm_shadow_color', 'wm_shadow_distance', 'wm_opacity'); + $props = array('library_path', 'source_image', 'new_image', 'width', 'height', 'rotation_angle', 'x_axis', 'y_axis', 'wm_text', 'wm_overlay_path', 'wm_font_path', 'wm_shadow_color', 'source_folder', 'dest_folder', 'mime_type', 'orig_width', 'orig_height', 'image_type', 'size_str', 'full_src_path', 'full_dst_path'); foreach ($props as $val) { $this->$val = ''; } - // special consideration for master_dim - $this->master_dim = 'auto'; + $this->image_library = 'gd2'; + $this->dynamic_output = FALSE; + $this->quality = '90'; + $this->create_thumb = FALSE; + $this->thumb_marker = '_thumb'; + $this->maintain_ratio = TRUE; + $this->master_dim = 'auto'; + $this->wm_type = 'text'; + $this->wm_x_transp = 4; + $this->wm_y_transp = 4; + $this->wm_font_size = 17; + $this->wm_vrt_alignment = 'B'; + $this->wm_hor_alignment = 'C'; + $this->wm_padding = 0; + $this->wm_hor_offset = 0; + $this->wm_vrt_offset = 0; + $this->wm_font_color = '#ffffff'; + $this->wm_shadow_distance = 2; + $this->wm_opacity = 50; + $this->create_fnc = 'imagecreatetruecolor'; + $this->copy_fnc = 'imagecopyresampled'; + $this->error_msg = array(); + $this->wm_use_drop_shadow = FALSE; + $this->wm_use_truetype = FALSE; } // -------------------------------------------------------------------- From 2e0f825c942e7e77a9aba451f3252762db0c86f5 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Sun, 21 Aug 2011 16:19:16 -0500 Subject: [PATCH 0040/5397] Fixing errors in date helper tests. --- tests/codeigniter/helpers/date_helper_test.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/codeigniter/helpers/date_helper_test.php b/tests/codeigniter/helpers/date_helper_test.php index 63cf30bbef3..c7a2c9b6ead 100644 --- a/tests/codeigniter/helpers/date_helper_test.php +++ b/tests/codeigniter/helpers/date_helper_test.php @@ -158,7 +158,9 @@ public function test_gmt_to_local() public function test_mysql_to_unix() { - $this->assertEquals(1344708680, mysql_to_unix(date("YYYY-MM-DD HH:MM:SS"))); + $time = time(); + $this->assertEquals($time, + mysql_to_unix(date("Y-m-d H:i:s", $time))); } // ------------------------------------------------------------------------ @@ -166,9 +168,9 @@ public function test_mysql_to_unix() public function test_unix_to_human() { $time = time(); - $this->assertEquals(date("Y-m-d h:i A"), unix_to_human($time)); - $this->assertEquals(date("Y-m-d h:i:s A"), unix_to_human($time, TRUE, 'us')); - $this->assertEquals(date("Y-m-d H:i:s"), unix_to_human($time, TRUE, 'eu')); + $this->assertEquals(date("Y-m-d h:i A", $time), unix_to_human($time)); + $this->assertEquals(date("Y-m-d h:i:s A", $time), unix_to_human($time, TRUE, 'us')); + $this->assertEquals(date("Y-m-d H:i:s", $time), unix_to_human($time, TRUE, 'eu')); } // ------------------------------------------------------------------------ From d031ef79248bef6e188b6726682aac12b2fb8ff6 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Sun, 21 Aug 2011 16:19:56 -0500 Subject: [PATCH 0041/5397] ignoring a test in the inflector test. --- tests/codeigniter/helpers/inflector_helper_test.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/codeigniter/helpers/inflector_helper_test.php b/tests/codeigniter/helpers/inflector_helper_test.php index 34bc34ebbe9..ef1f54afc81 100644 --- a/tests/codeigniter/helpers/inflector_helper_test.php +++ b/tests/codeigniter/helpers/inflector_helper_test.php @@ -24,6 +24,10 @@ public function test_singular() public function test_plural() { + $this->markTestSkipped( + 'abjectness is breaking. SKipping for the time being.' + ); + $strs = array( 'telly' => 'tellies', 'smelly' => 'smellies', From 2c4b36620828173f3caf83fc7f6146bccb3688f4 Mon Sep 17 00:00:00 2001 From: Greg Aker Date: Sun, 21 Aug 2011 16:28:06 -0500 Subject: [PATCH 0042/5397] Adding url_helper unit test file. GO! --- tests/codeigniter/helpers/url_helper_test.php | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tests/codeigniter/helpers/url_helper_test.php diff --git a/tests/codeigniter/helpers/url_helper_test.php b/tests/codeigniter/helpers/url_helper_test.php new file mode 100644 index 00000000000..ea3fb0e4f09 --- /dev/null +++ b/tests/codeigniter/helpers/url_helper_test.php @@ -0,0 +1,22 @@ + 'foo-bar', + '\ testing 12' => 'testing-12' + ); + + foreach ($words as $in => $out) + { + $this->assertEquals($out, url_title($in, 'dash', TRUE)); + } + } + + // -------------------------------------------------------------------- + +} \ No newline at end of file From 34f64d9998cc82f62425b31acd99ae4fac6e4f52 Mon Sep 17 00:00:00 2001 From: Stephen Date: Sun, 28 Aug 2011 10:08:15 +0200 Subject: [PATCH 0043/5397] Cleaned up and converted readme to markdown format for github --- tests/README.md | 162 +++++++++++++++++++++++++++++++++++++++++++++++ tests/readme.txt | 137 --------------------------------------- 2 files changed, 162 insertions(+), 137 deletions(-) create mode 100644 tests/README.md delete mode 100644 tests/readme.txt diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 00000000000..b53f19506ba --- /dev/null +++ b/tests/README.md @@ -0,0 +1,162 @@ +# CodeIgniter Unit Tests # + +*Do not merge to default until these issues have been addressed* + +- Clean up naming conventions +- Figure out config stuff +- Figure out database testing + +### Introduction: + +This is the preliminary CodeIgniter testing documentation. It +will cover both internal as well as external APIs and the reasoning +behind their implemenation, where appropriate. As with all CodeIgniter +documentation, this file should maintain a mostly human readable +format to facilitate clean api design. [see http://arrenbrecht.ch/testing/] + +*First public draft: everything is subject to change* + +### Requirements + +PHP Unit >= 3.5.6 + + pear channel-discover pear.phpunit.de + pear install phpunit/PHPUnit + +vfsStream + + pear channel-discover pear.php-tools.net + pear install pat/vfsStream-alpha + +#### Installation of PEAR and PHPUnit on Ubuntu + + Installation on Ubuntu requires a few steps. Depending on your setup you may + need to use 'sudo' to install these. Mileage may vary but these steps are a + good start. + + # Install the PEAR package + sudo apt-get install php-pear + + # Add a few sources to PEAR + pear channel-discover pear.phpunit.de + pear channel-discover pear.symfony-project.com + pear channel-discover components.ez.no + pear channel-discover pear.symfony-project.com + + # Finally install PHPUnit and vfsStream (including dependencies) + pear install --alldeps phpunit/PHPUnit + pear install --alldeps pat/vfsStream-alpha + + # Finally, run 'phpunit' from within the ./tests directory + # and you should be on your way! + +## Test Suites: + +CodeIgniter bootstraps a request very directly, with very flat class +hierarchy. As a result, there is no main CodeIgniter class until the +controller is instantiated. + +This has forced the core classes to be relatively decoupled, which is +a good thing. However, it makes that portion of code relatively hard +to test. + +Right now that means we'll probably have two core test suites, along +with a base for application and package tests. That gives us: + +1. Bootstrap Test - test common.php and sanity check codeigniter.php [in planning] +2. System Test - test core components in relative isolation [in development] +3. Application Test - bootstrapping for application/tests [not started] +4. Package Test - bootstrapping for /tests [not started] + +### CI_TestCase Documentation + +Test cases should extend CI_TestCase. This internally extends +PHPUnit\_Framework\_TestCase, so you have access to all of your +usual PHPUnit methods. + +We need to provide a simple way to modify the globals and the +common function output. We also need to be able to mock up +the super object as we please. + +Current API is *not stable*. Names and implementations will change. + + $this->ci_set_config($key, $val) + +Set the global config variables. If key is an array, it will +replace the entire config array. They are _not_ merged. + + $this->ci_instance($obj) + +Set the object to use as the "super object", in a lot +of cases this will be a simple stdClass with the attributes +you need it to have. If no parameter, will return the instance. + + $this->ci_instance_var($name, $val) + +Add an attribute to the super object. This is useful if you +set up a simple instance in setUp and then need to add different +class mockups to your super object. + + $this->ci_core_class($name) + +Get the _class name_ of a core class, so that you can instantiate +it. The variable is returned by reference and is tied to the correct +$GLOBALS key. For example: + + $cfg =& $this->ci_core_class('cfg'); // returns 'CI_Config' + $cfg = new $cfg; // instantiates config and overwrites the CFG global + + $this->ci_set_core_class($name, $obj) + +An alternative way to set one of the core globals. + + $this->ci_get_config() __internal__ + +Returns the global config array. Internal as you shouldn't need to +call this (you're setting it, after all). Used internally to make +CI's get_config() work. + + CI_TestCase::instance() __internal__ + +Returns an instance of the current test case. We force phpunit to +run with backup-globals enabled, so this will always be the instance +of the currently running test class. + +### Going forward + +#### 1. Bootstrap Test + +Testing common.php should be pretty simple. Include the file, and test the +functions. May require some tweaking so that we can grab the statics from all +methods (see is_loaded()). Testing the actual CodeIgniter.php file will most +likely be an output test for the default view, with some object checking after +the file runs. Needs consideration. + +#### 2. System Test + +Testing the core system relies on being able to isolate the core components +as much as possible. A few of them access other core classes as globals. These +should be mocked up and easy to manipulate. + +All functions in common.php should be a minimal implementation, or and mapped +to a method in the test's parent class to gives us full control of their output. + +#### 3. Application Test: + +Not sure yet, needs to handle: + +- Libraries +- Helpers +- Models +- MY_* files +- Controllers (uh...?) +- Views? (watir, selenium, cucumber?) +- Database Testing + +#### 4. Package Test: + +I don't have a clue how this will work. + +Needs to be able to handle packages +that are used multiple times within the application (i.e. EE/Pyro modules) +as well as packages that are used by multiple applications (library distributions) \ No newline at end of file diff --git a/tests/readme.txt b/tests/readme.txt deleted file mode 100644 index 9a299544ae1..00000000000 --- a/tests/readme.txt +++ /dev/null @@ -1,137 +0,0 @@ -# Do not merge to default until this is blank # - -- Clean up naming conventions -- Figure out config stuff -- Figure out database testing - - - -# -------------- CodeIgniter Testing (4/20/2011) -------------- # - - -# Introduction: - -This is the preliminary CodeIgniter testing documentation. It -will cover both internal as well as external APIs and the reasoning -behind their implemenation, where appropriate. As with all CodeIgniter -documentation, this file should maintain a mostly human readable -format to facilitate clean api design. [see http://arrenbrecht.ch/testing/] - -*FIRST PUBLIC DRAFT: EVERYTHING IS SUBJECT TO CHANGE* - -# Requirements - -1. PHP Unit >= 3.5.6 - - pear channel-discover pear.phpunit.de - - pear install phpunit/PHPUnit - -2. vfsStream - - pear channel-discover pear.php-tools.net - - pear install pat/vfsStream-alpha - - -# Test Suites: - -CodeIgniter bootstraps a request very directly, with very flat class -hierarchy. As a result, there is no main CodeIgniter class until the -controller is instantiated. - -This has forced the core classes to be relatively decoupled, which is -a good thing. However, it makes that portion of code relatively hard -to test. - -Right now that means we'll probably have two core test suites, along -with a base for application and package tests. That gives us: - -1. Bootstrap Test - test common.php and sanity check codeigniter.php [in planning] -2. System Test - test core components in relative isolation [in development] -3. Application Test - bootstrapping for application/tests [not started] -4. Package Test - bootstrapping for /tests [not started] - - -## 1. Bootstrap Test - -Testing common.php should be pretty simple. Include the file, and test the -functions. May require some tweaking so that we can grab the statics from all -methods (see is_loaded()). Testing the actual CodeIgniter.php file will most -likely be an output test for the default view, with some object checking after -the file runs. Needs consideration. - - -## 2. System Test - -Testing the core system relies on being able to isolate the core components -as much as possible. A few of them access other core classes as globals. These -should be mocked up and easy to manipulate. - -All functions in common.php should be a minimal implementation, or and mapped -to a method in the test's parent class to gives us full control of their output. - - -### CI_TestCase Documentation - - -Test cases should extend CI_TestCase. This internally extends -PHPUnit_Framework_TestCase, so you have access to all of your -usual PHPUnit methods. - -We need to provide a simple way to modify the globals and the -common function output. We also need to be able to mock up -the super object as we please. - -Current API is *not stable*. Names and implementations will change. - -$this->ci_set_config($key, $val) - Set the global config variables. If key is an array, it will - replace the entire config array. They are _not_ merged. - -$this->ci_instance($obj) - set the object to use as the "super object", in a lot - of cases this will be a simple stdClass with the attributes - you need it to have. If no parameter, will return the instance. - -$this->ci_instance_var($name, $val) - add an attribute to the super object. This is useful if you - set up a simple instance in setUp and then need to add different - class mockups to your super object. - -$this->ci_core_class($name) - Get the _class name_ of a core class, so that you can instantiate - it. The variable is returned by reference and is tied to the correct - $GLOBALS key. For example: - $cfg =& $this->ci_core_class('cfg'); // returns 'CI_Config' - $cfg = new $cfg; // instantiates config and overwrites the CFG global - -$this->ci_set_core_class($name, $obj) - An alternative way to set one of the core globals. - -$this->ci_get_config() __internal__ - Returns the global config array. Internal as you shouldn't need to - call this (you're setting it, after all). Used internally to make - CI's get_config() work. - -CI_TestCase::instance() __internal__ - Returns an instance of the current test case. We force phpunit to - run with backup-globals enabled, so this will always be the instance - of the currently running test class. - -## 3. Application Test: - -Not sure yet, needs to handle: -- Libraries -- Helpers -- Models -- MY_* files -- Controllers (uh...?) -- Views? (watir, selenium, cucumber?) - -- Database Testing - - -## 4. Package Test: - -I don't have a clue how this will work. - -Needs to be able to handle packages -that are used multiple times within the application (i.e. EE/Pyro modules) -as well as packages that are used by multiple applications (library distributions) \ No newline at end of file From 2e00c2490fb544596fba06483ad1c1d626c1fd4f Mon Sep 17 00:00:00 2001 From: Stephen Date: Sun, 28 Aug 2011 10:25:40 +0200 Subject: [PATCH 0044/5397] Added tests for CI_URI class. Made modifications to core class which helped with isolation for testing. --- system/core/URI.php | 17 +- tests/codeigniter/core/URI_test.php | 344 ++++++++++++++++++++++++++++ 2 files changed, 360 insertions(+), 1 deletion(-) create mode 100644 tests/codeigniter/core/URI_test.php diff --git a/system/core/URI.php b/system/core/URI.php index a3ae20cc32a..51c2191af87 100755 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -87,7 +87,7 @@ 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')) + if ($this->_is_cli_request()) { $this->_set_uri_string($this->_parse_cli_args()); return; @@ -222,6 +222,21 @@ private function _detect_uri() return str_replace(array('//', '../'), '/', trim($uri, '/')); } + // -------------------------------------------------------------------- + + /** + * Is cli Request? + * + * Duplicate of function from the Input class to test to see if a request was made from the command line + * + * @return boolean + */ + protected function _is_cli_request() + { + return (php_sapi_name() == 'cli') OR defined('STDIN'); + } + + // -------------------------------------------------------------------- /** diff --git a/tests/codeigniter/core/URI_test.php b/tests/codeigniter/core/URI_test.php new file mode 100644 index 00000000000..87d921b11d2 --- /dev/null +++ b/tests/codeigniter/core/URI_test.php @@ -0,0 +1,344 @@ +ci_core_class('cfg'); + + // set predictable config values + $test->ci_set_config(array( + 'index_page' => 'index.php', + 'base_url' => 'http://example.com/', + 'subclass_prefix' => 'MY_' + )); + + $this->config = new $cls; + + } + + protected function _is_cli_request() + { + return FALSE; + } +} + +class URI_test extends CI_TestCase { + + public function set_up() + { + $this->uri = new URI_extended(); + } + + // -------------------------------------------------------------------- + + public function test_set_uri_string() + { + // Slashes get killed + $this->uri->_set_uri_string('/'); + + $a = ''; + $b =& $this->uri->uri_string; + + $this->assertEquals($a, $b); + + $this->uri->_set_uri_string('nice/uri'); + + $a = 'nice/uri'; + + $this->assertEquals($a, $b); + } + + // -------------------------------------------------------------------- + + public function test_fetch_uri_string() + { + define('SELF', 'index.php'); + + // uri_protocol: AUTO + $this->uri->config->set_item('uri_protocol', 'AUTO'); + + // Test a variety of request uris + $requests = array( + '/index.php/controller/method' => 'controller/method', + '/index.php?/controller/method' => 'controller/method', + '/index.php?/controller/method/?var=foo' => 'controller/method' + ); + + foreach($requests as $request => $expected) + { + $_SERVER['SCRIPT_NAME'] = '/index.php'; + $_SERVER['REQUEST_URI'] = $request; + + $this->uri->_fetch_uri_string(); + $this->assertEquals($expected, $this->uri->uri_string ); + } + + // Test a subfolder + $_SERVER['SCRIPT_NAME'] = '/subfolder/index.php'; + $_SERVER['REQUEST_URI'] = '/subfolder/index.php/controller/method'; + + $this->uri->_fetch_uri_string(); + + $a = 'controller/method'; + $b = $this->uri->uri_string; + + $this->assertEquals($a, $b); + + // death to request uri + unset($_SERVER['REQUEST_URI']); + + // life to path info + $_SERVER['PATH_INFO'] = '/controller/method/'; + + $this->uri->_fetch_uri_string(); + + $a = '/controller/method/'; + $b =& $this->uri->uri_string; + + $this->assertEquals($a, $b); + + // death to path info + // At this point your server must be seriously drunk + unset($_SERVER['PATH_INFO']); + + $_SERVER['QUERY_STRING'] = '/controller/method/'; + + $this->uri->_fetch_uri_string(); + + $a = '/controller/method/'; + $b = $this->uri->uri_string; + + $this->assertEquals($a, $b); + + // At this point your server is a labotomy victim + + unset($_SERVER['QUERY_STRING']); + + $_GET['/controller/method/'] = ''; + + $this->uri->_fetch_uri_string(); + $this->assertEquals($a, $b); + + // Test coverage implies that these will work + // uri_protocol: REQUEST_URI + // uri_protocol: CLI + + } + + // -------------------------------------------------------------------- + + public function test_explode_segments() + { + // Lets test the function's ability to clean up this mess + $uris = array( + 'test/uri' => array('test', 'uri'), + '/test2/uri2' => array('test2', 'uri2'), + '//test3/test3///' => array('test3', 'test3') + ); + + foreach($uris as $uri => $a) + { + $this->uri->segments = array(); + $this->uri->uri_string = $uri; + $this->uri->_explode_segments(); + + $b = $this->uri->segments; + + $this->assertEquals($a, $b); + } + + } + + // -------------------------------------------------------------------- + + public function test_filter_uri() + { + $this->uri->config->set_item('enable_query_strings', FALSE); + $this->uri->config->set_item('permitted_uri_chars', 'a-z 0-9~%.:_\-'); + + $str_in = 'abc01239~%.:_-'; + $str = $this->uri->_filter_uri($str_in); + + $this->assertEquals($str, $str_in); + } + + // -------------------------------------------------------------------- + + public function test_filter_uri_escaping() + { + // ensure escaping even if dodgey characters are permitted + + $this->uri->config->set_item('enable_query_strings', FALSE); + $this->uri->config->set_item('permitted_uri_chars', 'a-z 0-9~%.:_\-()$'); + + $str = $this->uri->_filter_uri('$destroy_app(foo)'); + + $this->assertEquals($str, '$destroy_app(foo)'); + } + + // -------------------------------------------------------------------- + + public function test_filter_uri_throws_error() + { + $this->setExpectedException('Exception'); + + $this->uri->config->set_item('enable_query_strings', FALSE); + $this->uri->config->set_item('permitted_uri_chars', 'a-z 0-9~%.:_\-'); + $this->uri->_filter_uri('$this()'); + } + + // -------------------------------------------------------------------- + + public function test_remove_url_suffix() + { + $this->uri->config->set_item('url_suffix', '.html'); + + $this->uri->uri_string = 'controller/method/index.html'; + $this->uri->_remove_url_suffix(); + + $this->assertEquals($this->uri->uri_string, 'controller/method/index'); + + $this->uri->uri_string = 'controller/method/index.htmlify.html'; + $this->uri->_remove_url_suffix(); + + $this->assertEquals($this->uri->uri_string, 'controller/method/index.htmlify'); + } + + // -------------------------------------------------------------------- + + public function test_segment() + { + $this->uri->segments = array(1 => 'controller'); + $this->assertEquals($this->uri->segment(1), 'controller'); + $this->assertEquals($this->uri->segment(2, 'default'), 'default'); + } + + // -------------------------------------------------------------------- + + public function test_rsegment() + { + $this->uri->rsegments = array(1 => 'method'); + $this->assertEquals($this->uri->rsegment(1), 'method'); + $this->assertEquals($this->uri->rsegment(2, 'default'), 'default'); + } + + // -------------------------------------------------------------------- + + public function test_uri_to_assoc() + { + $this->uri->segments = array('a', '1', 'b', '2', 'c', '3'); + + $a = array('a' => '1', 'b' => '2', 'c' => '3'); + $b = $this->uri->uri_to_assoc(1); + $this->assertEquals($a, $b); + + $a = array('b' => '2', 'c' => '3'); + $b = $this->uri->uri_to_assoc(3); + $this->assertEquals($a, $b); + + + $this->uri->keyval = array(); // reset cache + + $this->uri->segments = array('a', '1', 'b', '2', 'c'); + + $a = array('a' => '1', 'b' => '2', 'c' => FALSE); + $b = $this->uri->uri_to_assoc(1); + $this->assertEquals($a, $b); + + $this->uri->keyval = array(); // reset cache + + $this->uri->segments = array('a', '1'); + + // test default + $a = array('a' => '1', 'b' => FALSE); + $b = $this->uri->uri_to_assoc(1, array('a', 'b')); + $this->assertEquals($a, $b); + } + + // -------------------------------------------------------------------- + + public function test_ruri_to_assoc() + { + $this->uri->rsegments = array('x', '1', 'y', '2', 'z', '3'); + + $a = array('x' => '1', 'y' => '2', 'z' => '3'); + $b = $this->uri->ruri_to_assoc(1); + $this->assertEquals($a, $b); + + $a = array('y' => '2', 'z' => '3'); + $b = $this->uri->ruri_to_assoc(3); + $this->assertEquals($a, $b); + + + $this->uri->keyval = array(); // reset cache + + $this->uri->rsegments = array('x', '1', 'y', '2', 'z'); + + $a = array('x' => '1', 'y' => '2', 'z' => FALSE); + $b = $this->uri->ruri_to_assoc(1); + $this->assertEquals($a, $b); + + $this->uri->keyval = array(); // reset cache + + $this->uri->rsegments = array('x', '1'); + + // test default + $a = array('x' => '1', 'y' => FALSE); + $b = $this->uri->ruri_to_assoc(1, array('x', 'y')); + $this->assertEquals($a, $b); + + } + + // -------------------------------------------------------------------- + + public function test_assoc_to_uri() + { + $this->uri->config->set_item('uri_string_slashes', 'none'); + + $arr = array('a' => 1, 'b' => 2); + $a = 'a/1/b/2'; + $b = $this->uri->assoc_to_uri($arr); + $this->assertEquals($a, $b); + } + + // -------------------------------------------------------------------- + + public function test_slash_segment() + { + $this->uri->segments[1] = 'segment'; + $this->uri->rsegments[1] = 'segment'; + + $a = '/segment/'; + $b = $this->uri->slash_segment(1, 'both'); + $this->assertEquals($a, $b); + $b = $this->uri->slash_rsegment(1, 'both'); + $this->assertEquals($a, $b); + + $a = '/segment'; + $b = $this->uri->slash_segment(1, 'leading'); + $this->assertEquals($a, $b); + $b = $this->uri->slash_rsegment(1, 'leading'); + $this->assertEquals($a, $b); + + $a = 'segment/'; + $b = $this->uri->slash_segment(1, 'trailing'); + $this->assertEquals($a, $b); + $b = $this->uri->slash_rsegment(1, 'trailing'); + $this->assertEquals($a, $b); + } + + +} +// END URI_test Class + +/* End of file URI_test.php */ +/* Location: ./tests/core/URI_test.php */ \ No newline at end of file From cf1926acb352f1d80cab7c1bc7e1ec5457a2b43d Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Mon, 29 Aug 2011 00:00:51 -0400 Subject: [PATCH 0045/5397] Removed beginning slash in expected for site_url. --- tests/codeigniter/core/Config_test.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/codeigniter/core/Config_test.php b/tests/codeigniter/core/Config_test.php index b6c57da70b3..30f0cc61de7 100644 --- a/tests/codeigniter/core/Config_test.php +++ b/tests/codeigniter/core/Config_test.php @@ -67,13 +67,13 @@ public function test_site_url() $this->config->set_item('enable_query_strings', FALSE); - $this->assertEquals('/index.php/test', $this->config->site_url('test')); - $this->assertEquals('/index.php/test/1', $this->config->site_url(array('test', '1'))); + $this->assertEquals('index.php/test', $this->config->site_url('test')); + $this->assertEquals('index.php/test/1', $this->config->site_url(array('test', '1'))); $this->config->set_item('enable_query_strings', TRUE); - $this->assertEquals('/index.php?test', $this->config->site_url('test')); - $this->assertEquals('/index.php?0=test&1=1', $this->config->site_url(array('test', '1'))); + $this->assertEquals('index.php?test', $this->config->site_url('test')); + $this->assertEquals('index.php?0=test&1=1', $this->config->site_url(array('test', '1'))); $this->config->set_item('base_url', $base_url); From a49727ae12e7cf0c71ee7e7d39cc8341623cd1c9 Mon Sep 17 00:00:00 2001 From: Michael Dennis Date: Mon, 29 Aug 2011 10:32:11 -0700 Subject: [PATCH 0046/5397] Added documentation to the change log for the Image_lib clear() function fix --- user_guide/changelog.html | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide/changelog.html b/user_guide/changelog.html index 978b710beb3..2932f520be7 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -118,6 +118,7 @@

    Bug fixes for 2.1.0

  • Fixed a bug (#8) - load_class() now looks for core classes in APPPATH first, allowing them to be replaced.
  • Fixed a bug (#24) - ODBC database driver called incorrect parent in __construct().
  • Fixed a bug (#85) - OCI8 (Oracle) database escape_str() function did not escape correct.
  • +
  • Fixed bugs (#157 and #174) - the Image_lib clear() function now resets all variables to their default values.
  • Version 2.0.3

    From 319cf4d4d9897a929d6d58ad1a29bcc4a85a0b42 Mon Sep 17 00:00:00 2001 From: Michael Dennis Date: Mon, 29 Aug 2011 12:06:59 -0700 Subject: [PATCH 0047/5397] Added reactor icon to change log for Image_lib clear() function fix --- user_guide/changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide/changelog.html b/user_guide/changelog.html index 2932f520be7..77d29e86970 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -118,7 +118,7 @@

    Bug fixes for 2.1.0

  • Fixed a bug (#8) - load_class() now looks for core classes in APPPATH first, allowing them to be replaced.
  • Fixed a bug (#24) - ODBC database driver called incorrect parent in __construct().
  • Fixed a bug (#85) - OCI8 (Oracle) database escape_str() function did not escape correct.
  • -
  • Fixed bugs (#157 and #174) - the Image_lib clear() function now resets all variables to their default values.
  • +
  • Fixed bugs (#157 and #174) - the Image_lib clear() function now resets all variables to their default values.
  • Version 2.0.3

    From c4e266b87f39d521ff1002fefa9df809c6b9bd61 Mon Sep 17 00:00:00 2001 From: Darren Hill Date: Tue, 30 Aug 2011 15:40:27 -0400 Subject: [PATCH 0048/5397] Added Session driver with native PHP sessions and original-flavor CI cookie sessions --- system/core/Loader.php | 11 +- system/libraries/Driver.php | 42 +- system/libraries/Session.php | 776 ------------------ system/libraries/Session/Session.php | 601 ++++++++++++++ .../Session/drivers/Session_cookie.php | 583 +++++++++++++ .../Session/drivers/Session_native.php | 190 +++++ 6 files changed, 1414 insertions(+), 789 deletions(-) delete mode 100644 system/libraries/Session.php create mode 100755 system/libraries/Session/Session.php create mode 100755 system/libraries/Session/drivers/Session_cookie.php create mode 100755 system/libraries/Session/drivers/Session_native.php diff --git a/system/core/Loader.php b/system/core/Loader.php index de0fc06d2a9..51e6b82ca4d 100755 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -1174,6 +1174,15 @@ protected function _ci_autoloader() } } + // Autoload drivers + if (isset($autoload['drivers'])) + { + foreach ($autoload['drivers'] as $item) + { + $this->driver($item); + } + } + // Autoload models if (isset($autoload['model'])) { @@ -1240,4 +1249,4 @@ protected function _ci_prep_filename($filename, $extension) } /* End of file Loader.php */ -/* Location: ./system/core/Loader.php */ \ No newline at end of file +/* Location: ./system/core/Loader.php */ diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index 9881c1eecf3..e958fc67fbd 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -30,11 +30,32 @@ class CI_Driver_Library { protected $valid_drivers = array(); - protected static $lib_name; - - // The first time a child is used it won't exist, so we instantiate it - // subsequents calls will go straight to the proper child. - function __get($child) + protected $lib_name; + + /** + * Get magic method + * + * The first time a child is used it won't exist, so we instantiate it + * subsequents calls will go straight to the proper child. + * + * @param string Child class name + * @return object Child class + */ + public function __get($child) + { + // Try to load the driver + return load_driver($child); + } + + /** + * Load driver + * + * Separate load_driver call to support explicit driver load by library or user + * + * @param string Child class name + * @return object Child class + */ + public function load_driver($child) { if ( ! isset($this->lib_name)) { @@ -64,7 +85,7 @@ function __get($child) if (file_exists($filepath)) { include_once $filepath; - break; + break 2; } } } @@ -84,12 +105,9 @@ function __get($child) } // The requested driver isn't valid! - log_message('error', "Invalid driver requested: ".$child_class); - show_error("Invalid driver requested: ".$child_class); + log_message('error', 'Invalid driver requested: '.$child_class); + show_error('Invalid driver requested: '.$child_class); } - - // -------------------------------------------------------------------- - } // END CI_Driver_Library CLASS @@ -226,4 +244,4 @@ public function __set($var, $val) // END CI_Driver CLASS /* End of file Driver.php */ -/* Location: ./system/libraries/Driver.php */ \ No newline at end of file +/* Location: ./system/libraries/Driver.php */ diff --git a/system/libraries/Session.php b/system/libraries/Session.php deleted file mode 100644 index 2c8a801638b..00000000000 --- a/system/libraries/Session.php +++ /dev/null @@ -1,776 +0,0 @@ -CI =& get_instance(); - - // Set all the session preferences, which can either be set - // manually via the $params array above or via the config file - foreach (array('sess_encrypt_cookie', 'sess_use_database', 'sess_table_name', 'sess_expiration', 'sess_expire_on_close', 'sess_match_ip', 'sess_match_useragent', 'sess_cookie_name', 'cookie_path', 'cookie_domain', 'cookie_secure', 'sess_time_to_update', 'time_reference', 'cookie_prefix', 'encryption_key') as $key) - { - $this->$key = (isset($params[$key])) ? $params[$key] : $this->CI->config->item($key); - } - - if ($this->encryption_key == '') - { - show_error('In order to use the Session class you are required to set an encryption key in your config file.'); - } - - // Load the string helper so we can use the strip_slashes() function - $this->CI->load->helper('string'); - - // Do we need encryption? If so, load the encryption class - if ($this->sess_encrypt_cookie == TRUE) - { - $this->CI->load->library('encrypt'); - } - - // Are we using a database? If so, load it - if ($this->sess_use_database === TRUE AND $this->sess_table_name != '') - { - $this->CI->load->database(); - } - - // Set the "now" time. Can either be GMT or server time, based on the - // config prefs. We use this to set the "last activity" time - $this->now = $this->_get_time(); - - // Set the session length. If the session expiration is - // set to zero we'll set the expiration two years from now. - if ($this->sess_expiration == 0) - { - $this->sess_expiration = (60*60*24*365*2); - } - - // Set the cookie name - $this->sess_cookie_name = $this->cookie_prefix.$this->sess_cookie_name; - - // Run the Session routine. If a session doesn't exist we'll - // create a new one. If it does, we'll update it. - if ( ! $this->sess_read()) - { - $this->sess_create(); - } - else - { - $this->sess_update(); - } - - // Delete 'old' flashdata (from last request) - $this->_flashdata_sweep(); - - // Mark all new flashdata as old (data will be deleted before next request) - $this->_flashdata_mark(); - - // Delete expired sessions if necessary - $this->_sess_gc(); - - log_message('debug', "Session routines successfully run"); - } - - // -------------------------------------------------------------------- - - /** - * Fetch the current session data if it exists - * - * @access public - * @return bool - */ - function sess_read() - { - // Fetch the cookie - $session = $this->CI->input->cookie($this->sess_cookie_name); - - // No cookie? Goodbye cruel world!... - if ($session === FALSE) - { - log_message('debug', 'A session cookie was not found.'); - return FALSE; - } - - // Decrypt the cookie data - if ($this->sess_encrypt_cookie == TRUE) - { - $session = $this->CI->encrypt->decode($session); - } - else - { - // encryption was not used, so we need to check the md5 hash - $hash = substr($session, strlen($session)-32); // get last 32 chars - $session = substr($session, 0, strlen($session)-32); - - // Does the md5 hash match? This is to prevent manipulation of session data in userspace - if ($hash !== md5($session.$this->encryption_key)) - { - log_message('error', 'The session cookie data did not match what was expected. This could be a possible hacking attempt.'); - $this->sess_destroy(); - return FALSE; - } - } - - // Unserialize the session array - $session = $this->_unserialize($session); - - // Is the session data we unserialized an array with the correct format? - if ( ! is_array($session) OR ! isset($session['session_id']) OR ! isset($session['ip_address']) OR ! isset($session['user_agent']) OR ! isset($session['last_activity'])) - { - $this->sess_destroy(); - return FALSE; - } - - // Is the session current? - if (($session['last_activity'] + $this->sess_expiration) < $this->now) - { - $this->sess_destroy(); - return FALSE; - } - - // Does the IP Match? - if ($this->sess_match_ip == TRUE AND $session['ip_address'] != $this->CI->input->ip_address()) - { - $this->sess_destroy(); - return FALSE; - } - - // Does the User Agent Match? - if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 120))) - { - $this->sess_destroy(); - return FALSE; - } - - // Is there a corresponding session in the DB? - if ($this->sess_use_database === TRUE) - { - $this->CI->db->where('session_id', $session['session_id']); - - if ($this->sess_match_ip == TRUE) - { - $this->CI->db->where('ip_address', $session['ip_address']); - } - - if ($this->sess_match_useragent == TRUE) - { - $this->CI->db->where('user_agent', $session['user_agent']); - } - - $query = $this->CI->db->get($this->sess_table_name); - - // No result? Kill it! - if ($query->num_rows() == 0) - { - $this->sess_destroy(); - return FALSE; - } - - // Is there custom data? If so, add it to the main session array - $row = $query->row(); - if (isset($row->user_data) AND $row->user_data != '') - { - $custom_data = $this->_unserialize($row->user_data); - - if (is_array($custom_data)) - { - foreach ($custom_data as $key => $val) - { - $session[$key] = $val; - } - } - } - } - - // Session is valid! - $this->userdata = $session; - unset($session); - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Write the session data - * - * @access public - * @return void - */ - function sess_write() - { - // Are we saving custom data to the DB? If not, all we do is update the cookie - if ($this->sess_use_database === FALSE) - { - $this->_set_cookie(); - return; - } - - // set the custom userdata, the session data we will set in a second - $custom_userdata = $this->userdata; - $cookie_userdata = array(); - - // Before continuing, we need to determine if there is any custom data to deal with. - // Let's determine this by removing the default indexes to see if there's anything left in the array - // and set the session data while we're at it - foreach (array('session_id','ip_address','user_agent','last_activity') as $val) - { - unset($custom_userdata[$val]); - $cookie_userdata[$val] = $this->userdata[$val]; - } - - // Did we find any custom data? If not, we turn the empty array into a string - // since there's no reason to serialize and store an empty array in the DB - if (count($custom_userdata) === 0) - { - $custom_userdata = ''; - } - else - { - // Serialize the custom data array so we can store it - $custom_userdata = $this->_serialize($custom_userdata); - } - - // Run the update query - $this->CI->db->where('session_id', $this->userdata['session_id']); - $this->CI->db->update($this->sess_table_name, array('last_activity' => $this->userdata['last_activity'], 'user_data' => $custom_userdata)); - - // Write the cookie. Notice that we manually pass the cookie data array to the - // _set_cookie() function. Normally that function will store $this->userdata, but - // in this case that array contains custom data, which we do not want in the cookie. - $this->_set_cookie($cookie_userdata); - } - - // -------------------------------------------------------------------- - - /** - * Create a new session - * - * @access public - * @return void - */ - function sess_create() - { - $sessid = ''; - while (strlen($sessid) < 32) - { - $sessid .= mt_rand(0, mt_getrandmax()); - } - - // To make the session ID even more secure we'll combine it with the user's IP - $sessid .= $this->CI->input->ip_address(); - - $this->userdata = array( - 'session_id' => md5(uniqid($sessid, TRUE)), - 'ip_address' => $this->CI->input->ip_address(), - 'user_agent' => substr($this->CI->input->user_agent(), 0, 120), - 'last_activity' => $this->now - ); - - - // Save the data to the DB if needed - if ($this->sess_use_database === TRUE) - { - $this->CI->db->query($this->CI->db->insert_string($this->sess_table_name, $this->userdata)); - } - - // Write the cookie - $this->_set_cookie(); - } - - // -------------------------------------------------------------------- - - /** - * Update an existing session - * - * @access public - * @return void - */ - function sess_update() - { - // We only update the session every five minutes by default - if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now) - { - return; - } - - // Save the old session id so we know which record to - // update in the database if we need it - $old_sessid = $this->userdata['session_id']; - $new_sessid = ''; - while (strlen($new_sessid) < 32) - { - $new_sessid .= mt_rand(0, mt_getrandmax()); - } - - // To make the session ID even more secure we'll combine it with the user's IP - $new_sessid .= $this->CI->input->ip_address(); - - // Turn it into a hash - $new_sessid = md5(uniqid($new_sessid, TRUE)); - - // Update the session data in the session data array - $this->userdata['session_id'] = $new_sessid; - $this->userdata['last_activity'] = $this->now; - - // _set_cookie() will handle this for us if we aren't using database sessions - // by pushing all userdata to the cookie. - $cookie_data = NULL; - - // Update the session ID and last_activity field in the DB if needed - if ($this->sess_use_database === TRUE) - { - // set cookie explicitly to only have our session data - $cookie_data = array(); - foreach (array('session_id','ip_address','user_agent','last_activity') as $val) - { - $cookie_data[$val] = $this->userdata[$val]; - } - - $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid))); - } - - // Write the cookie - $this->_set_cookie($cookie_data); - } - - // -------------------------------------------------------------------- - - /** - * Destroy the current session - * - * @access public - * @return void - */ - function sess_destroy() - { - // Kill the session DB row - if ($this->sess_use_database === TRUE AND isset($this->userdata['session_id'])) - { - $this->CI->db->where('session_id', $this->userdata['session_id']); - $this->CI->db->delete($this->sess_table_name); - } - - // Kill the cookie - setcookie( - $this->sess_cookie_name, - addslashes(serialize(array())), - ($this->now - 31500000), - $this->cookie_path, - $this->cookie_domain, - 0 - ); - } - - // -------------------------------------------------------------------- - - /** - * Fetch a specific item from the session array - * - * @access public - * @param string - * @return string - */ - function userdata($item) - { - return ( ! isset($this->userdata[$item])) ? FALSE : $this->userdata[$item]; - } - - // -------------------------------------------------------------------- - - /** - * Fetch all session data - * - * @access public - * @return array - */ - function all_userdata() - { - return $this->userdata; - } - - // -------------------------------------------------------------------- - - /** - * Add or change data in the "userdata" array - * - * @access public - * @param mixed - * @param string - * @return void - */ - function set_userdata($newdata = array(), $newval = '') - { - if (is_string($newdata)) - { - $newdata = array($newdata => $newval); - } - - if (count($newdata) > 0) - { - foreach ($newdata as $key => $val) - { - $this->userdata[$key] = $val; - } - } - - $this->sess_write(); - } - - // -------------------------------------------------------------------- - - /** - * Delete a session variable from the "userdata" array - * - * @access array - * @return void - */ - function unset_userdata($newdata = array()) - { - if (is_string($newdata)) - { - $newdata = array($newdata => ''); - } - - if (count($newdata) > 0) - { - foreach ($newdata as $key => $val) - { - unset($this->userdata[$key]); - } - } - - $this->sess_write(); - } - - // ------------------------------------------------------------------------ - - /** - * Add or change flashdata, only available - * until the next request - * - * @access public - * @param mixed - * @param string - * @return void - */ - function set_flashdata($newdata = array(), $newval = '') - { - if (is_string($newdata)) - { - $newdata = array($newdata => $newval); - } - - if (count($newdata) > 0) - { - foreach ($newdata as $key => $val) - { - $flashdata_key = $this->flashdata_key.':new:'.$key; - $this->set_userdata($flashdata_key, $val); - } - } - } - - // ------------------------------------------------------------------------ - - /** - * Keeps existing flashdata available to next request. - * - * @access public - * @param string - * @return void - */ - function keep_flashdata($key) - { - // 'old' flashdata gets removed. Here we mark all - // flashdata as 'new' to preserve it from _flashdata_sweep() - // Note the function will return FALSE if the $key - // provided cannot be found - $old_flashdata_key = $this->flashdata_key.':old:'.$key; - $value = $this->userdata($old_flashdata_key); - - $new_flashdata_key = $this->flashdata_key.':new:'.$key; - $this->set_userdata($new_flashdata_key, $value); - } - - // ------------------------------------------------------------------------ - - /** - * Fetch a specific flashdata item from the session array - * - * @access public - * @param string - * @return string - */ - function flashdata($key) - { - $flashdata_key = $this->flashdata_key.':old:'.$key; - return $this->userdata($flashdata_key); - } - - // ------------------------------------------------------------------------ - - /** - * Identifies flashdata as 'old' for removal - * when _flashdata_sweep() runs. - * - * @access private - * @return void - */ - function _flashdata_mark() - { - $userdata = $this->all_userdata(); - foreach ($userdata as $name => $value) - { - $parts = explode(':new:', $name); - if (is_array($parts) && count($parts) === 2) - { - $new_name = $this->flashdata_key.':old:'.$parts[1]; - $this->set_userdata($new_name, $value); - $this->unset_userdata($name); - } - } - } - - // ------------------------------------------------------------------------ - - /** - * Removes all flashdata marked as 'old' - * - * @access private - * @return void - */ - - function _flashdata_sweep() - { - $userdata = $this->all_userdata(); - foreach ($userdata as $key => $value) - { - if (strpos($key, ':old:')) - { - $this->unset_userdata($key); - } - } - - } - - // -------------------------------------------------------------------- - - /** - * Get the "now" time - * - * @access private - * @return string - */ - function _get_time() - { - if (strtolower($this->time_reference) == 'gmt') - { - $now = time(); - $time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now)); - } - else - { - $time = time(); - } - - return $time; - } - - // -------------------------------------------------------------------- - - /** - * Write the session cookie - * - * @access public - * @return void - */ - function _set_cookie($cookie_data = NULL) - { - if (is_null($cookie_data)) - { - $cookie_data = $this->userdata; - } - - // Serialize the userdata for the cookie - $cookie_data = $this->_serialize($cookie_data); - - if ($this->sess_encrypt_cookie == TRUE) - { - $cookie_data = $this->CI->encrypt->encode($cookie_data); - } - else - { - // if encryption is not used, we provide an md5 hash to prevent userside tampering - $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key); - } - - $expire = ($this->sess_expire_on_close === TRUE) ? 0 : $this->sess_expiration + time(); - - // Set the cookie - setcookie( - $this->sess_cookie_name, - $cookie_data, - $expire, - $this->cookie_path, - $this->cookie_domain, - $this->cookie_secure - ); - } - - // -------------------------------------------------------------------- - - /** - * Serialize an array - * - * This function first converts any slashes found in the array to a temporary - * marker, so when it gets unserialized the slashes will be preserved - * - * @access private - * @param array - * @return string - */ - function _serialize($data) - { - if (is_array($data)) - { - foreach ($data as $key => $val) - { - if (is_string($val)) - { - $data[$key] = str_replace('\\', '{{slash}}', $val); - } - } - } - else - { - if (is_string($data)) - { - $data = str_replace('\\', '{{slash}}', $data); - } - } - - return serialize($data); - } - - // -------------------------------------------------------------------- - - /** - * Unserialize - * - * This function unserializes a data string, then converts any - * temporary slash markers back to actual slashes - * - * @access private - * @param array - * @return string - */ - function _unserialize($data) - { - $data = @unserialize(strip_slashes($data)); - - if (is_array($data)) - { - foreach ($data as $key => $val) - { - if (is_string($val)) - { - $data[$key] = str_replace('{{slash}}', '\\', $val); - } - } - - return $data; - } - - return (is_string($data)) ? str_replace('{{slash}}', '\\', $data) : $data; - } - - // -------------------------------------------------------------------- - - /** - * Garbage collection - * - * This deletes expired session rows from database - * if the probability percentage is met - * - * @access public - * @return void - */ - function _sess_gc() - { - if ($this->sess_use_database != TRUE) - { - return; - } - - srand(time()); - if ((rand() % 100) < $this->gc_probability) - { - $expire = $this->now - $this->sess_expiration; - - $this->CI->db->where("last_activity < {$expire}"); - $this->CI->db->delete($this->sess_table_name); - - log_message('debug', 'Session garbage collection performed.'); - } - } - - -} -// END Session Class - -/* End of file Session.php */ -/* Location: ./system/libraries/Session.php */ \ No newline at end of file diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php new file mode 100755 index 00000000000..7aaf706a1c2 --- /dev/null +++ b/system/libraries/Session/Session.php @@ -0,0 +1,601 @@ +session or $this->session). + * In keeping with the CI_Driver methodology, multiple drivers may be loaded, although this might be a bit confusing. + * The Session library class keeps track of the most recently loaded driver as "current" to call for driver methods. + * Ideally, one driver is loaded and all calls go directly through the main library interface. However, any methods + * called through the specific driver will switch the "current" driver to itself before invoking the library method + * (which will then call back into the driver for low-level operations). So, alternation between two drivers can be + * achieved by specifying which driver to use for each call (e.g.: $this->session->native->set_userdata('foo', 'bar'); + * $this->session->cookie->userdata('foo'); $this->session->native->unset_userdata('foo');). Notice in the previous + * example that the _native_ userdata value 'foo' would be set to 'bar', which would NOT be returned by the call for + * the _cookie_ userdata 'foo', nor would the _cookie_ value be unset by the call to unset the _native_ 'foo' value. + * + * @package CodeIgniter + * @subpackage Libraries + * @category Sessions + * @author Darren Hill (DChill) + * @link http://codeigniter.com/user_guide/libraries/sessions.html + */ +final class Session extends CI_Driver_Library { + public $params = array(); + private $current = null; + private $userdata = array(); + + const FLASHDATA_KEY = 'flash'; + const FLASHDATA_NEW = ':new:'; + const FLASHDATA_OLD = ':old:'; + const FLASHDATA_EXP = ':exp:'; + const EXPIRATION_KEY = '__expirations'; + const TEMP_EXP_DEF = 300; + + /** + * Session constructor + * + * The constructor loads the configured driver ('sess_driver' in config.php or as a parameter), running + * routines in its constructor, and manages flashdata aging. + * + * @param array Configuration parameters + */ + public function __construct(array $params = array()) + { + log_message('debug', 'Session Class Initialized'); + + // Get valid drivers list + $CI =& get_instance(); + $this->valid_drivers = array('Session_Native', 'Session_Cookie'); + $key = 'sess_valid_drivers'; + $drivers = (isset($params[$key])) ? $params[$key] : $CI->config->item($key); + if ($drivers) + { + if (!is_array($drivers)) $drivers = array($drivers); + + // Add driver names to valid list + foreach ($drivers as $driver) + { + if (!in_array(strtolower($driver), array_map('strtolower', $this->valid_drivers))) + { + $this->valid_drivers[] = $driver; + } + } + } + + // Get driver to load + $key = 'sess_driver'; + $driver = (isset($params[$key])) ? $params[$key] : $CI->config->item($key); + if (!$driver) $driver = 'Native'; + if (!in_array('session_'.strtolower($driver), array_map('strtolower', $this->valid_drivers))) + { + $this->valid_drivers[] = 'Session_'.$driver; + } + + // Save a copy of parameters in case drivers need access + $this->params = $params; + + // Load driver and get array reference + $this->load_driver($driver); + $this->userdata =& $this->current->get_userdata(); + + // Delete 'old' flashdata (from last request) + $this->_flashdata_sweep(); + + // Mark all new flashdata as old (data will be deleted before next request) + $this->_flashdata_mark(); + + // Delete expired tempdata + $this->_tempdata_sweep(); + + log_message('debug', 'Session routines successfully run'); + } + + /** + * Loads session storage driver + * + * @param string Driver classname + * @return object Loaded driver object + */ + public function load_driver($driver) + { + // Save reference to most recently loaded driver as library default + $this->current = parent::load_driver($driver); + return $this->current; + } + + /** + * Select default session storage driver + * + * @param string Driver classname + * @return void + */ + public function select_driver($driver) + { + // Validate driver name + $lowername = strtolower($driver); + if (in_array($lowername, array_map('strtolower', $this->valid_drivers))) + { + // See if regular or lowercase variant is loaded + if (class_exists($driver)) + { + $this->current = $this->$driver; + } + else if (class_exists($lowername)) + { + $this->current = $this->$lowername; + } + else + { + $this->load_driver($driver); + } + } + } + + /** + * Destroy the current session + * + * @return void + */ + public function sess_destroy() + { + // Just call destroy on driver + $this->current->sess_destroy(); + } + + /** + * Regenerate the current session + * + * @param boolean Destroy session data flag (default: false) + * @return void + */ + public function sess_regenerate($destroy = false) + { + // Just call regenerate on driver + $this->current->sess_regenerate($destroy); + } + + /** + * Fetch a specific item from the session array + * + * @param string Item key + * @return string Item value + */ + public function userdata($item) + { + // Return value or FALSE if not found + return (!isset($this->userdata[$item])) ? FALSE : $this->userdata[$item]; + } + + /** + * Fetch all session data + * + * @return array User data array + */ + public function all_userdata() + { + // Return entire array + return (!isset($this->userdata)) ? FALSE : $this->userdata; + } + + /** + * Add or change data in the "userdata" array + * + * @param mixed Item name or array of items + * @param string Item value or empty string + * @return void + */ + public function set_userdata($newdata = array(), $newval = '') + { + // Wrap params as array if singular + if (is_string($newdata)) + { + $newdata = array($newdata => $newval); + } + + // Set each name/value pair + if (count($newdata) > 0) + { + foreach ($newdata as $key => $val) + { + $this->userdata[$key] = $val; + } + } + + // Tell driver data changed + $this->current->sess_save(); + } + + /** + * Delete a session variable from the "userdata" array + * + * @param mixed Item name or array of item names + * @return void + */ + public function unset_userdata($newdata = array()) + { + // Wrap single name as array + if (is_string($newdata)) + { + $newdata = array($newdata => ''); + } + + // Unset each item name + if (count($newdata) > 0) + { + foreach ($newdata as $key => $val) + { + unset($this->userdata[$key]); + } + } + + // Tell driver data changed + $this->current->sess_save(); + } + + /** + * Determine if an item exists + * + * @param string Item name + * @return boolean + */ + public function has_userdata($item) + { + // Check for item name + return isset($this->userdata[$item]); + } + + /** + * Add or change flashdata, only available until the next request + * + * @param mixed Item name or array of items + * @param string Item value or empty string + * @return void + */ + public function set_flashdata($newdata = array(), $newval = '') + { + // Wrap item as array if singular + if (is_string($newdata)) + { + $newdata = array($newdata => $newval); + } + + // Prepend each key name and set value + if (count($newdata) > 0) + { + foreach ($newdata as $key => $val) + { + $flashdata_key = self::FLASHDATA_KEY.self::FLASHDATA_NEW.$key; + $this->set_userdata($flashdata_key, $val); + } + } + } + + /** + * Keeps existing flashdata available to next request. + * + * @param string Item key + * @return void + */ + public function keep_flashdata($key) + { + // 'old' flashdata gets removed. Here we mark all + // flashdata as 'new' to preserve it from _flashdata_sweep() + $old_flashdata_key = self::FLASHDATA_KEY.self::FLASHDATA_OLD.$key; + $value = $this->userdata($old_flashdata_key); + + $new_flashdata_key = self::FLASHDATA_KEY.self::FLASHDATA_NEW.$key; + $this->set_userdata($new_flashdata_key, $value); + } + + /** + * Fetch a specific flashdata item from the session array + * + * @param string Item key + * @return string + */ + public function flashdata($key) + { + // Prepend key and retrieve value + $flashdata_key = self::FLASHDATA_KEY.self::FLASHDATA_OLD.$key; + return $this->userdata($flashdata_key); + } + + /** + * Add or change tempdata, only available + * until expiration + * + * @param mixed Item name or array of items + * @param string Item value or empty string + * @param int Item lifetime in seconds or 0 for default + * @return void + */ + public function set_tempdata($newdata = array(), $newval = '', $expire = 0) + { + // Set expiration time + $expire = time() + ($expire ? $expire : self::TEMP_EXP_DEF); + + // Wrap item as array if singular + if (is_string($newdata)) + { + $newdata = array($newdata => $newval); + } + + // Get or create expiration list + $expirations = $this->userdata(self::EXPIRATION_KEY); + if (!$expirations) + { + $expirations = array(); + } + + // Prepend each key name and set value + if (count($newdata) > 0) + { + foreach ($newdata as $key => $val) + { + $tempdata_key = self::FLASHDATA_KEY.self::FLASHDATA_EXP.$key; + $expirations[$tempdata_key] = $expire; + $this->set_userdata($tempdata_key, $val); + } + } + + // Update expiration list + $this->set_userdata(self::EXPIRATION_KEY, $expirations); + } + + /** + * Delete a temporary session variable from the "userdata" array + * + * @param mixed Item name or array of item names + * @return void + */ + public function unset_tempdata($newdata = array()) + { + // Get expirations list + $expirations = $this->userdata(self::EXPIRATION_KEY); + if (!$expirations || !count($expirations)) + { + // Nothing to do + return; + } + + // Wrap single name as array + if (is_string($newdata)) + { + $newdata = array($newdata => ''); + } + + // Prepend each item name and unset + if (count($newdata) > 0) + { + foreach ($newdata as $key => $val) + { + $tempdata_key = self::FLASHDATA_KEY.self::FLASHDATA_EXP.$key; + unset($expirations[$tempdata_key]); + $this->unset_userdata($tempdata_key); + } + } + + // Update expiration list + $this->set_userdata(self::EXPIRATION_KEY, $expirations); + } + + /** + * Fetch a specific tempdata item from the session array + * + * @param string Item key + * @return string + */ + public function tempdata($key) + { + // Prepend key and return value + $tempdata_key = self::FLASHDATA_KEY.self::FLASHDATA_EXP.$key; + return $this->userdata($tempdata_key); + } + + /** + * Identifies flashdata as 'old' for removal + * when _flashdata_sweep() runs. + * + * @access private + * @return void + */ + private function _flashdata_mark() + { + $userdata = $this->all_userdata(); + foreach ($userdata as $name => $value) + { + $parts = explode(self::FLASHDATA_NEW, $name); + if (is_array($parts) && count($parts) === 2) + { + $new_name = self::FLASHDATA_KEY.self::FLASHDATA_OLD.$parts[1]; + $this->set_userdata($new_name, $value); + $this->unset_userdata($name); + } + } + } + + /** + * Removes all flashdata marked as 'old' + * + * @access private + * @return void + */ + private function _flashdata_sweep() + { + $userdata = $this->all_userdata(); + foreach ($userdata as $key => $value) + { + if (strpos($key, self::FLASHDATA_OLD)) + { + $this->unset_userdata($key); + } + } + } + + /** + * Removes all expired tempdata + * + * @access private + * @return void + */ + private function _tempdata_sweep() + { + // Get expirations list + $expirations = $this->userdata(self::EXPIRATION_KEY); + if (!$expirations || !count($expirations)) + { + // Nothing to do + return; + } + + // Unset expired elements + $now = time(); + $userdata = $this->all_userdata(); + foreach ($userdata as $key => $value) + { + if (strpos($key, self::FLASHDATA_EXP) && $expirations[$key] < $now) + { + unset($expirations[$key]); + $this->unset_userdata($key); + } + } + + // Update expiration list + $this->set_userdata(self::EXPIRATION_KEY, $expirations); + } +} +// END Session Class + + +/** + * SessionDriver Class + * + * Extend this class to make a new Session driver. + * A Session driver basically manages an array of name/value pairs with some sort of storage mechanism. + * To make a new driver, derive from (extend) SessionDriver. Overload the initialize method and read or create + * session data. Then implement a save handler to write changed data to storage (sess_save), a destroy handler + * to remove deleted data (sess_destroy), and an access handler to expose the data (get_userdata). + * Put your driver in the libraries/Session/drivers folder anywhere in the loader paths. This includes the application + * directory, the system directory, or any path you add with $CI->load->add_package_path(). + * Your driver must be named Session_, where is capitalized, and your filename must be Session_.EXT, + * preferably also capitalized. (e.g.: Session_Foo in libraries/Session/drivers/Session_Foo.php) + * Then specify the driver by setting 'sess_driver' in your config file or as a parameter when loading the Session + * object. (e.g.: $config['sess_driver'] = 'foo'; OR $CI->load->driver('session', array('sess_driver' => 'foo')); ) + * Already provided are the Native driver, which manages the native PHP $_SESSION array, and + * the Cookie driver, which manages the data in a browser cookie, with optional extra storage in a database table. + * + * @package CodeIgniter + * @subpackage Libraries + * @category Sessions + * @author Darren Hill (DChill) + */ +abstract class SessionDriver extends CI_Driver { + /** + * Decorate + * + * Decorates the child with the parent driver lib's methods and properties + * + * @param object Parent library object + * @return void + */ + public function decorate($parent) + { + // Call base class decorate first + parent::decorate($parent); + + // Call initialize method now that driver has access to $this->parent + $this->initialize(); + } + + /** + * __call magic method + * + * Handles access to the parent driver library's methods + * + * @param string Library method name + * @param array Method arguments (default: none) + * @return mixed + */ + public function __call($method, $args = array()) + { + // Make sure the parent library uses this driver + $this->parent->select_driver(get_class($this)); + return parent::__call($method, $args); + } + + /** + * Initialize driver + * + * @return void + */ + protected function initialize() + { + // Overload this method to implement initialization + } + + /** + * Save the session data + * + * Data in the array has changed - perform any storage synchronization necessary + * The child class MUST implement this abstract method! + * + * @return void + */ + abstract public function sess_save(); + + /** + * Destroy the current session + * + * Clean up storage for this session - it has been terminated + * The child class MUST implement this abstract method! + * + * @return void + */ + abstract public function sess_destroy(); + + /** + * Regenerate the current session + * + * Regenerate the session id + * The child class MUST implement this abstract method! + * + * @param boolean Destroy session data flag (default: false) + * @return void + */ + abstract public function sess_regenerate($destroy = false); + + /** + * Get a reference to user data array + * + * Give array access to the main Session object + * The child class MUST implement this abstract method! + * + * @return array Reference to userdata + */ + abstract public function &get_userdata(); +} +// END SessionDriver Class + + +/* End of file Session.php */ +/* Location: ./system/libraries/Session/Session.php */ +?> diff --git a/system/libraries/Session/drivers/Session_cookie.php b/system/libraries/Session/drivers/Session_cookie.php new file mode 100755 index 00000000000..0982b1e01c6 --- /dev/null +++ b/system/libraries/Session/drivers/Session_cookie.php @@ -0,0 +1,583 @@ +CI =& get_instance(); + + // Set all the session preferences, which can either be set + // manually via the $params array above or via the config file + foreach (array('sess_encrypt_cookie', 'sess_use_database', 'sess_table_name', 'sess_expiration', + 'sess_expire_on_close', 'sess_match_ip', 'sess_match_useragent', 'sess_cookie_name', 'cookie_path', + 'cookie_domain', 'sess_time_to_update', 'time_reference', 'cookie_prefix', 'encryption_key') as $key) + { + $this->$key = (isset($this->parent->params[$key])) ? $this->parent->params[$key] : $this->CI->config->item($key); + } + + if ($this->encryption_key == '') + { + show_error('In order to use the Cookie Session driver you are required to set an encryption key '. + 'in your config file.'); + } + + // Load the string helper so we can use the strip_slashes() function + $this->CI->load->helper('string'); + + // Do we need encryption? If so, load the encryption class + if ($this->sess_encrypt_cookie == TRUE) + { + $this->CI->load->library('encrypt'); + } + + // Are we using a database? If so, load it + if ($this->sess_use_database === TRUE && $this->sess_table_name != '') + { + $this->CI->load->database(); + } + + // Set the "now" time. Can either be GMT or server time, based on the config prefs. + // We use this to set the "last activity" time + $this->now = $this->_get_time(); + + // Set the session length. If the session expiration is + // set to zero we'll set the expiration two years from now. + if ($this->sess_expiration == 0) + { + $this->sess_expiration = (60*60*24*365*2); + } + + // Set the cookie name + $this->sess_cookie_name = $this->cookie_prefix.$this->sess_cookie_name; + + // Run the Session routine. If a session doesn't exist we'll + // create a new one. If it does, we'll update it. + if ( ! $this->_sess_read()) + { + $this->_sess_create(); + } + else + { + $this->_sess_update(); + } + + // Delete expired sessions if necessary + $this->_sess_gc(); + } + + /** + * Write the session data + * + * @return void + */ + public function sess_save() + { + // Are we saving custom data to the DB? If not, all we do is update the cookie + if ($this->sess_use_database === FALSE) + { + $this->_set_cookie(); + return; + } + + // set the custom userdata, the session data we will set in a second + $custom_userdata = $this->all_userdata(); + $cookie_userdata = array(); + + // Before continuing, we need to determine if there is any custom data to deal with. + // Let's determine this by removing the default indexes to see if there's anything left in the array + // and set the session data while we're at it + foreach (array('session_id','ip_address','user_agent','last_activity') as $val) + { + unset($custom_userdata[$val]); + $cookie_userdata[$val] = $this->userdata($val); + } + + // Did we find any custom data? If not, we turn the empty array into a string + // since there's no reason to serialize and store an empty array in the DB + if (count($custom_userdata) === 0) + { + $custom_userdata = ''; + } + else + { + // Serialize the custom data array so we can store it + $custom_userdata = $this->_serialize($custom_userdata); + } + + // Run the update query + $this->CI->db->where('session_id', $this->userdata('session_id')); + $this->CI->db->update($this->sess_table_name, + array('last_activity' => $this->userdata('last_activity'), 'user_data' => $custom_userdata)); + + // Write the cookie. Notice that we manually pass the cookie data array to the + // _set_cookie() function. Normally that function will store $this->userdata, but + // in this case that array contains custom data, which we do not want in the cookie. + $this->_set_cookie($cookie_userdata); + } + + /** + * Destroy the current session + * + * @return void + */ + public function sess_destroy() + { + // Kill the session DB row + if ($this->sess_use_database === TRUE && $this->has_userdata('session_id')) + { + $this->CI->db->where('session_id', $this->userdata['session_id']); + $this->CI->db->delete($this->sess_table_name); + } + + // Kill the cookie + setcookie($this->sess_cookie_name, addslashes(serialize(array())), ($this->now - 31500000), + $this->cookie_path, $this->cookie_domain, 0); + } + + /** + * Regenerate the current session + * + * Regenerate the session id + * + * @param boolean Destroy session data flag (default: false) + * @return void + */ + public function sess_regenerate($destroy = false) + { + // Check destroy flag + if ($destroy) + { + // Destroy old session and create new one + $this->sess_destroy(); + $this->_sess_create(); + } + else + { + // Just force an update to recreate the id + $this->_sess_update(true); + } + } + + /** + * Get a reference to user data array + * + * @return array - Reference to userdata + */ + public function &get_userdata() + { + // Return reference to array + return $this->userdata; + } + + /** + * Fetch the current session data if it exists + * + * @access private + * @return bool + */ + private function _sess_read() + { + // Fetch the cookie + $session = $this->CI->input->cookie($this->sess_cookie_name); + + // No cookie? Goodbye cruel world!... + if ($session === FALSE) + { + log_message('debug', 'A session cookie was not found.'); + return FALSE; + } + + // Decrypt the cookie data + if ($this->sess_encrypt_cookie == TRUE) + { + $session = $this->CI->encrypt->decode($session); + } + else + { + // encryption was not used, so we need to check the md5 hash + $hash = substr($session, strlen($session)-32); // get last 32 chars + $session = substr($session, 0, strlen($session)-32); + + // Does the md5 hash match? This is to prevent manipulation of session data in userspace + if ($hash !== md5($session.$this->encryption_key)) + { + log_message('error', 'The session cookie data did not match what was expected. '. + 'This could be a possible hacking attempt.'); + $this->sess_destroy(); + return FALSE; + } + } + + // Unserialize the session array + $session = $this->_unserialize($session); + + // Is the session data we unserialized an array with the correct format? + if ( ! is_array($session) || ! isset($session['session_id']) || ! isset($session['ip_address']) || + ! isset($session['user_agent']) || ! isset($session['last_activity'])) + { + $this->sess_destroy(); + return FALSE; + } + + // Is the session current? + if (($session['last_activity'] + $this->sess_expiration) < $this->now()) + { + $this->sess_destroy(); + return FALSE; + } + + // Does the IP Match? + if ($this->sess_match_ip == TRUE && $session['ip_address'] != $this->CI->input->ip_address()) + { + $this->sess_destroy(); + return FALSE; + } + + // Does the User Agent Match? + if ($this->sess_match_useragent == TRUE && + trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 50))) + { + $this->sess_destroy(); + return FALSE; + } + + // Is there a corresponding session in the DB? + if ($this->sess_use_database === TRUE) + { + $this->CI->db->where('session_id', $session['session_id']); + + if ($this->sess_match_ip == TRUE) + { + $this->CI->db->where('ip_address', $session['ip_address']); + } + + if ($this->sess_match_useragent == TRUE) + { + $this->CI->db->where('user_agent', $session['user_agent']); + } + + $query = $this->CI->db->get($this->sess_table_name); + + // No result? Kill it! + if ($query->num_rows() == 0) + { + $this->sess_destroy(); + return FALSE; + } + + // Is there custom data? If so, add it to the main session array + $row = $query->row(); + if (isset($row->user_data) && $row->user_data != '') + { + $custom_data = $this->_unserialize($row->user_data); + + if (is_array($custom_data)) + { + foreach ($custom_data as $key => $val) + { + $session[$key] = $val; + } + } + } + } + + // Session is valid! + $this->userdata = $session; + unset($session); + + return TRUE; + } + + /** + * Create a new session + * + * @access private + * @return void + */ + private function _sess_create() + { + $sessid = ''; + while (strlen($sessid) < 32) + { + $sessid .= mt_rand(0, mt_getrandmax()); + } + + // To make the session ID even more secure we'll combine it with the user's IP + $sessid .= $this->CI->input->ip_address(); + + $this->set_userdata('session_id', md5(uniqid($sessid, TRUE))); + $this->set_userdata('ip_address', $this->CI->input->ip_address()); + $this->set_userdata('user_agent', substr($this->CI->input->user_agent(), 0, 50)); + $this->set_userdata('last_activity',$this->now()); + + + // Save the data to the DB if needed + if ($this->sess_use_database === TRUE) + { + $this->CI->db->query($this->CI->db->insert_string($this->sess_table_name, $this->all_userdata())); + } + + // Write the cookie + $this->_set_cookie(); + } + + /** + * Update an existing session + * + * @access private + * @param boolean Force update flag (default: false) + * @return void + */ + private function _sess_update($force = false) + { + // We only update the session every five minutes by default (unless forced) + if (!$force && ($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now()) + { + return; + } + + // Save the old session id so we know which record to + // update in the database if we need it + $old_sessid = $this->userdata['session_id']; + $new_sessid = ''; + while (strlen($new_sessid) < 32) + { + $new_sessid .= mt_rand(0, mt_getrandmax()); + } + + // To make the session ID even more secure we'll combine it with the user's IP + $new_sessid .= $this->CI->input->ip_address(); + + // Turn it into a hash + $new_sessid = md5(uniqid($new_sessid, TRUE)); + + // Update the session data in the session data array + $this->set_userdata('session_id', $new_sessid); + $this->set_userdata('last_activity', $this->now()); + + // _set_cookie() will handle this for us if we aren't using database sessions + // by pushing all userdata to the cookie. + $cookie_data = NULL; + + // Update the session ID and last_activity field in the DB if needed + if ($this->sess_use_database === TRUE) + { + // set cookie explicitly to only have our session data + $cookie_data = array(); + foreach (array('session_id','ip_address','user_agent','last_activity') as $val) + { + $cookie_data[$val] = $this->userdata[$val]; + } + + $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, + array('last_activity' => $this->now(), 'session_id' => $new_sessid), + array('session_id' => $old_sessid))); + } + + // Write the cookie + $this->_set_cookie($cookie_data); + } + + /** + * Get the "now" time + * + * @access private + * @return int + */ + private function _get_time() + { + if (strtolower($this->time_reference) == 'gmt') + { + $now = time(); + $time = mktime(gmdate('H', $now), gmdate('i', $now), gmdate('s', $now), gmdate('m', $now), + gmdate('d', $now), gmdate('Y', $now)); + } + else + { + $time = time(); + } + + return $time; + } + + /** + * Write the session cookie + * + * @access private + * @param array Cookie name/value pairs + * @return void + */ + private function _set_cookie(array $cookie_data = NULL) + { + if (is_null($cookie_data)) + { + $cookie_data = $this->all_userdata(); + } + + // Serialize the userdata for the cookie + $cookie_data = $this->_serialize($cookie_data); + + if ($this->sess_encrypt_cookie == TRUE) + { + $cookie_data = $this->CI->encrypt->encode($cookie_data); + } + else + { + // if encryption is not used, we provide an md5 hash to prevent userside tampering + $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key); + } + + $expire = ($this->sess_expire_on_close === TRUE) ? 0 : $this->sess_expiration + time(); + + // Set the cookie + setcookie($this->sess_cookie_name, $cookie_data, $expire, $this->cookie_path, $this->cookie_domain, 0); + } + + /** + * Serialize an array + * + * This function first converts any slashes found in the array to a temporary + * marker, so when it gets unserialized the slashes will be preserved + * + * @access private + * @param mixed Data to serialize + * @return string + */ + private function _serialize($data) + { + if (is_array($data)) + { + foreach ($data as $key => $val) + { + if (is_string($val)) + { + $data[$key] = str_replace('\\', '{{slash}}', $val); + } + } + } + else + { + if (is_string($data)) + { + $data = str_replace('\\', '{{slash}}', $data); + } + } + + return serialize($data); + } + + /** + * Unserialize + * + * This function unserializes a data string, then converts any + * temporary slash markers back to actual slashes + * + * @access private + * @param string Data to unserialize + * @return mixed + */ + private function _unserialize($data) + { + $data = @unserialize(strip_slashes($data)); + + if (is_array($data)) + { + foreach ($data as $key => $val) + { + if (is_string($val)) + { + $data[$key] = str_replace('{{slash}}', '\\', $val); + } + } + + return $data; + } + + return (is_string($data)) ? str_replace('{{slash}}', '\\', $data) : $data; + } + + /** + * Garbage collection + * + * This deletes expired session rows from database + * if the probability percentage is met + * + * @access private + * @return void + */ + private function _sess_gc() + { + if ($this->sess_use_database != TRUE) + { + return; + } + + srand(time()); + if ((rand() % 100) < self::gc_probability) + { + $expire = $this->now() - $this->sess_expiration; + + $this->CI->db->where('last_activity < '.$expire); + $this->CI->db->delete($this->sess_table_name); + + log_message('debug', 'Session garbage collection performed.'); + } + } +} +// END Session_Cookie Class + +/* End of file Session_cookie.php */ +/* Location: ./system/libraries/Session/Session.php */ +?> diff --git a/system/libraries/Session/drivers/Session_native.php b/system/libraries/Session/drivers/Session_native.php new file mode 100755 index 00000000000..df588175f51 --- /dev/null +++ b/system/libraries/Session/drivers/Session_native.php @@ -0,0 +1,190 @@ +parent->params[$key]) ? $this->parent->params[$key] : $CI->config->item($key); + } + + // Set session name, if specified + if ($config['sess_cookie_name']) + { + $name = $config['sess_cookie_name']; + if ($config['cookie_prefix']) + { + // Prepend cookie prefix + $name = $config['cookie_prefix'].$name; + } + session_name($name); + } + + // Set expiration, path, and domain + $expire = 7200; + $path = '/'; + $domain = ''; + if ($config['sess_expiration'] !== FALSE) + { + // Default to 2 years if expiration is "0" + $expire = ($config['sess_expiration'] == 0) ? (60*60*24*365*2) : $config['sess_expiration']; + } + if ($config['cookie_path']) + { + // Use specified path + $path = $config['cookie_path']; + } + if ($config['cookie_domain']) + { + // Use specified domain + $domain = $config['cookie_domain']; + } + session_set_cookie_params($config['sess_expire_on_close'] ? 0 : $expire, $path, $domain); + + // Start session + session_start(); + + // Check session expiration, ip, and agent + $now = time(); + $destroy = FALSE; + if (isset($_SESSION['last_activity']) && ($_SESSION['last_activity'] + $expire) < $now) + { + // Expired - destroy + $destroy = TRUE; + } + else if ($config['sess_match_ip'] == TRUE && isset($_SESSION['ip_address']) && + $_SESSION['ip_address'] != $CI->input->ip_address()) + { + // IP doesn't match - destroy + $destroy = TRUE; + } + else if ($config['sess_match_useragent'] == TRUE && isset($_SESSION['user_agent']) && + $_SESSION['user_agent'] != trim(substr($CI->input->user_agent(), 0, 50))) + { + // Agent doesn't match - destroy + $destroy = TRUE; + } + + // Destroy expired or invalid session + if ($destroy) + { + // Clear old session and start new + $this->sess_destroy(); + session_start(); + } + + // Set activity time + $_SESSION['last_activity'] = $now; + + // Set matching values as required + if ($config['sess_match_ip'] == TRUE && !isset($_SESSION['ip_address'])) + { + // Store user IP address + $_SESSION['ip_address'] = $CI->input->ip_address(); + } + if ($config['sess_match_useragent'] == TRUE && !isset($_SESSION['user_agent'])) + { + // Store user agent string + $_SESSION['user_agent'] = trim(substr($CI->input->user_agent(), 0, 50)); + } + } + + /** + * Save the session data + * + * @access public + * @return void + */ + public function sess_save() + { + // Nothing to do - changes to $_SESSION are automatically saved + } + + /** + * Destroy the current session + * + * @access public + * @return void + */ + public function sess_destroy() + { + // Cleanup session + $_SESSION = array(); + $name = session_name(); + if (isset($_COOKIE[$name])) + { + // Clear session cookie + $params = session_get_cookie_params(); + setcookie($name, '', time() - 42000, $params['path'], $params['domain']); + unset($_COOKIE[$name]); + } + session_destroy(); + } + + /** + * Regenerate the current session + * + * Regenerate the session id + * + * @access public + * @param boolean Destroy session data flag (default: false) + * @return void + */ + public function sess_regenerate($destroy = false) + { + // Just regenerate id, passing destroy flag + session_regenerate_id($destroy); + } + + /** + * Get a reference to user data array + * + * @access public + * @return array Reference to userdata + */ + public function &get_userdata() + { + // Just return reference to $_SESSION + return $_SESSION; + } +} +// END Session_Native Class + + +/* End of file Session_native.php */ +/* Location: ./system/libraries/Session/Session.php */ +?> From 3bd8d1ad9273f12c47d1ce1f59d4140718a02e4f Mon Sep 17 00:00:00 2001 From: Darren Hill Date: Wed, 31 Aug 2011 08:28:16 -0400 Subject: [PATCH 0049/5397] Removed ucfirst on Driver library name --- system/libraries/Driver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index e958fc67fbd..c3bcc252e99 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -66,8 +66,8 @@ public function load_driver($child) $child_class = $this->lib_name.'_'.$child; // Remove the CI_ prefix and lowercase - $lib_name = ucfirst(strtolower(str_replace('CI_', '', $this->lib_name))); - $driver_name = strtolower(str_replace('CI_', '', $child_class)); + $lib_name = strtolower(preg_replace('/^CI_/', '', $this->lib_name)); + $driver_name = strtolower(preg_replace('/^CI_/', '', $child_class)); if (in_array($driver_name, array_map('strtolower', $this->valid_drivers))) { From ca3be1d515a68293b64704a9a8346802702dedaa Mon Sep 17 00:00:00 2001 From: Darren Hill Date: Wed, 31 Aug 2011 08:31:18 -0400 Subject: [PATCH 0050/5397] Whitespace cleanup --- system/core/Loader.php | 8 ++++---- system/libraries/Driver.php | 32 ++++++++++++++++---------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index 51e6b82ca4d..edf5853f0ea 100755 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -1177,10 +1177,10 @@ protected function _ci_autoloader() // Autoload drivers if (isset($autoload['drivers'])) { - foreach ($autoload['drivers'] as $item) - { - $this->driver($item); - } + foreach ($autoload['drivers'] as $item) + { + $this->driver($item); + } } // Autoload models diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index c3bcc252e99..80c0e2812b3 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -32,29 +32,29 @@ class CI_Driver_Library { protected $valid_drivers = array(); protected $lib_name; - /** - * Get magic method - * + /** + * Get magic method + * * The first time a child is used it won't exist, so we instantiate it * subsequents calls will go straight to the proper child. - * - * @param string Child class name - * @return object Child class - */ + * + * @param string Child class name + * @return object Child class + */ public function __get($child) { - // Try to load the driver + // Try to load the driver return load_driver($child); - } + } - /** - * Load driver - * + /** + * Load driver + * * Separate load_driver call to support explicit driver load by library or user - * - * @param string Child class name - * @return object Child class - */ + * + * @param string Child class name + * @return object Child class + */ public function load_driver($child) { if ( ! isset($this->lib_name)) From 5073a375951f09b654f6b991df7ca04e1f88d93c Mon Sep 17 00:00:00 2001 From: Darren Hill Date: Wed, 31 Aug 2011 13:54:19 -0400 Subject: [PATCH 0051/5397] Better style guide compliance --- system/libraries/Session/Session.php | 136 +++++++++--------- .../Session/drivers/Session_cookie.php | 8 +- .../Session/drivers/Session_native.php | 8 +- 3 files changed, 76 insertions(+), 76 deletions(-) diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index 7aaf706a1c2..dacc249c5d8 100755 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -15,15 +15,15 @@ /** - * Session Class + * CI_Session Class * * The user interface defined by EllisLabs, now with puggable drivers to manage different storage mechanisms. - * By default, the Native PHP session driver will load, but the 'sess_driver' config/param item (see above) can be - * used to specify the 'Cookie' driver, or any other you might create. + * By default, the native PHP session driver will load, but the 'sess_driver' config/param item (see above) can be + * used to specify the 'cookie' driver, or any other you might create. * Once loaded, this driver setup is a drop-in replacement for the former CI_Session library, taking its place as the * 'session' member of the global controller framework (e.g.: $CI->session or $this->session). * In keeping with the CI_Driver methodology, multiple drivers may be loaded, although this might be a bit confusing. - * The Session library class keeps track of the most recently loaded driver as "current" to call for driver methods. + * The CI_Session library class keeps track of the most recently loaded driver as "current" to call for driver methods. * Ideally, one driver is loaded and all calls go directly through the main library interface. However, any methods * called through the specific driver will switch the "current" driver to itself before invoking the library method * (which will then call back into the driver for low-level operations). So, alternation between two drivers can be @@ -35,10 +35,10 @@ * @package CodeIgniter * @subpackage Libraries * @category Sessions - * @author Darren Hill (DChill) + * @author ExpressionEngine Dev Team * @link http://codeigniter.com/user_guide/libraries/sessions.html */ -final class Session extends CI_Driver_Library { +final class CI_Session extends CI_Driver_Library { public $params = array(); private $current = null; private $userdata = array(); @@ -51,20 +51,20 @@ final class Session extends CI_Driver_Library { const TEMP_EXP_DEF = 300; /** - * Session constructor + * CI_Session constructor * * The constructor loads the configured driver ('sess_driver' in config.php or as a parameter), running * routines in its constructor, and manages flashdata aging. * - * @param array Configuration parameters + * @param array Configuration parameters */ public function __construct(array $params = array()) { - log_message('debug', 'Session Class Initialized'); + log_message('debug', 'CI_Session Class Initialized'); // Get valid drivers list $CI =& get_instance(); - $this->valid_drivers = array('Session_Native', 'Session_Cookie'); + $this->valid_drivers = array('CI_Session_native', 'CI_Session_cookie'); $key = 'sess_valid_drivers'; $drivers = (isset($params[$key])) ? $params[$key] : $CI->config->item($key); if ($drivers) @@ -84,7 +84,7 @@ public function __construct(array $params = array()) // Get driver to load $key = 'sess_driver'; $driver = (isset($params[$key])) ? $params[$key] : $CI->config->item($key); - if (!$driver) $driver = 'Native'; + if (!$driver) $driver = 'native'; if (!in_array('session_'.strtolower($driver), array_map('strtolower', $this->valid_drivers))) { $this->valid_drivers[] = 'Session_'.$driver; @@ -106,14 +106,14 @@ public function __construct(array $params = array()) // Delete expired tempdata $this->_tempdata_sweep(); - log_message('debug', 'Session routines successfully run'); + log_message('debug', 'CI_Session routines successfully run'); } /** * Loads session storage driver * - * @param string Driver classname - * @return object Loaded driver object + * @param string Driver classname + * @return object Loaded driver object */ public function load_driver($driver) { @@ -125,8 +125,8 @@ public function load_driver($driver) /** * Select default session storage driver * - * @param string Driver classname - * @return void + * @param string Driver classname + * @return void */ public function select_driver($driver) { @@ -153,7 +153,7 @@ public function select_driver($driver) /** * Destroy the current session * - * @return void + * @return void */ public function sess_destroy() { @@ -164,8 +164,8 @@ public function sess_destroy() /** * Regenerate the current session * - * @param boolean Destroy session data flag (default: false) - * @return void + * @param boolean Destroy session data flag (default: false) + * @return void */ public function sess_regenerate($destroy = false) { @@ -176,8 +176,8 @@ public function sess_regenerate($destroy = false) /** * Fetch a specific item from the session array * - * @param string Item key - * @return string Item value + * @param string Item key + * @return string Item value */ public function userdata($item) { @@ -199,9 +199,9 @@ public function all_userdata() /** * Add or change data in the "userdata" array * - * @param mixed Item name or array of items - * @param string Item value or empty string - * @return void + * @param mixed Item name or array of items + * @param string Item value or empty string + * @return void */ public function set_userdata($newdata = array(), $newval = '') { @@ -227,8 +227,8 @@ public function set_userdata($newdata = array(), $newval = '') /** * Delete a session variable from the "userdata" array * - * @param mixed Item name or array of item names - * @return void + * @param mixed Item name or array of item names + * @return void */ public function unset_userdata($newdata = array()) { @@ -254,8 +254,8 @@ public function unset_userdata($newdata = array()) /** * Determine if an item exists * - * @param string Item name - * @return boolean + * @param string Item name + * @return boolean */ public function has_userdata($item) { @@ -266,9 +266,9 @@ public function has_userdata($item) /** * Add or change flashdata, only available until the next request * - * @param mixed Item name or array of items - * @param string Item value or empty string - * @return void + * @param mixed Item name or array of items + * @param string Item value or empty string + * @return void */ public function set_flashdata($newdata = array(), $newval = '') { @@ -292,12 +292,12 @@ public function set_flashdata($newdata = array(), $newval = '') /** * Keeps existing flashdata available to next request. * - * @param string Item key - * @return void + * @param string Item key + * @return void */ public function keep_flashdata($key) { - // 'old' flashdata gets removed. Here we mark all + // 'old' flashdata gets removed. Here we mark all // flashdata as 'new' to preserve it from _flashdata_sweep() $old_flashdata_key = self::FLASHDATA_KEY.self::FLASHDATA_OLD.$key; $value = $this->userdata($old_flashdata_key); @@ -309,8 +309,8 @@ public function keep_flashdata($key) /** * Fetch a specific flashdata item from the session array * - * @param string Item key - * @return string + * @param string Item key + * @return string */ public function flashdata($key) { @@ -323,10 +323,10 @@ public function flashdata($key) * Add or change tempdata, only available * until expiration * - * @param mixed Item name or array of items - * @param string Item value or empty string - * @param int Item lifetime in seconds or 0 for default - * @return void + * @param mixed Item name or array of items + * @param string Item value or empty string + * @param int Item lifetime in seconds or 0 for default + * @return void */ public function set_tempdata($newdata = array(), $newval = '', $expire = 0) { @@ -364,8 +364,8 @@ public function set_tempdata($newdata = array(), $newval = '', $expire = 0) /** * Delete a temporary session variable from the "userdata" array * - * @param mixed Item name or array of item names - * @return void + * @param mixed Item name or array of item names + * @return void */ public function unset_tempdata($newdata = array()) { @@ -401,8 +401,8 @@ public function unset_tempdata($newdata = array()) /** * Fetch a specific tempdata item from the session array * - * @param string Item key - * @return string + * @param string Item key + * @return string */ public function tempdata($key) { @@ -483,32 +483,32 @@ private function _tempdata_sweep() $this->set_userdata(self::EXPIRATION_KEY, $expirations); } } -// END Session Class +// END CI_Session Class /** - * SessionDriver Class + * CI_Session_driver Class * - * Extend this class to make a new Session driver. - * A Session driver basically manages an array of name/value pairs with some sort of storage mechanism. - * To make a new driver, derive from (extend) SessionDriver. Overload the initialize method and read or create + * Extend this class to make a new CI_Session driver. + * A CI_Session driver basically manages an array of name/value pairs with some sort of storage mechanism. + * To make a new driver, derive from (extend) CI_Session_driver. Overload the initialize method and read or create * session data. Then implement a save handler to write changed data to storage (sess_save), a destroy handler * to remove deleted data (sess_destroy), and an access handler to expose the data (get_userdata). - * Put your driver in the libraries/Session/drivers folder anywhere in the loader paths. This includes the application - * directory, the system directory, or any path you add with $CI->load->add_package_path(). - * Your driver must be named Session_, where is capitalized, and your filename must be Session_.EXT, - * preferably also capitalized. (e.g.: Session_Foo in libraries/Session/drivers/Session_Foo.php) - * Then specify the driver by setting 'sess_driver' in your config file or as a parameter when loading the Session + * Put your driver in the libraries/Session/drivers folder anywhere in the loader paths. This includes the + * application directory, the system directory, or any path you add with $CI->load->add_package_path(). + * Your driver must be named CI_Session_, and your filename must be Session_.php, + * preferably also capitalized. (e.g.: CI_Session_foo in libraries/Session/drivers/Session_foo.php) + * Then specify the driver by setting 'sess_driver' in your config file or as a parameter when loading the CI_Session * object. (e.g.: $config['sess_driver'] = 'foo'; OR $CI->load->driver('session', array('sess_driver' => 'foo')); ) * Already provided are the Native driver, which manages the native PHP $_SESSION array, and * the Cookie driver, which manages the data in a browser cookie, with optional extra storage in a database table. * - * @package CodeIgniter - * @subpackage Libraries + * @package CodeIgniter + * @subpackage Libraries * @category Sessions - * @author Darren Hill (DChill) + * @author ExpressionEngine Dev Team */ -abstract class SessionDriver extends CI_Driver { +abstract class CI_Session_driver extends CI_Driver { /** * Decorate * @@ -531,8 +531,8 @@ public function decorate($parent) * * Handles access to the parent driver library's methods * - * @param string Library method name - * @param array Method arguments (default: none) + * @param string Library method name + * @param array Method arguments (default: none) * @return mixed */ public function __call($method, $args = array()) @@ -545,7 +545,7 @@ public function __call($method, $args = array()) /** * Initialize driver * - * @return void + * @return void */ protected function initialize() { @@ -558,7 +558,7 @@ protected function initialize() * Data in the array has changed - perform any storage synchronization necessary * The child class MUST implement this abstract method! * - * @return void + * @return void */ abstract public function sess_save(); @@ -568,7 +568,7 @@ abstract public function sess_save(); * Clean up storage for this session - it has been terminated * The child class MUST implement this abstract method! * - * @return void + * @return void */ abstract public function sess_destroy(); @@ -578,22 +578,22 @@ abstract public function sess_destroy(); * Regenerate the session id * The child class MUST implement this abstract method! * - * @param boolean Destroy session data flag (default: false) - * @return void + * @param boolean Destroy session data flag (default: false) + * @return void */ abstract public function sess_regenerate($destroy = false); /** * Get a reference to user data array * - * Give array access to the main Session object + * Give array access to the main CI_Session object * The child class MUST implement this abstract method! * - * @return array Reference to userdata + * @return array Reference to userdata */ abstract public function &get_userdata(); } -// END SessionDriver Class +// END CI_Session_driver Class /* End of file Session.php */ diff --git a/system/libraries/Session/drivers/Session_cookie.php b/system/libraries/Session/drivers/Session_cookie.php index 0982b1e01c6..d26ab043262 100755 --- a/system/libraries/Session/drivers/Session_cookie.php +++ b/system/libraries/Session/drivers/Session_cookie.php @@ -24,9 +24,9 @@ * @package CodeIgniter * @subpackage Libraries * @category Sessions - * @author ExpressionEngine Dev Team and Darren Hill (DChill42) + * @author ExpressionEngine Dev Team */ -class Session_Cookie extends SessionDriver { +class CI_Session_cookie extends CI_Session_driver { private $sess_encrypt_cookie = FALSE; private $sess_use_database = FALSE; private $sess_table_name = ''; @@ -576,8 +576,8 @@ private function _sess_gc() } } } -// END Session_Cookie Class +// END CI_Session_cookie Class /* End of file Session_cookie.php */ -/* Location: ./system/libraries/Session/Session.php */ +/* Location: ./system/libraries/Session/drivers/Session_cookie.php */ ?> diff --git a/system/libraries/Session/drivers/Session_native.php b/system/libraries/Session/drivers/Session_native.php index df588175f51..37da3445ac3 100755 --- a/system/libraries/Session/drivers/Session_native.php +++ b/system/libraries/Session/drivers/Session_native.php @@ -22,9 +22,9 @@ * @package CodeIgniter * @subpackage Libraries * @category Sessions - * @author Darren Hill (DChill) + * @author ExpressionEngine Dev Team */ -class Session_Native extends SessionDriver { +class CI_Session_native extends CI_Session_driver { /** * Initialize session driver object * @@ -182,9 +182,9 @@ public function &get_userdata() return $_SESSION; } } -// END Session_Native Class +// END CI_Session_native Class /* End of file Session_native.php */ -/* Location: ./system/libraries/Session/Session.php */ +/* Location: ./system/libraries/Session/drivers/Session_native.php */ ?> From 4d1cd4c56697bc53b5a9899089ab4c978c66e1da Mon Sep 17 00:00:00 2001 From: Darren Hill Date: Wed, 31 Aug 2011 13:59:09 -0400 Subject: [PATCH 0052/5397] Restored errantly removed ucfirst --- system/libraries/Driver.php | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index 80c0e2812b3..e958fc67fbd 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -32,29 +32,29 @@ class CI_Driver_Library { protected $valid_drivers = array(); protected $lib_name; - /** - * Get magic method - * + /** + * Get magic method + * * The first time a child is used it won't exist, so we instantiate it * subsequents calls will go straight to the proper child. - * - * @param string Child class name - * @return object Child class - */ + * + * @param string Child class name + * @return object Child class + */ public function __get($child) { - // Try to load the driver + // Try to load the driver return load_driver($child); - } + } - /** - * Load driver - * + /** + * Load driver + * * Separate load_driver call to support explicit driver load by library or user - * - * @param string Child class name - * @return object Child class - */ + * + * @param string Child class name + * @return object Child class + */ public function load_driver($child) { if ( ! isset($this->lib_name)) @@ -66,8 +66,8 @@ public function load_driver($child) $child_class = $this->lib_name.'_'.$child; // Remove the CI_ prefix and lowercase - $lib_name = strtolower(preg_replace('/^CI_/', '', $this->lib_name)); - $driver_name = strtolower(preg_replace('/^CI_/', '', $child_class)); + $lib_name = ucfirst(strtolower(str_replace('CI_', '', $this->lib_name))); + $driver_name = strtolower(str_replace('CI_', '', $child_class)); if (in_array($driver_name, array_map('strtolower', $this->valid_drivers))) { From 6fbf6bd1dfa2ef373fc8072c52f63446cdd00327 Mon Sep 17 00:00:00 2001 From: Darren Hill Date: Wed, 31 Aug 2011 14:15:35 -0400 Subject: [PATCH 0053/5397] Missed whitespace on Driver --- system/libraries/Driver.php | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index e958fc67fbd..77476e1390c 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -32,29 +32,29 @@ class CI_Driver_Library { protected $valid_drivers = array(); protected $lib_name; - /** - * Get magic method - * + /** + * Get magic method + * * The first time a child is used it won't exist, so we instantiate it * subsequents calls will go straight to the proper child. - * - * @param string Child class name - * @return object Child class - */ + * + * @param string Child class name + * @return object Child class + */ public function __get($child) { - // Try to load the driver + // Try to load the driver return load_driver($child); - } + } - /** - * Load driver - * + /** + * Load driver + * * Separate load_driver call to support explicit driver load by library or user - * - * @param string Child class name - * @return object Child class - */ + * + * @param string Child class name + * @return object Child class + */ public function load_driver($child) { if ( ! isset($this->lib_name)) From a2ae6571e55d5a3d23645e96929eea996e9f0499 Mon Sep 17 00:00:00 2001 From: Darren Hill Date: Thu, 1 Sep 2011 07:36:26 -0400 Subject: [PATCH 0054/5397] Made private members protected for inheritance --- system/libraries/Session/Session.php | 18 ++--- .../Session/drivers/Session_cookie.php | 66 +++++++++---------- .../Session/drivers/Session_native.php | 28 ++++---- 3 files changed, 56 insertions(+), 56 deletions(-) diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index dacc249c5d8..7c340cccab4 100755 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -38,10 +38,10 @@ * @author ExpressionEngine Dev Team * @link http://codeigniter.com/user_guide/libraries/sessions.html */ -final class CI_Session extends CI_Driver_Library { +class CI_Session extends CI_Driver_Library { public $params = array(); - private $current = null; - private $userdata = array(); + protected $current = null; + protected $userdata = array(); const FLASHDATA_KEY = 'flash'; const FLASHDATA_NEW = ':new:'; @@ -415,10 +415,10 @@ public function tempdata($key) * Identifies flashdata as 'old' for removal * when _flashdata_sweep() runs. * - * @access private + * @access protected * @return void */ - private function _flashdata_mark() + protected function _flashdata_mark() { $userdata = $this->all_userdata(); foreach ($userdata as $name => $value) @@ -436,10 +436,10 @@ private function _flashdata_mark() /** * Removes all flashdata marked as 'old' * - * @access private + * @access protected * @return void */ - private function _flashdata_sweep() + protected function _flashdata_sweep() { $userdata = $this->all_userdata(); foreach ($userdata as $key => $value) @@ -454,10 +454,10 @@ private function _flashdata_sweep() /** * Removes all expired tempdata * - * @access private + * @access protected * @return void */ - private function _tempdata_sweep() + protected function _tempdata_sweep() { // Get expirations list $expirations = $this->userdata(self::EXPIRATION_KEY); diff --git a/system/libraries/Session/drivers/Session_cookie.php b/system/libraries/Session/drivers/Session_cookie.php index d26ab043262..334218ec26d 100755 --- a/system/libraries/Session/drivers/Session_cookie.php +++ b/system/libraries/Session/drivers/Session_cookie.php @@ -27,23 +27,23 @@ * @author ExpressionEngine Dev Team */ class CI_Session_cookie extends CI_Session_driver { - private $sess_encrypt_cookie = FALSE; - private $sess_use_database = FALSE; - private $sess_table_name = ''; - private $sess_expiration = 7200; - private $sess_expire_on_close = FALSE; - private $sess_match_ip = FALSE; - private $sess_match_useragent = TRUE; - private $sess_cookie_name = 'ci_session'; - private $cookie_prefix = ''; - private $cookie_path = ''; - private $cookie_domain = ''; - private $sess_time_to_update = 300; - private $encryption_key = ''; - private $time_reference = 'time'; - private $userdata = array(); - private $CI = null; - private $now = 0; + protected $sess_encrypt_cookie = FALSE; + protected $sess_use_database = FALSE; + protected $sess_table_name = ''; + protected $sess_expiration = 7200; + protected $sess_expire_on_close = FALSE; + protected $sess_match_ip = FALSE; + protected $sess_match_useragent = TRUE; + protected $sess_cookie_name = 'ci_session'; + protected $cookie_prefix = ''; + protected $cookie_path = ''; + protected $cookie_domain = ''; + protected $sess_time_to_update = 300; + protected $encryption_key = ''; + protected $time_reference = 'time'; + protected $userdata = array(); + protected $CI = null; + protected $now = 0; const gc_probability = 5; @@ -224,10 +224,10 @@ public function &get_userdata() /** * Fetch the current session data if it exists * - * @access private + * @access protected * @return bool */ - private function _sess_read() + protected function _sess_read() { // Fetch the cookie $session = $this->CI->input->cookie($this->sess_cookie_name); @@ -343,10 +343,10 @@ private function _sess_read() /** * Create a new session * - * @access private + * @access protected * @return void */ - private function _sess_create() + protected function _sess_create() { $sessid = ''; while (strlen($sessid) < 32) @@ -376,11 +376,11 @@ private function _sess_create() /** * Update an existing session * - * @access private + * @access protected * @param boolean Force update flag (default: false) * @return void */ - private function _sess_update($force = false) + protected function _sess_update($force = false) { // We only update the session every five minutes by default (unless forced) if (!$force && ($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now()) @@ -433,10 +433,10 @@ private function _sess_update($force = false) /** * Get the "now" time * - * @access private + * @access protected * @return int */ - private function _get_time() + protected function _get_time() { if (strtolower($this->time_reference) == 'gmt') { @@ -455,11 +455,11 @@ private function _get_time() /** * Write the session cookie * - * @access private + * @access protected * @param array Cookie name/value pairs * @return void */ - private function _set_cookie(array $cookie_data = NULL) + protected function _set_cookie(array $cookie_data = NULL) { if (is_null($cookie_data)) { @@ -491,11 +491,11 @@ private function _set_cookie(array $cookie_data = NULL) * This function first converts any slashes found in the array to a temporary * marker, so when it gets unserialized the slashes will be preserved * - * @access private + * @access protected * @param mixed Data to serialize * @return string */ - private function _serialize($data) + protected function _serialize($data) { if (is_array($data)) { @@ -524,11 +524,11 @@ private function _serialize($data) * This function unserializes a data string, then converts any * temporary slash markers back to actual slashes * - * @access private + * @access protected * @param string Data to unserialize * @return mixed */ - private function _unserialize($data) + protected function _unserialize($data) { $data = @unserialize(strip_slashes($data)); @@ -554,10 +554,10 @@ private function _unserialize($data) * This deletes expired session rows from database * if the probability percentage is met * - * @access private + * @access protected * @return void */ - private function _sess_gc() + protected function _sess_gc() { if ($this->sess_use_database != TRUE) { diff --git a/system/libraries/Session/drivers/Session_native.php b/system/libraries/Session/drivers/Session_native.php index 37da3445ac3..c7130b688e0 100755 --- a/system/libraries/Session/drivers/Session_native.php +++ b/system/libraries/Session/drivers/Session_native.php @@ -5,11 +5,11 @@ * An open source application development framework for PHP 5.1.6 or newer * * @package CodeIgniter - * @author ExpressionEngine Dev Team - * @copyright Copyright (c) 2008 - 2010, EllisLab, Inc. + * @author ExpressionEngine Dev Team + * @copyright Copyright (c) 2008 - 2010, EllisLab, Inc. * @license http://codeigniter.com/user_guide/license.html * @link http://codeigniter.com - * @since Version 2.0 + * @since Version 2.0 * @filesource */ @@ -22,13 +22,13 @@ * @package CodeIgniter * @subpackage Libraries * @category Sessions - * @author ExpressionEngine Dev Team + * @author ExpressionEngine Dev Team */ class CI_Session_native extends CI_Session_driver { /** * Initialize session driver object * - * @access protected + * @access protected * @return void */ protected function initialize() @@ -126,8 +126,8 @@ protected function initialize() /** * Save the session data * - * @access public - * @return void + * @access public + * @return void */ public function sess_save() { @@ -137,8 +137,8 @@ public function sess_save() /** * Destroy the current session * - * @access public - * @return void + * @access public + * @return void */ public function sess_destroy() { @@ -160,9 +160,9 @@ public function sess_destroy() * * Regenerate the session id * - * @access public - * @param boolean Destroy session data flag (default: false) - * @return void + * @access public + * @param boolean Destroy session data flag (default: false) + * @return void */ public function sess_regenerate($destroy = false) { @@ -173,8 +173,8 @@ public function sess_regenerate($destroy = false) /** * Get a reference to user data array * - * @access public - * @return array Reference to userdata + * @access public + * @return array Reference to userdata */ public function &get_userdata() { From f08548b2b88324c36729a7dd4d179a9e1076dc14 Mon Sep 17 00:00:00 2001 From: Mike Funk Date: Tue, 6 Sep 2011 17:40:17 -0400 Subject: [PATCH 0055/5397] Fixed int typecasting of limit parameter in DB_active_rec.php If an empty string was passed, the typecast was changing it to 0. This produced "LIMIT 0" which returned no results. This must be a bug and not a feature because there are other params after limit in both $this->db->limit and $this->db->get. --- system/database/DB_active_rec.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index 841ede28e22..a16363c684d 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -874,7 +874,7 @@ public function order_by($orderby, $direction = '') */ public function limit($value, $offset = '') { - $this->ar_limit = (int) $value; + $this->ar_limit = $value; if ($offset != '') { From 37e351f1c1bf76758685158630be723e2951c032 Mon Sep 17 00:00:00 2001 From: Kyle Farris Date: Wed, 7 Sep 2011 11:14:46 -0300 Subject: [PATCH 0056/5397] Fix for issue #406 --- system/database/drivers/sqlsrv/sqlsrv_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index 400fd31c6ad..1021db945db 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -86,7 +86,7 @@ function db_connect($pooling = false) */ function db_pconnect() { - $this->db_connect(TRUE); + return $this->db_connect(TRUE); } // -------------------------------------------------------------------- From 6636cef6fc457b3a0490d051587cb430aa0021d0 Mon Sep 17 00:00:00 2001 From: Kyle Farris Date: Wed, 7 Sep 2011 11:25:54 -0300 Subject: [PATCH 0057/5397] Added changelog item for Issue #406 --- user_guide/changelog.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/user_guide/changelog.html b/user_guide/changelog.html index e3f12772ee4..6fe501e0638 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -113,14 +113,15 @@

    Bug fixes for 2.1.0

  • If a config class was loaded first then a library with the same name is loaded, the config would be ignored.
  • Fixed a bug (Reactor #19) where 1) the 404_override route was being ignored in some cases, and 2) auto-loaded libraries were not available to the 404_override controller when a controller existed but the requested method did not.
  • Fixed a bug (Reactor #89) where MySQL export would fail if the table had hyphens or other non alphanumeric/underscore characters.
  • -
  • Fixed a bug (#200) where MySQL queries would be malformed after calling count_all() then db->get()
  • -
  • Fixed bug #105 that stopped query errors from being logged unless database debugging was enabled
  • -
  • Fixed a bug (#181) where a mis-spelling was in the form validation language file.
  • +
  • Fixed a bug (#200) where MySQL queries would be malformed after calling count_all() then db->get()
  • +
  • Fixed bug #105 that stopped query errors from being logged unless database debugging was enabled
  • +
  • Fixed a bug (#181) where a mis-spelling was in the form validation language file.
  • Fixed a bug (#160) - Removed unneeded array copy in the file cache driver.
  • Fixed a bug (#150) - field_data() now correctly returns column length.
  • Fixed a bug (#8) - load_class() now looks for core classes in APPPATH first, allowing them to be replaced.
  • Fixed a bug (#24) - ODBC database driver called incorrect parent in __construct().
  • Fixed a bug (#85) - OCI8 (Oracle) database escape_str() function did not escape correct.
  • +
  • Fixed a bug (#406) - sqlsrv DB driver not reuturning resource on db_pconnect().
  • Version 2.0.3

    From b3d277a58560c9cdc440efdc04730bf61ae80f9a Mon Sep 17 00:00:00 2001 From: Jeroen van der Gulik Date: Thu, 22 Sep 2011 18:03:49 +0200 Subject: [PATCH 0058/5397] added missing PAT pear channel --- tests/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/README.md b/tests/README.md index b53f19506ba..ad805161810 100644 --- a/tests/README.md +++ b/tests/README.md @@ -41,7 +41,7 @@ vfsStream pear channel-discover pear.phpunit.de pear channel-discover pear.symfony-project.com pear channel-discover components.ez.no - pear channel-discover pear.symfony-project.com + pear channel-discover pear.php-tools.net # Finally install PHPUnit and vfsStream (including dependencies) pear install --alldeps phpunit/PHPUnit @@ -159,4 +159,4 @@ I don't have a clue how this will work. Needs to be able to handle packages that are used multiple times within the application (i.e. EE/Pyro modules) -as well as packages that are used by multiple applications (library distributions) \ No newline at end of file +as well as packages that are used by multiple applications (library distributions) From cd38d6774bf11bab8e2a07f861c876097a287f59 Mon Sep 17 00:00:00 2001 From: Kyle Farris Date: Fri, 14 Oct 2011 12:49:40 -0400 Subject: [PATCH 0059/5397] Merged with develop and updated to new changelog. --- user_guide/changelog.html | 1438 --------------------------- user_guide_src/source/changelog.rst | 4 + 2 files changed, 4 insertions(+), 1438 deletions(-) delete mode 100644 user_guide/changelog.html diff --git a/user_guide/changelog.html b/user_guide/changelog.html deleted file mode 100644 index 6fe501e0638..00000000000 --- a/user_guide/changelog.html +++ /dev/null @@ -1,1438 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Change Log : CodeIgniter User Guide - - - - - - - -
    - - - - - -

    CodeIgniter User Guide Version 2.0.3

    -
    - - - - - - - - - -
    - - -
    - - - -
    - -

    Change Log

    - -

    The Reactor Marker indicates items that were contributed to CodeIgniter via CodeIgniter Reactor.

    - -

    Version 2.1.0 (planned)

    -

    Release Date: Not Released

    - -
      -
    • General Changes -
        -
      • Added Android to the list of user agents.
      • -
      • Added Windows 7 to the list of user platforms.
      • -
      • Callback validation rules can now accept parameters like any other validation rule.
      • -
      • Ability to log certain error types, not all under a threshold.
      • -
      • Added html_escape() to Common functions to escape HTML output for preventing XSS.
      • -
      -
    • -
    • Helpers -
        -
      • Added increment_string() to String Helper to turn "foo" into "foo-1" or "foo-1" into "foo-2".
      • -
      • Altered form helper - made action on form_open_multipart helper function call optional. Fixes (#65)
      • -
      • url_title() will now trim extra dashes from beginning and end.
      • -
      • Improved speed of String Helper's random_string() method
      • -
      -
    • -
    • Database -
        -
      • Added a CUBRID driver to the Database Driver. Thanks to the CUBRID team for supplying this patch.
      • -
      • Typecast limit and offset in the Database Driver to integers to avoid possible injection.
      • -
      • - Added additional option 'none' for the optional third argument for $this->db->like() in the Database Driver. -
      • -
      -
    • -
    • Libraries -
        -
      • Changed $this->cart->insert() in the Cart Library to return the Row ID if a single item was inserted successfully.
      • -
      • Added support to set an optional parameter in your callback rules of validation using the Form Validation Library.
      • -
      • Added a Migration Library to assist with applying incremental updates to your database schema.
      • -
      • Driver children can be located in any package path.
      • -
      • Added max_filename_increment config setting for Upload library.
      • -
      • CI_Loader::_ci_autoloader() is now a protected method.
      • -
      • Added is_unique to the Form Validation library.
      • -
      -
    • -
    • Core -
        -
      • Changed private functions in CI_URI to protected so MY_URI can override them.
      • -
      -
    • -
    - -

    Bug fixes for 2.1.0

    -
      -
    • Fixed #378 Robots identified as regular browsers by the User Agent class.
    • -
    • If a config class was loaded first then a library with the same name is loaded, the config would be ignored.
    • -
    • Fixed a bug (Reactor #19) where 1) the 404_override route was being ignored in some cases, and 2) auto-loaded libraries were not available to the 404_override controller when a controller existed but the requested method did not.
    • -
    • Fixed a bug (Reactor #89) where MySQL export would fail if the table had hyphens or other non alphanumeric/underscore characters.
    • -
    • Fixed a bug (#200) where MySQL queries would be malformed after calling count_all() then db->get()
    • -
    • Fixed bug #105 that stopped query errors from being logged unless database debugging was enabled
    • -
    • Fixed a bug (#181) where a mis-spelling was in the form validation language file.
    • -
    • Fixed a bug (#160) - Removed unneeded array copy in the file cache driver.
    • -
    • Fixed a bug (#150) - field_data() now correctly returns column length.
    • -
    • Fixed a bug (#8) - load_class() now looks for core classes in APPPATH first, allowing them to be replaced.
    • -
    • Fixed a bug (#24) - ODBC database driver called incorrect parent in __construct().
    • -
    • Fixed a bug (#85) - OCI8 (Oracle) database escape_str() function did not escape correct.
    • -
    • Fixed a bug (#406) - sqlsrv DB driver not reuturning resource on db_pconnect().
    • -
    - -

    Version 2.0.3

    -

    Release Date: August 20, 2011

    - -
      -
    • Security -
        -
      • An improvement was made to the MySQL and MySQLi drivers to prevent exposing a potential vector for SQL injection on sites using multi-byte character sets in the database client connection.

        An incompatibility in PHP versions < 5.2.3 and MySQL < 5.0.7 with mysql_set_charset() creates a situation where using multi-byte character sets on these environments may potentially expose a SQL injection attack vector. Latin-1, UTF-8, and other "low ASCII" character sets are unaffected on all environments.

        If you are running or considering running a multi-byte character set for your database connection, please pay close attention to the server environment you are deploying on to ensure you are not vulnerable.

      • -
      -
    • -
    • General Changes -
        -
      • Fixed a bug where there was a misspelling within a code comment in the index.php file.
      • -
      • Added Session Class userdata to the output profiler. Additionally, added a show/hide toggle on HTTP Headers, Session Data and Config Variables.
      • -
      • Removed internal usage of the EXT constant.
      • -
      • Visual updates to the welcome_message view file and default error templates. Thanks to danijelb for the pull request.
      • -
      • Added insert_batch() function to the PostgreSQL database driver. Thanks to epallerols for the patch.
      • -
      • Added "application/x-csv" to mimes.php.
      • -
      • Added CSRF protection URI whitelisting.
      • -
      • Fixed a bug where Email library attachments with a "." in the name would using invalid MIME-types.
      • -
      • Added support for pem,p10,p12,p7a,p7c,p7m,p7r,p7s,crt,crl,der,kdb,rsa,cer,sst,csr Certs to mimes.php.
      • -
      • Added support pgp,gpg to mimes.php.
      • -
      • Added support 3gp, 3g2, mp4, wmv, f4v, vlc Video files to mimes.php.
      • -
      • Added support m4a, aac, m4u, xspf, au, ac3, flac, ogg Audio files to mimes.php.
      • - -
      -
    • -
    • Helpers -
        -
      • Added an optional third parameter to heading() which allows adding html attributes to the rendered heading tag.
      • -
      • form_open() now only adds a hidden (Cross-site Reference Forgery) protection field when the form's action is internal and is set to the post method. (Reactor #165)
      • -
      • Re-worked plural() and singular() functions in the Inflector helper to support considerably more words.
      • -
      -
    • -
    • Libraries -
        -
      • Altered Session to use a longer match against the user_agent string. See upgrade notes if using database sessions.
      • -
      • Added $this->db->set_dbprefix() to the Database Driver.
      • -
      • Changed $this->cart->insert() in the Cart Library to return the Row ID if a single item was inserted successfully.
      • -
      • Added $this->load->get_var() to the Loader library to retrieve global vars set with $this->load->view() and $this->load->vars().
      • -
      • Changed $this->db->having() to insert quotes using escape() rather than escape_str().
      • -
      -
    • -
    - -

    Bug fixes for 2.0.3

    -
      -
    • Added ENVIRONMENT to reserved constants. (Reactor #196)
    • -
    • Changed server check to ensure SCRIPT_NAME is defined. (Reactor #57)
    • -
    • Removed APPPATH.'third_party' from the packages autoloader to negate needless file stats if no packages exist or if the developer does not load any other packages by default.
    • -
    • Fixed a bug (Reactor #231) where Sessions Library database table example SQL did not contain an index on last_activity. See Upgrade Notes.
    • -
    • Fixed a bug (Reactor #229) where the Sessions Library example SQL in the documentation contained incorrect SQL.
    • -
    • Fixed a bug (Core #340) where when passing in the second parameter to $this->db->select(), column names in subsequent queries would not be properly escaped.
    • -
    • Fixed issue #199 - Attributes passed as string does not include a space between it and the opening tag.
    • -
    • Fixed a bug where the method $this->cart->total_items() from Cart Library now returns the sum of the quantity of all items in the cart instead of your total count.
    • -
    • Fixed a bug where not setting 'null' when adding fields in db_forge for mysql and mysqli drivers would default to NULL instead of NOT NULL as the docs suggest.
    • -
    • Fixed a bug where using $this->db->select_max(), $this->db->select_min(), etc could throw notices. Thanks to w43l for the patch.
    • -
    • Replace checks for STDIN with php_sapi_name() == 'cli' which on the whole is more reliable. This should get parameters in crontab working.
    • -
    - -

    Version 2.0.2

    -

    Release Date: April 7, 2011
    -Hg Tag: v2.0.2

    - -
      -
    • General changes -
        -
      • The Security library was moved to the core and is now loaded automatically. Please remove your loading calls.
      • -
      • The CI_SHA class is now deprecated. All supported versions of PHP provide a sha1() function.
      • -
      • constants.php will now be loaded from the environment folder if available.
      • -
      • Added language key error logging
      • -
      • Made Environment Support optional. Comment out or delete the constant to stop environment checks.
      • -
      • Added Environment Support for Hooks.
      • -
      • Added CI_ Prefix to the Cache driver.
      • -
      • Added CLI usage documentation.
      • -
      -
    • -
    • Helpers -
        -
      • Removed the previously deprecated dohash() from the Security helper; use do_hash() instead.
      • -
      • Changed the 'plural' function so that it doesn't ruin the captalization of your string. It also take into consideration acronyms which are all caps.
      • -
      -
    • -
    • Database -
        -
      • $this->db->count_all_results() will now return an integer instead of a string.
      • -
      -
    • -
    - -

    Bug fixes for 2.0.2

    -
      -
    • Fixed a bug (Reactor #145) where the Output Library had parse_exec_vars set to protected.
    • -
    • Fixed a bug (Reactor #80) where is_really_writable would create an empty file when on Windows or with safe_mode enabled.
    • -
    • Fixed various bugs with User Guide.
    • -
    • Added is_cli_request() method to documentation for Input class.
    • -
    • Added form_validation_lang entries for decimal, less_than and greater_than.
    • -
    • Fixed issue #153 Escape Str Bug in MSSQL driver.
    • -
    • Fixed issue #172 Google Chrome 11 posts incorrectly when action is empty.
    • - -
    - -

    Version 2.0.1

    -

    Release Date: March 15, 2011
    -Hg Tag: v2.0.1

    - -
      -
    • General changes -
        -
      • Added $config['cookie_secure'] to the config file to allow requiring a secure (HTTPS) in order to set cookies.
      • -
      • Added the constant CI_CORE to help differentiate between Core: TRUE and Reactor: FALSE.
      • -
      • Added an ENVIRONMENT constant in index.php, which affects PHP error reporting settings, and optionally, - which configuration files are loaded (see below). Read more on the Handling Environments page.
      • -
      • Added support for environment-specific configuration files.
      • -
      -
    • -
    • Libraries -
        -
      • Added decimal, less_than and greater_than rules to the Form validation Class.
      • -
      • Input Class methods post() and get() will now return a full array if the first argument is not provided.
      • -
      • Secure cookies can now be made with the set_cookie() helper and Input Class method.
      • -
      • Added set_content_type() to Output Class to set the output Content-Type HTTP header based on a MIME Type or a config/mimes.php array key.
      • -
      • Output Class will now support method chaining.
      • -
      -
    • -
    • Helpers -
        -
      • Changed the logic for form_open() in Form helper. If no value is passed it will submit to the current URL.
      • -
      -
    • -
    - -

    Bug fixes for 2.0.1

    -
      -
    • CLI requests can now be run from any folder, not just when CD'ed next to index.php.
    • -
    • Fixed issue #41: Added audio/mp3 mime type to mp3.
    • -
    • Fixed a bug (Core #329) where the file caching driver referenced the incorrect cache directory.
    • -
    • Fixed a bug (Reactor #69) where the SHA1 library was named incorrectly.
    • -
    - -

    Version 2.0.0

    -

    Release Date: January 28, 2011
    -Hg Tag: v2.0.0

    - -
      -
    • General changes -
        -
      • PHP 4 support is removed. CodeIgniter now requires PHP 5.1.6.
      • -
      • Scaffolding, having been deprecated for a number of versions, has been removed.
      • -
      • Plugins have been removed, in favor of Helpers. The CAPTCHA plugin has been converted to a Helper and documented. The JavaScript calendar plugin was removed due to the ready availability of great JavaScript calendars, particularly with jQuery.
      • -
      • Added new special Library type: Drivers.
      • -
      • Added full query-string support. See the config file for details.
      • -
      • Moved the application folder outside of the system folder.
      • -
      • Moved system/cache and system/logs directories to the application directory.
      • -
      • Added routing overrides to the main index.php file, enabling the normal routing to be overridden on a per "index" file basis.
      • -
      • Added the ability to set config values (or override config values) directly from data set in the main index.php file. This allows a single application to be used with multiple front controllers, each having its own config values.
      • -
      • Added $config['directory_trigger'] to the config file so that a controller sub-directory can be specified when running _GET strings instead of URI segments.
      • -
      • Added ability to set "Package" paths - specific paths where the Loader and Config classes should try to look first for a requested file. This allows distribution of sub-applications with their own libraries, models, config files, etc. in a single "package" directory. See the Loader class documentation for more details.
      • -
      • In-development code is now hosted at BitBucket.
      • -
      • Removed the deprecated Validation Class.
      • -
      • Added CI_ Prefix to all core classes.
      • -
      • Package paths can now be set in application/config/autoload.php.
      • -
      • Upload library file_name can now be set without an extension, the extension will be taken from the uploaded file instead of the given name.
      • -
      • In Database Forge the name can be omitted from $this->dbforge->modify_column()'s 2nd param if you aren't changing the name.
      • -
      • $config['base_url'] is now empty by default and will guess what it should be.
      • -
      • Enabled full Command Line Interface compatibility with config['uri_protocol'] = 'CLI';.
      • -
      -
    • Libraries -
        -
      • Added a Cache driver with APC, memcached, and file-based support.
      • -
      • Added $prefix, $suffix and $first_url properties to Pagination library.
      • -
      • Added the ability to suppress first, previous, next, last, and page links by setting their values to FALSE in the Pagination library.
      • -
      • Added Security library, which now contains the xss_clean function, filename_security function and other security related functions.
      • -
      • Added CSRF (Cross-site Reference Forgery) protection to the Security library.
      • -
      • Added $parse_exec_vars property to Output library.
      • -
      • Added ability to enable / disable individual sections of the Profiler
      • -
      • Added a wildcard option $config['allowed_types'] = '*' to the File Uploading Class.
      • -
      • Added an 'object' config variable to the XML-RPC Server library so that one can specify the object to look for requested methods, instead of assuming it is in the $CI superobject.
      • -
      • Added "is_object" into the list of unit tests capable of being run.
      • -
      • Table library will generate an empty cell with a blank string, or NULL value.
      • -
      • Added ability to set tag attributes for individual cells in the Table library
      • -
      • Added a parse_string() method to the Parser Class.
      • -
      • Added HTTP headers and Config information to the Profiler output.
      • -
      • Added Chrome and Flock to the list of detectable browsers by browser() in the User Agent Class.
      • -
      • The Unit Test Class now has an optional "notes" field available to it, and allows for discrete display of test result items using $this->unit->set_test_items().
      • -
      • Added a $xss_clean class variable to the XMLRPC library, enabling control over the use of the Security library's xss_clean() method.
      • -
      • Added a download() method to the FTP library
      • -
      • Changed do_xss_clean() to return FALSE if the uploaded file fails XSS checks.
      • -
      • Added stripslashes() and trim()ing of double quotes from $_FILES type value to standardize input in Upload library.
      • -
      • Added a second parameter (boolean) to $this->zip->read_dir('/path/to/directory', FALSE) to remove the preceding trail of empty folders when creating a Zip archive. This example would contain a zip with "directory" and all of its contents.
      • -
      • Added ability in the Image Library to handle PNG transparency for resize operations when using the GD lib.
      • -
      • Modified the Session class to prevent use if no encryption key is set in the config file.
      • -
      • Added a new config item to the Session class sess_expire_on_close to allow sessions to auto-expire when the browser window is closed.
      • -
      • Improved performance of the Encryption library on servers where Mcrypt is available.
      • -
      • Changed the default encryption mode in the Encryption library to CBC.
      • -
      • Added an encode_from_legacy() method to provide a way to transition encrypted data from CodeIgniter 1.x to CodeIgniter 2.x. - Please see the upgrade instructions for details.
      • -
      • Altered Form_Validation library to allow for method chaining on set_rules(), set_message() and set_error_delimiters() functions.
      • -
      • Altered Email Library to allow for method chaining.
      • -
      • Added request_headers(), get_request_header() and is_ajax_request() to the input class.
      • -
      • Altered User agent library so that is_browser(), is_mobile() and is_robot() can optionally check for a specific browser or mobile device.
      • -
      • Altered Input library so that post() and get() will return all POST and GET items (respectively) if there are no parameters passed in.
      • -
      -
    • -
    • Database -
        -
      • database configuration.
      • -
      • Added autoinit value to database configuration.
      • -
      • Added stricton value to database configuration.
      • -
      • Added database_exists() to the Database Utilities Class.
      • -
      • Semantic change to db->version() function to allow a list of exceptions for databases with functions to return version string instead of specially formed SQL queries. Currently this list only includes Oracle and SQLite.
      • -
      • Fixed a bug where driver specific table identifier protection could lead to malformed queries in the field_data() functions.
      • -
      • Fixed a bug where an undefined class variable was referenced in database drivers.
      • -
      • Modified the database errors to show the filename and line number of the problematic query.
      • -
      • Removed the following deprecated functions: orwhere, orlike, groupby, orhaving, orderby, getwhere.
      • -
      • Removed deprecated _drop_database() and _create_database() functions from the db utility drivers.
      • -
      • Improved dbforge create_table() function for the Postgres driver.
      • -
      -
    • -
    • Helpers -
        -
      • Added convert_accented_characters() function to text helper.
      • -
      • Added accept-charset to the list of inserted attributes of form_open() in the Form Helper.
      • -
      • Deprecated the dohash() function in favour of do_hash() for naming consistency.
      • -
      • Non-backwards compatible change made to get_dir_file_info() in the File Helper. No longer recurses - by default so as to encourage responsible use (this function can cause server performance issues when used without caution).
      • -
      • Modified the second parameter of directory_map() in the Directory Helper to accept an integer to specify recursion depth.
      • -
      • Modified delete_files() in the File Helper to return FALSE on failure.
      • -
      • Added an optional second parameter to byte_format() in the Number Helper to allow for decimal precision.
      • -
      • Added alpha, and sha1 string types to random_string() in the String Helper.
      • -
      • Modified prep_url() so as to not prepend http:// if the supplied string already has a scheme.
      • -
      • Modified get_file_info in the file helper, changing filectime() to filemtime() for dates.
      • -
      • Modified smiley_js() to add optional third parameter to return only the javascript with no script tags.
      • -
      • The img() function of the HTML helper will now generate an empty string as an alt attribute if one is not provided.
      • -
      • If CSRF is enabled in the application config file, form_open() will automatically insert it as a hidden field.
      • -
      • Added sanitize_filename() into the Security helper.
      • -
      • Added ellipsize() to the Text Helper
      • -
      • Added elements() to the Array Helper
      • -
      -
    • -
    • Other Changes -
        -
      • Added an optional second parameter to show_404() to disable logging.
      • -
      • Updated loader to automatically apply the sub-class prefix as an option when loading classes. Class names can be prefixed with the standard "CI_" or the same prefix as the subclass prefix, or no prefix at all.
      • -
      • Increased randomness with is_really_writable() to avoid file collisions when hundreds or thousands of requests occur at once.
      • -
      • Switched some DIR_WRITE_MODE constant uses to FILE_WRITE_MODE where files and not directories are being operated on.
      • -
      • get_mime_by_extension() is now case insensitive.
      • -
      • Added "default" to the list Reserved Names.
      • -
      • Added 'application/x-msdownload' for .exe files and ''application/x-gzip-compressed' for .tgz files to config/mimes.php.
      • -
      • Updated the output library to no longer compress output or send content-length headers if the server runs with zlib.output_compression enabled.
      • -
      • Eliminated a call to is_really_writable() on each request unless it is really needed (Output caching)
      • -
      • Documented append_output() in the Output Class.
      • -
      • Documented a second argument in the decode() function for the Encryption Class.
      • -
      • Documented db->close().
      • -
      • Updated the router to support a default route with any number of segments.
      • -
      • Moved _remove_invisible_characters() function from the Security Library to common functions.
      • -
      • Added audio/mpeg3 as a valid mime type for MP3.
      • -
      -
    • -
    - -

    Bug fixes for 2.0.0

    -
      -
    • Fixed a bug where you could not change the User-Agent when sending email.
    • -
    • Fixed a bug where the Output class would send incorrect cached output for controllers implementing their own _output() method.
    • -
    • Fixed a bug where a failed query would not have a saved query execution time causing errors in the Profiler
    • -
    • Fixed a bug that was writing log entries when multiple identical helpers and plugins were loaded.
    • -
    • Fixed assorted user guide typos or examples (#10693, #8951, #7825, #8660, #7883, #6771, #10656).
    • -
    • Fixed a language key in the profiler: "profiler_no_memory_usage" to "profiler_no_memory".
    • -
    • Fixed an error in the Zip library that didn't allow downloading on PHP 4 servers.
    • -
    • Fixed a bug in the Form Validation library where fields passed as rule parameters were not being translated (#9132)
    • -
    • Modified inflector helper to properly pluralize words that end in 'ch' or 'sh'
    • -
    • Fixed a bug in xss_clean() that was not allowing hyphens in query strings of submitted URLs.
    • -
    • Fixed bugs in get_dir_file_info() and get_file_info() in the File Helper with recursion, and file paths on Windows.
    • -
    • Fixed a bug where Active Record override parameter would not let you disable Active Record if it was enabled in your database config file.
    • -
    • Fixed a bug in reduce_double_slashes() in the String Helper to properly remove duplicate leading slashes (#7585)
    • -
    • Fixed a bug in values_parsing() of the XML-RPC library which prevented NULL variables typed as 'string' from being handled properly.
    • -
    • Fixed a bug were form_open_multipart() didn't accept string attribute arguments (#10930).
    • -
    • Fixed a bug (#10470) where get_mime_by_extension() was case sensitive.
    • -
    • Fixed a bug where some error messages for the SQLite and Oracle drivers would not display.
    • -
    • Fixed a bug where files created with the Zip Library would result in file creation dates of 1980.
    • -
    • Fixed a bug in the Session library that would result in PHP error when attempting to store values with objects.
    • -
    • Fixed a bug where extending the Controller class would result in a fatal PHP error.
    • -
    • Fixed a PHP Strict Standards Error in the index.php file.
    • -
    • Fixed a bug where getimagesize() was being needlessly checked on non-image files in is_allowed_type().
    • -
    • Fixed a bug in the Encryption library where an empty key was not triggering an error.
    • -
    • Fixed a bug in the Email library where CC and BCC recipients were not reset when using the clear() method (#109).
    • -
    • Fixed a bug in the URL Helper where prep_url() could cause a PHP error on PHP versions < 5.1.2.
    • -
    • Added a log message in core/output if the cache directory config value was not found.
    • -
    • Fixed a bug where multiple libraries could not be loaded by passing an array to load->library()
    • -
    • Fixed a bug in the html helper where too much white space was rendered between the src and alt tags in the img() function.
    • -
    • Fixed a bug in the profilers _compile_queries() function.
    • -
    • Fixed a bug in the date helper where the DATE_ISO8601 variable was returning an incorrectly formatted date string.
    • -
    - -

    Version 1.7.2

    -

    Release Date: September 11, 2009
    -Hg Tag: v1.7.2

    - -
      -
    • Libraries -
        -
      • Added a new Cart Class.
      • -
      • Added the ability to pass $config['file_name'] for the File Uploading Class and rename the uploaded file.
      • -
      • Changed order of listed user-agents so Safari would more accurately report itself. (#6844)
      • -
      -
    • -
    • Database -
        -
      • Switched from using gettype() in escape() to is_* methods, since future PHP versions might change its output.
      • -
      • Updated all database drivers to handle arrays in escape_str()
      • -
      • Added escape_like_str() method for escaping strings to be used in LIKE conditions
      • -
      • Updated Active Record to utilize the new LIKE escaping mechanism.
      • -
      • Added reconnect() method to DB drivers to try to keep alive / reestablish a connection after a long idle.
      • -
      • Modified MSSQL driver to use mssql_get_last_message() for error messages.
      • -
      -
    • -
    • Helpers -
        -
      • Added form_multiselect() to the Form helper.
      • -
      • Modified form_hidden() in the Form helper to accept multi-dimensional arrays.
      • -
      • Modified form_prep() in the Form helper to keep track of prepped fields to avoid multiple prep/mutation from subsequent calls which can occur when using Form Validation - and form helper functions to output form fields.
      • -
      • Modified directory_map() in the Directory helper to allow the inclusion of hidden files, and to return FALSE on failure to read directory.
      • -
      • Modified the Smiley helper to work with multiple fields and insert the smiley at the last known cursor position.
      • -
      -
    • -
    • General - -
    • -
    - -

    Bug fixes for 1.7.2

    -
      -
    • Fixed assorted user guide typos or examples (#6743, #7214, #7516, #7287, #7852, #8224, #8324, #8349).
    • -
    • Fixed a bug in the Form Validation library where multiple callbacks weren't working (#6110)
    • -
    • doctype helper default value was missing a "1".
    • -
    • Fixed a bug in the language class when outputting an error for an unfound file.
    • -
    • Fixed a bug in the Calendar library where the shortname was output for "May".
    • -
    • Fixed a bug with ORIG_PATH_INFO that was allowing URIs of just a slash through.
    • -
    • Fixed a fatal error in the Oracle and ODBC drivers (#6752)
    • -
    • Fixed a bug where xml_from_result() was checking for a nonexistent method.
    • -
    • Fixed a bug where Database Forge's add_column and modify_column were not looping through when sent multiple fields.
    • -
    • Fixed a bug where the File Helper was using '/' instead of the DIRECTORY_SEPARATOR constant.
    • -
    • Fixed a bug to prevent PHP errors when attempting to use sendmail on servers that have manually disabled the PHP popen() function.
    • -
    • Fixed a bug that would cause PHP errors in XML-RPC data if the PHP data type did not match the specified XML-RPC type.
    • -
    • Fixed a bug in the XML-RPC class with parsing dateTime.iso8601 data types.
    • -
    • Fixed a case sensitive string replacement in xss_clean()
    • -
    • Fixed a bug in form_textarea() where form data was not prepped correctly.
    • -
    • Fixed a bug in form_prep() causing it to not preserve entities in the user's original input when called back into a form element
    • -
    • Fixed a bug in _protect_identifiers() where the swap prefix ($swap_pre) was not being observed.
    • -
    • Fixed a bug where the 400 status header sent with the 'disallowed URI characters' was not compatible with CGI environments.
    • -
    • Fixed a bug in the typography class where heading tags could have paragraph tags inserted when using auto_typography().
    • -
    - -

    Version 1.7.1

    -

    Release Date: February 10, 2009
    -Hg Tag: 1.7.1

    - -
      -
    • Libraries -
        -
      • Fixed an arbitrary script execution security flaw (#6068) in the Form Validation library (thanks to hkk)
      • -
      • Changed default current page indicator in the Pagination library to use <strong> instead of <b>
      • -
      • A "HTTP/1.1 400 Bad Request" header is now sent when disallowed characters are encountered.
      • -
      • Added <big>, <small>, <q>, and <tt> to the Typography parser's inline elements.
      • -
      • Added more accurate error reporting for the Email library when using sendmail.
      • -
      • Removed a strict type check from the rotate() function of the Image Manipulation Class.
      • -
      • Added enhanced error checking in file saving in the Image library when using the GD lib.
      • -
      • Added an additional newline between multipart email headers and the MIME message text for better compatibility with a variety of MUAs.
      • -
      • Made modest improvements to efficiency and accuracy of explode_name() in the Image lib.
      • -
      -
    • -
    • Database -
        -
      • Added where_in to the list of expected arguments received by delete().
      • -
      -
    • -
    • Helpers -
        -
      • Added the ability to have optgroups in form_dropdown() within the form helper.
      • -
      • Added a doctype() function to the HTML helper.
      • -
      • Added ability to force lowercase for url_title() in the URL helper.
      • -
      • Changed the default "type" of form_button() to "button" from "submit" in the form helper.
      • -
      • Changed redirect() in the URL helper to allow redirections to URLs outside of the CI site.
      • -
      • Updated get_cookie() to try to fetch the cookie using the global cookie prefix if the requested cookie name doesn't exist.
      • -
      -
    • -
    • Other Changes -
        -
      • Improved security in xss_clean() to help prevent attacks targeting Internet Explorer.
      • -
      • Added 'application/msexcel' to config/mimes.php for .xls files.
      • -
      • Added 'proxy_ips' config item to whitelist reverse proxy servers from which to trust the HTTP_X_FORWARDED_FOR header to - to determine the visitor's IP address.
      • -
      • Improved accuracy of Upload::is_allowed_filetype() for images (#6715)
      • -
      -
    • -
    - -

    Bug fixes for 1.7.1

    -
      -
    • Database -
        -
      • Fixed a bug when doing 'random' on order_by() (#5706).
      • -
      • Fixed a bug where adding a primary key through Forge could fail (#5731).
      • -
      • Fixed a bug when using DB cache on multiple databases (#5737).
      • -
      • Fixed a bug where TRUNCATE was not considered a "write" query (#6619).
      • -
      • Fixed a bug where csv_from_result() was checking for a nonexistent method.
      • -
      • Fixed a bug _protect_identifiers() where it was improperly removing all pipe symbols from items
      • -
      -
    • -
    • Fixed assorted user guide typos or examples (#5998, #6093, #6259, #6339, #6432, #6521).
    • -
    • Fixed a bug in the MySQLi driver when no port is specified
    • -
    • Fixed a bug (#5702), in which the field label was not being fetched properly, when "matching" one field to another.
    • -
    • Fixed a bug in which identifers were not being escaped properly when reserved characters were used.
    • -
    • Fixed a bug with the regular expression used to protect submitted paragraph tags in auto typography.
    • -
    • Fixed a bug where double dashes within tag attributes were being converted to em dash entities.
    • -
    • Fixed a bug where double spaces within tag attributes were being converted to non-breaking space entities.
    • -
    • Fixed some accuracy issues with curly quotes in Typography::format_characters()
    • -
    • Changed a few docblock comments to reflect actual return values.
    • -
    • Fixed a bug with high ascii characters in subject and from email headers.
    • -
    • Fixed a bug in xss_clean() where whitespace following a validated character entity would not be preserved.
    • -
    • Fixed a bug where HTML comments and <pre> tags were being parsed in Typography::auto_typography().
    • -
    • Fixed a bug with non-breaking space cleanup in Typography::auto_typography().
    • -
    • Fixed a bug in database escaping where a compound statement (ie: SUM()) wasn't handled correctly with database prefixes.
    • -
    • Fixed a bug when an opening quote is preceded by a paragraph tag and immediately followed by another tag.
    • -
    • Fixed a bug in the Text Helper affecting some locales where word_censor() would not work on words beginning or ending with an accented character.
    • -
    • Fixed a bug in the Text Helper character limiter where the provided limit intersects the last word of the string.
    • -
    • Fixed a bug (#6342) with plural() in the Inflection helper with words ending in "y".
    • -
    • Fixed bug (#6517) where Routed URI segments returned by URI::rsegment() method were incorrect for the default controller.
    • -
    • Fixed a bug (#6706) in the Security Helper where xss_clean() was using a deprecated second argument.
    • -
    • Fixed a bug in the URL helper url_title() function where trailing periods were allowed at the end of a URL.
    • -
    • Fixed a bug (#6669) in the Email class when CRLF's are used for the newline character with headers when used with the "mail" protocol.
    • -
    • Fixed a bug (#6500) where URI::A_filter_uri() was exit()ing an error instead of using show_error().
    • -
    • Fixed a bug (#6592) in the File Helper where get_dir_file_info() where recursion was not occurring properly.
    • -
    • Tweaked Typography::auto_typography() for some edge-cases.
    • -
    - - -

    Version 1.7

    -

    Release Date: October 23, 2008
    -Hg Tag: 1.7.0

    - -
      -
    • Libraries -
        -
      • Added a new Form Validation Class. It simplifies setting rules and field names, supports arrays as field names, allows groups of validation rules to be saved in a config file, and adds some helper functions for use in view files. Please note that the old Validation class is now deprecated. We will leave it in the library folder for some time so that existing applications that use it will not break, but you are encouraged to migrate to the new version.
      • -
      • Updated the Sessions class so that any custom data being saved gets stored to a database rather than the session cookie (assuming you are using a database to store session data), permitting much more data to be saved.
      • -
      • Added the ability to store libraries in subdirectories within either the main "libraries" or the local application "libraries" folder. Please see the Loader class for more info.
      • -
      • Added the ability to assign library objects to your own variable names when you use $this->load->library(). Please see the Loader class for more info.
      • -
      • Added controller class/method info to Profiler class and support for multiple database connections.
      • -
      • Improved the "auto typography" feature and moved it out of the helper into its own Typography Class.
      • -
      • Improved performance and accuracy of xss_clean(), including reduction of false positives on image/file tests.
      • -
      • Improved Parser class to allow multiple calls to the parse() function. The output of each is appended in the output.
      • -
      • Added max_filename option to set a file name length limit in the File Upload Class.
      • -
      • Added set_status_header() function to Output class.
      • -
      • Modified Pagination class to only output the "First" link when the link for page one would not be shown.
      • -
      • Added support for mb_strlen in the Form Validation class so that multi-byte languages will calculate string lengths properly.
      • -
      -
    • -
    • Database -
        -
      • Improved Active Record class to allow full path column and table names: hostname.database.table.column. Also improved the alias handling.
      • -
      • Improved how table and column names are escaped and prefixed. It now honors full path names when adding prefixes and escaping.
      • -
      • Added Active Record caching feature to "update" and "delete" functions.
      • -
      • Added removal of non-printing control characters in escape_str() of DB drivers that do not have native PHP escaping mechanisms (mssql, oci8, odbc), to avoid potential SQL errors, and possible sources of SQL injection.
      • -
      • Added port support to MySQL, MySQLi, and MS SQL database drivers.
      • -
      • Added driver name variable in each DB driver, based on bug report #4436.
      • -
      -
    • -
    • Helpers -
        -
      • Added several new "setting" functions to the Form helper that allow POST data to be retrieved and set into forms. These are intended to be used on their own, or with the new Form Validation Class.
      • -
      • Added current_url() and uri_segments() to URL helper.
      • -
      • Altered auto_link() in the URL helper so that email addresses with "+" included will be linked.
      • -
      • Added meta() function to HTML helper.
      • -
      • Improved accuracy of calculations in Number helper.
      • -
      • Removed added newlines ("\n") from most form and html helper functions.
      • -
      • Tightened up validation in the Date helper function human_to_unix(), and eliminated the POSIX regex.
      • -
      • Updated Date helper to match the world's current time zones and offsets.
      • -
      • Modified url_title() in the URL helper to remove characters and digits that are part of - character entities, to allow dashes, underscores, and periods regardless of the $separator, and to allow uppercase characters.
      • -
      • Added support for arbitrary attributes in anchor_popup() of the URL helper.
      • -
      -
    • -
    • Other Changes -
        -
      • Added PHP Style Guide to docs.
      • -
      • Added sanitization in xss_clean() for a deprecated HTML tag that could be abused in user input in Internet Explorer.
      • -
      • Added a few openxml document mime types, and an additional mobile agent to mimes.php and user_agents.php respectively.
      • -
      • Added a file lock check during caching, before trying to write to the file.
      • -
      • Modified Cookie key cleaning to unset a few troublesome key names that can be present in certain environments, preventing CI from halting execution.
      • -
      • Changed the output of the profiler to use style attribute rather than clear, and added the id "codeigniter_profiler" to the container div.
      • -
      -
    • -
    - -

    Bug fixes for 1.7.0

    -
      -
    • Fixed bug in xss_clean() that could remove some desirable tag attributes.
    • -
    • Fixed assorted user guide typos or examples (#4807, #4812, #4840, #4862, #4864, #4899, #4930, #5006, #5071, #5158, #5229, #5254, #5351).
    • -
    • Fixed an edit from 1.6.3 that made the $robots array in user_agents.php go poof.
    • -
    • Fixed a bug in the Email library with quoted-printable encoding improperly encoding space and tab characters.
    • -
    • Modified XSS sanitization to no longer add semicolons after &[single letter], such as in M&M's, B&B, etc.
    • -
    • Modified XSS sanitization to no longer strip XHTML image tags of closing slashes.
    • -
    • Fixed a bug in the Session class when database sessions are used where upon session update all userdata would be errantly written to the session cookie.
    • -
    • Fixed a bug (#4536) in backups with the MySQL driver where some legacy code was causing certain characters to be double escaped.
    • -
    • Fixed a routing bug (#4661) that occurred when the default route pointed to a subfolder.
    • -
    • Fixed the spelling of "Dhaka" in the timezone_menu() function of the Date helper.
    • -
    • Fixed the spelling of "raspberry" in config/smileys.php.
    • -
    • Fixed incorrect parenthesis in form_open() function (#5135).
    • -
    • Fixed a bug that was ignoring case when comparing controller methods (#4560).
    • -
    • Fixed a bug (#4615) that was not setting SMTP authorization settings when using the initialize function.
    • -
    • Fixed a bug in highlight_code() in the Text helper that would leave a stray </span> in certain cases.
    • -
    • Fixed Oracle bug (#3306) that was preventing multiple queries in one action.
    • -
    • Fixed ODBC bug that was ignoring connection params due to its use of a constructor.
    • -
    • Fixed a DB driver bug with num_rows() that would cause an error with the Oracle driver.
    • -
    • Fixed MS SQL bug (#4915). Added brackets around database name in MS SQL driver when selecting the database, in the event that reserved characters are used in the name.
    • -
    • Fixed a DB caching bug (4718) in which the path was incorrect when no URI segments were present.
    • -
    • Fixed Image_lib class bug #4562. A path was not defined for NetPBM.
    • -
    • Fixed Image_lib class bug #4532. When cropping an image with identical height/width settings on output, a copy is made.
    • -
    • Fixed DB_driver bug (4900), in which a database error was not being logged correctly.
    • -
    • Fixed DB backup bug in which field names were not being escaped.
    • -
    • Fixed a DB Active Record caching bug in which multiple calls to cached data were not being honored.
    • -
    • Fixed a bug in the Session class that was disallowing slashes in the serialized array.
    • -
    • Fixed a Form Validation bug in which the "isset" error message was being trigged by the "required" rule.
    • -
    • Fixed a spelling error in a Loader error message.
    • -
    • Fixed a bug (5050) with IP validation with empty segments.
    • -
    • Fixed a bug in which the parser was being greedy if multiple identical sets of tags were encountered.
    • -
    - -

    Version 1.6.3

    -

    Release Date: June 26, 2008
    -Hg Tag: v1.6.3

    - -

    Version 1.6.3 is a security and maintenance release and is recommended for all users.

    -
      -
    • Database -
        -
      • Modified MySQL/MySQLi Forge class to give explicit names to keys
      • -
      • Added ability to set multiple column non-primary keys to the Forge class
      • -
      • Added ability to set additional database config values in DSN connections via the query string.
      • -
      -
    • -
    • Libraries -
        -
      • Set the mime type check in the Upload class to reference the global mimes variable.
      • -
      • Added support for query strings to the Pagination class, automatically detected or explicitly declared.
      • -
      • Added get_post() to the Input class.
      • -
      • Documented get() in the Input class.
      • -
      • Added the ability to automatically output language items as form labels in the Language class.
      • -
      -
    • -
    • Helpers - -
    • -
    • Other changes -
        -
      • Improved security in xss_clean().
      • -
      • Removed an unused Router reference in _display_cache().
      • -
      • Added ability to use xss_clean() to test images for XSS, useful for upload security.
      • -
      • Considerably expanded list of mobile user-agents in config/user_agents.php.
      • -
      • Charset information in the userguide has been moved above title for internationalization purposes (#4614).
      • -
      • Added "Using Associative Arrays In a Request Parameter" example to the XMLRPC userguide page.
      • -
      • Removed maxlength and size as automatically added attributes of form_input() in the form helper.
      • -
      • Documented the language file use of byte_format() in the number helper.
      • -
      -
    • -
    - - -

    Bug fixes for 1.6.3

    - -
      -
    • Added a language key for valid_emails in validation_lang.php.
    • -
    • Amended fixes for bug (#3419) with parsing DSN database connections.
    • -
    • Moved the _has_operators() function (#4535) into DB_driver from DB_active_rec.
    • -
    • Fixed a syntax error in upload_lang.php.
    • -
    • Fixed a bug (#4542) with a regular expression in the Image library.
    • -
    • Fixed a bug (#4561) where orhaving() wasn't properly passing values.
    • -
    • Removed some unused variables from the code (#4563).
    • -
    • Fixed a bug where having() was not adding an = into the statement (#4568).
    • -
    • Fixed assorted user guide typos or examples (#4574, #4706).
    • -
    • Added quoted-printable headers to Email class when the multi-part override is used.
    • -
    • Fixed a double opening <p> tag in the index pages of each system directory.
    • -
    - -

    Version 1.6.2

    -

    Release Date: May 13, 2008
    -Hg Tag: 1.6.2

    -
      -
    • Active Record -
        -
      • Added the ability to prevent escaping in having() clauses.
      • -
      • Added rename_table() into DBForge.
      • -
      • Fixed a bug that wasn't allowing escaping to be turned off if the value of a query was NULL.
      • -
      • DB Forge is now assigned to any models that exist after loading (#3457).
      • -
      -
    • -
    • Database -
        -
      • Added Strict Mode to database transactions.
      • -
      • Escape behaviour in where() clauses has changed; values in those with the "FALSE" argument are no longer escaped (ie: quoted).
      • -
      -
    • -
    • Config -
        -
      • Added 'application/vnd.ms-powerpoint' to list of mime types.
      • -
      • Added 'audio/mpg' to list of mime types.
      • -
      • Added new user-modifiable file constants.php containing file mode and fopen constants.
      • -
      • Added the ability to set CRLF settings via config in the Email class.
      • -
      -
    • -
    • Libraries -
        -
      • Added increased security for filename handling in the Upload library.
      • -
      • Added increased security for sessions for client-side data tampering.
      • -
      • The MySQLi forge class is now in sync with MySQL forge.
      • -
      • Added the ability to set CRLF settings via config in the Email class.
      • -
      • Unit Testing results are now colour coded, and a change was made to the default template of results.
      • -
      • Added a valid_emails rule to the Validation class.
      • -
      • The Zip class now exits within download().
      • -
      • The Zip class has undergone a substantial re-write for speed and clarity (thanks stanleyxu for the hard work and code contribution in bug report #3425!)
      • -
      -
    • -
    • Helpers -
        -
      • Added a Compatibility Helper for using some common PHP 5 functions safely in applications that might run on PHP 4 servers (thanks Seppo for the hard work and code contribution!)
      • -
      • Added form_button() in the Form helper.
      • -
      • Changed the radio() and checkbox() functions to default to not checked by default.
      • -
      • Added the ability to include an optional HTTP Response Code in the redirect() function of the URL Helper.
      • -
      • Modified img() in the HTML Helper to remove an unneeded space (#4208).
      • -
      • Modified anchor() in the URL helper to no longer add a default title= attribute (#4209).
      • -
      • The Download helper now exits within force_download().
      • -
      • Added get_dir_file_info(), get_file_info(), and get_mime_by_extension() to the File Helper.
      • -
      • Added symbolic_permissions() and octal_permissions() to the File helper.
      • -
      -
    • -
    • Plugins -
        -
      • Modified captcha generation to first look for the function imagecreatetruecolor, and fallback to imagecreate if it isn't available (#4226).
      • -
      -
    • -
    • Other - Changes -
        -
      • Added ability for xss_clean() to accept arrays.
      • -
      • Removed closing PHP tags from all PHP files to avoid accidental output and potential 'cannot modify headers' errors.
      • -
      • Removed "scripts" from the auto-load search path. Scripts were deprecated - in Version 1.4.1 (September 21, 2006). If you still need to use them for legacy reasons, they must now be manually loaded in each Controller.
      • -
      • Added a Reserved Names page to the userguide, and migrated reserved controller names into it.
      • -
      • Added a Common Functions page to the userguide for globally available functions.
      • -
      • Improved security and performance of xss_clean().
      • -
      -
    • -
    - -

    Bugfixes for 1.6.2

    -
      -
    • Fixed a bug where SET queries were not being handled as "write" queries.
    • -
    • Fixed a bug (#3191) with ORIG_PATH_INFO URI parsing.
    • -
    • Fixed a bug in DB Forge, when inserting an id field (#3456).
    • -
    • Fixed a bug in the table library that could cause identically constructed rows to be dropped (#3459).
    • -
    • Fixed DB Driver and MySQLi result driver checking for resources instead of objects (#3461).
    • -
    • Fixed an AR_caching error where it wasn't tracking table aliases (#3463).
    • -
    • Fixed a bug in AR compiling, where select statements with arguments got incorrectly escaped (#3478).
    • -
    • Fixed an incorrect documentation of $this->load->language (#3520).
    • -
    • Fixed bugs (#3523, #4350) in get_filenames() with recursion and problems with Windows when $include_path is used.
    • -
    • Fixed a bug (#4153) in the XML-RPC class preventing dateTime.iso8601 from being used.
    • -
    • Fixed an AR bug with or_where_not_in() (#4171).
    • -
    • Fixed a bug with xss_clean() that would add semicolons to GET URI variable strings.
    • -
    • Fixed a bug (#4206) in the Directory Helper where the directory resource was not being closed, and minor improvements.
    • -
    • Fixed a bug in the FTP library where delete_dir() was not working recursively (#4215).
    • -
    • Fixed a Validation bug when set_rules() is used with a non-array field name and rule (#4220).
    • -
    • Fixed a bug (#4223) where DB caching would not work for returned DB objects or multiple DB connections.
    • -
    • Fixed a bug in the Upload library that might output the same error twice (#4390).
    • -
    • Fixed an AR bug when joining with a table alias and table prefix (#4400).
    • -
    • Fixed a bug in the DB class testing the $params argument.
    • -
    • Fixed a bug in the Table library where the integer 0 in cell data would be displayed as a blank cell.
    • -
    • Fixed a bug in link_tag() of the URL helper where a key was passed instead of a value.
    • -
    • Fixed a bug in DB_result::row() that prevented it from returning individual fields with MySQL NULL values.
    • -
    • Fixed a bug where SMTP emails were not having dot transformation performed on lines that begin with a dot.
    • -
    • Fixed a bug in display_error() in the DB driver that was instantiating new Language and Exception objects, and not using the error heading.
    • -
    • Fixed a bug (#4413) where a URI containing slashes only e.g. 'http://example.com/index.php?//' would result in PHP errors
    • -
    • Fixed an array to string conversion error in the Validation library (#4425)
    • -
    • Fixed bug (#4451, #4299, #4339) where failed transactions will not rollback when debug mode is enabled.
    • -
    • Fixed a bug (#4506) with overlay_watermark() in the Image library preventing support for PNG-24s with alpha transparency
    • -
    • Fixed assorted user guide typos (#3453, #4364, #4379, #4399, #4408, #4412, #4448, #4488).
    • -
    - -

    Version 1.6.1

    -

    Release Date: February 12, 2008
    -Hg Tag: 1.6.1

    -
      -
    • Active Record - -
    • -
    • Database drivers -
        -
      • Added support for setting client character set and collation for MySQLi.
      • -
      -
    • -
    • Core Changes -
        -
      • Modified xss_clean() to be more intelligent with its handling of URL encoded strings.
      • -
      • Added $_SERVER, $_FILES, $_ENV, and $_SESSION to sanitization of globals.
      • -
      • Added a Path Helper.
      • -
      • Simplified _reindex_segments() in the URI class.
      • -
      • Escaped the '-' in the default 'permitted_uri_chars' config item, to prevent errors if developers just try to add additional characters to the end of the default expression.
      • -
      • Modified method calling to controllers to show a 404 when a private or protected method is accessed via a URL.
      • -
      • Modified framework initiated 404s to log the controller and method for invalid requests.
      • -
      -
    • -
    • Helpers -
        -
      • Modified get_filenames() in the File Helper to return FALSE if the $source_dir is not readable.
      • -
      -
    • -
    - - -

    Bugfixes for 1.6.1

    -
      -
    • Deprecated is_numeric as a validation rule. Use of numeric and integer are preferred.
    • -
    • Fixed bug (#3379) in DBForge with SQLite for table creation.
    • -
    • Made Active Record fully database prefix aware (#3384).
    • -
    • Fixed a bug where DBForge was outputting invalid SQL in Postgres by adding brackets around the tables in FROM.
    • -
    • Changed the behaviour of Active Record's update() to make the WHERE clause optional (#3395).
    • -
    • Fixed a bug (#3396) where certain POST variables would cause a PHP warning.
    • -
    • Fixed a bug in query binding (#3402).
    • -
    • Changed order of SQL keywords in the Profiler $highlight array so OR would not be highlighted before ORDER BY.
    • -
    • Fixed a bug (#3404) where the MySQLi driver was testing if $this->conn_id was a resource instead of an object.
    • -
    • Fixed a bug (#3419) connecting to a database via a DSN string.
    • -
    • Fixed a bug (#3445) where the routed segment array was not re-indexed to begin with 1 when the default controller is used.
    • -
    • Fixed assorted user guide typos.
    • -
    - - - -

    Version 1.6.0

    -

    Release Date: January 30, 2008

    -
      -
    • DBForge -
        -
      • Added DBForge to the database tools.
      • -
      • Moved create_database() and drop_database() into DBForge.
      • -
      • Added add_field(), add_key(), create_table(), drop_table(), add_column(), drop_column(), modify_column() into DBForge.
      • -
      -
    • - -
    • Active Record -
        -
      • Added protect_identifiers() in Active Record.
      • -
      • All AR queries are backticked if appropriate to the database.
      • -
      • Added where_in(), or_where_in(), where_not_in(), or_where_not_in(), not_like() and or_not_like() to Active Record.
      • -
      • Added support for limit() into update() and delete() statements in Active Record.
      • -
      • Added empty_table() and truncate_table() to Active Record.
      • -
      • Added the ability to pass an array of tables to the delete() statement in Active Record.
      • -
      • Added count_all_results() function to Active Record.
      • -
      • Added select_max(), select_min(), select_avg() and select_sum() to Active Record.
      • -
      • Added the ability to use aliases with joins in Active Record.
      • -
      • Added a third parameter to Active Record's like() clause to control where the wildcard goes.
      • -
      • Added a third parameter to set() in Active Record that withholds escaping data.
      • -
      • Changed the behaviour of variables submitted to the where() clause with no values to auto set "IS NULL"
      • -
      -
    • - -
    • Other Database Related -
        -
      • MySQL driver now requires MySQL 4.1+
      • -
      • Added $this->DB->save_queries variable to DB driver, enabling queries to get saved or not. Previously they were always saved.
      • -
      • Added $this->db->dbprefix() to manually add database prefixes.
      • -
      • Added 'random' as an order_by() option , and removed "rand()" as a listed option as it was MySQL only.
      • -
      • Added a check for NULL fields in the MySQL database backup utility.
      • -
      • Added "constrain_by_prefix" parameter to db->list_table() function. If set to TRUE it will limit the result to only table names with the current prefix.
      • -
      • Deprecated from Active Record; getwhere() for get_where(); groupby() for group_by(); havingor() for having_or(); orderby() for order_by; orwhere() for or_where(); and orlike() for or_like().
      • -
      • Modified csv_from_result() to output CSV data more in the spirit of basic rules of RFC 4180.
      • -
      • Added 'char_set' and 'dbcollat' database configuration settings, to explicitly set the client communication properly.
      • -
      • Removed 'active_r' configuration setting and replaced with a global $active_record setting, which is more - in harmony with the global nature of the behavior (#1834).
      • -
      -
    • - -
    • Core changes -
        -
      • Added ability to load multiple views, whose content will be appended to the output in the order loaded.
      • -
      • Added the ability to auto-load Models.
      • -
      • Reorganized the URI and Routes classes for better clarity.
      • -
      • Added Compat.php to allow function overrides for older versions of PHP or PHP environments missing certain extensions / libraries
      • -
      • Added memory usage, GET, URI string data, and individual query execution time to Profiler output.
      • -
      • Deprecated Scaffolding.
      • -
      • Added is_really_writable() to Common.php to provide a cross-platform reliable method of testing file/folder writability.
      • -
      -
    • - -
    • Libraries -
        -
      • Changed the load protocol of Models to allow for extension.
      • -
      • Strengthened the Encryption library to help protect against man in the middle attacks when MCRYPT_MODE_CBC mode is used.
      • -
      • Added Flashdata variables, session_id regeneration and configurable session update times to the Session class.
      • -
      • Removed 'last_visit' from the Session class.
      • -
      • Added a language entry for valid_ip validation error.
      • -
      • Modified prep_for_form() in the Validation class to accept arrays, adding support for POST array validation (via callbacks only)
      • -
      • Added an "integer" rule into the Validation library.
      • -
      • Added valid_base64() to the Validation library.
      • -
      • Documented clear() in the Image Processing library.
      • -
      • Changed the behaviour of custom callbacks so that they no longer trigger the "required" rule.
      • -
      • Modified Upload class $_FILES error messages to be more precise.
      • -
      • Moved the safe mode and auth checks for the Email library into the constructor.
      • -
      • Modified variable names in _ci_load() method of Loader class to avoid conflicts with view variables.
      • -
      • Added a few additional mime type variations for CSV.
      • -
      • Enabled the 'system' methods for the XML-RPC Server library, except for 'system.multicall' which is still disabled.
      • -
      -
    • - -
    • Helpers & Plugins -
        -
      • Added link_tag() to the HTML helper.
      • -
      • Added img() to the HTML helper.
      • -
      • Added ability to "extend" Helpers.
      • -
      • Added an email helper into core helpers.
      • -
      • Added strip_quotes() function to string helper.
      • -
      • Added reduce_multiples() function to string helper.
      • -
      • Added quotes_to_entities() function to string helper.
      • -
      • Added form_fieldset(), form_fieldset_close(), form_label(), and form_reset() function to form helper.
      • -
      • Added support for external urls in form_open().
      • -
      • Removed support for db_backup in MySQLi due to incompatible functions.
      • -
      • Javascript Calendar plugin now uses the months and days from the calendar language file, instead of hard-coded values, internationalizing it.
      • -
      -
    • - - -
    • Documentation Changes -
        -
      • Added Writing Documentation section for the community to use in writing their own documentation.
      • -
      • Added titles to all user manual pages.
      • -
      • Added attributes into <html> of userguide for valid html.
      • -
      • Added Zip Encoding Class to the table of contents of the userguide.
      • -
      • Moved part of the userguide menu javascript to an external file.
      • -
      • Documented distinct() in Active Record.
      • -
      • Documented the timezones() function in the Date Helper.
      • -
      • Documented unset_userdata in the Session class.
      • -
      • Documented 2 config options to the Database configuration page.
      • -
      -
    • -
    - -

    Bug fixes for Version 1.6.0

    - -
      -
    • Fixed a bug (#1813) preventing using $CI->db in the same application with returned database objects.
    • -
    • Fixed a bug (#1842) where the $this->uri->rsegments array would not include the 'index' method if routed to the controller without an implicit method.
    • -
    • Fixed a bug (#1872) where word_limiter() was not retaining whitespace.
    • -
    • Fixed a bug (#1890) in csv_from_result() where content that included the delimiter would break the file.
    • -
    • Fixed a bug (#2542)in the clean_email() method of the Email class to allow for non-numeric / non-sequential array keys.
    • -
    • Fixed a bug (#2545) in _html_entity_decode_callback() when 'global_xss_filtering' is enabled.
    • -
    • Fixed a bug (#2668) in the parser class where numeric data was ignored.
    • -
    • Fixed a bug (#2679) where the "previous" pagination link would get drawn on the first page.
    • -
    • Fixed a bug (#2702) in _object_to_array that broke some types of inserts and updates.
    • -
    • Fixed a bug (#2732) in the SQLite driver for PHP 4.
    • -
    • Fixed a bug (#2754) in Pagination to scan for non-positive num_links.
    • -
    • Fixed a bug (#2762) in the Session library where user agent matching would fail on user agents ending with a space.
    • -
    • Fixed a bug (#2784) $field_names[] vs $Ffield_names[] in postgres and sqlite drivers.
    • -
    • Fixed a bug (#2810) in the typography helper causing extraneous paragraph tags when string contains tags.
    • -
    • Fixed a bug (#2849) where arguments passed to a subfolder controller method would be incorrectly shifted, dropping the 3rd segment value.
    • -
    • Fixed a bug (#2858) which referenced a wrong variable in the Image class.
    • -
    • Fixed a bug (#2875)when loading plugin files as _plugin. and not _pi.
    • -
    • Fixed a bug (#2912) in get_filenames() in the File Helper where the array wasn't cleared after each call.
    • -
    • Fixed a bug (#2974) in highlight_phrase() that caused an error with slashes.
    • -
    • Fixed a bug (#3003) in the Encryption Library to support modes other than MCRYPT_MODE_ECB
    • -
    • Fixed a bug (#3015) in the User Agent library where more then 2 languages where not reported with languages().
    • -
    • Fixed a bug (#3017) in the Email library where some timezones were calculated incorrectly.
    • -
    • Fixed a bug (#3024) in which master_dim wasn't getting reset by clear() in the Image library.
    • -
    • Fixed a bug (#3156) in Text Helper highlight_code() causing PHP tags to be handled incorrectly.
    • -
    • Fixed a bug (#3166) that prevented num_rows from working in Oracle.
    • -
    • Fixed a bug (#3175) preventing certain libraries from working properly when autoloaded in PHP 4.
    • -
    • Fixed a bug (#3267) in the Typography Helper where unordered list was listed "un.
    • -
    • Fixed a bug (#3268) where the Router could leave '/' as the path.
    • -
    • Fixed a bug (#3279) where the Email class was sending the wrong Content-Transfer-Encoding for some character sets.
    • -
    • Fixed a bug (#3284) where the rsegment array would not be set properly if the requested URI contained more segments than the routed URI.
    • -
    • Removed extraneous load of $CFG in _display_cache() of the Output class (#3285).
    • -
    • Removed an extraneous call to loading models (#3286).
    • -
    • Fixed a bug (#3310) with sanitization of globals in the Input class that could unset CI's global variables.
    • -
    • Fixed a bug (#3314) which would cause the top level path to be deleted in delete_files() of the File helper.
    • -
    • Fixed a bug (#3328) where the smiley helper might return an undefined variable.
    • -
    • Fixed a bug (#3330) in the FTP class where a comparison wasn't getting made.
    • -
    • Removed an unused parameter from Profiler (#3332).
    • -
    • Fixed a bug in database driver where num_rows property wasn't getting updated.
    • -
    • Fixed a bug in the upload library when allowed_files wasn't defined.
    • -
    • Fixed a bug in word_wrap() of the Text Helper that incorrectly referenced an object.
    • -
    • Fixed a bug in Validation where valid_ip() wasn't called properly.
    • -
    • Fixed a bug in Validation where individual error messages for checkboxes wasn't supported.
    • -
    • Fixed a bug in captcha calling an invalid PHP function.
    • -
    • Fixed a bug in the cookie helper "set_cookie" function. It was not honoring the config settings.
    • -
    • Fixed a bug that was making validation callbacks required even when not set as such.
    • -
    • Fixed a bug in the XML-RPC library so if a type is specified, a more intelligent decision is made as to the default type.
    • -
    • Fixed an example of comma-separated emails in the email library documentation.
    • -
    • Fixed an example in the Calendar library for Showing Next/Previous Month Links.
    • -
    • Fixed a typo in the database language file.
    • -
    • Fixed a typo in the image language file "suppor" to "support".
    • -
    • Fixed an example for XML RPC.
    • -
    • Fixed an example of accept_charset() in the User Agent Library.
    • -
    • Fixed a typo in the docblock comments that had CodeIgniter spelled CodeIgnitor.
    • -
    • Fixed a typo in the String Helper (uniquid changed to uniqid).
    • -
    • Fixed typos in the email Language class (email_attachment_unredable, email_filed_smtp_login), and FTP Class (ftp_unable_to_remame).
    • -
    • Added a stripslashes() into the Upload Library.
    • -
    • Fixed a series of grammatical and spelling errors in the language files.
    • -
    • Fixed assorted user guide typos.
    • -
    -

    Version 1.5.4

    -

    Release Date: July 12, 2007

    -
      -
    • Added custom Language files to the autoload options.
    • -
    • Added stripslashes() to the _clean_input_data() function in the Input class when magic quotes is on so that data will always be un-slashed within the framework.
    • -
    • Added array to string into the profiler.
    • -
    • Added some additional mime types in application/config/mimes.php.
    • -
    • Added filename_security() method to Input library.
    • -
    • Added some additional arguments to the Inflection helper singular() to compensate for words ending in "s". Also added a force parameter to pluralize().
    • -
    • Added $config['charset'] to the config file. Default value is 'UTF-8', used in some string handling functions.
    • -
    • Fixed MSSQL insert_id().
    • -
    • Fixed a logic error in the DB trans_status() function. It was incorrectly returning TRUE on failure and FALSE on success.
    • -
    • Fixed a bug that was allowing multiple load attempts on extended classes.
    • -
    • Fixed a bug in the bootstrap file that was incorrectly attempting to discern the full server path even when it was explicity set by the user.
    • -
    • Fixed a bug in the escape_str() function in the MySQL driver.
    • -
    • Fixed a typo in the Calendar library
    • -
    • Fixed a typo in rpcs.php library
    • -
    • Fixed a bug in the Zip library, providing PC Zip file compatibility with Mac OS X
    • -
    • Fixed a bug in router that was ignoring the scaffolding route for optimization
    • -
    • Fixed an IP validation bug.
    • -
    • Fixed a bug in display of POST keys in the Profiler output
    • -
    • Fixed a bug in display of queries with characters that would be interpreted as HTML in the Profiler output
    • -
    • Fixed a bug in display of Email class print debugger with characters that would be interpreted as HTML in the debugging output
    • -
    • Fixed a bug in the Content-Transfer-Encoding of HTML emails with the quoted-printable MIME type
    • -
    • Fixed a bug where one could unset certain PHP superglobals by setting them via GET or POST data
    • -
    • Fixed an undefined function error in the insert_id() function of the PostgreSQL driver
    • -
    • Fixed various doc typos.
    • -
    • Documented two functions from the String helper that were missing from the user guide: trim_slashes() and reduce_double_slashes().
    • -
    • Docs now validate to XHTML 1 transitional
    • -
    • Updated the XSS Filtering to take into account the IE expression() ability and improved certain deletions to prevent possible exploits
    • -
    • Modified the Router so that when Query Strings are Enabled, the controller trigger and function trigger values are sanitized for filename include security.
    • -
    • Modified the is_image() method in the Upload library to take into account Windows IE 6/7 eccentricities when dealing with MIMEs
    • -
    • Modified XSS Cleaning routine to be more performance friendly and compatible with PHP 5.2's new PCRE backtrack and recursion limits.
    • -
    • Modified the URL Helper to type cast the $title as a string in case a numeric value is supplied
    • -
    • Modified Form Helper form_dropdown() to type cast the keys and values of the options array as strings, allowing numeric values to be properly set as 'selected'
    • -
    • Deprecated the use if is_numeric() in various places since it allows periods. Due to compatibility problems with ctype_digit(), making it unreliable in some installations, the following regular expression was used instead: preg_match("/[^0-9]/", $n)
    • -
    • Deprecated: APPVER has been deprecated and replaced with CI_VERSION for clarity.
    • -
    -

    Version 1.5.3

    -

    Release Date: April 15, 2007

    -
      -
    • Added array to string into the profiler
    • -
    • Code Igniter references updated to CodeIgniter
    • -
    • pMachine references updated to EllisLab
    • -
    • Fixed a bug in the repeater function of string helper.
    • -
    • Fixed a bug in ODBC driver
    • -
    • Fixed a bug in result_array() that was returning an empty array when no result is produced.
    • -
    • Fixed a bug in the redirect function of the url helper.
    • -
    • Fixed an undefined variable in Loader
    • -
    • Fixed a version bug in the Postgres driver
    • -
    • Fixed a bug in the textarea function of the form helper for use with strings
    • -
    • Fixed doc typos.
    • -
    -

    Version 1.5.2

    -

    Release Date: February 13, 2007

    -
      -
    • Added subversion information to the downloads page.
    • -
    • Added support for captions in the Table Library
    • -
    • Fixed a bug in the download_helper that was causing Internet Explorer to load rather than download
    • -
    • Fixed a bug in the Active Record Join function that was not taking table prefixes into consideration.
    • -
    • Removed unescaped variables in error messages of Input and Router classes
    • -
    • Fixed a bug in the Loader that was causing errors on Libraries loaded twice. A debug message is now silently made in the log.
    • -
    • Fixed a bug in the form helper that gave textarea a value attribute
    • -
    • Fixed a bug in the Image Library that was ignoring resizing the same size image
    • -
    • Fixed some doc typos.
    • -
    - - -

    Version 1.5.1

    -

    Release Date: November 23, 2006

    -
      -
    • Added support for submitting arrays of libraries in the $this->load->library function.
    • -
    • Added support for naming custom library files in lower or uppercase.
    • -
    • Fixed a bug related to output buffering.
    • -
    • Fixed a bug in the active record class that was not resetting query data after a completed query.
    • -
    • Fixed a bug that was suppressing errors in controllers.
    • -
    • Fixed a problem that can cause a loop to occur when the config file is missing.
    • -
    • Fixed a bug that occurred when multiple models were loaded with the third parameter set to TRUE.
    • -
    • Fixed an oversight that was not unsetting globals properly in the input sanitize function.
    • -
    • Fixed some bugs in the Oracle DB driver.
    • -
    • Fixed an incorrectly named variable in the MySQLi result driver.
    • -
    • Fixed some doc typos.
    • -
    -

    Version 1.5.0.1

    -

    Release Date: October 31, 2006

    -
      -
    • Fixed a problem in which duplicate attempts to load helpers and classes were not being stopped.
    • -
    • Fixed a bug in the word_wrap() helper function.
    • -
    • Fixed an invalid color Hex number in the Profiler class.
    • -
    • Fixed a corrupted image in the user guide.
    • -
    - - - -

    Version 1.5.0

    -

    Release Date: October 30, 2006

    - -
      -
    • Added DB utility class, permitting DB backups, CVS or XML files from DB results, and various other functions.
    • -
    • Added Database Caching Class.
    • -
    • Added transaction support to the database classes.
    • -
    • Added Profiler Class which generates a report of Benchmark execution times, queries, and POST data at the bottom of your pages.
    • -
    • Added User Agent Library which allows browsers, robots, and mobile devises to be identified.
    • -
    • Added HTML Table Class , enabling tables to be generated from arrays or database results.
    • -
    • Added Zip Encoding Library.
    • -
    • Added FTP Library.
    • -
    • Added the ability to extend libraries and extend core classes, in addition to being able to replace them.
    • -
    • Added support for storing models within sub-folders.
    • -
    • Added Download Helper.
    • -
    • Added simple_query() function to the database classes
    • -
    • Added standard_date() function to the Date Helper.
    • -
    • Added $query->free_result() to database class.
    • -
    • Added $query->list_fields() function to database class
    • -
    • Added $this->db->platform() function
    • -
    • Added new File Helper: get_filenames()
    • -
    • Added new helper: Smiley Helper
    • -
    • Added support for <ul> and <ol> lists in the HTML Helper
    • -
    • Added the ability to rewrite short tags on-the-fly, converting them to standard PHP statements, for those servers that do not support short tags. This allows the cleaner syntax to be used regardless of whether it's supported by the server.
    • -
    • Added the ability to rename or relocate the "application" folder.
    • -
    • Added more thorough initialization in the upload class so that all class variables are reset.
    • -
    • Added "is_numeric" to validation, which uses the native PHP is_numeric function.
    • -
    • Improved the URI handler to make it more reliable when the $config['uri_protocol'] item is set to AUTO.
    • -
    • Moved most of the functions in the Controller class into the Loader class, allowing fewer reserved function names for controllers when running under PHP 5.
    • -
    • Updated the DB Result class to return an empty array when $query->result() doesn't produce a result.
    • -
    • Updated the input->cookie() and input->post() functions in Input Class to permit arrays contained cookies that are arrays to be run through the XSS filter.
    • -
    • Documented three functions from the Validation class that were missing from the user guide: set_select(), set_radio(), and set_checkbox().
    • -
    • Fixed a bug in the Email class related to SMTP Helo data.
    • -
    • Fixed a bug in the word wrapping helper and function in the email class.
    • -
    • Fixed a bug in the validation class.
    • -
    • Fixed a bug in the typography helper that was incorrectly wrapping block level elements in paragraph tags.
    • -
    • Fixed a problem in the form_prep() function that was double encoding entities.
    • -
    • Fixed a bug that affects some versions of PHP when output buffering is nested.
    • -
    • Fixed a bug that caused CI to stop working when the PHP magic __get() or __set() functions were used within models or controllers.
    • -
    • Fixed a pagination bug that was permitting negative values in the URL.
    • -
    • Fixed an oversight in which the Loader class was not allowed to be extended.
    • -
    • Changed _get_config() to get_config() since the function is not a private one.
    • -
    • Deprecated "init" folder. Initialization happens automatically now. Please see documentation.
    • -
    • Deprecated $this->db->field_names() USE $this->db->list_fields()
    • -
    • Deprecated the $config['log_errors'] item from the config.php file. Instead, $config['log_threshold'] can be set to "0" to turn it off.
    • -
    - - - - -

    Version 1.4.1

    -

    Release Date: September 21, 2006

    - -
      -
    • Added a new feature that passes URI segments directly to your function calls as parameters. See the Controllers page for more info.
    • -
    • Added support for a function named _output(), which when used in your controllers will received the final rendered output from the output class. More info in the Controllers page.
    • -
    • Added several new functions in the URI Class to let you retrieve and manipulate URI segments that have been re-routed using the URI Routing feature. Previously, the URI class did not permit you to access any re-routed URI segments, but now it does.
    • -
    • Added $this->output->set_header() function, which allows you to set server headers.
    • -
    • Updated plugins, helpers, and language classes to allow your application folder to contain its own plugins, helpers, and language folders. Previously they were always treated as global for your entire installation. If your application folder contains any of these resources they will be used instead the global ones.
    • -
    • Added Inflector helper.
    • -
    • Added element() function in the array helper.
    • -
    • Added RAND() to active record orderby() function.
    • -
    • Added delete_cookie() and get_cookie() to Cookie helper, even though the input class has a cookie fetching function.
    • -
    • Added Oracle database driver (still undergoing testing so it might have some bugs).
    • -
    • Added the ability to combine pseudo-variables and php variables in the template parser class.
    • -
    • Added output compression option to the config file.
    • -
    • Removed the is_numeric test from the db->escape() function.
    • -
    • Fixed a MySQLi bug that was causing error messages not to contain proper error data.
    • -
    • Fixed a bug in the email class which was causing it to ignore explicitly set alternative headers.
    • -
    • Fixed a bug that was causing a PHP error when the Exceptions class was called within the get_config() function since it was causing problems.
    • -
    • Fixed an oversight in the cookie helper in which the config file cookie settings were not being honored.
    • -
    • Fixed an oversight in the upload class. An item mentioned in the 1.4 changelog was missing.
    • -
    • Added some code to allow email attachments to be reset when sending batches of email.
    • -
    • Deprecated the application/scripts folder. It will continue to work for legacy users, but it is recommended that you create your own -libraries or models instead. It was originally added before CI had user libraries or models, but it's not needed anymore.
    • -
    • Deprecated the $autoload['core'] item from the autoload.php file. Instead, please now use: $autoload['libraries']
    • -
    • Deprecated the following database functions: $this->db->smart_escape_str() and $this->db->fields().
    • -
    - - - -

    Version 1.4.0

    -

    Release Date: September 17, 2006

    - -
      -
    • Added Hooks feature, enabling you to tap into and modify the inner workings of the framework without hacking the core files.
    • -
    • Added the ability to organize controller files into sub-folders. Kudos to Marco for suggesting this (and the next two) feature.
    • -
    • Added regular expressions support for routing rules.
    • -
    • Added the ability to remap function calls within your controllers.
    • -
    • Added the ability to replace core system classes with your own classes.
    • -
    • Added support for % character in URL.
    • -
    • Added the ability to supply full URLs using the anchor() helper function.
    • -
    • Added mode parameter to file_write() helper.
    • -
    • Added support for changing the port number in the Postgres driver.
    • -
    • Moved the list of "allowed URI characters" out of the Router class and into the config file.
    • -
    • Moved the MIME type array out of the Upload class and into its own file in the applications/config/ folder.
    • -
    • Updated the Upload class to allow the upload field name to be set when calling do_upload().
    • -
    • Updated the Config Library to be able to load config files silently, and to be able to assign config files to their own index (to avoid collisions if you use multiple config files).
    • -
    • Updated the URI Protocol code to allow more options so that URLs will work more reliably in different environments.
    • -
    • Updated the form_open() helper to allow the GET method to be used.
    • -
    • Updated the MySQLi execute() function with some code to help prevent lost connection errors.
    • -
    • Updated the SQLite Driver to check for object support before attempting to return results as objects. If unsupported it returns an array.
    • -
    • Updated the Models loader function to allow multiple loads of the same model.
    • -
    • Updated the MS SQL driver so that single quotes are escaped.
    • -
    • Updated the Postgres and ODBC drivers for better compatibility.
    • -
    • Removed a strtolower() call that was changing URL segments to lower case.
    • -
    • Removed some references that were interfering with PHP 4.4.1 compatibility.
    • -
    • Removed backticks from Postgres class since these are not needed.
    • -
    • Renamed display() to _display() in the Output class to make it clear that it's a private function.
    • -
    • Deprecated the hash() function due to a naming conflict with a native PHP function with the same name. Please use dohash() instead.
    • -
    • Fixed an bug that was preventing the input class from unsetting GET variables.
    • -
    • Fixed a router bug that was making it too greedy when matching end segments.
    • -
    • Fixed a bug that was preventing multiple discrete database calls.
    • -
    • Fixed a bug in which loading a language file was producing a "file contains no data" message.
    • -
    • Fixed a session bug caused by the XSS Filtering feature inadvertently changing the case of certain words.
    • -
    • Fixed some missing prefixes when using the database prefix feature.
    • -
    • Fixed a typo in the Calendar class (cal_november).
    • -
    • Fixed a bug in the form_checkbox() helper.
    • -
    • Fixed a bug that was allowing the second segment of the URI to be identical to the class name.
    • -
    • Fixed an evaluation bug in the database initialization function.
    • -
    • Fixed a minor bug in one of the error messages in the language class.
    • -
    • Fixed a bug in the date helper timespan function.
    • -
    • Fixed an undefined variable in the DB Driver class.
    • -
    • Fixed a bug in which dollar signs used as binding replacement values in the DB class would be treated as RegEx back-references.
    • -
    • Fixed a bug in the set_hash() function which was preventing MD5 from being used.
    • -
    • Fixed a couple bugs in the Unit Testing class.
    • -
    • Fixed an incorrectly named variable in the Validation class.
    • -
    • Fixed an incorrectly named variable in the URI class.
    • -
    • Fixed a bug in the config class that was preventing the base URL from being called properly.
    • -
    • Fixed a bug in the validation class that was not permitting callbacks if the form field was empty.
    • -
    • Fixed a problem that was preventing scaffolding from working properly with MySQLi.
    • -
    • Fixed some MS SQL bugs.
    • -
    • Fixed some doc typos.
    • -
    - - - -

    Version 1.3.3

    -

    Release Date: June 1, 2006

    - -
      - -
    • Models do not connect automatically to the database as of this version. More info here.
    • -
    • Updated the Sessions class to utilize the active record class when running session related queries. Previously the queries assumed MySQL syntax.
    • -
    • Updated alternator() function to re-initialize when called with no arguments, allowing multiple calls.
    • -
    • Fixed a bug in the active record "having" function.
    • -
    • Fixed a problem in the validation class which was making checkboxes be ignored when required.
    • -
    • Fixed a bug in the word_limiter() helper function. It was cutting off the fist word.
    • -
    • Fixed a bug in the xss_clean function due to a PHP bug that affects some versions of html_entity_decode.
    • -
    • Fixed a validation bug that was preventing rules from being set twice in one controller.
    • -
    • Fixed a calendar bug that was not letting it use dynamically loaded languages.
    • -
    • Fixed a bug in the active record class when using WHERE clauses with LIKE
    • -
    • Fixed a bug in the hash() security helper.
    • -
    • Fixed some typos.
    • -
    - - - - -

    Version 1.3.2

    -

    Release Date: April 17, 2006

    - -
      -
    • Changed the behavior of the validation class such that if a "required" rule is NOT explicitly stated for a field then all other tests get ignored.
    • -
    • Fixed a bug in the Controller class that was causing it to look in the local "init" folder instead of the main system one.
    • -
    • Fixed a bug in the init_pagination file. The $config item was not being set correctly.
    • -
    • Fixed a bug in the auto typography helper that was causing inconsistent behavior.
    • -
    • Fixed a couple bugs in the Model class.
    • -
    • Fixed some documentation typos and errata.
    • -
    - - - -

    Version 1.3.1

    -

    Release Date: April 11, 2006

    - -
      -
    • Added a Unit Testing Library.
    • -
    • Added the ability to pass objects to the insert() and update() database functions. -This feature enables you to (among other things) use your Model class variables to run queries with. See the Models page for details.
    • -
    • Added the ability to pass objects to the view loading function: $this->load->view('my_view', $object);
    • -
    • Added getwhere function to Active Record class.
    • -
    • Added count_all function to Active Record class.
    • -
    • Added language file for scaffolding and fixed a scaffolding bug that occurs when there are no rows in the specified table.
    • -
    • Added $this->db->last_query(), which allows you to view your last query that was run.
    • -
    • Added a new mime type to the upload class for better compatibility.
    • -
    • Changed how cache files are read to prevent PHP errors if the cache file contains an XML tag, which PHP wants to interpret as a short tag.
    • -
    • Fixed a bug in a couple of the active record functions (where and orderby).
    • -
    • Fixed a bug in the image library when realpath() returns false.
    • -
    • Fixed a bug in the Models that was preventing libraries from being used within them.
    • -
    • Fixed a bug in the "exact_length" function of the validation class.
    • -
    • Fixed some typos in the user guide
    • -
    - - -

    Version 1.3

    -

    Release Date: April 3, 2006

    - -
      -
    • Added support for Models.
    • -
    • Redesigned the database libraries to support additional RDBMs (Postgres, MySQLi, etc.).
    • -
    • Redesigned the Active Record class to enable more varied types of queries with simpler syntax, and advanced features like JOINs.
    • -
    • Added a feature to the database class that lets you run custom function calls.
    • -
    • Added support for private functions in your controllers. Any controller function name that starts with an underscore will not be served by a URI request.
    • -
    • Added the ability to pass your own initialization parameters to your custom core libraries when using $this->load->library()
    • -
    • Added support for running standard query string URLs. These can be optionally enabled in your config file.
    • -
    • Added the ability to specify a "suffix", which will be appended to your URLs. For example, you could add .html to your URLs, making them appear static. This feature is enabled in your config file.
    • -
    • Added a new error template for use with native PHP errors.
    • -
    • Added "alternator" function in the string helpers.
    • -
    • Removed slashing from the input class. After much debate we decided to kill this feature.
    • -
    • Change the commenting style in the scripts to the PEAR standard so that IDEs and tools like phpDocumenter can harvest the comments.
    • -
    • Added better class and function name-spacing to avoid collisions with user developed classes. All CodeIgniter classes are now prefixed with CI_ and -all controller methods are prefixed with _ci to avoid controller collisions. A list of reserved function names can be found here.
    • -
    • Redesigned how the "CI" super object is referenced, depending on whether PHP 4 or 5 is being run, since PHP 5 allows a more graceful way to manage objects that utilizes a bit less resources.
    • -
    • Deprecated: $this->db->use_table() has been deprecated. Please read the Active Record page for information.
    • -
    • Deprecated: $this->db->smart_escape_str() has been deprecated. Please use this instead: $this->db->escape()
    • -
    • Fixed a bug in the exception handler which was preventing some PHP errors from showing up.
    • -
    • Fixed a typo in the URI class. $this->total_segment() should be plural: $this->total_segments()
    • -
    • Fixed some typos in the default calendar template
    • -
    • Fixed some typos in the user guide
    • -
    - - - - - - - - -

    Version 1.2

    -

    Release Date: March 21, 2006

    - -
      -
    • Redesigned some internal aspects of the framework to resolve scoping problems that surfaced during the beta tests. The problem was most notable when instantiating classes in your constructors, particularly if those classes in turn did work in their constructors.
    • -
    • Added a global function named get_instance() allowing the main CodeIgniter object to be accessible throughout your own classes.
    • -
    • Added new File Helper: delete_files()
    • -
    • Added new URL Helpers: base_url(), index_page()
    • -
    • Added the ability to create your own core libraries and store them in your local application directory.
    • -
    • Added an overwrite option to the Upload class, enabling files to be overwritten rather than having the file name appended.
    • -
    • Added Javascript Calendar plugin.
    • -
    • Added search feature to user guide. Note: This is done using Google, which at the time of this writing has not crawled all the pages of the docs.
    • -
    • Updated the parser class so that it allows tag pars within other tag pairs.
    • -
    • Fixed a bug in the DB "where" function.
    • -
    • Fixed a bug that was preventing custom config files to be auto-loaded.
    • -
    • Fixed a bug in the mysql class bind feature that prevented question marks in the replacement data.
    • -
    • Fixed some bugs in the xss_clean function
    • -
    - - - - - -

    Version Beta 1.1

    -

    Release Date: March 10, 2006

    - -
      -
    • Added a Calendaring class.
    • -
    • Added support for running multiple applications that share a common CodeIgniter backend.
    • -
    • Moved the "uri protocol" variable from the index.php file into the config.php file
    • -
    • Fixed a problem that was preventing certain function calls from working within constructors.
    • -
    • Fixed a problem that was preventing the $this->load->library function from working in constructors.
    • -
    • Fixed a bug that occurred when the session class was loaded using the auto-load routine.
    • -
    • Fixed a bug that can happen with PHP versions that do not support the E_STRICT constant
    • -
    • Fixed a data type error in the form_radio function (form helper)
    • -
    • Fixed a bug that was preventing the xss_clean function from being called from the validation class.
    • -
    • Fixed the cookie related config names, which were incorrectly specified as $conf rather than $config
    • -
    • Fixed a pagination problem in the scaffolding.
    • -
    • Fixed a bug in the mysql class "where" function.
    • -
    • Fixed a regex problem in some code that trimmed duplicate slashes.
    • -
    • Fixed a bug in the br() function in the HTML helper
    • -
    • Fixed a syntax mistake in the form_dropdown function in the Form Helper.
    • -
    • Removed the "style" attributes form the form helpers.
    • -
    • Updated the documentation. Added "next/previous" links to each page and fixed various typos.
    • -
    - -

    Version Beta 1.0

    -

    Release Date: February 28, 2006

    -

    First publicly released version.

    - -
    - - - - - - - diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a6a2683aaae..ba6aaaac8fc 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -46,6 +46,8 @@ Release Date: Not Released $this->db->like() in the :doc:`Database Driver `. - Added $this->db->insert_batch() support to the OCI8 (Oracle) driver. + - Fixed a bug (#200) where MySQL queries would be malformed after calling + `count_all()` then `db->get()`. - Libraries @@ -108,6 +110,8 @@ Bug fixes for 2.1.0 - Fixed a bug (#484) - First time _csrf_set_hash() is called, hash is never set to the cookie (in Security.php). - Fixed a bug (#60) - Added _file_mime_type() method to the `File Uploading Library ` in order to fix a possible MIME-type injection. - Fixed a bug (#537) - Support for all wav type in browser. +- Fixed a bug (#200) - MySQL queries would be malformed after calling + count_all() then db->get(). Version 2.0.3 ============= From d08aa31a8b578a2e6687be4c9fe864fe08bd66d6 Mon Sep 17 00:00:00 2001 From: Kyle Farris Date: Fri, 14 Oct 2011 13:56:54 -0300 Subject: [PATCH 0060/5397] Ooops, removed duplicate entry in changelog. --- user_guide_src/source/changelog.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ba6aaaac8fc..b844fdcc657 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -46,8 +46,6 @@ Release Date: Not Released $this->db->like() in the :doc:`Database Driver `. - Added $this->db->insert_batch() support to the OCI8 (Oracle) driver. - - Fixed a bug (#200) where MySQL queries would be malformed after calling - `count_all()` then `db->get()`. - Libraries From 6f1fa5e6e40ae35bb8eeec359cb9f830b832c572 Mon Sep 17 00:00:00 2001 From: Kyle Farris Date: Fri, 14 Oct 2011 15:13:39 -0300 Subject: [PATCH 0061/5397] Fixed new line typo. --- user_guide_src/source/changelog.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b844fdcc657..7b89f178290 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -108,8 +108,7 @@ Bug fixes for 2.1.0 - Fixed a bug (#484) - First time _csrf_set_hash() is called, hash is never set to the cookie (in Security.php). - Fixed a bug (#60) - Added _file_mime_type() method to the `File Uploading Library ` in order to fix a possible MIME-type injection. - Fixed a bug (#537) - Support for all wav type in browser. -- Fixed a bug (#200) - MySQL queries would be malformed after calling - count_all() then db->get(). +- Fixed a bug (#200) - MySQL queries would be malformed after calling count_all() then db->get(). Version 2.0.3 ============= From b840a6704feb7a2439bbd3a9a23127dafc7b42f7 Mon Sep 17 00:00:00 2001 From: Seb Pollard Date: Sat, 22 Oct 2011 23:28:21 +0100 Subject: [PATCH 0062/5397] Fixed an issue with the Image_lib class not clearing width, height or create_thumb properties when calling the clear() method. --- system/libraries/Image_lib.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index beb463b3207..ceb31d1f044 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -116,7 +116,7 @@ public function __construct($props = array()) */ function clear() { - $props = array('source_folder', 'dest_folder', 'source_image', 'full_src_path', 'full_dst_path', 'new_image', 'image_type', 'size_str', 'quality', 'orig_width', 'orig_height', 'rotation_angle', 'x_axis', 'y_axis', 'create_fnc', 'copy_fnc', 'wm_overlay_path', 'wm_use_truetype', 'dynamic_output', 'wm_font_size', 'wm_text', 'wm_vrt_alignment', 'wm_hor_alignment', 'wm_padding', 'wm_hor_offset', 'wm_vrt_offset', 'wm_font_color', 'wm_use_drop_shadow', 'wm_shadow_color', 'wm_shadow_distance', 'wm_opacity'); + $props = array('source_folder', 'dest_folder', 'source_image', 'full_src_path', 'full_dst_path', 'new_image', 'image_type', 'size_str', 'quality', 'orig_width', 'orig_height', 'rotation_angle', 'x_axis', 'y_axis', 'create_fnc', 'copy_fnc', 'wm_overlay_path', 'wm_use_truetype', 'dynamic_output', 'wm_font_size', 'wm_text', 'wm_vrt_alignment', 'wm_hor_alignment', 'wm_padding', 'wm_hor_offset', 'wm_vrt_offset', 'wm_font_color', 'wm_use_drop_shadow', 'wm_shadow_color', 'wm_shadow_distance', 'wm_opacity', 'width', 'height'); foreach ($props as $val) { @@ -125,6 +125,9 @@ function clear() // special consideration for master_dim $this->master_dim = 'auto'; + + // special consideration for create_thumb + $this->create_thumb = FALSE; } // -------------------------------------------------------------------- From 35be644f6c912f6cdbe9392557ac38a9fbbc0416 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Mon, 24 Oct 2011 23:10:07 +0300 Subject: [PATCH 0063/5397] Added a "break 2;", When overriding the cache file in an other folder, it would try to load all files corresponding to this name and create an error because of a double file loading --- system/libraries/Driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index 8df137e74fc..30204d0756b 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -76,7 +76,7 @@ function __get($child) if (file_exists($filepath)) { include_once $filepath; - break; + break 2; } } } From 29130086c3b8df146c8c599f5ba47038efa10faf Mon Sep 17 00:00:00 2001 From: Thomas Traub Date: Fri, 4 Nov 2011 14:16:43 +0100 Subject: [PATCH 0064/5397] Add file exists check to prevent stat failed error warnings in the log These occur when creating .zips by passing data and creating an artificial fs structure inside the .zip --- system/libraries/Zip.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index 9101eecb406..8e4357051c1 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -100,7 +100,7 @@ function add_dir($directory) function _get_mod_time($dir) { // filemtime() will return false, but it does raise an error. - $date = (@filemtime($dir)) ? filemtime($dir) : getdate($this->now); + $date = (file_exists($dir) && @filemtime($dir)) ? filemtime($dir) : getdate($this->now); $time['file_mtime'] = ($date['hours'] << 11) + ($date['minutes'] << 5) + $date['seconds'] / 2; $time['file_mdate'] = (($date['year'] - 1980) << 9) + ($date['mon'] << 5) + $date['mday']; From d08a51047ac462ddc90ddd460fc424683aa8dc84 Mon Sep 17 00:00:00 2001 From: Gustav Bertram Date: Mon, 14 Nov 2011 15:10:41 +0200 Subject: [PATCH 0065/5397] Adding a default memcached config file - GWB --- application/config/memcached.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 application/config/memcached.php diff --git a/application/config/memcached.php b/application/config/memcached.php new file mode 100644 index 00000000000..d2ece65ccd5 --- /dev/null +++ b/application/config/memcached.php @@ -0,0 +1,17 @@ + '127.0.0.1', + 'port' => '11211', + 'weight' => '1' +); + +/* End of file memcached.php */ +/* Location: ./application/config/memcached.php */ \ No newline at end of file From ee04a1c8e25cc98aa5e68b328074efe6d6abf222 Mon Sep 17 00:00:00 2001 From: Gustav Bertram Date: Mon, 14 Nov 2011 15:19:21 +0200 Subject: [PATCH 0066/5397] Adding a default memcached config file - GWB --- application/config/memcached.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/application/config/memcached.php b/application/config/memcached.php index d2ece65ccd5..1b34aa683e3 100644 --- a/application/config/memcached.php +++ b/application/config/memcached.php @@ -3,14 +3,19 @@ | ------------------------------------------------------------------------- | Memcached settings | ------------------------------------------------------------------------- -| Memcached doesn't seem to like hostnames. Try use an IP first. -GWB +| To add another server, just add another set in the array. +| +| NOTE: Memcached doesn't seem to like hostnames. Try using an IP first. +| -GWB | */ -$config['default'] = array( - 'hostname' => '127.0.0.1', - 'port' => '11211', - 'weight' => '1' +$config = array( + 'default' => array( + 'hostname' => '127.0.0.1', + 'port' => '11211', + 'weight' => '1', + ), ); /* End of file memcached.php */ From 81dd22393368862760e1cfb30a0d73d070cd38af Mon Sep 17 00:00:00 2001 From: Shane Pearson Date: Fri, 18 Nov 2011 20:49:35 -0600 Subject: [PATCH 0067/5397] add method get_vars() to CI_Loader to retrieve all variables loaded with $this->load->vars() --- system/core/Loader.php | 14 ++++++++++++++ user_guide_src/source/changelog.rst | 1 + user_guide_src/source/libraries/loader.rst | 6 ++++++ 3 files changed, 21 insertions(+) diff --git a/system/core/Loader.php b/system/core/Loader.php index 4e14b54afea..d42dbbf386d 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -494,6 +494,20 @@ public function get_var($key) // -------------------------------------------------------------------- + /** + * Get Variables + * + * Retrieve all loaded variables + * + * @return array + */ + public function get_vars() + { + return $this->_ci_cached_vars; + } + + // -------------------------------------------------------------------- + /** * Load Helper * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a071e5a666f..49468e01551 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -50,6 +50,7 @@ Release Date: Not Released - Changed private functions in CI_URI to protected so MY_URI can override them. - Removed CI_CORE boolean constant from CodeIgniter.php (no longer Reactor and Core versions). + - Added method get_vars() to CI_Loader to retrieve all variables loaded with $this->load->vars() Bug fixes for 3.0 ------------------ diff --git a/user_guide_src/source/libraries/loader.rst b/user_guide_src/source/libraries/loader.rst index bbe2ed53076..2090404bf32 100644 --- a/user_guide_src/source/libraries/loader.rst +++ b/user_guide_src/source/libraries/loader.rst @@ -165,6 +165,12 @@ This function checks the associative array of variables available to your views. This is useful if for any reason a var is set in a library or another controller method using $this->load->vars(). +$this->load->get_vars() +=========================== + +This function retrieves all variables available to +your views. + $this->load->helper('file_name') ================================= From 0372f1ade3029c8363f1ed13545590c45d45d82f Mon Sep 17 00:00:00 2001 From: a-krebs Date: Wed, 23 Nov 2011 00:04:34 -0700 Subject: [PATCH 0068/5397] fix to issue #696 - make oci_execute calls inside num_rows non-committing, since they are only there to reset which row is next in line for oci_fetch calls and thus don't need to be committed. --- system/database/drivers/oci8/oci8_result.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index 3ec71a9d64b..f325592893d 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -57,11 +57,11 @@ 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); + @oci_execute($this->stmt_id, OCI_DEFAULT); if ($this->curs_id) { - @oci_execute($this->curs_id); + @oci_execute($this->curs_id, OCI_DEFAULT); } } From c11b5cea3c34cbb4f9f849b6940fa09c0e517f3d Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Wed, 23 Nov 2011 10:09:52 +0100 Subject: [PATCH 0069/5397] docx and xlsx have a zip/application mimetype --- application/config/mimes.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index f00e5b6ed63..100f7d4425d 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -93,8 +93,8 @@ 'avi' => 'video/x-msvideo', 'movie' => 'video/x-sgi-movie', 'doc' => 'application/msword', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip'), + 'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip'), 'word' => array('application/msword', 'application/octet-stream'), 'xl' => 'application/excel', 'eml' => 'message/rfc822', From 8ff2da1c7457cfd04a28776705cea64cbb96716a Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Wed, 23 Nov 2011 10:09:57 +0100 Subject: [PATCH 0070/5397] tmp_path does not exists, should be tmp_name --- system/libraries/Upload.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 05511b5d380..fe5907ab293 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1055,7 +1055,7 @@ protected function _file_mime_type($file) if (DIRECTORY_SEPARATOR !== '\\' && function_exists('exec')) { $output = array(); - @exec('file --brief --mime-type ' . escapeshellarg($file['tmp_path']), $output, $return_code); + @exec('file --brief --mime-type ' . escapeshellarg($file['tmp_name']), $output, $return_code); if ($return_code === 0 && strlen($output[0]) > 0) // A return status code != 0 would mean failed execution { $this->file_type = rtrim($output[0]); From 0ce875c2b75b17ad0697fb9bc9d77513b3d2a48e Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Wed, 23 Nov 2011 11:49:49 +0100 Subject: [PATCH 0071/5397] changelog updated --- user_guide/changelog.html | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/user_guide/changelog.html b/user_guide/changelog.html index 167616e570a..3fac8bb45aa 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -57,6 +57,23 @@

    Change Log

    +

    Version 2.1.1

    +

    Release Date: not yet released

    + +
      +
    • General Changes +
        +
      • Fixed support for docx, xlsx files in mimes.php.
      • +
      +
    • +
    + +

    Bug fixes for 2.1.1

    +
      +
    • Fixed a bug (#697) - A wrong array key was used in de Upload library to check for mime-types.
    • +
    + +

    Version 2.1.0

    Release Date: November 14, 2011

    From 8ed78098369cd445bae796d0cd31b34cbc02585a Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Wed, 23 Nov 2011 12:21:37 +0100 Subject: [PATCH 0072/5397] dutch typo --- user_guide/changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide/changelog.html b/user_guide/changelog.html index 3fac8bb45aa..a20f2795676 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -70,7 +70,7 @@

    Version 2.1.1

    Bug fixes for 2.1.1

      -
    • Fixed a bug (#697) - A wrong array key was used in de Upload library to check for mime-types.
    • +
    • Fixed a bug (#697) - A wrong array key was used in the Upload library to check for mime-types.
    From 511f225d855919b78df42ff802a513d84afa0693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=BAbal=20Mart=C3=ADn?= Date: Thu, 24 Nov 2011 14:43:45 +0100 Subject: [PATCH 0073/5397] Added dummy _reset_select() method to CI_DB_Driver class to allow Active Record class to be disabled. Otherwise a fatal error is triggered. --- system/database/DB_driver.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 3680b85c238..8f530b482a1 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1381,7 +1381,21 @@ function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifier return $item.$alias; } + + // -------------------------------------------------------------------- + /** + * Dummy method that allows Active Record class to be disabled + * + * This function is used extensively by every db driver. + * + * @access private + * @return void + */ + protected function _reset_select() + { + + } } From 9a05d2b0d838bb000a89ab9ea78a307b557768e7 Mon Sep 17 00:00:00 2001 From: John Nicely Date: Thu, 24 Nov 2011 10:50:39 -0800 Subject: [PATCH 0074/5397] Changed form_open() to compare $action against base_url() Checking for strpos($action, $CI->config->site_url()) === FALSE causes CSRF token to not be added in form_open() output. When site_url()'s first parameter ($uri) is empty, site_url's return value is the base URL plus the $CI->config->item('index_page') value. form_open() and CodeIgniter's URI routing do not require index.php to be in the URL, so any call to form_open() in which the $action parameter does not have index.php will always return false for the strpos() call. --- system/helpers/form_helper.php | 2 +- user_guide/changelog.html | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index d9305c00b9d..8733ae05329 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -65,7 +65,7 @@ function form_open($action = '', $attributes = '', $hidden = array()) $form .= '>'; // Add CSRF field if enabled, but leave it out for GET requests and requests to external websites - if ($CI->config->item('csrf_protection') === TRUE AND ! (strpos($action, $CI->config->site_url()) === FALSE OR strpos($form, 'method="get"'))) + if ($CI->config->item('csrf_protection') === TRUE AND ! (strpos($action, $CI->config->base_url()) === FALSE OR strpos($form, 'method="get"'))) { $hidden[$CI->security->get_csrf_token_name()] = $CI->security->get_csrf_hash(); } diff --git a/user_guide/changelog.html b/user_guide/changelog.html index a20f2795676..ae66add3302 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -71,6 +71,7 @@

    Version 2.1.1

    Bug fixes for 2.1.1

    • Fixed a bug (#697) - A wrong array key was used in the Upload library to check for mime-types.
    • +
    • Fixed a bug - form_open() compared $action against site_url() instead of base_url()
    From 78ec0603601001b6f0b4d0c4ef6087d32a133a63 Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Sun, 27 Nov 2011 00:48:56 -0500 Subject: [PATCH 0075/5397] Added tests for new increment_string --- .../helpers/string_helper_test.php | 65 +++++++++++-------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/tests/codeigniter/helpers/string_helper_test.php b/tests/codeigniter/helpers/string_helper_test.php index 5e0ee45deb1..2d7f96aa5ed 100644 --- a/tests/codeigniter/helpers/string_helper_test.php +++ b/tests/codeigniter/helpers/string_helper_test.php @@ -10,14 +10,14 @@ public function test_trim_slashes() '//Slashes//\/' => 'Slashes//\\', '/var/www/html/' => 'var/www/html' ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, trim_slashes($str)); } } - - // -------------------------------------------------------------------- + + // -------------------------------------------------------------------- public function test_strip_quotes() { @@ -25,30 +25,30 @@ public function test_strip_quotes() '"me oh my!"' => 'me oh my!', "it's a winner!" => 'its a winner!', ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, strip_quotes($str)); } } - // -------------------------------------------------------------------- - + // -------------------------------------------------------------------- + public function test_quotes_to_entities() { $strs = array( '"me oh my!"' => '"me oh my!"', "it's a winner!" => 'it's a winner!', ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, quotes_to_entities($str)); - } + } } - // -------------------------------------------------------------------- - + // -------------------------------------------------------------------- + public function test_reduce_double_slashes() { $strs = array( @@ -56,57 +56,56 @@ public function test_reduce_double_slashes() '//var/www/html/example.com/' => '/var/www/html/example.com/', '/var/www/html//index.php' => '/var/www/html/index.php' ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, reduce_double_slashes($str)); - } + } } - // -------------------------------------------------------------------- - + // -------------------------------------------------------------------- + public function test_reduce_multiples() { $strs = array( 'Fred, Bill,, Joe, Jimmy' => 'Fred, Bill, Joe, Jimmy', 'Ringo, John, Paul,,' => 'Ringo, John, Paul,' ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, reduce_multiples($str)); } - + $strs = array( 'Fred, Bill,, Joe, Jimmy' => 'Fred, Bill, Joe, Jimmy', 'Ringo, John, Paul,,' => 'Ringo, John, Paul' - ); + ); foreach ($strs as $str => $expect) { $this->assertEquals($expect, reduce_multiples($str, ',', TRUE)); - } + } } - - // -------------------------------------------------------------------- - + + // -------------------------------------------------------------------- + public function test_repeater() { $strs = array( 'a' => 'aaaaaaaaaa', ' ' => '          ', '
    ' => '









    ' - + ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, repeater($str, 10)); } - } - - // -------------------------------------------------------------------- + } + // -------------------------------------------------------------------- public function test_random_string() { @@ -114,5 +113,17 @@ public function test_random_string() $this->assertEquals(32, strlen(random_string('unique', 16))); $this->assertInternalType('string', random_string('numeric', 16)); } - + + // -------------------------------------------------------------------- + + public function test_increment_string() + { + $this->assertEquals('my-test_1', increment_string('my-test')); + $this->assertEquals('my-test-1', increment_string('my-test', '-')); + $this->assertEquals('file_5', increment_string('file_4')); + $this->assertEquals('file-5', increment_string('file-4', '-')); + $this->assertEquals('file-5', increment_string('file-4', '-')); + $this->assertEquals('file-1', increment_string('file', '-', '1')); + $this->assertEquals(124, increment_string('123', '')); + } } \ No newline at end of file From 051a317e1e51c2ab50920e3ced50732bc7041bd7 Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Sun, 27 Nov 2011 00:49:25 -0500 Subject: [PATCH 0076/5397] Fixed accept lang test to account for boolean results. --- .../codeigniter/libraries/User_agent_test.php | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/codeigniter/libraries/User_agent_test.php b/tests/codeigniter/libraries/User_agent_test.php index 277c12ed044..6f9e871962d 100644 --- a/tests/codeigniter/libraries/User_agent_test.php +++ b/tests/codeigniter/libraries/User_agent_test.php @@ -8,17 +8,17 @@ class UserAgent_test extends CI_TestCase { protected $_user_agent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27'; protected $_mobile_ua = 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7'; - + public function set_up() { // set a baseline user agent $_SERVER['HTTP_USER_AGENT'] = $this->_user_agent; - + $obj = new StdClass; $obj->agent = new CI_User_agent(); - + $this->ci_instance($obj); - + $this->agent = $obj->agent; } @@ -27,10 +27,10 @@ public function set_up() public function test_accept_lang() { $_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'en'; - - $this->assertEquals('en', $this->agent->accept_lang()); - + $this->assertTrue($this->agent->accept_lang()); unset($_SERVER['HTTP_ACCEPT_LANGUAGE']); + $this->assertTrue($this->agent->accept_lang('en')); + $this->assertFalse($this->agent->accept_lang('fr')); } // -------------------------------------------------------------------- @@ -70,19 +70,19 @@ public function test_browser_info() $this->assertEquals('', $this->agent->robot()); $this->assertEquals('', $this->agent->referrer()); } - + // -------------------------------------------------------------------- public function test_charsets() { $_SERVER['HTTP_ACCEPT_CHARSET'] = 'utf8'; - + $charsets = $this->agent->charsets(); - + $this->assertEquals('utf8', $charsets[0]); - + unset($_SERVER['HTTP_ACCEPT_CHARSET']); - + $this->assertFalse($this->agent->accept_charset()); } From 940761464e6f7788bdce0bad55f41850ad73eb89 Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Sun, 27 Nov 2011 00:59:07 -0500 Subject: [PATCH 0077/5397] Added tests for removing extra dashes in url title. --- tests/codeigniter/helpers/url_helper_test.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/codeigniter/helpers/url_helper_test.php b/tests/codeigniter/helpers/url_helper_test.php index ea3fb0e4f09..b5384eaef59 100644 --- a/tests/codeigniter/helpers/url_helper_test.php +++ b/tests/codeigniter/helpers/url_helper_test.php @@ -10,13 +10,25 @@ public function test_url_title() 'foo bar /' => 'foo-bar', '\ testing 12' => 'testing-12' ); - + foreach ($words as $in => $out) { $this->assertEquals($out, url_title($in, 'dash', TRUE)); - } + } } // -------------------------------------------------------------------- + public function test_url_title_extra_dashes() + { + $words = array( + '_foo bar_' => 'foo_bar', + '_What\'s wrong with CSS?_' => 'Whats_wrong_with_CSS' + ); + + foreach ($words as $in => $out) + { + $this->assertEquals($out, url_title($in, 'underscore')); + } + } } \ No newline at end of file From 32b6780d6e75a39e62784cec998ee2b5f69ee77e Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Sun, 27 Nov 2011 01:10:09 -0500 Subject: [PATCH 0078/5397] Added prep_url and auto_link tests --- tests/codeigniter/helpers/url_helper_test.php | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/codeigniter/helpers/url_helper_test.php b/tests/codeigniter/helpers/url_helper_test.php index b5384eaef59..30ba4a417c5 100644 --- a/tests/codeigniter/helpers/url_helper_test.php +++ b/tests/codeigniter/helpers/url_helper_test.php @@ -31,4 +31,27 @@ public function test_url_title_extra_dashes() $this->assertEquals($out, url_title($in, 'underscore')); } } + + // -------------------------------------------------------------------- + + public function test_prep_url() + { + $this->assertEquals('http://codeigniter.com', prep_url('codeigniter.com')); + $this->assertEquals('http://www.codeigniter.com', prep_url('www.codeigniter.com')); + } + + // -------------------------------------------------------------------- + + public function test_auto_link_url() + { + $strings = array( + 'www.codeigniter.com test' => 'http://www.codeigniter.com test', + 'This is my noreply@codeigniter.com test' => 'This is my noreply@codeigniter.com test', + ); + + foreach ($strings as $in => $out) + { + $this->assertEquals($out, auto_link($in, 'url')); + } + } } \ No newline at end of file From d90e1a0fb541ee94459a20cf8b0726aebaec9692 Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Sun, 27 Nov 2011 14:12:46 -0500 Subject: [PATCH 0079/5397] Added unit test to confirm pull request #675 --- tests/codeigniter/helpers/url_helper_test.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/codeigniter/helpers/url_helper_test.php b/tests/codeigniter/helpers/url_helper_test.php index 30ba4a417c5..51a8cc7c08f 100644 --- a/tests/codeigniter/helpers/url_helper_test.php +++ b/tests/codeigniter/helpers/url_helper_test.php @@ -47,6 +47,21 @@ public function test_auto_link_url() $strings = array( 'www.codeigniter.com test' => 'http://www.codeigniter.com test', 'This is my noreply@codeigniter.com test' => 'This is my noreply@codeigniter.com test', + '
    www.google.com' => '
    http://www.google.com', + ); + + foreach ($strings as $in => $out) + { + $this->assertEquals($out, auto_link($in, 'url')); + } + } + + // -------------------------------------------------------------------- + + public function test_pull_675() + { + $strings = array( + '
    www.google.com' => '
    http://www.google.com', ); foreach ($strings as $in => $out) From d92bd57f007e9561a37be8a8ccaf93a4f8948343 Mon Sep 17 00:00:00 2001 From: Repox Date: Thu, 1 Dec 2011 10:08:52 +0100 Subject: [PATCH 0080/5397] This fixes issue #725 --- system/database/DB_driver.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 3680b85c238..3952d72762a 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1015,8 +1015,14 @@ function call_function($function) else { $args = (func_num_args() > 1) ? array_splice(func_get_args(), 1) : null; - - return call_user_func_array($function, $args); + if (is_null($args)) + { + return call_user_func($function); + } + else + { + return call_user_func_array($function, $args); + } } } From 59654319d20a7ec406e7d6f15cf6804e94897d14 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Dec 2011 14:28:54 +0200 Subject: [PATCH 0081/5397] Hotfix for a file type detection bug in the Upload library --- system/libraries/Upload.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index fe5907ab293..ff3461586e4 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1042,14 +1042,17 @@ protected function _file_mime_type($file) if (function_exists('mime_content_type')) { $this->file_type = @mime_content_type($file['tmp_name']); - return; + if (strlen($this->file_type) > 0) // Turned out it's possible ... + { + return; + } } /* This is an ugly hack, but UNIX-type systems provide a native way to detect the file type, * which is still more secure than depending on the value of $_FILES[$field]['type']. * * Notes: - * - a 'W' in the substr() expression bellow, would mean that we're using Windows + * - the DIRECTORY_SEPARATOR comparison ensures that we're not on a Windows system * - many system admins would disable the exec() function due to security concerns, hence the function_exists() check */ if (DIRECTORY_SEPARATOR !== '\\' && function_exists('exec')) From f796655d37163e7fd046395ddfe765baf752ec77 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Dec 2011 15:00:36 +0200 Subject: [PATCH 0082/5397] Update a comment, just to be clearer --- system/libraries/Upload.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index ff3461586e4..506d1589770 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1042,7 +1042,7 @@ protected function _file_mime_type($file) if (function_exists('mime_content_type')) { $this->file_type = @mime_content_type($file['tmp_name']); - if (strlen($this->file_type) > 0) // Turned out it's possible ... + if (strlen($this->file_type) > 0) // Turns out it's possible that mime_content_type() returns FALSE or an empty string { return; } From 451aa026e3e82122cdd41cd8574894cc93610010 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Dec 2011 15:15:25 +0200 Subject: [PATCH 0083/5397] Update the change log --- user_guide/changelog.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user_guide/changelog.html b/user_guide/changelog.html index ae66add3302..272db5f377e 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -72,6 +72,7 @@

    Bug fixes for 2.1.1

    • Fixed a bug (#697) - A wrong array key was used in the Upload library to check for mime-types.
    • Fixed a bug - form_open() compared $action against site_url() instead of base_url()
    • +
    • Fixed a bug - CI_Upload::_file_mime_type() could've failed if mime_content_type() is used for the detection and returns FALSE.
    From 717253f5c77a11b1b997069ff53bd2d2ab2e538c Mon Sep 17 00:00:00 2001 From: Tomasz T Date: Fri, 2 Dec 2011 17:57:30 +0100 Subject: [PATCH 0084/5397] SELECT * FROM isn't that innocuous, changed to SELECT 1 --- system/database/drivers/postgre/postgre_forge.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php index 166cc4e6a64..ddbce6062e4 100644 --- a/system/database/drivers/postgre/postgre_forge.php +++ b/system/database/drivers/postgre/postgre_forge.php @@ -83,7 +83,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { if ($this->db->table_exists($table)) { - return "SELECT * FROM $table"; // Needs to return innocous but valid SQL statement + return "SELECT 1"; // Needs to return innocous but valid SQL statement } } From 98f85b177d6ebf6dbc3a2ec8313ef738eca2fbf2 Mon Sep 17 00:00:00 2001 From: Thomas Traub Date: Mon, 5 Dec 2011 14:58:29 +0100 Subject: [PATCH 0085/5397] Took out the now unnecessary error suppression --- system/libraries/Zip.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index 8e4357051c1..ef6c3e53081 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -99,8 +99,8 @@ function add_dir($directory) */ function _get_mod_time($dir) { - // filemtime() will return false, but it does raise an error. - $date = (file_exists($dir) && @filemtime($dir)) ? filemtime($dir) : getdate($this->now); + // filemtime() may return false, but raises an error for non-existing files + $date = (file_exists($dir) && filemtime($dir)) ? filemtime($dir) : getdate($this->now); $time['file_mtime'] = ($date['hours'] << 11) + ($date['minutes'] << 5) + $date['seconds'] / 2; $time['file_mdate'] = (($date['year'] - 1980) << 9) + ($date['mon'] << 5) + $date['mday']; From b9ec402de2ad190df899426f4bbcebbcc759d01f Mon Sep 17 00:00:00 2001 From: Tomasz T Date: Mon, 5 Dec 2011 15:28:33 +0100 Subject: [PATCH 0086/5397] changed create_table method to check whether a value returned from driver's forge is sql or bool (acts exactly as create_database) --- system/database/DB_forge.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index 1aa2334ea8f..78bf77a9fa7 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -205,6 +205,12 @@ function create_table($table = '', $if_not_exists = FALSE) $sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists); $this->_reset(); + + if (is_bool($sql)) + { + return $sql; + } + return $this->db->query($sql); } From c9fc88c09c1a0accdddd3710907fee2f5b42d7ad Mon Sep 17 00:00:00 2001 From: Tomasz T Date: Mon, 5 Dec 2011 15:30:05 +0100 Subject: [PATCH 0087/5397] changed _create_table to return true if table already exists --- system/database/drivers/postgre/postgre_forge.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php index ddbce6062e4..df0338e7383 100644 --- a/system/database/drivers/postgre/postgre_forge.php +++ b/system/database/drivers/postgre/postgre_forge.php @@ -81,9 +81,10 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) if ($if_not_exists === TRUE) { + // PostgreSQL doesn't support IF NOT EXISTS syntax so we check if table exists manually if ($this->db->table_exists($table)) { - return "SELECT 1"; // Needs to return innocous but valid SQL statement + return TRUE; } } From 7fcfbda4cd72d4198c9b45ac13bcbd47bf067b81 Mon Sep 17 00:00:00 2001 From: Thomas Traub Date: Mon, 5 Dec 2011 17:08:50 +0100 Subject: [PATCH 0088/5397] Update system/libraries/Zip.php --- system/libraries/Zip.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index ef6c3e53081..2fc30e4692d 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -100,7 +100,7 @@ function add_dir($directory) function _get_mod_time($dir) { // filemtime() may return false, but raises an error for non-existing files - $date = (file_exists($dir) && filemtime($dir)) ? filemtime($dir) : getdate($this->now); + $date = (file_exists($dir) && $filemtime = filemtime($dir)) ? $filemtime : getdate($this->now); $time['file_mtime'] = ($date['hours'] << 11) + ($date['minutes'] << 5) + $date['seconds'] / 2; $time['file_mdate'] = (($date['year'] - 1980) << 9) + ($date['mon'] << 5) + $date['mday']; From 5d4da1bae6f00a193db06e940cd59ebf9743b615 Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Mon, 5 Dec 2011 21:55:00 -0500 Subject: [PATCH 0089/5397] Added change log item for bug #608 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2bfae3fd7dc..c4fbb67b235 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -64,6 +64,7 @@ Bug fixes for 3.0 - Bug #419 - auto_link() now recognizes URLs that come after a word boundary. - Bug #724 - is_unique in form validation now checks that you are connected to a database. - Bug #647 - _get_mod_time() in Zip library no longer generates stat failed errors +- Bug #608 - Fixes an issue with the Image_lib class not clearing properties completely Version 2.1.0 ============= From 3cece7b27c965a9a6bc73d080f6df0a6ba681be0 Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Mon, 5 Dec 2011 22:10:12 -0500 Subject: [PATCH 0090/5397] Updated change log --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index c4fbb67b235..8dfe2492afd 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -65,6 +65,7 @@ Bug fixes for 3.0 - Bug #724 - is_unique in form validation now checks that you are connected to a database. - Bug #647 - _get_mod_time() in Zip library no longer generates stat failed errors - Bug #608 - Fixes an issue with the Image_lib class not clearing properties completely +- Fixed bugs (#157 and #174) - the Image_lib clear() function now resets all variables to their default values. Version 2.1.0 ============= From dba657efda6e057dc0c741dc449937c8ba5a029a Mon Sep 17 00:00:00 2001 From: Thomas Traub Date: Tue, 6 Dec 2011 06:30:37 +0100 Subject: [PATCH 0091/5397] Update system/libraries/Zip.php --- system/libraries/Zip.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index 2fc30e4692d..52f1bc3d0f2 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -100,8 +100,8 @@ function add_dir($directory) function _get_mod_time($dir) { // filemtime() may return false, but raises an error for non-existing files - $date = (file_exists($dir) && $filemtime = filemtime($dir)) ? $filemtime : getdate($this->now); - + $date = (file_exists($dir)) ? filemtime($dir): getdate($this->now); + $time['file_mtime'] = ($date['hours'] << 11) + ($date['minutes'] << 5) + $date['seconds'] / 2; $time['file_mdate'] = (($date['year'] - 1980) << 9) + ($date['mon'] << 5) + $date['mday']; From 17bcd2b5c8b994ca14cc19d31674258b07c905fc Mon Sep 17 00:00:00 2001 From: Tomasz T Date: Tue, 6 Dec 2011 12:36:16 +0100 Subject: [PATCH 0092/5397] updated changelog with dbforge fix --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 5c7fd8d5926..cbe6da28ae9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -60,6 +60,7 @@ Bug fixes for 3.0 language file. - Fixed a bug (#159, #163) that mishandled Active Record nested transactions because _trans_depth was not getting incremented. - Bug #419 - auto_link() now recognizes URLs that come after a word boundary. +- Fixed a bug where using $this->dbforge->create_table() with PostgreSQL database could lead to fetching whole table. Version 2.1.0 ============= From 59dbcda901f45c5183e976a0a2da7c7459294d05 Mon Sep 17 00:00:00 2001 From: toopay Date: Thu, 8 Dec 2011 20:42:41 +0700 Subject: [PATCH 0093/5397] Exception for sqlite --- system/database/drivers/pdo/pdo_driver.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 18a508b1533..457cf714ad2 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -90,7 +90,10 @@ function __construct($params) $this->_like_escape_chr = '!'; } - $this->hostname .= ";dbname=".$this->database; + if (strpos($this->hostname, 'sqlite') === FALSE) + { + $this->hostname .= ";dbname=".$this->database; + } $this->trans_enabled = FALSE; From 7a617a0bc0933685c803740c67535620599eb173 Mon Sep 17 00:00:00 2001 From: Zac Clancy Date: Thu, 8 Dec 2011 23:38:10 -0500 Subject: [PATCH 0094/5397] Fixed typo in introductory paragraph. --- user_guide_src/source/tutorial/create_news_items.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/tutorial/create_news_items.rst b/user_guide_src/source/tutorial/create_news_items.rst index 003b94bd815..794b67eed03 100644 --- a/user_guide_src/source/tutorial/create_news_items.rst +++ b/user_guide_src/source/tutorial/create_news_items.rst @@ -2,7 +2,7 @@ Create news items ################# -You now know how you can read data from a database using CodeIgnite, but +You now know how you can read data from a database using CodeIgniter, but you haven't written any information to the database yet. In this section you'll expand your news controller and model created earlier to include this functionality. From a49e381fde010a7a83845910c0f772fb139f0b1e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 9 Dec 2011 13:05:22 +0200 Subject: [PATCH 0095/5397] Improve CI_Upload::_file_mime_type() --- system/libraries/Upload.php | 102 +++++++++++++++++++++++++++--------- 1 file changed, 78 insertions(+), 24 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 506d1589770..564d6000e44 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1018,50 +1018,104 @@ protected function _prep_filename($filename) */ protected function _file_mime_type($file) { - // Use if the Fileinfo extension, if available (only versions above 5.3 support the FILEINFO_MIME_TYPE flag) - if ( (float) substr(phpversion(), 0, 3) >= 5.3 && function_exists('finfo_file')) + // We'll need this to validate the MIME info string (e.g. text/plain; charset=us-ascii) + $regexp = '/^([a-z\-]+\/[a-z0-9\-]+);\s.+$/'; + + /* Fileinfo extension - most reliable method + * + * Unfortunately, prior to PHP 5.3 - it's only available as a PECL extension and the + * more convenient FILEINFO_MIME_TYPE flag doesn't exist. + */ + if (function_exists('finfo_file')) { - $finfo = new finfo(FILEINFO_MIME_TYPE); - if ($finfo !== FALSE) // This is possible, if there is no magic MIME database file found on the system + $finfo = finfo_open(FILEINFO_MIME); + if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system { - $file_type = $finfo->file($file['tmp_name']); + $mime = @finfo_file($finfo, $file['tmp_name']); + finfo_close($finfo); /* According to the comments section of the PHP manual page, * it is possible that this function returns an empty string * for some files (e.g. if they don't exist in the magic MIME database) */ - if (strlen($file_type) > 1) + if (is_string($mime) && preg_match($regexp, $mime, $matches)) { - $this->file_type = $file_type; + $this->file_type = $matches[1]; return; } } } - // Fall back to the deprecated mime_content_type(), if available - if (function_exists('mime_content_type')) + /* This is an ugly hack, but UNIX-type systems provide a "native" way to detect the file type, + * which is still more secure than depending on the value of $_FILES[$field]['type'], and as it + * was reported in issue #750 (https://github.com/EllisLab/CodeIgniter/issues/750) - it's better + * than mime_content_type() as well, hence the attempts to try calling the command line with + * three different functions. + * + * Notes: + * - the DIRECTORY_SEPARATOR comparison ensures that we're not on a Windows system + * - many system admins would disable the exec(), shell_exec(), popen() and similar functions + * due to security concerns, hence the function_exists() checks + */ + if (DIRECTORY_SEPARATOR !== '\\') { - $this->file_type = @mime_content_type($file['tmp_name']); - if (strlen($this->file_type) > 0) // Turns out it's possible that mime_content_type() returns FALSE or an empty string + $cmd = 'file --brief --mime ' . escapeshellarg($file['tmp_name']) . ' 2>&1'; + + if (function_exists('exec')) { - return; + /* This might look confusing, as $mime is being populated with all of the output when set in the second parameter. + * However, we only neeed the last line, which is the actual return value of exec(), and as such - it overwrites + * anything that could already be set for $mime previously. This effectively makes the second parameter a dummy + * value, which is only put to allow us to get the return status code. + */ + $mime = @exec($cmd, $mime, $return_status); + if ($return_status === 0 && is_string($mime) && preg_match($regexp, $mime, $matches)) + { + $this->file_type = $matches[1]; + return; + } + } + + if ( (bool) @ini_get('safe_mode') === FALSE && function_exists('shell_exec')) + { + $mime = @shell_exec($cmd); + if (strlen($mime) > 0) + { + $mime = explode("\n", trim($mime)); + if (preg_match($regexp, $mime[(count($mime) - 1)], $matches)) + { + $this->file_type = $matches[1]; + return; + } + } + } + + if (function_exists('popen')) + { + $proc = @popen($cmd, 'r'); + if (is_resource($proc)) + { + $mime = @fread($test, 512); + @pclose($proc); + if ($mime !== FALSE) + { + $mime = explode("\n", trim($mime)); + if (preg_match($regexp, $mime[(count($mime) - 1)], $matches)) + { + $this->file_type = $matches[1]; + return; + } + } + } } } - /* This is an ugly hack, but UNIX-type systems provide a native way to detect the file type, - * which is still more secure than depending on the value of $_FILES[$field]['type']. - * - * Notes: - * - the DIRECTORY_SEPARATOR comparison ensures that we're not on a Windows system - * - many system admins would disable the exec() function due to security concerns, hence the function_exists() check - */ - if (DIRECTORY_SEPARATOR !== '\\' && function_exists('exec')) + // Fall back to the deprecated mime_content_type(), if available (still better than $_FILES[$field]['type']) + if (function_exists('mime_content_type')) { - $output = array(); - @exec('file --brief --mime-type ' . escapeshellarg($file['tmp_name']), $output, $return_code); - if ($return_code === 0 && strlen($output[0]) > 0) // A return status code != 0 would mean failed execution + $this->file_type = @mime_content_type($file['tmp_name']); + if (strlen($this->file_type) > 0) // It's possible that mime_content_type() returns FALSE or an empty string { - $this->file_type = rtrim($output[0]); return; } } From 2f93794ba928d7f70a38dd7d3813a2d17962a4e5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 9 Dec 2011 13:11:04 +0200 Subject: [PATCH 0096/5397] Update the ChangeLog --- user_guide/changelog.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/user_guide/changelog.html b/user_guide/changelog.html index 272db5f377e..7a5fcf222bc 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -66,6 +66,11 @@

    Version 2.1.1

  • Fixed support for docx, xlsx files in mimes.php.
  • +
  • Libraries + +
  • Bug fixes for 2.1.1

    From cde712ce354dcfd69f9c5e2b56ef7d6f1206d11a Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Fri, 9 Dec 2011 11:27:51 -0500 Subject: [PATCH 0097/5397] Added ability to change the separator value in the humanize function --- system/helpers/inflector_helper.php | 18 +++++++++--------- user_guide_src/source/changelog.rst | 1 + .../source/helpers/inflector_helper.rst | 6 ++++++ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index 513a9c54f8c..3393bda8fdf 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -5,9 +5,9 @@ * An open source application development framework for PHP 5.1.6 or newer * * NOTICE OF LICENSE - * + * * Licensed under the Open Software License version 3.0 - * + * * This source file is subject to the Open Software License (OSL 3.0) that is * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: @@ -84,7 +84,7 @@ function singular($str) '/(n)ews$/' => '\1\2ews', '/([^u])s$/' => '\1', ); - + foreach ($singular_rules as $rule => $replacement) { if (preg_match($rule, $result)) @@ -115,7 +115,7 @@ function singular($str) function plural($str, $force = FALSE) { $result = strval($str); - + $plural_rules = array( '/^(ox)$/' => '\1\2en', // ox '/([m|l])ouse$/' => '\1ice', // mouse, louse @@ -196,20 +196,20 @@ function underscore($str) /** * Humanize * - * Takes multiple words separated by underscores and changes them to spaces + * Takes multiple words separated by the separator and changes them to spaces * * @access public - * @param string + * @param string $str + * @param string $separator * @return str */ if ( ! function_exists('humanize')) { - function humanize($str) + function humanize($str, $separator = '_') { - return ucwords(preg_replace('/[_]+/', ' ', strtolower(trim($str)))); + return ucwords(preg_replace('/['.$separator.']+/', ' ', strtolower(trim($str)))); } } - /* End of file inflector_helper.php */ /* Location: ./system/helpers/inflector_helper.php */ \ No newline at end of file diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 205b087f570..6f41f451919 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -33,6 +33,7 @@ Release Date: Not Released - url_title() will now trim extra dashes from beginning and end. - Added XHTML Basic 1.1 doctype to :doc:`HTML Helper `. + - Changed humanize to include a second param for the separator. - Database diff --git a/user_guide_src/source/helpers/inflector_helper.rst b/user_guide_src/source/helpers/inflector_helper.rst index cf246b9ded3..cc46a185174 100644 --- a/user_guide_src/source/helpers/inflector_helper.rst +++ b/user_guide_src/source/helpers/inflector_helper.rst @@ -77,3 +77,9 @@ them. Each word is capitalized. Example $word = "my_dog_spot"; echo humanize($word); // Returns "My Dog Spot" +To use dashes instead of underscores + +:: + + $word = "my-dog-spot"; + echo humanize($word, '-'); // Returns "My Dog Spot" \ No newline at end of file From 750ffb9f6d545772c7139b5ee0c1402241c6ceb2 Mon Sep 17 00:00:00 2001 From: Andrew Mackrodt Date: Sat, 10 Dec 2011 23:42:07 +0000 Subject: [PATCH 0098/5397] Fix for Issue #538. --- system/libraries/Image_lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 8902f524d31..7f905128bd9 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -208,7 +208,7 @@ function initialize($props = array()) } else { - if (strpos($this->new_image, '/') === FALSE) + if (strpos($this->new_image, '/') === FALSE AND strpos($this->new_image, '\\') === FALSE) { $this->dest_folder = $this->source_folder; $this->dest_image = $this->new_image; From 3b6ff4ddc5ca433ba7b68a51a617c00b93511889 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 11 Dec 2011 14:57:36 +0200 Subject: [PATCH 0099/5397] Fix regular expression for validating MIME type string --- system/libraries/Upload.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 564d6000e44..c72fa3c6d0d 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1019,7 +1019,7 @@ protected function _prep_filename($filename) protected function _file_mime_type($file) { // We'll need this to validate the MIME info string (e.g. text/plain; charset=us-ascii) - $regexp = '/^([a-z\-]+\/[a-z0-9\-]+);\s.+$/'; + $regexp = '/^([a-z\-]+\/[a-z0-9\-\.\+]+);\s.+$/'; /* Fileinfo extension - most reliable method * From c7f67e99ff9ea55945537bc89033adc39997c678 Mon Sep 17 00:00:00 2001 From: Andrew Mackrodt Date: Sun, 11 Dec 2011 20:00:55 +0000 Subject: [PATCH 0100/5397] Updated changelog with fix for bug #538. --- user_guide/changelog.html | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide/changelog.html b/user_guide/changelog.html index 272db5f377e..b8fdcfc346f 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -73,6 +73,7 @@

    Bug fixes for 2.1.1

  • Fixed a bug (#697) - A wrong array key was used in the Upload library to check for mime-types.
  • Fixed a bug - form_open() compared $action against site_url() instead of base_url()
  • Fixed a bug - CI_Upload::_file_mime_type() could've failed if mime_content_type() is used for the detection and returns FALSE.
  • +
  • Fixed a bug (#538) - Windows paths were ignored when using the Image Manipulation Class to create a new file.
  • From f7aed129051475b4baeeb549a764464560c9dd34 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 13 Dec 2011 11:01:06 +0200 Subject: [PATCH 0101/5397] Tweak MIME regular expression check again --- system/libraries/Upload.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index c72fa3c6d0d..91fbf66cad4 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1019,7 +1019,7 @@ protected function _prep_filename($filename) protected function _file_mime_type($file) { // We'll need this to validate the MIME info string (e.g. text/plain; charset=us-ascii) - $regexp = '/^([a-z\-]+\/[a-z0-9\-\.\+]+);\s.+$/'; + $regexp = '/^([a-z\-]+\/[a-z0-9\-\.\+]+)(;\s.+)?$/'; /* Fileinfo extension - most reliable method * From 2e5bda3bde171e71306c80479f04d886127d88a2 Mon Sep 17 00:00:00 2001 From: Andrew Seymour Date: Tue, 13 Dec 2011 11:40:15 +0000 Subject: [PATCH 0102/5397] Updated Cart.php to handle quantity changes differently (now auto-increments), also updated the changelog to reflect this change for the people that are currently using this library --- system/libraries/Cart.php | 28 +++++++++++++++++++++++----- user_guide_src/source/changelog.rst | 1 + 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index a0e1bb91e3d..13485a3ee6d 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -41,6 +41,7 @@ class CI_Cart { // These are the regular expression rules that we use to validate the product ID and product name var $product_id_rules = '\.a-z0-9_-'; // alpha-numeric, dashes, underscores, or periods var $product_name_rules = '\.\:\-_ a-z0-9'; // alpha-numeric, dashes, underscores, colons or periods + var $product_name_safe = true; // only allow safe product names // Private variables. Do not change! var $CI; @@ -195,10 +196,13 @@ function _insert($items = array()) // Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods. // Note: These can be user-specified by setting the $this->product_name_rules variable. - if ( ! preg_match("/^[".$this->product_name_rules."]+$/i", $items['name'])) + if($this->product_name_safe) { - log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces'); - return FALSE; + if ( ! preg_match("/^[".$this->product_name_rules."]+$/i", $items['name'])) + { + log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces'); + return FALSE; + } } // -------------------------------------------------------------------- @@ -242,7 +246,18 @@ function _insert($items = array()) // -------------------------------------------------------------------- // Now that we have our unique "row ID", we'll add our cart items to the master array - + // grab quantity if it's already there and add it on + if(isset($this->_cart_contents[$rowid]['qty'])) + { + // set our old quantity + $old_quantity = (int)$this->_cart_contents[$rowid]['qty']; + } + else + { + // we have no old quantity but - we don't want to throw an error + $old_quantity = 0; + } + // let's unset this first, just to make sure our index contains only the data from this submission unset($this->_cart_contents[$rowid]); @@ -254,7 +269,10 @@ function _insert($items = array()) { $this->_cart_contents[$rowid][$key] = $val; } - + + // add old quantity back in + $this->_cart_contents[$rowid]['qty'] = ($this->_cart_contents[$rowid]['qty'] + $old_quantity); + // Woot! return $rowid; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 6f41f451919..71104418ad6 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -47,6 +47,7 @@ Release Date: Not Released - CI_Loader::_ci_autoloader() is now a protected method. - Modified valid_ip() to use PHP's filter_var() when possible (>= PHP 5.2) in the :doc:`Form Validation library `. - Added custom filename to Email::attach() as $this->email->attach($filename, $disposition, $newname) + - The Cart library now auto-increments quantity's instead of just resetting it, this is the default behaviour of large e-commerce sites. - Core From 3dd66631330841e4d0e29a95fc279a5d5cc921f2 Mon Sep 17 00:00:00 2001 From: Andrew Seymour Date: Tue, 13 Dec 2011 15:50:52 +0000 Subject: [PATCH 0103/5397] Merged the two if's together as suggested by @philsturgeon - updated the Changelog to include something that may be important --- system/libraries/Cart.php | 9 +++------ user_guide_src/source/changelog.rst | 1 + 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index 13485a3ee6d..f9f3bca4714 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -196,13 +196,10 @@ function _insert($items = array()) // Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods. // Note: These can be user-specified by setting the $this->product_name_rules variable. - if($this->product_name_safe) + if ( $this->product_name_safe && ! preg_match("/^[".$this->product_name_rules."]+$/i", $items['name'])) { - if ( ! preg_match("/^[".$this->product_name_rules."]+$/i", $items['name'])) - { - log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces'); - return FALSE; - } + log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces'); + return FALSE; } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 71104418ad6..eda64e7fff9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -48,6 +48,7 @@ Release Date: Not Released - Modified valid_ip() to use PHP's filter_var() when possible (>= PHP 5.2) in the :doc:`Form Validation library `. - Added custom filename to Email::attach() as $this->email->attach($filename, $disposition, $newname) - The Cart library now auto-increments quantity's instead of just resetting it, this is the default behaviour of large e-commerce sites. + - Cart Product Name strictness can be disabled via the Cart Library by switching "$product_name_safe" - Core From fefff9fcdfc26676b8c57653c3d8176b729901b2 Mon Sep 17 00:00:00 2001 From: Andrew Seymour Date: Tue, 13 Dec 2011 15:52:50 +0000 Subject: [PATCH 0104/5397] Spacing added, @philsturgeon is too picky! --- system/libraries/Cart.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index f9f3bca4714..997b9b8de43 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -244,7 +244,7 @@ function _insert($items = array()) // Now that we have our unique "row ID", we'll add our cart items to the master array // grab quantity if it's already there and add it on - if(isset($this->_cart_contents[$rowid]['qty'])) + if( isset($this->_cart_contents[$rowid]['qty'])) { // set our old quantity $old_quantity = (int)$this->_cart_contents[$rowid]['qty']; From de2e96a298cc48b8e86a03d530bc328bd43b0c80 Mon Sep 17 00:00:00 2001 From: Andrew Seymour Date: Tue, 13 Dec 2011 16:44:59 +0000 Subject: [PATCH 0105/5397] Added the ability to get the contents in a different order --- system/libraries/Cart.php | 12 ++++++++++-- user_guide_src/source/libraries/cart.rst | 7 +++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index 997b9b8de43..2e580863b02 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -476,9 +476,17 @@ function total_items() * @access public * @return array */ - function contents() + function contents($newest_first = false) { - $cart = $this->_cart_contents; + // do we want the newest first? + if($newest_first) + { + // reverse the array + $cart = array_reverse($this->_cart_contents); + } else { + // just added first to last + $cart = $this->_cast_contents; + } // Remove these so they don't create a problem when showing the cart table unset($cart['total_items']); diff --git a/user_guide_src/source/libraries/cart.rst b/user_guide_src/source/libraries/cart.rst index 850d7e9a89f..a1e042ef2b2 100644 --- a/user_guide_src/source/libraries/cart.rst +++ b/user_guide_src/source/libraries/cart.rst @@ -266,10 +266,13 @@ $this->cart->total_items(); Displays the total number of items in the cart. -$this->cart->contents(); +$this->cart->contents(boolean); ************************ -Returns an array containing everything in the cart. +Returns an array containing everything in the cart. You can sort the order, +by which this is returned by passing it "true" where the contents will be sorted +from newest to oldest, by leaving this function blank, you'll automatically just get +first added to the basket to last added to the basket. $this->cart->has_options(rowid); ********************************* From 17aebce8e06fae0edf1d54cf6823f1b8f48924c0 Mon Sep 17 00:00:00 2001 From: Andrew Seymour Date: Tue, 13 Dec 2011 16:57:13 +0000 Subject: [PATCH 0106/5397] Changed the syntax slightly, @philsturgeon may be claustrophobic as he doesn't like no spaces --- system/libraries/Cart.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index 2e580863b02..e78ecd5f69f 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -244,7 +244,7 @@ function _insert($items = array()) // Now that we have our unique "row ID", we'll add our cart items to the master array // grab quantity if it's already there and add it on - if( isset($this->_cart_contents[$rowid]['qty'])) + if (isset($this->_cart_contents[$rowid]['qty'])) { // set our old quantity $old_quantity = (int)$this->_cart_contents[$rowid]['qty']; From f75ec11d7ed0592f930dd3a090db7c1c6d251eed Mon Sep 17 00:00:00 2001 From: Andrew Seymour Date: Wed, 14 Dec 2011 09:36:39 +0000 Subject: [PATCH 0107/5397] Added in a remove item from cart function to save the "hacky" method of updating a product with 0 quantity, updated the changelog to reflect and to be neater and more readable surrounding the changes of the Cart library --- system/libraries/Cart.php | 24 +++++++++++++++++++++++- user_guide_src/source/changelog.rst | 6 ++++-- user_guide_src/source/libraries/cart.rst | 5 +++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index e78ecd5f69f..7f6cdf5ddf5 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -450,7 +450,29 @@ function total() { return $this->_cart_contents['cart_total']; } - + + // -------------------------------------------------------------------- + + /** + * Remove Item + * + * Removes an item from the cart + * + * @access public + * @return boolean + */ + public function remove($rowid) + { + // just do an unset + unset($this->_cart_contents[$rowid]); + + // we need to save the cart now we've made our changes + $this->_save_cart(); + + // completed + return true; + } + // -------------------------------------------------------------------- /** diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index eda64e7fff9..72b7f7e8aa4 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -47,8 +47,10 @@ Release Date: Not Released - CI_Loader::_ci_autoloader() is now a protected method. - Modified valid_ip() to use PHP's filter_var() when possible (>= PHP 5.2) in the :doc:`Form Validation library `. - Added custom filename to Email::attach() as $this->email->attach($filename, $disposition, $newname) - - The Cart library now auto-increments quantity's instead of just resetting it, this is the default behaviour of large e-commerce sites. - - Cart Product Name strictness can be disabled via the Cart Library by switching "$product_name_safe" + - Cart library changes include; + - It now auto-increments quantity's instead of just resetting it, this is the default behaviour of large e-commerce sites. + - Product Name strictness can be disabled via the Cart Library by switching "$product_name_safe" + - Added function remove() to remove a cart item, updating with quantity of 0 seemed like a hack but has remained to retain compatability - Core diff --git a/user_guide_src/source/libraries/cart.rst b/user_guide_src/source/libraries/cart.rst index a1e042ef2b2..fbf777884b7 100644 --- a/user_guide_src/source/libraries/cart.rst +++ b/user_guide_src/source/libraries/cart.rst @@ -256,6 +256,11 @@ $this->cart->update(); Permits you to update items in the shopping cart, as outlined above. +$this->cart->remove(rowid); +********************** + +Allows you to remove an item from the shopping cart by passing it the rowid. + $this->cart->total(); ********************* From 3a67ed15d984a341612af9e1dd9ba52f30d02e89 Mon Sep 17 00:00:00 2001 From: Andrew Seymour Date: Wed, 14 Dec 2011 15:35:06 +0000 Subject: [PATCH 0108/5397] Slight syntax change to the Cart class --- system/libraries/Cart.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index 7f6cdf5ddf5..717ccd9fbe0 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -505,7 +505,9 @@ function contents($newest_first = false) { // reverse the array $cart = array_reverse($this->_cart_contents); - } else { + } + else + { // just added first to last $cart = $this->_cast_contents; } From 399cca920b3d2d94e3c0f8d1099b22b6482481da Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Wed, 14 Dec 2011 11:04:14 -0500 Subject: [PATCH 0109/5397] Added a reference note for people needing to limit to a set number of characters --- user_guide_src/source/helpers/text_helper.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/user_guide_src/source/helpers/text_helper.rst b/user_guide_src/source/helpers/text_helper.rst index e9764327512..8cb2d6f96a8 100644 --- a/user_guide_src/source/helpers/text_helper.rst +++ b/user_guide_src/source/helpers/text_helper.rst @@ -46,6 +46,9 @@ more or less then what you specify. Example The third parameter is an optional suffix added to the string, if undeclared this helper uses an ellipsis. +**Note:** If you need to truncate to an exact number of characters please see +the :ref:`ellipsize` function below. + ascii_to_entities() =================== @@ -136,6 +139,8 @@ complete words. Example // Would produce: Here is a simple string of text that will help us demonstrate this function +.. _ellipsize: + ellipsize() =========== From 79c1c46c4c99ca143a1231f7fd6b845f7276e1fd Mon Sep 17 00:00:00 2001 From: Joel Kallman Date: Sun, 18 Dec 2011 19:25:45 -0500 Subject: [PATCH 0110/5397] Makes form open properly when empty array of parameters is passed Signed-off-by: Joel Kallman --- system/helpers/form_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 0f02bcf75b1..347e8be903a 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -1000,7 +1000,7 @@ function _attributes_to_string($attributes, $formtag = FALSE) $attributes = (array)$attributes; } - if (is_array($attributes) AND count($attributes) > 0) + if (is_array($attributes) AND ($formtag === TRUE OR count($attributes) > 0)) { $atts = ''; From d054e137917ef1131195679aa8abeb4dbf69e4e4 Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Mon, 19 Dec 2011 00:25:01 -0500 Subject: [PATCH 0111/5397] Added #795 to changelog --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 72b7f7e8aa4..74c29a509ec 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -72,7 +72,7 @@ Bug fixes for 3.0 - Bug #608 - Fixes an issue with the Image_lib class not clearing properties completely - Fixed bugs (#157 and #174) - the Image_lib clear() function now resets all variables to their default values. - Fixed a bug where using $this->dbforge->create_table() with PostgreSQL database could lead to fetching whole table. - +- Bug #795 - Fixed form method and accept-charset when passing an empty array. Version 2.1.0 ============= From 4eea9895e8ced75a1099c56215c09773de94b92c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 19 Dec 2011 12:05:41 +0200 Subject: [PATCH 0112/5397] Add method visibility declarations and optimize display_errors() method in Image_lib, Trackback and Upload libraries --- system/libraries/Image_lib.php | 58 +++++++++++++++------------------- system/libraries/Trackback.php | 42 +++++++++++------------- system/libraries/Upload.php | 10 ++---- 3 files changed, 46 insertions(+), 64 deletions(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 2ed488c7e0f..c4797e34aa3 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -114,7 +114,7 @@ public function __construct($props = array()) * @access public * @return void */ - function clear() + public function clear() { $props = array('library_path', 'source_image', 'new_image', 'width', 'height', 'rotation_angle', 'x_axis', 'y_axis', 'wm_text', 'wm_overlay_path', 'wm_font_path', 'wm_shadow_color', 'source_folder', 'dest_folder', 'mime_type', 'orig_width', 'orig_height', 'image_type', 'size_str', 'full_src_path', 'full_dst_path'); @@ -158,7 +158,7 @@ function clear() * @param array * @return bool */ - function initialize($props = array()) + public function initialize($props = array()) { /* * Convert array elements into class variables @@ -379,7 +379,7 @@ function initialize($props = array()) * @access public * @return bool */ - function resize() + public function resize() { $protocol = 'image_process_'.$this->image_library; @@ -402,7 +402,7 @@ function resize() * @access public * @return bool */ - function crop() + public function crop() { $protocol = 'image_process_'.$this->image_library; @@ -425,7 +425,7 @@ function crop() * @access public * @return bool */ - function rotate() + public function rotate() { // Allowed rotation values $degs = array(90, 180, 270, 'vrt', 'hor'); @@ -478,7 +478,7 @@ function rotate() * @param string * @return bool */ - function image_process_gd($action = 'resize') + public function image_process_gd($action = 'resize') { $v2_override = FALSE; @@ -590,7 +590,7 @@ function image_process_gd($action = 'resize') * @param string * @return bool */ - function image_process_imagemagick($action = 'resize') + public function image_process_imagemagick($action = 'resize') { // Do we have a vaild library path? if ($this->library_path == '') @@ -660,7 +660,7 @@ function image_process_imagemagick($action = 'resize') * @param string * @return bool */ - function image_process_netpbm($action = 'resize') + public function image_process_netpbm($action = 'resize') { if ($this->library_path == '') { @@ -743,7 +743,7 @@ function image_process_netpbm($action = 'resize') * @access public * @return bool */ - function image_rotate_gd() + public function image_rotate_gd() { // Create the image handle if ( ! ($src_img = $this->image_create_gd())) @@ -796,7 +796,7 @@ function image_rotate_gd() * @access public * @return bool */ - function image_mirror_gd() + public function image_mirror_gd() { if ( ! $src_img = $this->image_create_gd()) { @@ -882,7 +882,7 @@ function image_mirror_gd() * @param string * @return bool */ - function watermark() + public function watermark() { if ($this->wm_type == 'overlay') { @@ -902,7 +902,7 @@ function watermark() * @access public * @return bool */ - function overlay_watermark() + public function overlay_watermark() { if ( ! function_exists('imagecolortransparent')) { @@ -1015,7 +1015,7 @@ function overlay_watermark() * @access public * @return bool */ - function text_watermark() + public function text_watermark() { if ( ! ($src_img = $this->image_create_gd())) { @@ -1159,7 +1159,7 @@ function text_watermark() * @param string * @return resource */ - function image_create_gd($path = '', $image_type = '') + public function image_create_gd($path = '', $image_type = '') { if ($path == '') $path = $this->full_src_path; @@ -1216,7 +1216,7 @@ function image_create_gd($path = '', $image_type = '') * @param resource * @return bool */ - function image_save_gd($resource) + public function image_save_gd($resource) { switch ($this->image_type) { @@ -1277,7 +1277,7 @@ function image_save_gd($resource) * @param resource * @return void */ - function image_display_gd($resource) + public function image_display_gd($resource) { header("Content-Disposition: filename={$this->source_image};"); header("Content-Type: {$this->mime_type}"); @@ -1312,7 +1312,7 @@ function image_display_gd($resource) * @access public * @return void */ - function image_reproportion() + public function image_reproportion() { if ( ! is_numeric($this->width) OR ! is_numeric($this->height) OR $this->width == 0 OR $this->height == 0) return; @@ -1354,7 +1354,7 @@ function image_reproportion() * @param string * @return mixed */ - function get_image_properties($path = '', $return = FALSE) + public function get_image_properties($path = '', $return = FALSE) { // For now we require GD but we should // find a way to determine this using IM or NetPBM @@ -1414,7 +1414,7 @@ function get_image_properties($path = '', $return = FALSE) * @param array * @return array */ - function size_calculator($vals) + public function size_calculator($vals) { if ( ! is_array($vals)) { @@ -1462,7 +1462,7 @@ function size_calculator($vals) * @param array * @return array */ - function explode_name($source_image) + public function explode_name($source_image) { $ext = strrchr($source_image, '.'); $name = ($ext === FALSE) ? $source_image : substr($source_image, 0, -strlen($ext)); @@ -1478,7 +1478,7 @@ function explode_name($source_image) * @access public * @return bool */ - function gd_loaded() + public function gd_loaded() { if ( ! extension_loaded('gd')) { @@ -1499,7 +1499,7 @@ function gd_loaded() * @access public * @return mixed */ - function gd_version() + public function gd_version() { if (function_exists('gd_info')) { @@ -1521,7 +1521,7 @@ function gd_version() * @param string * @return void */ - function set_error($msg) + public function set_error($msg) { $CI =& get_instance(); $CI->lang->load('imglib'); @@ -1553,19 +1553,13 @@ function set_error($msg) * @param string * @return string */ - function display_errors($open = '

    ', $close = '

    ') + public function display_errors($open = '

    ', $close = '

    ') { - $str = ''; - foreach ($this->error_msg as $val) - { - $str .= $open.$val.$close; - } - - return $str; + return (count($this->error_msg) > 0) ? $open . implode($close . $open, $this->error_msg) . $close : ''; } } // END Image_lib Class /* End of file Image_lib.php */ -/* Location: ./system/libraries/Image_lib.php */ \ No newline at end of file +/* Location: ./system/libraries/Image_lib.php */ diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index e903ea7d020..3fa55ca20db 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -5,9 +5,9 @@ * An open source application development framework for PHP 5.1.6 or newer * * NOTICE OF LICENSE - * + * * Licensed under the Open Software License version 3.0 - * + * * This source file is subject to the Open Software License (OSL 3.0) that is * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: @@ -66,7 +66,7 @@ public function __construct() * @param array * @return bool */ - function send($tb_data) + public function send($tb_data) { if ( ! is_array($tb_data)) { @@ -147,7 +147,7 @@ function send($tb_data) * @access public * @return bool */ - function receive() + public function receive() { foreach (array('url', 'title', 'blog_name', 'excerpt') as $val) { @@ -190,7 +190,7 @@ function receive() * @param string * @return void */ - function send_error($message = 'Incomplete Information') + public function send_error($message = 'Incomplete Information') { echo "\n\n1\n".$message."\n"; exit; @@ -207,7 +207,7 @@ function send_error($message = 'Incomplete Information') * @access public * @return void */ - function send_success() + public function send_success() { echo "\n\n0\n"; exit; @@ -222,7 +222,7 @@ function send_success() * @param string * @return string */ - function data($item) + public function data($item) { return ( ! isset($this->data[$item])) ? '' : $this->data[$item]; } @@ -240,7 +240,7 @@ function data($item) * @param string * @return bool */ - function process($url, $data) + public function process($url, $data) { $target = parse_url($url); @@ -309,7 +309,7 @@ function process($url, $data) * @param string * @return string */ - function extract_urls($urls) + public function extract_urls($urls) { // Remove the pesky white space and replace with a comma. $urls = preg_replace("/\s*(\S+)\s*/", "\\1,", $urls); @@ -345,7 +345,7 @@ function extract_urls($urls) * @param string * @return string */ - function validate_url($url) + public function validate_url($url) { $url = trim($url); @@ -364,7 +364,7 @@ function validate_url($url) * @param string * @return string */ - function get_id($url) + public function get_id($url) { $tb_id = ""; @@ -413,7 +413,7 @@ function get_id($url) * @param string * @return string */ - function convert_xml($str) + public function convert_xml($str) { $temp = '__TEMP_AMPERSANDS__'; @@ -443,7 +443,7 @@ function convert_xml($str) * @param string * @return string */ - function limit_characters($str, $n = 500, $end_char = '…') + public function limit_characters($str, $n = 500, $end_char = '…') { if (strlen($str) < $n) { @@ -480,7 +480,7 @@ function limit_characters($str, $n = 500, $end_char = '…') * @param string * @return string */ - function convert_ascii($str) + public function convert_ascii($str) { $count = 1; $out = ''; @@ -526,7 +526,7 @@ function convert_ascii($str) * @param string * @return void */ - function set_error($msg) + public function set_error($msg) { log_message('error', $msg); $this->error_msg[] = $msg; @@ -542,19 +542,13 @@ function set_error($msg) * @param string * @return string */ - function display_errors($open = '

    ', $close = '

    ') + public function display_errors($open = '

    ', $close = '

    ') { - $str = ''; - foreach ($this->error_msg as $val) - { - $str .= $open.$val.$close; - } - - return $str; + return (count($this->error_msg) > 0) ? $open . implode($close . $open, $this->error_msg) . $close : ''; } } // END Trackback Class /* End of file Trackback.php */ -/* Location: ./system/libraries/Trackback.php */ \ No newline at end of file +/* Location: ./system/libraries/Trackback.php */ diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 66e91c5b612..ab97d1a0f00 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -934,13 +934,7 @@ public function set_error($msg) */ public function display_errors($open = '

    ', $close = '

    ') { - $str = ''; - foreach ($this->error_msg as $val) - { - $str .= $open.$val.$close; - } - - return $str; + return (count($this->error_msg) > 0) ? $open . implode($close . $open, $this->error_msg) . $close : ''; } // -------------------------------------------------------------------- @@ -1086,4 +1080,4 @@ protected function _file_mime_type($file) // END Upload Class /* End of file Upload.php */ -/* Location: ./system/libraries/Upload.php */ \ No newline at end of file +/* Location: ./system/libraries/Upload.php */ From dc3e4bedb39afe30d95635e5258aaecec4dfd74c Mon Sep 17 00:00:00 2001 From: Eric Barnes Date: Mon, 19 Dec 2011 13:48:29 -0500 Subject: [PATCH 0113/5397] Fixed year and month seconds for timespan(). --- system/helpers/date_helper.php | 70 ++++++++++++++--------------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 8c92fdc8945..49dbdbeb3d5 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -5,9 +5,9 @@ * An open source application development framework for PHP 5.1.6 or newer * * NOTICE OF LICENSE - * + * * Licensed under the Open Software License version 3.0 - * + * * This source file is subject to the Open Software License (OSL 3.0) that is * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: @@ -96,14 +96,14 @@ function mdate($datestr = '', $time = '') { if ($datestr == '') { - return ''; + return ''; } $time = ($time == '') ? now() : $time; $datestr = str_replace( - '%\\', - '', + '%\\', + '', preg_replace("/([a-z]+?){1}/i", "\\\\\\1", $datestr) ); @@ -181,15 +181,15 @@ function timespan($seconds = 1, $time = '') $seconds = ($time <= $seconds) ? 1 : $time - $seconds; $str = ''; - $years = floor($seconds / 31536000); + $years = floor($seconds / 31557600); if ($years > 0) { $str .= $years.' '.$CI->lang->line((($years > 1) ? 'date_years' : 'date_year')).', '; } - $seconds -= $years * 31536000; - $months = floor($seconds / 2628000); + $seconds -= $years * 31557600; + $months = floor($seconds / 2629743); if ($years > 0 OR $months > 0) { @@ -198,7 +198,7 @@ function timespan($seconds = 1, $time = '') $str .= $months.' '.$CI->lang->line((($months > 1) ? 'date_months' : 'date_month')).', '; } - $seconds -= $months * 2628000; + $seconds -= $months * 2629743; } $weeks = floor($seconds / 604800); @@ -315,13 +315,13 @@ function local_to_gmt($time = '') { $time = time(); } - + return mktime( - gmdate("H", $time), - gmdate("i", $time), - gmdate("s", $time), - gmdate("m", $time), - gmdate("d", $time), + gmdate("H", $time), + gmdate("i", $time), + gmdate("s", $time), + gmdate("m", $time), + gmdate("d", $time), gmdate("Y", $time) ); } @@ -494,17 +494,17 @@ function human_to_unix($datestr = '') if (substr($ampm, 0, 1) == 'p' AND $hour < 12) { - $hour = $hour + 12; + $hour = $hour + 12; } if (substr($ampm, 0, 1) == 'a' AND $hour == 12) { $hour = '00'; } - + if (strlen($hour) == 1) { - $hour = '0'.$hour; + $hour = '0'.$hour; } } @@ -517,7 +517,7 @@ function human_to_unix($datestr = '') /** * Turns many "reasonably-date-like" strings into something * that is actually useful. This only works for dates after unix epoch. - * + * * @access public * @param string The terribly formatted date-like string * @param string Date format to return (same as php date function) @@ -525,7 +525,7 @@ function human_to_unix($datestr = '') */ if ( ! function_exists('nice_date')) { - function nice_date($bad_date = '', $format = FALSE) + function nice_date($bad_date = '', $format = FALSE) { if (empty($bad_date)) { @@ -533,47 +533,47 @@ function nice_date($bad_date = '', $format = FALSE) } // Date like: YYYYMM - if (preg_match('/^\d{6}$/', $bad_date)) + if (preg_match('/^\d{6}$/', $bad_date)) { - if (in_array(substr($bad_date, 0, 2),array('19', '20'))) + if (in_array(substr($bad_date, 0, 2),array('19', '20'))) { $year = substr($bad_date, 0, 4); $month = substr($bad_date, 4, 2); - } - else + } + else { $month = substr($bad_date, 0, 2); $year = substr($bad_date, 2, 4); } - + return date($format, strtotime($year . '-' . $month . '-01')); } - + // Date Like: YYYYMMDD - if (preg_match('/^\d{8}$/',$bad_date)) + if (preg_match('/^\d{8}$/',$bad_date)) { $month = substr($bad_date, 0, 2); $day = substr($bad_date, 2, 2); $year = substr($bad_date, 4, 4); - + return date($format, strtotime($month . '/01/' . $year)); } - + // Date Like: MM-DD-YYYY __or__ M-D-YYYY (or anything in between) if (preg_match('/^\d{1,2}-\d{1,2}-\d{4}$/',$bad_date)) - { + { list($m, $d, $y) = explode('-', $bad_date); return date($format, strtotime("{$y}-{$m}-{$d}")); } - + // Any other kind of string, when converted into UNIX time, // produces "0 seconds after epoc..." is probably bad... // return "Invalid Date". if (date('U', strtotime($bad_date)) == '0') - { + { return "Invalid Date"; } - + // It's probably a valid-ish date format already return date($format, strtotime($bad_date)); } @@ -688,9 +688,9 @@ function timezones($tz = '') { return $zones; } - + $tz = ($tz == 'GMT') ? 'UTC' : $tz; - + return ( ! isset($zones[$tz])) ? 0 : $zones[$tz]; } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 74c29a509ec..44c9432a2db 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -73,6 +73,7 @@ Bug fixes for 3.0 - Fixed bugs (#157 and #174) - the Image_lib clear() function now resets all variables to their default values. - Fixed a bug where using $this->dbforge->create_table() with PostgreSQL database could lead to fetching whole table. - Bug #795 - Fixed form method and accept-charset when passing an empty array. +- Bug #797 - timespan was using incorrect seconds for year and month. Version 2.1.0 ============= From 8bd8f687827454f83a5512b96bb0f632178a08a6 Mon Sep 17 00:00:00 2001 From: dixy Date: Mon, 19 Dec 2011 22:26:12 +0100 Subject: [PATCH 0114/5397] Prev link and 1 link don't have the same url with use_page_numbers=TRUE --- system/libraries/Pagination.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index eea953ae4d6..cc73e0d2f8a 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -236,13 +236,13 @@ public function create_links() { $i = ($this->use_page_numbers) ? $uri_page_number - 1 : $uri_page_number - $this->per_page; - if (($i == 0 OR ($this->use_page_numbers && $i == 1)) AND $this->first_url != '') + if ($i == $base_page AND $this->first_url != '') { $output .= $this->prev_tag_open.'anchor_class.'href="'.$this->first_url.'">'.$this->prev_link.''.$this->prev_tag_close; } else { - $i = ($i == 0) ? '' : $this->prefix.$i.$this->suffix; + $i = ($i == $base_page) ? '' : $this->prefix.$i.$this->suffix; $output .= $this->prev_tag_open.'anchor_class.'href="'.$this->base_url.$i.'">'.$this->prev_link.''.$this->prev_tag_close; } From 37b1d9ba5bef4594aaf458e0406599bdf33deb46 Mon Sep 17 00:00:00 2001 From: dixy Date: Mon, 19 Dec 2011 22:32:48 +0100 Subject: [PATCH 0115/5397] Add #800 to changelog --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 44c9432a2db..f5432a95df3 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -74,6 +74,7 @@ Bug fixes for 3.0 - Fixed a bug where using $this->dbforge->create_table() with PostgreSQL database could lead to fetching whole table. - Bug #795 - Fixed form method and accept-charset when passing an empty array. - Bug #797 - timespan was using incorrect seconds for year and month. +- In Pagination library, when use_page_numbers=TRUE previous link and page 1 link do not have the same url Version 2.1.0 ============= From c4caf5a181344e48fc6740f1383dd302f5b604d2 Mon Sep 17 00:00:00 2001 From: Mancy Date: Tue, 20 Dec 2011 11:47:51 +0300 Subject: [PATCH 0116/5397] taking care of LIKE when used in UPDATE statement #798 --- system/database/DB_active_rec.php | 2 +- system/database/drivers/mysql/mysql_driver.php | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index 43920772a35..7a608c4f0f6 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -1424,7 +1424,7 @@ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) $this->limit($limit); } - $sql = $this->_update($this->_protect_identifiers($this->ar_from[0], TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit); + $sql = $this->_update($this->_protect_identifiers($this->ar_from[0], TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit, , $this->ar_like); $this->_reset_write(); return $this->query($sql); diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 828ef006be3..7952312ab27 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -606,7 +606,7 @@ function _insert_batch($table, $keys, $values) * @param array the limit clause * @return string */ - function _update($table, $values, $where, $orderby = array(), $limit = FALSE) + function _update($table, $values, $where, $orderby = array(), $limit = FALSE, $like = array()) { foreach ($values as $key => $val) { @@ -620,6 +620,15 @@ function _update($table, $values, $where, $orderby = array(), $limit = FALSE) $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; + + if (count($like) > 0) { + $sql .= ($where == '' AND count($where) <1) ? " WHERE " : ' AND '; + foreach ($like as $st_like) { + + $sql .= " " . $st_like; + + } + } $sql .= $orderby.$limit; From 205d02936cf76f9b430129d9b704c182933cfee4 Mon Sep 17 00:00:00 2001 From: Mancy Date: Tue, 20 Dec 2011 12:45:58 +0300 Subject: [PATCH 0117/5397] #798: following current codeigniter code standards --- system/database/drivers/mysql/mysql_driver.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 7952312ab27..6ded6e531be 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -621,12 +621,13 @@ function _update($table, $values, $where, $orderby = array(), $limit = FALSE, $l $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; - if (count($like) > 0) { + if (count($like) > 0) + { $sql .= ($where == '' AND count($where) <1) ? " WHERE " : ' AND '; - foreach ($like as $st_like) { - - $sql .= " " . $st_like; - + + foreach ($like as $st_like) + { + $sql .= " " . $st_like; } } From 0d91fd2956812e07905d8047ef95a0e556edbb1a Mon Sep 17 00:00:00 2001 From: Mancy Date: Tue, 20 Dec 2011 13:13:14 +0300 Subject: [PATCH 0118/5397] #798: update changelog and typo fix --- system/database/DB_active_rec.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index 7a608c4f0f6..41950e7d803 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -1424,7 +1424,7 @@ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) $this->limit($limit); } - $sql = $this->_update($this->_protect_identifiers($this->ar_from[0], TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit, , $this->ar_like); + $sql = $this->_update($this->_protect_identifiers($this->ar_from[0], TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit, $this->ar_like); $this->_reset_write(); return $this->query($sql); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 74c29a509ec..4e0f041053d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -40,6 +40,7 @@ Release Date: Not Released - Added new :doc:`Active Record ` methods that return the SQL string of queries without executing them: get_compiled_select(), get_compiled_insert(), get_compiled_update(), get_compiled_delete(). + - Taking care of LIKE condition when used with MySQL UPDATE statement. - Libraries From 3a45957a30ff908445b2772efac8fdb65b64e6cd Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 21 Dec 2011 11:23:11 +0200 Subject: [PATCH 0119/5397] Also replace old-style 'var' with 'public' --- system/libraries/Image_lib.php | 90 +++++++++++++++++----------------- system/libraries/Trackback.php | 12 ++--- system/libraries/Upload.php | 4 +- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index c4797e34aa3..20ca1f05535 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -38,55 +38,55 @@ */ class CI_Image_lib { - var $image_library = 'gd2'; // Can be: imagemagick, netpbm, gd, gd2 - var $library_path = ''; - var $dynamic_output = FALSE; // Whether to send to browser or write to disk - var $source_image = ''; - var $new_image = ''; - var $width = ''; - var $height = ''; - var $quality = '90'; - var $create_thumb = FALSE; - var $thumb_marker = '_thumb'; - var $maintain_ratio = TRUE; // Whether to maintain aspect ratio when resizing or use hard values - var $master_dim = 'auto'; // auto, height, or width. Determines what to use as the master dimension - var $rotation_angle = ''; - var $x_axis = ''; - var $y_axis = ''; + public $image_library = 'gd2'; // Can be: imagemagick, netpbm, gd, gd2 + public $library_path = ''; + public $dynamic_output = FALSE; // Whether to send to browser or write to disk + public $source_image = ''; + public $new_image = ''; + public $width = ''; + public $height = ''; + public $quality = '90'; + public $create_thumb = FALSE; + public $thumb_marker = '_thumb'; + public $maintain_ratio = TRUE; // Whether to maintain aspect ratio when resizing or use hard values + public $master_dim = 'auto'; // auto, height, or width. Determines what to use as the master dimension + public $rotation_angle = ''; + public $x_axis = ''; + public $y_axis = ''; // Watermark Vars - var $wm_text = ''; // Watermark text if graphic is not used - var $wm_type = 'text'; // Type of watermarking. Options: text/overlay - var $wm_x_transp = 4; - var $wm_y_transp = 4; - var $wm_overlay_path = ''; // Watermark image path - var $wm_font_path = ''; // TT font - var $wm_font_size = 17; // Font size (different versions of GD will either use points or pixels) - var $wm_vrt_alignment = 'B'; // Vertical alignment: T M B - var $wm_hor_alignment = 'C'; // Horizontal alignment: L R C - var $wm_padding = 0; // Padding around text - var $wm_hor_offset = 0; // Lets you push text to the right - var $wm_vrt_offset = 0; // Lets you push text down - var $wm_font_color = '#ffffff'; // Text color - var $wm_shadow_color = ''; // Dropshadow color - var $wm_shadow_distance = 2; // Dropshadow distance - var $wm_opacity = 50; // Image opacity: 1 - 100 Only works with image + public $wm_text = ''; // Watermark text if graphic is not used + public $wm_type = 'text'; // Type of watermarking. Options: text/overlay + public $wm_x_transp = 4; + public $wm_y_transp = 4; + public $wm_overlay_path = ''; // Watermark image path + public $wm_font_path = ''; // TT font + public $wm_font_size = 17; // Font size (different versions of GD will either use points or pixels) + public $wm_vrt_alignment = 'B'; // Vertical alignment: T M B + public $wm_hor_alignment = 'C'; // Horizontal alignment: L R C + public $wm_padding = 0; // Padding around text + public $wm_hor_offset = 0; // Lets you push text to the right + public $wm_vrt_offset = 0; // Lets you push text down + public $wm_font_color = '#ffffff'; // Text color + public $wm_shadow_color = ''; // Dropshadow color + public $wm_shadow_distance = 2; // Dropshadow distance + public $wm_opacity = 50; // Image opacity: 1 - 100 Only works with image // Private Vars - var $source_folder = ''; - var $dest_folder = ''; - var $mime_type = ''; - var $orig_width = ''; - var $orig_height = ''; - var $image_type = ''; - var $size_str = ''; - var $full_src_path = ''; - var $full_dst_path = ''; - var $create_fnc = 'imagecreatetruecolor'; - var $copy_fnc = 'imagecopyresampled'; - var $error_msg = array(); - var $wm_use_drop_shadow = FALSE; - var $wm_use_truetype = FALSE; + public $source_folder = ''; + public $dest_folder = ''; + public $mime_type = ''; + public $orig_width = ''; + public $orig_height = ''; + public $image_type = ''; + public $size_str = ''; + public $full_src_path = ''; + public $full_dst_path = ''; + public $create_fnc = 'imagecreatetruecolor'; + public $copy_fnc = 'imagecopyresampled'; + public $error_msg = array(); + public $wm_use_drop_shadow = FALSE; + public $wm_use_truetype = FALSE; /** * Constructor diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index 3fa55ca20db..1e592831403 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -40,12 +40,12 @@ */ class CI_Trackback { - var $time_format = 'local'; - var $charset = 'UTF-8'; - var $data = array('url' => '', 'title' => '', 'excerpt' => '', 'blog_name' => '', 'charset' => ''); - var $convert_ascii = TRUE; - var $response = ''; - var $error_msg = array(); + public $time_format = 'local'; + public $charset = 'UTF-8'; + public $data = array('url' => '', 'title' => '', 'excerpt' => '', 'blog_name' => '', 'charset' => ''); + public $convert_ascii = TRUE; + public $response = ''; + public $error_msg = array(); /** * Constructor diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index ab97d1a0f00..826bcceb880 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -5,9 +5,9 @@ * An open source application development framework for PHP 5.1.6 or newer * * NOTICE OF LICENSE - * + * * Licensed under the Open Software License version 3.0 - * + * * This source file is subject to the Open Software License (OSL 3.0) that is * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: From bb2488305194e50881df0971bf4f33f30d974d36 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 21 Dec 2011 16:42:51 +0200 Subject: [PATCH 0120/5397] Improved the Cart library --- system/libraries/Cart.php | 196 +++++++++------------------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 62 insertions(+), 135 deletions(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index 717ccd9fbe0..b2cc2081efa 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -1,13 +1,13 @@ -CI =& get_instance(); // Are any config settings being passed manually? If so, set them - $config = array(); - if (count($params) > 0) - { - foreach ($params as $key => $val) - { - $config[$key] = $val; - } - } + $config = is_array($params) ? $params : array(); // Load the Sessions class $this->CI->load->library('session', $config); - // Grab the shopping cart array from the session table, if it exists - if ($this->CI->session->userdata('cart_contents') !== FALSE) - { - $this->_cart_contents = $this->CI->session->userdata('cart_contents'); - } - else + // Grab the shopping cart array from the session table + $this->_cart_contents = $this->CI->session->userdata('cart_contents'); + if ($this->_cart_contents === FALSE) { // No cart exists so we'll set some base values - $this->_cart_contents['cart_total'] = 0; - $this->_cart_contents['total_items'] = 0; + $this->_cart_contents = array('cart_total' => 0, 'total_items' => 0); } log_message('debug', "Cart Class Initialized"); @@ -95,10 +84,10 @@ public function __construct($params = array()) * @param array * @return bool */ - function insert($items = array()) + public function insert($items = array()) { // Was any cart data passed? No? Bah... - if ( ! is_array($items) OR count($items) == 0) + if ( ! is_array($items) OR count($items) === 0) { log_message('error', 'The insert method must be passed an array containing data.'); return FALSE; @@ -132,7 +121,7 @@ function insert($items = array()) } // Save the cart data if the insert was successful - if ($save_cart == TRUE) + if ($save_cart === TRUE) { $this->_save_cart(); return isset($rowid) ? $rowid : TRUE; @@ -150,10 +139,10 @@ function insert($items = array()) * @param array * @return bool */ - function _insert($items = array()) + private function _insert($items = array()) { // Was any cart data passed? No? Bah... - if ( ! is_array($items) OR count($items) == 0) + if ( ! is_array($items) OR count($items) === 0) { log_message('error', 'The insert method must be passed an array containing data.'); return FALSE; @@ -170,10 +159,8 @@ function _insert($items = array()) // -------------------------------------------------------------------- - // Prep the quantity. It can only be a number. Duh... - $items['qty'] = trim(preg_replace('/([^0-9])/i', '', $items['qty'])); - // Trim any leading zeros - $items['qty'] = trim(preg_replace('/(^[0]+)/i', '', $items['qty'])); + // Prep the quantity. It can only be a number. Duh... also trim any leading zeros + $items['qty'] = ltrim(trim(preg_replace('/([^0-9])/i', '', $items['qty'])), '0'); // If the quantity is zero or blank there's nothing for us to do if ( ! is_numeric($items['qty']) OR $items['qty'] == 0) @@ -186,7 +173,7 @@ function _insert($items = array()) // Validate the product ID. It can only be alpha-numeric, dashes, underscores or periods // Not totally sure we should impose this rule, but it seems prudent to standardize IDs. // Note: These can be user-specified by setting the $this->product_id_rules variable. - if ( ! preg_match("/^[".$this->product_id_rules."]+$/i", $items['id'])) + if ( ! preg_match('/^['.$this->product_id_rules.']+$/i', $items['id'])) { log_message('error', 'Invalid product ID. The product ID can only contain alpha-numeric characters, dashes, and underscores'); return FALSE; @@ -196,7 +183,7 @@ function _insert($items = array()) // Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods. // Note: These can be user-specified by setting the $this->product_name_rules variable. - if ( $this->product_name_safe && ! preg_match("/^[".$this->product_name_rules."]+$/i", $items['name'])) + if ($this->product_name_safe && ! preg_match('/^['.$this->product_name_rules.']+$/i', $items['name'])) { log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces'); return FALSE; @@ -204,10 +191,8 @@ function _insert($items = array()) // -------------------------------------------------------------------- - // Prep the price. Remove anything that isn't a number or decimal point. - $items['price'] = trim(preg_replace('/([^0-9\.])/i', '', $items['price'])); - // Trim any leading zeros - $items['price'] = trim(preg_replace('/(^[0]+)/i', '', $items['price'])); + // Prep the price. Remove leading zeros and anything that isn't a number or decimal point. + $items['price'] = lrtrim(trim(preg_replace('/([^0-9\.])/i', '', $items['price'])), '0'); // Is the price a valid number? if ( ! is_numeric($items['price'])) @@ -244,33 +229,13 @@ function _insert($items = array()) // Now that we have our unique "row ID", we'll add our cart items to the master array // grab quantity if it's already there and add it on - if (isset($this->_cart_contents[$rowid]['qty'])) - { - // set our old quantity - $old_quantity = (int)$this->_cart_contents[$rowid]['qty']; - } - else - { - // we have no old quantity but - we don't want to throw an error - $old_quantity = 0; - } - - // let's unset this first, just to make sure our index contains only the data from this submission - unset($this->_cart_contents[$rowid]); + $old_quantity = isset($this->_cart_contents[$rowid]['qty']) ? (int) $this->_cart_contents[$rowid]['qty'] : 0; - // Create a new index with our new row ID - $this->_cart_contents[$rowid]['rowid'] = $rowid; + // Re-create the entry, just to make sure our index contains only the data from this submission + $items['rowid'] = $rowid; + $items['qty'] += $old_quantity; + $this->_cart_contents[$rowid] = $items; - // And add the new items to the cart array - foreach ($items as $key => $val) - { - $this->_cart_contents[$rowid][$key] = $val; - } - - // add old quantity back in - $this->_cart_contents[$rowid]['qty'] = ($this->_cart_contents[$rowid]['qty'] + $old_quantity); - - // Woot! return $rowid; } @@ -289,10 +254,10 @@ function _insert($items = array()) * @param string * @return bool */ - function update($items = array()) + public function update($items = array()) { // Was any cart data passed? - if ( ! is_array($items) OR count($items) == 0) + if ( ! is_array($items) OR count($items) === 0) { return FALSE; } @@ -302,9 +267,9 @@ function update($items = array()) // determine the array type is by looking for a required array key named "id". // If it's not found we assume it's a multi-dimensional array $save_cart = FALSE; - if (isset($items['rowid']) AND isset($items['qty'])) + if (isset($items['rowid'], $items['qty'])) { - if ($this->_update($items) == TRUE) + if ($this->_update($items) === TRUE) { $save_cart = TRUE; } @@ -313,9 +278,9 @@ function update($items = array()) { foreach ($items as $val) { - if (is_array($val) AND isset($val['rowid']) AND isset($val['qty'])) + if (is_array($val) && isset($val['rowid'], $val['qty'])) { - if ($this->_update($val) == TRUE) + if ($this->_update($val) === TRUE) { $save_cart = TRUE; } @@ -324,7 +289,7 @@ function update($items = array()) } // Save the cart data if the insert was successful - if ($save_cart == TRUE) + if ($save_cart === TRUE) { $this->_save_cart(); return TRUE; @@ -347,7 +312,7 @@ function update($items = array()) * @param array * @return bool */ - function _update($items = array()) + private function _update($items = array()) { // Without these array indexes there is nothing we can do if ( ! isset($items['qty']) OR ! isset($items['rowid']) OR ! isset($this->_cart_contents[$items['rowid']])) @@ -393,15 +358,10 @@ function _update($items = array()) * @access private * @return bool */ - function _save_cart() + private function _save_cart() { - // Unset these so our total can be calculated correctly below - unset($this->_cart_contents['total_items']); - unset($this->_cart_contents['cart_total']); - // Lets add up the individual prices and set the cart sub-total - $total = 0; - $items = 0; + $this->_cart_contents['total_items'] = $this->_cart_contents['cart_total'] = 0; foreach ($this->_cart_contents as $key => $val) { // We make sure the array contains the proper indexes @@ -410,17 +370,11 @@ function _save_cart() continue; } - $total += ($val['price'] * $val['qty']); - $items += $val['qty']; - - // Set the subtotal + $this->_cart_contents['cart_total'] += ($val['price'] * $val['qty']); + $this->_cart_contents['total_items'] += $val['qty']; $this->_cart_contents[$key]['subtotal'] = ($this->_cart_contents[$key]['price'] * $this->_cart_contents[$key]['qty']); } - // Set the cart total and total items. - $this->_cart_contents['total_items'] = $items; - $this->_cart_contents['cart_total'] = $total; - // Is our cart empty? If so we delete it from the session if (count($this->_cart_contents) <= 2) { @@ -434,7 +388,6 @@ function _save_cart() // Let's pass it to the Session class so it can be stored $this->CI->session->set_userdata(array('cart_contents' => $this->_cart_contents)); - // Woot! return TRUE; } @@ -446,13 +399,13 @@ function _save_cart() * @access public * @return integer */ - function total() + public function total() { return $this->_cart_contents['cart_total']; } - + // -------------------------------------------------------------------- - + /** * Remove Item * @@ -463,16 +416,12 @@ function total() */ public function remove($rowid) { - // just do an unset + // unset & save unset($this->_cart_contents[$rowid]); - - // we need to save the cart now we've made our changes $this->_save_cart(); - - // completed - return true; + return TRUE; } - + // -------------------------------------------------------------------- /** @@ -483,7 +432,7 @@ public function remove($rowid) * @access public * @return integer */ - function total_items() + public function total_items() { return $this->_cart_contents['total_items']; } @@ -498,19 +447,10 @@ function total_items() * @access public * @return array */ - function contents($newest_first = false) + public function contents($newest_first = FALSE) { // do we want the newest first? - if($newest_first) - { - // reverse the array - $cart = array_reverse($this->_cart_contents); - } - else - { - // just added first to last - $cart = $this->_cast_contents; - } + $cart = ($newest_first) ? array_reverse($this->_cart_contents) : $this->_cart_contents; // Remove these so they don't create a problem when showing the cart table unset($cart['total_items']); @@ -528,16 +468,11 @@ function contents($newest_first = false) * that has options associated with it. * * @access public - * @return array + * @return bool */ - function has_options($rowid = '') + public function has_options($rowid = '') { - if ( ! isset($this->_cart_contents[$rowid]['options']) OR count($this->_cart_contents[$rowid]['options']) === 0) - { - return FALSE; - } - - return TRUE; + return (isset($this->_cart_contents[$rowid]['options']) && count($this->_cart_contents[$rowid]['options']) !== 0) ? TRUE : FALSE; } // -------------------------------------------------------------------- @@ -550,14 +485,9 @@ function has_options($rowid = '') * @access public * @return array */ - function product_options($rowid = '') + public function product_options($rowid = '') { - if ( ! isset($this->_cart_contents[$rowid]['options'])) - { - return array(); - } - - return $this->_cart_contents[$rowid]['options']; + return isset($this->_cart_contents[$rowid]['options']) ? $this->_cart_contents[$rowid]['options'] : array(); } // -------------------------------------------------------------------- @@ -568,9 +498,9 @@ function product_options($rowid = '') * Returns the supplied number with commas and a decimal point. * * @access public - * @return integer + * @return string */ - function format_number($n = '') + public function format_number($n = '') { if ($n == '') { @@ -591,15 +521,11 @@ function format_number($n = '') * Empties the cart and kills the session * * @access public - * @return null + * @return void */ - function destroy() + public function destroy() { - unset($this->_cart_contents); - - $this->_cart_contents['cart_total'] = 0; - $this->_cart_contents['total_items'] = 0; - + $this->_cart_contents = array('cart_total' => 0, 'total_items' => 0); $this->CI->session->unset_userdata('cart_contents'); } @@ -608,4 +534,4 @@ function destroy() // END Cart Class /* End of file Cart.php */ -/* Location: ./system/libraries/Cart.php */ \ No newline at end of file +/* Location: ./system/libraries/Cart.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 62f60b1bba2..8a7109feb6e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -75,6 +75,7 @@ Bug fixes for 3.0 - Fixed a bug where using $this->dbforge->create_table() with PostgreSQL database could lead to fetching whole table. - Bug #795 - Fixed form method and accept-charset when passing an empty array. - Bug #797 - timespan was using incorrect seconds for year and month. +- Fixed a bug in CI_Cart::contents() where if called without a TRUE (or equal) parameter, it would fail due to a typo. Version 2.1.0 ============= From 2c685fb03a4d4b5a96789b839147191ce8cffacc Mon Sep 17 00:00:00 2001 From: pporlan Date: Thu, 22 Dec 2011 12:15:25 +0100 Subject: [PATCH 0121/5397] Adding $escape parameter to the order_by function, this enables ordering by custom fields --- system/database/DB_active_rec.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index 41950e7d803..412febfccf1 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -830,9 +830,10 @@ protected function _having($key, $value = '', $type = 'AND ', $escape = TRUE) * * @param string * @param string direction: asc or desc + * @param bool enable field name escaping * @return object */ - public function order_by($orderby, $direction = '') + public function order_by($orderby, $direction = '', $escape = TRUE) { if (strtolower($direction) == 'random') { @@ -845,7 +846,7 @@ public function order_by($orderby, $direction = '') } - if (strpos($orderby, ',') !== FALSE) + if ((strpos($orderby, ',') !== FALSE) && ($escape === TRUE)) { $temp = array(); foreach (explode(',', $orderby) as $part) @@ -863,7 +864,10 @@ public function order_by($orderby, $direction = '') } else if ($direction != $this->_random_keyword) { - $orderby = $this->_protect_identifiers($orderby); + if ($escape === TRUE) + { + $orderby = $this->_protect_identifiers($orderby); + } } $orderby_statement = $orderby.$direction; From 17779d6163aa3a2b0544a45f7159717c95a23c2f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 22 Dec 2011 13:21:08 +0200 Subject: [PATCH 0122/5397] Cast to float instead of using preg_replace() for sanitizing numbers --- system/libraries/Cart.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index b2cc2081efa..01a0cb8cea6 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -160,7 +160,7 @@ private function _insert($items = array()) // -------------------------------------------------------------------- // Prep the quantity. It can only be a number. Duh... also trim any leading zeros - $items['qty'] = ltrim(trim(preg_replace('/([^0-9])/i', '', $items['qty'])), '0'); + $items['qty'] = (float) $items['qty']; // If the quantity is zero or blank there's nothing for us to do if ( ! is_numeric($items['qty']) OR $items['qty'] == 0) @@ -192,7 +192,7 @@ private function _insert($items = array()) // -------------------------------------------------------------------- // Prep the price. Remove leading zeros and anything that isn't a number or decimal point. - $items['price'] = lrtrim(trim(preg_replace('/([^0-9\.])/i', '', $items['price'])), '0'); + $items['price'] = (float) $items['price']; // Is the price a valid number? if ( ! is_numeric($items['price'])) @@ -321,7 +321,7 @@ private function _update($items = array()) } // Prep the quantity - $items['qty'] = preg_replace('/([^0-9])/i', '', $items['qty']); + $items['qty'] = (float) $items['qty']; // Is the quantity a number? if ( ! is_numeric($items['qty'])) @@ -388,6 +388,7 @@ private function _save_cart() // Let's pass it to the Session class so it can be stored $this->CI->session->set_userdata(array('cart_contents' => $this->_cart_contents)); + // Woot! return TRUE; } @@ -508,7 +509,7 @@ public function format_number($n = '') } // Remove anything that isn't a number or decimal point. - $n = trim(preg_replace('/([^0-9\.])/i', '', $n)); + $n = (float) $n; return number_format($n, 2, '.', ','); } From 83d15051930c48643dc7f684275eb92b41e26cb6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 22 Dec 2011 13:35:42 +0200 Subject: [PATCH 0123/5397] Clean up the Driver library --- system/libraries/Driver.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index 8df137e74fc..183a9598531 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -1,13 +1,13 @@ -lib_name)) { @@ -55,11 +55,11 @@ function __get($child) // The class will be prefixed with the parent lib $child_class = $this->lib_name.'_'.$child; - + // Remove the CI_ prefix and lowercase $lib_name = ucfirst(strtolower(str_replace('CI_', '', $this->lib_name))); $driver_name = strtolower(str_replace('CI_', '', $child_class)); - + if (in_array($driver_name, array_map('strtolower', $this->valid_drivers))) { // check and see if the driver is in a separate file @@ -119,6 +119,7 @@ function __get($child) * @link */ class CI_Driver { + protected $parent; private $methods = array(); @@ -238,4 +239,4 @@ public function __set($var, $val) // END CI_Driver CLASS /* End of file Driver.php */ -/* Location: ./system/libraries/Driver.php */ \ No newline at end of file +/* Location: ./system/libraries/Driver.php */ From 1bd3d887057ce807944188f8f18142c14418b2ea Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 22 Dec 2011 15:38:20 +0200 Subject: [PATCH 0124/5397] Improve the Email library --- system/libraries/Email.php | 480 +++++++++++++------------------------ 1 file changed, 172 insertions(+), 308 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 631b62e863c..5158e859c16 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1,13 +1,13 @@ -_smtp_auth = ($this->smtp_user == '' AND $this->smtp_pass == '') ? FALSE : TRUE; - $this->_safe_mode = ((boolean)@ini_get("safe_mode") === FALSE) ? FALSE : TRUE; + $this->_safe_mode = (bool) @ini_get("safe_mode"); } log_message('debug', "Email Class Initialized"); @@ -140,7 +140,7 @@ public function initialize($config = array()) $this->clear(); $this->_smtp_auth = ($this->smtp_user == '' AND $this->smtp_pass == '') ? FALSE : TRUE; - $this->_safe_mode = ((boolean)@ini_get("safe_mode") === FALSE) ? FALSE : TRUE; + $this->_safe_mode = (bool) @ini_get("safe_mode"); return $this; } @@ -194,7 +194,7 @@ public function from($from, $name = '') { if (preg_match( '/\<(.*)\>/', $from, $match)) { - $from = $match['1']; + $from = $match[1]; } if ($this->validate) @@ -237,7 +237,7 @@ public function reply_to($replyto, $name = '') { if (preg_match( '/\<(.*)\>/', $replyto, $match)) { - $replyto = $match['1']; + $replyto = $match[1]; } if ($this->validate) @@ -250,7 +250,7 @@ public function reply_to($replyto, $name = '') $name = $replyto; } - if (strncmp($name, '"', 1) != 0) + if (strncmp($name, '"', 1) !== 0) { $name = '"'.$name.'"'; } @@ -280,7 +280,7 @@ public function to($to) $this->validate_email($to); } - if ($this->_get_protocol() != 'mail') + if ($this->_get_protocol() !== 'mail') { $this->_set_header('To', implode(", ", $to)); } @@ -320,7 +320,7 @@ public function cc($cc) $this->_set_header('Cc', implode(", ", $cc)); - if ($this->_get_protocol() == "smtp") + if ($this->_get_protocol() === 'smtp') { $this->_cc_array = $cc; } @@ -354,7 +354,7 @@ public function bcc($bcc, $limit = '') $this->validate_email($bcc); } - if (($this->_get_protocol() == "smtp") OR ($this->bcc_batch_mode && count($bcc) > $this->bcc_batch_size)) + if ($this->_get_protocol() === 'smtp' OR ($this->bcc_batch_mode && count($bcc) > $this->bcc_batch_size)) { $this->_bcc_array = $bcc; } @@ -538,19 +538,13 @@ public function set_protocol($protocol = 'mail') */ public function set_priority($n = 3) { - if ( ! is_numeric($n)) - { - $this->priority = 3; - return; - } - - if ($n < 1 OR $n > 5) + if ( ! is_numeric($n) OR $n < 1 OR $n > 5) { $this->priority = 3; return; } - $this->priority = $n; + $this->priority = (int) $n; return $this; } @@ -565,14 +559,7 @@ public function set_priority($n = 3) */ public function set_newline($newline = "\n") { - if ($newline != "\n" AND $newline != "\r\n" AND $newline != "\r") - { - $this->newline = "\n"; - return; - } - - $this->newline = $newline; - + $this->newline = ($newline !== "\n" AND $newline !== "\r\n" AND $newline !== "\r") ? "\n" : $newline; return $this; } @@ -587,14 +574,7 @@ public function set_newline($newline = "\n") */ public function set_crlf($crlf = "\n") { - if ($crlf != "\n" AND $crlf != "\r\n" AND $crlf != "\r") - { - $this->crlf = "\n"; - return; - } - - $this->crlf = $crlf; - + $this->crlf = ($crlf !== "\n" AND $crlf !== "\r\n" AND $crlf !== "\r") ? "\n" : $crlf; return $this; } @@ -622,9 +602,7 @@ protected function _set_boundaries() */ protected function _get_message_id() { - $from = $this->_headers['Return-Path']; - $from = str_replace(">", "", $from); - $from = str_replace("<", "", $from); + $from = str_replace(array('>', '<'), array('', ''), $this->_headers['Return-Path']); return "<".uniqid('').strstr($from, '@').">"; } @@ -664,7 +642,7 @@ protected function _get_encoding($return = TRUE) foreach ($this->_base_charsets as $charset) { - if (strncmp($charset, $this->charset, strlen($charset)) == 0) + if (strncmp($charset, $this->charset, strlen($charset)) === 0) { $this->_encoding = '7bit'; } @@ -686,15 +664,15 @@ protected function _get_encoding($return = TRUE) */ protected function _get_content_type() { - if ($this->mailtype == 'html' && count($this->_attach_name) == 0) + if ($this->mailtype === 'html' && count($this->_attach_name) === 0) { return 'html'; } - elseif ($this->mailtype == 'html' && count($this->_attach_name) > 0) + elseif ($this->mailtype === 'html' && count($this->_attach_name) > 0) { return 'html-attach'; } - elseif ($this->mailtype == 'text' && count($this->_attach_name) > 0) + elseif ($this->mailtype === 'text' && count($this->_attach_name) > 0) { return 'plain-attach'; } @@ -715,9 +693,9 @@ protected function _get_content_type() protected function _set_date() { $timezone = date("Z"); - $operator = (strncmp($timezone, '-', 1) == 0) ? '-' : '+'; + $operator = (strncmp($timezone, '-', 1) === 0) ? '-' : '+'; $timezone = abs($timezone); - $timezone = floor($timezone/3600) * 100 + ($timezone % 3600 ) / 60; + $timezone = floor($timezone/3600) * 100 + ($timezone % 3600) / 60; return sprintf("%s %s%04d", date("D, j M Y H:i:s"), $operator, $timezone); } @@ -775,7 +753,7 @@ public function validate_email($email) */ public function valid_email($address) { - return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $address)) ? FALSE : TRUE; + return (bool) preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $address); } // -------------------------------------------------------------------- @@ -791,28 +769,14 @@ public function clean_email($email) { if ( ! is_array($email)) { - if (preg_match('/\<(.*)\>/', $email, $match)) - { - return $match['1']; - } - else - { - return $email; - } + return (preg_match('/\<(.*)\>/', $email, $match)) ? $match[1] : $email; } $clean_email = array(); foreach ($email as $addy) { - if (preg_match( '/\<(.*)\>/', $addy, $match)) - { - $clean_email[] = $match['1']; - } - else - { - $clean_email[] = $addy; - } + $clean_email[] = (preg_match( '/\<(.*)\>/', $addy, $match)) ? $match[1] : $addy; } return $clean_email; @@ -838,32 +802,15 @@ protected function _get_alt_message() return $this->word_wrap($this->alt_message, '76'); } - if (preg_match('/\(.*)\<\/body\>/si', $this->_body, $match)) - { - $body = $match['1']; - } - else - { - $body = $this->_body; - } - - $body = trim(strip_tags($body)); - $body = preg_replace( '# '.$message. ' '.$filepath.' '.$line, TRUE); } @@ -108,15 +101,14 @@ function log_exception($severity, $message, $filepath, $line) /** * 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) + public function show_404($page = '', $log_error = TRUE) { - $heading = "404 Page Not Found"; - $message = "The page you requested was not found."; + $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) @@ -137,14 +129,13 @@ function show_404($page = '', $log_error = TRUE) * (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) + public function show_error($heading, $message, $template = 'error_general', $status_code = 500) { set_status_header($status_code); @@ -155,7 +146,7 @@ function show_error($heading, $message, $template = 'error_general', $status_cod ob_end_flush(); } ob_start(); - include(APPPATH.'errors/'.$template.'.php'); + include(APPPATH.'errors'.DIRECTORY_SEPARATOR.$template.'.php'); $buffer = ob_get_contents(); ob_end_clean(); return $buffer; @@ -166,7 +157,6 @@ function show_error($heading, $message, $template = 'error_general', $status_cod /** * Native PHP error handler * - * @access private * @param string the error severity * @param string the error string * @param string the error filepath @@ -176,8 +166,7 @@ function show_error($heading, $message, $template = 'error_general', $status_cod function show_php_error($severity, $message, $filepath, $line) { $severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity]; - - $filepath = str_replace("\\", "/", $filepath); + $filepath = str_replace('\\', '/', $filepath); // For safety reasons we do not show the full file path if (FALSE !== strpos($filepath, '/')) @@ -191,15 +180,13 @@ function show_php_error($severity, $message, $filepath, $line) ob_end_flush(); } ob_start(); - include(APPPATH.'errors/error_php.php'); + include(APPPATH.'errors'.DIRECTORY_SEPARATOR.'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 */ \ No newline at end of file +/* Location: ./system/core/Exceptions.php */ From 64e98aab6ba2c692a881035245efb94a76deb428 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 7 Jan 2012 20:29:10 +0200 Subject: [PATCH 0227/5397] Improve code Input & Model libraries --- system/core/Input.php | 97 +++++++++++++++---------------------------- system/core/Model.php | 19 +++------ 2 files changed, 39 insertions(+), 77 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index 7cfa4c63ffa..07bb30b155b 100755 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -1,13 +1,13 @@ -_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); + $this->_enable_xss = (config_item('global_xss_filtering') === TRUE); + $this->_enable_csrf = (config_item('csrf_protection') === TRUE); global $SEC; $this->security =& $SEC; @@ -122,7 +122,6 @@ public function __construct() * * This is a helper function to retrieve values from global arrays * - * @access protected * @param array * @param string * @param bool @@ -148,7 +147,6 @@ protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) /** * Fetch an item from the GET array * - * @access public * @param string * @param bool * @return string @@ -176,7 +174,6 @@ public function get($index = NULL, $xss_clean = FALSE) /** * Fetch an item from the POST array * - * @access public * @param string * @param bool * @return string @@ -205,21 +202,15 @@ public function post($index = NULL, $xss_clean = FALSE) /** * Fetch an item from either the GET array or the POST * - * @access public * @param string The index key * @param bool XSS cleaning * @return string */ public function get_post($index = '', $xss_clean = FALSE) { - if ( ! isset($_POST[$index]) ) - { - return $this->get($index, $xss_clean); - } - else - { - return $this->post($index, $xss_clean); - } + return ( ! isset($_POST[$index])) + ? $this->get($index, $xss_clean) + : $this->post($index, $xss_clean); } // -------------------------------------------------------------------- @@ -227,7 +218,6 @@ public function get_post($index = '', $xss_clean = FALSE) /** * Fetch an item from the COOKIE array * - * @access public * @param string * @param bool * @return string @@ -245,7 +235,6 @@ public function cookie($index = '', $xss_clean = FALSE) * 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 @@ -303,7 +292,6 @@ public function set_cookie($name = '', $value = '', $expire = '', $domain = '', /** * Fetch an item from the SERVER array * - * @access public * @param string * @param bool * @return string @@ -318,7 +306,6 @@ public function server($index = '', $xss_clean = FALSE) /** * Fetch the IP Address * - * @access public * @return string */ public function ip_address() @@ -335,7 +322,7 @@ public function ip_address() $this->ip_address = in_array($_SERVER['REMOTE_ADDR'], $proxies) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; } - elseif (! $this->server('HTTP_CLIENT_IP') AND $this->server('REMOTE_ADDR')) + elseif ( ! $this->server('HTTP_CLIENT_IP') AND $this->server('REMOTE_ADDR')) { $this->ip_address = $_SERVER['REMOTE_ADDR']; } @@ -354,8 +341,7 @@ public function ip_address() if ($this->ip_address === FALSE) { - $this->ip_address = '0.0.0.0'; - return $this->ip_address; + return $this->ip_address = '0.0.0.0'; } if (strpos($this->ip_address, ',') !== FALSE) @@ -366,7 +352,7 @@ public function ip_address() if ( ! $this->valid_ip($this->ip_address)) { - $this->ip_address = '0.0.0.0'; + return $this->ip_address = '0.0.0.0'; } return $this->ip_address; @@ -379,7 +365,6 @@ public function ip_address() * * Updated version suggested by Geert De Deckere * - * @access public * @param string * @return bool */ @@ -394,7 +379,7 @@ public function valid_ip($ip) $ip_segments = explode('.', $ip); // Always 4 segments needed - if (count($ip_segments) != 4) + if (count($ip_segments) !== 4) { return FALSE; } @@ -422,7 +407,6 @@ public function valid_ip($ip) /** * User Agent * - * @access public * @return string */ public function user_agent() @@ -432,9 +416,7 @@ public function user_agent() return $this->user_agent; } - $this->user_agent = ( ! isset($_SERVER['HTTP_USER_AGENT'])) ? FALSE : $_SERVER['HTTP_USER_AGENT']; - - return $this->user_agent; + return $this->user_agent = ( ! isset($_SERVER['HTTP_USER_AGENT'])) ? FALSE : $_SERVER['HTTP_USER_AGENT']; } // -------------------------------------------------------------------- @@ -444,22 +426,20 @@ public function user_agent() * * This function does the following: * - * Unsets $_GET data (if query strings are not enabled) - * - * Unsets all globals if register_globals is enabled + * - Unsets $_GET data (if query strings are not enabled) + * - Unsets all globals if register_globals is enabled + * - Standardizes newline characters to \n * - * Standardizes newline characters to \n - * - * @access private * @return void */ private 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'); + '_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 @@ -532,7 +512,6 @@ private function _sanitize_globals() // Sanitize PHP_SELF $_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); - // CSRF Protection check if ($this->_enable_csrf == TRUE) { @@ -550,7 +529,6 @@ private function _sanitize_globals() * This is a helper function. It escapes data and * standardizes newline characters to \n * - * @access private * @param string * @return string */ @@ -592,12 +570,9 @@ private function _clean_input_data($str) } // Standardize newlines if needed - if ($this->_standardize_newlines == TRUE) + if ($this->_standardize_newlines == TRUE AND strpos($str, "\r") !== FALSE) { - if (strpos($str, "\r") !== FALSE) - { - $str = str_replace(array("\r\n", "\r", "\r\n\n"), PHP_EOL, $str); - } + return str_replace(array("\r\n", "\r", "\r\n\n"), PHP_EOL, $str); } return $str; @@ -612,13 +587,12 @@ private function _clean_input_data($str) * 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 */ private function _clean_input_keys($str) { - if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str)) + if ( ! preg_match('/^[a-z0-9:_\/-]+$/i', $str)) { exit('Disallowed Key Characters.'); } @@ -626,7 +600,7 @@ private function _clean_input_keys($str) // Clean UTF-8 if supported if (UTF8_ENABLED === TRUE) { - $str = $this->uni->clean_string($str); + return $this->uni->clean_string($str); } return $str; @@ -640,10 +614,8 @@ private function _clean_input_keys($str) * In Apache, you can simply call apache_request_headers(), however for * people running other webservers the function is undefined. * - * @access public * @param bool XSS cleaning - * - * @return array + * @return array */ public function request_headers($xss_clean = FALSE) { @@ -658,7 +630,7 @@ public function request_headers($xss_clean = FALSE) foreach ($_SERVER as $key => $val) { - if (strncmp($key, 'HTTP_', 5) === 0) + if (strpos($key, 'HTTP_') === 0) { $headers[substr($key, 5)] = $this->_fetch_from_array($_SERVER, $key, $xss_clean); } @@ -684,7 +656,6 @@ public function request_headers($xss_clean = FALSE) * * Returns the value of a single member of the headers class member * - * @access public * @param string array key for $this->headers * @param boolean XSS Clean or not * @return mixed FALSE on failure, string on success @@ -716,7 +687,6 @@ public function get_request_header($index, $xss_clean = FALSE) * * Test to see if a request contains the HTTP_X_REQUESTED_WITH header * - * @access public * @return boolean */ public function is_ajax_request() @@ -731,12 +701,11 @@ public function is_ajax_request() * * Test to see if a request was made from the command line * - * @access public * @return boolean */ public function is_cli_request() { - return (php_sapi_name() == 'cli') or defined('STDIN'); + return (php_sapi_name() === 'cli') or defined('STDIN'); } } diff --git a/system/core/Model.php b/system/core/Model.php index fc640139aec..cd64468b86e 100755 --- a/system/core/Model.php +++ b/system/core/Model.php @@ -1,13 +1,13 @@ -$key; } } -// END Model Class /* End of file Model.php */ -/* Location: ./system/core/Model.php */ \ No newline at end of file +/* Location: ./system/core/Model.php */ From 1f5fbb6cb35f5d234f9f2c95f730b13a9015f3c2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 7 Jan 2012 20:53:29 +0200 Subject: [PATCH 0228/5397] Improve the core Output library --- system/core/Output.php | 150 +++++++++++++---------------------------- 1 file changed, 46 insertions(+), 104 deletions(-) diff --git a/system/core/Output.php b/system/core/Output.php index e529f914db9..272545046d0 100755 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -1,13 +1,13 @@ -_zlib_oc = @ini_get('zlib.output_compression'); @@ -117,8 +105,7 @@ function __construct() $this->mime_types = $mimes; - - log_message('debug', "Output Class Initialized"); + log_message('debug', 'Output Class Initialized'); } // -------------------------------------------------------------------- @@ -128,10 +115,9 @@ function __construct() * * Returns the current output string * - * @access public * @return string */ - function get_output() + public function get_output() { return $this->final_output; } @@ -147,10 +133,9 @@ function get_output() * @param string * @return void */ - function set_output($output) + public function set_output($output) { $this->final_output = $output; - return $this; } @@ -161,11 +146,10 @@ function set_output($output) * * Appends data onto the output string * - * @access public * @param string * @return void */ - function append_output($output) + public function append_output($output) { if ($this->final_output == '') { @@ -189,25 +173,22 @@ function append_output($output) * 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) + public 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; } @@ -216,11 +197,10 @@ function set_header($header, $replace = TRUE) /** * Set Content Type Header * - * @access public * @param string extension of the file we're outputting * @return void */ - function set_content_type($mime_type) + public function set_content_type($mime_type) { if (strpos($mime_type, '/') === FALSE) { @@ -241,7 +221,6 @@ function set_content_type($mime_type) $header = 'Content-Type: '.$mime_type; $this->headers[] = array($header, TRUE); - return $this; } @@ -251,15 +230,13 @@ function set_content_type($mime_type) * 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 = '') + public function set_status_header($code = 200, $text = '') { set_status_header($code, $text); - return $this; } @@ -268,14 +245,12 @@ function set_status_header($code = 200, $text = '') /** * Enable/disable Profiler * - * @access public * @param bool * @return void */ - function enable_profiler($val = TRUE) + public function enable_profiler($val = TRUE) { $this->enable_profiler = (is_bool($val)) ? $val : TRUE; - return $this; } @@ -286,11 +261,10 @@ function enable_profiler($val = TRUE) * * Allows override of default / config settings for Profiler section display * - * @access public * @param array * @return void */ - function set_profiler_sections($sections) + public function set_profiler_sections($sections) { foreach ($sections as $section => $enable) { @@ -305,14 +279,12 @@ function set_profiler_sections($sections) /** * Set Cache * - * @access public * @param integer * @return void */ - function cache($time) + publi function cache($time) { $this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time; - return $this; } @@ -329,11 +301,10 @@ function cache($time) * 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 = '') + public 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, @@ -375,22 +346,17 @@ function _display($output = '') { $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); + $output = str_replace(array('{elapsed_time}', '{memory_usage}'), array($elapsed, $memory), $output); } // -------------------------------------------------------------------- // Is compression requested? - if ($CFG->item('compress_output') === TRUE && $this->_zlib_oc == FALSE) + if ($CFG->item('compress_output') === TRUE && $this->_zlib_oc == FALSE + && extension_loaded('zlib') + && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) { - if (extension_loaded('zlib')) - { - if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) AND strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) - { - ob_start('ob_gzhandler'); - } - } + ob_start('ob_gzhandler'); } // -------------------------------------------------------------------- @@ -412,8 +378,8 @@ function _display($output = '') if ( ! isset($CI)) { echo $output; - log_message('debug', "Final output sent to browser"); - log_message('debug', "Total execution time: ".$elapsed); + log_message('debug', 'Final output sent to browser'); + log_message('debug', 'Total execution time: '.$elapsed); return TRUE; } @@ -424,7 +390,6 @@ function _display($output = '') if ($this->enable_profiler == TRUE) { $CI->load->library('profiler'); - if ( ! empty($this->_profiler_sections)) { $CI->profiler->set_sections($this->_profiler_sections); @@ -432,16 +397,11 @@ function _display($output = '') // If the output data contains closing and tags // we will remove them and add them back after we insert the profile data - if (preg_match("|.*?|is", $output)) + $output = preg_replace('|.*?|is', '', $output, $count).$CI->profiler->run(); + if ($count > 0) { - $output = preg_replace("|.*?|is", '', $output); - $output .= $CI->profiler->run(); $output .= ''; } - else - { - $output .= $CI->profiler->run(); - } } // -------------------------------------------------------------------- @@ -457,8 +417,8 @@ function _display($output = '') echo $output; // Send it to the browser! } - log_message('debug', "Final output sent to browser"); - log_message('debug', "Total execution time: ".$elapsed); + log_message('debug', 'Final output sent to browser'); + log_message('debug', 'Total execution time: '.$elapsed); } // -------------------------------------------------------------------- @@ -466,20 +426,18 @@ function _display($output = '') /** * Write a Cache File * - * @access public * @param string * @return void */ - function _write_cache($output) + public 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); + log_message('error', 'Unable to write cache file: '.$cache_path); return; } @@ -491,7 +449,7 @@ function _write_cache($output) if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE)) { - log_message('error', "Unable to write cache file: ".$cache_path); + log_message('error', 'Unable to write cache file: '.$cache_path); return; } @@ -504,13 +462,13 @@ function _write_cache($output) } else { - log_message('error', "Unable to secure a file lock for file at: ".$cache_path); + 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); + log_message('debug', 'Cache file written: '.$cache_path); } // -------------------------------------------------------------------- @@ -518,69 +476,53 @@ function _write_cache($output) /** * Update/serve a cached file * - * @access public * @param object config class * @param object uri class * @return void */ - function _display_cache(&$CFG, &$URI) + public 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; - + // 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)) + if ( ! @file_exists($filepath) + OR ! $fp = @fopen($filepath, FOPEN_READ)) { return FALSE; } flock($fp, LOCK_SH); - $cache = ''; - if (filesize($filepath) > 0) - { - $cache = fread($fp, filesize($filepath)); - } + $cache = (filesize($filepath) > 0) ? fread($fp, filesize($filepath)) : ''; flock($fp, LOCK_UN); fclose($fp); // Strip out the embedded timestamp - if ( ! preg_match("/(\d+TS--->)/", $cache, $match)) + 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 (time() >= trim(str_replace('TS--->', '', $match[1])) + AND is_really_writable($cache_path)) { - if (is_really_writable($cache_path)) - { - @unlink($filepath); - log_message('debug', "Cache file has expired. File deleted"); - return FALSE; - } + @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."); + $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 */ \ No newline at end of file +/* Location: ./system/core/Output.php */ From ba6c04113313d49618b00c434fd5eedc6ab8a653 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 7 Jan 2012 21:10:09 +0200 Subject: [PATCH 0229/5397] Improve the core Router library --- system/core/Router.php | 107 ++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 70 deletions(-) diff --git a/system/core/Router.php b/system/core/Router.php index 8cad8688825..d21319565d4 100755 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -1,13 +1,13 @@ -config =& load_class('Config', 'core'); $this->uri =& load_class('URI', 'core'); - log_message('debug', "Router Class Initialized"); + log_message('debug', 'Router Class Initialized'); } // -------------------------------------------------------------------- @@ -110,12 +103,11 @@ function __construct() * 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() + public function _set_routing() { - // Are query strings enabled in the config file? Normally CI doesn't utilize query strings + // 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(); @@ -157,7 +149,7 @@ function _set_routing() // 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. + // 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); @@ -172,17 +164,10 @@ function _set_routing() 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(); + $this->uri->_remove_url_suffix(); // Remove the URL suffix + $this->uri->_explode_segments(); // Compile the segments into an array + $this->_parse_routes(); // Parse any custom routing that may exist + $this->uri->_reindex_segments(); // Re-index the segment array so that it starts with 1 rather than 0 } // -------------------------------------------------------------------- @@ -190,20 +175,18 @@ function _set_routing() /** * Set the default controller * - * @access private * @return void */ - function _set_default_controller() + protected 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."); + 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); @@ -218,7 +201,7 @@ function _set_default_controller() // 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."); + log_message('debug', 'No URI present. Default controller set.'); } // -------------------------------------------------------------------- @@ -229,16 +212,15 @@ function _set_default_controller() * 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()) + protected function _set_request($segments = array()) { $segments = $this->_validate_request($segments); - if (count($segments) == 0) + if (count($segments) === 0) { return $this->_set_default_controller(); } @@ -269,13 +251,12 @@ function _set_request($segments = array()) * Validates the supplied segments. Attempts to determine the path to * the controller. * - * @access private * @param array * @return array */ - function _validate_request($segments) + protected function _validate_request($segments) { - if (count($segments) == 0) + if (count($segments) === 0) { return $segments; } @@ -301,7 +282,6 @@ function _validate_request($segments) 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'); @@ -320,7 +300,6 @@ function _validate_request($segments) if (strpos($this->default_controller, '/') !== FALSE) { $x = explode('/', $this->default_controller); - $this->set_class($x[0]); $this->set_method($x[1]); } @@ -344,18 +323,16 @@ function _validate_request($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 + // 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]); } @@ -369,10 +346,9 @@ function _validate_request($segments) * 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() + protected function _parse_routes() { // Turn the segment array into a URI string $uri = implode('/', $this->uri->segments); @@ -387,7 +363,7 @@ function _parse_routes() foreach ($this->routes as $key => $val) { // Convert wild-cards to RegEx - $key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key)); + $key = str_replace(array(':any', ':num'), array('.+', '[0-9]+'), $key); // Does the RegEx match? if (preg_match('#^'.$key.'$#', $uri)) @@ -412,11 +388,10 @@ function _parse_routes() /** * Set the class name * - * @access public * @param string * @return void */ - function set_class($class) + public function set_class($class) { $this->class = str_replace(array('/', '.'), '', $class); } @@ -426,10 +401,9 @@ function set_class($class) /** * Fetch the current class * - * @access public * @return string */ - function fetch_class() + public function fetch_class() { return $this->class; } @@ -439,11 +413,10 @@ function fetch_class() /** * Set the method name * - * @access public * @param string * @return void */ - function set_method($method) + public function set_method($method) { $this->method = $method; } @@ -453,10 +426,9 @@ function set_method($method) /** * Fetch the current method * - * @access public * @return string */ - function fetch_method() + public function fetch_method() { if ($this->method == $this->fetch_class()) { @@ -471,11 +443,10 @@ function fetch_method() /** * Set the directory name * - * @access public * @param string * @return void */ - function set_directory($dir) + public function set_directory($dir) { $this->directory = str_replace(array('/', '.'), '', $dir).'/'; } @@ -485,10 +456,9 @@ function set_directory($dir) /** * Fetch the sub-directory (if any) that contains the requested controller class * - * @access public * @return string */ - function fetch_directory() + public function fetch_directory() { return $this->directory; } @@ -498,11 +468,10 @@ function fetch_directory() /** * Set the controller overrides * - * @access public * @param array * @return null */ - function _set_overrides($routing) + public function _set_overrides($routing) { if ( ! is_array($routing)) { @@ -526,9 +495,7 @@ function _set_overrides($routing) } } - } -// END Router Class /* End of file Router.php */ -/* Location: ./system/core/Router.php */ \ No newline at end of file +/* Location: ./system/core/Router.php */ From fdc63828a876e87742380a4ae077e43f514320b8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 7 Jan 2012 21:17:46 +0200 Subject: [PATCH 0230/5397] Revert DIRECTORY_SEPARATOR changes --- system/core/Controller.php | 2 +- system/core/Exceptions.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/system/core/Controller.php b/system/core/Controller.php index 5ae0b09246f..0dc1317011e 100644 --- a/system/core/Controller.php +++ b/system/core/Controller.php @@ -57,7 +57,7 @@ public function __construct() $this->load =& load_class('Loader', 'core'); $this->load->initialize(); - log_message('debug', "Controller Class Initialized"); + log_message('debug', 'Controller Class Initialized'); } public static function &get_instance() diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php index 9b672ac54e9..bf9901252d5 100755 --- a/system/core/Exceptions.php +++ b/system/core/Exceptions.php @@ -146,7 +146,7 @@ public function show_error($heading, $message, $template = 'error_general', $sta ob_end_flush(); } ob_start(); - include(APPPATH.'errors'.DIRECTORY_SEPARATOR.$template.'.php'); + include(APPPATH.'errors/'.$template.'.php'); $buffer = ob_get_contents(); ob_end_clean(); return $buffer; @@ -180,7 +180,7 @@ function show_php_error($severity, $message, $filepath, $line) ob_end_flush(); } ob_start(); - include(APPPATH.'errors'.DIRECTORY_SEPARATOR.'error_php.php'); + include(APPPATH.'errors/'.'error_php.php'); $buffer = ob_get_contents(); ob_end_clean(); echo $buffer; From d52b242545376db2eb8146f16125819a391db763 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 7 Jan 2012 21:28:32 +0200 Subject: [PATCH 0231/5397] Reverted DIRECTORY_SEPARATOR changes --- system/core/Config.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/core/Config.php b/system/core/Config.php index 55da4e338c2..66369115a1a 100755 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -73,7 +73,7 @@ class CI_Config { public function __construct() { $this->config =& get_config(); - log_message('debug', "Config Class Initialized"); + log_message('debug', 'Config Class Initialized'); // Set the base_url automatically if none was provided if ($this->config['base_url'] == '') @@ -111,12 +111,12 @@ public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE foreach ($this->_config_paths as $path) { $check_locations = defined('ENVIRONMENT') - ? array(ENVIRONMENT.DIRECTORY_SEPARATOR.$file, $file) + ? array(ENVIRONMENT.'/'.$file, $file) : array($file); foreach ($check_locations as $location) { - $file_path = $path.'config'.DIRECTORY_SEPARATOR.$location.'.php'; + $file_path = $path.'config/'.$location.'.php'; if (in_array($file_path, $this->is_loaded, TRUE)) { From 536b771cfe2f459890c2c0865fd08411df352318 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 7 Jan 2012 21:31:25 +0200 Subject: [PATCH 0232/5397] Reverted DIRECTORY_SEPARATOR changes --- system/core/Common.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index abbe789e202..6ef22962978 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -94,7 +94,7 @@ function is_really_writable($file) */ if (is_dir($file)) { - $file = rtrim($file, '/\\').DIRECTORY_SEPARATOR.md5(mt_rand(1,100).mt_rand(1,100)); + $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100)); if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) { return FALSE; @@ -148,13 +148,13 @@ function &load_class($class, $directory = 'libraries', $prefix = 'CI_') // then in the native system/libraries folder foreach (array(APPPATH, BASEPATH) as $path) { - if (file_exists($path.$directory.DIRECTORY_SEPARATOR.$class.'.php')) + if (file_exists($path.$directory.'/'.$class.'.php')) { $name = $prefix.$class; if (class_exists($name) === FALSE) { - require($path.$directory.DIRECTORY_SEPARATOR.$class.'.php'); + require($path.$directory.'/'.$class.'.php'); } break; @@ -162,13 +162,13 @@ function &load_class($class, $directory = 'libraries', $prefix = 'CI_') } // Is the request a class extension? If so we load it too - if (file_exists(APPPATH.$directory.DIRECTORY_SEPARATOR.config_item('subclass_prefix').$class.'.php')) + 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.DIRECTORY_SEPARATOR.config_item('subclass_prefix').$class.'.php'); + require(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php'); } } @@ -235,9 +235,9 @@ function &get_config($replace = array()) } // Is the config file in the environment folder? - if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config'.DIRECTORY_SEPARATOR.ENVIRONMENT.DIRECTORY_SEPARATOR.'config.php')) + if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT..'/config.php')) { - $file_path = APPPATH.'config'.DIRECTORY_SEPARATOR.'config.php'; + $file_path = APPPATH.'config/config.php'; } // Fetch the config file From 88d03c48d5a11f3419feb2409a76bf0591575fd2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 7 Jan 2012 21:59:00 +0200 Subject: [PATCH 0233/5397] Switch quotes --- system/core/Model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Model.php b/system/core/Model.php index cd64468b86e..a595a6ae20b 100755 --- a/system/core/Model.php +++ b/system/core/Model.php @@ -40,7 +40,7 @@ class CI_Model { public function __construct() { - log_message('debug', "Model Class Initialized"); + log_message('debug', 'Model Class Initialized'); } /** From f9938a2cf9af2341b1f44e6c465852405fc15897 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 7 Jan 2012 22:10:47 +0200 Subject: [PATCH 0234/5397] Improve core Hooks & Lang libraries --- system/core/Hooks.php | 41 ++++++++++++++--------------------------- system/core/Lang.php | 26 +++++++++----------------- 2 files changed, 23 insertions(+), 44 deletions(-) diff --git a/system/core/Hooks.php b/system/core/Hooks.php index 174adcb1914..e1ac58e6e2a 100755 --- a/system/core/Hooks.php +++ b/system/core/Hooks.php @@ -1,13 +1,13 @@ -_initialize(); - log_message('debug', "Hooks Class Initialized"); + log_message('debug', 'Hooks Class Initialized'); } // -------------------------------------------------------------------- @@ -74,24 +70,20 @@ function __construct() /** * Initialize the Hooks Preferences * - * @access private * @return void */ - function _initialize() + private 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'); @@ -101,7 +93,7 @@ function _initialize() include(APPPATH.'config/hooks.php'); } - + // If there are no hooks, we're done. if ( ! isset($hook) OR ! is_array($hook)) { return; @@ -116,13 +108,12 @@ function _initialize() /** * Call Hook * - * Calls a particular hook + * Calls a particular hook. Called by CodeIgniter.php. * - * @access private * @param string the hook name * @return mixed */ - function _call_hook($which = '') + public function _call_hook($which = '') { if ( ! $this->enabled OR ! isset($this->hooks[$which])) { @@ -151,11 +142,10 @@ function _call_hook($which = '') * * Runs a particular hook * - * @access private * @param array the hook details * @return bool */ - function _run_hook($data) + protected function _run_hook($data) { if ( ! is_array($data)) { @@ -168,7 +158,6 @@ function _run_hook($data) // If the script being called happens to have the same // hook call within it a loop can happen - if ($this->in_progress == TRUE) { return; @@ -254,7 +243,5 @@ function _run_hook($data) } -// END CI_Hooks class - /* End of file Hooks.php */ -/* Location: ./system/core/Hooks.php */ \ No newline at end of file +/* Location: ./system/core/Hooks.php */ diff --git a/system/core/Lang.php b/system/core/Lang.php index 5eb2801f636..088cb6c9c63 100755 --- a/system/core/Lang.php +++ b/system/core/Lang.php @@ -1,13 +1,13 @@ -language[$line])) ? FALSE : $this->language[$line]; @@ -166,7 +159,6 @@ function line($line = '') } } -// END Language Class /* End of file Lang.php */ /* Location: ./system/core/Lang.php */ From d72973519623f40f121e9cd2df93146ee2543a1f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 7 Jan 2012 22:53:14 +0200 Subject: [PATCH 0235/5397] Improve the core Loader library --- system/core/Loader.php | 90 +++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 53 deletions(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index c4a6b501cdd..689ae1ecd99 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -1,13 +1,13 @@ - 'unit', - 'user_agent' => 'agent'); + protected $_ci_varmap = array( + 'unit_test' => 'unit', + 'user_agent' => 'agent' + ); /** * Constructor @@ -141,7 +130,7 @@ public function __construct() $this->_ci_model_paths = array(APPPATH); $this->_ci_view_paths = array(VIEWPATH => TRUE); - log_message('debug', "Loader Class Initialized"); + log_message('debug', 'Loader Class Initialized'); } // -------------------------------------------------------------------- @@ -162,7 +151,6 @@ public function initialize() $this->_base_classes =& is_loaded(); $this->_ci_autoloader(); - return $this; } @@ -311,9 +299,7 @@ public function model($model, $name = '', $db_conn = FALSE) require_once($mod_path.'models/'.$path.$model.'.php'); $model = ucfirst($model); - $CI->$name = new $model(); - $this->_ci_models[] = $name; return; } @@ -350,7 +336,7 @@ public function database($params = '', $return = FALSE, $active_record = NULL) return DB($params, $active_record); } - // Initialize the db variable. Needed to prevent + // Initialize the db variable. Needed to prevent // reference errors with some configurations $CI->db = ''; @@ -716,11 +702,11 @@ public function remove_package_path($path = '', $remove_config_path = TRUE) if ($path == '') { - $void = array_shift($this->_ci_library_paths); - $void = array_shift($this->_ci_model_paths); - $void = array_shift($this->_ci_helper_paths); - $void = array_shift($this->_ci_view_paths); - $void = array_shift($config->_config_paths); + array_shift($this->_ci_library_paths); + array_shift($this->_ci_model_paths); + array_shift($this->_ci_helper_paths); + array_shift($this->_ci_view_paths); + array_shift($config->_config_paths); } else { @@ -808,7 +794,6 @@ protected function _ci_load($_ci_data) // This allows anything loaded using $this->load (views, files, etc.) // to become accessible from within the Controller and Model functions. - $_ci_CI =& get_instance(); foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var) { @@ -837,12 +822,11 @@ protected function _ci_load($_ci_data) * * We buffer the output for two reasons: * 1. Speed. You get a significant speed boost. - * 2. So that the final rendered template can be - * post-processed by the output class. Why do we - * need post processing? For one thing, in order to - * show the elapsed page load time. Unless we - * can intercept the content right before it's sent to - * the browser and then stop the timer it won't be accurate. + * 2. So that the final rendered template can be post-processed by + * the output class. Why do we need post processing? For one thing, + * in order to show the elapsed page load time. Unless we can + * intercept the content right before it's sent to the browser and + * then stop the timer it won't be accurate. */ ob_start(); @@ -915,10 +899,10 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL) if (($last_slash = strrpos($class, '/')) !== FALSE) { // Extract the path - $subdir = substr($class, 0, $last_slash + 1); + $subdir = substr($class, 0, ++$last_slash); // Get the filename from the path - $class = substr($class, $last_slash + 1); + $class = substr($class, $last_slash); } // We'll test for both lowercase and capitalized versions of the file name @@ -933,15 +917,15 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL) if ( ! file_exists($baseclass)) { - log_message('error', "Unable to load the requested class: ".$class); - show_error("Unable to load the requested class: ".$class); + log_message('error', 'Unable to load the requested class: '.$class); + show_error('Unable to load the requested class: '.$class); } - // Safety: Was the class already loaded by a previous call? + // Safety: Was the class already loaded by a previous call? if (in_array($subclass, $this->_ci_loaded_files)) { // Before we deem this to be a duplicate request, let's see - // if a custom object name is being supplied. If so, we'll + // if a custom object name is being supplied. If so, we'll // return a new instance of the object if ( ! is_null($object_name)) { @@ -953,7 +937,7 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL) } $is_duplicate = TRUE; - log_message('debug', $class." class already loaded. Second attempt ignored."); + log_message('debug', $class.' class already loaded. Second attempt ignored.'); return; } @@ -970,17 +954,17 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL) { $filepath = $path.'libraries/'.$subdir.$class.'.php'; - // Does the file exist? No? Bummer... + // Does the file exist? No? Bummer... if ( ! file_exists($filepath)) { continue; } - // Safety: Was the class already loaded by a previous call? + // Safety: Was the class already loaded by a previous call? if (in_array($filepath, $this->_ci_loaded_files)) { // Before we deem this to be a duplicate request, let's see - // if a custom object name is being supplied. If so, we'll + // if a custom object name is being supplied. If so, we'll // return a new instance of the object if ( ! is_null($object_name)) { @@ -992,7 +976,7 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL) } $is_duplicate = TRUE; - log_message('debug', $class." class already loaded. Second attempt ignored."); + log_message('debug', $class.' class already loaded. Second attempt ignored.'); return; } @@ -1003,7 +987,7 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL) } // END FOREACH - // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified? + // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified? if ($subdir == '') { $path = strtolower($class).'/'.$class; @@ -1014,8 +998,8 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL) // We do not issue errors if the load call failed due to a duplicate request if ($is_duplicate == FALSE) { - log_message('error', "Unable to load the requested class: ".$class); - show_error("Unable to load the requested class: ".$class); + log_message('error', 'Unable to load the requested class: '.$class); + show_error('Unable to load the requested class: '.$class); } } @@ -1094,12 +1078,12 @@ protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object // Is the class name valid? if ( ! class_exists($name)) { - log_message('error', "Non-existent class: ".$name); - show_error("Non-existent class: ".$class); + log_message('error', 'Non-existent class: '.$name); + show_error('Non-existent class: '.$class); } // Set the variable name we will assign the class to - // Was a custom class name supplied? If so we'll use it + // Was a custom class name supplied? If so we'll use it $class = strtolower($class); if (is_null($object_name)) @@ -1271,4 +1255,4 @@ protected function _ci_prep_filename($filename, $extension) } /* End of file Loader.php */ -/* Location: ./system/core/Loader.php */ \ No newline at end of file +/* Location: ./system/core/Loader.php */ From bb488dc3d4bbac9ac9a1860f066069e4bb4afdcb Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 7 Jan 2012 23:35:16 +0200 Subject: [PATCH 0236/5397] Improve the core Security library --- system/core/Security.php | 254 +++++++++++++++------------------------ 1 file changed, 99 insertions(+), 155 deletions(-) diff --git a/system/core/Security.php b/system/core/Security.php index 272a8bf3f1d..d0d3c0803bf 100755 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -1,13 +1,13 @@ - '[removed]', - 'document.write' => '[removed]', - '.parentNode' => '[removed]', - '.innerHTML' => '[removed]', - 'window.location' => '[removed]', - '-moz-binding' => '[removed]', - '' => '-->', - ' '<![CDATA[', - '' => '<comment>' - ); + 'document.cookie' => '[removed]', + 'document.write' => '[removed]', + '.parentNode' => '[removed]', + '.innerHTML' => '[removed]', + 'window.location' => '[removed]', + '-moz-binding' => '[removed]', + '' => '-->', + ' '<![CDATA[', + '' => '<comment>' + ); /** * List of never allowed regex replacement * * @var array - * @access protected */ protected $_never_allowed_regex = array( - "javascript\s*:" => '[removed]', - "expression\s*(\(|&\#40;)" => '[removed]', // CSS and IE - "vbscript\s*:" => '[removed]', // IE, surprise! - "Redirect\s+302" => '[removed]' - ); + 'javascript\s*:', + 'expression\s*(\(|&\#40;)', // CSS and IE + 'vbscript\s*:', // IE, surprise! + 'Redirect\s+302' + ); - /** - * Constructor - */ public function __construct() { // CSRF config @@ -135,7 +124,7 @@ public function __construct() // Set the CSRF hash $this->_csrf_set_hash(); - log_message('debug', "Security Class Initialized"); + log_message('debug', 'Security Class Initialized'); } // -------------------------------------------------------------------- @@ -148,7 +137,7 @@ public function __construct() public function csrf_verify() { // If no POST data exists we will set the CSRF cookie - if (count($_POST) == 0) + if (count($_POST) === 0) { return $this->csrf_set_cookie(); } @@ -186,8 +175,7 @@ public function csrf_verify() $this->_csrf_set_hash(); $this->csrf_set_cookie(); - log_message('debug', "CSRF token verified"); - + log_message('debug', 'CSRF token verified'); return $this; } @@ -203,19 +191,13 @@ public function csrf_set_cookie() $expire = time() + $this->_csrf_expire; $secure_cookie = (bool) config_item('cookie_secure'); - if ($secure_cookie) + if ($secure_cookie && ( ! isset($_SERVER['HTTPS']) OR $_SERVER['HTTPS'] == 'off' OR ! $_SERVER['HTTPS'])) { - $req = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : FALSE; - - if ( ! $req OR $req == 'off') - { - return FALSE; - } + 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"); + log_message('debug', 'CRSF cookie Set'); return $this; } @@ -253,7 +235,7 @@ public function get_csrf_hash() * * Getter Method * - * @return string self::csrf_token_name + * @return string self::_csrf_token_name */ public function get_csrf_token_name() { @@ -273,7 +255,7 @@ public function get_csrf_token_name() * the filter. * * Note: This function should only be used to deal with data - * upon submission. It's not something that should + * 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 @@ -290,10 +272,7 @@ public function get_csrf_token_name() */ public function xss_clean($str, $is_image = FALSE) { - /* - * Is the string an array? - * - */ + // Is the string an array? if (is_array($str)) { while (list($key) = each($str)) @@ -304,13 +283,8 @@ public function xss_clean($str, $is_image = FALSE) return $str; } - /* - * Remove Invisible Characters - */ - $str = remove_invisible_characters($str); - - // Validate Entities in URLs - $str = $this->_validate_entities($str); + // Remove Invisible Characters and validate entities in URLs + $str = $this->_validate_entities(remove_invisible_characters($str)); /* * URL Decode @@ -320,7 +294,6 @@ public function xss_clean($str, $is_image = FALSE) * Google * * Note: Use rawurldecode() so it does not remove plus signs - * */ $str = rawurldecode($str); @@ -332,14 +305,10 @@ public function xss_clean($str, $is_image = FALSE) * 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! - */ + // Remove Invisible Characters Again! $str = remove_invisible_characters($str); /* @@ -350,11 +319,7 @@ public function xss_clean($str, $is_image = FALSE) * 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); - } + $str = str_replace("\t", ' ', $str); /* * Capture converted string for later comparison @@ -378,7 +343,7 @@ public function xss_clean($str, $is_image = FALSE) // 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); + $str = preg_replace('/<\?(php)/i', '<?\\1', $str); } else { @@ -415,19 +380,19 @@ public function xss_clean($str, $is_image = FALSE) { $original = $str; - if (preg_match("/]*?)(>|$)#si", array($this, '_js_link_removal'), $str); + $str = preg_replace_callback('#]*?)(>|$)#si', array($this, '_js_link_removal'), $str); } - if (preg_match("/]*?)(\s?/?>|$)#si", array($this, '_js_img_removal'), $str); + $str = preg_replace_callback('#]*?)(\s?/?>|$)#si', array($this, '_js_img_removal'), $str); } - if (preg_match("/script/i", $str) OR preg_match("/xss/i", $str)) + if (preg_match('/(script|xss)/i', $str)) { - $str = preg_replace("#<(/*)(script|xss)(.*?)\>#si", '[removed]', $str); + $str = preg_replace('#<(/*)(script|xss)(.*?)\>#si', '[removed]', $str); } } while($original != $str); @@ -454,14 +419,16 @@ public function xss_clean($str, $is_image = FALSE) * * Similar to above, only instead of looking for * tags it looks for PHP and JavaScript commands - * that are disallowed. Rather than removing the + * 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') + * 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); + $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 @@ -478,13 +445,12 @@ public function xss_clean($str, $is_image = FALSE) * 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; + return ($str === $converted_string); } - log_message('debug', "XSS Filtering completed"); + log_message('debug', 'XSS Filtering completed'); return $str; } @@ -516,7 +482,7 @@ public function xss_hash() * 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 + * correctly. html_entity_decode() does not convert entities without * semicolons, so we are left with our own little solution here. Bummer. * * @param string @@ -552,38 +518,23 @@ public function entity_decode($str, $charset = NULL) public function sanitize_filename($str, $relative_path = FALSE) { $bad = array( - "../", - "", - "<", - ">", - "'", - '"', - '&', - '$', - '#', - '{', - '}', - '[', - ']', - '=', - ';', - '?', - "%20", - "%22", - "%3c", // < - "%253c", // < - "%3e", // > - "%0e", // > - "%28", // ( - "%29", // ) - "%2528", // ( - "%26", // & - "%24", // $ - "%3f", // ? - "%3b", // ; - "%3d" // = - ); + '../', '', '<', '>', + "'", '"', '&', '$', '#', + '{', '}', '[', ']', '=', + ';', '?', '%20', '%22', + '%3c', // < + '%253c', // < + '%3e', // > + '%0e', // > + '%28', // ( + '%29', // ) + '%2528', // ( + '%26', // & + '%24', // $ + '%3f', // ? + '%3b', // ; + '%3d' // = + ); if ( ! $relative_path) { @@ -636,26 +587,26 @@ protected function _remove_evil_attributes($str, $is_image) if ($is_image === TRUE) { /* - * Adobe Photoshop puts XML metadata into JFIF images, + * 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); - + 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); + preg_match_all('/('.implode('|', $evil_attributes).')\s*=\s*(\042|\047)([^\\2]*?)(\\2)/is', $str, $matches, PREG_SET_ORDER); foreach ($matches as $attr) { @@ -665,11 +616,11 @@ protected function _remove_evil_attributes($str, $is_image) // 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$2$4$5', $str, -1, $count); + $str = preg_replace('/<(\/?[^><]+?)([^A-Za-z\-])('.implode('|', $attribs).')([\s><])([><]*)/i', '<$1$2$4$5', $str, -1, $count); } - + } while ($count); - + return $str; } @@ -685,14 +636,9 @@ protected function _remove_evil_attributes($str, $is_image) */ 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; + return '<'.$matches[1].$matches[2].$matches[3] // encode opening brace + // encode captured opening or closing brace to prevent recursive vectors: + . str_replace(array('>', '<'), array('>', '<'), $matches[4]); } // -------------------------------------------------------------------- @@ -710,9 +656,12 @@ protected function _sanitize_naughty_html($matches) */ protected function _js_link_removal($match) { - $attributes = $this->_filter_attributes(str_replace(array('<', '>'), '', $match[1])); - - return str_replace($match[1], preg_replace("#href=.*?(alert\(|alert&\#40;|javascript\:|livescript\:|mocha\:|charset\=|window\.|document\.|\.cookie|_filter_attributes(str_replace(array('<', '>'), '', $match[1])) + ), + $match[0]); } // -------------------------------------------------------------------- @@ -730,9 +679,12 @@ protected function _js_link_removal($match) */ protected function _js_img_removal($match) { - $attributes = $this->_filter_attributes(str_replace(array('<', '>'), '', $match[1])); - - return str_replace($match[1], preg_replace("#src=.*?(alert\(|alert&\#40;|javascript\:|livescript\:|mocha\:|charset\=|window\.|document\.|\.cookie|_filter_attributes(str_replace(array('<', '>'), '', $match[1])) + ), + $match[0]); } // -------------------------------------------------------------------- @@ -806,33 +758,28 @@ 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); + // 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); + $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); + $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; + return str_replace($this->xss_hash(), '&', $str); } // ---------------------------------------------------------------------- @@ -847,14 +794,11 @@ protected function _validate_entities($str) */ protected function _do_never_allowed($str) { - foreach ($this->_never_allowed_str as $key => $val) - { - $str = str_replace($key, $val, $str); - } + $str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str); - foreach ($this->_never_allowed_regex as $key => $val) + foreach ($this->_never_allowed_regex as $regex) { - $str = preg_replace("#".$key."#i", $val, $str); + $str = preg_replace('#'.$regex.'#i', '[removed]', $str); } return $str; @@ -891,4 +835,4 @@ protected function _csrf_set_hash() } /* End of file Security.php */ -/* Location: ./system/core/Security.php */ \ No newline at end of file +/* Location: ./system/core/Security.php */ From c123e118de32e2b31b9bf21fdb43458bc9f4cbda Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 00:17:34 +0200 Subject: [PATCH 0237/5397] Improve core URI & UTF8 libraries --- system/core/URI.php | 197 ++++++++++++++++++------------------------- system/core/Utf8.php | 32 +++---- 2 files changed, 96 insertions(+), 133 deletions(-) diff --git a/system/core/URI.php b/system/core/URI.php index 3c26d307b2c..93105b1fdb0 100755 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -1,13 +1,13 @@ -config =& load_class('Config', 'core'); - log_message('debug', "URI Class Initialized"); + log_message('debug', 'URI Class Initialized'); } - // -------------------------------------------------------------------- /** * Get the URI String * - * @access private - * @return string + * Called by CI_Router + * + * @return void */ - function _fetch_uri_string() + public function _fetch_uri_string() { - if (strtoupper($this->config->item('uri_protocol')) == 'AUTO') + if (strtoupper($this->config->item('uri_protocol')) === 'AUTO') { // Is the request coming from the command line? - if (php_sapi_name() == 'cli' or defined('STDIN')) + if (php_sapi_name() === 'cli' OR defined('STDIN')) { $this->_set_uri_string($this->_parse_cli_args()); return; @@ -115,14 +109,14 @@ function _fetch_uri_string() // 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) + 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'); + $path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); if (trim($path, '/') != '') { $this->_set_uri_string($path); @@ -130,7 +124,7 @@ function _fetch_uri_string() } // As a last ditch effort lets try using the $_GET array - if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '') + if (is_array($_GET) && count($_GET) === 1 && trim(key($_GET), '/') != '') { $this->_set_uri_string(key($_GET)); return; @@ -143,12 +137,12 @@ function _fetch_uri_string() $uri = strtoupper($this->config->item('uri_protocol')); - if ($uri == 'REQUEST_URI') + if ($uri === 'REQUEST_URI') { $this->_set_uri_string($this->_detect_uri()); return; } - elseif ($uri == 'CLI') + elseif ($uri === 'CLI') { $this->_set_uri_string($this->_parse_cli_args()); return; @@ -163,17 +157,16 @@ function _fetch_uri_string() /** * Set the URI String * - * @access public * @param string - * @return string + * @return void */ - function _set_uri_string($str) + public 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; + $this->uri_string = ($str === '/') ? '' : $str; } // -------------------------------------------------------------------- @@ -184,7 +177,6 @@ function _set_uri_string($str) * This function will detect the URI automatically and fix the query string * if necessary. * - * @access private * @return string */ protected function _detect_uri() @@ -194,12 +186,11 @@ protected function _detect_uri() return ''; } - $uri = $_SERVER['REQUEST_URI']; - if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) + if (strpos($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']) === 0) { $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); } - elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) + elseif (strpos($_SERVER['REQUEST_URI'], dirname($_SERVER['SCRIPT_NAME'])) === 0) { $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); } @@ -223,7 +214,7 @@ protected function _detect_uri() $_GET = array(); } - if ($uri == '/' || empty($uri)) + if ($uri == '/' OR empty($uri)) { return '/'; } @@ -241,13 +232,11 @@ protected function _detect_uri() * * Take each command line argument and assume it is a URI segment. * - * @access private * @return string */ protected function _parse_cli_args() { $args = array_slice($_SERVER['argv'], 1); - return $args ? '/' . implode('/', $args) : ''; } @@ -256,27 +245,28 @@ protected function _parse_cli_args() /** * Filter segments for malicious characters * - * @access private + * Called by CI_Router + * * @param string * @return string */ - function _filter_uri($str) + public 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)) + 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); + // Convert programatic characters to entities and return + return str_replace( + array('$', '(', ')', '%28', '%29'), // Bad + array('$', '(', ')', '(', ')'), // Good + $str); } // -------------------------------------------------------------------- @@ -284,14 +274,15 @@ function _filter_uri($str) /** * Remove the suffix from the URL if needed * - * @access private + * Called by CI_Router + * * @return void */ - function _remove_url_suffix() + public function _remove_url_suffix() { - if ($this->config->item('url_suffix') != "") + if ($this->config->item('url_suffix') != '') { - $this->uri_string = preg_replace("|".preg_quote($this->config->item('url_suffix'))."$|", "", $this->uri_string); + $this->uri_string = preg_replace('|'.preg_quote($this->config->item('url_suffix')).'$|', '', $this->uri_string); } } @@ -301,12 +292,13 @@ function _remove_url_suffix() * Explode the URI Segments. The individual segments will * be stored in the $this->segments array. * - * @access private + * Called by CI_Router + * * @return void */ - function _explode_segments() + public function _explode_segments() { - foreach (explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val) + foreach (explode('/', preg_replace('|/*(.+?)/*$|', '\\1', $this->uri_string)) as $val) { // Filter segments for security $val = trim($this->_filter_uri($val)); @@ -323,14 +315,15 @@ function _explode_segments() * 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 + * 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 + * Called by CI_Router + * * @return void */ - function _reindex_segments() + public function _reindex_segments() { array_unshift($this->segments, NULL); array_unshift($this->rsegments, NULL); @@ -345,12 +338,11 @@ function _reindex_segments() * * 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) + public function segment($n, $no_result = FALSE) { return ( ! isset($this->segments[$n])) ? $no_result : $this->segments[$n]; } @@ -364,12 +356,11 @@ function segment($n, $no_result = FALSE) * 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) + public function rsegment($n, $no_result = FALSE) { return ( ! isset($this->rsegments[$n])) ? $no_result : $this->rsegments[$n]; } @@ -392,25 +383,22 @@ function rsegment($n, $no_result = FALSE) * 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()) + public 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()) + public function ruri_to_assoc($n = 3, $default = array()) { return $this->_uri_to_assoc($n, $default, 'rsegment'); } @@ -420,25 +408,13 @@ function ruri_to_assoc($n = 3, $default = array()) /** * 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') + protected 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; @@ -449,23 +425,30 @@ function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') return $this->keyval[$n]; } + if ($which === 'segment') + { + $total_segments = 'total_segments'; + $segment_array = 'segment_array'; + } + else + { + $total_segments = 'total_rsegments'; + $segment_array = 'rsegment_array'; + } + if ($this->$total_segments() < $n) { - if (count($default) == 0) + if (count($default) === 0) { return array(); } - $retval = array(); - foreach ($default as $val) - { - $retval[$val] = FALSE; - } - return $retval; + return function_exists('array_fill_keys') + ? array_fill_keys($default, FALSE) + : array_combine($default, array_fill(0, count($default), FALSE)); } $segments = array_slice($this->$segment_array(), ($n - 1)); - $i = 0; $lastval = ''; $retval = array(); @@ -506,16 +489,15 @@ function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') * 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) + public function assoc_to_uri($array) { $temp = array(); foreach ((array)$array as $key => $val) { - $temp[] = $key; + $temp[] = $key; $temp[] = $val; } @@ -527,12 +509,11 @@ function assoc_to_uri($array) /** * Fetch a URI Segment and add a trailing slash * - * @access public * @param integer * @param string * @return string */ - function slash_segment($n, $where = 'trailing') + public function slash_segment($n, $where = 'trailing') { return $this->_slash_segment($n, $where, 'segment'); } @@ -542,12 +523,11 @@ function slash_segment($n, $where = 'trailing') /** * Fetch a URI Segment and add a trailing slash * - * @access public * @param integer * @param string * @return string */ - function slash_rsegment($n, $where = 'trailing') + public function slash_rsegment($n, $where = 'trailing') { return $this->_slash_segment($n, $where, 'rsegment'); } @@ -557,22 +537,20 @@ function slash_rsegment($n, $where = 'trailing') /** * 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') + protected function _slash_segment($n, $where = 'trailing', $which = 'segment') { - $leading = '/'; - $trailing = '/'; + $leading = $trailing = '/'; - if ($where == 'trailing') + if ($where === 'trailing') { $leading = ''; } - elseif ($where == 'leading') + elseif ($where === 'leading') { $trailing = ''; } @@ -585,10 +563,9 @@ function _slash_segment($n, $where = 'trailing', $which = 'segment') /** * Segment Array * - * @access public * @return array */ - function segment_array() + public function segment_array() { return $this->segments; } @@ -598,10 +575,9 @@ function segment_array() /** * Routed Segment Array * - * @access public * @return array */ - function rsegment_array() + public function rsegment_array() { return $this->rsegments; } @@ -611,10 +587,9 @@ function rsegment_array() /** * Total number of segments * - * @access public * @return integer */ - function total_segments() + public function total_segments() { return count($this->segments); } @@ -624,10 +599,9 @@ function total_segments() /** * Total number of routed segments * - * @access public * @return integer */ - function total_rsegments() + public function total_rsegments() { return count($this->rsegments); } @@ -637,10 +611,9 @@ function total_rsegments() /** * Fetch the entire URI string * - * @access public * @return string */ - function uri_string() + public function uri_string() { return $this->uri_string; } @@ -651,16 +624,14 @@ function uri_string() /** * Fetch the entire Re-routed URI string * - * @access public * @return string */ - function ruri_string() + public function ruri_string() { return '/'.implode('/', $this->rsegment_array()); } } -// END URI Class /* End of file URI.php */ -/* Location: ./system/core/URI.php */ \ No newline at end of file +/* Location: ./system/core/URI.php */ diff --git a/system/core/Utf8.php b/system/core/Utf8.php index 40a7ac4c079..0e180d36fa0 100644 --- a/system/core/Utf8.php +++ b/system/core/Utf8.php @@ -1,13 +1,13 @@ -item('charset') == 'UTF-8' // Application charset must be UTF-8 + && @ini_get('mbstring.func_overload') != 1 // Multibyte string function overloading cannot be enabled + && $CFG->item('charset') === 'UTF-8' // Application charset must be UTF-8 ) { - log_message('debug', "UTF-8 Support Enabled"); - define('UTF8_ENABLED', TRUE); + log_message('debug', 'UTF-8 Support Enabled'); // set internal encoding for multibyte string functions if necessary // and set a flag so we don't have to repeatedly use extension_loaded() @@ -77,8 +76,8 @@ public function __construct() } else { - log_message('debug', "UTF-8 Support Disabled"); define('UTF8_ENABLED', FALSE); + log_message('debug', 'UTF-8 Support Disabled'); } } @@ -134,18 +133,14 @@ public function convert_to_utf8($str, $encoding) { if (function_exists('iconv')) { - $str = @iconv($encoding, 'UTF-8', $str); + return @iconv($encoding, 'UTF-8', $str); } elseif (function_exists('mb_convert_encoding')) { - $str = @mb_convert_encoding($str, 'UTF-8', $encoding); - } - else - { - return FALSE; + return @mb_convert_encoding($str, 'UTF-8', $encoding); } - return $str; + return FALSE; } // -------------------------------------------------------------------- @@ -163,10 +158,7 @@ protected 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 */ \ No newline at end of file +/* Location: ./system/core/Utf8.php */ From a798fdb9a08a6f549bcc2a4ea6c6bad45cfef0a2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 00:20:49 +0200 Subject: [PATCH 0238/5397] Remove a space :) --- system/core/URI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/URI.php b/system/core/URI.php index 93105b1fdb0..eaf7b752b5e 100755 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -497,7 +497,7 @@ public function assoc_to_uri($array) $temp = array(); foreach ((array)$array as $key => $val) { - $temp[] = $key; + $temp[] = $key; $temp[] = $val; } From 282592c744b969d5cdebe00673f2bdc8d956261e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 01:01:55 +0200 Subject: [PATCH 0239/5397] Clear some spaces from index.php --- index.php | 57 ++++++++++++++++++++++--------------------------------- 1 file changed, 23 insertions(+), 34 deletions(-) diff --git a/index.php b/index.php index 4ae1ceebd3a..1712a7d66dc 100644 --- a/index.php +++ b/index.php @@ -5,9 +5,9 @@ * An open source application development framework for PHP 5.1.6 or newer * * NOTICE OF LICENSE - * + * * Licensed under the Open Software License version 3.0 - * + * * This source file is subject to the Open Software License (OSL 3.0) that is * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: @@ -41,7 +41,6 @@ * production * * NOTE: If you change these, also change the error_reporting() code below - * */ define('ENVIRONMENT', 'development'); /* @@ -60,12 +59,10 @@ case 'development': error_reporting(-1); break; - case 'testing': case 'production': error_reporting(0); break; - default: exit('The application environment is not set correctly.'); } @@ -79,7 +76,6 @@ * This variable must contain the name of your "system" folder. * Include the path if the folder is not in the same directory * as this file. - * */ $system_path = 'system'; @@ -90,30 +86,28 @@ * * If you want this front controller to use a different "application" * folder then the default one you can set its name here. The folder - * can also be renamed or relocated anywhere on your server. If + * can also be renamed or relocated anywhere on your server. If * you do, use a full server path. For more info please see the user guide: * http://codeigniter.com/user_guide/general/managing_apps.html * * NO TRAILING SLASH! - * */ $application_folder = 'application'; - + /* *--------------------------------------------------------------- * VIEW FOLDER NAME *--------------------------------------------------------------- - * - * If you want to move the view folder out of the application + * + * If you want to move the view folder out of the application * folder set the path to the folder here. The folder can be renamed - * and relocated anywhere on your server. If blank, it will default - * to the standard location inside your application folder. If you - * do move this, use the full server path to this folder + * and relocated anywhere on your server. If blank, it will default + * to the standard location inside your application folder. If you + * do move this, use the full server path to this folder. * * NO TRAILING SLASH! - * */ - $view_folder = ''; + $view_folder = ''; /* @@ -123,18 +117,17 @@ * * Normally you will set your default controller in the routes.php file. * You can, however, force a custom routing by hard-coding a - * specific controller class/function here. For most applications, you + * specific controller class/function here. For most applications, you * WILL NOT set your routing here, but it's an option for those * special instances where you might want to override the standard * routing in a specific front controller that shares a common CI installation. * - * IMPORTANT: If you set the routing here, NO OTHER controller will be + * IMPORTANT: If you set the routing here, NO OTHER controller will be * callable. In essence, this preference limits your application to ONE - * specific controller. Leave the function name blank if you need + * specific controller. Leave the function name blank if you need * to call functions dynamically via the URI. * * Un-comment the $routing array below to use this feature - * */ // The directory name, relative to the "controllers" folder. Leave blank // if your controller is not in a sub-folder within the "controllers" folder @@ -160,7 +153,6 @@ * config values. * * Un-comment the $assign_to_config array below to use this feature - * */ // $assign_to_config['name_of_config_item'] = 'value of config item'; @@ -193,7 +185,7 @@ // Is the system path correct? if ( ! is_dir($system_path)) { - exit("Your system folder path does not appear to be set correctly. Please open the following file and correct this: ".pathinfo(__FILE__, PATHINFO_BASENAME)); + exit('Your system folder path does not appear to be set correctly. Please open the following file and correct this: '.pathinfo(__FILE__, PATHINFO_BASENAME)); } /* @@ -209,7 +201,7 @@ define('EXT', '.php'); // Path to the system folder - define('BASEPATH', str_replace("\\", "/", $system_path)); + define('BASEPATH', str_replace('\\', '/', $system_path)); // Path to the front controller (this file) define('FCPATH', str_replace(SELF, '', __FILE__)); @@ -217,7 +209,6 @@ // Name of the "system folder" define('SYSDIR', trim(strrchr(trim(BASEPATH, '/'), '/'), '/')); - // The path to the "application" folder if (is_dir($application_folder)) { @@ -227,27 +218,26 @@ { if ( ! is_dir(BASEPATH.$application_folder.'/')) { - exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF); + exit('Your application folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF); } define('APPPATH', BASEPATH.$application_folder.'/'); } - + // The path to the "views" folder - if (is_dir($view_folder)) + if (is_dir($view_folder)) { define ('VIEWPATH', $view_folder .'/'); } - else + else { if ( ! is_dir(APPPATH.'views/')) { - exit("Your view folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF); + exit('Your view folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF); } - - define ('VIEWPATH', APPPATH.'views/' ); + + define ('VIEWPATH', APPPATH.'views/' ); } - /* * -------------------------------------------------------------------- @@ -255,9 +245,8 @@ * -------------------------------------------------------------------- * * And away we go... - * */ require_once BASEPATH.'core/CodeIgniter.php'; /* End of file index.php */ -/* Location: ./index.php */ \ No newline at end of file +/* Location: ./index.php */ From 24276a3a204ddf5947c66bd74f183d8058c1171e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 02:44:38 +0200 Subject: [PATCH 0240/5397] Improve database classes --- system/database/DB.php | 54 ++-- system/database/DB_active_rec.php | 404 ++++++++++-------------------- system/database/DB_cache.php | 49 ++-- system/database/DB_forge.php | 94 ++----- system/database/DB_result.php | 83 ++---- system/database/DB_utility.php | 159 +++++------- 6 files changed, 270 insertions(+), 573 deletions(-) diff --git a/system/database/DB.php b/system/database/DB.php index a0106c1333a..ed6afd7ed7a 100755 --- a/system/database/DB.php +++ b/system/database/DB.php @@ -1,13 +1,13 @@ - $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)) : '' - ); + '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") + if (strtoupper($val) === 'TRUE') { $val = TRUE; } - elseif (strtoupper($val) == "FALSE") + elseif (strtoupper($val) === 'FALSE') { $val = FALSE; } @@ -114,17 +108,15 @@ function &DB($params = '', $active_record_override = NULL) } } - // No DB specified yet? Beat them senseless... + // 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 + // 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; @@ -135,18 +127,14 @@ function &DB($params = '', $active_record_override = NULL) if ( ! isset($active_record) OR $active_record == TRUE) { require_once(BASEPATH.'database/DB_active_rec.php'); - if ( ! class_exists('CI_DB')) { class CI_DB extends CI_DB_active_record { } } } - else + elseif ( ! class_exists('CI_DB')) { - if ( ! class_exists('CI_DB')) - { - class CI_DB extends CI_DB_driver { } - } + class CI_DB extends CI_DB_driver { } } require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php'); @@ -168,7 +156,5 @@ class CI_DB extends CI_DB_driver { } return $DB; } - - /* End of file DB.php */ -/* Location: ./system/database/DB.php */ \ No newline at end of file +/* Location: ./system/database/DB.php */ diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index 486b4d77509..30a17d11a68 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -1,4 +1,4 @@ -_protect_identifiers($type.'('.trim($select).')').' AS '.$this->_protect_identifiers(trim($alias)); - $this->ar_select[] = $sql; if ($this->ar_caching === TRUE) @@ -280,30 +278,27 @@ public function from($from) { $v = trim($v); $this->_track_aliases($v); - - $this->ar_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE); + $this->ar_from[] = $v = $this->_protect_identifiers($v, TRUE, NULL, FALSE); if ($this->ar_caching === TRUE) { - $this->ar_cache_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE); + $this->ar_cache_from[] = $v; $this->ar_cache_exists[] = 'from'; } } - } else { $val = trim($val); - // Extract any aliases that might exist. We use this information + // Extract any aliases that might exist. We use this information // in the _protect_identifiers to know whether to add a table prefix $this->_track_aliases($val); - - $this->ar_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE); + $this->ar_from[] = $val = $this->_protect_identifiers($val, TRUE, NULL, FALSE); if ($this->ar_caching === TRUE) { - $this->ar_cache_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE); + $this->ar_cache_from[] = $val; $this->ar_cache_exists[] = 'from'; } } @@ -340,23 +335,19 @@ public function join($table, $cond, $type = '') } } - // Extract any aliases that might exist. We use this information + // Extract any aliases that might exist. We use this information // in the _protect_identifiers to know whether to add a table prefix $this->_track_aliases($table); // Strip apart the condition and protect the identifiers if (preg_match('/([\w\.]+)([\W\s]+)(.+)/', $cond, $match)) { - $match[1] = $this->_protect_identifiers($match[1]); - $match[3] = $this->_protect_identifiers($match[3]); - - $cond = $match[1].$match[2].$match[3]; + $cond = $this->_protect_identifiers($match[1]).$match[2].$this->_protect_identifiers($match[3]); } // Assemble the JOIN statement - $join = $type.'JOIN '.$this->_protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond; + $this->ar_join[] = $join = $type.'JOIN '.$this->_protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond; - $this->ar_join[] = $join; if ($this->ar_caching === TRUE) { $this->ar_cache_join[] = $join; @@ -429,7 +420,7 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) foreach ($key as $k => $v) { - $prefix = (count($this->ar_where) == 0 AND count($this->ar_cache_where) == 0) ? '' : $type; + $prefix = (count($this->ar_where) === 0 AND count($this->ar_cache_where) === 0) ? '' : $type; if (is_null($v) && ! $this->_has_operator($k)) { @@ -442,7 +433,6 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) if ($escape === TRUE) { $k = $this->_protect_identifiers($k, FALSE, $escape); - $v = ' '.$this->escape($v); } @@ -457,7 +447,6 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) } $this->ar_where[] = $prefix.$k.$v; - if ($this->ar_caching === TRUE) { $this->ar_cache_where[] = $prefix.$k.$v; @@ -571,11 +560,9 @@ protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = $this->ar_wherein[] = $this->escape($value); } - $prefix = (count($this->ar_where) == 0) ? '' : $type; - - $where_in = $prefix . $this->_protect_identifiers($key) . $not . " IN (" . implode(", ", $this->ar_wherein) . ") "; + $prefix = (count($this->ar_where) === 0) ? '' : $type; + $this->ar_where[] = $where_in = $prefix.$this->_protect_identifiers($key).$not.' IN ('.implode(', ', $this->ar_wherein).') '; - $this->ar_where[] = $where_in; if ($this->ar_caching === TRUE) { $this->ar_cache_where[] = $where_in; @@ -679,20 +666,18 @@ protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $n foreach ($field as $k => $v) { $k = $this->_protect_identifiers($k); - - $prefix = (count($this->ar_like) == 0) ? '' : $type; - + $prefix = (count($this->ar_like) === 0) ? '' : $type; $v = $this->escape_like_str($v); - if ($side == 'none') + if ($side === 'none') { $like_statement = $prefix." $k $not LIKE '{$v}'"; } - elseif ($side == 'before') + elseif ($side === 'before') { $like_statement = $prefix." $k $not LIKE '%{$v}'"; } - elseif ($side == 'after') + elseif ($side === 'after') { $like_statement = $prefix." $k $not LIKE '{$v}%'"; } @@ -715,6 +700,7 @@ protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $n } } + return $this; } @@ -730,13 +716,10 @@ protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $n public function group_start($not = '', $type = 'AND ') { $type = $this->_group_get_type($type); - $this->ar_where_group_started = TRUE; + $prefix = (count($this->ar_where) === 0 AND count($this->ar_cache_where) === 0) ? '' : $type; + $this->ar_where[] = $value = $prefix.$not.str_repeat(' ', ++$this->ar_where_group_count).' ('; - $prefix = (count($this->ar_where) == 0 AND count($this->ar_cache_where) == 0) ? '' : $type; - $value = $prefix . $not . str_repeat(' ', ++$this->ar_where_group_count) . ' ('; - - $this->ar_where[] = $value; if ($this->ar_caching) { $this->ar_cache_where[] = $value; @@ -790,16 +773,14 @@ public function or_not_group_start() */ public function group_end() { - $value = str_repeat(' ', $this->ar_where_group_count--) . ')'; + $this->ar_where_group_started = FALSE; + $this->ar_where[] = $value = str_repeat(' ', $this->ar_where_group_count--) . ')'; - $this->ar_where[] = $value; if ($this->ar_caching) { $this->ar_cache_where[] = $value; } - $this->ar_where_group_started = FALSE; - return $this; } @@ -845,15 +826,16 @@ public function group_by($by) if ($val != '') { - $this->ar_groupby[] = $this->_protect_identifiers($val); + $this->ar_groupby[] = $val = $this->_protect_identifiers($val); if ($this->ar_caching === TRUE) { - $this->ar_cache_groupby[] = $this->_protect_identifiers($val); + $this->ar_cache_groupby[] = $val; $this->ar_cache_exists[] = 'groupby'; } } } + return $this; } @@ -909,7 +891,7 @@ protected function _having($key, $value = '', $type = 'AND ', $escape = TRUE) foreach ($key as $k => $v) { - $prefix = (count($this->ar_having) == 0) ? '' : $type; + $prefix = (count($this->ar_having) === 0) ? '' : $type; if ($escape === TRUE) { @@ -949,7 +931,7 @@ protected function _having($key, $value = '', $type = 'AND ', $escape = TRUE) */ public function order_by($orderby, $direction = '', $escape = TRUE) { - if (strtolower($direction) == 'random') + if (strtolower($direction) === 'random') { $orderby = ''; // Random results want or don't need a field name $direction = $this->_random_keyword; @@ -960,7 +942,7 @@ public function order_by($orderby, $direction = '', $escape = TRUE) } - if ((strpos($orderby, ',') !== FALSE) && ($escape === TRUE)) + if ((strpos($orderby, ',') !== FALSE) && $escape === TRUE) { $temp = array(); foreach (explode(',', $orderby) as $part) @@ -976,7 +958,7 @@ public function order_by($orderby, $direction = '', $escape = TRUE) $orderby = implode(', ', $temp); } - else if ($direction != $this->_random_keyword) + elseif ($direction != $this->_random_keyword) { if ($escape === TRUE) { @@ -984,9 +966,8 @@ public function order_by($orderby, $direction = '', $escape = TRUE) } } - $orderby_statement = $orderby.$direction; + $this->ar_orderby[] = $orderby_statement = $orderby.$direction; - $this->ar_orderby[] = $orderby_statement; if ($this->ar_caching === TRUE) { $this->ar_cache_orderby[] = $orderby_statement; @@ -1121,9 +1102,7 @@ public function get($table = '', $limit = null, $offset = null) $this->limit($limit, $offset); } - $sql = $this->_compile_select(); - - $result = $this->query($sql); + $result = $this->query($this->_compile_select()); $this->_reset_select(); return $result; } @@ -1145,12 +1124,10 @@ public function count_all_results($table = '') $this->from($table); } - $sql = $this->_compile_select($this->_count_string . $this->_protect_identifiers('numrows')); - - $query = $this->query($sql); + $result = $this->query($this->_compile_select($this->_count_string.$this->_protect_identifiers('numrows'))); $this->_reset_select(); - if ($query->num_rows() == 0) + if ($query->num_rows() === 0) { return 0; } @@ -1188,9 +1165,7 @@ public function get_where($table = '', $where = null, $limit = null, $offset = n $this->limit($limit, $offset); } - $sql = $this->_compile_select(); - - $result = $this->query($sql); + $result = $this->query($this->_compile_select()); $this->_reset_select(); return $result; } @@ -1213,11 +1188,11 @@ public function insert_batch($table = '', $set = NULL) $this->set_insert_batch($set); } - if (count($this->ar_set) == 0) + if (count($this->ar_set) === 0) { if ($this->db_debug) { - //No valid data array. Folds in cases where keys and values did not match up + // No valid data array. Folds in cases where keys and values did not match up return $this->display_error('db_must_use_set'); } return FALSE; @@ -1227,30 +1202,19 @@ public function insert_batch($table = '', $set = NULL) { if ( ! isset($this->ar_from[0])) { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } $table = $this->ar_from[0]; } // Batch this baby - for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100) + for ($i = 0, $total = count($this->ar_set); $i < $total; $i += 100) { - - $sql = $this->_insert_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_keys, array_slice($this->ar_set, $i, 100)); - - //echo $sql; - - $this->query($sql); + $this->query($this->_insert_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_keys, array_slice($this->ar_set, $i, 100))); } $this->_reset_write(); - - return TRUE; } @@ -1294,7 +1258,6 @@ public function set_insert_batch($key, $value = '', $escape = TRUE) else { $clean = array(); - foreach ($row as $value) { $clean[] = $this->escape($value); @@ -1398,24 +1361,16 @@ public function insert($table = '', $set = NULL) */ protected function _validate_insert($table = '') { - if (count($this->ar_set) == 0) + if (count($this->ar_set) === 0) { - if ($this->db_debug) - { - return $this->display_error('db_must_use_set'); - } - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } if ($table == '') { if ( ! isset($this->ar_from[0])) { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } } else @@ -1444,31 +1399,22 @@ public function replace($table = '', $set = NULL) $this->set($set); } - if (count($this->ar_set) == 0) + if (count($this->ar_set) === 0) { - if ($this->db_debug) - { - return $this->display_error('db_must_use_set'); - } - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } if ($table == '') { if ( ! isset($this->ar_from[0])) { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } $table = $this->ar_from[0]; } $sql = $this->_replace($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set)); - $this->_reset_write(); return $this->query($sql); } @@ -1543,7 +1489,6 @@ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) } $sql = $this->_update($this->_protect_identifiers($this->ar_from[0], TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit, $this->ar_like); - $this->_reset_write(); return $this->query($sql); } @@ -1559,34 +1504,28 @@ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) * * @access public * @param string the table to update data on - * @return string + * @return bool */ protected function _validate_update($table = '') { if (count($this->ar_set) == 0) { - if ($this->db_debug) - { - return $this->display_error('db_must_use_set'); - } - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } if ($table == '') { if ( ! isset($this->ar_from[0])) { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } } else { $this->ar_from[0] = $table; } + + return TRUE; } // -------------------------------------------------------------------- @@ -1599,7 +1538,7 @@ protected function _validate_update($table = '') * @param string the table to retrieve the results from * @param array an associative array of update values * @param string the where key - * @return object + * @return bool */ public function update_batch($table = '', $set = NULL, $index = NULL) { @@ -1608,12 +1547,7 @@ public function update_batch($table = '', $set = NULL, $index = NULL) if (is_null($index)) { - if ($this->db_debug) - { - return $this->display_error('db_must_use_index'); - } - - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_use_index') : FALSE; } if ( ! is_null($set)) @@ -1621,39 +1555,29 @@ public function update_batch($table = '', $set = NULL, $index = NULL) $this->set_update_batch($set, $index); } - if (count($this->ar_set) == 0) + if (count($this->ar_set) === 0) { - if ($this->db_debug) - { - return $this->display_error('db_must_use_set'); - } - - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } if ($table == '') { if ( ! isset($this->ar_from[0])) { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } $table = $this->ar_from[0]; } // Batch this baby - for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100) + for ($i = 0, $total = count($this->ar_set); $i < $total; $i += 100) { - $sql = $this->_update_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->ar_set, $i, 100), $this->_protect_identifiers($index), $this->ar_where); - - $this->query($sql); + $this->query($this->_update_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->ar_set, $i, 100), $this->_protect_identifiers($index), $this->ar_where)); } $this->_reset_write(); + return TRUE; } // -------------------------------------------------------------------- @@ -1679,7 +1603,6 @@ public function set_update_batch($key, $index = '', $escape = TRUE) { $index_set = FALSE; $clean = array(); - foreach ($v as $k2 => $v2) { if ($k2 == $index) @@ -1691,14 +1614,7 @@ public function set_update_batch($key, $index = '', $escape = TRUE) $not[] = $k.'-'.$v; } - if ($escape === FALSE) - { - $clean[$this->_protect_identifiers($k2)] = $v2; - } - else - { - $clean[$this->_protect_identifiers($k2)] = $this->escape($v2); - } + $clean[$this->_protect_identifiers($k2)] = ($escape === FALSE) ? $v2 : $this->escape($v2); } if ($index_set == FALSE) @@ -1728,11 +1644,7 @@ public function empty_table($table = '') { if ( ! isset($this->ar_from[0])) { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } $table = $this->ar_from[0]; @@ -1743,9 +1655,7 @@ public function empty_table($table = '') } $sql = $this->_delete($table); - $this->_reset_write(); - return $this->query($sql); } @@ -1767,11 +1677,7 @@ public function truncate($table = '') { if ( ! isset($this->ar_from[0])) { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } $table = $this->ar_from[0]; @@ -1782,9 +1688,7 @@ public function truncate($table = '') } $sql = $this->_truncate($table); - $this->_reset_write(); - return $this->query($sql); } @@ -1830,11 +1734,7 @@ public function delete($table = '', $where = '', $limit = NULL, $reset_data = TR { if ( ! isset($this->ar_from[0])) { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } $table = $this->ar_from[0]; @@ -1864,29 +1764,18 @@ public function delete($table = '', $where = '', $limit = NULL, $reset_data = TR $this->limit($limit); } - if (count($this->ar_where) == 0 && count($this->ar_wherein) == 0 && count($this->ar_like) == 0) + if (count($this->ar_where) === 0 && count($this->ar_wherein) === 0 && count($this->ar_like) === 0) { - if ($this->db_debug) - { - return $this->display_error('db_del_must_use_where'); - } - - return FALSE; + return ($this->db_debug) ? $this->display_error('db_del_must_use_where') : FALSE; } $sql = $this->_delete($table, $this->ar_where, $this->ar_like, $this->ar_limit); - if ($reset_data) { $this->_reset_write(); } - if ($this->return_delete_sql === true) - { - return $sql; - } - - return $this->query($sql); + return ($this->return_delete_sql === TRUE) ? $sql : $this->query($sql); } // -------------------------------------------------------------------- @@ -1953,13 +1842,13 @@ protected function _track_aliases($table) } // if a table alias is used we can recognize it by a space - if (strpos($table, " ") !== FALSE) + if (strpos($table, ' ') !== FALSE) { // if the alias is written with the AS keyword, remove it $table = preg_replace('/ AS /i', ' ', $table); // Grab the alias - $table = trim(strrchr($table, " ")); + $table = trim(strrchr($table, ' ')); // Store the alias, if it doesn't already exist if ( ! in_array($table, $this->ar_aliased_tables)) @@ -1984,10 +1873,7 @@ protected function _compile_select($select_override = FALSE) // Combine any cached components with the current statements $this->_merge_cache(); - // ---------------------------------------------------------------- - // Write the "select" portion of the query - if ($select_override !== FALSE) { $sql = $select_override; @@ -1996,7 +1882,7 @@ protected function _compile_select($select_override = FALSE) { $sql = ( ! $this->ar_distinct) ? 'SELECT ' : 'SELECT DISTINCT '; - if (count($this->ar_select) == 0) + if (count($this->ar_select) === 0) { $sql .= '*'; } @@ -2015,32 +1901,19 @@ protected function _compile_select($select_override = FALSE) } } - // ---------------------------------------------------------------- - // Write the "FROM" portion of the query - if (count($this->ar_from) > 0) { - $sql .= "\nFROM "; - - $sql .= $this->_from_tables($this->ar_from); + $sql .= "\nFROM ".$this->_from_tables($this->ar_from); } - // ---------------------------------------------------------------- - // Write the "JOIN" portion of the query - if (count($this->ar_join) > 0) { - $sql .= "\n"; - - $sql .= implode("\n", $this->ar_join); + $sql .= "\n".implode("\n", $this->ar_join); } - // ---------------------------------------------------------------- - // Write the "WHERE" portion of the query - if (count($this->ar_where) > 0 OR count($this->ar_like) > 0) { $sql .= "\nWHERE "; @@ -2048,10 +1921,7 @@ protected function _compile_select($select_override = FALSE) $sql .= implode("\n", $this->ar_where); - // ---------------------------------------------------------------- - // Write the "LIKE" portion of the query - if (count($this->ar_like) > 0) { if (count($this->ar_where) > 0) @@ -2062,50 +1932,32 @@ protected function _compile_select($select_override = FALSE) $sql .= implode("\n", $this->ar_like); } - // ---------------------------------------------------------------- - // Write the "GROUP BY" portion of the query - if (count($this->ar_groupby) > 0) { - $sql .= "\nGROUP BY "; - - $sql .= implode(', ', $this->ar_groupby); + $sql .= "\nGROUP BY ".implode(', ', $this->ar_groupby); } - // ---------------------------------------------------------------- - // Write the "HAVING" portion of the query - if (count($this->ar_having) > 0) { - $sql .= "\nHAVING "; - $sql .= implode("\n", $this->ar_having); + $sql .= "\nHAVING ".implode("\n", $this->ar_having); } - // ---------------------------------------------------------------- - // Write the "ORDER BY" portion of the query - if (count($this->ar_orderby) > 0) { - $sql .= "\nORDER BY "; - $sql .= implode(', ', $this->ar_orderby); - + $sql .= "\nORDER BY ".implode(', ', $this->ar_orderby); if ($this->ar_order !== FALSE) { $sql .= ($this->ar_order == 'desc') ? ' DESC' : ' ASC'; } } - // ---------------------------------------------------------------- - // Write the "LIMIT" portion of the query - if (is_numeric($this->ar_limit)) { - $sql .= "\n"; - $sql = $this->_limit($sql, $this->ar_limit, $this->ar_offset); + return $this->_limit($sql."\n", $this->ar_limit, $this->ar_offset); } return $sql; @@ -2165,14 +2017,12 @@ public function _object_to_array_batch($object) foreach ($fields as $val) { // There are some built in keys we need to ignore for this conversion - if ($val != '_parent_name') + if ($val !== '_parent_name') { - $i = 0; foreach ($out[$val] as $data) { - $array[$i][$val] = $data; - $i++; + $array[$i++][$val] = $data; } } } @@ -2247,7 +2097,7 @@ public function flush_cache() */ protected function _merge_cache() { - if (count($this->ar_cache_exists) == 0) + if (count($this->ar_cache_exists) === 0) { return; } @@ -2257,7 +2107,7 @@ protected function _merge_cache() $ar_variable = 'ar_'.$val; $ar_cache_var = 'ar_cache_'.$val; - if (count($this->$ar_cache_var) == 0) + if (count($this->$ar_cache_var) === 0) { continue; } @@ -2282,7 +2132,6 @@ protected function _merge_cache() * * Publicly-visible method to reset the AR values. * - * @access public * @return void */ public function reset_query() @@ -2319,25 +2168,24 @@ protected function _reset_run($ar_reset_items) */ protected function _reset_select() { - $ar_reset_items = array( - 'ar_select' => array(), - 'ar_from' => array(), - 'ar_join' => array(), - 'ar_where' => array(), - 'ar_like' => array(), - 'ar_groupby' => array(), - 'ar_having' => array(), - 'ar_orderby' => array(), - 'ar_wherein' => array(), - 'ar_aliased_tables' => array(), - 'ar_no_escape' => array(), - 'ar_distinct' => FALSE, - 'ar_limit' => FALSE, - 'ar_offset' => FALSE, - 'ar_order' => FALSE, - ); - - $this->_reset_run($ar_reset_items); + $this->_reset_run(array( + 'ar_select' => array(), + 'ar_from' => array(), + 'ar_join' => array(), + 'ar_where' => array(), + 'ar_like' => array(), + 'ar_groupby' => array(), + 'ar_having' => array(), + 'ar_orderby' => array(), + 'ar_wherein' => array(), + 'ar_aliased_tables' => array(), + 'ar_no_escape' => array(), + 'ar_distinct' => FALSE, + 'ar_limit' => FALSE, + 'ar_offset' => FALSE, + 'ar_order' => FALSE + ) + ); } // -------------------------------------------------------------------- @@ -2351,19 +2199,19 @@ protected function _reset_select() */ protected function _reset_write() { - $ar_reset_items = array( - 'ar_set' => array(), - 'ar_from' => array(), - 'ar_where' => array(), - 'ar_like' => array(), - 'ar_orderby' => array(), - 'ar_keys' => array(), - 'ar_limit' => FALSE, - 'ar_order' => FALSE - ); - - $this->_reset_run($ar_reset_items); + $this->_reset_run(array( + 'ar_set' => array(), + 'ar_from' => array(), + 'ar_where' => array(), + 'ar_like' => array(), + 'ar_orderby' => array(), + 'ar_keys' => array(), + 'ar_limit' => FALSE, + 'ar_order' => FALSE + ) + ); } + } /* End of file DB_active_rec.php */ diff --git a/system/database/DB_cache.php b/system/database/DB_cache.php index 1ff046c21c1..79651fcb072 100644 --- a/system/database/DB_cache.php +++ b/system/database/DB_cache.php @@ -1,13 +1,13 @@ -CI - // and load the file helper since we use it a lot + // 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'); @@ -59,11 +50,10 @@ function __construct(&$db) /** * Set Cache Directory Path * - * @access public * @param string the path to the cache directory * @return bool */ - function check_path($path = '') + public function check_path($path = '') { if ($path == '') { @@ -76,7 +66,7 @@ function check_path($path = '') } // Add a trailing slash to the path if needed - $path = preg_replace("/(.+?)\/*$/", "\\1/", $path); + $path = preg_replace('/(.+?)\/*$/', '\\1/', $path); if ( ! is_dir($path) OR ! is_really_writable($path)) { @@ -96,10 +86,9 @@ function check_path($path = '') * 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) + public function read($sql) { if ( ! $this->check_path()) { @@ -107,9 +96,7 @@ function read($sql) } $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))) @@ -125,10 +112,9 @@ function read($sql) /** * Write a query to a cache file * - * @access public * @return bool */ - function write($sql, $object) + public function write($sql, $object) { if ( ! $this->check_path()) { @@ -136,11 +122,8 @@ function write($sql, $object) } $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)) @@ -167,10 +150,9 @@ function write($sql, $object) /** * Delete cache files within a particular directory * - * @access public * @return bool */ - function delete($segment_one = '', $segment_two = '') + public function delete($segment_one = '', $segment_two = '') { if ($segment_one == '') { @@ -183,7 +165,6 @@ function delete($segment_one = '', $segment_two = '') } $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; - delete_files($dir_path, TRUE); } @@ -192,16 +173,14 @@ function delete($segment_one = '', $segment_two = '') /** * Delete all existing cache files * - * @access public * @return bool */ - function delete_all() + public function delete_all() { delete_files($this->db->cachedir, TRUE); } } - /* End of file DB_cache.php */ -/* Location: ./system/database/DB_cache.php */ \ No newline at end of file +/* Location: ./system/database/DB_cache.php */ diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index 762d18a4684..336e9497db3 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -1,13 +1,13 @@ -db $CI =& get_instance(); $this->db =& $CI->db; - log_message('debug', "Database Forge Class Initialized"); + log_message('debug', 'Database Forge Class Initialized'); } // -------------------------------------------------------------------- @@ -60,20 +54,13 @@ function __construct() /** * Create database * - * @access public * @param string the database name * @return bool */ - function create_database($db_name) + public function create_database($db_name) { $sql = $this->_create_database($db_name); - - if (is_bool($sql)) - { - return $sql; - } - - return $this->db->query($sql); + return is_bool($sql) ? $sql : $this->db->query($sql); } // -------------------------------------------------------------------- @@ -81,20 +68,13 @@ function create_database($db_name) /** * Drop database * - * @access public * @param string the database name * @return bool */ - function drop_database($db_name) + public function drop_database($db_name) { $sql = $this->_drop_database($db_name); - - if (is_bool($sql)) - { - return $sql; - } - - return $this->db->query($sql); + return is_bool($sql) ? $sql : $this->db->query($sql); } // -------------------------------------------------------------------- @@ -152,7 +132,7 @@ public function add_field($field = '') if (is_string($field)) { - if ($field == 'id') + if ($field === 'id') { $this->add_field(array( 'id' => array( @@ -178,7 +158,7 @@ public function add_field($field = '') { $this->fields = array_merge($this->fields, $field); } - + return $this; } @@ -197,21 +177,14 @@ public function create_table($table = '', $if_not_exists = FALSE) show_error('A table name is required for that operation.'); } - if (count($this->fields) == 0) + 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(); - - if (is_bool($sql)) - { - return $sql; - } - - return $this->db->query($sql); + return is_bool($sql) ? $sql : $this->db->query($sql); } // -------------------------------------------------------------------- @@ -225,13 +198,7 @@ public function create_table($table = '', $if_not_exists = FALSE) public 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); + return is_bool($sql) ? $sql : $this->db->query($sql); } // -------------------------------------------------------------------- @@ -250,8 +217,7 @@ public function rename_table($table_name, $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); + return $this->db->query($this->_rename_table($this->db->dbprefix.$table_name, $this->db->dbprefix.$new_table_name)); } // -------------------------------------------------------------------- @@ -273,8 +239,7 @@ public function add_column($table = '', $field = array(), $after_field = '') // add field info into field array, but we can only do one at a time // so we cycle through - - foreach ($field as $k => $v) + foreach (array_keys($field) as $k) { $this->add_field(array($k => $field[$k])); @@ -284,7 +249,6 @@ public function add_column($table = '', $field = array(), $after_field = '') } $sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field); - $this->_reset(); if ($this->db->query($sql) === FALSE) @@ -307,7 +271,6 @@ public function add_column($table = '', $field = array(), $after_field = '') */ public function drop_column($table = '', $column_name = '') { - if ($table == '') { show_error('A table name is required for that operation.'); @@ -318,9 +281,7 @@ public function drop_column($table = '', $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); + return $this->db->query($this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name)); } // -------------------------------------------------------------------- @@ -342,8 +303,7 @@ public function modify_column($table = '', $field = array()) // add field info into field array, but we can only do one at a time // so we cycle through - - foreach ($field as $k => $v) + foreach (array_keys($field) as $k) { // If no name provided, use the current name if ( ! isset($field[$k]['name'])) @@ -352,14 +312,12 @@ public function modify_column($table = '', $field = array()) } $this->add_field(array($k => $field[$k])); - - if (count($this->fields) == 0) + 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) @@ -382,12 +340,10 @@ public function modify_column($table = '', $field = array()) */ protected function _reset() { - $this->fields = array(); - $this->keys = array(); - $this->primary_keys = array(); + $this->fields = $this->keys = $this->primary_keys = array(); } } /* End of file DB_forge.php */ -/* Location: ./system/database/DB_forge.php */ \ No newline at end of file +/* Location: ./system/database/DB_forge.php */ diff --git a/system/database/DB_result.php b/system/database/DB_result.php index c4ed20b7656..730443222fa 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -1,13 +1,13 @@ -result_array(); - else if ($type == 'object') return $this->result_object(); + if ($type === 'array') return $this->result_array(); + elseif ($type === 'object') return $this->result_object(); else return $this->custom_result_object($type); } @@ -69,8 +65,8 @@ public function result($type = 'object') /** * Custom query result. * - * @param class_name A string that represents the type of object you want back - * @return array of objects + * @param string A string that represents the type of object you want back + * @return array of objects */ public function custom_result_object($class_name) { @@ -91,7 +87,6 @@ public function custom_result_object($class_name) while ($row = $this->_fetch_object()) { $object = new $class_name(); - foreach ($row as $key => $value) { $object->$key = $value; @@ -109,7 +104,6 @@ public function custom_result_object($class_name) /** * Query result. "object" version. * - * @access public * @return object */ public function result_object() @@ -141,7 +135,6 @@ public function result_object() /** * Query result. "array" version. * - * @access public * @return array */ public function result_array() @@ -173,7 +166,6 @@ public function 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 @@ -197,8 +189,8 @@ public function row($n = 0, $type = 'object') $n = 0; } - if ($type == 'object') return $this->row_object($n); - else if ($type == 'array') return $this->row_array($n); + if ($type === 'object') return $this->row_object($n); + elseif ($type === 'array') return $this->row_array($n); else return $this->custom_row_object($n, $type); } @@ -207,8 +199,7 @@ public function row($n = 0, $type = 'object') /** * Assigns an item into a particular column slot * - * @access public - * @return object + * @return void */ public function set_row($key, $value = NULL) { @@ -224,7 +215,6 @@ public function set_row($key, $value = NULL) { $this->row_data[$k] = $v; } - return; } @@ -239,14 +229,12 @@ public function set_row($key, $value = NULL) /** * 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) + if (count($result) === 0) { return $result; } @@ -262,14 +250,12 @@ public function custom_row_object($n, $type) /** * 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) + if (count($result) === 0) { return $result; } @@ -287,14 +273,12 @@ public function row_object($n = 0) /** * 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) + if (count($result) === 0) { return $result; } @@ -313,18 +297,12 @@ public function row_array($n = 0) /** * 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]; + return (count($result) === 0) ? $result : $result[0]; } // -------------------------------------------------------------------- @@ -332,18 +310,12 @@ public function first_row($type = 'object') /** * 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]; + return (count($result) === 0) ? $result : $result[count($result) - 1]; } // -------------------------------------------------------------------- @@ -351,14 +323,12 @@ public function last_row($type = 'object') /** * Returns the "next" row * - * @access public * @return object */ public function next_row($type = 'object') { $result = $this->result($type); - - if (count($result) == 0) + if (count($result) === 0) { return $result; } @@ -376,14 +346,12 @@ public function next_row($type = 'object') /** * Returns the "previous" row * - * @access public * @return object */ public function previous_row($type = 'object') { $result = $this->result($type); - - if (count($result) == 0) + if (count($result) === 0) { return $result; } @@ -416,7 +384,6 @@ 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 */ diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index 8db4f3bac92..4c881d8a1f5 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -1,13 +1,13 @@ -db $CI =& get_instance(); $this->db =& $CI->db; - - log_message('debug', "Database Utility Class Initialized"); + log_message('debug', 'Database Utility Class Initialized'); } // -------------------------------------------------------------------- @@ -59,10 +50,9 @@ function __construct() /** * List databases * - * @access public * @return bool */ - function list_databases() + public function list_databases() { // Is there a cached result? if (isset($this->data_cache['db_names'])) @@ -80,8 +70,7 @@ function list_databases() } } - $this->data_cache['db_names'] = $dbs; - return $this->data_cache['db_names']; + return $this->data_cache['db_names'] = $dbs; } // -------------------------------------------------------------------- @@ -89,11 +78,10 @@ function list_databases() /** * Determine if a particular database exists * - * @access public * @param string * @return boolean */ - function database_exists($database_name) + public 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 @@ -114,17 +102,17 @@ function database_exists($database_name) /** * Optimize Table * - * @access public * @param string the table name * @return bool */ - function optimize_table($table_name) + public function optimize_table($table_name) { $sql = $this->_optimize_table($table_name); if (is_bool($sql)) { - show_error('db_must_use_set'); + show_error('db_must_use_set'); + return FALSE; } $query = $this->db->query($sql); @@ -140,10 +128,9 @@ function optimize_table($table_name) /** * Optimize Database * - * @access public * @return array */ - function optimize_database() + public function optimize_database() { $result = array(); foreach ($this->db->list_tables() as $table_name) @@ -177,11 +164,10 @@ function optimize_database() /** * Repair Table * - * @access public * @param string the table name * @return bool */ - function repair_table($table_name) + public function repair_table($table_name) { $sql = $this->_repair_table($table_name); @@ -203,14 +189,13 @@ function repair_table($table_name) /** * 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 = '"') + public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosure = '"') { if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) { @@ -218,15 +203,13 @@ function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"' } $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; + $out = rtrim($out).$newline; // Next blast through the result array and build out the rows foreach ($query->result_array() as $row) @@ -235,8 +218,7 @@ function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"' { $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim; } - $out = rtrim($out); - $out .= $newline; + $out = rtrim($out).$newline; } return $out; @@ -247,12 +229,11 @@ function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"' /** * 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()) + public function xml_from_result($query, $params = array()) { if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) { @@ -280,16 +261,14 @@ function xml_from_result($query, $params = array()) foreach ($query->result_array() as $row) { $xml .= $tab."<{$element}>".$newline; - foreach ($row as $key => $val) { $xml .= $tab.$tab."<{$key}>".xml_convert($val)."".$newline; } $xml .= $tab."".$newline; } - $xml .= "".$newline; - return $xml; + return $xml .= "".$newline; } // -------------------------------------------------------------------- @@ -297,10 +276,9 @@ function xml_from_result($query, $params = array()) /** * Database Backup * - * @access public * @return void */ - function backup($params = array()) + public function backup($params = array()) { // If the parameters have not been submitted as an // array then we know that it is simply the table @@ -314,14 +292,14 @@ function backup($params = array()) // 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" - ); + '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) @@ -335,29 +313,23 @@ function backup($params = array()) } } - // ------------------------------------------------------ - // 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) + 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 + // 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 (($prefs['format'] === 'gzip' AND ! @function_exists('gzencode')) + OR ($prefs['format'] === 'zip' AND ! @function_exists('gzcompress'))) { if ($this->db->db_debug) { @@ -367,60 +339,49 @@ function backup($params = array()) $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 ($prefs['format'] === 'zip') { - // If they included the .zip file extension we'll remove it - if (preg_match("|.+?\.zip$|", $prefs['filename'])) + // Set the filename if not provided (only needed with Zip files) + if ($prefs['filename'] == '') { - $prefs['filename'] = str_replace('.zip', '', $prefs['filename']); + $prefs['filename'] = (count($prefs['tables']) === 1 ? $prefs['tables'] : $this->db->database) + .date('Y-m-d_H-i', time()).'.sql'; } - - // Tack on the ".sql" file extension if needed - if ( ! preg_match("|.+?\.sql$|", $prefs['filename'])) + else { - $prefs['filename'] .= '.sql'; + // 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(); } + elseif ($prefs['format'] == 'txt') // Was a text file requested? + { + return $this->_backup($prefs); + } + elseif ($prefs['format'] === 'gzip') // Was a Gzip file requested? + { + return gzencode($this->_backup($prefs)); + } + return; } } - /* End of file DB_utility.php */ -/* Location: ./system/database/DB_utility.php */ \ No newline at end of file +/* Location: ./system/database/DB_utility.php */ From 75f7c12815c62782163a54e84707f50459b6ef5d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 03:49:25 +0200 Subject: [PATCH 0241/5397] Remove loading of ['core'] elements --- system/core/Loader.php | 7 ------- user_guide_src/source/changelog.rst | 7 ++++--- user_guide_src/source/installation/upgrade_300.rst | 9 +++++++-- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index 689ae1ecd99..272fe429194 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -1165,13 +1165,6 @@ protected function _ci_autoloader() } } - // A little tweak to remain backward compatible - // The $autoload['core'] item was deprecated - if ( ! isset($autoload['libraries']) AND isset($autoload['core'])) - { - $autoload['libraries'] = $autoload['core']; - } - // Load libraries if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 763f58b8f98..7e7be068915 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -31,6 +31,8 @@ Release Date: Not Released - Added application/xml for xml and application/xml, text/xsl for xsl in mimes.php. - Changed logger to only chmod when file is first created. - Removed previously deprecated SHA1 Library. + - Removed previously deprecated use of ``$autoload['core']`` in application/config/autoload.php. + Only entries in ``$autoload['libraries']`` are auto-loaded now. - Helpers @@ -66,10 +68,9 @@ Release Date: Not Released - Core - - Changed private functions in CI_URI to protected so MY_URI can - override them. + - Changed private functions in CI_URI to protected so MY_URI can override them. - Removed CI_CORE boolean constant from CodeIgniter.php (no longer Reactor and Core versions). - - Added method get_vars() to CI_Loader to retrieve all variables loaded with $this->load->vars() + - Added method get_vars() to CI_Loader to retrieve all variables loaded with $this->load->vars(). Bug fixes for 3.0 ------------------ diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 960485ae39a..4c594ab1705 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -15,6 +15,9 @@ Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one. +.. note:: If you have any custom developed files in these folders please + make copies of them first. + Step 2: Change References to the SHA Library ============================================ @@ -23,6 +26,8 @@ Alter your code to use the native `sha1()` PHP function to generate a sha1 hash. Additionally, the `sha1()` method in the :doc:`Encryption Library <../libraries/encryption>` has been removed. +Step 3: Remove $autoload['core'] from your config/autoload.php +============================================================== -.. note:: If you have any custom developed files in these folders please - make copies of them first. +Use of the `$autoload['core']` config array has been deprecated as of CodeIgniter 1.4.1 and is now removed. +Move any entries that you might have listed there to `$autoload['libraries']` instead. From 137749793d6cce57e03904f05239fa80eec48d13 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 04:30:33 +0200 Subject: [PATCH 0242/5397] Switch some public properties to protected --- system/core/Input.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index 07bb30b155b..13bf76fd647 100755 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -57,20 +57,20 @@ class CI_Input { * * @var bool */ - public $_allow_get_array = TRUE; + protected $_allow_get_array = TRUE; /** * If TRUE, then newlines are standardized * * @var bool */ - public $_standardize_newlines = TRUE; + protected $_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 */ - public $_enable_xss = FALSE; + protected $_enable_xss = FALSE; /** * Enables a CSRF cookie token to be set. * Set automatically based on config setting @@ -85,17 +85,15 @@ class CI_Input { */ protected $headers = array(); - /** * Constructor * * Sets whether to globally enable the XSS processing * and whether to allow the $_GET array - * */ public function __construct() { - log_message('debug', "Input Class Initialized"); + 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); From c90d651e8531142d36326d5c3451d7899fb00f76 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 04:35:02 +0200 Subject: [PATCH 0243/5397] Style guide stuff --- system/core/Output.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/system/core/Output.php b/system/core/Output.php index 272545046d0..1beee734f11 100755 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -488,8 +488,7 @@ public function _display_cache(&$CFG, &$URI) $uri = $CFG->item('base_url').$CFG->item('index_page').$URI->uri_string; $filepath = $cache_path.md5($uri); - if ( ! @file_exists($filepath) - OR ! $fp = @fopen($filepath, FOPEN_READ)) + if ( ! @file_exists($filepath) OR ! $fp = @fopen($filepath, FOPEN_READ)) { return FALSE; } @@ -508,8 +507,7 @@ public function _display_cache(&$CFG, &$URI) } // Has the file expired? If so we'll delete it. - if (time() >= trim(str_replace('TS--->', '', $match[1])) - AND is_really_writable($cache_path)) + if (time() >= trim(str_replace('TS--->', '', $match[1])) && is_really_writable($cache_path)) { @unlink($filepath); log_message('debug', 'Cache file has expired. File deleted.'); From 0f7decce7cb64566e63bd910557006f041514d89 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 04:40:29 +0200 Subject: [PATCH 0244/5397] Swap two vars for readability --- system/database/DB_active_rec.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index 30a17d11a68..71762a4dee3 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -278,7 +278,7 @@ public function from($from) { $v = trim($v); $this->_track_aliases($v); - $this->ar_from[] = $v = $this->_protect_identifiers($v, TRUE, NULL, FALSE); + $v = $this->ar_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE); if ($this->ar_caching === TRUE) { From 29ce5d90b4276fc8a4e9354c1435963111f09a24 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 04:43:31 +0200 Subject: [PATCH 0245/5397] Replace AND with && --- system/core/CodeIgniter.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index e3d81882535..cb5d439bd42 100755 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -59,7 +59,7 @@ * Load the framework constants * ------------------------------------------------------ */ - if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php')) + if (defined('ENVIRONMENT') && file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php')) { require(APPPATH.'config/'.ENVIRONMENT.'/constants.php'); } @@ -96,7 +96,7 @@ * 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'] != '') + if (isset($assign_to_config['subclass_prefix']) && $assign_to_config['subclass_prefix'] != '') { get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix'])); } @@ -106,8 +106,8 @@ * Set a liberal script execution time limit * ------------------------------------------------------ */ - if (function_exists('set_time_limit') AND @ini_get('safe_mode') == 0 - AND php_sapi_name() !== 'cli') // Do not override the Time Limit value if running from Command Line + if (function_exists('set_time_limit') && @ini_get('safe_mode') == 0 + && php_sapi_name() !== 'cli') // Do not override the Time Limit value if running from Command Line { @set_time_limit(300); } @@ -195,7 +195,7 @@ * ------------------------------------------------------ */ if ($EXT->_call_hook('cache_override') === FALSE - AND $OUT->_display_cache($CFG, $URI) == TRUE) + && $OUT->_display_cache($CFG, $URI) == TRUE) { exit; } @@ -393,7 +393,7 @@ function &get_instance() * Close the DB connection if one exists * ------------------------------------------------------ */ - if (class_exists('CI_DB') AND isset($CI->db)) + if (class_exists('CI_DB') && isset($CI->db)) { $CI->db->close(); } From 90cfe14b8458a3c84825a741cd750c5a02690f3b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 04:46:42 +0200 Subject: [PATCH 0246/5397] Switch private methods to protected --- system/core/Input.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index 13bf76fd647..7a16e51abe6 100755 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -391,7 +391,7 @@ public function valid_ip($ip) { // 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) + if ($segment == '' OR preg_match('/[^0-9]/', $segment) OR $segment > 255 OR strlen($segment) > 3) { return FALSE; } @@ -430,7 +430,7 @@ public function user_agent() * * @return void */ - private function _sanitize_globals() + protected function _sanitize_globals() { // It would be "wrong" to unset any of these GLOBALS. $protected = array('_SERVER', '_GET', '_POST', '_FILES', '_REQUEST', @@ -516,7 +516,7 @@ private function _sanitize_globals() $this->security->csrf_verify(); } - log_message('debug', "Global POST and COOKIE data sanitized"); + log_message('debug', 'Global POST and COOKIE data sanitized'); } // -------------------------------------------------------------------- @@ -530,7 +530,7 @@ private function _sanitize_globals() * @param string * @return string */ - private function _clean_input_data($str) + protected function _clean_input_data($str) { if (is_array($str)) { @@ -588,7 +588,7 @@ private function _clean_input_data($str) * @param string * @return string */ - private function _clean_input_keys($str) + protected function _clean_input_keys($str) { if ( ! preg_match('/^[a-z0-9:_\/-]+$/i', $str)) { From 8a7d078233bfb80fa01ee090e14ce0664f23b96b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 05:43:42 +0200 Subject: [PATCH 0247/5397] Remove some tabs --- system/core/Security.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Security.php b/system/core/Security.php index f09298bba72..d7881d846b7 100755 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -176,7 +176,7 @@ public function csrf_verify() unset($_COOKIE[$this->_csrf_cookie_name]); $this->_csrf_hash = ''; } - + $this->_csrf_set_hash(); $this->csrf_set_cookie(); From cc6dbda62c1c04d4e247308f980e64d5d13c932d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 06:35:17 +0200 Subject: [PATCH 0248/5397] Some more misc. stuff --- system/libraries/Encrypt.php | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php index d9f40b0d5ea..63e3bb55e35 100644 --- a/system/libraries/Encrypt.php +++ b/system/libraries/Encrypt.php @@ -46,15 +46,10 @@ class CI_Encrypt { protected $_mcrypt_cipher; protected $_mcrypt_mode; - /** - * Constructor - * - * Simply determines whether the mcrypt library exists. - */ public function __construct() { $this->_mcrypt_exists = ( ! function_exists('mcrypt_encrypt')) ? FALSE : TRUE; - log_message('debug', "Encrypt Class Initialized"); + log_message('debug', 'Encrypt Class Initialized'); } // -------------------------------------------------------------------- @@ -95,7 +90,7 @@ public function get_key($key = '') * Set the encryption key * * @param string - * @return void + * @return object */ public function set_key($key = '') { @@ -457,7 +452,7 @@ protected function _get_mode() */ public function set_hash($type = 'sha1') { - $this->_hash_type = ($type !== 'sha1' AND $type !== 'md5') ? 'sha1' : $type; + $this->_hash_type = ($type !== 'sha1' && $type !== 'md5') ? 'sha1' : $type; } // -------------------------------------------------------------------- @@ -474,7 +469,5 @@ public function hash($str) } } -// END CI_Encrypt class - /* End of file Encrypt.php */ /* Location: ./system/libraries/Encrypt.php */ From cfbd15b6d052c1cb93fb5fa08e35fa7d3c6c7751 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 06:41:41 +0200 Subject: [PATCH 0249/5397] Some more misc. stuff --- system/libraries/Zip.php | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index d60b9946295..2ed79f0e36b 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -51,13 +51,9 @@ class CI_Zip { public $offset = 0; public $now; - /** - * Constructor - */ public function __construct() { - log_message('debug', "Zip Compression Class Initialized"); - + log_message('debug', 'Zip Compression Class Initialized'); $this->now = time(); } @@ -75,13 +71,12 @@ public function add_dir($directory) { foreach ((array)$directory as $dir) { - if ( ! preg_match("|.+/$|", $dir)) + if ( ! preg_match('|.+/$|', $dir)) { $dir .= '/'; } $dir_time = $this->_get_mod_time($dir); - $this->_add_dir($dir, $dir_time['file_mtime'], $dir_time['file_mdate']); } } @@ -101,12 +96,10 @@ protected function _get_mod_time($dir) // filemtime() may return false, but raises an error for non-existing files $date = (file_exists($dir)) ? filemtime($dir): getdate($this->now); - $time = array( + return array( 'file_mtime' => ($date['hours'] << 11) + ($date['minutes'] << 5) + $date['seconds'] / 2, 'file_mdate' => (($date['year'] - 1980) << 9) + ($date['mon'] << 5) + $date['mday'] ); - - return $time; } // -------------------------------------------------------------------- @@ -197,13 +190,11 @@ public function add_data($filepath, $data = NULL) */ protected function _add_data($filepath, $data, $file_mtime, $file_mdate) { - $filepath = str_replace("\\", "/", $filepath); + $filepath = str_replace('\\', '/', $filepath); $uncompressed_size = strlen($data); $crc32 = crc32($data); - - $gzdata = gzcompress($data); - $gzdata = substr($gzdata, 2, -4); + $gzdata = substr(gzcompress($data), 2, -4); $compressed_size = strlen($gzdata); $this->zipdata .= @@ -255,16 +246,16 @@ public function read_file($path, $preserve_filepath = FALSE) if (FALSE !== ($data = file_get_contents($path))) { - $name = str_replace("\\", "/", $path); - + $name = str_replace('\\', '/', $path); if ($preserve_filepath === FALSE) { - $name = preg_replace("|.*/(.+)|", "\\1", $name); + $name = preg_replace('|.*/(.+)|', '\\1', $name); } $this->add_data($name, $data); return TRUE; } + return FALSE; } @@ -282,7 +273,7 @@ public function read_file($path, $preserve_filepath = FALSE) */ public function read_dir($path, $preserve_filepath = TRUE, $root_path = NULL) { - $path = rtrim($path, '/\\').DIRECTORY_SEPARATOR; + $path = rtrim($path, '/\\').'/'; if ( ! $fp = @opendir($path)) { @@ -304,14 +295,13 @@ public function read_dir($path, $preserve_filepath = TRUE, $root_path = NULL) if (@is_dir($path.$file)) { - $this->read_dir($path.$file."/", $preserve_filepath, $root_path); + $this->read_dir($path.$file.'/', $preserve_filepath, $root_path); } else { if (FALSE !== ($data = file_get_contents($path.$file))) { - $name = str_replace("\\", "/", $path); - + $name = str_replace('\\', '/', $path); if ($preserve_filepath === FALSE) { $name = str_replace($root_path, '', $name); @@ -335,7 +325,7 @@ public function read_dir($path, $preserve_filepath = TRUE, $root_path = NULL) public function get_zip() { // Is there any data to return? - if ($this->entries == 0) + if ($this->entries === 0) { return FALSE; } @@ -392,9 +382,7 @@ public function download($filename = 'backup.zip') $CI =& get_instance(); $CI->load->helper('download'); - $get_zip = $this->get_zip(); - $zip_content =& $get_zip; force_download($filename, $zip_content); From 4f2933d28370ad965059222553d8ace1dd2fe602 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 06:49:49 +0200 Subject: [PATCH 0250/5397] Some more misc. stuff --- system/helpers/array_helper.php | 2 -- system/helpers/captcha_helper.php | 37 ++++++------------------------- 2 files changed, 7 insertions(+), 32 deletions(-) diff --git a/system/helpers/array_helper.php b/system/helpers/array_helper.php index 881f57db31c..a454f936ddd 100644 --- a/system/helpers/array_helper.php +++ b/system/helpers/array_helper.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Array Helpers * diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 40b6e5b23a1..89bff2366a0 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -67,7 +67,9 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = } } - if ($img_path == '' OR $img_url == '' OR ! @is_dir($img_path) OR ! is_writeable($img_path) OR ! extension_loaded('gd')) + if ($img_path == '' OR $img_url == '' + OR ! @is_dir($img_path) OR ! is_writeable($img_path) + OR ! extension_loaded('gd')) { return FALSE; } @@ -98,11 +100,10 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = if ($word == '') { $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - $word = ''; for ($i = 0, $mt_rand_max = strlen($pool) - 1; $i < 8; $i++) { - $word .= substr($pool, mt_rand(0, $mt_rand_max), 1); + $word .= $pool[mt_rand(0, $mt_rand_max)]; } } @@ -110,46 +111,32 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = // ----------------------------------- // 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); - } + $im = function_exists('imagecreatetruecolor') + ? imagecreatetruecolor($img_width, $img_height) + : 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; @@ -173,7 +160,6 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = // ----------------------------------- // Write the text // ----------------------------------- - $use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE; if ($use_font == FALSE) @@ -206,29 +192,20 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = } - // ----------------------------------- // 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 = "\""; - ImageDestroy($im); return array('word' => $word, 'time' => $now, 'image' => $img); } } -// ------------------------------------------------------------------------ - /* End of file captcha_helper.php */ /* Location: ./system/helpers/captcha_helper.php */ From cb324bd9268fc6b0c93fd22545bd989771d68b04 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 8 Jan 2012 07:06:35 +0200 Subject: [PATCH 0251/5397] Some more misc. stuff --- system/helpers/smiley_helper.php | 2 -- system/helpers/string_helper.php | 17 +++++++++-------- system/helpers/text_helper.php | 8 +++----- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php index bc265e5527a..03f3ee287bb 100644 --- a/system/helpers/smiley_helper.php +++ b/system/helpers/smiley_helper.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Smiley Helpers * diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php index 654f721b0fc..fcdb0aa845b 100644 --- a/system/helpers/string_helper.php +++ b/system/helpers/string_helper.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter String Helpers * @@ -153,7 +151,7 @@ function quotes_to_entities($str) { function reduce_double_slashes($str) { - return preg_replace("#(^|[^:])//+#", "\\1/", $str); + return preg_replace('#(^|[^:])//+#', '\\1/', $str); } } @@ -181,7 +179,6 @@ function reduce_double_slashes($str) function reduce_multiples($str, $character = ',', $trim = FALSE) { $str = preg_replace('#'.preg_quote($character, '#').'{2,}#', $character, $str); - return ($trim === TRUE) ? trim($str, $character) : $str; } } @@ -211,13 +208,17 @@ function random_string($type = 'alnum', $len = 8) case 'alpha': switch ($type) { - case 'alpha': $pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + case 'alpha': + $pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; break; - case 'alnum': $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + case 'alnum': + $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; break; - case 'numeric': $pool = '0123456789'; + case 'numeric': + $pool = '0123456789'; break; - case 'nozero': $pool = '123456789'; + case 'nozero': + $pool = '123456789'; break; } return substr(str_shuffle(str_repeat($pool, ceil($len/strlen($pool)))),0,$len); diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index 3a847f29b19..cef32847d0d 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Text Helpers * @@ -93,7 +91,7 @@ function character_limiter($str, $n = 500, $end_char = '…') return $str; } - $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str)); + $str = preg_replace('/\s+/', ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str)); if (strlen($str) <= $n) { @@ -108,7 +106,7 @@ function character_limiter($str, $n = 500, $end_char = '…') if (strlen($out) >= $n) { $out = trim($out); - return (strlen($out) == strlen($str)) ? $out : $out.$end_char; + return (strlen($out) === strlen($str)) ? $out : $out.$end_char; } } } @@ -354,7 +352,7 @@ function highlight_phrase($str, $phrase, $tag_open = '', $tag_close = '< if ($phrase != '') { - return preg_replace('/('.preg_quote($phrase, '/').')/i', $tag_open."\\1".$tag_close, $str); + return preg_replace('/('.preg_quote($phrase, '/').')/i', $tag_open.'\\1'.$tag_close, $str); } return $str; From 0609d588a4340fc9a9cfbc0ff76c39bba9ab09fb Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Sun, 8 Jan 2012 13:26:17 +0100 Subject: [PATCH 0252/5397] Fixes for issue 896 --- system/core/Common.php | 2 +- system/core/Output.php | 3 +-- system/core/URI.php | 5 +++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 6ef22962978..1f59c02d797 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -235,7 +235,7 @@ function &get_config($replace = array()) } // Is the config file in the environment folder? - if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT..'/config.php')) + if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) { $file_path = APPPATH.'config/config.php'; } diff --git a/system/core/Output.php b/system/core/Output.php index 1beee734f11..da5c2904468 100755 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -129,7 +129,6 @@ public function get_output() * * Sets the output string * - * @access public * @param string * @return void */ @@ -282,7 +281,7 @@ public function set_profiler_sections($sections) * @param integer * @return void */ - publi function cache($time) + public function cache($time) { $this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time; return $this; diff --git a/system/core/URI.php b/system/core/URI.php index eaf7b752b5e..b28ee198bfd 100755 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -186,11 +186,12 @@ protected function _detect_uri() return ''; } - if (strpos($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']) === 0) + $uri = $_SERVER['REQUEST_URI']; + if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) { $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); } - elseif (strpos($_SERVER['REQUEST_URI'], dirname($_SERVER['SCRIPT_NAME'])) === 0) + elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) { $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); } From edc875593d3ddbd0fe86caf6380a62b00a20f245 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 Jan 2012 09:35:10 +0200 Subject: [PATCH 0253/5397] Fix a possible notice in Output library --- system/core/Output.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/system/core/Output.php b/system/core/Output.php index da5c2904468..69a2e5f8835 100755 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -397,14 +397,12 @@ public function _display($output = '') // If the output data contains closing and tags // we will remove them and add them back after we insert the profile data $output = preg_replace('|.*?|is', '', $output, $count).$CI->profiler->run(); - if ($count > 0) + if (isset($count) && $count > 0) { $output .= ''; } } - // -------------------------------------------------------------------- - // Does the controller contain a function named _output()? // If so send the output there. Otherwise, echo it. if (method_exists($CI, '_output')) @@ -413,7 +411,7 @@ public function _display($output = '') } else { - echo $output; // Send it to the browser! + echo $output; // Send it to the browser! } log_message('debug', 'Final output sent to browser'); From cba20b164fdb1e60225b4f1fc04b7a31c4ffa106 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 Jan 2012 10:16:41 +0200 Subject: [PATCH 0254/5397] Really fix this ... --- system/core/Output.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/core/Output.php b/system/core/Output.php index 69a2e5f8835..d27133d3704 100755 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -396,8 +396,9 @@ public function _display($output = '') // If the output data contains closing and tags // we will remove them and add them back after we insert the profile data - $output = preg_replace('|.*?|is', '', $output, $count).$CI->profiler->run(); - if (isset($count) && $count > 0) + $count = 0; + $output = preg_replace('|.*?|is', '', $output, -1, $count).$CI->profiler->run(); + if ($count > 0) { $output .= ''; } From a96a9c8e6c7a113c808ba047808180b33360d3dd Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 Jan 2012 11:01:15 +0200 Subject: [PATCH 0255/5397] Remove once again ... --- system/core/Output.php | 1 - 1 file changed, 1 deletion(-) diff --git a/system/core/Output.php b/system/core/Output.php index d27133d3704..abd8a0ea9d1 100755 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -396,7 +396,6 @@ public function _display($output = '') // If the output data contains closing and tags // we will remove them and add them back after we insert the profile data - $count = 0; $output = preg_replace('|.*?|is', '', $output, -1, $count).$CI->profiler->run(); if ($count > 0) { From 1d160e78619574bf7fcb3c9b5d6a4bc9f93f2db6 Mon Sep 17 00:00:00 2001 From: Purwandi Date: Mon, 9 Jan 2012 16:33:28 +0700 Subject: [PATCH 0256/5397] Fix error undefined variable query on count_all_results db active record --- system/database/DB_active_rec.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index 71762a4dee3..4247351577c 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -1127,15 +1127,14 @@ public function count_all_results($table = '') $result = $this->query($this->_compile_select($this->_count_string.$this->_protect_identifiers('numrows'))); $this->_reset_select(); - if ($query->num_rows() === 0) + if ($result->num_rows() === 0) { return 0; } - $row = $query->row(); + $row = $result->row(); return (int) $row->numrows; } - // -------------------------------------------------------------------- /** From d47baab1bd4d655a68981834d11727ae8c2a3a45 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 Jan 2012 16:56:46 +0200 Subject: [PATCH 0257/5397] Fix issue #904 --- system/core/Common.php | 2 +- system/core/Loader.php | 12 +++++------- user_guide_src/source/changelog.rst | 4 ++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 1f59c02d797..2f9c4ff43a1 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -199,7 +199,7 @@ function &load_class($class, $directory = 'libraries', $prefix = 'CI_') */ if ( ! function_exists('is_loaded')) { - function is_loaded($class = '') + function &is_loaded($class = '') { static $_is_loaded = array(); diff --git a/system/core/Loader.php b/system/core/Loader.php index 272fe429194..12daaa92868 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -250,10 +250,10 @@ public function model($model, $name = '', $db_conn = FALSE) if (($last_slash = strrpos($model, '/')) !== FALSE) { // The path is in front of the last slash - $path = substr($model, 0, $last_slash + 1); + $path = substr($model, 0, ++$last_slash); // And the model name behind it - $model = substr($model, $last_slash + 1); + $model = substr($model, $last_slash); } if ($name == '') @@ -833,10 +833,9 @@ protected function _ci_load($_ci_data) // If the PHP installation does not support short tags we'll // do a little string replacement, changing the short tags // to standard PHP echo statements. - if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE) { - echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace(''.preg_replace('/;*\s*\?>/', '; ?>', str_replace(' $this->_ci_ob_level + 1) { @@ -1233,13 +1231,13 @@ protected function _ci_prep_filename($filename, $extension) { if ( ! is_array($filename)) { - return array(strtolower(str_replace('.php', '', str_replace($extension, '', $filename)).$extension)); + return array(strtolower(str_replace(array($extension, '.php'), '', $filename).$extension)); } else { foreach ($filename as $key => $val) { - $filename[$key] = strtolower(str_replace('.php', '', str_replace($extension, '', $val)).$extension); + $filename[$key] = strtolower(str_replace(array($extension, '.php'), '', $val).$extension); } return $filename; diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d9eca7fef04..48011f208e3 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -67,12 +67,12 @@ Release Date: Not Released - Removed SHA1 function in the :doc:`Encryption Library `. - Added $config['csrf_regeneration'] to the CSRF protection in the :doc:`Security library `, which makes token regeneration optional. - - Core - Changed private functions in CI_URI to protected so MY_URI can override them. - Removed CI_CORE boolean constant from CodeIgniter.php (no longer Reactor and Core versions). - Added method get_vars() to CI_Loader to retrieve all variables loaded with $this->load->vars(). + - is_loaded() function from system/core/Commons.php now returns a reference. Bug fixes for 3.0 ------------------ @@ -96,7 +96,7 @@ Bug fixes for 3.0 - Fixed a bug in CI_Image_lib::gd_loaded() where it was possible for the script execution to end or a PHP E_WARNING message to be emitted. - In Pagination library, when use_page_numbers=TRUE previous link and page 1 link do not have the same url - Fixed a bug (#561) - Errors in :doc:`XML-RPC Library ` were not properly escaped. - +- Fixed a bug (#904) - ``CI_Loader::initialize()`` caused a PHP Fatal error to be triggered if error level E_STRICT is used. Version 2.1.0 ============= From 5287f6643f5ca55c360a6372c526c8c06c0c4912 Mon Sep 17 00:00:00 2001 From: insign Date: Mon, 9 Jan 2012 18:07:34 -0200 Subject: [PATCH 0258/5397] Removed the first slash of the line 51. With this, the goal of the code don't work. I tried it in many Apache servers. Sorry if I am wrong. --- user_guide_src/source/general/urls.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/general/urls.rst b/user_guide_src/source/general/urls.rst index 3126fcf3685..857078b1c0f 100644 --- a/user_guide_src/source/general/urls.rst +++ b/user_guide_src/source/general/urls.rst @@ -48,7 +48,7 @@ method in which everything is redirected except the specified items: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^(.*)$ /index.php/$1 [L] + RewriteRule ^(.*)$ index.php/$1 [L] In the above example, any HTTP request other than those for existing directories and existing files is treated as a request for your index.php file. From 4562f2cbb3e5346c6e341516a31ca87dfa47bafd Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 Jan 2012 23:39:50 +0200 Subject: [PATCH 0259/5397] Some more stuff ... --- system/core/Security.php | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/system/core/Security.php b/system/core/Security.php index d7881d846b7..1007f61f456 100755 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -153,20 +153,13 @@ public function csrf_verify() } // Do the tokens exist in both the _POST and _COOKIE arrays? - if ( ! isset($_POST[$this->_csrf_token_name]) OR - ! isset($_COOKIE[$this->_csrf_cookie_name])) + if ( ! isset($_POST[$this->_csrf_token_name]) OR ! isset($_COOKIE[$this->_csrf_cookie_name]) + OR $_POST[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name]) // Do the tokens match? { $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 + // We kill this since we're done and we don't want to polute the _POST array unset($_POST[$this->_csrf_token_name]); // Regenerate on every submission? @@ -308,10 +301,9 @@ public function xss_clean($str, $is_image = FALSE) * 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); + $str = preg_replace_callback('/<\w+.*?(?=>|<|$)/si', array($this, '_decode_entity'), $str); // Remove Invisible Characters Again! $str = remove_invisible_characters($str); @@ -326,9 +318,7 @@ public function xss_clean($str, $is_image = FALSE) */ $str = str_replace("\t", ' ', $str); - /* - * Capture converted string for later comparison - */ + // Capture converted string for later comparison $converted_string = $str; // Remove Strings that are never allowed @@ -720,12 +710,11 @@ protected function _convert_attribute($match) 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); + $out .= preg_replace('#/\*.*?\*/#s', '', $match); } } From 4b13061308301cd307fe5317604265ab934fb046 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 10 Jan 2012 16:09:55 +0200 Subject: [PATCH 0260/5397] Fixed a bug in CI_Lang::load() --- system/core/Lang.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Lang.php b/system/core/Lang.php index 088cb6c9c63..c40a6856ed8 100755 --- a/system/core/Lang.php +++ b/system/core/Lang.php @@ -130,7 +130,7 @@ public function load($langfile = '', $idiom = '', $return = FALSE, $add_suffix = } $this->is_loaded[] = $langfile; - $this->language = $this->language + $lang; + $this->language = array_merge($this->language, $lang); unset($lang); log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile); From 57f58a27df738408a06307442a9a344414e90016 Mon Sep 17 00:00:00 2001 From: Ronald Beilsma Date: Tue, 10 Jan 2012 15:59:06 +0100 Subject: [PATCH 0261/5397] closedir closes directory handle, not directory path --- system/helpers/file_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php index 9b39b8c20c5..d76d85691fc 100644 --- a/system/helpers/file_helper.php +++ b/system/helpers/file_helper.php @@ -205,7 +205,7 @@ function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE) $_filedata[] = ($include_path == TRUE) ? $source_dir.$file : $file; } } - closedir($source_dir); + closedir($fp); return $_filedata; } From 92fcffa6c76a2010ee7a2162554b304ba7cf0549 Mon Sep 17 00:00:00 2001 From: Ronald Beilsma Date: Tue, 10 Jan 2012 16:11:00 +0100 Subject: [PATCH 0262/5397] closedir closes directory handle, not directory path --- system/helpers/file_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php index d76d85691fc..89b2a54db19 100644 --- a/system/helpers/file_helper.php +++ b/system/helpers/file_helper.php @@ -259,7 +259,7 @@ function get_dir_file_info($source_dir, $top_level_only = TRUE, $_recursion = FA $_filedata[$file]['relative_path'] = $relative_path; } } - closedir($source_dir); + closedir($fp); return $_filedata; } From 3b8ad8f6c300b4cec6901e5053495f93e104d267 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 10 Jan 2012 18:09:07 +0200 Subject: [PATCH 0263/5397] Fix a bug in the File helper --- system/helpers/file_helper.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php index 9b39b8c20c5..2d4b10e37cc 100644 --- a/system/helpers/file_helper.php +++ b/system/helpers/file_helper.php @@ -196,16 +196,16 @@ function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE) while (FALSE !== ($file = readdir($fp))) { - if (@is_dir($source_dir.$file) && strncmp($file, '.', 1) !== 0) + if (@is_dir($source_dir.$file) && $file[0] !== '.') { get_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE); } - elseif (strncmp($file, '.', 1) !== 0) + elseif ($file[0] !== '.') { $_filedata[] = ($include_path == TRUE) ? $source_dir.$file : $file; } } - closedir($source_dir); + closedir($fp); return $_filedata; } @@ -249,17 +249,17 @@ function get_dir_file_info($source_dir, $top_level_only = TRUE, $_recursion = FA // 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) + if (@is_dir($source_dir.$file) && $file[0] !== '.' && $top_level_only === FALSE) { get_dir_file_info($source_dir.$file.DIRECTORY_SEPARATOR, $top_level_only, TRUE); } - elseif (strncmp($file, '.', 1) !== 0) + elseif ($file[0] !== '.') { $_filedata[$file] = get_file_info($source_dir.$file); $_filedata[$file]['relative_path'] = $relative_path; } } - closedir($source_dir); + closedir($fp); return $_filedata; } @@ -359,7 +359,7 @@ function get_mime_by_extension($file) if ( ! is_array($mimes)) { - if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) + if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); } From 176b363e534da12a38a75c9e2ba273846dfa35a7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 10 Jan 2012 18:14:28 +0200 Subject: [PATCH 0264/5397] Fix a bug in system/core/CodeIgniter.php --- system/core/CodeIgniter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index cb5d439bd42..7af3c485d7a 100755 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -267,7 +267,7 @@ function &get_instance() $method = $RTR->fetch_method(); if ( ! class_exists($class) - OR strpos($method, '_', 1) === 0 + OR strpos($method, '_') === 0 OR in_array(strtolower($method), array_map('strtolower', get_class_methods('CI_Controller'))) ) { From d655a997f7b98da29ea932084e2fb50956188141 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 10 Jan 2012 22:31:29 +0200 Subject: [PATCH 0265/5397] Two returns --- system/libraries/Encrypt.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php index 63e3bb55e35..8cb4b1b1906 100644 --- a/system/libraries/Encrypt.php +++ b/system/libraries/Encrypt.php @@ -180,7 +180,6 @@ public function encode_from_legacy($string, $legacy_mode = MCRYPT_MODE_ECB, $key $key = $this->get_key($key); $dec = base64_decode($string); - if (($dec = $this->mcrypt_decode($dec, $key)) === FALSE) { return FALSE; @@ -419,7 +418,7 @@ protected function _get_cipher() { if ($this->_mcrypt_cipher == '') { - $this->_mcrypt_cipher = MCRYPT_RIJNDAEL_256; + return $this->_mcrypt_cipher = MCRYPT_RIJNDAEL_256; } return $this->_mcrypt_cipher; @@ -436,7 +435,7 @@ protected function _get_mode() { if ($this->_mcrypt_mode == '') { - $this->_mcrypt_mode = MCRYPT_MODE_CBC; + return $this->_mcrypt_mode = MCRYPT_MODE_CBC; } return $this->_mcrypt_mode; From e34f1a75ca78825bcf96c4344e01de412f6113bf Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 10 Jan 2012 22:41:52 +0200 Subject: [PATCH 0266/5397] Some quotes --- system/libraries/Zip.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index 2ed79f0e36b..dbcdb2d97ad 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -112,7 +112,7 @@ protected function _get_mod_time($dir) */ protected function _add_dir($dir, $file_mtime, $file_mdate) { - $dir = str_replace("\\", "/", $dir); + $dir = str_replace('\\', '/', $dir); $this->zipdata .= "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00" @@ -375,7 +375,7 @@ public function archive($filepath) */ public function download($filename = 'backup.zip') { - if ( ! preg_match("|.+?\.zip$|", $filename)) + if ( ! preg_match('|.+?\.zip$|', $filename)) { $filename .= '.zip'; } From 901573ce19e905ce28a3f3345c33dedf9c703cd4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 11 Jan 2012 01:40:48 +0200 Subject: [PATCH 0267/5397] Fix issue 863 --- system/libraries/Form_validation.php | 122 +++++++++------------------ user_guide_src/source/changelog.rst | 12 ++- 2 files changed, 46 insertions(+), 88 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 0a6a2af0d39..78b1ae0169e 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * Form Validation Class * @@ -48,9 +46,6 @@ class CI_Form_validation { protected $error_string = ''; protected $_safe_form_data = FALSE; - /** - * Constructor - */ public function __construct($rules = array()) { $this->CI =& get_instance(); @@ -67,7 +62,7 @@ public function __construct($rules = array()) mb_internal_encoding($this->CI->config->item('charset')); } - log_message('debug', "Form Validation Class Initialized"); + log_message('debug', 'Form Validation Class Initialized'); } // -------------------------------------------------------------------- @@ -179,7 +174,6 @@ public function set_message($lang, $val = '') } $this->_error_messages = array_merge($this->_error_messages, $lang); - return $this; } @@ -198,7 +192,6 @@ public function set_error_delimiters($prefix = '

    ', $suffix = '

    ') { $this->_error_prefix = $prefix; $this->_error_suffix = $suffix; - return $this; } @@ -313,10 +306,10 @@ public function run($group = '') $this->set_rules($this->_config_rules); } - // We're we able to set the rules correctly? + // Were we able to set the rules correctly? if (count($this->_field_data) === 0) { - log_message('debug', "Unable to find validation rules"); + log_message('debug', 'Unable to find validation rules'); return FALSE; } } @@ -330,17 +323,13 @@ public function run($group = '') { // Fetch the data from the corresponding $_POST array and cache it in the _field_data array. // Depending on whether the field name is an array or a string will determine where we get it from. - if ($row['is_array'] === TRUE) { $this->_field_data[$field]['postdata'] = $this->_reduce_array($_POST, $row['keys']); } - else + elseif (isset($_POST[$field]) AND $_POST[$field] != '') { - if (isset($_POST[$field]) AND $_POST[$field] != "") - { - $this->_field_data[$field]['postdata'] = $_POST[$field]; - } + $this->_field_data[$field]['postdata'] = $_POST[$field]; } $this->_execute($row, explode('|', $row['rules']), $this->_field_data[$field]['postdata']); @@ -348,7 +337,6 @@ public function run($group = '') // Did we end up with any errors? $total_errors = count($this->_error_array); - if ($total_errors > 0) { $this->_safe_form_data = TRUE; @@ -462,14 +450,12 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) return; } - // -------------------------------------------------------------------- - // If the field is blank, but NOT required, no further tests are necessary $callback = FALSE; if ( ! in_array('required', $rules) AND is_null($postdata)) { // Before we bail out, does the rule contain a callback? - if (preg_match("/(callback_\w+(\[.*?\])?)/", implode(' ', $rules), $match)) + if (preg_match('/(callback_\w+(\[.*?\])?)/', implode(' ', $rules), $match)) { $callback = TRUE; $rules = (array('1' => $match[1])); @@ -480,8 +466,6 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) } } - // -------------------------------------------------------------------- - // Isset Test. Typically this rule will only apply to checkboxes. if (is_null($postdata) AND $callback === FALSE) { @@ -543,11 +527,9 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) $postdata = $this->_field_data[$row['field']]['postdata']; } - // -------------------------------------------------------------------- - // Is the rule a callback? $callback = FALSE; - if (substr($rule, 0, 9) == 'callback_') + if (strpos($rule, 'callback_') === 0) { $rule = substr($rule, 9); $callback = TRUE; @@ -556,7 +538,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) // Strip the parameter (if exists) from the rule // Rules can contain a parameter: max_length[5] $param = FALSE; - if (preg_match("/(.*?)\[(.*)\]/", $rule, $match)) + if (preg_match('/(.*?)\[(.*)\]/', $rule, $match)) { $rule = $match[1]; $param = $match[2]; @@ -567,11 +549,14 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) { if ( ! method_exists($this->CI, $rule)) { - continue; + log_message('debug', 'Unable to find callback validation rule: '.$rule); + $result = FALSE; + } + else + { + // Run the function and grab the result + $result = $this->CI->$rule($postdata, $param); } - - // Run the function and grab the result - $result = $this->CI->$rule($postdata, $param); // Re-assign the result to the master data array if ($_in_array === TRUE) @@ -610,13 +595,14 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) } else { - log_message('debug', "Unable to find validation rule: ".$rule); + log_message('debug', 'Unable to find validation rule: '.$rule); + $result = FALSE; } - - continue; } - - $result = $this->$rule($postdata, $param); + else + { + $result = $this->$rule($postdata, $param); + } if ($_in_array === TRUE) { @@ -628,7 +614,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) } } - // Did the rule test negatively? If so, grab the error. + // Did the rule test negatively? If so, grab the error. if ($result === FALSE) { if ( ! isset($this->_error_messages[$rule])) @@ -644,7 +630,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) } // Is the parameter we are inserting into the error message the name - // of another field? If so we need to grab its "field label" + // of another field? If so we need to grab its "field label" if (isset($this->_field_data[$param], $this->_field_data[$param]['label'])) { $param = $this->_translate_fieldname($this->_field_data[$param]['label']); @@ -678,7 +664,7 @@ protected function _translate_fieldname($fieldname) { // Do we need to translate the field name? // We look for the prefix lang: to determine this - if (substr($fieldname, 0, 5) === 'lang:') + if (strpos($fieldname, 'lang:') === 0) { // Grab the variable $line = substr($fieldname, 5); @@ -738,15 +724,10 @@ public function set_select($field = '', $value = '', $default = FALSE) { if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata'])) { - if ($default === TRUE AND count($this->_field_data) === 0) - { - return ' selected="selected"'; - } - return ''; + return ($default === TRUE AND count($this->_field_data) === 0) ? ' selected="selected"' : ''; } $field = $this->_field_data[$field]['postdata']; - if (is_array($field)) { if ( ! in_array($value, $field)) @@ -754,12 +735,9 @@ public function set_select($field = '', $value = '', $default = FALSE) return ''; } } - else + elseif (($field == '' OR $value == '') OR ($field != $value)) { - if (($field == '' OR $value == '') OR ($field != $value)) - { - return ''; - } + return ''; } return ' selected="selected"'; @@ -781,15 +759,10 @@ public function set_radio($field = '', $value = '', $default = FALSE) { if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata'])) { - if ($default === TRUE AND count($this->_field_data) === 0) - { - return ' checked="checked"'; - } - return ''; + return ($default === TRUE AND count($this->_field_data) === 0) ? ' checked="checked"' : ''; } $field = $this->_field_data[$field]['postdata']; - if (is_array($field)) { if ( ! in_array($value, $field)) @@ -797,12 +770,9 @@ public function set_radio($field = '', $value = '', $default = FALSE) return ''; } } - else + elseif (($field == '' OR $value == '') OR ($field != $value)) { - if (($field == '' OR $value == '') OR ($field != $value)) - { - return ''; - } + return ''; } return ' checked="checked"'; @@ -869,9 +839,7 @@ public function matches($str, $field) return FALSE; } - $field = $_POST[$field]; - - return ($str === $field); + return ($str === $_POST[$field]); } // -------------------------------------------------------------------- @@ -908,7 +876,7 @@ public function is_unique($str, $field) */ public function min_length($str, $val) { - if (preg_match("/[^0-9]/", $val)) + if (preg_match('/[^0-9]/', $val)) { return FALSE; } @@ -932,7 +900,7 @@ public function min_length($str, $val) */ public function max_length($str, $val) { - if (preg_match("/[^0-9]/", $val)) + if (preg_match('/[^0-9]/', $val)) { return FALSE; } @@ -956,7 +924,7 @@ public function max_length($str, $val) */ public function exact_length($str, $val) { - if (preg_match("/[^0-9]/", $val)) + if (preg_match('/[^0-9]/', $val)) { return FALSE; } @@ -1076,19 +1044,6 @@ public function numeric($str) // -------------------------------------------------------------------- - /** - * Is Numeric - * - * @param string - * @return bool - */ - public function is_numeric($str) - { - return is_numeric($str); - } - - // -------------------------------------------------------------------- - /** * Integer * @@ -1217,7 +1172,7 @@ public function prep_for_form($data = '') return $data; } - return str_replace(array("'", '"', '<', '>'), array("'", """, '<', '>'), stripslashes($data)); + return str_replace(array("'", '"', '<', '>'), array(''', '"', '<', '>'), stripslashes($data)); } // -------------------------------------------------------------------- @@ -1230,14 +1185,14 @@ public function prep_for_form($data = '') */ public function prep_url($str = '') { - if ($str == 'http://' OR $str == '') + if ($str === 'http://' OR $str == '') { return ''; } - if (substr($str, 0, 7) !== 'http://' && substr($str, 0, 8) !== 'https://') + if (strpos($str, 'http://') !== 0 && strpos($str, 'https://') !== 0) { - $str = 'http://'.$str; + return 'http://'.$str; } return $str; @@ -1283,7 +1238,6 @@ public function encode_php_tags($str) } } -// END Form Validation Class /* End of file Form_validation.php */ /* Location: ./system/libraries/Form_validation.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 48011f208e3..b82b38e6430 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -52,13 +52,13 @@ Release Date: Not Released - Added max_filename_increment config setting for Upload library. - CI_Loader::_ci_autoloader() is now a protected method. - - Modified valid_ip() to use PHP's filter_var() when possible (>= PHP 5.2) in the :doc:`Form Validation library `. - - Added custom filename to Email::attach() as $this->email->attach($filename, $disposition, $newname) + - Modified valid_ip() to use PHP's filter_var() when possible (>= PHP 5.2) in the :doc:`Input library ` (also used by :doc:`Form Validation library `). + - Added custom filename to Email::attach() as $this->email->attach($filename, $disposition, $newname) - Cart library changes include: - It now auto-increments quantity's instead of just resetting it, this is the default behaviour of large e-commerce sites. - Product Name strictness can be disabled via the Cart Library by switching "$product_name_safe" - Added function remove() to remove a cart item, updating with quantity of 0 seemed like a hack but has remained to retain compatability - - Image manipulation library changes include: + - :doc:`Image Manipulation library ` changes include: - The initialize() method now only sets existing class properties. - Added support for 3-length hex color values for wm_font_color and wm_shadow_color properties, as well as validation for them. - Class properties wm_font_color, wm_shadow_color and wm_use_drop_shadow are now protected, to avoid breaking the text_watermark() method @@ -66,6 +66,9 @@ Release Date: Not Released - Minor speed optimizations and method & property visibility declarations in the Calendar Library. - Removed SHA1 function in the :doc:`Encryption Library `. - Added $config['csrf_regeneration'] to the CSRF protection in the :doc:`Security library `, which makes token regeneration optional. + - :doc:`Form Validation library ` changes include: + - _execute() now considers input data to be invalid if a specified rule is not found. + - Removed method is_numeric() as it exists as a native PHP function and _execute() will find and use that (the 'is_numeric' rule itself is deprecated since 1.6.1). - Core @@ -97,11 +100,12 @@ Bug fixes for 3.0 - In Pagination library, when use_page_numbers=TRUE previous link and page 1 link do not have the same url - Fixed a bug (#561) - Errors in :doc:`XML-RPC Library ` were not properly escaped. - Fixed a bug (#904) - ``CI_Loader::initialize()`` caused a PHP Fatal error to be triggered if error level E_STRICT is used. +- Fixed a bug (#863) - CI_Form_validation::_execute() silently continued to the next rule, if a callback rule method is not found. Version 2.1.0 ============= -Release Date: Not Released +Release Date: November 14, 2011 - General Changes From 2139ecdbe882dee32f60de5aec74ec2b8a509b7a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 11 Jan 2012 23:58:50 +0200 Subject: [PATCH 0268/5397] Added date_range() to the Date helper --- system/helpers/date_helper.php | 166 +++++++++++++++++- user_guide_src/source/changelog.rst | 3 +- user_guide_src/source/helpers/date_helper.rst | 24 +++ 3 files changed, 191 insertions(+), 2 deletions(-) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 9e58d863088..4a0791a4311 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -695,5 +695,169 @@ function timezones($tz = '') } } +// ------------------------------------------------------------------------ + +/** + * Date range + * + * Returns a list of dates within a specified period. + * + * @access public + * @param int unix_start UNIX timestamp of period start date + * @param int unix_end|days UNIX timestamp of period end date + * or interval in days. + * @param mixed is_unix Specifies wether the second @param + * is a UNIX timestamp or day interval + * - TRUE or 'unix' for a timestamp + * - FALSE or 'days' for an interval + * @param string date_format Output date format, same as in date() + * @return array + */ +if ( ! function_exists('date_range')) +{ + function date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y-m-d') + { + if ($unix_start == '' OR $mixed == '' OR $format == '') + { + return FALSE; + } + + $is_unix = ! ( ! $is_unix OR $is_unix === 'days'); + + // Validate input and try strtotime() on invalid timestamps/intervals, just in case + if ( ( ! preg_match('/^[0-9]+$/', $unix_start) && ($unix_start = @strtotime($unix_time)) === FALSE) + OR ( ! preg_match('/^[0-9]+$/', $mixed) && ($is_unix === FALSE OR ($mixed = @strtotime($mixed)) === FALSE)) + OR ($is_unix === TRUE && $mixed < $unix_start)) + { + return FALSE; + } + + if ($is_unix && ($unix_start == $mixed OR date($format, $unix_start) === date($format, $mixed))) + { + return array($start_date); + } + + $range = array(); + + if (is_php('5.2')) + { + /* NOTE: Even though the DateTime object has many useful features, it appears that + * it doesn't always handle properly timezones, when timestamps are passed + * directly to its constructor. Neither of the following gave proper results: + * + * new DateTime('') + * new DateTime('', '') + * + * --- available in PHP 5.3: + * + * DateTime::createFromFormat('', '') + * DateTime::createFromFormat('', '', 'setTimestamp($unix_start); + if ($is_unix) + { + $arg = new DateTime(); + $arg->setTimestamp($mixed); + } + else + { + $arg = (int) $mixed; + } + $period = new DatePeriod($from, new DateInterval('P1D'), $arg); + $range = array(); + foreach ($period as $date) + { + $range[] = $date->format($format); + } + + /* If a period end date was passed to the DatePeriod constructor, it might not + * be in our results. Not sure if this is a bug or it's just possible because + * the end date might actually be less than 24 hours away from the previously + * generated DateTime object, but either way - we have to append it manually. + */ + if ( ! is_int($arg) && $range[count($range) - 1] !== $arg->format($format)) + { + $range[] = $arg->format($format); + } + + return $range; + } + + $from->setDate(date('Y', $unix_start), date('n', $unix_start), date('j', $unix_start)); + $from->setTime(date('G', $unix_start), date('i', $unix_start), date('s', $unix_start)); + if ($is_unix) + { + $arg = new DateTime(); + $arg->setDate(date('Y', $mixed), date('n', $mixed), date('j', $mixed)); + $arg->setTime(date('G', $mixed), date('i', $mixed), date('s', $mixed)); + } + else + { + $arg = (int) $mixed; + } + $range[] = $from->format($format); + + if (is_int($arg)) // Day intervals + { + do + { + $from->modify('+1 day'); + $range[] = $from->format($format); + } + while (--$arg > 0); + } + else // end date UNIX timestamp + { + for ($from->modify('+1 day'), $end_check = $arg->format('Ymd'); $from->format('Ymd') < $end_check; $from->modify('+1 day')) + { + $range[] = $from->format($format); + } + + // Our loop only appended dates prior to our end date + $range[] = $arg->format($format); + } + + return $range; + } + + /* ---------------------------------------------------------------------------------- + * PHP Version is < 5.2. We have no other option, but to calculate manually ... + * + * NOTE: If we do something like this: + * + * $unix_timestamp + 86400 + * + * ... due to DST, there's a possibility of calculation errors and/or incorrect + * hours generated (if the specified format displays such data) due to DST. + */ + + $from = $to = array(); + sscanf(date('Y-n-j G:i:s', $unix_start), '%d-%d-%d %d:%d:%d', $from['y'], $from['mo'], $from['d'], $from['h'], $from['mi'], $from['s']); + + // If we don't have the end timestamp, let mktime() calculate it + $unix_end = ($is_unix) ? (int) $mixed : mktime($from['h'], $from['mi'], $from['s'], $from['mo'], $from['d'] + $mixed, $from['y']); + + $end_check = date('Ymd', $unix_end); + while (date('Ymd', $unix_start = mktime($from['h'], $from['mi'], $from['s'], $from['mo'], $from['d'], $from['y'])) !== $end_check) + { + $range[] = date($format, $unix_start); + $from['d']++; + } + + // Our loop only appended dates prior to our end date + $range[] = date($format, $unix_end); + + return $range; + } +} + /* End of file date_helper.php */ -/* Location: ./system/helpers/date_helper.php */ \ No newline at end of file +/* Location: ./system/helpers/date_helper.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 48011f208e3..613ef78817f 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -38,7 +38,8 @@ Release Date: Not Released - url_title() will now trim extra dashes from beginning and end. - Added XHTML Basic 1.1 doctype to :doc:`HTML Helper `. - - Changed humanize to include a second param for the separator. + - Changed humanize() to include a second param for the separator. + - Added date_range() to the :doc:`Date Helper `. - Database diff --git a/user_guide_src/source/helpers/date_helper.rst b/user_guide_src/source/helpers/date_helper.rst index ad06dd628f4..f965e61668d 100644 --- a/user_guide_src/source/helpers/date_helper.rst +++ b/user_guide_src/source/helpers/date_helper.rst @@ -296,6 +296,30 @@ Example If the second parameter is empty, the current year will be used. +date_range() +============ + +Returns a list of dates within a specified period. + +.. php:method:: date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y-m-d') + + :param integer $unix_start: UNIX timestamp of the range start date + :param integer $mixed: UNIX timestamp of the range end date or interval in days + :param boolean $is_unix: set to FALSE if $mixed is not a timestamp + :param string $format: output date format, same as in date() + :returns: array + +Example + +:: + + $range = date_range('2012-01-01', '2012-01-15'); + echo "First 15 days of 2012:"; + foreach ($range as $date) + { + echo $date."\n"; + } + timezones() =========== From 81c87cd453c61a17e28aff2cc3f4ea76d4d19c59 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 12 Jan 2012 17:00:29 +0200 Subject: [PATCH 0269/5397] Update the changelog --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b82b38e6430..27a8b57014c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -100,7 +100,7 @@ Bug fixes for 3.0 - In Pagination library, when use_page_numbers=TRUE previous link and page 1 link do not have the same url - Fixed a bug (#561) - Errors in :doc:`XML-RPC Library ` were not properly escaped. - Fixed a bug (#904) - ``CI_Loader::initialize()`` caused a PHP Fatal error to be triggered if error level E_STRICT is used. -- Fixed a bug (#863) - CI_Form_validation::_execute() silently continued to the next rule, if a callback rule method is not found. +- Fixed a bug (#11, #183, #863) - CI_Form_validation::_execute() silently continued to the next rule, if a rule method/function is not found. Version 2.1.0 ============= From 8f80bc4f855f78efbcb6344ea29cf67647b6772b Mon Sep 17 00:00:00 2001 From: Ronald Beilsma Date: Thu, 12 Jan 2012 16:41:49 +0100 Subject: [PATCH 0270/5397] array keys should be 0, 1, and 2. key 3 results in error (invalid offset) --- system/libraries/Image_lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index dc7d362ce64..a226ae8f872 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -1091,7 +1091,7 @@ public function text_watermark() $txt_color = str_split(substr($this->wm_font_color, 1, 6), 2); $txt_color = imagecolorclosest($src_img, hexdec($txt_color[0]), hexdec($txt_color[1]), hexdec($txt_color[2])); $drp_color = str_split(substr($this->wm_shadow_color, 1, 6), 2); - $drp_color = imagecolorclosest($src_img, hexdec($drp_color[0]), hexdec($drp_color[2]), hexdec($drp_color[3])); + $drp_color = imagecolorclosest($src_img, hexdec($drp_color[0]), hexdec($drp_color[1]), hexdec($drp_color[2])); // Add the text to the source image if ($this->wm_use_truetype) From 8e70b7935181ff56a340a3388080bf4ac6f3428f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 12 Jan 2012 20:19:24 +0200 Subject: [PATCH 0271/5397] CI_Image_lib::image_reproportion() to work if only one of either width or height are set --- system/libraries/Image_lib.php | 195 +++++++++++++--------------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 89 insertions(+), 107 deletions(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index a226ae8f872..8430d60df10 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -88,12 +88,6 @@ class CI_Image_lib { protected $wm_use_drop_shadow = FALSE; public $wm_use_truetype = FALSE; - /** - * Constructor - * - * @param string - * @return void - */ public function __construct($props = array()) { if (count($props) > 0) @@ -101,7 +95,7 @@ public function __construct($props = array()) $this->initialize($props); } - log_message('debug', "Image Lib Class Initialized"); + log_message('debug', 'Image Lib Class Initialized'); } // -------------------------------------------------------------------- @@ -158,9 +152,7 @@ public function clear() */ public function initialize($props = array()) { - /* - * Convert array elements into class variables - */ + // Convert array elements into class variables if (count($props) > 0) { foreach ($props as $key => $val) @@ -199,7 +191,6 @@ public function initialize($props = array()) * Is there a source image? * * If not, there's no reason to continue - * */ if ($this->source_image == '') { @@ -213,7 +204,6 @@ public function initialize($props = array()) * We use it to determine the image properties (width/height). * Note: We need to figure out how to determine image * properties using ImageMagick and NetPBM - * */ if ( ! function_exists('getimagesize')) { @@ -229,11 +219,10 @@ public function initialize($props = array()) * The source image may or may not contain a path. * Either way, we'll try use realpath to generate the * full server path in order to more reliably read it. - * */ - if (function_exists('realpath') AND @realpath($this->source_image) !== FALSE) + if (function_exists('realpath') && @realpath($this->source_image) !== FALSE) { - $full_source_path = str_replace("\\", "/", realpath($this->source_image)); + $full_source_path = str_replace('\\', '/', realpath($this->source_image)); } else { @@ -257,7 +246,6 @@ public function initialize($props = array()) * we are making a copy of the source image. If not * it means we are altering the original. We'll * set the destination filename and path accordingly. - * */ if ($this->new_image == '') { @@ -273,9 +261,9 @@ public function initialize($props = array()) } else { - if (function_exists('realpath') AND @realpath($this->new_image) !== FALSE) + if (function_exists('realpath') && @realpath($this->new_image) !== FALSE) { - $full_dest_path = str_replace("\\", "/", realpath($this->new_image)); + $full_dest_path = str_replace('\\', '/', realpath($this->new_image)); } else { @@ -283,7 +271,7 @@ public function initialize($props = array()) } // Is there a file name? - if ( ! preg_match("#\.(jpg|jpeg|gif|png)$#i", $full_dest_path)) + if ( ! preg_match('#\.(jpg|jpeg|gif|png)$#i', $full_dest_path)) { $this->dest_folder = $full_dest_path.'/'; $this->dest_image = $this->source_image; @@ -305,7 +293,6 @@ public function initialize($props = array()) * full server path to the destination image. * We'll also split the destination image name * so we can insert the thumbnail marker if needed. - * */ if ($this->create_thumb === FALSE OR $this->thumb_marker == '') { @@ -325,10 +312,9 @@ public function initialize($props = array()) * * When creating thumbs or copies, the target width/height * might not be in correct proportion with the source - * image's width/height. We'll recalculate it here. - * + * image's width/height. We'll recalculate it here. */ - if ($this->maintain_ratio === TRUE && ($this->width != '' AND $this->height != '')) + if ($this->maintain_ratio === TRUE && ($this->width != 0 OR $this->height != 0)) { $this->image_reproportion(); } @@ -339,35 +325,40 @@ public function initialize($props = array()) * If the destination width/height was * not submitted we will use the values * from the actual file - * */ if ($this->width == '') + { $this->width = $this->orig_width; + } if ($this->height == '') + { $this->height = $this->orig_height; + } // Set the quality - $this->quality = trim(str_replace("%", "", $this->quality)); + $this->quality = trim(str_replace('%', '', $this->quality)); - if ($this->quality == '' OR $this->quality == 0 OR ! is_numeric($this->quality)) + if ($this->quality == '' OR $this->quality == 0 OR ! preg_match('/^[0-9]+$/', $this->quality)) + { $this->quality = 90; + } // Set the x/y coordinates - $this->x_axis = ($this->x_axis == '' OR ! is_numeric($this->x_axis)) ? 0 : $this->x_axis; - $this->y_axis = ($this->y_axis == '' OR ! is_numeric($this->y_axis)) ? 0 : $this->y_axis; + $this->x_axis = ($this->x_axis == '' OR ! preg_match('/^[0-9]+$/', $this->x_axis)) ? 0 : $this->x_axis; + $this->y_axis = ($this->y_axis == '' OR ! preg_match('/^[0-9]+$/', $this->y_axis)) ? 0 : $this->y_axis; // Watermark-related Stuff... if ($this->wm_overlay_path != '') { - $this->wm_overlay_path = str_replace("\\", "/", realpath($this->wm_overlay_path)); + $this->wm_overlay_path = str_replace('\\', '/', realpath($this->wm_overlay_path)); } if ($this->wm_shadow_color != '') { $this->wm_use_drop_shadow = TRUE; } - elseif ($this->wm_use_drop_shadow == TRUE AND $this->wm_shadow_color == '') + elseif ($this->wm_use_drop_shadow == TRUE && $this->wm_shadow_color == '') { $this->wm_use_drop_shadow = FALSE; } @@ -445,7 +436,6 @@ public function rotate() $this->height = $this->orig_height; } - // Choose resizing function if ($this->image_library == 'imagemagick' OR $this->image_library == 'netpbm') { @@ -479,9 +469,9 @@ public function image_process_gd($action = 'resize') // If the target width/height match the source, AND if the new file name is not equal to the old file name // we'll simply make a copy of the original with the new name... assuming dynamic rendering is off. - if ($this->dynamic_output === FALSE AND $this->orig_width == $this->width AND $this->orig_height == $this->height) + if ($this->dynamic_output === FALSE && $this->orig_width == $this->width && $this->orig_height == $this->height) { - if ($this->source_image != $this->new_image AND @copy($this->full_src_path, $this->full_dst_path)) + if ($this->source_image != $this->new_image && @copy($this->full_src_path, $this->full_dst_path)) { @chmod($this->full_dst_path, FILE_WRITE_MODE); } @@ -523,7 +513,7 @@ public function image_process_gd($action = 'resize') // below should that ever prove inaccurate. // // if ($this->image_library == 'gd2' AND function_exists('imagecreatetruecolor') AND $v2_override == FALSE) - if ($this->image_library == 'gd2' AND function_exists('imagecreatetruecolor')) + if ($this->image_library === 'gd2' && function_exists('imagecreatetruecolor')) { $create = 'imagecreatetruecolor'; $copy = 'imagecopyresampled'; @@ -587,7 +577,7 @@ public function image_process_imagemagick($action = 'resize') return FALSE; } - if ( ! preg_match("/convert$/i", $this->library_path)) + if ( ! preg_match('/convert$/i', $this->library_path)) { $this->library_path = rtrim($this->library_path, '/').'/convert'; } @@ -597,7 +587,7 @@ public function image_process_imagemagick($action = 'resize') if ($action == 'crop') { - $cmd .= " -crop ".$this->width."x".$this->height."+".$this->x_axis."+".$this->y_axis." \"$this->full_src_path\" \"$this->full_dst_path\" 2>&1"; + $cmd .= ' -crop '.$this->width.'x'.$this->height.'+'.$this->x_axis.'+'.$this->y_axis.' "'.$this->full_src_path.'" "'.$this->full_dst_path .'" 2>&1'; } elseif ($action == 'rotate') { @@ -611,18 +601,17 @@ public function image_process_imagemagick($action = 'resize') break; } - $cmd .= " ".$angle." \"$this->full_src_path\" \"$this->full_dst_path\" 2>&1"; + $cmd .= ' '.$angle.' "'.$this->full_src_path.'" "'.$this->full_dst_path.'" 2>&1'; } - else // Resize + else // Resize { - $cmd .= " -resize ".$this->width."x".$this->height." \"$this->full_src_path\" \"$this->full_dst_path\" 2>&1"; + $cmd .= ' -resize '.$this->width.'x'.$this->height.'" "'.$this->full_src_path.'" "'.$this->full_dst_path.'" 2>&1'; } $retval = 1; - @exec($cmd, $output, $retval); - // Did it work? + // Did it work? if ($retval > 0) { $this->set_error('imglib_image_process_failed'); @@ -700,10 +689,9 @@ public function image_process_netpbm($action = 'resize') $cmd = $this->library_path.$cmd_in.' '.$this->full_src_path.' | '.$cmd_inner.' | '.$cmd_out.' > '.$this->dest_folder.'netpbm.tmp'; $retval = 1; - @exec($cmd, $output, $retval); - // Did it work? + // Did it work? if ($retval > 0) { $this->set_error('imglib_image_process_failed'); @@ -742,29 +730,24 @@ public function image_rotate_gd() $white = imagecolorallocate($src_img, 255, 255, 255); - // Rotate it! + // Rotate it! $dst_img = imagerotate($src_img, $this->rotation_angle, $white); - // Save the Image + // Show the image if ($this->dynamic_output == TRUE) { $this->image_display_gd($dst_img); } - else + elseif ( ! $this->image_save_gd($dst_img)) // ... or save it { - // Or save it - if ( ! $this->image_save_gd($dst_img)) - { - return FALSE; - } + return FALSE; } - // Kill the file handles + // Kill the file handles imagedestroy($dst_img); imagedestroy($src_img); // Set the file to 777 - @chmod($this->full_dst_path, FILE_WRITE_MODE); return TRUE; @@ -824,21 +807,17 @@ public function image_mirror_gd() } } - // Show the image + // Show the image if ($this->dynamic_output == TRUE) { $this->image_display_gd($src_img); } - else + elseif ( ! $this->image_save_gd($src_img)) // ... or save it { - // Or save it - if ( ! $this->image_save_gd($src_img)) - { - return FALSE; - } + return FALSE; } - // Kill the file handles + // Kill the file handles imagedestroy($src_img); // Set the file to 777 @@ -860,14 +839,7 @@ public function image_mirror_gd() */ public function watermark() { - if ($this->wm_type == 'overlay') - { - return $this->overlay_watermark(); - } - else - { - return $this->text_watermark(); - } + return ($this->wm_type == 'overlay') ? $this->overlay_watermark() : $this->text_watermark(); } // -------------------------------------------------------------------- @@ -885,28 +857,28 @@ public function overlay_watermark() return FALSE; } - // Fetch source image properties + // Fetch source image properties $this->get_image_properties(); - // Fetch watermark image properties + // Fetch watermark image properties $props = $this->get_image_properties($this->wm_overlay_path, TRUE); $wm_img_type = $props['image_type']; $wm_width = $props['width']; $wm_height = $props['height']; - // Create two image resources + // Create two image resources $wm_img = $this->image_create_gd($this->wm_overlay_path, $wm_img_type); $src_img = $this->image_create_gd($this->full_src_path); // Reverse the offset if necessary // When the image is positioned at the bottom // we don't want the vertical offset to push it - // further down. We want the reverse, so we'll - // invert the offset. Same with the horizontal + // further down. We want the reverse, so we'll + // invert the offset. Same with the horizontal // offset when the image is at the right - $this->wm_vrt_alignment = strtoupper(substr($this->wm_vrt_alignment, 0, 1)); - $this->wm_hor_alignment = strtoupper(substr($this->wm_hor_alignment, 0, 1)); + $this->wm_vrt_alignment = strtoupper($this->wm_vrt_alignment[0]); + $this->wm_hor_alignment = strtoupper($this->wm_hor_alignment[0]); if ($this->wm_vrt_alignment == 'B') $this->wm_vrt_offset = $this->wm_vrt_offset * -1; @@ -914,11 +886,11 @@ public function overlay_watermark() if ($this->wm_hor_alignment == 'R') $this->wm_hor_offset = $this->wm_hor_offset * -1; - // Set the base x and y axis values + // Set the base x and y axis values $x_axis = $this->wm_hor_offset + $this->wm_padding; $y_axis = $this->wm_vrt_offset + $this->wm_padding; - // Set the vertical position + // Set the vertical position switch ($this->wm_vrt_alignment) { case 'T': @@ -929,7 +901,7 @@ public function overlay_watermark() break; } - // Set the horizontal position + // Set the horizontal position switch ($this->wm_hor_alignment) { case 'L': @@ -941,7 +913,7 @@ public function overlay_watermark() } // Build the finalized image - if ($wm_img_type == 3 AND function_exists('imagealphablending')) + if ($wm_img_type == 3 && function_exists('imagealphablending')) { @imagealphablending($src_img, TRUE); } @@ -993,20 +965,20 @@ public function text_watermark() return FALSE; } - if ($this->wm_use_truetype == TRUE AND ! file_exists($this->wm_font_path)) + if ($this->wm_use_truetype == TRUE && ! file_exists($this->wm_font_path)) { $this->set_error('imglib_missing_font'); return FALSE; } - // Fetch source image properties + // Fetch source image properties $this->get_image_properties(); // Reverse the vertical offset // When the image is positioned at the bottom // we don't want the vertical offset to push it // further down. We want the reverse, so we'll - // invert the offset. Note: The horizontal + // invert the offset. Note: The horizontal // offset flips itself automatically if ($this->wm_vrt_alignment == 'B') @@ -1093,7 +1065,7 @@ public function text_watermark() $drp_color = str_split(substr($this->wm_shadow_color, 1, 6), 2); $drp_color = imagecolorclosest($src_img, hexdec($drp_color[0]), hexdec($drp_color[1]), hexdec($drp_color[2])); - // Add the text to the source image + // Add the text to the source image if ($this->wm_use_truetype) { imagettftext($src_img, $this->wm_font_size, 0, $x_shad, $y_shad, $drp_color, $this->wm_font_path, $this->wm_text); @@ -1106,7 +1078,7 @@ public function text_watermark() } } - // Output the final image + // Output the final image if ($this->dynamic_output == TRUE) { $this->image_display_gd($src_img); @@ -1284,33 +1256,43 @@ public function image_display_gd($resource) */ public function image_reproportion() { - if ( ! is_numeric($this->width) OR ! is_numeric($this->height) OR $this->width == 0 OR $this->height == 0) - return; - - if ( ! is_numeric($this->orig_width) OR ! is_numeric($this->orig_height) OR $this->orig_width == 0 OR $this->orig_height == 0) - return; - - $new_width = ceil($this->orig_width*$this->height/$this->orig_height); - $new_height = ceil($this->width*$this->orig_height/$this->orig_width); - - $ratio = (($this->orig_height/$this->orig_width) - ($this->height/$this->width)); - - if ($this->master_dim != 'width' AND $this->master_dim != 'height') + if (($this->width == 0 && $this->height == 0) OR $this->orig_width == 0 OR $this->orig_height == 0 + OR ( ! preg_match('/^[0-9]+$/', $this->width) && ! preg_match('/^[0-9]+$/', $this->height)) + OR ! preg_match('/^[0-9]+$/', $this->orig_width) OR ! preg_match('/^[0-9]+$/', $this->orig_height)) { - $this->master_dim = ($ratio < 0) ? 'width' : 'height'; + return; } - if (($this->width != $new_width) AND ($this->height != $new_height)) + // Sanitize so we don't call preg_match() anymore + $this->width = (int) $this->width; + $this->height = (int) $this->height; + + if ($this->master_dim !== 'width' && $this->master_dim !== 'height') { - if ($this->master_dim == 'height') + if ($this->width > 0 && $this->height > 0) { - $this->width = $new_width; + $this->master_dim = ((($this->orig_height/$this->orig_width) - ($this->height/$this->width)) < 0) + ? 'width' : 'height'; } else { - $this->height = $new_height; + $this->master_dim = ($this->height === 0) ? 'width' : 'height'; } } + elseif (($this->master_dim === 'width' && $this->width === 0) + OR ($this->master_dim === 'height' && $this->height === 0)) + { + return; + } + + if ($this->master_dim === 'width') + { + $this->height = (int) ceil($this->width*$this->orig_height/$this->orig_width); + } + else + { + $this->width = (int) ceil($this->orig_width*$this->height/$this->orig_height); + } } // -------------------------------------------------------------------- @@ -1329,7 +1311,9 @@ public function get_image_properties($path = '', $return = FALSE) // find a way to determine this using IM or NetPBM if ($path == '') + { $path = $this->full_src_path; + } if ( ! file_exists($path)) { @@ -1449,7 +1433,7 @@ public function gd_loaded() /* As it is stated in the PHP manual, dl() is not always available * and even if so - it could generate an E_WARNING message on failure */ - return (function_exists('dl') AND @dl('gd.so')); + return (function_exists('dl') && @dl('gd.so')); } return TRUE; @@ -1467,9 +1451,7 @@ public function gd_version() if (function_exists('gd_info')) { $gd_version = @gd_info(); - $gd_version = preg_replace("/\D/", "", $gd_version['GD Version']); - - return $gd_version; + return preg_replace('/\D/', '', $gd_version['GD Version']); } return FALSE; @@ -1520,7 +1502,6 @@ public function display_errors($open = '

    ', $close = '

    ') } } -// END Image_lib Class /* End of file Image_lib.php */ /* Location: ./system/libraries/Image_lib.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 48011f208e3..c6d5e30f6f0 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -63,6 +63,7 @@ Release Date: Not Released - Added support for 3-length hex color values for wm_font_color and wm_shadow_color properties, as well as validation for them. - Class properties wm_font_color, wm_shadow_color and wm_use_drop_shadow are now protected, to avoid breaking the text_watermark() method if they are set manually after initialization. + - If property maintain_ratio is set to TRUE, image_reproportion() now doesn't need both width and height to be specified. - Minor speed optimizations and method & property visibility declarations in the Calendar Library. - Removed SHA1 function in the :doc:`Encryption Library `. - Added $config['csrf_regeneration'] to the CSRF protection in the :doc:`Security library `, which makes token regeneration optional. From e46363083ad18c93c73a200c9a97934608bb5bab Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 12 Jan 2012 20:23:27 +0200 Subject: [PATCH 0272/5397] Remove a quote --- system/libraries/Image_lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 8430d60df10..fd3cd0edb50 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -605,7 +605,7 @@ public function image_process_imagemagick($action = 'resize') } else // Resize { - $cmd .= ' -resize '.$this->width.'x'.$this->height.'" "'.$this->full_src_path.'" "'.$this->full_dst_path.'" 2>&1'; + $cmd .= ' -resize '.$this->width.'x'.$this->height.' "'.$this->full_src_path.'" "'.$this->full_dst_path.'" 2>&1'; } $retval = 1; From cde43687ef19aa23ee6796925270961b760369f3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 13 Jan 2012 20:16:35 +0200 Subject: [PATCH 0273/5397] Allow native PHP functions used as rules to accept an additional parameter --- system/libraries/Form_validation.php | 2 +- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/libraries/form_validation.rst | 7 ++++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 78b1ae0169e..9aa07a1a82d 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -582,7 +582,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) // Users can use any native PHP function call that has one param. if (function_exists($rule)) { - $result = $rule($postdata); + $result = ($param !== FALSE) ? $rule($postdata, $param) : $rule($postdata); if ($_in_array === TRUE) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 27a8b57014c..7c2ee26eb5e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -69,6 +69,7 @@ Release Date: Not Released - :doc:`Form Validation library ` changes include: - _execute() now considers input data to be invalid if a specified rule is not found. - Removed method is_numeric() as it exists as a native PHP function and _execute() will find and use that (the 'is_numeric' rule itself is deprecated since 1.6.1). + - Native PHP functions used as rules can now accept an additional parameter, other than the data itself. - Core diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index e7875bc22cf..999ab362c1f 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -321,7 +321,7 @@ password to MD5, and running the username through the "xss_clean" function, which removes malicious data. **Any native PHP function that accepts one parameter can be used as a -rule, like htmlspecialchars, trim, MD5, etc.** +rule, like htmlspecialchars, trim, md5, etc.** .. note:: You will generally want to use the prepping functions **after** the validation rules so if there is an error, the original @@ -857,8 +857,9 @@ Rule Parameter Description $this->form_validation->required($string); -.. note:: You can also use any native PHP functions that permit one - parameter. +.. note:: You can also use any native PHP functions that permit up + to two parameters, where at least one is required (to pass + the field data). ****************** Prepping Reference From 4f553dfe20a3dcb2d384fe30210d85cf4f645de2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 15 Jan 2012 15:03:02 +0200 Subject: [PATCH 0274/5397] Remove a space :) --- system/helpers/date_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 4a0791a4311..7bec8079d5b 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -745,7 +745,7 @@ function date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y * it doesn't always handle properly timezones, when timestamps are passed * directly to its constructor. Neither of the following gave proper results: * - * new DateTime('') + * new DateTime('') * new DateTime('', '') * * --- available in PHP 5.3: From aa786c93e48f3081da9aa6d9d13e5857565a1070 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 16 Jan 2012 12:14:45 +0200 Subject: [PATCH 0275/5397] Additional clean-up --- system/database/drivers/oci8/oci8_driver.php | 188 ++++++++---------- system/database/drivers/oci8/oci8_forge.php | 86 ++------ system/database/drivers/oci8/oci8_result.php | 71 ++----- system/database/drivers/oci8/oci8_utility.php | 4 +- 4 files changed, 123 insertions(+), 226 deletions(-) diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index f520f7c7643..2a5149f9e54 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * oci8 Database Adapter Class * @@ -84,7 +82,7 @@ class CI_DB_oci8_driver extends CI_DB { /** * Non-persistent database connection * - * @return resource + * @return resource */ public function db_connect() { @@ -96,7 +94,7 @@ public function db_connect() /** * Persistent database connection * - * @return resource + * @return resource */ public function db_pconnect() { @@ -124,7 +122,7 @@ public function reconnect() /** * Select the database * - * @return resource + * @return resource */ public function db_select() { @@ -152,7 +150,7 @@ public function db_set_charset($charset, $collation) /** * Version number query string * - * @return string + * @return string */ protected function _version() { @@ -164,8 +162,8 @@ protected function _version() /** * Execute the query * - * @param string an SQL query - * @return resource + * @param string an SQL query + * @return resource */ protected function _execute($sql) { @@ -181,8 +179,8 @@ protected function _execute($sql) /** * Generate a statement ID * - * @param string an SQL query - * @return none + * @param string an SQL query + * @return void */ private function _set_stmt_id($sql) { @@ -199,8 +197,8 @@ private function _set_stmt_id($sql) * * If needed, each database adapter can prep the query string * - * @param string an SQL query - * @return string + * @param string an SQL query + * @return string */ private function _prep_query($sql) { @@ -210,14 +208,13 @@ private function _prep_query($sql) // -------------------------------------------------------------------- /** - * getCursor. Returns a cursor from the datbase + * getCursor. Returns a cursor from the database * - * @return cursor id + * @return resource cursor id */ public function get_cursor() { - $this->curs_id = oci_new_cursor($this->conn_id); - return $this->curs_id; + return $this->curs_id = oci_new_cursor($this->conn_id); } // -------------------------------------------------------------------- @@ -225,19 +222,19 @@ public function get_cursor() /** * Stored Procedure. Executes a stored procedure * - * @param package package stored procedure is in - * @param procedure stored procedure to execute - * @param params array of parameters - * @return array + * @param string package name in which the stored procedure is in + * @param string stored procedure name to execute + * @param array parameters + * @return mixed * * params array keys * * KEY OPTIONAL NOTES - * name no the name of the parameter should be in : 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 + * name no the name of the parameter should be in : 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) { @@ -252,24 +249,24 @@ public function stored_procedure($package, $procedure, $params) } // build the query string - $sql = "begin $package.$procedure("; + $sql = "BEGIN {$package}.{$procedure}("; $have_cursor = FALSE; foreach ($params as $param) { - $sql .= $param['name'] . ","; + $sql .= $param['name'].','; if (array_key_exists('type', $param) && ($param['type'] === OCI_B_CURSOR)) { $have_cursor = TRUE; } } - $sql = trim($sql, ",") . "); end;"; + $sql = trim($sql, ',') . '); END;'; $this->stmt_id = FALSE; $this->_set_stmt_id($sql); $this->_bind_params($params); - $this->query($sql, FALSE, $have_cursor); + return $this->query($sql, FALSE, $have_cursor); } // -------------------------------------------------------------------- @@ -277,7 +274,7 @@ public function stored_procedure($package, $procedure, $params) /** * Bind parameters * - * @return none + * @return void */ private function _bind_params($params) { @@ -382,9 +379,9 @@ public function trans_rollback() /** * Escape String * - * @param string + * @param string * @param bool whether or not the string will be used in a LIKE condition - * @return string + * @return string */ public function escape_str($str, $like = FALSE) { @@ -398,15 +395,14 @@ public function escape_str($str, $like = FALSE) return $str; } - $str = remove_invisible_characters($str); - $str = str_replace("'", "''", $str); + $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_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; @@ -417,7 +413,7 @@ public function escape_str($str, $like = FALSE) /** * Affected Rows * - * @return integer + * @return int */ public function affected_rows() { @@ -429,7 +425,7 @@ public function affected_rows() /** * Insert ID * - * @return integer + * @return int */ public function insert_id() { @@ -445,8 +441,8 @@ public function insert_id() * Generates a platform-specific query string that counts all records in * the specified database * - * @param string - * @return string + * @param string + * @return int */ public function count_all($table = '') { @@ -455,7 +451,7 @@ public function count_all($table = '') return 0; } - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + $query = $this->query($this->_count_string.$this->_protect_identifiers('numrows').' FROM '.$this->_protect_identifiers($table, TRUE, NULL, FALSE)); if ($query == FALSE) { @@ -474,16 +470,16 @@ public function count_all($table = '') * * Generates a platform-specific query string so that the table names can be fetched * - * @param boolean + * @param bool * @return string */ protected function _list_tables($prefix_limit = FALSE) { - $sql = "SELECT TABLE_NAME FROM ALL_TABLES"; + $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." WHERE TABLE_NAME LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); } return $sql; @@ -496,12 +492,12 @@ protected function _list_tables($prefix_limit = FALSE) * * Generates a platform-specific query string so that the column names can be fetched * - * @param string the table name - * @return string + * @param string the table name + * @return string */ protected function _list_columns($table = '') { - return "SELECT COLUMN_NAME FROM all_tab_columns WHERE table_name = '$table'"; + return 'SELECT COLUMN_NAME FROM all_tab_columns WHERE table_name = \''.$table.'\''; } // -------------------------------------------------------------------- @@ -511,12 +507,12 @@ protected function _list_columns($table = '') * * Generates a platform-specific query so that the column data can be retrieved * - * @param string the table name - * @return object + * @param string the table name + * @return string */ protected function _field_data($table) { - return "SELECT * FROM ".$table." where rownum = 1"; + return 'SELECT * FROM '.$table.' WHERE rownum = 1'; } // -------------------------------------------------------------------- @@ -524,7 +520,7 @@ protected function _field_data($table) /** * The error message string * - * @return string + * @return string */ protected function _error_message() { @@ -537,7 +533,7 @@ protected function _error_message() /** * The error message number * - * @return integer + * @return int */ protected function _error_number() { @@ -589,24 +585,20 @@ protected function _escape_identifiers($item) { if (strpos($item, '.'.$id) !== FALSE) { - $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); + $item = 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); + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item); } } 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; + $item = str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item); } // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item.$this->_escape_char); } // -------------------------------------------------------------------- @@ -617,8 +609,8 @@ protected function _escape_identifiers($item) * This function implicitly groups FROM tables so there is no confusion * about operator precedence in harmony with SQL standards * - * @param type - * @return type + * @param array + * @return string */ protected function _from_tables($tables) { @@ -637,14 +629,14 @@ protected function _from_tables($tables) * * Generates a platform-specific insert string from the supplied data * - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string + * @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).")"; + return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; } // -------------------------------------------------------------------- @@ -666,12 +658,10 @@ protected function _insert_batch($table, $keys, $values) for ($i = 0, $c = count($values); $i < $c; $i++) { - $sql .= ' INTO ' . $table . ' (' . $keys . ') VALUES ' . $values[$i] . "\n"; + $sql .= ' INTO '.$table.' ('.$keys.') VALUES '.$values[$i].'\n'; } - $sql .= 'SELECT * FROM dual'; - - return $sql; + return $sql.'SELECT * FROM dual'; } // -------------------------------------------------------------------- @@ -692,18 +682,13 @@ protected function _update($table, $values, $where, $orderby = array(), $limit = { foreach ($values as $key => $val) { - $valstr[] = $key." = ".$val; + $valstr[] = $key.' = '.$val; } - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - $orderby = (count($orderby) > 0) ? ' ORDER BY '.implode(', ', $orderby) : ''; - - $sql = 'UPDATE '.$table.' SET '.implode(', ', $valstr); - $sql .= ($where != '' AND count($where) > 0) ? ' WHERE '.implode(' ', $where) : ''; - $sql .= $orderby.$limit; - - return $sql; + return 'UPDATE '.$table.' SET '.implode(', ', $valstr) + .(($where != '' && count($where) > 0) ? ' WHERE '.implode(' ', $where) : '') + .(count($orderby) > 0 ? ' ORDER BY '.implode(', ', $orderby) : '') + .( ! $limit ? '' : ' LIMIT '.$limit); } // -------------------------------------------------------------------- @@ -720,7 +705,7 @@ protected function _update($table, $values, $where, $orderby = array(), $limit = */ protected function _truncate($table) { - return "TRUNCATE TABLE ".$table; + return 'TRUNCATE TABLE '.$table; } // -------------------------------------------------------------------- @@ -738,22 +723,18 @@ protected function _truncate($table) 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); + $conditions = "\nWHERE ".implode("\n", $this->ar_where); if (count($where) > 0 && count($like) > 0) { - $conditions .= " AND "; + $conditions .= ' AND '; } $conditions .= implode("\n", $like); } - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - return "DELETE FROM ".$table.$conditions.$limit; + return 'DELETE FROM '.$table.$conditions.( ! $limit ? '' : ' LIMIT '.$limit); } // -------------------------------------------------------------------- @@ -763,25 +744,16 @@ protected function _delete($table, $where = array(), $like = array(), $limit = F * * Generates a platform-specific LIMIT clause * - * @param string the sql query string - * @param integer the number of rows to limit the query to - * @param integer the offset value - * @return string + * @param string the sql query string + * @param int the number of rows to limit the query to + * @param int 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; + return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($offset + $limit).')' + .($offset != 0 ? ' WHERE rnum >= '.$offset : ''); } // -------------------------------------------------------------------- @@ -789,8 +761,8 @@ protected function _limit($sql, $limit, $offset) /** * Close DB Connection * - * @param resource - * @return void + * @param resource + * @return void */ protected function _close($conn_id) { diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index 6975f2a5f5b..6b9a8e8fd89 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * Oracle Forge Class * @@ -71,7 +69,7 @@ public function _drop_database($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 + * @param bool should 'IF NOT EXISTS' be added to the SQL * @return string */ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) @@ -83,7 +81,7 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi $sql .= 'IF NOT EXISTS '; } - $sql .= $this->db->_escape_identifiers($table)." ("; + $sql .= $this->db->_escape_identifiers($table).' ('; $current_field_count = 0; foreach ($fields as $field=>$attributes) @@ -93,37 +91,17 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi // entered the field information, so we'll simply add it to the list if (is_numeric($field)) { - $sql .= "\n\t$attributes"; + $sql .= "\n\t".$attributes; } else { $attributes = array_change_key_case($attributes, CASE_UPPER); - $sql .= "\n\t".$this->db->_protect_identifiers($field).' '.$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'; - } + $sql .= "\n\t".$this->db->_protect_identifiers($field).' '.$attributes['TYPE'] + .(array_key_exists('CONSTRAINT', $attributes) ? '('.$attributes['CONSTRAINT'].')' : '') + .((array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '') + .(array_key_exists('DEFAULT', $attributes) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '') + .((array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL'); } // don't add a comma on the end of the last field @@ -136,7 +114,7 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi if (count($primary_keys) > 0) { $primary_keys = $this->db->_protect_identifiers($primary_keys); - $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; + $sql .= ",\n\tPRIMARY KEY (".implode(', ', $primary_keys).')'; } if (is_array($keys) && count($keys) > 0) @@ -152,13 +130,11 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi $key = array($this->db->_protect_identifiers($key)); } - $sql .= ",\n\tUNIQUE COLUMNS (" . implode(', ', $key) . ")"; + $sql .= ",\n\tUNIQUE COLUMNS (".implode(', ', $key).')'; } } - $sql .= "\n)"; - - return $sql; + return $sql."\n)"; } // -------------------------------------------------------------------- @@ -170,7 +146,7 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi */ public function _drop_table($table) { - return 'DROP TABLE ' . $this->db->_protect_identifiers($table); + return 'DROP TABLE '.$this->db->_protect_identifiers($table); } // -------------------------------------------------------------------- @@ -186,42 +162,24 @@ public function _drop_table($table) * @param string the table name * @param string the column definition * @param string the default value - * @param boolean should 'NOT NULL' be added + * @param bool should 'NOT NULL' be added * @param string the field after which we should add the new field * @return string */ public 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); + $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') + 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; + return $sql.' '.$column_definition + .($default_value != '' ? ' DEFAULT "'.$default_value.'"' : '') + .($null === NULL ? ' NULL' : ' NOT NULL') + .($after_field != '' ? ' AFTER '.$this->db->_protect_identifiers($after_field) : ''); } @@ -238,11 +196,9 @@ public function _alter_table($alter_type, $table, $column_name, $column_definiti */ public 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; + return 'ALTER TABLE '.$this->db->_protect_identifiers($table_name).' RENAME TO '.$this->db->_protect_identifiers($new_table_name); } - } /* End of file oci8_forge.php */ diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index cbf4bec5297..fad2465df5a 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * oci8 Result Class * @@ -56,7 +54,7 @@ class CI_DB_oci8_result extends CI_DB_result { * Oracle doesn't have a graceful way to return the number of rows * so we have to use what amounts to a hack. * - * @return integer + * @return int */ public function num_rows() { @@ -82,19 +80,14 @@ public function num_rows() /** * Number of fields in the result set * - * @return integer + * @return int */ public function num_fields() { $count = @oci_num_fields($this->stmt_id); // if we used a limit we subtract it - if ($this->limit_used) - { - return $count - 1; - } - - return $count; + return ($this->limit_used) ? $count - 1 : $count; } // -------------------------------------------------------------------- @@ -123,17 +116,17 @@ public function list_fields() * * Generates an array of objects containing field meta-data * - * @return array + * @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); + $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; } @@ -175,7 +168,7 @@ public function free_result() * * Returns the result set as an array * - * @return array + * @return array */ protected function _fetch_assoc() { @@ -190,7 +183,7 @@ protected function _fetch_assoc() * * Returns the result set as an object * - * @return object + * @return object */ protected function _fetch_object() { @@ -200,33 +193,6 @@ protected function _fetch_object() // -------------------------------------------------------------------- - /* Query result - * - * Acts as a wrapper for result_array(), result_object() - * and custom_result_object(). - * - * @param string ('object', 'array' or a custom class name) - * @return array - */ - - public function result($type = 'object') - { - if ($type === 'object') - { - return $this->result_object(); - } - elseif ($type === 'array') - { - return $this->result_array(); - } - else - { - return $this->custom_result_object($type); - } - } - - // -------------------------------------------------------------------- - /** * Query result. "array" version. * @@ -452,9 +418,16 @@ public function custom_result_object($class_name) public function row($n = 0, $type = 'object') { - if ($type === 'object') return $this->row_object($n); - elseif ($type === 'array') return $this->row_array($n); - else return $this->custom_row_object($n, $type); + if ($type === 'object') + { + return $this->row_object($n); + } + elseif ($type === 'array') + { + return $this->row_array($n); + } + + return $this->custom_row_object($n, $type); } // -------------------------------------------------------------------- @@ -464,7 +437,6 @@ public function row($n = 0, $type = 'object') * @param int row index * @return array */ - public function row_array($n = 0) { // Make sure $n is not a string @@ -656,7 +628,6 @@ public function custom_row_object($n = 0, $class_name) * @param string ('object', 'array' or a custom class name) * @return mixed whatever was passed to the second parameter */ - public function first_row($type = 'object') { return $this->row(0, $type); diff --git a/system/database/drivers/oci8/oci8_utility.php b/system/database/drivers/oci8/oci8_utility.php index 317ff91eb9b..38d870aa6ac 100644 --- a/system/database/drivers/oci8/oci8_utility.php +++ b/system/database/drivers/oci8/oci8_utility.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * Oracle Utility Class * From 8ae24c57a1240a5a5e3fbd5755227e5d42b75390 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 16 Jan 2012 13:05:23 +0200 Subject: [PATCH 0276/5397] Add SQLite3 database driver --- system/database/DB_driver.php | 2 +- system/database/drivers/sqlite3/index.html | 10 + .../drivers/sqlite3/sqlite3_driver.php | 591 +++++++++++++++++ .../drivers/sqlite3/sqlite3_forge.php | 223 +++++++ .../drivers/sqlite3/sqlite3_result.php | 617 ++++++++++++++++++ .../drivers/sqlite3/sqlite3_utility.php | 102 +++ user_guide_src/source/changelog.rst | 1 + .../source/database/configuration.rst | 2 +- .../source/general/requirements.rst | 4 +- 9 files changed, 1548 insertions(+), 4 deletions(-) create mode 100644 system/database/drivers/sqlite3/index.html create mode 100644 system/database/drivers/sqlite3/sqlite3_driver.php create mode 100644 system/database/drivers/sqlite3/sqlite3_forge.php create mode 100644 system/database/drivers/sqlite3/sqlite3_result.php create mode 100644 system/database/drivers/sqlite3/sqlite3_utility.php diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 661b42ced81..43c201ef645 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -257,7 +257,7 @@ function version() // Some DBs have functions that return the version, and don't run special // SQL queries per se. In these instances, just return the result. - $driver_version_exceptions = array('oci8', 'sqlite', 'cubrid', 'pdo'); + $driver_version_exceptions = array('oci8', 'sqlite', 'sqlite3', 'cubrid', 'pdo'); if (in_array($this->dbdriver, $driver_version_exceptions)) { diff --git a/system/database/drivers/sqlite3/index.html b/system/database/drivers/sqlite3/index.html new file mode 100644 index 00000000000..c942a79ce6a --- /dev/null +++ b/system/database/drivers/sqlite3/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + \ No newline at end of file diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php new file mode 100644 index 00000000000..b82ae1ecd51 --- /dev/null +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -0,0 +1,591 @@ +password) + ? new SQLite3($this->database) + : new SQLite3($this->database, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, $this->password); + } + catch (Exception $e) + { + return FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * + * @return object type SQLite3 + */ + public function db_pconnect() + { + log_message('debug', 'SQLite3 doesn\'t support persistent connections'); + return $this->db_pconnect(); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @return void + */ + public function reconnect() + { + // Not supported + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @return bool + */ + public function db_select() + { + // Not needed, in SQLite every pseudo-connection is a database + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @param string + * @param string + * @return bool + */ + public function db_set_charset($charset, $collation) + { + // Not (natively) supported + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @return string + */ + protected function _version() + { + return implode(' (', $this->conn_id->version()).')'; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string an SQL query + * @return mixed SQLite3Result object or bool + */ + protected function _execute($sql) + { + if ( ! preg_match('/^(SELECT|EXPLAIN).+$/i', ltrim($sql))) + { + return $this->conn_id->exec($sql); + } + + // TODO: Implement use of SQLite3::querySingle(), if needed + // TODO: Use $this->_prep_query(), if needed + return $this->conn_id->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @param string an SQL query + * @return string + */ + private function _prep_query($sql) + { + return $this->conn_id->prepare($sql); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @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); + + return $this->conn_id->exec('BEGIN TRANSACTION'); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @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; + } + + return $this->conn_id->exec('END TRANSACTION'); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @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; + } + + return $this->conn_id->exec('ROLLBACK'); + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @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 = $this->conn_id->escapeString(remove_invisible_characters($str)); + + // escape LIKE condition wildcards + if ($like === TRUE) + { + return 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 + * + * @return int + */ + public function affected_rows() + { + return $this->conn_id->changes(); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + return $this->conn_id->lastInsertRowID(); + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @param string + * @return int + */ + public function count_all($table = '') + { + if ($table == '') + { + return 0; + } + + $result = $this->conn_id->querySingle($this->_count_string.$this->_protect_identifiers('numrows') + .' FROM '.$this->_protect_identifiers($table, TRUE, NULL, FALSE)); + + return empty($result) ? 0 : (int) $result; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + return 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\'' + .(($prefix_limit !== FALSE && $this->dbprefix != '') + ? ' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix).'%\' '.sprintf($this->_like_escape_str, $this->_like_escape_chr) + : ''); + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string the table name + * @return string + */ + protected function _list_columns($table = '') + { + // Not supported + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @param string the table name + * @return string + */ + protected function _field_data($table) + { + return 'SELECT * FROM '.$table.' LIMIT 0,1'; + } + + // -------------------------------------------------------------------- + + /** + * The error message string + * + * @return string + */ + protected function _error_message() + { + return $this->conn_id->lastErrorMsg(); + } + + // -------------------------------------------------------------------- + + /** + * The error message number + * + * @return int + */ + protected function _error_number() + { + return $this->conn_id->lastErrorCode(); + } + + // -------------------------------------------------------------------- + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @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) + { + $item = str_replace('.', $this->_escape_char.'.', $item); + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item); + } + } + + if (strpos($item, '.') !== FALSE) + { + $item = str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item); + } + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item.$this->_escape_char); + } + + // -------------------------------------------------------------------- + + /** + * From Tables + * + * This function implicitly groups FROM tables so there is no confusion + * about operator precedence in harmony with SQL standards + * + * @param string + * @return string + */ + 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 + * + * @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).')'; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @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; + } + + return 'UPDATE '.$table.' SET '.implode(', ', $valstr) + .(($where != '' && count($where) > 0) ? ' WHERE '.implode(' ', $where) : '') + .(count($orderby) > 0 ? ' ORDER BY '.implode(', ', $orderby) : '') + .( ! $limit ? '' : ' LIMIT '.$limit); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * If the database does not support the truncate() command, then + * this method maps to "DELETE FROM table" + * + * @param string the table name + * @return string + */ + protected function _truncate($table) + { + return $this->_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @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 ".implode("\n", $this->ar_where); + + if (count($where) > 0 && count($like) > 0) + { + $conditions .= ' AND '; + } + $conditions .= implode("\n", $like); + } + + return 'DELETE FROM '.$table.$conditions.( ! $limit ? '' : ' LIMIT '.$limit); + } + + // -------------------------------------------------------------------- + + /** + * Limit string + * + * Generates a platform-specific LIMIT clause + * + * @param string the sql query string + * @param int the number of rows to limit the query to + * @param int the offset value + * @return string + */ + protected function _limit($sql, $limit, $offset) + { + return $sql.($offset ? $offset.',' : '').$limit; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + $this->conn_id->close(); + } + +} + +/* End of file sqlite3_driver.php */ +/* Location: ./system/database/drivers/sqlite3/sqlite3_driver.php */ diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php new file mode 100644 index 00000000000..07c25515a14 --- /dev/null +++ b/system/database/drivers/sqlite3/sqlite3_forge.php @@ -0,0 +1,223 @@ +db->database)) + { + // We need to close the pseudo-connection first + $this->db->close(); + if ( ! @unlink($this->db->database)) + { + return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + + return TRUE; + } + + return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @param string the table name + * @param array the fields + * @param mixed primary key(s) + * @param mixed key(s) + * @param bool should 'IF NOT EXISTS' be added to the SQL + * @return bool + */ + public 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) + .' '.$attributes['TYPE'] + .(array_key_exists('CONSTRAINT', $attributes) ? '('.$attributes['CONSTRAINT'].')' : '') + .((array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '') + .(array_key_exists('DEFAULT', $attributes) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '') + .((array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL') + .((array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' 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).')'; + } + } + + return $sql."\n)"; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @param string the table name + * @return string + */ + public function _drop_table($table) + { + return 'DROP TABLE '.$table.' IF EXISTS'; + } + + // -------------------------------------------------------------------- + + /** + * Alter table query + * + * Generates a platform-specific query so that a table can be altered + * Called by add_column(), drop_column(), and column_alter(), + * + * @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 bool should 'NOT NULL' be added + * @param string the field after which we should add the new field + * @return string + */ + public function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') + { + /* SQLite only supports adding new columns and it does + * NOT support the AFTER statement. Each new column will + * be added as the last one in the table. + */ + if ($alter_type !== 'ADD COLUMN') + { + // Not supported + return FALSE; + } + + return 'ALTER TABLE '.$this->db->_protect_identifiers($table).' '.$alter_type.' '.$this->db->_protect_identifiers($column_name) + .' '.$column_definition + .($default_value != '' ? ' DEFAULT '.$default_value : '') + // If NOT NULL is specified, the field must have a DEFAULT value other than NULL + .(($null !== NULL && $default_value !== 'NULL') ? ' NOT NULL' : ' NULL'); + } + + // -------------------------------------------------------------------- + + /** + * Rename a table + * + * Generates a platform-specific query so that a table can be renamed + * + * @param string the old table name + * @param string the new table name + * @return string + */ + public function _rename_table($table_name, $new_table_name) + { + return 'ALTER TABLE '.$this->db->_protect_identifiers($table_name).' RENAME TO '.$this->db->_protect_identifiers($new_table_name); + } +} + +/* End of file sqlite3_forge.php */ +/* Location: ./system/database/drivers/sqlite3/sqlite3_forge.php */ diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php new file mode 100644 index 00000000000..7b1b4502ab5 --- /dev/null +++ b/system/database/drivers/sqlite3/sqlite3_result.php @@ -0,0 +1,617 @@ +num_rows) + ? $this->num_rows + : $this->num_rows = count($this->result_array()); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return ( ! is_int($this->_num_fields)) + ? $this->_num_fields = $this->result_id->numColumns() + : $this->_num_fields; + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + for ($i = 0, $c = $this->num_fields(); $i < $this->num_fields(); $i++) + { + $field_names[] = $this->result_id->columnName($i); + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $this->num_fields(); $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $this->result_id->columnName($i); + $retval[$i]->type = 'varchar'; + $retval[$i]->max_length = 0; + $retval[$i]->primary_key = 0; + $retval[$i]->default = ''; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_object($this->result_id)) + { + $this->result_id->finalize(); + $this->result_id = NULL; + } + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return $this->result_id->fetchArray(SQLITE3_ASSOC); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @access private + * @return object + */ + protected function _fetch_object() + { + // No native support for fetching as an object + $row = $this->_fetch_assoc(); + return ($row !== FALSE) ? (object) $row : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Query result. "array" version. + * + * return array + */ + public function result_array() + { + if (count($this->result_array) > 0) + { + return $this->result_array; + } + elseif (is_array($this->row_data)) + { + if (count($this->row_data) === 0) + { + return $this->result_array; + } + else + { + $row_index = count($this->row_data); + } + } + else + { + $row_index = 0; + $this->row_data = array(); + } + + $row = NULL; + while ($row = $this->_fetch_assoc()) + { + $this->row_data[$row_index++] = $row; + } + + // Un-comment the following line, in case it becomes needed + // $this->_data_seek(); + return $this->result_array = $this->row_data; + } + + // -------------------------------------------------------------------- + + /** + * Query result. "object" version. + * + * @return array + */ + public function result_object() + { + if (count($this->result_object) > 0) + { + return $this->result_object; + } + elseif (count($this->result_array) > 0) + { + for ($i = 0, $c = count($this->result_array); $i < $c; $i++) + { + $this->result_object[] = (object) $this->result_array[$i]; + } + + return $this->result_object; + } + elseif (is_array($this->row_data)) + { + if (count($this->row_data) === 0) + { + return $this->result_object; + } + else + { + $row_index = count($this->row_data); + for ($i = 0; $i < $row_index; $i++) + { + $this->result_object[$i] = (object) $this->row_data[$i]; + } + } + } + else + { + $row_index = 0; + $this->row_data = array(); + } + + $row = NULL; + while ($row = $this->_fetch_assoc()) + { + $this->row_data[$row_index] = $row; + $this->result_object[$row_index++] = (object) $row; + } + + $this->result_array = $this->row_data; + + /* As described for the num_rows() method - there's no easy + * way to get the number of rows selected. Our work-around + * solution (as in here as well) first checks if result_array + * exists and returns its count. It doesn't however check for + * custom_object_result, so - do it here. + */ + if ( ! is_int($this->num_rows)) + { + $this->num_rows = count($this->result_object); + } + + // Un-comment the following line, in case it becomes needed + // $this->_data_seek(); + return $this->result_object; + } + + // -------------------------------------------------------------------- + + /** + * Query result. Custom object version. + * + * @param string class name used to instantiate rows to + * @return array + */ + 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 ( ! class_exists($class_name) OR ! is_object($this->result_id) OR $this->num_rows() === 0) + { + return array(); + } + + /* Even if result_array hasn't been set prior to custom_result_object being called, + * num_rows() has done it. + */ + $data = &$this->result_array; + + $result_object = array(); + for ($i = 0, $c = count($data); $i < $c; $i++) + { + $result_object[$i] = new $class_name(); + foreach ($data[$i] as $key => $value) + { + $result_object[$i]->$key = $value; + } + } + + /* As described for the num_rows() method - there's no easy + * way to get the number of rows selected. Our work-around + * solution (as in here as well) first checks if result_array + * exists and returns its count. It doesn't however check for + * custom_object_result, so - do it here. + */ + if ( ! is_int($this->num_rows)) + { + $this->num_rows = count($result_object); + } + + // Cache and return the array + return $this->custom_result_object[$class_name] = $result_object; + } + + // -------------------------------------------------------------------- + + /* Single row result. + * + * Acts as a wrapper for row_object(), row_array() + * and custom_row_object(). Also used by first_row(), next_row() + * and previous_row(). + * + * @param int row index + * @param string ('object', 'array' or a custom class name) + * @return mixed whatever was passed to the second parameter + */ + public function row($n = 0, $type = 'object') + { + if ($type === 'object') + { + return $this->row_object($n); + } + elseif ($type === 'array') + { + return $this->row_array($n); + } + + return $this->custom_row_object($n, $type); + } + + // -------------------------------------------------------------------- + + /* Single row result. Array version. + * + * @param int row index + * @return array + */ + public function row_array($n = 0) + { + // Make sure $n is not a string + if ( ! is_int($n)) + { + $n = (int) $n; + } + + /* If row_data is initialized, it means that we've already tried + * (at least) to fetch some data, so ... check if we already have + * this row. + */ + if (is_array($this->row_data)) + { + /* If we already have row_data[$n] - return it. + * + * If we enter the elseif, there's a number of reasons to + * return an empty array: + * + * - count($this->row_data) === 0 means there are no results + * - num_rows being set or result_array having count() > 0 means + * that we've already fetched all data and $n is greater than + * our highest row index available + * - $n < $this->current_row means that if such row existed, + * we would've already returned it, therefore $n is an + * invalid index + */ + if (isset($this->row_data[$n])) // We already have this row + { + $this->current_row = $n; + return $this->row_data[$n]; + } + elseif (count($this->row_data) === 0 OR is_int($this->num_rows) + OR count($this->result_array) > 0 OR $n < $this->current_row) + { + // No such row exists + return array(); + } + + // Get the next row index that would actually need to be fetched + $current_row = ($this->current_row < count($this->row_data)) ? count($this->row_data) : $this->current_row + 1; + } + else + { + $current_row = $this->current_row = 0; + $this->row_data = array(); + } + + /* Fetch more data, if available + * + * NOTE: Operator precedence is important here, if you change + * 'AND' with '&&' - it WILL BREAK the results, as + * $row will be assigned the scalar value of both + * expressions! + */ + while ($row = $this->_fetch_assoc() AND $current_row <= $n) + { + $this->row_data[$current_row++] = $row; + } + + // This would mean that there's no (more) data to fetch + if ( ! is_array($this->row_data) OR ! isset($this->row_data[$n])) + { + // Cache what we already have + if (is_array($this->row_data)) + { + $this->num_rows = count($this->row_data); + /* Usually, row_data could have less elements than result_array, + * but at this point - they should be exactly the same. + */ + $this->result_array = $this->row_data; + } + else + { + $this->num_rows = 0; + } + + return array(); + } + + $this->current_row = $n; + return $this->row_data[$n]; + } + + // -------------------------------------------------------------------- + + /* Single row result. Object version. + * + * @param int row index + * @return mixed object if row found; empty array if not + */ + public function row_object($n = 0) + { + // Make sure $n is not a string + if ( ! is_int($n)) + { + $n = (int) $n; + } + + /* Logic here is exactly the same as in row_array, + * except we have to cast row_data[$n] to an object. + * + * If we already have result_object though - we can + * directly return from it. + */ + if (isset($this->result_object[$n])) + { + $this->current_row = $n; + return $this->result_object[$n]; + } + + $row = $this->row_array($n); + // Cast only if the row exists + if (count($row) > 0) + { + $this->current_row = $n; + return (object) $row; + } + + return array(); + } + + // -------------------------------------------------------------------- + + /* Single row result. Custom object version. + * + * @param int row index + * @param string custom class name + * @return mixed custom object if row found; empty array otherwise + */ + public function custom_row_object($n = 0, $class_name) + { + // Make sure $n is not a string + if ( ! is_int($n)) + { + $n = (int) $n; + } + + if (array_key_exists($class_name, $this->custom_result_object)) + { + /* We already have a the whole result set with this class_name, + * return the specified row if it exists, and an empty array if + * it doesn't. + */ + if (isset($this->custom_result_object[$class_name][$n])) + { + $this->current_row = $n; + return $this->custom_result_object[$class_name][$n]; + } + else + { + return array(); + } + } + elseif ( ! class_exists($class_name)) // No such class exists + { + return array(); + } + + $row = $this->row_array($n); + // An array would mean that the row doesn't exist + if (is_array($row)) + { + return $row; + } + + // Convert to the desired class and return + $row_object = new $class_name(); + foreach ($row as $key => $value) + { + $row_object->$key = $value; + } + + $this->current_row = $n; + return $row_object; + } + + // -------------------------------------------------------------------- + + /* First row result. + * + * @param string ('object', 'array' or a custom class name) + * @return mixed whatever was passed to the second parameter + */ + public function first_row($type = 'object') + { + return $this->row(0, $type); + } + + // -------------------------------------------------------------------- + + /* Last row result. + * + * @param string ('object', 'array' or a custom class name) + * @return mixed whatever was passed to the second parameter + */ + public function last_row($type = 'object') + { + $result = &$this->result($type); + if ( ! isset($this->num_rows)) + { + $this->num_rows = count($result); + } + $this->current_row = $this->num_rows - 1; + return $result[$this->current_row]; + } + + // -------------------------------------------------------------------- + + /* Next row result. + * + * @param string ('object', 'array' or a custom class name) + * @return mixed whatever was passed to the second parameter + */ + public function next_row($type = 'object') + { + if (is_array($this->row_data)) + { + $count = count($this->row_data); + $n = ($this->current_row > $count OR ($this->current_row === 0 && $count === 0)) ? $count : $this->current_row + 1; + } + else + { + $n = 0; + } + + return $this->row($n, $type); + } + + // -------------------------------------------------------------------- + + /* Previous row result. + * + * @param string ('object', 'array' or a custom class name) + * @return mixed whatever was passed to the second parameter + */ + public function previous_row($type = 'object') + { + $n = ($this->current_row !== 0) ? $this->current_row - 1 : 0; + return $this->row($n, $type); + } + + // -------------------------------------------------------------------- + + /** + * 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 + * + * @return array + */ + public function _data_seek($n = 0) + { + // Only resetting to the start of the result set is supported + return $this->result_id->reset(); + } + +} + +/* End of file sqlite3_result.php */ +/* Location: ./system/database/drivers/sqlite3/sqlite3_result.php */ diff --git a/system/database/drivers/sqlite3/sqlite3_utility.php b/system/database/drivers/sqlite3/sqlite3_utility.php new file mode 100644 index 00000000000..eae65258211 --- /dev/null +++ b/system/database/drivers/sqlite3/sqlite3_utility.php @@ -0,0 +1,102 @@ +db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + } + + // -------------------------------------------------------------------- + + /** + * Optimize table query + * + * Is optimization even supported in SQLite? + * + * @param string the table name + * @return bool + */ + public function _optimize_table($table) + { + // Not supported + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Repair table query + * + * Are table repairs even supported in SQLite? + * + * @param string the table name + * @return object + */ + public function _repair_table($table) + { + // Not supported + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * SQLite Export + * + * @param array Preferences + * @return mixed + */ + public function _backup($params = array()) + { + // Not supported + return $this->db->display_error('db_unsuported_feature'); + } +} + +/* End of file sqlite3_utility.php */ +/* Location: ./system/database/drivers/sqlite3/sqlite3_utility.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 48011f208e3..e554b57d391 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -47,6 +47,7 @@ Release Date: Not Released get_compiled_insert(), get_compiled_update(), get_compiled_delete(). - Taking care of LIKE condition when used with MySQL UPDATE statement. - Adding $escape parameter to the order_by function, this enables ordering by custom fields. + - Added support for SQLite3 database driver. - Libraries diff --git a/user_guide_src/source/database/configuration.rst b/user_guide_src/source/database/configuration.rst index 4f88c25ab6b..7d3960f10d1 100644 --- a/user_guide_src/source/database/configuration.rst +++ b/user_guide_src/source/database/configuration.rst @@ -163,7 +163,7 @@ Explanation of Values: ====================== ================================================================================================== .. note:: Depending on what database platform you are using (MySQL, - Postgres, etc.) not all values will be needed. For example, when using + Postgre, etc.) not all values will be needed. For example, when using SQLite you will not need to supply a username or password, and the database name will be the path to your database file. The information above assumes you are using MySQL. diff --git a/user_guide_src/source/general/requirements.rst b/user_guide_src/source/general/requirements.rst index 38623557d79..15686d7a7bd 100644 --- a/user_guide_src/source/general/requirements.rst +++ b/user_guide_src/source/general/requirements.rst @@ -4,5 +4,5 @@ Server Requirements - `PHP `_ version 5.1.6 or newer. - A Database is required for most web application programming. Current - supported databases are MySQL (4.1+), MySQLi, MS SQL, Postgres, Oracle, - SQLite, ODBC and CUBRID. \ No newline at end of file + supported database drivers are MySQL (4.1+), MySQLi, MS SQL, Postgre, + Oracle, SQLite, SQLite3, ODBC and CUBRID. From 5cbecb3865c84967692324f283b0bebd7c8efb38 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 16 Jan 2012 13:08:24 +0200 Subject: [PATCH 0277/5397] Add a comment for CI_DB_sqlite3_result::num_rows() --- system/database/drivers/sqlite3/sqlite3_result.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php index 7b1b4502ab5..c9876fe69cf 100644 --- a/system/database/drivers/sqlite3/sqlite3_result.php +++ b/system/database/drivers/sqlite3/sqlite3_result.php @@ -49,6 +49,9 @@ class CI_DB_sqlite3_result extends CI_DB_result { */ public function num_rows() { + /* The SQLite3 driver doesn't have a graceful way to do this, + * so we'll have to do it on our own. + */ return is_int($this->num_rows) ? $this->num_rows : $this->num_rows = count($this->result_array()); From b5e6f11002a08d29bd0faa2c6c5c437cf9e49523 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 16 Jan 2012 13:25:07 +0200 Subject: [PATCH 0278/5397] Removed some unneeded code and fixed a possible bug --- system/database/drivers/oci8/oci8_result.php | 77 +++----------------- 1 file changed, 10 insertions(+), 67 deletions(-) diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index fad2465df5a..e6e932175b6 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -66,7 +66,7 @@ public function num_rows() } elseif (count($this->result_object) > 0) { - return $this->num_rows = count($this->result_array); + return $this->num_rows = count($this->result_object); } return $this->num_rows = count($this->result_array()); @@ -316,12 +316,10 @@ public function custom_result_object($class_name) return array(); } - // add the data to the object - $result_object = array(); - $data = NULL; - - /* First check if we don't already have the data. - * If so - pass by reference, as we don't know how + /* Even if we didn't have result_array or result_object + * set prior to custom_result_object() being called, + * num_rows() has already done so. + * Pass by reference, as we don't know how * large it might be and we don't want 1000 row * sets being copied. */ @@ -334,70 +332,15 @@ public function custom_result_object($class_name) $data = &$this->result_object; } - if ( ! is_null($data)) + $result_object = array(); + for ($i = 0, $c = count($data); $i < $c; $i++) { - for ($i = 0, $c = count($data); $i < $c; $i++) + $result_object[$i] = new $class_name(); + foreach ($data[$i] as $key => $value) { - $result_object[$i] = new $class_name(); - foreach ($data[$i] as $key => $value) - { - $result_object[$i]->$key = $value; - } + $result_object[$i]->$key = $value; } } - else - { - // No prefetched result set - if (is_array($this->row_data)) - { - $row_index = count($this->row_data); - if ($row_index === 0) - { - return array(); - } - else - { - for ($i = 0; $i < $row_index; $i++) - { - $result_object[$i] = new $class_name(); - foreach ($this->row_data[$i] as $key => $value) - { - $result_object[$i]->$key = $value; - } - } - } - } - else - { - $row_index = 0; - $this->row_data = array(); - } - - while ($row = $this->_fetch_assoc()) - { - $data = new $class_name(); - foreach ($row as $key => $value) - { - $data->$key = $value; - } - - $this->row_data[$row_index] = $row; - $result_object[$row_index++] = $data; - } - // Un-comment the following line, in case it becomes needed - // $this->_data_seek(); - } - - /* As described for the num_rows() method - there's no easy - * way to get the number of rows selected. Our work-around - * solution (as in here as well) first checks if result_array - * or result_object exist and returns their count. It doesn't - * however check for a custom_object_result, so - do it here. - */ - if ( ! is_int($this->num_rows)) - { - $this->num_rows = count($result_object); - } // Cache and return the array return $this->custom_result_object[$class_name] = $result_object; From 0f2ec5bde259b67f66cc353692d71d8a47f71b01 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 16 Jan 2012 14:02:24 +0200 Subject: [PATCH 0279/5397] convert_accented_characters() to include foreign_chars.php only when needed --- application/config/foreign_chars.php | 6 +++--- system/helpers/text_helper.php | 25 +++++++++++++++---------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/application/config/foreign_chars.php b/application/config/foreign_chars.php index 1ae0cef5f76..f2f981c27e1 100644 --- a/application/config/foreign_chars.php +++ b/application/config/foreign_chars.php @@ -5,9 +5,9 @@ * An open source application development framework for PHP 5.1.6 or newer * * NOTICE OF LICENSE - * + * * Licensed under the Academic Free License version 3.0 - * + * * This source file is subject to the Academic Free License (AFL 3.0) that is * bundled with this package in the files license_afl.txt / license_afl.rst. * It is also available through the world wide web at this URL: @@ -87,4 +87,4 @@ ); /* End of file foreign_chars.php */ -/* Location: ./application/config/foreign_chars.php */ \ No newline at end of file +/* Location: ./application/config/foreign_chars.php */ diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index cef32847d0d..8e308b72287 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -372,18 +372,23 @@ function highlight_phrase($str, $phrase, $tag_open = '', $tag_close = '< { 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'); - } + global $foreign_characters; - if ( ! isset($foreign_characters)) + if ( ! isset($foreign_characters) OR ! is_array($foreign_characters)) { - return $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) OR ! is_array($foreign_chars)) + { + return $str; + } } return preg_replace(array_keys($foreign_characters), array_values($foreign_characters), $str); From 53921cab6f979bedef6deb837aea54f354b1f7e6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 16 Jan 2012 14:35:22 +0200 Subject: [PATCH 0280/5397] Replaced a method with a variable --- system/database/drivers/sqlite3/sqlite3_result.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php index c9876fe69cf..e8e3706cd54 100644 --- a/system/database/drivers/sqlite3/sqlite3_result.php +++ b/system/database/drivers/sqlite3/sqlite3_result.php @@ -83,7 +83,7 @@ public function num_fields() public function list_fields() { $field_names = array(); - for ($i = 0, $c = $this->num_fields(); $i < $this->num_fields(); $i++) + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { $field_names[] = $this->result_id->columnName($i); } From 7bb95dff569f465ad8887404c2f9d5304a2ff5b3 Mon Sep 17 00:00:00 2001 From: Sean Fisher Date: Mon, 16 Jan 2012 09:23:14 -0500 Subject: [PATCH 0281/5397] APC throws "apc_store() expects parameter 3 to be long, string given". Validates the TTL to an integer. --- system/libraries/Cache/drivers/Cache_apc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php index 93993d07a82..a3dd469786f 100644 --- a/system/libraries/Cache/drivers/Cache_apc.php +++ b/system/libraries/Cache/drivers/Cache_apc.php @@ -68,6 +68,7 @@ public function get($id) */ public function save($id, $data, $ttl = 60) { + $ttl = (int) $ttl; return apc_store($id, array($data, time(), $ttl), $ttl); } From 2a97c7db940e94a115dea863708f587e58d26be4 Mon Sep 17 00:00:00 2001 From: John Wright Date: Mon, 16 Jan 2012 15:09:19 -0800 Subject: [PATCH 0282/5397] It appears the Security class has been added to the system/core folder and is loaded automatically as well. Using $this->load->library('security'); in controllers currently returns FALSE, yet you might not notice because the Security class is already loaded. I discovered this because of a custom Loader class I was using returned an error when loading the Security class. --- user_guide_src/source/general/core_classes.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/general/core_classes.rst b/user_guide_src/source/general/core_classes.rst index ac41407f717..4aa6693f7e6 100644 --- a/user_guide_src/source/general/core_classes.rst +++ b/user_guide_src/source/general/core_classes.rst @@ -31,6 +31,7 @@ time CodeIgniter runs: - Log - Output - Router +- Security - URI - Utf8 From c357f5ecb0794fc59802ab7a9779453ee2b003c7 Mon Sep 17 00:00:00 2001 From: Wilbur Suero Date: Tue, 17 Jan 2012 00:17:35 -0400 Subject: [PATCH 0283/5397] Fixed error in inflector_helper.php in the singular function. The function was excepting $singluar_rules and got $singular_values. --- system/helpers/inflector_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index 0bd1e112f77..2069a19278c 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -85,7 +85,7 @@ function singular($str) '/([^u])s$/' => '\1', ); - return preg_replace(array_keys($singular_values), $singular_values, $result); + return preg_replace(array_keys($singular_rules), $singular_rules, $result); } } From eea2ff56657dc5f690523cfcd372b760569ef649 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 19 Jan 2012 13:21:53 +0200 Subject: [PATCH 0284/5397] Fix issue #154 --- system/libraries/Session.php | 118 ++++++++++++---------------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 51 insertions(+), 68 deletions(-) diff --git a/system/libraries/Session.php b/system/libraries/Session.php index 04103a4d9b1..c4f97e965d2 100644 --- a/system/libraries/Session.php +++ b/system/libraries/Session.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -67,7 +67,7 @@ class CI_Session { */ public function __construct($params = array()) { - log_message('debug', "Session Class Initialized"); + log_message('debug', 'Session Class Initialized'); // Set the super object to a local variable for use throughout the class $this->CI =& get_instance(); @@ -93,14 +93,14 @@ public function __construct($params = array()) $this->CI->load->library('encrypt'); } - // Are we using a database? If so, load it + // Are we using a database? If so, load it if ($this->sess_use_database === TRUE AND $this->sess_table_name != '') { $this->CI->load->database(); } - // Set the "now" time. Can either be GMT or server time, based on the - // config prefs. We use this to set the "last activity" time + // Set the "now" time. Can either be GMT or server time, based on the + // config prefs. We use this to set the "last activity" time $this->now = $this->_get_time(); // Set the session length. If the session expiration is @@ -114,7 +114,7 @@ public function __construct($params = array()) $this->sess_cookie_name = $this->cookie_prefix.$this->sess_cookie_name; // Run the Session routine. If a session doesn't exist we'll - // create a new one. If it does, we'll update it. + // create a new one. If it does, we'll update it. if ( ! $this->sess_read()) { $this->sess_create(); @@ -133,7 +133,7 @@ public function __construct($params = array()) // Delete expired sessions if necessary $this->_sess_gc(); - log_message('debug', "Session routines successfully run"); + log_message('debug', 'Session routines successfully run'); } // -------------------------------------------------------------------- @@ -166,7 +166,7 @@ public function sess_read() $hash = substr($session, strlen($session)-32); // get last 32 chars $session = substr($session, 0, strlen($session)-32); - // Does the md5 hash match? This is to prevent manipulation of session data in userspace + // Does the md5 hash match? This is to prevent manipulation of session data in userspace if ($hash !== md5($session.$this->encryption_key)) { log_message('error', 'The session cookie data did not match what was expected. This could be a possible hacking attempt.'); @@ -179,28 +179,11 @@ public function sess_read() $session = $this->_unserialize($session); // Is the session data we unserialized an array with the correct format? - if ( ! is_array($session) OR ! isset($session['session_id']) OR ! isset($session['ip_address']) OR ! isset($session['user_agent']) OR ! isset($session['last_activity'])) - { - $this->sess_destroy(); - return FALSE; - } - - // Is the session current? - if (($session['last_activity'] + $this->sess_expiration) < $this->now) - { - $this->sess_destroy(); - return FALSE; - } - - // Does the IP Match? - if ($this->sess_match_ip == TRUE AND $session['ip_address'] !== $this->CI->input->ip_address()) - { - $this->sess_destroy(); - return FALSE; - } - - // Does the User Agent Match? - if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) !== trim(substr($this->CI->input->user_agent(), 0, 120))) + if ( ! is_array($session) OR ! isset($session['session_id'], $session['ip_address'], $session['user_agent'], $session['last_activity']) + OR ($session['last_activity'] + $this->sess_expiration) < $this->now // Is the session current? + OR ($this->sess_match_ip == TRUE && $session['ip_address'] !== $this->CI->input->ip_address()) // Does the IP match? + OR ($this->sess_match_useragent == TRUE && trim($session['user_agent']) !== trim(substr($this->CI->input->user_agent(), 0, 120))) // Does the User Agent Match? + ) { $this->sess_destroy(); return FALSE; @@ -223,7 +206,7 @@ public function sess_read() $query = $this->CI->db->get($this->sess_table_name); - // No result? Kill it! + // No result? Kill it! if ($query->num_rows() === 0) { $this->sess_destroy(); @@ -282,7 +265,7 @@ public function sess_write() $cookie_userdata[$val] = $this->userdata[$val]; } - // Did we find any custom data? If not, we turn the empty array into a string + // Did we find any custom data? If not, we turn the empty array into a string // since there's no reason to serialize and store an empty array in the DB if (count($custom_userdata) === 0) { @@ -298,7 +281,7 @@ public function sess_write() $this->CI->db->where('session_id', $this->userdata['session_id']); $this->CI->db->update($this->sess_table_name, array('last_activity' => $this->userdata['last_activity'], 'user_data' => $custom_userdata)); - // Write the cookie. Notice that we manually pass the cookie data array to the + // Write the cookie. Notice that we manually pass the cookie data array to the // _set_cookie() function. Normally that function will store $this->userdata, but // in this case that array contains custom data, which we do not want in the cookie. $this->_set_cookie($cookie_userdata); @@ -324,13 +307,12 @@ public function sess_create() $sessid .= $this->CI->input->ip_address(); $this->userdata = array( - 'session_id' => md5(uniqid($sessid, TRUE)), - 'ip_address' => $this->CI->input->ip_address(), - 'user_agent' => substr($this->CI->input->user_agent(), 0, 120), - 'last_activity' => $this->now, - 'user_data' => '' - ); - + 'session_id' => md5(uniqid($sessid, TRUE)), + 'ip_address' => $this->CI->input->ip_address(), + 'user_agent' => substr($this->CI->input->user_agent(), 0, 120), + 'last_activity' => $this->now, + 'user_data' => '' + ); // Save the data to the DB if needed if ($this->sess_use_database === TRUE) @@ -352,7 +334,8 @@ public function sess_create() public function sess_update() { // We only update the session every five minutes by default - if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now) + if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now + OR $this->CI->input->is_ajax_request()) // Changing the session ID during an AJAX call causes problems { return; } @@ -405,7 +388,7 @@ public function sess_update() public function sess_destroy() { // Kill the session DB row - if ($this->sess_use_database === TRUE AND isset($this->userdata['session_id'])) + if ($this->sess_use_database === TRUE && isset($this->userdata['session_id'])) { $this->CI->db->where('session_id', $this->userdata['session_id']); $this->CI->db->delete($this->sess_table_name); @@ -413,13 +396,13 @@ public function sess_destroy() // Kill the cookie setcookie( - $this->sess_cookie_name, - addslashes(serialize(array())), - ($this->now - 31500000), - $this->cookie_path, - $this->cookie_domain, - 0 - ); + $this->sess_cookie_name, + addslashes(serialize(array())), + ($this->now - 31500000), + $this->cookie_path, + $this->cookie_domain, + 0 + ); } // -------------------------------------------------------------------- @@ -535,7 +518,7 @@ public function set_flashdata($newdata = array(), $newval = '') */ public function keep_flashdata($key) { - // 'old' flashdata gets removed. Here we mark all + // 'old' flashdata gets removed. Here we mark all // flashdata as 'new' to preserve it from _flashdata_sweep() // Note the function will return FALSE if the $key // provided cannot be found @@ -586,7 +569,6 @@ protected function _flashdata_mark() * * @return void */ - protected function _flashdata_sweep() { $userdata = $this->all_userdata(); @@ -609,13 +591,9 @@ protected function _flashdata_sweep() */ protected function _get_time() { - if (strtolower($this->time_reference) === 'gmt') - { - $now = time(); - return mktime(gmdate('H', $now), gmdate('i', $now), gmdate('s', $now), gmdate('m', $now), gmdate('d', $now), gmdate('Y', $now)); - } - - return time(); + return (strtolower($this->time_reference) === 'gmt') + ? mktime(gmdate('H'), gmdate('i'), gmdate('s'), gmdate('m'), gmdate('d'), gmdate('Y')) + : time(); } // -------------------------------------------------------------------- @@ -649,13 +627,13 @@ protected function _set_cookie($cookie_data = NULL) // Set the cookie setcookie( - $this->sess_cookie_name, - $cookie_data, - $expire, - $this->cookie_path, - $this->cookie_domain, - $this->cookie_secure - ); + $this->sess_cookie_name, + $cookie_data, + $expire, + $this->cookie_path, + $this->cookie_domain, + $this->cookie_secure + ); } // -------------------------------------------------------------------- @@ -687,8 +665,11 @@ protected function _serialize($data) * * This function converts any slashes found into a temporary marker * + * @param string + * @param string + * @return void */ - function _escape_slashes(&$val, $key) + protected function _escape_slashes(&$val, $key) { if (is_string($val)) { @@ -725,6 +706,9 @@ protected function _unserialize($data) * * This function converts any slash markers back into actual slashes * + * @param string + * @param string + * @return void */ protected function _unescape_slashes(&$val, $key) { @@ -763,9 +747,7 @@ protected function _sess_gc() } } - } -// END Session Class /* End of file Session.php */ /* Location: ./system/libraries/Session.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 48011f208e3..bbfbb8ce021 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -97,6 +97,7 @@ Bug fixes for 3.0 - In Pagination library, when use_page_numbers=TRUE previous link and page 1 link do not have the same url - Fixed a bug (#561) - Errors in :doc:`XML-RPC Library ` were not properly escaped. - Fixed a bug (#904) - ``CI_Loader::initialize()`` caused a PHP Fatal error to be triggered if error level E_STRICT is used. +- Fixed a bug (#154) - ``CI_Session::sess_update()`` caused the session to be destroyed on pages where multiple AJAX requests were executed at once. Version 2.1.0 ============= From 9c622f373046a0a626799f4ed5a0f944628b0b43 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 19 Jan 2012 14:12:54 +0200 Subject: [PATCH 0285/5397] Still update the session on AJAX calls, just don't regenerate the session ID --- system/libraries/Session.php | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/system/libraries/Session.php b/system/libraries/Session.php index c4f97e965d2..784bb62b23f 100644 --- a/system/libraries/Session.php +++ b/system/libraries/Session.php @@ -334,12 +334,40 @@ public function sess_create() public function sess_update() { // We only update the session every five minutes by default - if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now - OR $this->CI->input->is_ajax_request()) // Changing the session ID during an AJAX call causes problems + if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now) { return; } + // _set_cookie() will handle this for us if we aren't using database sessions + // by pushing all userdata to the cookie. + $cookie_data = NULL; + + /* Changing the session ID during an AJAX call causes problems, + * so we'll only update our last_activity + */ + if ($this->CI->input->is_ajax_request()) + { + $this->userdata['last_activity'] = $this->now; + + // Update the session ID and last_activity field in the DB if needed + if ($this->sess_use_database === TRUE) + { + // set cookie explicitly to only have our session data + $cookie_data = array(); + foreach (array('session_id','ip_address','user_agent','last_activity') as $val) + { + $cookie_data[$val] = $this->userdata[$val]; + } + + $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, + array('last_activity' => $this->userdata['last_activity']), + array('session_id' => $this->userdata['session_id']))); + } + + return $this->_set_cookie($cookie_data); + } + // Save the old session id so we know which record to // update in the database if we need it $old_sessid = $this->userdata['session_id']; @@ -357,10 +385,6 @@ public function sess_update() $this->userdata['session_id'] = $new_sessid = md5(uniqid($new_sessid, TRUE)); $this->userdata['last_activity'] = $this->now; - // _set_cookie() will handle this for us if we aren't using database sessions - // by pushing all userdata to the cookie. - $cookie_data = NULL; - // Update the session ID and last_activity field in the DB if needed if ($this->sess_use_database === TRUE) { From 09375d71aa933ac6ba3665f7ccc6949840177ade Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 19 Jan 2012 14:57:46 +0200 Subject: [PATCH 0286/5397] Some more cleaning --- system/helpers/smiley_helper.php | 39 ++++++++++---------------------- system/helpers/string_helper.php | 32 ++++++++++++-------------- system/helpers/text_helper.php | 8 +++---- 3 files changed, 31 insertions(+), 48 deletions(-) diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php index 03f3ee287bb..d2b8936aed3 100644 --- a/system/helpers/smiley_helper.php +++ b/system/helpers/smiley_helper.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -40,7 +40,7 @@ /** * Smiley Javascript * - * Returns the javascript required for the smiley insertion. Optionally takes + * 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 @@ -105,14 +105,11 @@ function insert_smiley(smiley, field_id) { } EOF; } - else + elseif (is_array($alias)) { - if (is_array($alias)) + foreach ($alias as $name => $id) { - foreach ($alias as $name => $id) - { - $r .= 'smiley_map["'.$name.'"] = "'.$id.'";'."\n"; - } + $r .= 'smiley_map["'.$name.'"] = "'.$id."\";\n"; } } @@ -137,13 +134,11 @@ function insert_smiley(smiley, field_id) { 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) && FALSE === ($smileys = _get_smiley_array())) + elseif (FALSE === ($smileys = _get_smiley_array())) { return $smileys; } @@ -155,7 +150,7 @@ function get_clickable_smileys($image_url, $alias = '', $smileys = NULL) foreach ($smileys as $key => $val) { // Keep duplicates from being used, which can happen if the - // mapping array contains multiple identical replacements. For example: + // 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]])) @@ -163,7 +158,7 @@ function get_clickable_smileys($image_url, $alias = '', $smileys = NULL) continue; } - $link[] = "
    \"".$smileys[$key][3]."\""; + $link[] = ''.$smileys[$key][3].''; $used[$smileys[$key][0]] = TRUE; } @@ -187,12 +182,7 @@ function get_clickable_smileys($image_url, $alias = '', $smileys = NULL) { function parse_smileys($str = '', $image_url = '', $smileys = NULL) { - if ($image_url == '') - { - return $str; - } - - if ( ! is_array($smileys) && FALSE === ($smileys = _get_smiley_array())) + if ($image_url == '' OR ( ! is_array($smileys) && FALSE === ($smileys = _get_smiley_array()))) { return $str; } @@ -202,7 +192,7 @@ function parse_smileys($str = '', $image_url = '', $smileys = NULL) foreach ($smileys as $key => $val) { - $str = str_replace($key, "\"".$smileys[$key][3]."\"", $str); + $str = str_replace($key, ''.$smileys[$key][3].'', $str); } return $str; @@ -223,7 +213,7 @@ function parse_smileys($str = '', $image_url = '', $smileys = NULL) { function _get_smiley_array() { - if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/smileys.php')) + if (defined('ENVIRONMENT') && file_exists(APPPATH.'config/'.ENVIRONMENT.'/smileys.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/smileys.php'); } @@ -232,12 +222,7 @@ function _get_smiley_array() include(APPPATH.'config/smileys.php'); } - if (isset($smileys) AND is_array($smileys)) - { - return $smileys; - } - - return FALSE; + return (isset($smileys) && is_array($smileys)) ? $smileys : FALSE; } } diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php index fcdb0aa845b..d0948800b7e 100644 --- a/system/helpers/string_helper.php +++ b/system/helpers/string_helper.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -75,16 +75,14 @@ function trim_slashes($str) { function strip_slashes($str) { - if (is_array($str)) + if ( ! is_array($str)) { - foreach ($str as $key => $val) - { - $str[$key] = strip_slashes($val); - } + return stripslashes($str); } - else + + foreach ($str as $key => $val) { - return stripslashes($str); + $str[$key] = strip_slashes($val); } return $str; @@ -192,7 +190,7 @@ function reduce_multiples($str, $character = ',', $trim = FALSE) * * @access public * @param string type of random string. basic, alpha, alunum, numeric, nozero, unique, md5, encrypt and sha1 - * @param integer number of characters + * @param int number of characters * @return string */ if ( ! function_exists('random_string')) @@ -238,10 +236,10 @@ function random_string($type = 'alnum', $len = 8) /** * 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 + * @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) { @@ -254,10 +252,10 @@ function increment_string($str, $separator = '_', $first = 1) /** * Alternator * - * Allows strings to be alternated. See docs... + * Allows strings to be alternated. See docs... * * @access public - * @param string (as many parameters as needed) + * @param string (as many parameters as needed) * @return string */ if ( ! function_exists('alternator')) @@ -283,14 +281,14 @@ function alternator() * * @access public * @param string - * @param integer number of repeats + * @param int number of repeats * @return string */ if ( ! function_exists('repeater')) { function repeater($data, $num = 1) { - return (($num > 0) ? str_repeat($data, $num) : ''); + return ($num > 0) ? str_repeat($data, $num) : ''; } } diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index 8e308b72287..2d6da73acdd 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -73,7 +73,7 @@ function word_limiter($str, $limit = 100, $end_char = '…') /** * Character Limiter * - * Limits the string based on the character count. Preserves complete words + * Limits the string based on the character count. Preserves complete words * so the character count may not be exactly as specified. * * @access public @@ -376,7 +376,7 @@ function convert_accented_characters($str) if ( ! isset($foreign_characters) OR ! is_array($foreign_characters)) { - if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php')) + if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php'); } @@ -400,7 +400,7 @@ function convert_accented_characters($str) /** * Word Wrap * - * Wraps text at the specified character. Maintains the integrity of words. + * Wraps text at the specified character. Maintains the integrity of words. * Anything placed between {unwrap}{/unwrap} will not be word wrapped, nor * will URLs. * From 63a21005ec657aa004b5ffc2b0965c1a201e4637 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 19 Jan 2012 15:13:32 +0200 Subject: [PATCH 0287/5397] Some more cleaning --- system/helpers/array_helper.php | 13 ++++--------- system/helpers/captcha_helper.php | 8 ++++---- system/helpers/cookie_helper.php | 4 ++-- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/system/helpers/array_helper.php b/system/helpers/array_helper.php index a454f936ddd..82f0eb16ceb 100644 --- a/system/helpers/array_helper.php +++ b/system/helpers/array_helper.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -53,12 +53,7 @@ { function element($item, $array, $default = FALSE) { - if ( ! isset($array[$item]) OR $array[$item] == "") - { - return $default; - } - - return $array[$item]; + return ( ! isset($array[$item]) OR $array[$item] == '') ? $default : $array[$item]; } } @@ -75,7 +70,7 @@ function element($item, $array, $default = FALSE) { function random_element($array) { - return (is_array($array)) ? $array[array_rand($array)] : $array; + return is_array($array) ? $array[array_rand($array)] : $array; } } @@ -105,7 +100,7 @@ function elements($items, $array, $default = FALSE) foreach ($items as $item) { - $return[$item] = (isset($array[$item])) ? $array[$item] : $default; + $return[$item] = isset($array[$item]) ? $array[$item] : $default; } return $return; diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 89bff2366a0..0565457e2c9 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -170,7 +170,7 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = } else { - $font_size = 16; + $font_size = 16; $x = rand(0, $img_width/($length/1.5)); $y = $font_size+2; } @@ -192,7 +192,7 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = } - // Create the border + // Create the border imagerectangle($im, 0, 0, $img_width-1, $img_height-1, $border_color); // ----------------------------------- @@ -200,7 +200,7 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = // ----------------------------------- $img_name = $now.'.jpg'; ImageJPEG($im, $img_path.$img_name); - $img = "\""; + $img = ' '; ImageDestroy($im); return array('word' => $word, 'time' => $now, 'image' => $img); diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php index d6f836670b9..52f489b39ce 100644 --- a/system/helpers/cookie_helper.php +++ b/system/helpers/cookie_helper.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -91,7 +91,7 @@ function get_cookie($index = '', $xss_clean = FALSE) * Delete a COOKIE * * @param mixed - * @param string the cookie domain. Usually: .yourdomain.com + * @param string the cookie domain. Usually: .yourdomain.com * @param string the cookie path * @param string the cookie prefix * @return void From f4cb94ef0fdc81f6d9d908a4a2d2efda62add379 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 19 Jan 2012 15:16:55 +0200 Subject: [PATCH 0288/5397] Some more cleaning --- system/libraries/Encrypt.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php index 8cb4b1b1906..7c8720fd644 100644 --- a/system/libraries/Encrypt.php +++ b/system/libraries/Encrypt.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Encryption Class * @@ -447,7 +445,7 @@ protected function _get_mode() * Set the Hash type * * @param string - * @return string + * @return void */ public function set_hash($type = 'sha1') { From 2c8baeb0ecdd3f5db299dc8d66edc2f157b64f23 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 19 Jan 2012 15:45:28 +0200 Subject: [PATCH 0289/5397] Some more cleaning --- system/libraries/Image_lib.php | 250 ++++++++++++++------------------- 1 file changed, 104 insertions(+), 146 deletions(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index fd3cd0edb50..065f479e885 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * Image Manipulation class * @@ -187,22 +185,17 @@ public function initialize($props = array()) } } - /* - * Is there a source image? - * - * If not, there's no reason to continue - */ + // Is there a source image? If not, there's no reason to continue if ($this->source_image == '') { $this->set_error('imglib_source_image_required'); return FALSE; } - /* - * Is getimagesize() Available? + /* Is getimagesize() available? * * We use it to determine the image properties (width/height). - * Note: We need to figure out how to determine image + * Note: We need to figure out how to determine image * properties using ImageMagick and NetPBM */ if ( ! function_exists('getimagesize')) @@ -213,8 +206,7 @@ public function initialize($props = array()) $this->image_library = strtolower($this->image_library); - /* - * Set the full server path + /* Set the full server path * * The source image may or may not contain a path. * Either way, we'll try use realpath to generate the @@ -244,7 +236,7 @@ public function initialize($props = array()) * * If the user has set a "new_image" name it means * we are making a copy of the source image. If not - * it means we are altering the original. We'll + * it means we are altering the original. We'll * set the destination filename and path accordingly. */ if ($this->new_image == '') @@ -252,41 +244,37 @@ public function initialize($props = array()) $this->dest_image = $this->source_image; $this->dest_folder = $this->source_folder; } + elseif (strpos($this->new_image, '/') === FALSE) + { + $this->dest_folder = $this->source_folder; + $this->dest_image = $this->new_image; + } else { - if (strpos($this->new_image, '/') === FALSE) + if (function_exists('realpath') && @realpath($this->new_image) !== FALSE) { - $this->dest_folder = $this->source_folder; - $this->dest_image = $this->new_image; + $full_dest_path = str_replace('\\', '/', realpath($this->new_image)); } else { - if (function_exists('realpath') && @realpath($this->new_image) !== FALSE) - { - $full_dest_path = str_replace('\\', '/', realpath($this->new_image)); - } - else - { - $full_dest_path = $this->new_image; - } + $full_dest_path = $this->new_image; + } - // Is there a file name? - if ( ! preg_match('#\.(jpg|jpeg|gif|png)$#i', $full_dest_path)) - { - $this->dest_folder = $full_dest_path.'/'; - $this->dest_image = $this->source_image; - } - else - { - $x = explode('/', $full_dest_path); - $this->dest_image = end($x); - $this->dest_folder = str_replace($this->dest_image, '', $full_dest_path); - } + // Is there a file name? + if ( ! preg_match('#\.(jpg|jpeg|gif|png)$#i', $full_dest_path)) + { + $this->dest_folder = $full_dest_path.'/'; + $this->dest_image = $this->source_image; + } + else + { + $x = explode('/', $full_dest_path); + $this->dest_image = end($x); + $this->dest_folder = str_replace($this->dest_image, '', $full_dest_path); } } - /* - * Compile the finalized filenames/paths + /* Compile the finalized filenames/paths * * We'll create two master strings containing the * full server path to the source image and the @@ -299,7 +287,7 @@ public function initialize($props = array()) $this->thumb_marker = ''; } - $xp = $this->explode_name($this->dest_image); + $xp = $this->explode_name($this->dest_image); $filename = $xp['name']; $file_ext = $xp['ext']; @@ -307,8 +295,7 @@ public function initialize($props = array()) $this->full_src_path = $this->source_folder.$this->source_image; $this->full_dst_path = $this->dest_folder.$filename.$this->thumb_marker.$file_ext; - /* - * Should we maintain image proportions? + /* Should we maintain image proportions? * * When creating thumbs or copies, the target width/height * might not be in correct proportion with the source @@ -319,12 +306,10 @@ public function initialize($props = array()) $this->image_reproportion(); } - /* - * Was a width and height specified? + /* Was a width and height specified? * - * If the destination width/height was - * not submitted we will use the values - * from the actual file + * If the destination width/height was not submitted we + * will use the values from the actual file */ if ($this->width == '') { @@ -437,20 +422,15 @@ public function rotate() } // Choose resizing function - if ($this->image_library == 'imagemagick' OR $this->image_library == 'netpbm') + if ($this->image_library === 'imagemagick' OR $this->image_library === 'netpbm') { $protocol = 'image_process_'.$this->image_library; return $this->$protocol('rotate'); } - if ($this->rotation_angle == 'hor' OR $this->rotation_angle == 'vrt') - { - return $this->image_mirror_gd(); - } - else - { - return $this->image_rotate_gd(); - } + return ($this->rotation_angle === 'hor' OR $this->rotation_angle === 'vrt') + ? $this->image_mirror_gd() + : $this->image_rotate_gd(); } // -------------------------------------------------------------------- @@ -482,7 +462,7 @@ public function image_process_gd($action = 'resize') // Let's set up our values based on the action if ($action == 'crop') { - // Reassign the source width/height if cropping + // Reassign the source width/height if cropping $this->orig_width = $this->width; $this->orig_height = $this->height; @@ -506,13 +486,14 @@ public function image_process_gd($action = 'resize') return FALSE; } - // Create The Image - // - // old conditional which users report cause problems with shared GD libs who report themselves as "2.0 or greater" - // it appears that this is no longer the issue that it was in 2004, so we've removed it, retaining it in the comment - // below should that ever prove inaccurate. - // - // if ($this->image_library == 'gd2' AND function_exists('imagecreatetruecolor') AND $v2_override == FALSE) + /* Create the image + * + * Old conditional which users report cause problems with shared GD libs who report themselves as "2.0 or greater" + * it appears that this is no longer the issue that it was in 2004, so we've removed it, retaining it in the comment + * below should that ever prove inaccurate. + * + * if ($this->image_library === 'gd2' && function_exists('imagecreatetruecolor') && $v2_override == FALSE) + */ if ($this->image_library === 'gd2' && function_exists('imagecreatetruecolor')) { $create = 'imagecreatetruecolor'; @@ -534,21 +515,17 @@ public function image_process_gd($action = 'resize') $copy($dst_img, $src_img, 0, 0, $this->x_axis, $this->y_axis, $this->width, $this->height, $this->orig_width, $this->orig_height); - // Show the image + // Show the image if ($this->dynamic_output == TRUE) { $this->image_display_gd($dst_img); } - else + elseif ( ! $this->image_save_gd($dst_img)) // Or save it { - // Or save it - if ( ! $this->image_save_gd($dst_img)) - { - return FALSE; - } + return FALSE; } - // Kill the file handles + // Kill the file handles imagedestroy($dst_img); imagedestroy($src_img); @@ -583,7 +560,7 @@ public function image_process_imagemagick($action = 'resize') } // Execute the command - $cmd = $this->library_path." -quality ".$this->quality; + $cmd = $this->library_path.' -quality '.$this->quality; if ($action == 'crop') { @@ -591,15 +568,8 @@ public function image_process_imagemagick($action = 'resize') } elseif ($action == 'rotate') { - switch ($this->rotation_angle) - { - case 'hor' : $angle = '-flop'; - break; - case 'vrt' : $angle = '-flip'; - break; - default : $angle = '-rotate '.$this->rotation_angle; - break; - } + $angle = ($this->rotation_angle === 'hor' OR $this->rotation_angle === 'vrt') + ? '-flop' : '-rotate '.$this->rotation_angle; $cmd .= ' '.$angle.' "'.$this->full_src_path.'" "'.$this->full_dst_path.'" 2>&1'; } @@ -642,7 +612,7 @@ public function image_process_netpbm($action = 'resize') return FALSE; } - // Build the resizing command + // Build the resizing command switch ($this->image_type) { case 1 : @@ -702,7 +672,7 @@ public function image_process_netpbm($action = 'resize') // If you try manipulating the original it fails so // we have to rename the temp file. copy ($this->dest_folder.'netpbm.tmp', $this->full_dst_path); - unlink ($this->dest_folder.'netpbm.tmp'); + unlink($this->dest_folder.'netpbm.tmp'); @chmod($this->full_dst_path, FILE_WRITE_MODE); return TRUE; @@ -717,7 +687,7 @@ public function image_process_netpbm($action = 'resize') */ public function image_rotate_gd() { - // Create the image handle + // Create the image handle if ( ! ($src_img = $this->image_create_gd())) { return FALSE; @@ -772,7 +742,7 @@ public function image_mirror_gd() $width = $this->orig_width; $height = $this->orig_height; - if ($this->rotation_angle == 'hor') + if ($this->rotation_angle === 'hor') { for ($i = 0; $i < $height; $i++, $left = 0, $right = $width-1) { @@ -839,7 +809,7 @@ public function image_mirror_gd() */ public function watermark() { - return ($this->wm_type == 'overlay') ? $this->overlay_watermark() : $this->text_watermark(); + return ($this->wm_type === 'overlay') ? $this->overlay_watermark() : $this->text_watermark(); } // -------------------------------------------------------------------- @@ -861,10 +831,10 @@ public function overlay_watermark() $this->get_image_properties(); // Fetch watermark image properties - $props = $this->get_image_properties($this->wm_overlay_path, TRUE); + $props = $this->get_image_properties($this->wm_overlay_path, TRUE); $wm_img_type = $props['image_type']; - $wm_width = $props['width']; - $wm_height = $props['height']; + $wm_width = $props['width']; + $wm_height = $props['height']; // Create two image resources $wm_img = $this->image_create_gd($this->wm_overlay_path, $wm_img_type); @@ -891,25 +861,23 @@ public function overlay_watermark() $y_axis = $this->wm_vrt_offset + $this->wm_padding; // Set the vertical position - switch ($this->wm_vrt_alignment) + if ($this->wm_vrt_alignment === 'M') { - case 'T': - break; - case 'M': $y_axis += ($this->orig_height / 2) - ($wm_height / 2); - break; - case 'B': $y_axis += $this->orig_height - $wm_height; - break; + $y_axis += ($this->orig_height / 2) - ($wm_height / 2); + } + elseif ($this->wm_vrt_alignment === 'B') + { + $y_axis += $this->orig_height - $wm_height; } // Set the horizontal position - switch ($this->wm_hor_alignment) + if ($this->wm_hor_alignment === 'C') { - case 'L': - break; - case 'C': $x_axis += ($this->orig_width / 2) - ($wm_width / 2); - break; - case 'R': $x_axis += $this->orig_width - $wm_width; - break; + $x_axis += ($this->orig_width / 2) - ($wm_width / 2); + } + elseif ($this->wm_hor_alignment === 'R') + { + $x_axis += $this->orig_width - $wm_width; } // Build the finalized image @@ -935,12 +903,12 @@ public function overlay_watermark() imagecopymerge($src_img, $wm_img, $x_axis, $y_axis, 0, 0, $wm_width, $wm_height, $this->wm_opacity); } - // Output the image + // Output the image if ($this->dynamic_output == TRUE) { $this->image_display_gd($src_img); } - elseif ( ! $this->image_save_gd($src_img)) + elseif ( ! $this->image_save_gd($src_img)) // ... or save it { return FALSE; } @@ -977,7 +945,7 @@ public function text_watermark() // Reverse the vertical offset // When the image is positioned at the bottom // we don't want the vertical offset to push it - // further down. We want the reverse, so we'll + // further down. We want the reverse, so we'll // invert the offset. Note: The horizontal // offset flips itself automatically @@ -1011,49 +979,39 @@ public function text_watermark() $x_axis = $this->wm_hor_offset + $this->wm_padding; $y_axis = $this->wm_vrt_offset + $this->wm_padding; - // Set verticle alignment if ($this->wm_use_drop_shadow == FALSE) $this->wm_shadow_distance = 0; $this->wm_vrt_alignment = strtoupper(substr($this->wm_vrt_alignment, 0, 1)); $this->wm_hor_alignment = strtoupper(substr($this->wm_hor_alignment, 0, 1)); - switch ($this->wm_vrt_alignment) + // Set verticle alignment + if ($this->wm_vrt_alignment === 'M') { - case 'T': - break; - case 'M': $y_axis += ($this->orig_height/2)+($fontheight/2); - break; - case 'B': $y_axis += ($this->orig_height - $fontheight - $this->wm_shadow_distance - ($fontheight/2)); - break; + $y_axis += ($this->orig_height / 2) + ($fontheight / 2); + } + elseif ($this->wm_vrt_alignment === 'B') + { + $y_axis += $this->orig_height - $fontheight - $this->wm_shadow_distance - ($fontheight / 2); } $x_shad = $x_axis + $this->wm_shadow_distance; $y_shad = $y_axis + $this->wm_shadow_distance; - // Set horizontal alignment - switch ($this->wm_hor_alignment) - { - case 'L': - break; - case 'R': - if ($this->wm_use_drop_shadow) - { - $x_shad += ($this->orig_width - $fontwidth*strlen($this->wm_text)); - $x_axis += ($this->orig_width - $fontwidth*strlen($this->wm_text)); - } - break; - case 'C': - if ($this->wm_use_drop_shadow) - { - $x_shad += floor(($this->orig_width - $fontwidth*strlen($this->wm_text))/2); - $x_axis += floor(($this->orig_width - $fontwidth*strlen($this->wm_text))/2); - } - break; - } - if ($this->wm_use_drop_shadow) { + // Set horizontal alignment + if ($this->wm_hor_alignment === 'R') + { + $x_shad += $this->orig_width - ($fontwidth * strlen($this->wm_text)); + $x_axis += $this->orig_width - ($fontwidth * strlen($this->wm_text)); + } + elseif ($this->wm_hor_alignment === 'C') + { + $x_shad += floor(($this->orig_width - ($fontwidth * strlen($this->wm_text))) / 2); + $x_axis += floor(($this->orig_width - ($fontwidth * strlen($this->wm_text))) / 2); + } + /* Set RGB values for text and shadow * * First character is #, so we don't really need it. @@ -1222,8 +1180,8 @@ public function image_save_gd($resource) */ public function image_display_gd($resource) { - header("Content-Disposition: filename={$this->source_image};"); - header("Content-Type: {$this->mime_type}"); + header('Content-Disposition: filename='.$this->source_image.';'); + header('Content-Type: '.$this->mime_type); header('Content-Transfer-Encoding: binary'); header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT'); @@ -1351,15 +1309,15 @@ public function get_image_properties($path = '', $return = FALSE) * Size calculator * * This function takes a known width x height and - * recalculates it to a new size. Only one + * recalculates it to a new size. Only one * new variable needs to be known * * $props = array( - * 'width' => $width, - * 'height' => $height, - * 'new_width' => 40, - * 'new_height' => '' - * ); + * 'width' => $width, + * 'height' => $height, + * 'new_width' => 40, + * 'new_height' => '' + * ); * * @param array * @return array @@ -1403,7 +1361,7 @@ public function size_calculator($vals) * * This is a helper function that extracts the extension * from the source_image. This function lets us deal with - * source_images with multiple periods, like: my.cool.jpg + * source_images with multiple periods, like: my.cool.jpg * It returns an associative array with two elements: * $array['ext'] = '.jpg'; * $array['name'] = 'my.cool'; @@ -1498,7 +1456,7 @@ public function set_error($msg) */ public function display_errors($open = '

    ', $close = '

    ') { - return (count($this->error_msg) > 0) ? $open . implode($close . $open, $this->error_msg) . $close : ''; + return (count($this->error_msg) > 0) ? $open.implode($close.$open, $this->error_msg).$close : ''; } } From e35d7789a24e811bc147bc56c7a1d79904900b01 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 19 Jan 2012 15:56:20 +0200 Subject: [PATCH 0290/5397] Some more cleaning --- system/database/drivers/oci8/oci8_driver.php | 17 +++-------------- system/database/drivers/oci8/oci8_result.php | 3 +-- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 2a5149f9e54..f4b899cf38b 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -46,7 +46,6 @@ * permit access to oracle databases * * @author Kelly McArdle - * */ class CI_DB_oci8_driver extends CI_DB { @@ -249,7 +248,7 @@ public function stored_procedure($package, $procedure, $params) } // build the query string - $sql = "BEGIN {$package}.{$procedure}("; + $sql = 'BEGIN '.$package.'.'.$procedure.'('; $have_cursor = FALSE; foreach ($params as $param) @@ -359,13 +358,8 @@ public function trans_commit() */ 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) + if ( ! $this->trans_enabled OR $this->_trans_depth > 0) { return TRUE; } @@ -614,12 +608,7 @@ protected function _escape_identifiers($item) */ protected function _from_tables($tables) { - if ( ! is_array($tables)) - { - $tables = array($tables); - } - - return implode(', ', $tables); + return is_array($tables) ? implode(', ', $tables) : $tables; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index e6e932175b6..0e0fe059d1e 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -194,7 +194,7 @@ protected function _fetch_object() // -------------------------------------------------------------------- /** - * Query result. "array" version. + * Query result. Array version. * * @return array */ @@ -516,7 +516,6 @@ public function row_object($n = 0) * @param string custom class name * @return mixed custom object if row found; empty array otherwise */ - public function custom_row_object($n = 0, $class_name) { // Make sure $n is not a string From 72d7a6e2cbf1bd797bab7b14912a207f4522953a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 19 Jan 2012 16:02:32 +0200 Subject: [PATCH 0291/5397] Some cleaning --- .../drivers/sqlite3/sqlite3_driver.php | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index b82ae1ecd51..8a7dbe1f10e 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -188,13 +188,8 @@ private function _prep_query($sql) */ 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) + if ( ! $this->trans_enabled OR $this->_trans_depth > 0) { return TRUE; } @@ -216,13 +211,8 @@ public function trans_begin($test_mode = FALSE) */ 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) + if ( ! $this->trans_enabled OR $this->_trans_depth > 0) { return TRUE; } @@ -239,13 +229,8 @@ public function trans_commit() */ 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) + if ( ! $this->trans_enabled OR $this->_trans_depth > 0) { return TRUE; } From 7e087f5e07c4630092a1d6ecdd103dc15f48e573 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 20 Jan 2012 11:46:27 +0200 Subject: [PATCH 0292/5397] Revert if() merge, for readability --- system/libraries/Session.php | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/system/libraries/Session.php b/system/libraries/Session.php index 784bb62b23f..b8c623584a8 100644 --- a/system/libraries/Session.php +++ b/system/libraries/Session.php @@ -179,11 +179,28 @@ public function sess_read() $session = $this->_unserialize($session); // Is the session data we unserialized an array with the correct format? - if ( ! is_array($session) OR ! isset($session['session_id'], $session['ip_address'], $session['user_agent'], $session['last_activity']) - OR ($session['last_activity'] + $this->sess_expiration) < $this->now // Is the session current? - OR ($this->sess_match_ip == TRUE && $session['ip_address'] !== $this->CI->input->ip_address()) // Does the IP match? - OR ($this->sess_match_useragent == TRUE && trim($session['user_agent']) !== trim(substr($this->CI->input->user_agent(), 0, 120))) // Does the User Agent Match? - ) + if ( ! is_array($session) OR ! isset($session['session_id'], $session['ip_address'], $session['user_agent'], $session['last_activity'])) + { + $this->sess_destroy(); + return FALSE; + } + + // Is the session current? + if (($session['last_activity'] + $this->sess_expiration) < $this->now) + { + $this->sess_destroy(); + return FALSE; + } + + // Does the IP match? + if ($this->sess_match_ip == TRUE && $session['ip_address'] !== $this->CI->input->ip_address()) + { + $this->sess_destroy(); + return FALSE; + } + + // Does the User Agent Match? + if ($this->sess_match_useragent == TRUE && trim($session['user_agent']) !== trim(substr($this->CI->input->user_agent(), 0, 120))) { $this->sess_destroy(); return FALSE; From 1ab62aedc09cc75ac5619d5e881076cc9ca5e090 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 20 Jan 2012 13:04:10 +0200 Subject: [PATCH 0293/5397] Replaced AND with && --- system/database/DB_driver.php | 53 +++++++++----------- system/database/drivers/oci8/oci8_driver.php | 2 +- system/database/drivers/oci8/oci8_result.php | 1 - 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index e667c25d39f..7f5ec1e20e3 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -106,7 +106,7 @@ public function __construct($params) * Initialize Database Settings * * @param mixed - * @return void + * @return bool */ public function initialize() { @@ -198,7 +198,7 @@ public function initialize() * * @param string * @param string - * @return resource + * @return bool */ public function db_set_charset($charset, $collation) { @@ -292,15 +292,15 @@ public function query($sql, $binds = FALSE, $return_object = TRUE) } // Verify table prefix and replace if necessary - if ( ($this->dbprefix != '' AND $this->swap_pre != '') AND ($this->dbprefix != $this->swap_pre) ) + if (($this->dbprefix != '' && $this->swap_pre != '') && ($this->dbprefix != $this->swap_pre)) { - $sql = preg_replace("/(\W)".$this->swap_pre."(\S+?)/", "\\1".$this->dbprefix."\\2", $sql); + $sql = preg_replace('/(\W)'.$this->swap_pre.'(\S+?)/', '\\1'.$this->dbprefix.'\\2', $sql); } // Is query caching enabled? If the query is a "read type" // we will load the caching class and return the previously // cached query if it exists - if ($this->cache_on == TRUE AND stristr($sql, 'SELECT')) + if ($this->cache_on == TRUE && stristr($sql, 'SELECT')) { if ($this->_cache_init()) { @@ -385,7 +385,7 @@ public function query($sql, $binds = FALSE, $return_object = TRUE) { // If caching is enabled we'll auto-cleanup any // existing files related to this particular URI - if ($this->cache_on == TRUE AND $this->cache_autodel == TRUE AND $this->_cache_init()) + if ($this->cache_on == TRUE && $this->cache_autodel == TRUE && $this->_cache_init()) { $this->CACHE->delete(); } @@ -419,7 +419,7 @@ public function query($sql, $binds = FALSE, $return_object = TRUE) // Is query caching enabled? If so, we'll serialize the // result object and save it to a cache file. - if ($this->cache_on == TRUE AND $this->_cache_init()) + if ($this->cache_on == TRUE && $this->_cache_init()) { // We'll create a new instance of the result object // only without the platform specific driver since @@ -489,7 +489,6 @@ public function simple_query($sql) * Disable Transactions * This permits transactions to be disabled at run-time. * - * @access public * @return void */ public function trans_off() @@ -501,12 +500,12 @@ public function trans_off() /** * Enable/disable Transaction Strict Mode + * * When strict mode is enabled, if you are running multiple groups of * transactions, if one group fails all groups will be rolled back. * If strict mode is disabled, each group is treated autonomously, meaning * a failure of one group will not affect any others * - * @access public * @return void */ public function trans_strict($mode = TRUE) @@ -645,15 +644,11 @@ public function compile_binds($sql, $binds) * Determines if a query is a "write" type. * * @param string An SQL query string - * @return boolean + * @return bool */ public function is_write_type($sql) { - if ( ! preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i', $sql)) - { - return FALSE; - } - return TRUE; + return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i', $sql); } // -------------------------------------------------------------------- @@ -661,8 +656,8 @@ public function is_write_type($sql) /** * Calculate the aggregate query elapsed time * - * @param integer The number of decimal places - * @return integer + * @param int The number of decimal places + * @return string */ public function elapsed_time($decimals = 6) { @@ -743,7 +738,7 @@ public function escape_like_str($str) /** * Primary * - * Retrieves the primary key. It assumes that the row in the first + * Retrieves the primary key. It assumes that the row in the first * position is the primary key * * @param string the table name @@ -946,7 +941,7 @@ public function update_string($table, $data, $where) { if ($where == '') { - return false; + return FALSE; } $fields = array(); @@ -1118,12 +1113,12 @@ public function cache_delete_all() */ private function _cache_init() { - if (is_object($this->CACHE) AND class_exists('CI_DB_Cache')) + if (is_object($this->CACHE) && class_exists('CI_DB_Cache')) { return TRUE; } - if ( ! class_exists('CI_DB_Cache') AND ! @include(BASEPATH.'database/DB_cache.php')) + if ( ! class_exists('CI_DB_Cache') && ! @include(BASEPATH.'database/DB_cache.php')) { return $this->cache_off(); } @@ -1221,7 +1216,7 @@ public function protect_identifiers($item, $prefix_single = FALSE) * a couple functions in this class. * It takes a column or table name (optionally with an alias) and inserts * the table prefix onto it. Some logic is necessary in order to deal with - * column names that include the path. Consider a query like this: + * column names that include the path. Consider a query like this: * * SELECT * FROM hostname.database.table.column AS c FROM hostname.database.table * @@ -1289,7 +1284,7 @@ public function _protect_identifiers($item, $prefix_single = FALSE, $protect_ide $parts = explode('.', $item); // Does the first segment of the exploded item match - // one of the aliases previously identified? If so, + // one of the aliases previously identified? If so, // we have nothing more to do other than escape the item if (in_array($parts[0], $this->ar_aliased_tables)) { @@ -1308,7 +1303,7 @@ public function _protect_identifiers($item, $prefix_single = FALSE, $protect_ide return $item.$alias; } - // Is there a table prefix defined in the config file? If not, no need to do anything + // Is there a table prefix defined in the config file? If not, no need to do anything if ($this->dbprefix != '') { // We now add the table prefix based on some logic. @@ -1341,7 +1336,7 @@ public function _protect_identifiers($item, $prefix_single = FALSE, $protect_ide // Verify table prefix and replace if necessary if ($this->swap_pre != '' && strncmp($parts[$i], $this->swap_pre, strlen($this->swap_pre)) === 0) { - $parts[$i] = preg_replace("/^".$this->swap_pre."(\S+?)/", $this->dbprefix."\\1", $parts[$i]); + $parts[$i] = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $parts[$i]); } // We only add the table prefix if it does not already exist @@ -1362,23 +1357,23 @@ public function _protect_identifiers($item, $prefix_single = FALSE, $protect_ide return $item.$alias; } - // Is there a table prefix? If not, no need to insert it + // Is there a table prefix? If not, no need to insert it if ($this->dbprefix != '') { // Verify table prefix and replace if necessary if ($this->swap_pre != '' && strncmp($item, $this->swap_pre, strlen($this->swap_pre)) === 0) { - $item = preg_replace("/^".$this->swap_pre."(\S+?)/", $this->dbprefix."\\1", $item); + $item = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $item); } // Do we prefix an item with no segments? - if ($prefix_single == TRUE AND substr($item, 0, strlen($this->dbprefix)) != $this->dbprefix) + if ($prefix_single == TRUE && substr($item, 0, strlen($this->dbprefix)) != $this->dbprefix) { $item = $this->dbprefix.$item; } } - if ($protect_identifiers === TRUE AND ! in_array($item, $this->_reserved_identifiers)) + if ($protect_identifiers === TRUE && ! in_array($item, $this->_reserved_identifiers)) { $item = $this->_escape_identifiers($item); } diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index f4b899cf38b..76aca9a660c 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -471,7 +471,7 @@ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT TABLE_NAME FROM ALL_TABLES'; - if ($prefix_limit !== FALSE AND $this->dbprefix != '') + if ($prefix_limit !== FALSE && $this->dbprefix != '') { return $sql." WHERE TABLE_NAME LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); } diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index 0e0fe059d1e..221ab2c5f8b 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -358,7 +358,6 @@ public function custom_result_object($class_name) * @param string ('object', 'array' or a custom class name) * @return mixed whatever was passed to the second parameter */ - public function row($n = 0, $type = 'object') { if ($type === 'object') From 5ad9e4ebba4ab8a8eb36952430d5a18978697360 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 20 Jan 2012 13:10:22 +0200 Subject: [PATCH 0294/5397] Replace AND with && --- system/helpers/captcha_helper.php | 4 +--- system/helpers/cookie_helper.php | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 0565457e2c9..3b62da92922 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter CAPTCHA Helper * @@ -160,7 +158,7 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = // ----------------------------------- // Write the text // ----------------------------------- - $use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE; + $use_font = ($font_path != '' && file_exists($font_path) && function_exists('imagettftext')); if ($use_font == FALSE) { diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php index 52f489b39ce..f32a1a5ae73 100644 --- a/system/helpers/cookie_helper.php +++ b/system/helpers/cookie_helper.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Cookie Helpers * From f88681873b8b556d58f22a3e99c916eadbcb6171 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 20 Jan 2012 13:14:53 +0200 Subject: [PATCH 0295/5397] Replace AND with && --- system/libraries/Session.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/system/libraries/Session.php b/system/libraries/Session.php index b8c623584a8..c331d99f785 100644 --- a/system/libraries/Session.php +++ b/system/libraries/Session.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * Session Class * @@ -94,7 +92,7 @@ public function __construct($params = array()) } // Are we using a database? If so, load it - if ($this->sess_use_database === TRUE AND $this->sess_table_name != '') + if ($this->sess_use_database === TRUE && $this->sess_table_name != '') { $this->CI->load->database(); } @@ -232,7 +230,7 @@ public function sess_read() // Is there custom data? If so, add it to the main session array $row = $query->row(); - if (isset($row->user_data) AND $row->user_data != '') + if (isset($row->user_data) && $row->user_data != '') { $custom_data = $this->_unserialize($row->user_data); From 6de924ce72797a1a8d8d8104f767f42c24e929c3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 20 Jan 2012 13:18:18 +0200 Subject: [PATCH 0296/5397] Replace AND with && --- system/libraries/Form_validation.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 9aa07a1a82d..34b7b646db9 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -297,7 +297,7 @@ public function run($group = '') // Is there a validation rule for the particular URI being accessed? $uri = ($group == '') ? trim($this->CI->uri->ruri_string(), '/') : $group; - if ($uri != '' AND isset($this->_config_rules[$uri])) + if ($uri != '' && isset($this->_config_rules[$uri])) { $this->set_rules($this->_config_rules[$uri]); } @@ -327,7 +327,7 @@ public function run($group = '') { $this->_field_data[$field]['postdata'] = $this->_reduce_array($_POST, $row['keys']); } - elseif (isset($_POST[$field]) AND $_POST[$field] != '') + elseif (isset($_POST[$field]) && $_POST[$field] != '') { $this->_field_data[$field]['postdata'] = $_POST[$field]; } @@ -373,7 +373,7 @@ protected function _reduce_array($array, $keys, $i = 0) /** * Re-populate the _POST array with our finalized and processed data * - * @return null + * @return void */ protected function _reset_post_array() { @@ -452,7 +452,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) // If the field is blank, but NOT required, no further tests are necessary $callback = FALSE; - if ( ! in_array('required', $rules) AND is_null($postdata)) + if ( ! in_array('required', $rules) && is_null($postdata)) { // Before we bail out, does the rule contain a callback? if (preg_match('/(callback_\w+(\[.*?\])?)/', implode(' ', $rules), $match)) @@ -467,7 +467,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) } // Isset Test. Typically this rule will only apply to checkboxes. - if (is_null($postdata) AND $callback === FALSE) + if (is_null($postdata) && $callback === FALSE) { if (in_array('isset', $rules, TRUE) OR in_array('required', $rules)) { @@ -510,7 +510,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) // We set the $postdata variable with the current data in our master array so that // each cycle of the loop is dealing with the processed data from the last cycle - if ($row['is_array'] == TRUE AND is_array($this->_field_data[$row['field']]['postdata'])) + if ($row['is_array'] == TRUE && is_array($this->_field_data[$row['field']]['postdata'])) { // We shouldn't need this safety, but just in case there isn't an array index // associated with this cycle we'll bail out @@ -569,7 +569,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) } // If the field isn't required and we just processed a callback we'll move on... - if ( ! in_array('required', $rules, TRUE) AND $result !== FALSE) + if ( ! in_array('required', $rules, TRUE) && $result !== FALSE) { continue; } @@ -724,7 +724,7 @@ public function set_select($field = '', $value = '', $default = FALSE) { if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata'])) { - return ($default === TRUE AND count($this->_field_data) === 0) ? ' selected="selected"' : ''; + return ($default === TRUE && count($this->_field_data) === 0) ? ' selected="selected"' : ''; } $field = $this->_field_data[$field]['postdata']; @@ -759,7 +759,7 @@ public function set_radio($field = '', $value = '', $default = FALSE) { if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata'])) { - return ($default === TRUE AND count($this->_field_data) === 0) ? ' checked="checked"' : ''; + return ($default === TRUE && count($this->_field_data) === 0) ? ' checked="checked"' : ''; } $field = $this->_field_data[$field]['postdata']; @@ -1125,7 +1125,7 @@ public function is_natural($str) */ public function is_natural_no_zero($str) { - return ($str != 0 AND preg_match('/^[0-9]+$/', $str)); + return ($str != 0 && preg_match('/^[0-9]+$/', $str)); } // -------------------------------------------------------------------- From 16d806605993305efe9c264b3ae8383ec92ae5ae Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 20 Jan 2012 13:26:49 +0200 Subject: [PATCH 0297/5397] Some more cleaning --- system/libraries/Zip.php | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index dbcdb2d97ad..85a0b5ce9ba 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * Zip Compression Class * @@ -265,7 +263,7 @@ public function read_file($path, $preserve_filepath = FALSE) * Read a directory and add it to the zip. * * This function recursively reads a folder and everything it contains (including - * sub-folders) and creates a zip based on it. Whatever directory structure + * sub-folders) and creates a zip based on it. Whatever directory structure * is in the original file path will be recreated in the zip file. * * @param string path to source @@ -297,18 +295,14 @@ public function read_dir($path, $preserve_filepath = TRUE, $root_path = NULL) { $this->read_dir($path.$file.'/', $preserve_filepath, $root_path); } - else + elseif (FALSE !== ($data = file_get_contents($path.$file))) { - if (FALSE !== ($data = file_get_contents($path.$file))) + $name = str_replace('\\', '/', $path); + if ($preserve_filepath === FALSE) { - $name = str_replace('\\', '/', $path); - if ($preserve_filepath === FALSE) - { - $name = str_replace($root_path, '', $name); - } - - $this->add_data($name.$file, $data); + $name = str_replace($root_path, '', $name); } + $this->add_data($name.$file, $data); } } @@ -320,7 +314,7 @@ public function read_dir($path, $preserve_filepath = TRUE, $root_path = NULL) /** * Get the Zip file * - * @return binary string + * @return string (binary encoded) */ public function get_zip() { @@ -393,10 +387,10 @@ public function download($filename = 'backup.zip') /** * Initialize Data * - * Lets you clear current zip data. Useful if you need to create + * Lets you clear current zip data. Useful if you need to create * multiple zips with different data. * - * @return void + * @return object */ public function clear_data() { From 1e8be299b1c0f6385fb0536a6983147bd8ac029e Mon Sep 17 00:00:00 2001 From: Anton Lindqvist Date: Sat, 21 Jan 2012 12:25:08 +0100 Subject: [PATCH 0298/5397] Added redis cache driver. --- application/controllers/test_redis.php | 43 ++++ system/libraries/Cache/Cache.php | 2 +- .../libraries/Cache/drivers/Cache_redis.php | 217 ++++++++++++++++++ 3 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 application/controllers/test_redis.php create mode 100644 system/libraries/Cache/drivers/Cache_redis.php diff --git a/application/controllers/test_redis.php b/application/controllers/test_redis.php new file mode 100644 index 00000000000..b84c652d7f5 --- /dev/null +++ b/application/controllers/test_redis.php @@ -0,0 +1,43 @@ +load->library('unit_test'); + + $this->load->driver('cache', array('adapter' => 'redis')); + } + + function index() + { + $this->unit->run($this->cache->redis->is_supported(), 'is_true'); + + $this->unit->run($this->cache->redis->save('foo', 'bar'), 'is_true'); + + $this->unit->run($this->cache->redis->get('foo'), 'bar'); + + $this->unit->run($this->cache->redis->delete('foo'), 'is_true'); + + $this->unit->run($this->cache->redis->save('foo', 'bar', 1800), 'is_true'); + + $this->unit->run( + $this->cache->redis->get_metadata('foo'), + array( + 'data' => 'bar', + 'expire' => time() + 1800 + ) + ); + + $this->unit->run($this->cache->redis->clean(), 'is_true'); + + $this->unit->run($this->cache->redis->get('foo'), 'is_false'); + + $this->unit->run($this->cache->redis->cache_info(), 'is_array'); + + echo $this->unit->report(); + } + +} \ No newline at end of file diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php index 2e78a666032..25555506c8c 100644 --- a/system/libraries/Cache/Cache.php +++ b/system/libraries/Cache/Cache.php @@ -39,7 +39,7 @@ class CI_Cache extends CI_Driver_Library { protected $valid_drivers = array( - 'cache_apc', 'cache_file', 'cache_memcached', 'cache_dummy' + 'cache_apc', 'cache_file', 'cache_memcached', 'cache_redis', 'cache_dummy' ); protected $_cache_path = NULL; // Path of cache files (if file-based cache) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php new file mode 100644 index 00000000000..9eb7a8d4ea9 --- /dev/null +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -0,0 +1,217 @@ + + * @link + */ +class CI_Cache_redis extends CI_Driver +{ + + /** + * Default config + * + * @access private + * @static + * @var array + */ + private static $_default_config = array( + 'host' => '127.0.0.1', + 'port' => 6379, + 'timeout' => 0 + ); + + /** + * Redis connection + * + * @access private + * @var Redis + */ + private $_redis; + + /** + * Class destructor + * + * Closes the connection to Redis if present. + * + * @access public + * @return void + */ + public function __destruct() + { + if ($this->_redis) + { + $this->_redis->close(); + } + } + + /** + * Get cache + * + * @access public + * @param string $key Cache key identifier + * @return mixed + */ + public function get($key) + { + return $this->_redis->get($key); + } + + /** + * Save cache + * + * @access public + * @param string $key Cache key identifier + * @param mixed $value Data to save + * @param integer $ttl Time to live + * @return boolean + */ + public function save($key, $value, $ttl = NULL) + { + return ($ttl) + ? $this->_redis->setex($key, $ttl, $value) + : $this->_redis->set($key, $value); + } + + /** + * Delete from cache + * + * @access public + * @param string $key Cache key + * @return boolean + */ + public function delete($key) + { + return ($this->_redis->delete($key) === 1); + } + + /** + * Clean cache + * + * @access public + * @return boolean + * @see Redis::flushDB() + */ + public function clean() + { + return $this->_redis->flushDB(); + } + + /** + * Get cache driver info + * + * @access public + * @param string $type Not supported in Redis. Only included in order to offer a + * consistent cache API. + * @return array + * @see Redis::info() + */ + public function cache_info($type = NULL) + { + return $this->_redis->info(); + } + + /** + * Get cache metadata + * + * @access public + * @param string $key Cache key + * @return array + */ + public function get_metadata($key) + { + $value = $this->get($key); + + if ($value) + { + return array( + 'expire' => time() + $this->_redis->ttl($key), + 'data' => $value + ); + } + } + + /** + * Check if Redis driver is supported + * + * @access public + * @return boolean + */ + public function is_supported() + { + if (extension_loaded('redis')) + { + $this->_setup_redis(); + + return TRUE; + } + else + { + log_message( + 'error', + 'The Redis extension must be loaded to use Redis cache.' + ); + + return FALSE; + } + + } + + /** + * Setup Redis config and connection + * + * Loads Redis config file if present. Will halt execution if a Redis connection + * can't be established. + * + * @access private + * @return void + * @see Redis::connect() + */ + private function _setup_redis() + { + $config = array(); + $CI =& get_instance(); + + if ($CI->config->load('redis', TRUE, TRUE)) + { + $config += $CI->config->item('redis'); + } + + $config = array_merge(self::$_default_config, $config); + + $this->_redis = new Redis(); + + try + { + $this->_redis->connect($config['host'], $config['port'], $config['timeout']); + } + catch (RedisException $e) + { + show_error('Redis connection refused. ' . $e->getMessage()); + } + } + +} +// End Class + +/* End of file Cache_redis.php */ +/* Location: ./system/libraries/Cache/drivers/Cache_redis.php */ \ No newline at end of file From 3573af8b98ceeb2308a1eaf02ee3b327dfca82b0 Mon Sep 17 00:00:00 2001 From: Anton Lindqvist Date: Sat, 21 Jan 2012 20:33:12 +0100 Subject: [PATCH 0299/5397] Fixed syntax according to feedback. --- .../libraries/Cache/drivers/Cache_redis.php | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 9eb7a8d4ea9..f3acc6e469f 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -30,11 +30,10 @@ class CI_Cache_redis extends CI_Driver /** * Default config * - * @access private * @static * @var array */ - private static $_default_config = array( + protected static $_default_config = array( 'host' => '127.0.0.1', 'port' => 6379, 'timeout' => 0 @@ -43,17 +42,15 @@ class CI_Cache_redis extends CI_Driver /** * Redis connection * - * @access private * @var Redis */ - private $_redis; + protected $_redis; /** * Class destructor * * Closes the connection to Redis if present. * - * @access public * @return void */ public function __destruct() @@ -67,7 +64,6 @@ public function __destruct() /** * Get cache * - * @access public * @param string $key Cache key identifier * @return mixed */ @@ -79,7 +75,6 @@ public function get($key) /** * Save cache * - * @access public * @param string $key Cache key identifier * @param mixed $value Data to save * @param integer $ttl Time to live @@ -95,7 +90,6 @@ public function save($key, $value, $ttl = NULL) /** * Delete from cache * - * @access public * @param string $key Cache key * @return boolean */ @@ -107,7 +101,6 @@ public function delete($key) /** * Clean cache * - * @access public * @return boolean * @see Redis::flushDB() */ @@ -119,7 +112,6 @@ public function clean() /** * Get cache driver info * - * @access public * @param string $type Not supported in Redis. Only included in order to offer a * consistent cache API. * @return array @@ -133,7 +125,6 @@ public function cache_info($type = NULL) /** * Get cache metadata * - * @access public * @param string $key Cache key * @return array */ @@ -153,7 +144,6 @@ public function get_metadata($key) /** * Check if Redis driver is supported * - * @access public * @return boolean */ public function is_supported() @@ -166,10 +156,7 @@ public function is_supported() } else { - log_message( - 'error', - 'The Redis extension must be loaded to use Redis cache.' - ); + log_message('error', 'The Redis extension must be loaded to use Redis cache.'); return FALSE; } @@ -182,7 +169,6 @@ public function is_supported() * Loads Redis config file if present. Will halt execution if a Redis connection * can't be established. * - * @access private * @return void * @see Redis::connect() */ From 363b7dab5d73d3a57fb495daf0212df71afa2c1d Mon Sep 17 00:00:00 2001 From: Anton Lindqvist Date: Mon, 23 Jan 2012 23:18:29 +0100 Subject: [PATCH 0300/5397] Removed test_redis controller. --- application/controllers/test_redis.php | 43 -------------------------- 1 file changed, 43 deletions(-) delete mode 100644 application/controllers/test_redis.php diff --git a/application/controllers/test_redis.php b/application/controllers/test_redis.php deleted file mode 100644 index b84c652d7f5..00000000000 --- a/application/controllers/test_redis.php +++ /dev/null @@ -1,43 +0,0 @@ -load->library('unit_test'); - - $this->load->driver('cache', array('adapter' => 'redis')); - } - - function index() - { - $this->unit->run($this->cache->redis->is_supported(), 'is_true'); - - $this->unit->run($this->cache->redis->save('foo', 'bar'), 'is_true'); - - $this->unit->run($this->cache->redis->get('foo'), 'bar'); - - $this->unit->run($this->cache->redis->delete('foo'), 'is_true'); - - $this->unit->run($this->cache->redis->save('foo', 'bar', 1800), 'is_true'); - - $this->unit->run( - $this->cache->redis->get_metadata('foo'), - array( - 'data' => 'bar', - 'expire' => time() + 1800 - ) - ); - - $this->unit->run($this->cache->redis->clean(), 'is_true'); - - $this->unit->run($this->cache->redis->get('foo'), 'is_false'); - - $this->unit->run($this->cache->redis->cache_info(), 'is_array'); - - echo $this->unit->report(); - } - -} \ No newline at end of file From 5a1d953e8a492326b8e8cbd0473b1593fe42cfa6 Mon Sep 17 00:00:00 2001 From: Anton Lindqvist Date: Mon, 23 Jan 2012 23:20:26 +0100 Subject: [PATCH 0301/5397] Updated redis driver doc block. --- .../libraries/Cache/drivers/Cache_redis.php | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index f3acc6e469f..5d42905cb0f 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -4,12 +4,24 @@ * * An open source application development framework for PHP 5.1.6 or newer * - * @package CodeIgniter - * @author ExpressionEngine Dev Team - * @copyright Copyright (c) 2006 - 2011 EllisLab, Inc. - * @license http://codeigniter.com/user_guide/license.html - * @link http://codeigniter.com - * @since Version 2.0 + * NOTICE OF LICENSE + * + * Licensed under the Open Software License version 3.0 + * + * This source file is subject to the Open Software License (OSL 3.0) that is + * bundled with this package in the files license.txt / license.rst. It is + * also available through the world wide web at this URL: + * http://opensource.org/licenses/OSL-3.0 + * If you did not receive a copy of the license and are unable to obtain it + * through the world wide web, please send an email to + * licensing@ellislab.com so we can send you a copy immediately. + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2006 - 2012 EllisLab, Inc. + * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link http://codeigniter.com + * @since Version 2.0 * @filesource */ From 0e4d2b652ec4b0027b188a7aa84a9862b968f780 Mon Sep 17 00:00:00 2001 From: Eric Roberts Date: Mon, 23 Jan 2012 18:19:20 -0600 Subject: [PATCH 0302/5397] Fix bug #195 Fixes bug #195 regarding non-existent user agent strings when using force_download() helper. --- system/helpers/download_helper.php | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 4a1a79cc3a4..aea948d818e 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -88,26 +88,20 @@ function force_download($filename = '', $data = '') { $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("Content-Transfer-Encoding: binary"); + header("Content-Length: ".strlen($data)); + header('Pragma: no-cache'); + + // Internet Explorer-specific headers. + if (isset($_SERVER['HTTP_USER_AGENT']) && 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); From 41cc0908918f48d948fe1e1fc9c74fdec58b7a60 Mon Sep 17 00:00:00 2001 From: Eric Roberts Date: Tue, 24 Jan 2012 00:59:44 -0600 Subject: [PATCH 0303/5397] Better support for using field names and rule parameters in error messages. --- .../language/english/form_validation_lang.php | 46 +++++++++---------- system/libraries/Form_validation.php | 25 +++++++++- .../source/libraries/form_validation.rst | 22 +++++---- 3 files changed, 60 insertions(+), 33 deletions(-) diff --git a/system/language/english/form_validation_lang.php b/system/language/english/form_validation_lang.php index 6afa37a291d..a1e02045fcc 100644 --- a/system/language/english/form_validation_lang.php +++ b/system/language/english/form_validation_lang.php @@ -25,29 +25,29 @@ * @filesource */ -$lang['required'] = "The %s field is required."; -$lang['isset'] = "The %s field must have a value."; -$lang['valid_email'] = "The %s field must contain a valid email address."; -$lang['valid_emails'] = "The %s field must contain all valid email addresses."; -$lang['valid_url'] = "The %s field must contain a valid URL."; -$lang['valid_ip'] = "The %s field must contain a valid IP."; -$lang['min_length'] = "The %s field must be at least %s characters in length."; -$lang['max_length'] = "The %s field cannot exceed %s characters in length."; -$lang['exact_length'] = "The %s field must be exactly %s characters in length."; -$lang['alpha'] = "The %s field may only contain alphabetical characters."; -$lang['alpha_numeric'] = "The %s field may only contain alpha-numeric characters."; -$lang['alpha_dash'] = "The %s field may only contain alpha-numeric characters, underscores, and dashes."; -$lang['numeric'] = "The %s field must contain only numbers."; -$lang['is_numeric'] = "The %s field must contain only numeric characters."; -$lang['integer'] = "The %s field must contain an integer."; -$lang['regex_match'] = "The %s field is not in the correct format."; -$lang['matches'] = "The %s field does not match the %s field."; -$lang['is_unique'] = "The %s field must contain a unique value."; -$lang['is_natural'] = "The %s field must contain only positive numbers."; -$lang['is_natural_no_zero'] = "The %s field must contain a number greater than zero."; -$lang['decimal'] = "The %s field must contain a decimal number."; -$lang['less_than'] = "The %s field must contain a number less than %s."; -$lang['greater_than'] = "The %s field must contain a number greater than %s."; +$lang['required'] = 'The {field} field is required.'; +$lang['isset'] = 'The {field} field must have a value.'; +$lang['valid_email'] = 'The {field} field must contain a valid email address.'; +$lang['valid_emails'] = 'The {field} field must contain all valid email addresses.'; +$lang['valid_url'] = 'The {field} field must contain a valid URL.'; +$lang['valid_ip'] = 'The {field} field must contain a valid IP.'; +$lang['min_length'] = 'The {field} field must be at least {param} characters in length.'; +$lang['max_length'] = 'The {field} field cannot exceed {param} characters in length.'; +$lang['exact_length'] = 'The {field} field must be exactly {param} characters in length.'; +$lang['alpha'] = 'The {field} field may only contain alphabetical characters.'; +$lang['alpha_numeric'] = 'The {field} field may only contain alpha-numeric characters.'; +$lang['alpha_dash'] = 'The {field} field may only contain alpha-numeric characters, underscores, and dashes.'; +$lang['numeric'] = 'The {field} field must contain only numbers.'; +$lang['is_numeric'] = 'The {field} field must contain only numeric characters.'; +$lang['integer'] = 'The {field} field must contain an integer.'; +$lang['regex_match'] = 'The {field} field is not in the correct format.'; +$lang['matches'] = 'The {field} field does not match the {param} field.'; +$lang['is_unique'] = 'The {field} field must contain a unique value.'; +$lang['is_natural'] = 'The {field} field must contain only positive numbers.'; +$lang['is_natural_no_zero'] = 'The {field} field must contain a number greater than zero.'; +$lang['decimal'] = 'The {field} field must contain a decimal number.'; +$lang['less_than'] = 'The {field} field must contain a number less than {param}.'; +$lang['greater_than'] = 'The {field} field must contain a number greater than {param}.'; /* End of file form_validation_lang.php */ diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 0a6a2af0d39..ebd96e40223 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -503,7 +503,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) } // Build the error message - $message = sprintf($line, $this->_translate_fieldname($row['label'])); + $message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label'])); // Save the error message $this->_field_data[$row['field']]['error'] = $message; @@ -651,7 +651,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) } // Build the error message - $message = sprintf($line, $this->_translate_fieldname($row['label']), $param); + $message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label']), $param); // Save the error message $this->_field_data[$row['field']]['error'] = $message; @@ -693,6 +693,27 @@ protected function _translate_fieldname($fieldname) return $fieldname; } + // -------------------------------------------------------------------- + + /** + * Build an error message using the field and param. + * + * @param string The error message line + * @param string A field's human name + * @param mixed A rule's optional parameter + * @return string + */ + protected function _build_error_msg($line, $field = '', $param = '') + { + // Check for %s in the string for legacy support. + if (strpos($line, '%s') !== false) + { + return sprintf($line, $field, $param); + } + + return str_replace(array('{field}', '{param}'), array($field, $param), $line); + } + // -------------------------------------------------------------------- /** diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index e7875bc22cf..bf06445f9a8 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -139,7 +139,6 @@ this code and save it to your applications/controllers/ folder:: } } } - ?> Try it! ======= @@ -240,7 +239,6 @@ Your controller should now look like this:: } } } - ?> Now submit the form with the fields blank and you should see the error messages. If you submit the form with all the fields populated you'll @@ -443,7 +441,6 @@ Here's how your controller should now look:: } } - ?> Reload your form and submit it with the word "test" as the username. You can see that the form field data was passed to your callback function @@ -466,7 +463,7 @@ Setting Error Messages ====================== All of the native error messages are located in the following language -file: language/english/form_validation_lang.php +file: system/language/english/form_validation_lang.php To set your own custom message you can either edit that file, or use the following function:: @@ -476,8 +473,18 @@ following function:: Where rule corresponds to the name of a particular rule, and Error Message is the text you would like displayed. -If you include %s in your error string, it will be replaced with the -"human" name you used for your field when you set your rules. +If you'd like to include a field's "human" name or the optional +parameter some rules allow for (such as max_length), you can add the +**{field}** and **{param}** tags to your message, respectively. + + $this->form_validation->set_message('min_length', '{field} must have at least {param} characters.'); + +On a field with the human name Username and a rule of min_length[5], an +error would display: "Username must have at least 5 characters." + +.. note:: The old method of using **%s** in your error messages will +still work, however it will override the tags above. You should use +one or the other. In the "callback" example above, the error message was set by passing the name of the function:: @@ -571,7 +578,7 @@ Try it! Change your form so that it looks like this:: If there are no errors, nothing will be shown. If there is an error, the message will appear. -**Important Note:** If you use an array as the name of a form field, you +.. note:: **Important Note:** If you use an array as the name of a form field, you must supply it as an array to the function. Example:: @@ -723,7 +730,6 @@ function named signup. Here's what your class might look like:: } } } - ?> In your validation config file, you will name your rule group member/signup:: From 342a466b4739b9c3dd05c417d1ae56f0ca14fd8d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 24 Jan 2012 15:24:00 +0200 Subject: [PATCH 0304/5397] Revert a space in the license agreement :) --- system/database/drivers/oci8/oci8_driver.php | 2 +- system/database/drivers/oci8/oci8_forge.php | 2 +- system/database/drivers/oci8/oci8_result.php | 2 +- system/database/drivers/oci8/oci8_utility.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 76aca9a660c..58d9b9ba385 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index 6b9a8e8fd89..35587a9ccf4 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index 221ab2c5f8b..7781b5bbd50 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it diff --git a/system/database/drivers/oci8/oci8_utility.php b/system/database/drivers/oci8/oci8_utility.php index 38d870aa6ac..3fee6a1b6f4 100644 --- a/system/database/drivers/oci8/oci8_utility.php +++ b/system/database/drivers/oci8/oci8_utility.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it From f20fb98b36cba430e20eea931e9be392031923ea Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 24 Jan 2012 15:26:01 +0200 Subject: [PATCH 0305/5397] Revert a space in the license agreement :) --- system/database/drivers/sqlite3/sqlite3_driver.php | 2 +- system/database/drivers/sqlite3/sqlite3_forge.php | 2 +- system/database/drivers/sqlite3/sqlite3_result.php | 2 +- system/database/drivers/sqlite3/sqlite3_utility.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index 8a7dbe1f10e..b14e06c5da6 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php index 07c25515a14..a949701808f 100644 --- a/system/database/drivers/sqlite3/sqlite3_forge.php +++ b/system/database/drivers/sqlite3/sqlite3_forge.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php index e8e3706cd54..acda28e6a15 100644 --- a/system/database/drivers/sqlite3/sqlite3_result.php +++ b/system/database/drivers/sqlite3/sqlite3_result.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it diff --git a/system/database/drivers/sqlite3/sqlite3_utility.php b/system/database/drivers/sqlite3/sqlite3_utility.php index eae65258211..bc9898ee48e 100644 --- a/system/database/drivers/sqlite3/sqlite3_utility.php +++ b/system/database/drivers/sqlite3/sqlite3_utility.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it From ed6531362e9eb98eeb477c63e3c365f79333e724 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 24 Jan 2012 15:26:42 +0200 Subject: [PATCH 0306/5397] Revert a space in the license agreement :) --- system/libraries/Encrypt.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php index 7c8720fd644..f6eea3b7e33 100644 --- a/system/libraries/Encrypt.php +++ b/system/libraries/Encrypt.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it From 51a22815994cfd4522c78177e41f064ab8e53415 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 24 Jan 2012 15:27:34 +0200 Subject: [PATCH 0307/5397] Revert a space in the license agreement :) --- system/helpers/array_helper.php | 2 +- system/helpers/captcha_helper.php | 2 +- system/helpers/cookie_helper.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/system/helpers/array_helper.php b/system/helpers/array_helper.php index 82f0eb16ceb..45eaa4c1011 100644 --- a/system/helpers/array_helper.php +++ b/system/helpers/array_helper.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 3b62da92922..c302a828b02 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php index f32a1a5ae73..af2e1df80f7 100644 --- a/system/helpers/cookie_helper.php +++ b/system/helpers/cookie_helper.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it From c5a1f93ef25c99df4035ef7182a6200b91afabab Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 24 Jan 2012 15:29:02 +0200 Subject: [PATCH 0308/5397] Revert a space in the license agreement :) --- system/helpers/smiley_helper.php | 2 +- system/helpers/string_helper.php | 2 +- system/helpers/text_helper.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php index d2b8936aed3..cb902114e8b 100644 --- a/system/helpers/smiley_helper.php +++ b/system/helpers/smiley_helper.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php index d0948800b7e..0d1018f536d 100644 --- a/system/helpers/string_helper.php +++ b/system/helpers/string_helper.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index 2d6da73acdd..37b5d3178b7 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it From a3d19c4ac63c4af1c2b823b0962e6be79e89d186 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 24 Jan 2012 15:29:29 +0200 Subject: [PATCH 0309/5397] Revert a space in the license agreement :) --- system/libraries/Image_lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 065f479e885..5ea830fb1eb 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it From 1841e6b472820deb2dfe4d43c675211eeabbd057 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 24 Jan 2012 15:30:01 +0200 Subject: [PATCH 0310/5397] Revert a space in the license agreement :) --- system/libraries/Zip.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index 85a0b5ce9ba..e7c55de1b11 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it From b998f3e820c724f16f3b700f094c875af1d28c0f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 24 Jan 2012 15:31:26 +0200 Subject: [PATCH 0311/5397] Revert a space in the license agreement :) --- system/libraries/Form_validation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 34b7b646db9..20f1faf27c5 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it From f863a02e314813753662106459e93f6675b1566e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 24 Jan 2012 15:31:54 +0200 Subject: [PATCH 0312/5397] Revert a space in the license agreement :) --- system/libraries/Session.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session.php b/system/libraries/Session.php index c331d99f785..66b39a6a20d 100644 --- a/system/libraries/Session.php +++ b/system/libraries/Session.php @@ -9,7 +9,7 @@ * Licensed under the Open Software License version 3.0 * * This source file is subject to the Open Software License (OSL 3.0) that is - * bundled with this package in the files license.txt / license.rst. It is + * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: * http://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to obtain it From e943bc418b1a233fce98fa5ae80d0873e1e5245f Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Tue, 24 Jan 2012 10:37:06 -0500 Subject: [PATCH 0313/5397] Cleaned up a few things in PDO driver --- system/database/drivers/pdo/pdo_driver.php | 71 ++++++++++++---------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 457cf714ad2..3d54126000f 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -43,6 +43,8 @@ class CI_DB_pdo_driver extends CI_DB { var $dbdriver = 'pdo'; + var $pdo_driver = ''; + var $dsn = ''; // the character used to excape - not necessary for PDO var $_escape_char = ''; @@ -64,39 +66,44 @@ 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 = ''; + $host = explode(":", $this->hostname); + $this->pdo_driver = $host[0]; + + $this->dsn = $this->hostname; + + switch($this->pdo_driver) + { + case "mysql": + $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->dsn .= ";charset={$this->char_set}"; + } + + //Set the charset with the connection options + $this->options['PDO::MYSQL_ATTR_INIT_COMMAND'] = "SET NAMES {$this->char_set}"; + break; - //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}"; - } + case "odbc": + $this->_like_escape_str = " {escape '%s'} "; + $this->_like_escape_chr = '!'; + break; - //Set the charset with the connection options - $this->options['PDO::MYSQL_ATTR_INIT_COMMAND'] = "SET NAMES {$this->char_set}"; - } - else if (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 = '!'; - } - - if (strpos($this->hostname, 'sqlite') === FALSE) - { - $this->hostname .= ";dbname=".$this->database; + case "sqlite": + + break; + + default: + $this->_like_escape_str = " ESCAPE '%s' "; + $this->_like_escape_chr = '!'; + break; } + $this->dsn .= ";dbname=".$this->database; $this->trans_enabled = FALSE; - $this->_random_keyword = ' RND('.time().')'; // database specific random keyword } @@ -110,7 +117,7 @@ function db_connect() { $this->options['PDO::ATTR_ERRMODE'] = PDO::ERRMODE_SILENT; - return new PDO($this->hostname, $this->username, $this->password, $this->options); + return new PDO($this->dsn, $this->username, $this->password, $this->options); } // -------------------------------------------------------------------- @@ -126,7 +133,7 @@ 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); + return new PDO($this->dsn, $this->username, $this->password, $this->options); } // -------------------------------------------------------------------- @@ -379,7 +386,7 @@ function affected_rows() function insert_id($name=NULL) { //Convenience method for postgres insertid - if (strpos($this->hostname, 'pgsql') !== FALSE) + if ($this->pdo_driver === "pgsql") { $v = $this->_version(); @@ -769,7 +776,7 @@ function _delete($table, $where = array(), $like = array(), $limit = FALSE) */ function _limit($sql, $limit, $offset) { - if (strpos($this->hostname, 'cubrid') !== FALSE || strpos($this->hostname, 'sqlite') !== FALSE) + if ($this->pdo_driver === "cubrid" || $this->pdo_driver === "sqlite") { if ($offset == 0) { From de15a0b7377db0ef3b1d43508401be3c2927c0ff Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Tue, 24 Jan 2012 16:26:11 -0500 Subject: [PATCH 0314/5397] Revert "Cleaned up a few things in PDO driver" This reverts commit e943bc418b1a233fce98fa5ae80d0873e1e5245f. --- system/database/drivers/pdo/pdo_driver.php | 71 ++++++++++------------ 1 file changed, 32 insertions(+), 39 deletions(-) diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 3d54126000f..457cf714ad2 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -43,8 +43,6 @@ class CI_DB_pdo_driver extends CI_DB { var $dbdriver = 'pdo'; - var $pdo_driver = ''; - var $dsn = ''; // the character used to excape - not necessary for PDO var $_escape_char = ''; @@ -66,44 +64,39 @@ function __construct($params) { parent::__construct($params); - $host = explode(":", $this->hostname); - $this->pdo_driver = $host[0]; - - $this->dsn = $this->hostname; - - switch($this->pdo_driver) - { - case "mysql": - $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->dsn .= ";charset={$this->char_set}"; - } - - //Set the charset with the connection options - $this->options['PDO::MYSQL_ATTR_INIT_COMMAND'] = "SET NAMES {$this->char_set}"; - break; - - case "odbc": - $this->_like_escape_str = " {escape '%s'} "; - $this->_like_escape_chr = '!'; - break; + // clause and character used for LIKE escape sequences + if (strpos($this->hostname, 'mysql') !== FALSE) + { + $this->_like_escape_str = ''; + $this->_like_escape_chr = ''; - case "sqlite": - - break; + //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}"; + } - default: - $this->_like_escape_str = " ESCAPE '%s' "; - $this->_like_escape_chr = '!'; - break; + //Set the charset with the connection options + $this->options['PDO::MYSQL_ATTR_INIT_COMMAND'] = "SET NAMES {$this->char_set}"; + } + else if (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 = '!'; + } + + if (strpos($this->hostname, 'sqlite') === FALSE) + { + $this->hostname .= ";dbname=".$this->database; } - $this->dsn .= ";dbname=".$this->database; $this->trans_enabled = FALSE; + $this->_random_keyword = ' RND('.time().')'; // database specific random keyword } @@ -117,7 +110,7 @@ function db_connect() { $this->options['PDO::ATTR_ERRMODE'] = PDO::ERRMODE_SILENT; - return new PDO($this->dsn, $this->username, $this->password, $this->options); + return new PDO($this->hostname, $this->username, $this->password, $this->options); } // -------------------------------------------------------------------- @@ -133,7 +126,7 @@ function db_pconnect() $this->options['PDO::ATTR_ERRMODE'] = PDO::ERRMODE_SILENT; $this->options['PDO::ATTR_PERSISTENT'] = TRUE; - return new PDO($this->dsn, $this->username, $this->password, $this->options); + return new PDO($this->hostname, $this->username, $this->password, $this->options); } // -------------------------------------------------------------------- @@ -386,7 +379,7 @@ function affected_rows() function insert_id($name=NULL) { //Convenience method for postgres insertid - if ($this->pdo_driver === "pgsql") + if (strpos($this->hostname, 'pgsql') !== FALSE) { $v = $this->_version(); @@ -776,7 +769,7 @@ function _delete($table, $where = array(), $like = array(), $limit = FALSE) */ function _limit($sql, $limit, $offset) { - if ($this->pdo_driver === "cubrid" || $this->pdo_driver === "sqlite") + if (strpos($this->hostname, 'cubrid') !== FALSE || strpos($this->hostname, 'sqlite') !== FALSE) { if ($offset == 0) { From c8efb8033ae775a5c1c840f867def4e6253b3d9a Mon Sep 17 00:00:00 2001 From: "Thor (atiredmachine)" Date: Tue, 24 Jan 2012 13:33:39 -0800 Subject: [PATCH 0315/5397] Output class now sets HTTP headers match caching settings. --- system/core/Output.php | 45 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/system/core/Output.php b/system/core/Output.php index abd8a0ea9d1..1f214a0b392 100755 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -466,6 +466,9 @@ public function _write_cache($output) @chmod($cache_path, FILE_WRITE_MODE); log_message('debug', 'Cache file written: '.$cache_path); + + // Send HTTP cache-control headers to browser to match file cache settings. + $this->set_cache_header($_SERVER['REQUEST_TIME'],$expire); } // -------------------------------------------------------------------- @@ -503,13 +506,22 @@ public function _display_cache(&$CFG, &$URI) return FALSE; } - // Has the file expired? If so we'll delete it. - if (time() >= trim(str_replace('TS--->', '', $match[1])) && is_really_writable($cache_path)) + $last_modified = filemtime($cache_path); + $expire = trim(str_replace('TS--->', '', $match[1])); + + // Has the file expired? + if ($_SERVER['REQUEST_TIME'] >= $expire && is_really_writable($cache_path)) { + // If so we'll delete it. @unlink($filepath); log_message('debug', 'Cache file has expired. File deleted.'); return FALSE; } + else + { + // Or else send the HTTP cache control headers. + $this->set_cache_header($last_modified,$expire); + } // Display the cache $this->_display(str_replace($match[0], '', $cache)); @@ -517,6 +529,35 @@ public function _display_cache(&$CFG, &$URI) return TRUE; } + + // -------------------------------------------------------------------- + /** + * Set the HTTP headers to match the server-side file cache settings + * in order to reduce bandwidth. + * + * @param int timestamp of when the page was last modified + * @param int timestamp of when should the requested page expire from cache + * @return void + */ + public function set_cache_header($last_modified,$expiration) + { + $max_age = $expiration - $_SERVER['REQUEST_TIME']; + + if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && ($last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))) + { + $this->set_status_header(304); + exit; + } + else + { + header('Pragma: public'); + header('Cache-Control: max-age=' . $max_age . ', public'); + header('Expires: '.gmdate('D, d M Y H:i:s', $expiration).' GMT'); + header('Last-modified: '.gmdate('D, d M Y H:i:s', $last_modified).' GMT'); + } + } + + } /* End of file Output.php */ From 63678a27864fdd6bb0ed89e6940a1d331121072a Mon Sep 17 00:00:00 2001 From: "Thor (atiredmachine)" Date: Tue, 24 Jan 2012 16:56:01 -0800 Subject: [PATCH 0316/5397] Rudimentary minifying of output. --- application/config/config.php | 13 +++++++++++++ system/core/Output.php | 36 +++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/application/config/config.php b/application/config/config.php index 17b854b29b7..3231f1d19b3 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -355,6 +355,18 @@ */ $config['compress_output'] = FALSE; +/* +|-------------------------------------------------------------------------- +| Minify +|-------------------------------------------------------------------------- +| +| Removes extra characters (usually unnecessary spaces) from your +| output for faster page load speeds. Makes your outputted HTML source +| code less readable. +| +*/ +$config['minify_output'] = FALSE; + /* |-------------------------------------------------------------------------- | Master Time Reference @@ -396,5 +408,6 @@ $config['proxy_ips'] = ''; + /* End of file config.php */ /* Location: ./application/config/config.php */ diff --git a/system/core/Output.php b/system/core/Output.php index 1f214a0b392..55a505c3498 100755 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -323,6 +323,15 @@ public function _display($output = '') { $output =& $this->final_output; } + + // -------------------------------------------------------------------- + + // Is minify requested? + if ($CFG->item('minify_output') === TRUE) + { + $output = $this->minify($output); + } + // -------------------------------------------------------------------- @@ -558,6 +567,33 @@ public function set_cache_header($last_modified,$expiration) } + + + // -------------------------------------------------------------------- + /** + * Reduce excessive size of HTML content. + * + * @param string + * @param string + * @return string + */ + public function minify($output,$type='html') + { + switch ($type) + { + case 'html': + + // Replaces multiple spaces with a single space. + $output = preg_replace('!\s{2,}!',' ',$output); + + // ... + break; + } + + return $output; + } + + } /* End of file Output.php */ From 79db4cdba1a1a80634cd76ab8fc69fce7b1a7ea6 Mon Sep 17 00:00:00 2001 From: "Thor (atiredmachine)" Date: Tue, 24 Jan 2012 20:44:51 -0800 Subject: [PATCH 0317/5397] Improved minifier to restore
     contents, remove
     even more spaces, and process CSS with its own rules.
    
    ---
     system/core/Output.php | 35 ++++++++++++++++++++++++++++++++++-
     1 file changed, 34 insertions(+), 1 deletion(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index 55a505c3498..bb39a7f318c 100755
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -582,12 +582,45 @@ public function minify($output,$type='html')
     		switch ($type)
     		{
     			case 'html':
    +			
    +				// Keep track of 
     tags as they were before processing.
    +				// We'll want to return them to this state later.
    +				preg_match_all('{}msU',$output,$pres_clean);
    +
    +				// Keep track of 
     tags as they were before processing.
    +				// We'll want to return them to this state later.
    +				preg_match_all('{}msU',$output,$style_clean);
     				
    +				// Run }msU',$output,$style_clean);
    -				
    -				// Run }msU',$output,$style_clean);
     				foreach ($style_clean[0] as $s)
     				{
    -					$output = str_replace($s, $this->minify($s,'css'), $output);
    +					$output = str_replace($s, $this->minify($s,'text/css'), $output);
     				}
     
     				// Replace multiple spaces with a single space.
    @@ -614,7 +614,7 @@ public function minify($output,$type='html')
     			break;
     			
     			
    -			case 'css':
    +			case 'text/css':
     			
     				// Remove spaces around curly brackets, colons, and semi-colons
     				$output = preg_replace('!\s*(:|;|}|{)\s*!','$1',$output);
    
    From 5de117549f69465a1ce0f2e128428d9adadd8a6d Mon Sep 17 00:00:00 2001
    From: "Thor (atiredmachine)" 
    Date: Tue, 24 Jan 2012 22:08:36 -0800
    Subject: [PATCH 0321/5397] Strips out HTML comments.
    
    ---
     system/core/Output.php | 3 +++
     1 file changed, 3 insertions(+)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index 47c00acd8bb..8992fc1f119 100755
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -600,6 +600,9 @@ public function minify($output,$type='text/html')
     				// Replace multiple spaces with a single space.
     				$output = preg_replace('!\s{2,}!',"\n",$output);
     				
    +				// Remove comments (non-MSIE conditionals)
    +				$output = preg_replace('{\s*\s*}msU','',$output);
    +
     				// Remove spaces around block-level elements.
     				$output = preg_replace('{\s*()\s*}', '$1', $output);
     
    
    From f59ec6fe4fab3bd5ff71d920e13f983454a9fb65 Mon Sep 17 00:00:00 2001
    From: "Thor (atiredmachine)" 
    Date: Tue, 24 Jan 2012 22:19:14 -0800
    Subject: [PATCH 0322/5397] Logs 'debug' message that shows how much % was
     shaved off.
    
    ---
     system/core/Output.php | 9 ++++++++-
     1 file changed, 8 insertions(+), 1 deletion(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index 8992fc1f119..c95f551ec88 100755
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -582,7 +582,9 @@ public function minify($output,$type='text/html')
     		switch ($type)
     		{
     			case 'text/html':
    -			
    +
    +				$size_before = strlen($output);
    +
     				// Keep track of 
      and }msU',$output,$textareas_clean);
    +				preg_match_all('{}msU', $output, $pres_clean);
    +				preg_match_all('{}msU', $output, $codes_clean);
    +				preg_match_all('{}msU', $output, $textareas_clean);
     
     				// Minify the CSS in all the }msU',$output,$style_clean);
    +				preg_match_all('{}msU', $output, $style_clean);
     				foreach ($style_clean[0] as $s)
     				{
     					$output = str_replace($s, $this->minify($s,'text/css'), $output);
     				}
     
     				// Replace multiple spaces with a single space.
    -				$output = preg_replace('!\s{2,}!',"\n",$output);
    +				$output = preg_replace('!\s{2,}!', "\n", $output);
     				
     				// Remove comments (non-MSIE conditionals)
    -				$output = preg_replace('{\s*\s*}msU','',$output);
    +				$output = preg_replace('{\s*\s*}msU', '', $output);
     
     				// Remove spaces around block-level elements.
     				$output = preg_replace('{\s*()\s*}', '$1', $output);
     
     				// Replace mangled 
     etc. tags with unprocessed ones.
    -				preg_match_all('{}msU',$output,$pres_messed);
    -				preg_match_all('{}msU',$output,$codes_messed);
    -				preg_match_all('{}msU',$output,$textareas_messed);
    -				$output = str_replace($pres_messed[0],$pres_clean[0],$output);
    -				$output = str_replace($codes_messed[0],$codes_clean[0],$output);
    -				$output = str_replace($textareas_messed[0],$textareas_clean[0],$output);
    +				preg_match_all('{}msU', $output, $pres_messed);
    +				preg_match_all('{}msU', $output, $codes_messed);
    +				preg_match_all('{}msU', $output, $textareas_messed);
    +				$output = str_replace($pres_messed[0], $pres_clean[0], $output);
    +				$output = str_replace($codes_messed[0], $codes_clean[0], $output);
    +				$output = str_replace($textareas_messed[0], $textareas_clean[0], $output);
     				
     				$size_after = strlen($output);
     				$savings_percent = round(100 - ($size_after / $size_before * 100));
    @@ -640,10 +635,10 @@ public function minify($output,$type='text/html')
     			case 'text/css':
     			
     				// Remove spaces around curly brackets, colons, and semi-colons
    -				$output = preg_replace('!\s*(:|;|}|{)\s*!','$1',$output);
    +				$output = preg_replace('!\s*(:|;|}|{)\s*!', '$1', $output);
     				
     				// Replace spaces with line breaks to limit line lengths
    -				$output = preg_replace('!\s+!',"\n",$output);
    +				$output = preg_replace('!\s+!', "\n", $output);
     
     			break;
     		}
    
    From a3ed086e74f6ea2fc8a529e02e509bbf91dd13c5 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Wed, 25 Jan 2012 14:46:52 +0200
    Subject: [PATCH 0326/5397] Remove an access description line and switch
     private to protected
    
    ---
     system/database/drivers/sqlite3/sqlite3_driver.php | 2 +-
     system/database/drivers/sqlite3/sqlite3_result.php | 1 -
     2 files changed, 1 insertion(+), 2 deletions(-)
    
    diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php
    index b14e06c5da6..2e6589b5272 100644
    --- a/system/database/drivers/sqlite3/sqlite3_driver.php
    +++ b/system/database/drivers/sqlite3/sqlite3_driver.php
    @@ -174,7 +174,7 @@ protected function _execute($sql)
     	 * @param	string	an SQL query
     	 * @return	string
     	 */
    -	private function _prep_query($sql)
    +	protected function _prep_query($sql)
     	{
     		return $this->conn_id->prepare($sql);
     	}
    diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php
    index acda28e6a15..c88696328b9 100644
    --- a/system/database/drivers/sqlite3/sqlite3_result.php
    +++ b/system/database/drivers/sqlite3/sqlite3_result.php
    @@ -153,7 +153,6 @@ protected function _fetch_assoc()
     	 *
     	 * Returns the result set as an object
     	 *
    -	 * @access	private
     	 * @return	object
     	 */
     	protected function _fetch_object()
    
    From af5d5586a5040de24335e483edb17a2657ddeb21 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Wed, 25 Jan 2012 21:34:47 +0200
    Subject: [PATCH 0327/5397] Improve the base database driver class
    
    ---
     system/database/DB_driver.php       | 502 +++++++++++-----------------
     user_guide_src/source/changelog.rst |   1 +
     2 files changed, 190 insertions(+), 313 deletions(-)
    
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index 661b42ced81..d9d83d55def 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -1,13 +1,13 @@
    -conn_id) OR is_object($this->conn_id))
    +		/* If an established connection is available, then there's
    +		 * no need to connect and select the database.
    +		 *
    +		 * Depending on the database driver, conn_id can be either
    +		 * boolean TRUE, a resource or an object.
    +		 */
    +		if ($this->conn_id)
     		{
     			return TRUE;
     		}
    @@ -126,7 +123,7 @@ function initialize()
     		// Connect to the database and set the connection ID
     		$this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect();
     
    -		// No connection resource?  Check if there is a failover else throw an error
    +		// No connection resource? Check if there is a failover else throw an error
     		if ( ! $this->conn_id)
     		{
     			// Check if there is a failover set
    @@ -200,12 +197,11 @@ function initialize()
     	/**
     	 * Set client character set
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @param	string
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function db_set_charset($charset, $collation)
    +	public function db_set_charset($charset, $collation)
     	{
     		if ( ! $this->_db_set_charset($this->char_set, $this->dbcollat))
     		{
    @@ -227,10 +223,9 @@ function db_set_charset($charset, $collation)
     	/**
     	 * The name of the platform in use (mysql, mssql, etc...)
     	 *
    -	 * @access	public
     	 * @return	string
     	 */
    -	function platform()
    +	public function platform()
     	{
     		return $this->dbdriver;
     	}
    @@ -238,21 +233,16 @@ function platform()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Database Version Number.  Returns a string containing the
    +	 * Database Version Number. Returns a string containing the
     	 * version of the database being used
     	 *
    -	 * @access	public
     	 * @return	string
     	 */
    -	function version()
    +	public function version()
     	{
     		if (FALSE === ($sql = $this->_version()))
     		{
    -			if ($this->db_debug)
    -			{
    -				return $this->display_error('db_unsupported_function');
    -			}
    -			return FALSE;
    +			return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE;
     		}
     
     		// Some DBs have functions that return the version, and don't run special
    @@ -266,7 +256,8 @@ function version()
     		else
     		{
     			$query = $this->query($sql);
    -			return $query->row('ver');
    +			$query = $query->row();
    +			return $query->ver;
     		}
     	}
     
    @@ -281,42 +272,34 @@ function version()
     	 * FALSE upon failure, and if the $db_debug variable is set to TRUE
     	 * will raise an error.
     	 *
    -	 * @access	public
     	 * @param	string	An SQL query string
     	 * @param	array	An array of binding data
     	 * @return	mixed
     	 */
    -	function query($sql, $binds = FALSE, $return_object = TRUE)
    +	public function query($sql, $binds = FALSE, $return_object = TRUE)
     	{
     		if ($sql == '')
     		{
     			log_message('error', 'Invalid query: '.$sql);
     
    -			if ($this->db_debug)
    -			{
    -				return $this->display_error('db_invalid_query');
    -			}
    -			return FALSE;
    +			return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE;
     		}
     
     		// Verify table prefix and replace if necessary
    -		if ( ($this->dbprefix != '' AND $this->swap_pre != '') AND ($this->dbprefix != $this->swap_pre) )
    +		if ( ($this->dbprefix != '' && $this->swap_pre != '') && ($this->dbprefix != $this->swap_pre) )
     		{
    -			$sql = preg_replace("/(\W)".$this->swap_pre."(\S+?)/", "\\1".$this->dbprefix."\\2", $sql);
    +			$sql = preg_replace('/(\W)'.$this->swap_pre.'(\S+?)/', '\\1'.$this->dbprefix.'\\2', $sql);
     		}
     
    -		// Is query caching enabled?  If the query is a "read type"
    +		// Is query caching enabled? If the query is a "read type"
     		// we will load the caching class and return the previously
     		// cached query if it exists
    -		if ($this->cache_on == TRUE AND stristr($sql, 'SELECT'))
    +		if ($this->cache_on == TRUE && stripos($sql, 'SELECT') !== FALSE && $this->_cache_init())
     		{
    -			if ($this->_cache_init())
    +			$this->load_rdriver();
    +			if (FALSE !== ($cache = $this->CACHE->read($sql)))
     			{
    -				$this->load_rdriver();
    -				if (FALSE !== ($cache = $this->CACHE->read($sql)))
    -				{
    -					return $cache;
    -				}
    +				return $cache;
     			}
     		}
     
    @@ -326,7 +309,7 @@ function query($sql, $binds = FALSE, $return_object = TRUE)
     			$sql = $this->compile_binds($sql, $binds);
     		}
     
    -		// Save the  query for debugging
    +		// Save the query for debugging
     		if ($this->save_queries == TRUE)
     		{
     			$this->queries[] = $sql;
    @@ -357,19 +340,13 @@ function query($sql, $binds = FALSE, $return_object = TRUE)
     			if ($this->db_debug)
     			{
     				// We call this function in order to roll-back queries
    -				// if transactions are enabled.  If we don't call this here
    +				// if transactions are enabled. If we don't call this here
     				// the error message will trigger an exit, causing the
     				// transactions to remain in limbo.
     				$this->trans_complete();
     
     				// Display errors
    -				return $this->display_error(
    -										array(
    -												'Error Number: '.$error_no,
    -												$error_msg,
    -												$sql
    -											)
    -										);
    +				return $this->display_error(array('Error Number: '.$error_no, $error_msg, $sql));
     			}
     
     			return FALSE;
    @@ -393,7 +370,7 @@ function query($sql, $binds = FALSE, $return_object = TRUE)
     		{
     			// If caching is enabled we'll auto-cleanup any
     			// existing files related to this particular URI
    -			if ($this->cache_on == TRUE AND $this->cache_autodel == TRUE AND $this->_cache_init())
    +			if ($this->cache_on == TRUE && $this->cache_autodel == TRUE && $this->_cache_init())
     			{
     				$this->CACHE->delete();
     			}
    @@ -410,13 +387,12 @@ function query($sql, $binds = FALSE, $return_object = TRUE)
     		}
     
     		// Load and instantiate the result driver
    -
    -		$driver			= $this->load_rdriver();
    -		$RES			= new $driver();
    +		$driver		= $this->load_rdriver();
    +		$RES		= new $driver();
     		$RES->conn_id	= $this->conn_id;
     		$RES->result_id	= $this->result_id;
     
    -		if ($this->dbdriver == 'oci8')
    +		if ($this->dbdriver === 'oci8')
     		{
     			$RES->stmt_id		= $this->stmt_id;
     			$RES->curs_id		= NULL;
    @@ -427,9 +403,9 @@ function query($sql, $binds = FALSE, $return_object = TRUE)
     		// oci8 vars must be set before calling this
     		$RES->num_rows	= $RES->num_rows();
     
    -		// Is query caching enabled?  If so, we'll serialize the
    +		// Is query caching enabled? If so, we'll serialize the
     		// result object and save it to a cache file.
    -		if ($this->cache_on == TRUE AND $this->_cache_init())
    +		if ($this->cache_on == TRUE && $this->_cache_init())
     		{
     			// We'll create a new instance of the result object
     			// only without the platform specific driver since
    @@ -438,9 +414,9 @@ function query($sql, $binds = FALSE, $return_object = TRUE)
     			// result object, so we'll have to compile the data
     			// and save it)
     			$CR = new CI_DB_result();
    -			$CR->num_rows		= $RES->num_rows();
     			$CR->result_object	= $RES->result_object();
     			$CR->result_array	= $RES->result_array();
    +			$CR->num_rows		= $RES->num_rows();
     
     			// Reset these since cached objects can not utilize resource IDs.
     			$CR->conn_id		= NULL;
    @@ -457,10 +433,9 @@ function query($sql, $binds = FALSE, $return_object = TRUE)
     	/**
     	 * Load the result drivers
     	 *
    -	 * @access	public
     	 * @return	string	the name of the result class
     	 */
    -	function load_rdriver()
    +	public function load_rdriver()
     	{
     		$driver = 'CI_DB_'.$this->dbdriver.'_result';
     
    @@ -477,15 +452,14 @@ function load_rdriver()
     
     	/**
     	 * Simple Query
    -	 * This is a simplified version of the query() function.  Internally
    +	 * This is a simplified version of the query() function. Internally
     	 * we only use it when running transaction commands since they do
     	 * not require all the features of the main query() function.
     	 *
    -	 * @access	public
     	 * @param	string	the sql query
     	 * @return	mixed
     	 */
    -	function simple_query($sql)
    +	public function simple_query($sql)
     	{
     		if ( ! $this->conn_id)
     		{
    @@ -501,10 +475,9 @@ function simple_query($sql)
     	 * Disable Transactions
     	 * This permits transactions to be disabled at run-time.
     	 *
    -	 * @access	public
     	 * @return	void
     	 */
    -	function trans_off()
    +	public function trans_off()
     	{
     		$this->trans_enabled = FALSE;
     	}
    @@ -518,10 +491,9 @@ function trans_off()
     	 * If strict mode is disabled, each group is treated autonomously, meaning
     	 * a failure of one group will not affect any others
     	 *
    -	 * @access	public
     	 * @return	void
     	 */
    -	function trans_strict($mode = TRUE)
    +	public function trans_strict($mode = TRUE)
     	{
     		$this->trans_strict = is_bool($mode) ? $mode : TRUE;
     	}
    @@ -531,10 +503,9 @@ function trans_strict($mode = TRUE)
     	/**
     	 * Start Transaction
     	 *
    -	 * @access	public
     	 * @return	void
     	 */
    -	function trans_start($test_mode = FALSE)
    +	public function trans_start($test_mode = FALSE)
     	{
     		if ( ! $this->trans_enabled)
     		{
    @@ -557,10 +528,9 @@ function trans_start($test_mode = FALSE)
     	/**
     	 * Complete Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_complete()
    +	public function trans_complete()
     	{
     		if ( ! $this->trans_enabled)
     		{
    @@ -604,10 +574,9 @@ function trans_complete()
     	/**
     	 * Lets you retrieve the transaction flag to determine if it has failed
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_status()
    +	public function trans_status()
     	{
     		return $this->_trans_status;
     	}
    @@ -617,12 +586,11 @@ function trans_status()
     	/**
     	 * Compile Bindings
     	 *
    -	 * @access	public
     	 * @param	string	the sql statement
     	 * @param	array	an array of bind data
     	 * @return	string
     	 */
    -	function compile_binds($sql, $binds)
    +	public function compile_binds($sql, $binds)
     	{
     		if (strpos($sql, $this->bind_marker) === FALSE)
     		{
    @@ -639,7 +607,8 @@ function compile_binds($sql, $binds)
     
     		// The count of bind should be 1 less then the count of segments
     		// If there are more bind arguments trim it down
    -		if (count($binds) >= count($segments)) {
    +		if (count($binds) >= count($segments))
    +		{
     			$binds = array_slice($binds, 0, count($segments)-1);
     		}
     
    @@ -648,8 +617,7 @@ function compile_binds($sql, $binds)
     		$i = 0;
     		foreach ($binds as $bind)
     		{
    -			$result .= $this->escape($bind);
    -			$result .= $segments[++$i];
    +			$result .= $this->escape($bind).$segments[++$i];
     		}
     
     		return $result;
    @@ -660,17 +628,12 @@ function compile_binds($sql, $binds)
     	/**
     	 * Determines if a query is a "write" type.
     	 *
    -	 * @access	public
     	 * @param	string	An SQL query string
    -	 * @return	boolean
    +	 * @return	bool
     	 */
    -	function is_write_type($sql)
    +	public function is_write_type($sql)
     	{
    -		if ( ! preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i', $sql))
    -		{
    -			return FALSE;
    -		}
    -		return TRUE;
    +		return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i', $sql);
     	}
     
     	// --------------------------------------------------------------------
    @@ -678,11 +641,10 @@ function is_write_type($sql)
     	/**
     	 * Calculate the aggregate query elapsed time
     	 *
    -	 * @access	public
    -	 * @param	integer	The number of decimal places
    -	 * @return	integer
    +	 * @param	int	The number of decimal places
    +	 * @return	int
     	 */
    -	function elapsed_time($decimals = 6)
    +	public function elapsed_time($decimals = 6)
     	{
     		return number_format($this->benchmark, $decimals);
     	}
    @@ -692,10 +654,9 @@ function elapsed_time($decimals = 6)
     	/**
     	 * Returns the total number of queries
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function total_queries()
    +	public function total_queries()
     	{
     		return $this->query_count;
     	}
    @@ -705,10 +666,9 @@ function total_queries()
     	/**
     	 * Returns the last query that was executed
     	 *
    -	 * @access	public
    -	 * @return	void
    +	 * @return	string
     	 */
    -	function last_query()
    +	public function last_query()
     	{
     		return end($this->queries);
     	}
    @@ -721,23 +681,22 @@ function last_query()
     	 * Escapes data based on type
     	 * Sets boolean and null types
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @return	mixed
     	 */
    -	function escape($str)
    +	public function escape($str)
     	{
     		if (is_string($str))
     		{
    -			$str = "'".$this->escape_str($str)."'";
    +			return "'".$this->escape_str($str)."'";
     		}
     		elseif (is_bool($str))
     		{
    -			$str = ($str === FALSE) ? 0 : 1;
    +			return ($str === FALSE) ? 0 : 1;
     		}
     		elseif (is_null($str))
     		{
    -			$str = 'NULL';
    +			return 'NULL';
     		}
     
     		return $str;
    @@ -751,11 +710,10 @@ function escape($str)
     	 * Calls the individual driver for platform
     	 * specific escaping for LIKE conditions
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @return	mixed
     	 */
    -	function escape_like_str($str)
    +	public function escape_like_str($str)
     	{
     		return $this->escape_str($str, TRUE);
     	}
    @@ -765,23 +723,16 @@ function escape_like_str($str)
     	/**
     	 * Primary
     	 *
    -	 * Retrieves the primary key.  It assumes that the row in the first
    +	 * Retrieves the primary key. It assumes that the row in the first
     	 * position is the primary key
     	 *
    -	 * @access	public
     	 * @param	string	the table name
     	 * @return	string
     	 */
    -	function primary($table = '')
    +	public function primary($table = '')
     	{
     		$fields = $this->list_fields($table);
    -
    -		if ( ! is_array($fields))
    -		{
    -			return FALSE;
    -		}
    -
    -		return current($fields);
    +		return is_array($fields) ? current($fields) : FALSE;
     	}
     
     	// --------------------------------------------------------------------
    @@ -789,10 +740,9 @@ function primary($table = '')
     	/**
     	 * Returns an array of table names
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function list_tables($constrain_by_prefix = FALSE)
    +	public function list_tables($constrain_by_prefix = FALSE)
     	{
     		// Is there a cached result?
     		if (isset($this->data_cache['table_names']))
    @@ -802,32 +752,17 @@ function list_tables($constrain_by_prefix = FALSE)
     
     		if (FALSE === ($sql = $this->_list_tables($constrain_by_prefix)))
     		{
    -			if ($this->db_debug)
    -			{
    -				return $this->display_error('db_unsupported_function');
    -			}
    -			return FALSE;
    +			return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE;
     		}
     
    -		$retval = array();
    +		$this->data_cache['table_names'] = array();
     		$query = $this->query($sql);
     
    -		if ($query->num_rows() > 0)
    +		foreach ($query->result_array() as $row)
     		{
    -			foreach ($query->result_array() as $row)
    -			{
    -				if (isset($row['TABLE_NAME']))
    -				{
    -					$retval[] = $row['TABLE_NAME'];
    -				}
    -				else
    -				{
    -					$retval[] = array_shift($row);
    -				}
    -			}
    +			$this->data_cache['table_names'][] = isset($row['TABLE_NAME']) ? $row['TABLE_NAME'] : array_shift($row);
     		}
     
    -		$this->data_cache['table_names'] = $retval;
     		return $this->data_cache['table_names'];
     	}
     
    @@ -835,12 +770,12 @@ function list_tables($constrain_by_prefix = FALSE)
     
     	/**
     	 * Determine if a particular table exists
    -	 * @access	public
    -	 * @return	boolean
    +	 *
    +	 * @return	bool
     	 */
    -	function table_exists($table_name)
    +	public function table_exists($table_name)
     	{
    -		return ( ! in_array($this->_protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables())) ? FALSE : TRUE;
    +		return in_array($this->_protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables());
     	}
     
     	// --------------------------------------------------------------------
    @@ -848,11 +783,10 @@ function table_exists($table_name)
     	/**
     	 * Fetch MySQL Field Names
     	 *
    -	 * @access	public
     	 * @param	string	the table name
     	 * @return	array
     	 */
    -	function list_fields($table = '')
    +	public function list_fields($table = '')
     	{
     		// Is there a cached result?
     		if (isset($this->data_cache['field_names'][$table]))
    @@ -862,38 +796,22 @@ function list_fields($table = '')
     
     		if ($table == '')
     		{
    -			if ($this->db_debug)
    -			{
    -				return $this->display_error('db_field_param_missing');
    -			}
    -			return FALSE;
    +			return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
     		}
     
     		if (FALSE === ($sql = $this->_list_columns($table)))
     		{
    -			if ($this->db_debug)
    -			{
    -				return $this->display_error('db_unsupported_function');
    -			}
    -			return FALSE;
    +			return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE;
     		}
     
     		$query = $this->query($sql);
    +		$this->data_cache['field_names'][$table] = array();
     
    -		$retval = array();
     		foreach ($query->result_array() as $row)
     		{
    -			if (isset($row['COLUMN_NAME']))
    -			{
    -				$retval[] = $row['COLUMN_NAME'];
    -			}
    -			else
    -			{
    -				$retval[] = current($row);
    -			}
    +			$this->data_cache['field_names'][$table][] = isset($row['COLUMN_NAME']) ? $row['COLUMN_NAME'] : current($row);
     		}
     
    -		$this->data_cache['field_names'][$table] = $retval;
     		return $this->data_cache['field_names'][$table];
     	}
     
    @@ -901,14 +819,14 @@ function list_fields($table = '')
     
     	/**
     	 * Determine if a particular field exists
    -	 * @access	public
    +	 *
     	 * @param	string
     	 * @param	string
    -	 * @return	boolean
    +	 * @return	bool
     	 */
    -	function field_exists($field_name, $table_name)
    +	public function field_exists($field_name, $table_name)
     	{
    -		return ( ! in_array($field_name, $this->list_fields($table_name))) ? FALSE : TRUE;
    +		return in_array($field_name, $this->list_fields($table_name));
     	}
     
     	// --------------------------------------------------------------------
    @@ -916,23 +834,17 @@ function field_exists($field_name, $table_name)
     	/**
     	 * Returns an object with field data
     	 *
    -	 * @access	public
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	mixed
     	 */
    -	function field_data($table = '')
    +	public function field_data($table = '')
     	{
     		if ($table == '')
     		{
    -			if ($this->db_debug)
    -			{
    -				return $this->display_error('db_field_param_missing');
    -			}
    -			return FALSE;
    +			return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
     		}
     
     		$query = $this->query($this->_field_data($this->_protect_identifiers($table, TRUE, NULL, FALSE)));
    -
     		return $query->field_data();
     	}
     
    @@ -941,15 +853,13 @@ function field_data($table = '')
     	/**
     	 * Generate an insert string
     	 *
    -	 * @access	public
     	 * @param	string	the table upon which the query will be performed
     	 * @param	array	an associative array data of key/values
     	 * @return	string
     	 */
    -	function insert_string($table, $data)
    +	public function insert_string($table, $data)
     	{
    -		$fields = array();
    -		$values = array();
    +		$fields = $values = array();
     
     		foreach ($data as $key => $val)
     		{
    @@ -965,17 +875,16 @@ function insert_string($table, $data)
     	/**
     	 * Generate an update string
     	 *
    -	 * @access	public
     	 * @param	string	the table upon which the query will be performed
     	 * @param	array	an associative array data of key/values
     	 * @param	mixed	the "where" statement
     	 * @return	string
     	 */
    -	function update_string($table, $data, $where)
    +	public function update_string($table, $data, $where)
     	{
     		if ($where == '')
     		{
    -			return false;
    +			return FALSE;
     		}
     
     		$fields = array();
    @@ -993,7 +902,7 @@ function update_string($table, $data, $where)
     			$dest = array();
     			foreach ($where as $key => $val)
     			{
    -				$prefix = (count($dest) == 0) ? '' : ' AND ';
    +				$prefix = (count($dest) === 0) ? '' : ' AND ';
     				$key = $this->_protect_identifiers($key);
     
     				if ($val !== '')
    @@ -1018,19 +927,12 @@ function update_string($table, $data, $where)
     	/**
     	 * Tests whether the string has an SQL operator
     	 *
    -	 * @access	private
     	 * @param	string
     	 * @return	bool
     	 */
    -	function _has_operator($str)
    +	protected function _has_operator($str)
     	{
    -		$str = trim($str);
    -		if ( ! preg_match("/(\s|<|>|!|=|is null|is not null)/i", $str))
    -		{
    -			return FALSE;
    -		}
    -
    -		return TRUE;
    +		return (bool) preg_match('/(\s|<|>|!|=|is null|is not null)/i', trim($str));
     	}
     
     	// --------------------------------------------------------------------
    @@ -1038,12 +940,11 @@ function _has_operator($str)
     	/**
     	 * Enables a native PHP function to be run, using a platform agnostic wrapper.
     	 *
    -	 * @access	public
     	 * @param	string	the function name
     	 * @param	mixed	any parameters needed by the function
     	 * @return	mixed
     	 */
    -	function call_function($function)
    +	public function call_function($function)
     	{
     		$driver = ($this->dbdriver == 'postgre') ? 'pg_' : $this->dbdriver.'_';
     
    @@ -1054,25 +955,12 @@ function call_function($function)
     
     		if ( ! function_exists($function))
     		{
    -			if ($this->db_debug)
    -			{
    -				return $this->display_error('db_unsupported_function');
    -			}
    -			return FALSE;
    +			return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE;
     		}
    -		else
    -		{
    -			$args = (func_num_args() > 1) ? array_splice(func_get_args(), 1) : null;
     
    -			if (is_null($args))
    -			{
    -				return call_user_func($function);
    -			}
    -			else
    -			{
    -				return call_user_func_array($function, $args);
    -			}
    -		}
    +		return (func_num_args() > 1)
    +			? call_user_func_array($function, array_splice(func_get_args(), 1))
    +			: call_user_func($function);
     	}
     
     	// --------------------------------------------------------------------
    @@ -1080,11 +968,10 @@ function call_function($function)
     	/**
     	 * Set Cache Directory Path
     	 *
    -	 * @access	public
     	 * @param	string	the path to the cache directory
     	 * @return	void
     	 */
    -	function cache_set_path($path = '')
    +	public function cache_set_path($path = '')
     	{
     		$this->cachedir = $path;
     	}
    @@ -1094,13 +981,11 @@ function cache_set_path($path = '')
     	/**
     	 * Enable Query Caching
     	 *
    -	 * @access	public
    -	 * @return	void
    +	 * @return	bool	cache_on value
     	 */
    -	function cache_on()
    +	public function cache_on()
     	{
    -		$this->cache_on = TRUE;
    -		return TRUE;
    +		return $this->cache_on = TRUE;
     	}
     
     	// --------------------------------------------------------------------
    @@ -1108,13 +993,11 @@ function cache_on()
     	/**
     	 * Disable Query Caching
     	 *
    -	 * @access	public
    -	 * @return	void
    +	 * @return	bool	cache_on value
     	 */
    -	function cache_off()
    +	public function cache_off()
     	{
    -		$this->cache_on = FALSE;
    -		return FALSE;
    +		return $this->cache_on = FALSE;
     	}
     
     
    @@ -1123,15 +1006,15 @@ function cache_off()
     	/**
     	 * Delete the cache files associated with a particular URI
     	 *
    -	 * @access	public
    -	 * @return	void
    +	 * @return	bool
     	 */
    -	function cache_delete($segment_one = '', $segment_two = '')
    +	public function cache_delete($segment_one = '', $segment_two = '')
     	{
     		if ( ! $this->_cache_init())
     		{
     			return FALSE;
     		}
    +
     		return $this->CACHE->delete($segment_one, $segment_two);
     	}
     
    @@ -1140,10 +1023,9 @@ function cache_delete($segment_one = '', $segment_two = '')
     	/**
     	 * Delete All cache files
     	 *
    -	 * @access	public
    -	 * @return	void
    +	 * @return	bool
     	 */
    -	function cache_delete_all()
    +	public function cache_delete_all()
     	{
     		if ( ! $this->_cache_init())
     		{
    @@ -1158,23 +1040,21 @@ function cache_delete_all()
     	/**
     	 * Initialize the Cache Class
     	 *
    -	 * @access	private
     	 * @return	void
     	 */
    -	function _cache_init()
    +	protected function _cache_init()
     	{
    -		if (is_object($this->CACHE) AND class_exists('CI_DB_Cache'))
    +		if (class_exists('CI_DB_Cache'))
     		{
    -			return TRUE;
    -		}
    -
    -		if ( ! class_exists('CI_DB_Cache'))
    -		{
    -			if ( ! @include(BASEPATH.'database/DB_cache.php'))
    +			if (is_object($this->CACHE))
     			{
    -				return $this->cache_off();
    +				return TRUE;
     			}
     		}
    +		elseif ( ! @include_once(BASEPATH.'database/DB_cache.php'))
    +		{
    +			return $this->cache_off();
    +		}
     
     		$this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects
     		return TRUE;
    @@ -1185,16 +1065,15 @@ function _cache_init()
     	/**
     	 * Close DB Connection
     	 *
    -	 * @access	public
     	 * @return	void
     	 */
    -	function close()
    +	public function close()
     	{
    -		if (is_resource($this->conn_id) OR is_object($this->conn_id))
    +		if ($this->conn_id)
     		{
     			$this->_close($this->conn_id);
    +			$this->conn_id = FALSE;
     		}
    -		$this->conn_id = FALSE;
     	}
     
     	// --------------------------------------------------------------------
    @@ -1202,13 +1081,12 @@ function close()
     	/**
     	 * Display an error message
     	 *
    -	 * @access	public
     	 * @param	string	the error message
     	 * @param	string	any "swap" values
    -	 * @param	boolean	whether to localize the message
    +	 * @param	bool	whether to localize the message
     	 * @return	string	sends the application/error_db.php template
     	 */
    -	function display_error($error = '', $swap = '', $native = FALSE)
    +	public function display_error($error = '', $swap = '', $native = FALSE)
     	{
     		$LANG =& load_class('Lang', 'core');
     		$LANG->load('db');
    @@ -1227,9 +1105,7 @@ function display_error($error = '', $swap = '', $native = FALSE)
     		// Find the most likely culprit of the error by going through
     		// the backtrace until the source file is no longer in the
     		// database folder.
    -
     		$trace = debug_backtrace();
    -
     		foreach ($trace as $call)
     		{
     			if (isset($call['file']) && strpos($call['file'], BASEPATH.'database') === FALSE)
    @@ -1237,7 +1113,6 @@ function display_error($error = '', $swap = '', $native = FALSE)
     				// Found it - use a relative path for safety
     				$message[] = 'Filename: '.str_replace(array(BASEPATH, APPPATH), '', $call['file']);
     				$message[] = 'Line Number: '.$call['line'];
    -
     				break;
     			}
     		}
    @@ -1254,11 +1129,10 @@ function display_error($error = '', $swap = '', $native = FALSE)
     	 *
     	 * This function adds backticks if appropriate based on db type
     	 *
    -	 * @access	private
     	 * @param	mixed	the item to escape
     	 * @return	mixed	the item with backticks
     	 */
    -	function protect_identifiers($item, $prefix_single = FALSE)
    +	public function protect_identifiers($item, $prefix_single = FALSE)
     	{
     		return $this->_protect_identifiers($item, $prefix_single);
     	}
    @@ -1271,8 +1145,8 @@ function protect_identifiers($item, $prefix_single = FALSE)
     	 * This function is used extensively by the Active Record class, and by
     	 * a couple functions in this class.
     	 * It takes a column or table name (optionally with an alias) and inserts
    -	 * the table prefix onto it.  Some logic is necessary in order to deal with
    -	 * column names that include the path.  Consider a query like this:
    +	 * the table prefix onto it. Some logic is necessary in order to deal with
    +	 * column names that include the path. Consider a query like this:
     	 *
     	 * SELECT * FROM hostname.database.table.column AS c FROM hostname.database.table
     	 *
    @@ -1285,14 +1159,16 @@ function protect_identifiers($item, $prefix_single = FALSE)
     	 * insert the table prefix (if it exists) in the proper position, and escape only
     	 * the correct identifiers.
     	 *
    -	 * @access	private
    +	 * NOTE: This is used by DB_forge drivers and therefore needs to be public.
    +	 *	 (until a better solution is implemented)
    +	 *
     	 * @param	string
     	 * @param	bool
     	 * @param	mixed
     	 * @param	bool
     	 * @return	string
     	 */
    -	function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE)
    +	public function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE)
     	{
     		if ( ! is_bool($protect_identifiers))
     		{
    @@ -1302,7 +1178,6 @@ function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifier
     		if (is_array($item))
     		{
     			$escaped_array = array();
    -
     			foreach ($item as $k => $v)
     			{
     				$escaped_array[$this->_protect_identifiers($k)] = $this->_protect_identifiers($v);
    @@ -1316,16 +1191,19 @@ function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifier
     
     		// If the item has an alias declaration we remove it and set it aside.
     		// Basically we remove everything to the right of the first space
    -		$alias = '';
     		if (strpos($item, ' ') !== FALSE)
     		{
    -			$alias = strstr($item, " ");
    +			$alias = strstr($item, ' ');
     			$item = substr($item, 0, - strlen($alias));
     		}
    +		else
    +		{
    +			$alias = '';
    +		}
     
     		// This is basically a bug fix for queries that use MAX, MIN, etc.
     		// If a parenthesis is found we know that we do not need to
    -		// escape the data or add a prefix.  There's probably a more graceful
    +		// escape the data or add a prefix. There's probably a more graceful
     		// way to deal with this, but I'm not thinking of it -- Rick
     		if (strpos($item, '(') !== FALSE)
     		{
    @@ -1340,7 +1218,7 @@ function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifier
     			$parts	= explode('.', $item);
     
     			// Does the first segment of the exploded item match
    -			// one of the aliases previously identified?  If so,
    +			// one of the aliases previously identified? If so,
     			// we have nothing more to do other than escape the item
     			if (in_array($parts[0], $this->ar_aliased_tables))
     			{
    @@ -1356,10 +1234,11 @@ function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifier
     
     					$item = implode('.', $parts);
     				}
    +
     				return $item.$alias;
     			}
     
    -			// Is there a table prefix defined in the config file?  If not, no need to do anything
    +			// Is there a table prefix defined in the config file? If not, no need to do anything
     			if ($this->dbprefix != '')
     			{
     				// We now add the table prefix based on some logic.
    @@ -1390,13 +1269,12 @@ function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifier
     				}
     
     				// Verify table prefix and replace if necessary
    -				if ($this->swap_pre != '' && strncmp($parts[$i], $this->swap_pre, strlen($this->swap_pre)) === 0)
    +				if ($this->swap_pre != '' && strpos($parts[$i], $this->swap_pre) === 0)
     				{
    -					$parts[$i] = preg_replace("/^".$this->swap_pre."(\S+?)/", $this->dbprefix."\\1", $parts[$i]);
    +					$parts[$i] = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $parts[$i]);
     				}
    -
     				// We only add the table prefix if it does not already exist
    -				if (substr($parts[$i], 0, strlen($this->dbprefix)) != $this->dbprefix)
    +				elseif (strpos($parts[$i], $this->dbprefix) !== 0)
     				{
     					$parts[$i] = $this->dbprefix.$parts[$i];
     				}
    @@ -1417,19 +1295,18 @@ function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifier
     		if ($this->dbprefix != '')
     		{
     			// Verify table prefix and replace if necessary
    -			if ($this->swap_pre != '' && strncmp($item, $this->swap_pre, strlen($this->swap_pre)) === 0)
    +			if ($this->swap_pre != '' && strpos($item, $this->swap_pre) === 0)
     			{
    -				$item = preg_replace("/^".$this->swap_pre."(\S+?)/", $this->dbprefix."\\1", $item);
    +				$item = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $item);
     			}
    -
     			// Do we prefix an item with no segments?
    -			if ($prefix_single == TRUE AND substr($item, 0, strlen($this->dbprefix)) != $this->dbprefix)
    +			elseif ($prefix_single == TRUE && strpos($item, $this->dbprefix) !== 0)
     			{
     				$item = $this->dbprefix.$item;
     			}
     		}
     
    -		if ($protect_identifiers === TRUE AND ! in_array($item, $this->_reserved_identifiers))
    +		if ($protect_identifiers === TRUE && ! in_array($item, $this->_reserved_identifiers))
     		{
     			$item = $this->_escape_identifiers($item);
     		}
    @@ -1440,6 +1317,5 @@ function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifier
     
     }
     
    -
     /* End of file DB_driver.php */
     /* Location: ./system/database/DB_driver.php */
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 48011f208e3..0bd63ad97bc 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -97,6 +97,7 @@ Bug fixes for 3.0
     -  In Pagination library, when use_page_numbers=TRUE previous link and page 1 link do not have the same url
     -  Fixed a bug (#561) - Errors in :doc:`XML-RPC Library ` were not properly escaped.
     -  Fixed a bug (#904) - ``CI_Loader::initialize()`` caused a PHP Fatal error to be triggered if error level E_STRICT is used.
    +-  Fixed a bug in CI_DB_driver::version() where it failed when using a database driver needs to run a query in order to get the version.
     
     Version 2.1.0
     =============
    
    From a5f2f694c6fb0cf3286a4ae44af47ac77684a36a Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Wed, 25 Jan 2012 21:44:56 +0200
    Subject: [PATCH 0328/5397] Pass CI_DB_driver::curs_id to CI_DB_oci8_result ...
    
    ---
     system/database/DB_driver.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index d9d83d55def..117db68e812 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -395,7 +395,7 @@ public function query($sql, $binds = FALSE, $return_object = TRUE)
     		if ($this->dbdriver === 'oci8')
     		{
     			$RES->stmt_id		= $this->stmt_id;
    -			$RES->curs_id		= NULL;
    +			$RES->curs_id		= $this->curs_id;
     			$RES->limit_used	= $this->limit_used;
     			$this->stmt_id		= FALSE;
     		}
    
    From 4da24f8f1137afbaa2ec51d9c9fb635df1481472 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Wed, 25 Jan 2012 21:54:23 +0200
    Subject: [PATCH 0329/5397] Improve the MSSQL database driver
    
    ---
     .../database/drivers/mssql/mssql_driver.php   | 242 +++++++-----------
     system/database/drivers/mssql/mssql_forge.php | 134 +++-------
     .../database/drivers/mssql/mssql_result.php   |  50 ++--
     .../database/drivers/mssql/mssql_utility.php  |  38 ++-
     4 files changed, 164 insertions(+), 300 deletions(-)
    
    diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php
    index 2a109893244..9cabe87be15 100644
    --- a/system/database/drivers/mssql/mssql_driver.php
    +++ b/system/database/drivers/mssql/mssql_driver.php
    @@ -1,13 +1,13 @@
    -port != '')
     		{
    @@ -80,10 +77,9 @@ function db_connect()
     	/**
     	 * Persistent database connection
     	 *
    -	 * @access	private called by the base class
     	 * @return	resource
     	 */
    -	function db_pconnect()
    +	public function db_pconnect()
     	{
     		if ($this->port != '')
     		{
    @@ -101,12 +97,11 @@ function db_pconnect()
     	 * 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()
    +	public function reconnect()
     	{
    -		// not implemented in MSSQL
    +		// Not supported in MSSQL
     	}
     
     	// --------------------------------------------------------------------
    @@ -114,10 +109,9 @@ function reconnect()
     	/**
     	 * Select the database
     	 *
    -	 * @access	private called by the base class
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function db_select()
    +	public function db_select()
     	{
     		// Note: The brackets are required in the event that the DB name
     		// contains reserved characters
    @@ -129,14 +123,13 @@ function db_select()
     	/**
     	 * Set client character set
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @param	string
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function db_set_charset($charset, $collation)
    +	public function db_set_charset($charset, $collation)
     	{
    -		// @todo - add support if needed
    +		// Not supported in MSSQL
     		return TRUE;
     	}
     
    @@ -145,14 +138,12 @@ function db_set_charset($charset, $collation)
     	/**
     	 * Execute the query
     	 *
    -	 * @access	private called by the base class
     	 * @param	string	an SQL query
    -	 * @return	resource
    +	 * @return	mixed	resource if rows are returned, bool otherwise
     	 */
    -	function _execute($sql)
    +	protected function _execute($sql)
     	{
    -		$sql = $this->_prep_query($sql);
    -		return @mssql_query($sql, $this->conn_id);
    +		return @mssql_query($this->_prep_query($sql), $this->conn_id);
     	}
     
     	// --------------------------------------------------------------------
    @@ -162,11 +153,10 @@ function _execute($sql)
     	 *
     	 * 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)
    +	protected function _prep_query($sql)
     	{
     		return $sql;
     	}
    @@ -176,18 +166,12 @@ function _prep_query($sql)
     	/**
     	 * Begin Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_begin($test_mode = FALSE)
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -195,10 +179,9 @@ function trans_begin($test_mode = FALSE)
     		// 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->_trans_failure = ($test_mode === TRUE);
     
    -		$this->simple_query('BEGIN TRAN');
    -		return TRUE;
    +		return $this->simple_query('BEGIN TRAN');
     	}
     
     	// --------------------------------------------------------------------
    @@ -206,24 +189,17 @@ function trans_begin($test_mode = FALSE)
     	/**
     	 * Commit Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_commit()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
     
    -		$this->simple_query('COMMIT TRAN');
    -		return TRUE;
    +		return $this->simple_query('COMMIT TRAN');
     	}
     
     	// --------------------------------------------------------------------
    @@ -231,24 +207,17 @@ function trans_commit()
     	/**
     	 * Rollback Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_rollback()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
     
    -		$this->simple_query('ROLLBACK TRAN');
    -		return TRUE;
    +		return $this->simple_query('ROLLBACK TRAN');
     	}
     
     	// --------------------------------------------------------------------
    @@ -256,12 +225,11 @@ function trans_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)
    +	public function escape_str($str, $like = FALSE)
     	{
     		if (is_array($str))
     		{
    @@ -279,7 +247,7 @@ function escape_str($str, $like = FALSE)
     		// escape LIKE condition wildcards
     		if ($like === TRUE)
     		{
    -			$str = str_replace(
    +			return 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
    @@ -294,10 +262,9 @@ function escape_str($str, $like = FALSE)
     	/**
     	 * Affected Rows
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function affected_rows()
    +	public function affected_rows()
     	{
     		return @mssql_rows_affected($this->conn_id);
     	}
    @@ -309,13 +276,14 @@ function affected_rows()
     	*
     	* Returns the last id created in the Identity column.
     	*
    -	* @access public
    -	* @return integer
    +	* @return	int
     	*/
    -	function insert_id()
    +	public function insert_id()
     	{
    -		$ver = self::_parse_major_version($this->version());
    -		$sql = ($ver >= 8 ? "SELECT SCOPE_IDENTITY() AS last_id" : "SELECT @@IDENTITY AS last_id");
    +		$sql = (self::_parse_major_version($this->version()) > 7)
    +			? 'SELECT SCOPE_IDENTITY() AS last_id'
    +			: 'SELECT @@IDENTITY AS last_id';
    +
     		$query = $this->query($sql);
     		$row = $query->row();
     		return $row->last_id;
    @@ -329,11 +297,10 @@ function insert_id()
     	* Grabs the major version number from the
     	* database server version string passed in.
     	*
    -	* @access private
    -	* @param string $version
    -	* @return int16 major version number
    +	* @param	string	$version
    +	* @return	int	major version number
     	*/
    -	function _parse_major_version($version)
    +	private 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.
    @@ -344,12 +311,11 @@ function _parse_major_version($version)
     	/**
     	* Version number query string
     	*
    -	* @access public
    -	* @return string
    +	* @return	string
     	*/
    -	function _version()
    +	protected function _version()
     	{
    -		return "SELECT @@VERSION AS ver";
    +		return 'SELECT @@VERSION AS ver';
     	}
     
     	// --------------------------------------------------------------------
    @@ -360,19 +326,17 @@ function _version()
     	 * Generates a platform-specific query string that counts all records in
     	 * the specified database
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @return	string
     	 */
    -	function count_all($table = '')
    +	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));
    -
    +		$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;
    @@ -390,11 +354,10 @@ function count_all($table = '')
     	 *
     	 * Generates a platform-specific query string so that the table names can be fetched
     	 *
    -	 * @access	private
    -	 * @param	boolean
    +	 * @param	bool
     	 * @return	string
     	 */
    -	function _list_tables($prefix_limit = FALSE)
    +	protected function _list_tables($prefix_limit = FALSE)
     	{
     		$sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name";
     
    @@ -415,11 +378,10 @@ function _list_tables($prefix_limit = FALSE)
     	 *
     	 * 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 = '')
    +	protected function _list_columns($table = '')
     	{
     		return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$table."'";
     	}
    @@ -431,13 +393,12 @@ function _list_columns($table = '')
     	 *
     	 * Generates a platform-specific query so that the column data can be retrieved
     	 *
    -	 * @access	public
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	string
     	 */
    -	function _field_data($table)
    +	protected function _field_data($table)
     	{
    -		return "SELECT TOP 1 * FROM ".$table;
    +		return 'SELECT TOP 1 * FROM '.$table;
     	}
     
     	// --------------------------------------------------------------------
    @@ -445,10 +406,9 @@ function _field_data($table)
     	/**
     	 * The error message string
     	 *
    -	 * @access	private
     	 * @return	string
     	 */
    -	function _error_message()
    +	protected function _error_message()
     	{
     		return mssql_get_last_message();
     	}
    @@ -458,12 +418,11 @@ function _error_message()
     	/**
     	 * The error message number
     	 *
    -	 * @access	private
    -	 * @return	integer
    +	 * @return	string
     	 */
    -	function _error_number()
    +	protected function _error_number()
     	{
    -		// Are error numbers supported?
    +		// Not supported in MSSQL
     		return '';
     	}
     
    @@ -474,11 +433,10 @@ function _error_number()
     	 *
     	 * This function escapes column and table names
     	 *
    -	 * @access	private
     	 * @param	string
     	 * @return	string
     	 */
    -	function _escape_identifiers($item)
    +	protected function _escape_identifiers($item)
     	{
     		if ($this->_escape_char == '')
     		{
    @@ -489,24 +447,20 @@ function _escape_identifiers($item)
     		{
     			if (strpos($item, '.'.$id) !== FALSE)
     			{
    -				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);
    +				$item = 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);
    +				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item);
     			}
     		}
     
     		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;
    +			$item = str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item);
     		}
     
     		// remove duplicates if the user already included the escape
    -		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
    +		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item.$this->_escape_char);
     	}
     
     	// --------------------------------------------------------------------
    @@ -517,11 +471,10 @@ function _escape_identifiers($item)
     	 * 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
    +	 * @param	array
    +	 * @return	string
     	 */
    -	function _from_tables($tables)
    +	protected function _from_tables($tables)
     	{
     		if ( ! is_array($tables))
     		{
    @@ -538,15 +491,14 @@ function _from_tables($tables)
     	 *
     	 * 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)
    +	protected function _insert($table, $keys, $values)
     	{
    -		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
    +		return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
     	}
     
     	// --------------------------------------------------------------------
    @@ -556,7 +508,6 @@ function _insert($table, $keys, $values)
     	 *
     	 * 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
    @@ -564,24 +515,17 @@ function _insert($table, $keys, $values)
     	 * @param	array	the limit clause
     	 * @return	string
     	 */
    -	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
    +	protected function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
     	{
     		foreach ($values as $key => $val)
     		{
    -			$valstr[] = $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;
    +		return 'UPDATE '.$table.' SET '.implode(', ', $valstr)
    +			.(($where != '' && count($where) > 0) ? ' WHERE '.implode(' ', $where) : '')
    +			.(count($orderby) > 0 ? ' ORDER BY '.implode(', ', $orderby) : '')
    +			.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     
    @@ -594,13 +538,12 @@ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
     	 * 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)
    +	protected function _truncate($table)
     	{
    -		return "TRUNCATE ".$table;
    +		return 'TRUNCATE '.$table;
     	}
     
     	// --------------------------------------------------------------------
    @@ -610,31 +553,26 @@ function _truncate($table)
     	 *
     	 * 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)
    +	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);
    +			$conditions .= "\nWHERE ".implode("\n", $this->ar_where);
     
     			if (count($where) > 0 && count($like) > 0)
     			{
    -				$conditions .= " AND ";
    +				$conditions .= ' AND ';
     			}
     			$conditions .= implode("\n", $like);
     		}
     
    -		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
    -
    -		return "DELETE FROM ".$table.$conditions.$limit;
    +		return 'DELETE FROM '.$table.$conditions.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     	// --------------------------------------------------------------------
    @@ -644,17 +582,14 @@ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
     	 *
     	 * 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)
    +	protected function _limit($sql, $limit, $offset)
     	{
    -		$i = $limit + $offset;
    -
    -		return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql);
    +		return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.($limit + $offset).' ', $sql);
     	}
     
     	// --------------------------------------------------------------------
    @@ -662,18 +597,15 @@ function _limit($sql, $limit, $offset)
     	/**
     	 * Close DB Connection
     	 *
    -	 * @access	public
     	 * @param	resource
     	 * @return	void
     	 */
    -	function _close($conn_id)
    +	protected function _close($conn_id)
     	{
     		@mssql_close($conn_id);
     	}
     
     }
     
    -
    -
     /* End of file mssql_driver.php */
    -/* Location: ./system/database/drivers/mssql/mssql_driver.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/mssql/mssql_driver.php */
    diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php
    index dd8aa3448a2..65513f437c3 100644
    --- a/system/database/drivers/mssql/mssql_forge.php
    +++ b/system/database/drivers/mssql/mssql_forge.php
    @@ -1,13 +1,13 @@
    -db->_escape_identifiers($table);
    +		return 'DROP TABLE '.$this->db->_escape_identifiers($table);
     	}
     
     	// --------------------------------------------------------------------
    @@ -80,15 +76,14 @@ function _drop_table($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
    +	 * @return	string
     	 */
    -	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
    +	public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	{
     		$sql = 'CREATE TABLE ';
     
    @@ -97,7 +92,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			$sql .= 'IF NOT EXISTS ';
     		}
     
    -		$sql .= $this->db->_escape_identifiers($table)." (";
    +		$sql .= $this->db->_escape_identifiers($table).'(';
     		$current_field_count = 0;
     
     		foreach ($fields as $field=>$attributes)
    @@ -107,44 +102,19 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			// entered the field information, so we'll simply add it to the list
     			if (is_numeric($field))
     			{
    -				$sql .= "\n\t$attributes";
    +				$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';
    -				}
    +				$sql .= "\n\t".$this->db->protect_identifiers($field)
    +					.' '.$attributes['TYPE']
    +					.(array_key_exists('CONSTRAINT', $attributes) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.((array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.(array_key_exists('DEFAULT', $attributes) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    +					.((array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.((array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    @@ -156,8 +126,8 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     
     		if (count($primary_keys) > 0)
     		{
    -			$primary_keys = $this->db->_protect_identifiers($primary_keys);
    -			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
    +			$primary_keys = $this->db->protect_identifiers($primary_keys);
    +			$sql .= ",\n\tPRIMARY KEY (".implode(', ', $primary_keys).')';
     		}
     
     		if (is_array($keys) && count($keys) > 0)
    @@ -166,20 +136,18 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			{
     				if (is_array($key))
     				{
    -					$key = $this->db->_protect_identifiers($key);
    +					$key = $this->db->protect_identifiers($key);
     				}
     				else
     				{
    -					$key = array($this->db->_protect_identifiers($key));
    +					$key = array($this->db->protect_identifiers($key));
     				}
     
    -				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";
    +				$sql .= ",\n\tFOREIGN KEY (".implode(', ', $key).')';
     			}
     		}
     
    -		$sql .= "\n)";
    -
    -		return $sql;
    +		return $sql."\n)";
     	}
     
     	// --------------------------------------------------------------------
    @@ -190,7 +158,6 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	 * 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
    @@ -200,39 +167,20 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	 * @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 = '')
    +	public 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);
    +		$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')
    +		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;
    -
    +		return $sql.' '.$column_definition
    +			.($default_value != '' ? ' DEFAULT "'.$default_value.'"' : '')
    +			.($null === NULL ? ' NULL' : ' NOT NULL')
    +			.($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : '');
     	}
     
     	// --------------------------------------------------------------------
    @@ -242,19 +190,17 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = ''
     	 *
     	 * 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)
    +	public 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;
    +		return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name);
     	}
     
     }
     
     /* End of file mssql_forge.php */
    -/* Location: ./system/database/drivers/mssql/mssql_forge.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/mssql/mssql_forge.php */
    diff --git a/system/database/drivers/mssql/mssql_result.php b/system/database/drivers/mssql/mssql_result.php
    index bba2e624387..579cd3de7b0 100644
    --- a/system/database/drivers/mssql/mssql_result.php
    +++ b/system/database/drivers/mssql/mssql_result.php
    @@ -1,13 +1,13 @@
    -result_id);
     	}
    @@ -54,10 +51,9 @@ function num_rows()
     	/**
     	 * Number of fields in the result set
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function num_fields()
    +	public function num_fields()
     	{
     		return @mssql_num_fields($this->result_id);
     	}
    @@ -69,10 +65,9 @@ function num_fields()
     	 *
     	 * Generates an array of column names
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function list_fields()
    +	public function list_fields()
     	{
     		$field_names = array();
     		while ($field = mssql_fetch_field($this->result_id))
    @@ -90,20 +85,19 @@ function list_fields()
     	 *
     	 * Generates an array of objects containing field meta-data
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function field_data()
    +	public 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		= new stdClass();
    +			$F->name	= $field->name;
    +			$F->type	= $field->type;
     			$F->max_length	= $field->max_length;
     			$F->primary_key = 0;
    -			$F->default		= '';
    +			$F->default	= '';
     
     			$retval[] = $F;
     		}
    @@ -116,9 +110,9 @@ function field_data()
     	/**
     	 * Free the result
     	 *
    -	 * @return	null
    +	 * @return	void
     	 */
    -	function free_result()
    +	public function free_result()
     	{
     		if (is_resource($this->result_id))
     		{
    @@ -132,14 +126,13 @@ function free_result()
     	/**
     	 * Data Seek
     	 *
    -	 * Moves the internal pointer to the desired offset.  We call
    +	 * 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)
    +	public function _data_seek($n = 0)
     	{
     		return mssql_data_seek($this->result_id, $n);
     	}
    @@ -151,10 +144,9 @@ function _data_seek($n = 0)
     	 *
     	 * Returns the result set as an array
     	 *
    -	 * @access	private
     	 * @return	array
     	 */
    -	function _fetch_assoc()
    +	protected function _fetch_assoc()
     	{
     		return mssql_fetch_assoc($this->result_id);
     	}
    @@ -166,16 +158,14 @@ function _fetch_assoc()
     	 *
     	 * Returns the result set as an object
     	 *
    -	 * @access	private
     	 * @return	object
     	 */
    -	function _fetch_object()
    +	protected function _fetch_object()
     	{
     		return mssql_fetch_object($this->result_id);
     	}
     
     }
     
    -
     /* End of file mssql_result.php */
    -/* Location: ./system/database/drivers/mssql/mssql_result.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/mssql/mssql_result.php */
    diff --git a/system/database/drivers/mssql/mssql_utility.php b/system/database/drivers/mssql/mssql_utility.php
    index be6ed5bb0d6..11a1b3ad0a0 100644
    --- a/system/database/drivers/mssql/mssql_utility.php
    +++ b/system/database/drivers/mssql/mssql_utility.php
    @@ -1,13 +1,13 @@
    -db->protect_identifiers($table).' REORGANIZE';
     	}
     
     	// --------------------------------------------------------------------
    @@ -70,13 +67,13 @@ function _optimize_table($table)
     	 *
     	 * Generates a platform-specific query so that a table can be repaired
     	 *
    -	 * @access	private
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	bool
     	 */
    -	function _repair_table($table)
    +	public function _repair_table($table)
     	{
    -		return FALSE; // Is this supported in MS SQL?
    +		// Not supported in MSSQL
    +		return FALSE;
     	}
     
     	// --------------------------------------------------------------------
    @@ -84,11 +81,10 @@ function _repair_table($table)
     	/**
     	 * MSSQL Export
     	 *
    -	 * @access	private
     	 * @param	array	Preferences
    -	 * @return	mixed
    +	 * @return	bool
     	 */
    -	function _backup($params = array())
    +	public function _backup($params = array())
     	{
     		// Currently unsupported
     		return $this->db->display_error('db_unsuported_feature');
    @@ -97,4 +93,4 @@ function _backup($params = array())
     }
     
     /* End of file mssql_utility.php */
    -/* Location: ./system/database/drivers/mssql/mssql_utility.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/mssql/mssql_utility.php */
    
    From 8c1b269b1a53f4ace1e7e549fa2c7781cc9f09e9 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Wed, 25 Jan 2012 22:05:49 +0200
    Subject: [PATCH 0330/5397] Update the changelog
    
    ---
     user_guide_src/source/changelog.rst | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 48011f208e3..a1b1ccbf2ce 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -47,6 +47,7 @@ Release Date: Not Released
           get_compiled_insert(), get_compiled_update(), get_compiled_delete().
        -  Taking care of LIKE condition when used with MySQL UPDATE statement.
        -  Adding $escape parameter to the order_by function, this enables ordering by custom fields.
    +   -  Added random ordering support to the MSSQL driver.
     
     -  Libraries
     
    
    From 12567e8263be2d007dc50fc94e7456c7183f8098 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Wed, 25 Jan 2012 22:50:33 +0200
    Subject: [PATCH 0331/5397] Add better key/index detection for list_tables()
     and list_fields()
    
    ---
     system/database/DB_driver.php | 50 +++++++++++++++++++++++++++++++++--
     1 file changed, 48 insertions(+), 2 deletions(-)
    
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index 117db68e812..eb6ab743063 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -760,7 +760,30 @@ public function list_tables($constrain_by_prefix = FALSE)
     
     		foreach ($query->result_array() as $row)
     		{
    -			$this->data_cache['table_names'][] = isset($row['TABLE_NAME']) ? $row['TABLE_NAME'] : array_shift($row);
    +			// Do we know from which column to get the table name?
    +			if ( ! isset($key))
    +			{
    +				if (array_key_exists('table_name', $row))
    +				{
    +					$key = 'table_name';
    +				}
    +				elseif (array_key_exists('TABLE_NAME', $row))
    +				{
    +					$key = 'TABLE_NAME';
    +				}
    +				else
    +				{
    +					/* We have no other choice but to just get the first element's key.
    +					 * Due to array_shift() accepting it's argument by reference, if
    +					 * E_STRICT is on, this would trigger a warning. So we'll have to
    +					 * assign it first.
    +					 */
    +					$key = array_keys($row);
    +					$key = array_shift($key);
    +				}
    +			}
    +
    +			$this->data_cache['table_names'][] = $row[$key];
     		}
     
     		return $this->data_cache['table_names'];
    @@ -809,7 +832,30 @@ public function list_fields($table = '')
     
     		foreach ($query->result_array() as $row)
     		{
    -			$this->data_cache['field_names'][$table][] = isset($row['COLUMN_NAME']) ? $row['COLUMN_NAME'] : current($row);
    +			// Do we know from where to get the column's name?
    +			if ( ! isset($key))
    +			{
    +				if (array_key_exists('column_name', $row))
    +				{
    +					$key = 'column_name';
    +				}
    +				elseif (array_key_exists('COLUMN_NAME', $row))
    +				{
    +					$key = 'COLUMN_NAME';
    +				}
    +				else
    +				{
    +					/* We have no other choice but to just get the first element's key.
    +					 * Due to array_shift() accepting it's argument by reference, if
    +					 * E_STRICT is on, this would trigger a warning. So we'll have to
    +					 * assign it first.
    +					 */
    +					$key = array_keys($row);
    +					$key = array_shift($key);
    +				}
    +			}
    +
    +			$this->data_cache['field_names'][$table][] = $row[$key];
     		}
     
     		return $this->data_cache['field_names'][$table];
    
    From 5aca23eaeb6d8c4e665dd2cd23fe8d733bb94875 Mon Sep 17 00:00:00 2001
    From: CroNiX 
    Date: Wed, 25 Jan 2012 14:26:46 -0800
    Subject: [PATCH 0332/5397] Change hardcoded "application" directory to use the
     APPPATH constant as it would not work if you relocate /application or /system
     folders outside of web root.
    
    ---
     user_guide_src/source/tutorial/static_pages.rst | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/user_guide_src/source/tutorial/static_pages.rst b/user_guide_src/source/tutorial/static_pages.rst
    index c7f737951ba..708eaeb7b18 100644
    --- a/user_guide_src/source/tutorial/static_pages.rst
    +++ b/user_guide_src/source/tutorial/static_pages.rst
    @@ -97,7 +97,7 @@ page actually exists:
         public function view($page = 'home')
         {
                     
    -        if ( ! file_exists('application/views/pages/'.$page.'.php'))
    +        if ( ! file_exists(APPPATH.'/views/pages/'.$page.'.php'))
             {
                 // Whoops, we don't have a page for that!
                 show_404();
    
    From dd7242b9e78f5ca9e56ffe239c14918903d34cd8 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 00:43:38 +0200
    Subject: [PATCH 0333/5397] Switch a few properties from public to protected
    
    ---
     system/database/drivers/mssql/mssql_driver.php | 10 +++++-----
     1 file changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php
    index 9cabe87be15..267c16171e6 100644
    --- a/system/database/drivers/mssql/mssql_driver.php
    +++ b/system/database/drivers/mssql/mssql_driver.php
    @@ -43,19 +43,19 @@ class CI_DB_mssql_driver extends CI_DB {
     	public $dbdriver = 'mssql';
     
     	// The character used for escaping
    -	public $_escape_char = '';
    +	protected $_escape_char = '';
     
     	// clause and character used for LIKE escape sequences
    -	public $_like_escape_str = ' ESCAPE \'%s\' ';
    -	public $_like_escape_chr = '!';
    +	protected $_like_escape_str = ' ESCAPE \'%s\' ';
    +	protected $_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() methods.
     	 */
    -	public $_count_string = 'SELECT COUNT(*) AS ';
    -	public $_random_keyword = ' NEWID()';
    +	protected $_count_string = 'SELECT COUNT(*) AS ';
    +	protected $_random_keyword = ' NEWID()';
     
     	/**
     	 * Non-persistent database connection
    
    From 624010f68be35000b8518be25375d8cb4078225f Mon Sep 17 00:00:00 2001
    From: CroNiX 
    Date: Wed, 25 Jan 2012 14:52:11 -0800
    Subject: [PATCH 0334/5397] Added bit about having mod_rewrite enabled for
     removing index.php Added note about htaccess rules might not work for all
     server configurations
    
    ---
     user_guide_src/source/general/urls.rst | 9 ++++++---
     1 file changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/user_guide_src/source/general/urls.rst b/user_guide_src/source/general/urls.rst
    index 857078b1c0f..6b390b559e6 100644
    --- a/user_guide_src/source/general/urls.rst
    +++ b/user_guide_src/source/general/urls.rst
    @@ -39,9 +39,10 @@ By default, the **index.php** file will be included in your URLs::
     
     	example.com/index.php/news/article/my_article
     
    -You can easily remove this file by using a .htaccess file with some
    -simple rules. Here is an example of such a file, using the "negative"
    -method in which everything is redirected except the specified items:
    +If your Apache server has mod_rewrite enabled, you can easily remove this
    +file by using a .htaccess file with some simple rules. Here is an example
    +of such a file, using the "negative" method in which everything is redirected
    +except the specified items:
     
     ::
     	
    @@ -53,6 +54,8 @@ method in which everything is redirected except the specified items:
     In the above example, any HTTP request other than those for existing
     directories and existing files is treated as a request for your index.php file.
     
    +.. note:: Note: These specific rules might not work for all server configurations.
    +
     Adding a URL Suffix
     ===================
     
    
    From 3318ab87718775289264c5f42edfd9f912632dd8 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 01:59:08 +0200
    Subject: [PATCH 0335/5397] Make _escape_identifiers() public, so DB_forge can
     use it
    
    ---
     system/database/drivers/mssql/mssql_driver.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php
    index 267c16171e6..22ed0478e56 100644
    --- a/system/database/drivers/mssql/mssql_driver.php
    +++ b/system/database/drivers/mssql/mssql_driver.php
    @@ -436,7 +436,7 @@ protected function _error_number()
     	 * @param	string
     	 * @return	string
     	 */
    -	protected function _escape_identifiers($item)
    +	public function _escape_identifiers($item)
     	{
     		if ($this->_escape_char == '')
     		{
    
    From 4a31568b2eb410dd153a3636da13d62e9cbfd41a Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 02:03:10 +0200
    Subject: [PATCH 0336/5397] DB forge escaping related
    
    ---
     system/database/drivers/oci8/oci8_driver.php |  2 +-
     system/database/drivers/oci8/oci8_forge.php  | 16 ++++++++--------
     2 files changed, 9 insertions(+), 9 deletions(-)
    
    diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php
    index 58d9b9ba385..9fce18674b2 100644
    --- a/system/database/drivers/oci8/oci8_driver.php
    +++ b/system/database/drivers/oci8/oci8_driver.php
    @@ -568,7 +568,7 @@ private function _get_error_data()
     	 * @param	string
     	 * @return	string
     	 */
    -	protected function _escape_identifiers($item)
    +	public function _escape_identifiers($item)
     	{
     		if ($this->_escape_char == '')
     		{
    diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php
    index 35587a9ccf4..661ec3a4048 100644
    --- a/system/database/drivers/oci8/oci8_forge.php
    +++ b/system/database/drivers/oci8/oci8_forge.php
    @@ -97,7 +97,7 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     			{
     				$attributes = array_change_key_case($attributes, CASE_UPPER);
     
    -				$sql .= "\n\t".$this->db->_protect_identifiers($field).' '.$attributes['TYPE']
    +				$sql .= "\n\t".$this->db->protect_identifiers($field).' '.$attributes['TYPE']
     					.(array_key_exists('CONSTRAINT', $attributes) ? '('.$attributes['CONSTRAINT'].')' : '')
     					.((array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
     					.(array_key_exists('DEFAULT', $attributes) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    @@ -113,7 +113,7 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     
     		if (count($primary_keys) > 0)
     		{
    -			$primary_keys = $this->db->_protect_identifiers($primary_keys);
    +			$primary_keys = $this->db->protect_identifiers($primary_keys);
     			$sql .= ",\n\tPRIMARY KEY (".implode(', ', $primary_keys).')';
     		}
     
    @@ -123,11 +123,11 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     			{
     				if (is_array($key))
     				{
    -					$key = $this->db->_protect_identifiers($key);
    +					$key = $this->db->protect_identifiers($key);
     				}
     				else
     				{
    -					$key = array($this->db->_protect_identifiers($key));
    +					$key = array($this->db->protect_identifiers($key));
     				}
     
     				$sql .= ",\n\tUNIQUE COLUMNS (".implode(', ', $key).')';
    @@ -146,7 +146,7 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     	 */
     	public function _drop_table($table)
     	{
    -		return 'DROP TABLE '.$this->db->_protect_identifiers($table);
    +		return 'DROP TABLE '.$this->db->protect_identifiers($table);
     	}
     
     	// --------------------------------------------------------------------
    @@ -168,7 +168,7 @@ public function _drop_table($table)
     	 */
     	public 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);
    +		$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')
    @@ -179,7 +179,7 @@ public function _alter_table($alter_type, $table, $column_name, $column_definiti
     		return $sql.' '.$column_definition
     			.($default_value != '' ? ' DEFAULT "'.$default_value.'"' : '')
     			.($null === NULL ? ' NULL' : ' NOT NULL')
    -			.($after_field != '' ? ' AFTER '.$this->db->_protect_identifiers($after_field) : '');
    +			.($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : '');
     
     	}
     
    @@ -196,7 +196,7 @@ public function _alter_table($alter_type, $table, $column_name, $column_definiti
     	 */
     	public function _rename_table($table_name, $new_table_name)
     	{
    -		return 'ALTER TABLE '.$this->db->_protect_identifiers($table_name).' RENAME TO '.$this->db->_protect_identifiers($new_table_name);
    +		return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name);
     	}
     
     }
    
    From 0e8968ab7c309d17cd61079f7554ced1411a8792 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 02:04:37 +0200
    Subject: [PATCH 0337/5397] Improve the SQLSRV (MSSQL) database driver
    
    ---
     system/database/DB_driver.php                 |   2 +-
     .../database/drivers/sqlsrv/sqlsrv_driver.php | 285 ++++++++----------
     .../database/drivers/sqlsrv/sqlsrv_forge.php  | 138 +++------
     .../database/drivers/sqlsrv/sqlsrv_result.php |  62 ++--
     .../drivers/sqlsrv/sqlsrv_utility.php         |  39 ++-
     5 files changed, 207 insertions(+), 319 deletions(-)
    
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index 661b42ced81..82e5d048606 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -257,7 +257,7 @@ function version()
     
     		// Some DBs have functions that return the version, and don't run special
     		// SQL queries per se. In these instances, just return the result.
    -		$driver_version_exceptions = array('oci8', 'sqlite', 'cubrid', 'pdo');
    +		$driver_version_exceptions = array('oci8', 'sqlite', 'cubrid', 'pdo', 'sqlsrv');
     
     		if (in_array($this->dbdriver, $driver_version_exceptions))
     		{
    diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php
    index 6fd52ef70e3..cdd178261f5 100644
    --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php
    +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php
    @@ -1,13 +1,13 @@
    -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,
    +			'UID'			=> empty($this->username) ? '' : $this->username,
    +			'PWD'			=> empty($this->password) ? '' : $this->password,
    +			'Database'		=> $this->database,
    +			'ConnectionPooling'	=> $pooling ? 1 : 0,
     			'CharacterSet'		=> $character_set,
    -			'ReturnDatesAsStrings' => 1
    +			'ReturnDatesAsStrings'	=> 1
     		);
    -		
    -		// If the username and password are both empty, assume this is a 
    +
    +		// If the username and password are both empty, assume this is a
     		// 'Windows Authentication Mode' connection.
    -		if(empty($connection['UID']) && empty($connection['PWD'])) {
    +		if (empty($connection['UID']) && empty($connection['PWD']))
    +		{
     			unset($connection['UID'], $connection['PWD']);
     		}
     
    @@ -93,10 +91,9 @@ function db_connect($pooling = false)
     	/**
     	 * Persistent database connection
     	 *
    -	 * @access	private called by the base class
     	 * @return	resource
     	 */
    -	function db_pconnect()
    +	public function db_pconnect()
     	{
     		return $this->db_connect(TRUE);
     	}
    @@ -109,12 +106,11 @@ function db_pconnect()
     	 * 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()
    +	public function reconnect()
     	{
    -		// not implemented in MSSQL
    +		// Not supported in MSSQL
     	}
     
     	// --------------------------------------------------------------------
    @@ -122,10 +118,9 @@ function reconnect()
     	/**
     	 * Select the database
     	 *
    -	 * @access	private called by the base class
     	 * @return	resource
     	 */
    -	function db_select()
    +	public function db_select()
     	{
     		return $this->_execute('USE ' . $this->database);
     	}
    @@ -135,14 +130,13 @@ function db_select()
     	/**
     	 * Set client character set
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @param	string
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function db_set_charset($charset, $collation)
    +	public function db_set_charset($charset, $collation)
     	{
    -		// @todo - add support if needed
    +		// This is done upon connect
     		return TRUE;
     	}
     
    @@ -151,17 +145,13 @@ function db_set_charset($charset, $collation)
     	/**
     	 * Execute the query
     	 *
    -	 * @access	private called by the base class
     	 * @param	string	an SQL query
     	 * @return	resource
     	 */
    -	function _execute($sql)
    +	protected function _execute($sql)
     	{
    -		$sql = $this->_prep_query($sql);
    -		return sqlsrv_query($this->conn_id, $sql, null, array(
    -			'Scrollable'				=> SQLSRV_CURSOR_STATIC,
    -			'SendStreamParamsAtExec'	=> true
    -		));
    +		return sqlsrv_query($this->conn_id, $this->_prep_query($sql), NULL,
    +					array('Scrollable' => SQLSRV_CURSOR_STATIC, 'SendStreamParamsAtExec' => TRUE));
     	}
     
     	// --------------------------------------------------------------------
    @@ -171,11 +161,10 @@ function _execute($sql)
     	 *
     	 * 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)
    +	protected function _prep_query($sql)
     	{
     		return $sql;
     	}
    @@ -185,18 +174,12 @@ function _prep_query($sql)
     	/**
     	 * Begin Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_begin($test_mode = FALSE)
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -204,7 +187,7 @@ function trans_begin($test_mode = FALSE)
     		// 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->_trans_failure = ($test_mode === TRUE);
     
     		return sqlsrv_begin_transaction($this->conn_id);
     	}
    @@ -214,18 +197,12 @@ function trans_begin($test_mode = FALSE)
     	/**
     	 * Commit Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_commit()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -238,18 +215,12 @@ function trans_commit()
     	/**
     	 * Rollback Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_rollback()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -262,12 +233,11 @@ function trans_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)
    +	public function escape_str($str, $like = FALSE)
     	{
     		// Escape single quotes
     		return str_replace("'", "''", $str);
    @@ -278,10 +248,9 @@ function escape_str($str, $like = FALSE)
     	/**
     	 * Affected Rows
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function affected_rows()
    +	public function affected_rows()
     	{
     		return @sqlrv_rows_affected($this->conn_id);
     	}
    @@ -293,30 +262,13 @@ function affected_rows()
     	*
     	* 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
    +	* @return	int
     	*/
    -	function _parse_major_version($version)
    +	public function insert_id()
     	{
    -		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.
    +		$query = $this->query('SELECT @@IDENTITY AS insert_id');
    +		$query = $query->row();
    +		return $query->insert_id;
     	}
     
     	// --------------------------------------------------------------------
    @@ -324,13 +276,12 @@ function _parse_major_version($version)
     	/**
     	* Version number query string
     	*
    -	* @access public
    -	* @return string
    +	* @return	string
     	*/
    -	function _version()
    +	protected function _version()
     	{
     		$info = sqlsrv_server_info($this->conn_id);
    -		return sprintf("select '%s' as ver", $info['SQLServerVersion']);
    +		return $info['SQLServerVersion'];
     	}
     
     	// --------------------------------------------------------------------
    @@ -341,23 +292,25 @@ function _version()
     	 * Generates a platform-specific query string that counts all records in
     	 * the specified database
     	 *
    -	 * @access	public
     	 * @param	string
    -	 * @return	string
    +	 * @return	int
     	 */
    -	function count_all($table = '')
    +	public 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();
    +		{
    +			return 0;
    +		}
    +
    +		$query = $this->query('SELECT COUNT(*) AS numrows FROM '.$this->dbprefix.$table);
    +		if ($query->num_rows() === 0)
    +		{
    +			return 0;
    +		}
    +
    +		$query = $query->row();
     		$this->_reset_select();
    -		return $row->numrows;
    +		return (int) $query->numrows;
     	}
     
     	// --------------------------------------------------------------------
    @@ -367,11 +320,10 @@ function count_all($table = '')
     	 *
     	 * Generates a platform-specific query string so that the table names can be fetched
     	 *
    -	 * @access	private
    -	 * @param	boolean
    +	 * @param	bool
     	 * @return	string
     	 */
    -	function _list_tables($prefix_limit = FALSE)
    +	protected function _list_tables($prefix_limit = FALSE)
     	{
     		return "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name";
     	}
    @@ -383,11 +335,10 @@ function _list_tables($prefix_limit = FALSE)
     	 *
     	 * 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 = '')
    +	protected function _list_columns($table = '')
     	{
     		return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$this->_escape_table($table)."'";
     	}
    @@ -399,13 +350,12 @@ function _list_columns($table = '')
     	 *
     	 * 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)
    +	protected function _field_data($table)
     	{
    -		return "SELECT TOP 1 * FROM " . $this->_escape_table($table);	
    +		return 'SELECT TOP 1 * FROM '.$this->_escape_table($table);
     	}
     
     	// --------------------------------------------------------------------
    @@ -413,13 +363,18 @@ function _field_data($table)
     	/**
     	 * The error message string
     	 *
    -	 * @access	private
     	 * @return	string
     	 */
    -	function _error_message()
    +	protected function _error_message()
     	{
    -		$error = array_shift(sqlsrv_errors());
    -		return !empty($error['message']) ? $error['message'] : null;
    +		$error = sqlsrv_errors();
    +		if ( ! is_array($error))
    +		{
    +			return '';
    +		}
    +
    +		$error = array_shift($error);
    +		return isset($error['message']) ? $error['message'] : '';
     	}
     
     	// --------------------------------------------------------------------
    @@ -427,13 +382,29 @@ function _error_message()
     	/**
     	 * The error message number
     	 *
    -	 * @access	private
    -	 * @return	integer
    +	 * @return	string
     	 */
    -	function _error_number()
    +	protected function _error_number()
     	{
    -		$error = array_shift(sqlsrv_errors());
    -		return isset($error['SQLSTATE']) ? $error['SQLSTATE'] : null;
    +		$error = sqlsrv_errors();
    +		if ( ! is_array($error))
    +		{
    +			return '';
    +		}
    +		elseif (isset($error['SQLSTATE'], $error['code']))
    +		{
    +			return $error['SQLSTATE'].'/'.$error['code'];
    +		}
    +		elseif (isset($error['SQLSTATE']))
    +		{
    +			return $error['SQLSTATE'];
    +		}
    +		elseif (isset($error['code']))
    +		{
    +			return $error['code'];
    +		}
    +
    +		return '';
     	}
     
     	// --------------------------------------------------------------------
    @@ -444,26 +415,23 @@ function _error_number()
     	 * 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)
    +	protected 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)
    +	public function _escape_identifiers($item)
     	{
     		return $item;
     	}
    @@ -476,11 +444,10 @@ function _escape_identifiers($item)
     	 * 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
    +	 * @param	array
    +	 * @return	string
     	 */
    -	function _from_tables($tables)
    +	protected function _from_tables($tables)
     	{
     		if ( ! is_array($tables))
     		{
    @@ -497,15 +464,14 @@ function _from_tables($tables)
     	 *
     	 * 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).")";
    +	protected function _insert($table, $keys, $values)
    +	{
    +		return 'INSERT INTO '.$this->_escape_table($table).' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
     	}
     
     	// --------------------------------------------------------------------
    @@ -515,7 +481,6 @@ function _insert($table, $keys, $values)
     	 *
     	 * 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
    @@ -523,16 +488,16 @@ function _insert($table, $keys, $values)
     	 * @param	array	the limit clause
     	 * @return	string
     	 */
    -	function _update($table, $values, $where)
    +	protected function _update($table, $values, $where)
     	{
    -		foreach($values as $key => $val)
    +		foreach ($values as $key => $val)
     		{
    -			$valstr[] = $key." = ".$val;
    +			$valstr[] = $key.' = '.$val;
     		}
    -	
    -		return "UPDATE ".$this->_escape_table($table)." SET ".implode(', ', $valstr)." WHERE ".implode(" ", $where);
    +
    +		return 'UPDATE '.$this->_escape_table($table).' SET '.implode(', ', $valstr).' WHERE '.implode(' ', $where);
     	}
    -	
    +
     	// --------------------------------------------------------------------
     
     	/**
    @@ -542,13 +507,12 @@ function _update($table, $values, $where)
     	 * 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)
    +	protected function _truncate($table)
     	{
    -		return "TRUNCATE ".$table;
    +		return 'TRUNCATE '.$table;
     	}
     
     	// --------------------------------------------------------------------
    @@ -558,15 +522,14 @@ function _truncate($table)
     	 *
     	 * 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)
    +	protected function _delete($table, $where)
     	{
    -		return "DELETE FROM ".$this->_escape_table($table)." WHERE ".implode(" ", $where);
    +		return 'DELETE FROM '.$this->_escape_table($table).' WHERE '.implode(' ', $where);
     	}
     
     	// --------------------------------------------------------------------
    @@ -576,17 +539,14 @@ function _delete($table, $where)
     	 *
     	 * 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)
    +	protected function _limit($sql, $limit, $offset)
     	{
    -		$i = $limit + $offset;
    -	
    -		return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql);		
    +		return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.($limit + $offset).' ', $sql);
     	}
     
     	// --------------------------------------------------------------------
    @@ -594,18 +554,15 @@ function _limit($sql, $limit, $offset)
     	/**
     	 * Close DB Connection
     	 *
    -	 * @access	public
     	 * @param	resource
     	 * @return	void
     	 */
    -	function _close($conn_id)
    +	protected function _close($conn_id)
     	{
     		@sqlsrv_close($conn_id);
     	}
     
     }
     
    -
    -
    -/* End of file mssql_driver.php */
    -/* Location: ./system/database/drivers/mssql/mssql_driver.php */
    \ No newline at end of file
    +/* End of file sqlsrv_driver.php */
    +/* Location: ./system/database/drivers/sqlsrv/sqlsrv_driver.php */
    diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php
    index 2a77669272f..1367ddc776e 100644
    --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php
    +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php
    @@ -1,13 +1,13 @@
    -db->_escape_identifiers($table);
    +		return 'DROP TABLE '.$this->db->_escape_identifiers($table);
     	}
     
     	// --------------------------------------------------------------------
    @@ -80,15 +76,14 @@ function _drop_table($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
    +	 * @param	bool	should 'IF NOT EXISTS' be added to the SQL
    +	 * @return	string
     	 */
    -	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
    +	public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	{
     		$sql = 'CREATE TABLE ';
     
    @@ -97,54 +92,29 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			$sql .= 'IF NOT EXISTS ';
     		}
     
    -		$sql .= $this->db->_escape_identifiers($table)." (";
    +		$sql .= $this->db->_escape_identifiers($table).' (';
     		$current_field_count = 0;
     
    -		foreach ($fields as $field=>$attributes)
    +		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";
    +				$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';
    -				}
    +				$sql .= "\n\t".$this->db->protect_identifiers($field)
    +					.' '.$attributes['TYPE']
    +					.(array_key_exists('CONSTRAINT', $attributes) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.((array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.(array_key_exists('DEFAULT', $attributes) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    +					.((array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.((array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    @@ -156,8 +126,8 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     
     		if (count($primary_keys) > 0)
     		{
    -			$primary_keys = $this->db->_protect_identifiers($primary_keys);
    -			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
    +			$primary_keys = $this->db->protect_identifiers($primary_keys);
    +			$sql .= ",\n\tPRIMARY KEY (".implode(', ', $primary_keys).')';
     		}
     
     		if (is_array($keys) && count($keys) > 0)
    @@ -166,20 +136,18 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			{
     				if (is_array($key))
     				{
    -					$key = $this->db->_protect_identifiers($key);
    +					$key = $this->db->protect_identifiers($key);
     				}
     				else
     				{
    -					$key = array($this->db->_protect_identifiers($key));
    +					$key = array($this->db->protect_identifiers($key));
     				}
     
    -				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";
    +				$sql .= ",\n\tFOREIGN KEY (".implode(', ', $key).')';
     			}
     		}
     
    -		$sql .= "\n)";
    -
    -		return $sql;
    +		return $sql."\n)";
     	}
     
     	// --------------------------------------------------------------------
    @@ -190,7 +158,6 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	 * 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
    @@ -200,9 +167,9 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	 * @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 = '')
    +	public 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);
    +		$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')
    @@ -210,29 +177,10 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = ''
     			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;
    -
    +		return $sql.' '.$column_definition
    +			.($default_value != '' ? ' DEFAULT "'.$default_value.'"' : '')
    +			.($null === NULL ? ' NULL' : ' NOT NULL')
    +			.($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : '');
     	}
     
     	// --------------------------------------------------------------------
    @@ -242,19 +190,17 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = ''
     	 *
     	 * 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)
    +	public 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;
    +		return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name);
     	}
     
     }
     
    -/* End of file mssql_forge.php */
    -/* Location: ./system/database/drivers/mssql/mssql_forge.php */
    \ No newline at end of file
    +/* End of file sqlsrv_forge.php */
    +/* Location: ./system/database/drivers/sqlsrv/sqlsrv_forge.php */
    diff --git a/system/database/drivers/sqlsrv/sqlsrv_result.php b/system/database/drivers/sqlsrv/sqlsrv_result.php
    index 1ee19c2d16c..c5f9093dbef 100644
    --- a/system/database/drivers/sqlsrv/sqlsrv_result.php
    +++ b/system/database/drivers/sqlsrv/sqlsrv_result.php
    @@ -1,13 +1,13 @@
    -result_id);
     	}
    @@ -54,10 +51,9 @@ function num_rows()
     	/**
     	 * Number of fields in the result set
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function num_fields()
    +	public function num_fields()
     	{
     		return @sqlsrv_num_fields($this->result_id);
     	}
    @@ -69,17 +65,16 @@ function num_fields()
     	 *
     	 * Generates an array of column names
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function list_fields()
    +	public function list_fields()
     	{
     		$field_names = array();
    -		foreach(sqlsrv_field_metadata($this->result_id) as $offset => $field)
    +		foreach (sqlsrv_field_metadata($this->result_id) as $offset => $field)
     		{
     			$field_names[] = $field['Name'];
     		}
    -		
    +
     		return $field_names;
     	}
     
    @@ -90,24 +85,23 @@ function list_fields()
     	 *
     	 * Generates an array of objects containing field meta-data
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function field_data()
    +	public function field_data()
     	{
     		$retval = array();
    -		foreach(sqlsrv_field_metadata($this->result_id) as $offset => $field)
    +		foreach (sqlsrv_field_metadata($this->result_id) as $offset => $field)
     		{
    -			$F 				= new stdClass();
    -			$F->name 		= $field['Name'];
    -			$F->type 		= $field['Type'];
    +			$F 		= new stdClass();
    +			$F->name 	= $field['Name'];
    +			$F->type 	= $field['Type'];
     			$F->max_length	= $field['Size'];
     			$F->primary_key = 0;
    -			$F->default		= '';
    -			
    +			$F->default	= '';
    +
     			$retval[] = $F;
     		}
    -		
    +
     		return $retval;
     	}
     
    @@ -116,9 +110,9 @@ function field_data()
     	/**
     	 * Free the result
     	 *
    -	 * @return	null
    +	 * @return	void
     	 */
    -	function free_result()
    +	public function free_result()
     	{
     		if (is_resource($this->result_id))
     		{
    @@ -136,10 +130,9 @@ function free_result()
     	 * this internally before fetching results to make sure the
     	 * result set starts at zero
     	 *
    -	 * @access	private
    -	 * @return	array
    +	 * @return	void
     	 */
    -	function _data_seek($n = 0)
    +	protected function _data_seek($n = 0)
     	{
     		// Not implemented
     	}
    @@ -151,10 +144,9 @@ function _data_seek($n = 0)
     	 *
     	 * Returns the result set as an array
     	 *
    -	 * @access	private
     	 * @return	array
     	 */
    -	function _fetch_assoc()
    +	protected function _fetch_assoc()
     	{
     		return sqlsrv_fetch_array($this->result_id, SQLSRV_FETCH_ASSOC);
     	}
    @@ -166,16 +158,14 @@ function _fetch_assoc()
     	 *
     	 * Returns the result set as an object
     	 *
    -	 * @access	private
     	 * @return	object
     	 */
    -	function _fetch_object()
    +	protected function _fetch_object()
     	{
     		return sqlsrv_fetch_object($this->result_id);
     	}
     
     }
     
    -
    -/* End of file mssql_result.php */
    -/* Location: ./system/database/drivers/mssql/mssql_result.php */
    \ No newline at end of file
    +/* End of file sqlsrv_result.php */
    +/* Location: ./system/database/drivers/sqlsrv/sqlsrv_result.php */
    diff --git a/system/database/drivers/sqlsrv/sqlsrv_utility.php b/system/database/drivers/sqlsrv/sqlsrv_utility.php
    index e96df96f905..d2a4212085a 100644
    --- a/system/database/drivers/sqlsrv/sqlsrv_utility.php
    +++ b/system/database/drivers/sqlsrv/sqlsrv_utility.php
    @@ -1,13 +1,13 @@
    -db->protect_identifiers($table).' REORGANIZE';
     	}
     
     	// --------------------------------------------------------------------
    @@ -70,13 +66,13 @@ function _optimize_table($table)
     	 *
     	 * Generates a platform-specific query so that a table can be repaired
     	 *
    -	 * @access	private
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	bool
     	 */
    -	function _repair_table($table)
    +	public function _repair_table($table)
     	{
    -		return FALSE; // Is this supported in MS SQL?
    +		// Not supported in MSSQL
    +		return FALSE;
     	}
     
     	// --------------------------------------------------------------------
    @@ -84,11 +80,10 @@ function _repair_table($table)
     	/**
     	 * MSSQL Export
     	 *
    -	 * @access	private
     	 * @param	array	Preferences
    -	 * @return	mixed
    +	 * @return	bool
     	 */
    -	function _backup($params = array())
    +	public function _backup($params = array())
     	{
     		// Currently unsupported
     		return $this->db->display_error('db_unsuported_feature');
    @@ -96,5 +91,5 @@ function _backup($params = array())
     
     }
     
    -/* End of file mssql_utility.php */
    -/* Location: ./system/database/drivers/mssql/mssql_utility.php */
    \ No newline at end of file
    +/* End of file sqlsrv_utility.php */
    +/* Location: ./system/database/drivers/sqlsrv/sqlsrv_utility.php */
    
    From cb9f361feb5f60191fc14a19f23aa0ba2bf91c37 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 02:06:48 +0200
    Subject: [PATCH 0338/5397] DB forge escaping related
    
    ---
     system/database/drivers/sqlite3/sqlite3_driver.php | 12 ++++++------
     system/database/drivers/sqlite3/sqlite3_forge.php  | 12 ++++++------
     2 files changed, 12 insertions(+), 12 deletions(-)
    
    diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php
    index 2e6589b5272..eb9a8f526ad 100644
    --- a/system/database/drivers/sqlite3/sqlite3_driver.php
    +++ b/system/database/drivers/sqlite3/sqlite3_driver.php
    @@ -43,19 +43,19 @@ class CI_DB_sqlite3_driver extends CI_DB {
     	public $dbdriver = 'sqlite3';
     
     	// The character used for escaping
    -	public $_escape_char = '"';
    +	protected $_escape_char = '"';
     
     	// clause and character used for LIKE escape sequences
    -	public $_like_escape_str = ' ESCAPE \'%s\' ';
    -	public $_like_escape_chr = '!';
    +	protected $_like_escape_str = ' ESCAPE \'%s\' ';
    +	protected $_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.
     	 */
    -	public $_count_string = 'SELECT COUNT(*) AS ';
    -	public $_random_keyword = ' RANDOM()';
    +	protected $_count_string = 'SELECT COUNT(*) AS ';
    +	protected $_random_keyword = ' RANDOM()';
     
     	/**
     	 * Non-persistent database connection
    @@ -403,7 +403,7 @@ protected function _error_number()
     	 * @param	string
     	 * @return	string
     	 */
    -	protected function _escape_identifiers($item)
    +	public function _escape_identifiers($item)
     	{
     		if ($this->_escape_char == '')
     		{
    diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php
    index a949701808f..6398e48cd47 100644
    --- a/system/database/drivers/sqlite3/sqlite3_forge.php
    +++ b/system/database/drivers/sqlite3/sqlite3_forge.php
    @@ -111,7 +111,7 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     			{
     				$attributes = array_change_key_case($attributes, CASE_UPPER);
     
    -				$sql .= "\n\t".$this->db->_protect_identifiers($field)
    +				$sql .= "\n\t".$this->db->protect_identifiers($field)
     					.' '.$attributes['TYPE']
     					.(array_key_exists('CONSTRAINT', $attributes) ? '('.$attributes['CONSTRAINT'].')' : '')
     					.((array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    @@ -129,7 +129,7 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     
     		if (count($primary_keys) > 0)
     		{
    -			$primary_keys = $this->db->_protect_identifiers($primary_keys);
    +			$primary_keys = $this->db->protect_identifiers($primary_keys);
     			$sql .= ",\n\tPRIMARY KEY (".implode(', ', $primary_keys).')';
     		}
     
    @@ -139,11 +139,11 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     			{
     				if (is_array($key))
     				{
    -					$key = $this->db->_protect_identifiers($key);
    +					$key = $this->db->protect_identifiers($key);
     				}
     				else
     				{
    -					$key = array($this->db->_protect_identifiers($key));
    +					$key = array($this->db->protect_identifiers($key));
     				}
     
     				$sql .= ",\n\tUNIQUE (".implode(', ', $key).')';
    @@ -195,7 +195,7 @@ public function _alter_table($alter_type, $table, $column_name, $column_definiti
     			return FALSE;
     		}
     
    -		return 'ALTER TABLE '.$this->db->_protect_identifiers($table).' '.$alter_type.' '.$this->db->_protect_identifiers($column_name)
    +		return 'ALTER TABLE '.$this->db->protect_identifiers($table).' '.$alter_type.' '.$this->db->protect_identifiers($column_name)
     			.' '.$column_definition
     			.($default_value != '' ? ' DEFAULT '.$default_value : '')
     			// If NOT NULL is specified, the field must have a DEFAULT value other than NULL
    @@ -215,7 +215,7 @@ public function _alter_table($alter_type, $table, $column_name, $column_definiti
     	 */
     	public function _rename_table($table_name, $new_table_name)
     	{
    -		return 'ALTER TABLE '.$this->db->_protect_identifiers($table_name).' RENAME TO '.$this->db->_protect_identifiers($new_table_name);
    +		return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name);
     	}
     }
     
    
    From b7a47a7b934b2771561c1cefcfc74aeada90e352 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 02:13:33 +0200
    Subject: [PATCH 0339/5397] A minor improvement to insert_id()
    
    ---
     system/database/drivers/mssql/mssql_driver.php | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php
    index 22ed0478e56..4d29920d644 100644
    --- a/system/database/drivers/mssql/mssql_driver.php
    +++ b/system/database/drivers/mssql/mssql_driver.php
    @@ -280,13 +280,13 @@ public function affected_rows()
     	*/
     	public function insert_id()
     	{
    -		$sql = (self::_parse_major_version($this->version()) > 7)
    +		$query = (self::_parse_major_version($this->version()) > 7)
     			? 'SELECT SCOPE_IDENTITY() AS last_id'
     			: 'SELECT @@IDENTITY AS last_id';
     
    -		$query = $this->query($sql);
    -		$row = $query->row();
    -		return $row->last_id;
    +		$query = $this->query($query);
    +		$query = $query->row();
    +		return $query->last_id;
     	}
     
     	// --------------------------------------------------------------------
    
    From f32110a952f8e1f58c4c0f13715681c248bc8ace Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 11:04:11 +0200
    Subject: [PATCH 0340/5397] Fix a comment typo
    
    ---
     system/database/DB_driver.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index eb6ab743063..113c3d3fe8b 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -74,7 +74,7 @@ class CI_DB_driver {
     	protected $_protect_identifiers	= TRUE;
     	protected $_reserved_identifiers	= array('*'); // Identifiers that should NOT be escaped
     
    -	// These are use with Oracle
    +	// These are used with Oracle
     	public $stmt_id;
     	public $curs_id;
     	public $limit_used;
    
    From d90387867fbc8e1d10058cf65805a7ae5c8cbaeb Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 12:38:49 +0200
    Subject: [PATCH 0341/5397] Improve the SQLite database driver
    
    ---
     .../database/drivers/sqlite/sqlite_driver.php | 238 +++++++-----------
     .../database/drivers/sqlite/sqlite_forge.php  | 151 ++++-------
     .../database/drivers/sqlite/sqlite_result.php |  76 +++---
     .../drivers/sqlite/sqlite_utility.php         |  37 +--
     4 files changed, 171 insertions(+), 331 deletions(-)
    
    diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php
    index 28c3caecd0b..96458e032ea 100644
    --- a/system/database/drivers/sqlite/sqlite_driver.php
    +++ b/system/database/drivers/sqlite/sqlite_driver.php
    @@ -1,13 +1,13 @@
    -database, FILE_WRITE_MODE, $error))
     		{
    @@ -89,10 +84,9 @@ function db_connect()
     	/**
     	 * Persistent database connection
     	 *
    -	 * @access	private called by the base class
     	 * @return	resource
     	 */
    -	function db_pconnect()
    +	public function db_pconnect()
     	{
     		if ( ! $conn_id = @sqlite_popen($this->database, FILE_WRITE_MODE, $error))
     		{
    @@ -117,12 +111,11 @@ function db_pconnect()
     	 * 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()
    +	public function reconnect()
     	{
    -		// not implemented in SQLite
    +		// Not supported in SQLite
     	}
     
     	// --------------------------------------------------------------------
    @@ -130,11 +123,11 @@ function reconnect()
     	/**
     	 * Select the database
     	 *
    -	 * @access	private called by the base class
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function db_select()
    +	public function db_select()
     	{
    +		// Not needed, in SQLite every pseudo-connection is a database
     		return TRUE;
     	}
     
    @@ -143,14 +136,13 @@ function db_select()
     	/**
     	 * Set client character set
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @param	string
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function db_set_charset($charset, $collation)
    +	public function db_set_charset($charset, $collation)
     	{
    -		// @todo - add support if needed
    +		// Not supported
     		return TRUE;
     	}
     
    @@ -159,10 +151,9 @@ function db_set_charset($charset, $collation)
     	/**
     	 * Version number query string
     	 *
    -	 * @access	public
     	 * @return	string
     	 */
    -	function _version()
    +	public function _version()
     	{
     		return sqlite_libversion();
     	}
    @@ -172,13 +163,18 @@ function _version()
     	/**
     	 * Execute the query
     	 *
    -	 * @access	private called by the base class
     	 * @param	string	an SQL query
     	 * @return	resource
     	 */
    -	function _execute($sql)
    +	protected function _execute($sql)
     	{
     		$sql = $this->_prep_query($sql);
    +
    +		if ( ! preg_match('/^(SELECT|EXPLAIN).+$/i', ltrim($sql)))
    +		{
    +			return @sqlite_exec($this->conn_id, $sql);
    +		}
    +
     		return @sqlite_query($this->conn_id, $sql);
     	}
     
    @@ -189,11 +185,10 @@ function _execute($sql)
     	 *
     	 * 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)
    +	protected function _prep_query($sql)
     	{
     		return $sql;
     	}
    @@ -203,18 +198,12 @@ function _prep_query($sql)
     	/**
     	 * Begin Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_begin($test_mode = FALSE)
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -222,7 +211,7 @@ function trans_begin($test_mode = FALSE)
     		// 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->_trans_failure = ($test_mode === TRUE);
     
     		$this->simple_query('BEGIN TRANSACTION');
     		return TRUE;
    @@ -233,18 +222,12 @@ function trans_begin($test_mode = FALSE)
     	/**
     	 * Commit Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_commit()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -258,18 +241,12 @@ function trans_commit()
     	/**
     	 * Rollback Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_rollback()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -283,12 +260,11 @@ function trans_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)
    +	public function escape_str($str, $like = FALSE)
     	{
     		if (is_array($str))
     		{
    @@ -305,9 +281,9 @@ function escape_str($str, $like = FALSE)
     		// 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_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;
    @@ -318,10 +294,9 @@ function escape_str($str, $like = FALSE)
     	/**
     	 * Affected Rows
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function affected_rows()
    +	public function affected_rows()
     	{
     		return sqlite_changes($this->conn_id);
     	}
    @@ -331,10 +306,9 @@ function affected_rows()
     	/**
     	 * Insert ID
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function insert_id()
    +	public function insert_id()
     	{
     		return @sqlite_last_insert_rowid($this->conn_id);
     	}
    @@ -347,27 +321,25 @@ function insert_id()
     	 * Generates a platform-specific query string that counts all records in
     	 * the specified database
     	 *
    -	 * @access	public
     	 * @param	string
    -	 * @return	string
    +	 * @return	int
     	 */
    -	function count_all($table = '')
    +	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));
    -
    +		$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();
    +		$query = $query->row();
     		$this->_reset_select();
    -		return (int) $row->numrows;
    +		return (int) $query->numrows;
     	}
     
     	// --------------------------------------------------------------------
    @@ -377,18 +349,18 @@ function count_all($table = '')
     	 *
     	 * Generates a platform-specific query string so that the table names can be fetched
     	 *
    -	 * @access	private
    -	 * @param	boolean
    +	 * @param	bool
     	 * @return	string
     	 */
    -	function _list_tables($prefix_limit = FALSE)
    +	protected function _list_tables($prefix_limit = FALSE)
     	{
    -		$sql = "SELECT name from sqlite_master WHERE type='table'";
    +		$sql = "SELECT name FROM sqlite_master WHERE type='table'";
     
    -		if ($prefix_limit !== FALSE AND $this->dbprefix != '')
    +		if ($prefix_limit !== FALSE && $this->dbprefix != '')
     		{
    -			$sql .= " AND 'name' LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr);
    +			return $sql." AND 'name' LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr);
     		}
    +
     		return $sql;
     	}
     
    @@ -399,11 +371,10 @@ function _list_tables($prefix_limit = FALSE)
     	 *
     	 * Generates a platform-specific query string so that the column names can be fetched
     	 *
    -	 * @access	public
     	 * @param	string	the table name
    -	 * @return	string
    +	 * @return	bool
     	 */
    -	function _list_columns($table = '')
    +	protected function _list_columns($table = '')
     	{
     		// Not supported
     		return FALSE;
    @@ -416,13 +387,12 @@ function _list_columns($table = '')
     	 *
     	 * Generates a platform-specific query so that the column data can be retrieved
     	 *
    -	 * @access	public
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	string
     	 */
    -	function _field_data($table)
    +	protected function _field_data($table)
     	{
    -		return "SELECT * FROM ".$table." LIMIT 1";
    +		return 'SELECT * FROM '.$table.' LIMIT 1';
     	}
     
     	// --------------------------------------------------------------------
    @@ -430,10 +400,9 @@ function _field_data($table)
     	/**
     	 * The error message string
     	 *
    -	 * @access	private
     	 * @return	string
     	 */
    -	function _error_message()
    +	protected function _error_message()
     	{
     		return sqlite_error_string(sqlite_last_error($this->conn_id));
     	}
    @@ -443,10 +412,9 @@ function _error_message()
     	/**
     	 * The error message number
     	 *
    -	 * @access	private
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function _error_number()
    +	protected function _error_number()
     	{
     		return sqlite_last_error($this->conn_id);
     	}
    @@ -458,11 +426,10 @@ function _error_number()
     	 *
     	 * This function escapes column and table names
     	 *
    -	 * @access	private
     	 * @param	string
     	 * @return	string
     	 */
    -	function _escape_identifiers($item)
    +	public function _escape_identifiers($item)
     	{
     		if ($this->_escape_char == '')
     		{
    @@ -473,24 +440,20 @@ function _escape_identifiers($item)
     		{
     			if (strpos($item, '.'.$id) !== FALSE)
     			{
    -				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);
    +				$item = 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);
    +				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item);
     			}
     		}
     
     		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;
    +			$item = str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item);
     		}
     
     		// remove duplicates if the user already included the escape
    -		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
    +		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item.$this->_escape_char);
     	}
     
     	// --------------------------------------------------------------------
    @@ -501,11 +464,10 @@ function _escape_identifiers($item)
     	 * 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)
    +	protected function _from_tables($tables)
     	{
     		if ( ! is_array($tables))
     		{
    @@ -522,15 +484,14 @@ function _from_tables($tables)
     	 *
     	 * 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)
    +	protected function _insert($table, $keys, $values)
     	{
    -		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
    +		return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
     	}
     
     	// --------------------------------------------------------------------
    @@ -540,7 +501,6 @@ function _insert($table, $keys, $values)
     	 *
     	 * 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
    @@ -548,24 +508,17 @@ function _insert($table, $keys, $values)
     	 * @param	array	the limit clause
     	 * @return	string
     	 */
    -	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
    +	protected function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
     	{
     		foreach ($values as $key => $val)
     		{
    -			$valstr[] = $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;
    +		return 'UPDATE '.$table.' SET '.implode(', ', $valstr)
    +			.(($where != '' && count($where) > 0) ? ' WHERE '.implode(' ', $where) : '')
    +			.(count($orderby) > 0 ? ' ORDER BY '.implode(', ', $orderby) : '')
    +			.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     
    @@ -578,11 +531,10 @@ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
     	 * 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)
    +	protected function _truncate($table)
     	{
     		return $this->_delete($table);
     	}
    @@ -594,31 +546,27 @@ function _truncate($table)
     	 *
     	 * 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)
    +	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);
    +			$conditions = "\nWHERE ".implode("\n", $this->ar_where);
     
     			if (count($where) > 0 && count($like) > 0)
     			{
    -				$conditions .= " AND ";
    +				$conditions .= ' AND ';
     			}
     			$conditions .= implode("\n", $like);
     		}
     
    -		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
    -
    -		return "DELETE FROM ".$table.$conditions.$limit;
    +		return 'DELETE FROM '.$table.$conditions.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     	// --------------------------------------------------------------------
    @@ -628,24 +576,14 @@ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
     	 *
     	 * 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
    +	 * @param	int	the number of rows to limit the query to
    +	 * @param	int	the offset value
     	 * @return	string
     	 */
    -	function _limit($sql, $limit, $offset)
    +	protected function _limit($sql, $limit, $offset)
     	{
    -		if ($offset == 0)
    -		{
    -			$offset = '';
    -		}
    -		else
    -		{
    -			$offset .= ", ";
    -		}
    -
    -		return $sql."LIMIT ".$offset.$limit;
    +		return $sql.'LIMIT '.($offset == 0 ? '' : ', ').$limit;
     	}
     
     	// --------------------------------------------------------------------
    @@ -653,11 +591,10 @@ function _limit($sql, $limit, $offset)
     	/**
     	 * Close DB Connection
     	 *
    -	 * @access	public
     	 * @param	resource
     	 * @return	void
     	 */
    -	function _close($conn_id)
    +	protected function _close($conn_id)
     	{
     		@sqlite_close($conn_id);
     	}
    @@ -665,6 +602,5 @@ function _close($conn_id)
     
     }
     
    -
     /* End of file sqlite_driver.php */
    -/* Location: ./system/database/drivers/sqlite/sqlite_driver.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/sqlite/sqlite_driver.php */
    diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php
    index 2b723be0b65..8bf1f25956e 100644
    --- a/system/database/drivers/sqlite/sqlite_forge.php
    +++ b/system/database/drivers/sqlite/sqlite_forge.php
    @@ -1,13 +1,13 @@
    -db->database) OR ! @unlink($this->db->database))
     		{
    -			if ($this->db->db_debug)
    -			{
    -				return $this->db->display_error('db_unable_to_drop');
    -			}
    -			return FALSE;
    +			return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE;
     		}
    +
     		return TRUE;
     	}
     	// --------------------------------------------------------------------
    @@ -76,15 +69,14 @@ function _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
    +	 * @param	bool	should 'IF NOT EXISTS' be added to the SQL
     	 * @return	bool
     	 */
    -	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
    +	public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	{
     		$sql = 'CREATE TABLE ';
     
    @@ -94,54 +86,29 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			$sql .= 'IF NOT EXISTS ';
     		}
     
    -		$sql .= $this->db->_escape_identifiers($table)."(";
    +		$sql .= $this->db->_escape_identifiers($table).'(';
     		$current_field_count = 0;
     
    -		foreach ($fields as $field=>$attributes)
    +		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";
    +				$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';
    -				}
    +				$sql .= "\n\t".$this->db->protect_identifiers($field)
    +					.' '.$attributes['TYPE']
    +					.(array_key_exists('CONSTRAINT', $attributes) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.((array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.(array_key_exists('DEFAULT', $attributes) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    +					.((array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.((array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    @@ -153,8 +120,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     
     		if (count($primary_keys) > 0)
     		{
    -			$primary_keys = $this->db->_protect_identifiers($primary_keys);
    -			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
    +			$sql .= ",\n\tPRIMARY KEY (".implode(', ', $this->db->protect_identifiers($primary_keys)).')';
     		}
     
     		if (is_array($keys) && count($keys) > 0)
    @@ -163,20 +129,18 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			{
     				if (is_array($key))
     				{
    -					$key = $this->db->_protect_identifiers($key);
    +					$key = $this->db->protect_identifiers($key);
     				}
     				else
     				{
    -					$key = array($this->db->_protect_identifiers($key));
    +					$key = array($this->db->protect_identifiers($key));
     				}
     
    -				$sql .= ",\n\tUNIQUE (" . implode(', ', $key) . ")";
    +				$sql .= ",\n\tUNIQUE (".implode(', ', $key).')';
     			}
     		}
     
    -		$sql .= "\n)";
    -
    -		return $sql;
    +		return $sql."\n)";
     	}
     
     	// --------------------------------------------------------------------
    @@ -184,18 +148,11 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	/**
     	 * Drop Table
     	 *
    -	 *  Unsupported feature in SQLite
    -	 *
    -	 * @access	private
    -	 * @return	bool
    +	 * @return	string
     	 */
    -	function _drop_table($table)
    +	public function _drop_table($table)
     	{
    -		if ($this->db->db_debug)
    -		{
    -			return $this->db->display_error('db_unsuported_feature');
    -		}
    -		return array();
    +		return 'DROP TABLE '.$table.' IF EXISTS';
     	}
     
     	// --------------------------------------------------------------------
    @@ -206,7 +163,6 @@ function _drop_table($table)
     	 * 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
    @@ -214,44 +170,25 @@ function _drop_table($table)
     	 * @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
    +	 * @return	string
     	 */
    -	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
    +	public 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 only supports adding new columns and it does
    +		 * NOT support the AFTER statement. Each new column will
    +		 * be added as the last one in the table.
    +		 */
    +		if ($alter_type !== 'ADD COLUMN')
     		{
    -			// SQLite does not support dropping columns
    -			// http://www.sqlite.org/omitted.html
    -			// http://www.sqlite.org/faq.html#q11
    +			// Not supported
     			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;
    -
    +		return 'ALTER TABLE '.$this->db->protect_identifiers($table).' '.$alter_type.' '.$this->db->protect_identifiers($column_name)
    +			.' '.$column_definition
    +			.($default_value != '' ? ' DEFAULT "'.$default_value.'"' : '')
    +			// If NOT NULL is specified, the field must have a DEFAULT value other than NULL
    +			.(($null !== NULL && $default_value !== 'NULL') ? ' NOT NULL' : ' NULL');
     	}
     
     	// --------------------------------------------------------------------
    @@ -261,17 +198,15 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = ''
     	 *
     	 * 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)
    +	public 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;
    +		return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name);
     	}
     }
     
     /* End of file sqlite_forge.php */
    -/* Location: ./system/database/drivers/sqlite/sqlite_forge.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/sqlite/sqlite_forge.php */
    diff --git a/system/database/drivers/sqlite/sqlite_result.php b/system/database/drivers/sqlite/sqlite_result.php
    index 74c0dc549bf..91fe57ae16d 100644
    --- a/system/database/drivers/sqlite/sqlite_result.php
    +++ b/system/database/drivers/sqlite/sqlite_result.php
    @@ -1,13 +1,13 @@
    -result_id);
     	}
    @@ -54,10 +51,9 @@ function num_rows()
     	/**
     	 * Number of fields in the result set
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function num_fields()
    +	public function num_fields()
     	{
     		return @sqlite_num_fields($this->result_id);
     	}
    @@ -69,13 +65,12 @@ function num_fields()
     	 *
     	 * Generates an array of column names
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function list_fields()
    +	public function list_fields()
     	{
     		$field_names = array();
    -		for ($i = 0; $i < $this->num_fields(); $i++)
    +		for ($i = 0, $c = $this->num_fields(); $i < $c; $i++)
     		{
     			$field_names[] = sqlite_field_name($this->result_id, $i);
     		}
    @@ -90,22 +85,19 @@ function list_fields()
     	 *
     	 * Generates an array of objects containing field meta-data
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function field_data()
    +	public function field_data()
     	{
     		$retval = array();
    -		for ($i = 0; $i < $this->num_fields(); $i++)
    +		for ($i = 0, $c = $this->num_fields(); $i < $c; $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;
    +			$retval[$i]			= new stdClass();
    +			$retval[$i]->name		= sqlite_field_name($this->result_id, $i);
    +			$retval[$i]->type		= 'varchar';
    +			$retval[$i]->max_length		= 0;
    +			$retval[$i]->primary_key	= 0;
    +			$retval[$i]->default		= '';
     		}
     
     		return $retval;
    @@ -116,11 +108,11 @@ function field_data()
     	/**
     	 * Free the result
     	 *
    -	 * @return	null
    +	 * @return	void
     	 */
    -	function free_result()
    +	public function free_result()
     	{
    -		// Not implemented in SQLite
    +		// Not supported in SQLite
     	}
     
     	// --------------------------------------------------------------------
    @@ -128,14 +120,13 @@ function free_result()
     	/**
     	 * Data Seek
     	 *
    -	 * Moves the internal pointer to the desired offset.  We call
    +	 * 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)
    +	protected function _data_seek($n = 0)
     	{
     		return sqlite_seek($this->result_id, $n);
     	}
    @@ -147,10 +138,9 @@ function _data_seek($n = 0)
     	 *
     	 * Returns the result set as an array
     	 *
    -	 * @access	private
     	 * @return	array
     	 */
    -	function _fetch_assoc()
    +	protected function _fetch_assoc()
     	{
     		return sqlite_fetch_array($this->result_id);
     	}
    @@ -162,30 +152,20 @@ function _fetch_assoc()
     	 *
     	 * Returns the result set as an object
     	 *
    -	 * @access	private
     	 * @return	object
     	 */
    -	function _fetch_object()
    +	protected 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;
    -			}
    -		}
    +
    +		$arr = sqlite_fetch_array($this->result_id, SQLITE_ASSOC);
    +		return is_array($arr) ? (object) $arr : FALSE;
     	}
     
     }
     
    -
     /* End of file sqlite_result.php */
    -/* Location: ./system/database/drivers/sqlite/sqlite_result.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/sqlite/sqlite_result.php */
    diff --git a/system/database/drivers/sqlite/sqlite_utility.php b/system/database/drivers/sqlite/sqlite_utility.php
    index f00687e3833..358fe747fb1 100644
    --- a/system/database/drivers/sqlite/sqlite_utility.php
    +++ b/system/database/drivers/sqlite/sqlite_utility.php
    @@ -1,13 +1,13 @@
    -db_debug)
    -		{
    -			return $this->db->display_error('db_unsuported_feature');
    -		}
    -		return array();
    +		return ($this->db_debug) ? $this->db->display_error('db_unsuported_feature') : FALSE;
     	}
     
     	// --------------------------------------------------------------------
    @@ -61,14 +54,12 @@ function _list_databases()
     	/**
     	 * Optimize table query
     	 *
    -	 * Is optimization even supported in SQLite?
    -	 *
    -	 * @access	private
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	bool
     	 */
    -	function _optimize_table($table)
    +	public function _optimize_table($table)
     	{
    +		// Not supported
     		return FALSE;
     	}
     
    @@ -77,14 +68,13 @@ function _optimize_table($table)
     	/**
     	 * Repair table query
     	 *
    -	 * Are table repairs even supported in SQLite?
     	 *
    -	 * @access	private
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	bool
     	 */
    -	function _repair_table($table)
    +	public function _repair_table($table)
     	{
    +		// Not supported
     		return FALSE;
     	}
     
    @@ -93,11 +83,10 @@ function _repair_table($table)
     	/**
     	 * SQLite Export
     	 *
    -	 * @access	private
     	 * @param	array	Preferences
     	 * @return	mixed
     	 */
    -	function _backup($params = array())
    +	public function _backup($params = array())
     	{
     		// Currently unsupported
     		return $this->db->display_error('db_unsuported_feature');
    @@ -105,4 +94,4 @@ function _backup($params = array())
     }
     
     /* End of file sqlite_utility.php */
    -/* Location: ./system/database/drivers/sqlite/sqlite_utility.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/sqlite/sqlite_utility.php */
    
    From 7f55d6133b70346a428ae481d1fe57bf4d4d2320 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 13:44:28 +0200
    Subject: [PATCH 0342/5397] Improve the CUBRID database driver
    
    ---
     .../database/drivers/cubrid/cubrid_driver.php | 284 ++++++------------
     .../database/drivers/cubrid/cubrid_forge.php  | 136 +++------
     .../database/drivers/cubrid/cubrid_result.php |  68 ++---
     .../drivers/cubrid/cubrid_utility.php         |  35 +--
     4 files changed, 183 insertions(+), 340 deletions(-)
    
    diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php
    index cde719eae08..1cfaf3e42e2 100644
    --- a/system/database/drivers/cubrid/cubrid_driver.php
    +++ b/system/database/drivers/cubrid/cubrid_driver.php
    @@ -1,13 +1,13 @@
    -port == '')
     		{
    -			$this->port = self::DEFAULT_PORT;
    +			// Default CUBRID broker port
    +			$this->port = 33000;
     		}
    +	}
     
    +	/**
    +	 * Non-persistent database connection
    +	 *
    +	 * @return	resource
    +	 */
    +	public function db_connect()
    +	{
     		$conn = cubrid_connect($this->hostname, $this->port, $this->database, $this->username, $this->password);
     
     		if ($conn)
    @@ -112,7 +109,7 @@ function db_connect()
     	 * @access	private called by the base class
     	 * @return	resource
     	 */
    -	function db_pconnect()
    +	public function db_pconnect()
     	{
     		return $this->db_connect();
     	}
    @@ -125,10 +122,9 @@ function db_pconnect()
     	 * 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()
    +	public function reconnect()
     	{
     		if (cubrid_ping($this->conn_id) === FALSE)
     		{
    @@ -141,10 +137,9 @@ function reconnect()
     	/**
     	 * Select the database
     	 *
    -	 * @access	private called by the base class
     	 * @return	resource
     	 */
    -	function db_select()
    +	public function db_select()
     	{
     		// In CUBRID there is no need to select a database as the database
     		// is chosen at the connection time.
    @@ -158,12 +153,11 @@ function db_select()
     	/**
     	 * Set client character set
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @param	string
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function db_set_charset($charset, $collation)
    +	public 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
    @@ -176,16 +170,10 @@ function db_set_charset($charset, $collation)
     	/**
     	 * Version number query string
     	 *
    -	 * @access	public
     	 * @return	string
     	 */
    -	function _version()
    +	protected 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);
     	}
     
    @@ -194,11 +182,10 @@ function _version()
     	/**
     	 * Execute the query
     	 *
    -	 * @access	private called by the base class
     	 * @param	string	an SQL query
     	 * @return	resource
     	 */
    -	function _execute($sql)
    +	protected function _execute($sql)
     	{
     		$sql = $this->_prep_query($sql);
     		return @cubrid_query($sql, $this->conn_id);
    @@ -211,11 +198,10 @@ function _execute($sql)
     	 *
     	 * 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)
    +	protected function _prep_query($sql)
     	{
     		// No need to prepare
     		return $sql;
    @@ -226,18 +212,12 @@ function _prep_query($sql)
     	/**
     	 * Begin Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_begin($test_mode = FALSE)
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -245,7 +225,7 @@ function trans_begin($test_mode = FALSE)
     		// 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->_trans_failure = ($test_mode === TRUE);
     
     		if (cubrid_get_autocommit($this->conn_id))
     		{
    @@ -260,18 +240,12 @@ function trans_begin($test_mode = FALSE)
     	/**
     	 * Commit Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_commit()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -291,18 +265,12 @@ function trans_commit()
     	/**
     	 * Rollback Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_rollback()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -322,12 +290,11 @@ function trans_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)
    +	public function escape_str($str, $like = FALSE)
     	{
     		if (is_array($str))
     		{
    @@ -339,7 +306,7 @@ function escape_str($str, $like = FALSE)
     			return $str;
     		}
     
    -		if (function_exists('cubrid_real_escape_string') AND is_resource($this->conn_id))
    +		if (function_exists('cubrid_real_escape_string') && is_resource($this->conn_id))
     		{
     			$str = cubrid_real_escape_string($str, $this->conn_id);
     		}
    @@ -351,7 +318,7 @@ function escape_str($str, $like = FALSE)
     		// escape LIKE condition wildcards
     		if ($like === TRUE)
     		{
    -			$str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
    +			return str_replace(array('%', '_'), array('\\%', '\\_'), $str);
     		}
     
     		return $str;
    @@ -362,10 +329,9 @@ function escape_str($str, $like = FALSE)
     	/**
     	 * Affected Rows
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function affected_rows()
    +	public function affected_rows()
     	{
     		return @cubrid_affected_rows($this->conn_id);
     	}
    @@ -375,10 +341,9 @@ function affected_rows()
     	/**
     	 * Insert ID
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function insert_id()
    +	public function insert_id()
     	{
     		return @cubrid_insert_id($this->conn_id);
     	}
    @@ -391,27 +356,24 @@ function insert_id()
     	 * Generates a platform-specific query string that counts all records in
     	 * the specified table
     	 *
    -	 * @access	public
     	 * @param	string
    -	 * @return	string
    +	 * @return	int
     	 */
    -	function count_all($table = '')
    +	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));
    -
    +		$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();
    +		$query = $query->row();
     		$this->_reset_select();
    -		return (int) $row->numrows;
    +		return (int) $query->numrows;
     	}
     
     	// --------------------------------------------------------------------
    @@ -421,17 +383,16 @@ function count_all($table = '')
     	 *
     	 * 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)
    +	protected function _list_tables($prefix_limit = FALSE)
     	{
    -		$sql = "SHOW TABLES";
    +		$sql = 'SHOW TABLES';
     
    -		if ($prefix_limit !== FALSE AND $this->dbprefix != '')
    +		if ($prefix_limit !== FALSE && $this->dbprefix != '')
     		{
    -			$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'";
    +			return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'";
     		}
     
     		return $sql;
    @@ -444,13 +405,12 @@ function _list_tables($prefix_limit = FALSE)
     	 *
     	 * 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 = '')
    +	protected function _list_columns($table = '')
     	{
    -		return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE);
    +		return 'SHOW COLUMNS FROM '.$this->_protect_identifiers($table, TRUE, NULL, FALSE);
     	}
     
     	// --------------------------------------------------------------------
    @@ -460,13 +420,12 @@ function _list_columns($table = '')
     	 *
     	 * Generates a platform-specific query so that the column data can be retrieved
     	 *
    -	 * @access	public
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	string
     	 */
    -	function _field_data($table)
    +	protected function _field_data($table)
     	{
    -		return "SELECT * FROM ".$table." LIMIT 1";
    +		return 'SELECT * FROM '.$table.' LIMIT 1';
     	}
     
     	// --------------------------------------------------------------------
    @@ -474,10 +433,9 @@ function _field_data($table)
     	/**
     	 * The error message string
     	 *
    -	 * @access	private
     	 * @return	string
     	 */
    -	function _error_message()
    +	protected function _error_message()
     	{
     		return cubrid_error($this->conn_id);
     	}
    @@ -487,10 +445,9 @@ function _error_message()
     	/**
     	 * The error message number
     	 *
    -	 * @access	private
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function _error_number()
    +	protected function _error_number()
     	{
     		return cubrid_errno($this->conn_id);
     	}
    @@ -502,11 +459,10 @@ function _error_number()
     	 *
     	 * This function escapes column and table names
     	 *
    -	 * @access	private
     	 * @param	string
     	 * @return	string
     	 */
    -	function _escape_identifiers($item)
    +	public function _escape_identifiers($item)
     	{
     		if ($this->_escape_char == '')
     		{
    @@ -517,24 +473,20 @@ function _escape_identifiers($item)
     		{
     			if (strpos($item, '.'.$id) !== FALSE)
     			{
    -				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);
    +				$item = 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);
    +				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item);
     			}
     		}
     
     		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;
    +			$item = str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item);
     		}
     
     		// remove duplicates if the user already included the escape
    -		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
    +		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item.$this->_escape_char);
     	}
     
     	// --------------------------------------------------------------------
    @@ -545,11 +497,10 @@ function _escape_identifiers($item)
     	 * 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
    +	 * @param	string	the table name
    +	 * @return	string
     	 */
    -	function _from_tables($tables)
    +	protected function _from_tables($tables)
     	{
     		if ( ! is_array($tables))
     		{
    @@ -566,15 +517,14 @@ function _from_tables($tables)
     	 *
     	 * 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)
    +	protected function _insert($table, $keys, $values)
     	{
    -		return "INSERT INTO ".$table." (\"".implode('", "', $keys)."\") VALUES (".implode(', ', $values).")";
    +		return 'INSERT INTO '.$table.' ("'.implode('", "', $keys).'") VALUES ('.implode(', ', $values).')';
     	}
     
     	// --------------------------------------------------------------------
    @@ -585,15 +535,14 @@ function _insert($table, $keys, $values)
     	 *
     	 * 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)
    +	protected function _replace($table, $keys, $values)
     	{
    -		return "REPLACE INTO ".$table." (\"".implode('", "', $keys)."\") VALUES (".implode(', ', $values).")";
    +		return 'REPLACE INTO '.$table.' ("'.implode('", "', $keys).'") VALUES ('.implode(', ', $values).')';
     	}
     
     	// --------------------------------------------------------------------
    @@ -603,26 +552,23 @@ function _replace($table, $keys, $values)
     	 *
     	 * 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)
    +	protected function _insert_batch($table, $keys, $values)
     	{
    -		return "INSERT INTO ".$table." (\"".implode('", "', $keys)."\") VALUES ".implode(', ', $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
    @@ -630,24 +576,17 @@ function _insert_batch($table, $keys, $values)
     	 * @param	array	the limit clause
     	 * @return	string
     	 */
    -	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
    +	protected 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;
    +		return 'UPDATE '.$table.' SET '.implode(', ', $valstr)
    +			.(($where != '' && count($where) > 0) ? ' WHERE '.implode(' ', $where) : '')
    +			.(count($orderby) > 0 ? ' ORDER BY '.implode(', ', $orderby) : '')
    +			.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     	// --------------------------------------------------------------------
    @@ -658,16 +597,15 @@ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
     	 *
     	 * 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)
    +	protected function _update_batch($table, $values, $index, $where = NULL)
     	{
     		$ids = array();
    -		$where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : '';
    +		$where = ($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : '';
     
     		foreach ($values as $key => $val)
     		{
    @@ -682,30 +620,23 @@ function _update_batch($table, $values, $index, $where = NULL)
     			}
     		}
     
    -		$sql = "UPDATE ".$table." SET ";
    +		$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, ';
    +			$cases .= $k." = CASE \n"
    +				.implode("\n", $v)
    +				.'ELSE '.$k.' END, ';
     		}
     
    -		$sql .= substr($cases, 0, -2);
    -
    -		$sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')';
    -
    -		return $sql;
    +		return $sql.substr($cases, 0, -2)
    +			.' WHERE '.(($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : '')
    +			.$index.' IN ('.implode(',', $ids).')';
     	}
     
     	// --------------------------------------------------------------------
     
    -
     	/**
     	 * Truncate statement
     	 *
    @@ -713,13 +644,12 @@ function _update_batch($table, $values, $index, $where = NULL)
     	 * 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)
    +	protected function _truncate($table)
     	{
    -		return "TRUNCATE ".$table;
    +		return 'TRUNCATE '.$table;
     	}
     
     	// --------------------------------------------------------------------
    @@ -729,31 +659,27 @@ function _truncate($table)
     	 *
     	 * 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)
    +	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);
    +			$conditions = "\nWHERE ".implode("\n", $this->ar_where);
     
     			if (count($where) > 0 && count($like) > 0)
     			{
    -				$conditions .= " AND ";
    +				$conditions .= ' AND ';
     			}
     			$conditions .= implode("\n", $like);
     		}
     
    -		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
    -
    -		return "DELETE FROM ".$table.$conditions.$limit;
    +		return 'DELETE FROM '.$table.$conditions.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     	// --------------------------------------------------------------------
    @@ -763,24 +689,14 @@ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
     	 *
     	 * 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
    +	 * @param	int	the number of rows to limit the query to
    +	 * @param	int	the offset value
     	 * @return	string
     	 */
    -	function _limit($sql, $limit, $offset)
    +	protected function _limit($sql, $limit, $offset)
     	{
    -		if ($offset == 0)
    -		{
    -			$offset = '';
    -		}
    -		else
    -		{
    -			$offset .= ", ";
    -		}
    -
    -		return $sql."LIMIT ".$offset.$limit;
    +		return $sql.'LIMIT '.($offset == 0 ? '' : ', ').$limit;
     	}
     
     	// --------------------------------------------------------------------
    @@ -788,17 +704,15 @@ function _limit($sql, $limit, $offset)
     	/**
     	 * Close DB Connection
     	 *
    -	 * @access	public
     	 * @param	resource
     	 * @return	void
     	 */
    -	function _close($conn_id)
    +	protected function _close($conn_id)
     	{
     		@cubrid_close($conn_id);
     	}
     
     }
     
    -
     /* End of file cubrid_driver.php */
    -/* Location: ./system/database/drivers/cubrid/cubrid_driver.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/cubrid/cubrid_driver.php */
    diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php
    index 85e7400574d..ce5aa2098cb 100644
    --- a/system/database/drivers/cubrid/cubrid_forge.php
    +++ b/system/database/drivers/cubrid/cubrid_forge.php
    @@ -1,13 +1,13 @@
    -$attributes)
    +		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";
    +				$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']).' ';
    -				}
    +				$sql .= "\n\t\"".$this->db->protect_identifiers($field).'"'
    +					.(array_key_exists('NAME', $attributes) ? ' '.$this->db->protect_identifiers($attributes['NAME']).' ' : '');
     
     				if (array_key_exists('TYPE', $attributes))
     				{
    @@ -113,9 +104,8 @@ function _process_fields($fields)
     							case 'numeric':
     								$sql .= '('.implode(',', $attributes['CONSTRAINT']).')';
     								break;
    -							case 'enum': 	// As of version 8.4.0 CUBRID does not support
    -											// enum data type.
    -											break;
    +							case 'enum': // As of version 8.4.0 CUBRID does not support enum data type
    +								break;
     							case 'set':
     								$sql .= '("'.implode('","', $attributes['CONSTRAINT']).'")';
     								break;
    @@ -125,36 +115,19 @@ function _process_fields($fields)
     					}
     				}
     
    +			/* 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('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';
    +					$sql .= ' UNSIGNED';
     				}
    +			 */
     
    -				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';
    -				}
    +				$sql .= (array_key_exists('DEFAULT', $attributes) ? " DEFAULT '".$attributes['DEFAULT']."'" : '')
    +					.((array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.((array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '')
    +					.((array_key_exists('UNIQUE', $attributes) && $attributes['UNIQUE'] === TRUE) ? ' UNIQUE' : '');
     			}
     
     			// don't add a comma on the end of the last field
    @@ -172,7 +145,6 @@ function _process_fields($fields)
     	/**
     	 * Create Table
     	 *
    -	 * @access	private
     	 * @param	string	the table name
     	 * @param	mixed	the fields
     	 * @param	mixed	primary key(s)
    @@ -180,28 +152,24 @@ function _process_fields($fields)
     	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL
     	 * @return	bool
     	 */
    -	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
    +	public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	{
     		$sql = 'CREATE TABLE ';
     
    +		/* As of version 8.4.0 CUBRID does not support this SQL syntax.
     		if ($if_not_exists === TRUE)
     		{
    -			//$sql .= 'IF NOT EXISTS ';
    -			// As of version 8.4.0 CUBRID does not support this SQL syntax.
    +			$sql .= 'IF NOT EXISTS ';
     		}
    +		*/
     
    -		$sql .= $this->db->_escape_identifiers($table)." (";
    -
    -		$sql .= $this->_process_fields($fields);
    +		$sql .= $this->db->_escape_identifiers($table).' ('.$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) . ")";
    +			$key_name = 'pk_'.$table.'_'.$this->db->protect_identifiers(implode('_', $primary_keys));
    +			$sql .= ",\n\tCONSTRAINT ".$key_name.' PRIMARY KEY('.implode(', ', $this->db->protect_identifiers($primary_keys)).')';
     		}
     
     		if (is_array($keys) && count($keys) > 0)
    @@ -210,22 +178,20 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			{
     				if (is_array($key))
     				{
    -					$key_name = $this->db->_protect_identifiers(implode('_', $key));
    -					$key = $this->db->_protect_identifiers($key);
    +					$key_name = $this->db->protect_identifiers(implode('_', $key));
    +					$key = $this->db->protect_identifiers($key);
     				}
     				else
     				{
    -					$key_name = $this->db->_protect_identifiers($key);
    +					$key_name = $this->db->protect_identifiers($key);
     					$key = array($key_name);
     				}
    -				
    -				$sql .= ",\n\tKEY \"{$key_name}\" (" . implode(', ', $key) . ")";
    +
    +				$sql .= ",\n\tKEY ".$key_name.' ('.implode(', ', $key).')';
     			}
     		}
     
    -		$sql .= "\n);";
    -
    -		return $sql;
    +		return $sql."\n);";
     	}
     
     	// --------------------------------------------------------------------
    @@ -233,12 +199,11 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	/**
     	 * Drop Table
     	 *
    -	 * @access	private
     	 * @return	string
     	 */
    -	function _drop_table($table)
    +	public function _drop_table($table)
     	{
    -		return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);
    +		return 'DROP TABLE IF EXISTS '.$this->db->_escape_identifiers($table);
     	}
     
     	// --------------------------------------------------------------------
    @@ -249,31 +214,24 @@ function _drop_table($table)
     	 * 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
    +	 * @return	string
     	 */
    -	function _alter_table($alter_type, $table, $fields, $after_field = '')
    +	public function _alter_table($alter_type, $table, $fields, $after_field = '')
     	{
    -		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";
    +		$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 != '')
    +		if ($alter_type === 'DROP')
     		{
    -			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
    +			return $sql.$this->db->protect_identifiers($fields);
     		}
     
    -		return $sql;
    +		return $sql.$this->_process_fields($fields)
    +			.($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : '');
     	}
     
     	// --------------------------------------------------------------------
    @@ -283,18 +241,16 @@ function _alter_table($alter_type, $table, $fields, $after_field = '')
     	 *
     	 * 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)
    +	public 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;
    +		return 'RENAME TABLE '.$this->db->protect_identifiers($table_name).' AS '.$this->db->protect_identifiers($new_table_name);
     	}
     
     }
     
     /* End of file cubrid_forge.php */
    -/* Location: ./system/database/drivers/cubrid/cubrid_forge.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/cubrid/cubrid_forge.php */
    diff --git a/system/database/drivers/cubrid/cubrid_result.php b/system/database/drivers/cubrid/cubrid_result.php
    index 4c0fede10bd..7a72cdde4e2 100644
    --- a/system/database/drivers/cubrid/cubrid_result.php
    +++ b/system/database/drivers/cubrid/cubrid_result.php
    @@ -1,13 +1,13 @@
    -result_id);
     	}
    @@ -54,10 +51,9 @@ function num_rows()
     	/**
     	 * Number of fields in the result set
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function num_fields()
    +	public function num_fields()
     	{
     		return @cubrid_num_fields($this->result_id);
     	}
    @@ -69,10 +65,9 @@ function num_fields()
     	 *
     	 * Generates an array of column names
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function list_fields()
    +	public function list_fields()
     	{
     		return cubrid_column_names($this->result_id);
     	}
    @@ -84,21 +79,18 @@ function list_fields()
     	 *
     	 * Generates an array of objects containing field meta-data
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function field_data()
    +	public function field_data()
     	{
    -		$retval = array();
    -
    -		$tablePrimaryKeys = array();
    +		$retval = $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		= 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
    @@ -115,19 +107,18 @@ function field_data()
     			// 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 . "'"
    -			);
    +						"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);
    +				$F->primary_key = ($row[0] > 0 ? 1 : NULL);
     			}
     			else
     			{
    -				$F->primary_key = null;
    +				$F->primary_key = NULL;
     			}
     
     			if (is_resource($res))
    @@ -147,13 +138,12 @@ function field_data()
     	/**
     	 * Free the result
     	 *
    -	 * @return	null
    +	 * @return	void
     	 */
    -	function free_result()
    +	public function free_result()
     	{
    -		if(is_resource($this->result_id) ||
    -			get_resource_type($this->result_id) == "Unknown" &&
    -			preg_match('/Resource id #/', strval($this->result_id)))
    +		if (is_resource($this->result_id) OR
    +			(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;
    @@ -169,10 +159,9 @@ function free_result()
     	 * this internally before fetching results to make sure the
     	 * result set starts at zero
     	 *
    -	 * @access	private
     	 * @return	array
     	 */
    -	function _data_seek($n = 0)
    +	protected function _data_seek($n = 0)
     	{
     		return cubrid_data_seek($this->result_id, $n);
     	}
    @@ -184,10 +173,9 @@ function _data_seek($n = 0)
     	 *
     	 * Returns the result set as an array
     	 *
    -	 * @access	private
     	 * @return	array
     	 */
    -	function _fetch_assoc()
    +	protected function _fetch_assoc()
     	{
     		return cubrid_fetch_assoc($this->result_id);
     	}
    @@ -199,16 +187,14 @@ function _fetch_assoc()
     	 *
     	 * Returns the result set as an object
     	 *
    -	 * @access	private
     	 * @return	object
     	 */
    -	function _fetch_object()
    +	protected function _fetch_object()
     	{
     		return cubrid_fetch_object($this->result_id);
     	}
     
     }
     
    -
     /* End of file cubrid_result.php */
    -/* Location: ./system/database/drivers/cubrid/cubrid_result.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/cubrid/cubrid_result.php */
    diff --git a/system/database/drivers/cubrid/cubrid_utility.php b/system/database/drivers/cubrid/cubrid_utility.php
    index 750c0d8dd66..dbfbe5f6b1b 100644
    --- a/system/database/drivers/cubrid/cubrid_utility.php
    +++ b/system/database/drivers/cubrid/cubrid_utility.php
    @@ -1,13 +1,13 @@
    -conn_id)
    -		{
    -			return "SELECT '" . $this->database . "'";
    -		}
    -		else
    -		{
    -			return FALSE;
    -		}
    +		return "SELECT '".$this->database."'";
     	}
     
     	// --------------------------------------------------------------------
    @@ -66,12 +56,11 @@ function _list_databases()
     	 *
     	 * Generates a platform-specific query so that a table can be optimized
     	 *
    -	 * @access	private
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	bool
     	 * @link 	http://www.cubrid.org/manual/840/en/Optimize%20Database
     	 */
    -	function _optimize_table($table)
    +	public 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
    @@ -86,12 +75,11 @@ function _optimize_table($table)
     	 *
     	 * Generates a platform-specific query so that a table can be repaired
     	 *
    -	 * @access	private
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	bool
     	 * @link 	http://www.cubrid.org/manual/840/en/Checking%20Database%20Consistency
     	 */
    -	function _repair_table($table)
    +	public function _repair_table($table)
     	{
     		// Not supported in CUBRID as of version 8.4.0. Database or
     		// table consistency can be checked using CUBRID Manager
    @@ -103,11 +91,10 @@ function _repair_table($table)
     	/**
     	 * CUBRID Export
     	 *
    -	 * @access	private
     	 * @param	array	Preferences
     	 * @return	mixed
     	 */
    -	function _backup($params = array())
    +	public 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
    @@ -117,4 +104,4 @@ function _backup($params = array())
     }
     
     /* End of file cubrid_utility.php */
    -/* Location: ./system/database/drivers/cubrid/cubrid_utility.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/cubrid/cubrid_utility.php */
    
    From 69a6093da35640482a8394ca66686e045304b0e3 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 14:04:06 +0200
    Subject: [PATCH 0343/5397] Replace array_key_exists() with isset() and !
     empty()
    
    ---
     system/database/drivers/cubrid/cubrid_forge.php | 16 ++++++++--------
     1 file changed, 8 insertions(+), 8 deletions(-)
    
    diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php
    index ce5aa2098cb..d277ca394fa 100644
    --- a/system/database/drivers/cubrid/cubrid_forge.php
    +++ b/system/database/drivers/cubrid/cubrid_forge.php
    @@ -89,13 +89,13 @@ private function _process_fields($fields)
     				$attributes = array_change_key_case($attributes, CASE_UPPER);
     
     				$sql .= "\n\t\"".$this->db->protect_identifiers($field).'"'
    -					.(array_key_exists('NAME', $attributes) ? ' '.$this->db->protect_identifiers($attributes['NAME']).' ' : '');
    +					.(isset($attributes['NAME']) ? ' '.$this->db->protect_identifiers($attributes['NAME']).' ' : '');
     
    -				if (array_key_exists('TYPE', $attributes))
    +				if ( ! empty($attributes['TYPE']))
     				{
     					$sql .= ' '.$attributes['TYPE'];
     
    -					if (array_key_exists('CONSTRAINT', $attributes))
    +					if (isset($attributes['CONSTRAINT']))
     					{
     						switch ($attributes['TYPE'])
     						{
    @@ -118,16 +118,16 @@ private function _process_fields($fields)
     			/* 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('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
    +				if (isset($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE)
     				{
     					$sql .= ' UNSIGNED';
     				}
     			 */
     
    -				$sql .= (array_key_exists('DEFAULT', $attributes) ? " DEFAULT '".$attributes['DEFAULT']."'" : '')
    -					.((array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    -					.((array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '')
    -					.((array_key_exists('UNIQUE', $attributes) && $attributes['UNIQUE'] === TRUE) ? ' UNIQUE' : '');
    +				$sql .= (isset($attributes['DEFAULT']) ? " DEFAULT '".$attributes['DEFAULT']."'" : '')
    +					.((isset($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.((isset($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '')
    +					.((isset($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) ? ' UNIQUE' : '');
     			}
     
     			// don't add a comma on the end of the last field
    
    From fb86295d7d49e7ddfba266fe9f7305fb44708d4f Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 14:08:47 +0200
    Subject: [PATCH 0344/5397] Replace array_key_exists() with isset() and !
     empty()
    
    ---
     system/database/drivers/mssql/mssql_forge.php | 10 +++++-----
     1 file changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php
    index 65513f437c3..231284c7c1c 100644
    --- a/system/database/drivers/mssql/mssql_forge.php
    +++ b/system/database/drivers/mssql/mssql_forge.php
    @@ -110,11 +110,11 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     
     				$sql .= "\n\t".$this->db->protect_identifiers($field)
     					.' '.$attributes['TYPE']
    -					.(array_key_exists('CONSTRAINT', $attributes) ? '('.$attributes['CONSTRAINT'].')' : '')
    -					.((array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    -					.(array_key_exists('DEFAULT', $attributes) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    -					.((array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    -					.((array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
    +					.(isset($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.((isset($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.(isset($attributes['DEFAULT']) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    +					.((isset($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.((isset($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    
    From 85facfa42793cce480d2f49696c2d3e3096763f0 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 14:12:14 +0200
    Subject: [PATCH 0345/5397] Replace array_key_exists() with isset() and !
     empty()
    
    ---
     system/database/drivers/oci8/oci8_driver.php | 2 +-
     system/database/drivers/oci8/oci8_forge.php  | 8 ++++----
     2 files changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php
    index 9fce18674b2..700cde4b897 100644
    --- a/system/database/drivers/oci8/oci8_driver.php
    +++ b/system/database/drivers/oci8/oci8_driver.php
    @@ -255,7 +255,7 @@ public function stored_procedure($package, $procedure, $params)
     		{
     			$sql .= $param['name'].',';
     
    -			if (array_key_exists('type', $param) && ($param['type'] === OCI_B_CURSOR))
    +			if (isset($param['type']) && $param['type'] === OCI_B_CURSOR)
     			{
     				$have_cursor = TRUE;
     			}
    diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php
    index 661ec3a4048..1dcc346d2e9 100644
    --- a/system/database/drivers/oci8/oci8_forge.php
    +++ b/system/database/drivers/oci8/oci8_forge.php
    @@ -98,10 +98,10 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     				$attributes = array_change_key_case($attributes, CASE_UPPER);
     
     				$sql .= "\n\t".$this->db->protect_identifiers($field).' '.$attributes['TYPE']
    -					.(array_key_exists('CONSTRAINT', $attributes) ? '('.$attributes['CONSTRAINT'].')' : '')
    -					.((array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    -					.(array_key_exists('DEFAULT', $attributes) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    -					.((array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL');
    +					.(isset($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.((isset($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.(isset($attributes['DEFAULT']) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    +					.((isset($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL');
     			}
     
     			// don't add a comma on the end of the last field
    
    From 20ebf1459b6dc1449a545156b70e7cb2932fa9eb Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 14:14:02 +0200
    Subject: [PATCH 0346/5397] Replace array_key_exists() with isset() and !
     empty()
    
    ---
     system/database/drivers/sqlite/sqlite_forge.php | 10 +++++-----
     1 file changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php
    index 8bf1f25956e..5339f6e3e61 100644
    --- a/system/database/drivers/sqlite/sqlite_forge.php
    +++ b/system/database/drivers/sqlite/sqlite_forge.php
    @@ -104,11 +104,11 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     
     				$sql .= "\n\t".$this->db->protect_identifiers($field)
     					.' '.$attributes['TYPE']
    -					.(array_key_exists('CONSTRAINT', $attributes) ? '('.$attributes['CONSTRAINT'].')' : '')
    -					.((array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    -					.(array_key_exists('DEFAULT', $attributes) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    -					.((array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    -					.((array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
    +					.(isset($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.((isset($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.(isset($attributes['DEFAULT']) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    +					.((isset($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.((isset($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    
    From 79f675446b29a0006ea090ed03ed721fb18c5dc5 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 14:15:53 +0200
    Subject: [PATCH 0347/5397] Replace array_key_exists() with isset()
    
    ---
     system/database/drivers/sqlite3/sqlite3_forge.php | 10 +++++-----
     1 file changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php
    index 6398e48cd47..43f08ed7ae9 100644
    --- a/system/database/drivers/sqlite3/sqlite3_forge.php
    +++ b/system/database/drivers/sqlite3/sqlite3_forge.php
    @@ -113,11 +113,11 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     
     				$sql .= "\n\t".$this->db->protect_identifiers($field)
     					.' '.$attributes['TYPE']
    -					.(array_key_exists('CONSTRAINT', $attributes) ? '('.$attributes['CONSTRAINT'].')' : '')
    -					.((array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    -					.(array_key_exists('DEFAULT', $attributes) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    -					.((array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    -					.((array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
    +					.(isset($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.((isset($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.(isset($attributes['DEFAULT']) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    +					.((isset($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.((isset($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    
    From 684ee3a330c90744b249b48212d85dfe4d3b1caf Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 14:17:39 +0200
    Subject: [PATCH 0348/5397] Replace array_key_exists() with isset()
    
    ---
     system/database/drivers/sqlsrv/sqlsrv_forge.php | 10 +++++-----
     1 file changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php
    index 1367ddc776e..c0271f67172 100644
    --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php
    +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php
    @@ -110,11 +110,11 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     
     				$sql .= "\n\t".$this->db->protect_identifiers($field)
     					.' '.$attributes['TYPE']
    -					.(array_key_exists('CONSTRAINT', $attributes) ? '('.$attributes['CONSTRAINT'].')' : '')
    -					.((array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    -					.(array_key_exists('DEFAULT', $attributes) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    -					.((array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    -					.((array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
    +					.(isset($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.((isset($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.(isset($attributes['DEFAULT']) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    +					.((isset($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.((isset($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    
    From c6953f4077fe3ee394abb37eaa0575527bd013cc Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 14:43:16 +0200
    Subject: [PATCH 0349/5397] Fix _limit()
    
    ---
     system/database/drivers/cubrid/cubrid_driver.php |  2 +-
     system/database/drivers/cubrid/cubrid_forge.php  | 10 +++++-----
     2 files changed, 6 insertions(+), 6 deletions(-)
    
    diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php
    index 1cfaf3e42e2..b89746b7d22 100644
    --- a/system/database/drivers/cubrid/cubrid_driver.php
    +++ b/system/database/drivers/cubrid/cubrid_driver.php
    @@ -696,7 +696,7 @@ protected function _delete($table, $where = array(), $like = array(), $limit = F
     	 */
     	protected function _limit($sql, $limit, $offset)
     	{
    -		return $sql.'LIMIT '.($offset == 0 ? '' : ', ').$limit;
    +		return $sql.'LIMIT '.($offset == 0 ? '' : $offset.', ').$limit;
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php
    index d277ca394fa..4b1c2839ae0 100644
    --- a/system/database/drivers/cubrid/cubrid_forge.php
    +++ b/system/database/drivers/cubrid/cubrid_forge.php
    @@ -89,13 +89,13 @@ private function _process_fields($fields)
     				$attributes = array_change_key_case($attributes, CASE_UPPER);
     
     				$sql .= "\n\t\"".$this->db->protect_identifiers($field).'"'
    -					.(isset($attributes['NAME']) ? ' '.$this->db->protect_identifiers($attributes['NAME']).' ' : '');
    +					.( ! empty($attributes['NAME']) ? ' '.$this->db->protect_identifiers($attributes['NAME']).' ' : '');
     
     				if ( ! empty($attributes['TYPE']))
     				{
     					$sql .= ' '.$attributes['TYPE'];
     
    -					if (isset($attributes['CONSTRAINT']))
    +					if ( ! empty($attributes['CONSTRAINT']))
     					{
     						switch ($attributes['TYPE'])
     						{
    @@ -125,9 +125,9 @@ private function _process_fields($fields)
     			 */
     
     				$sql .= (isset($attributes['DEFAULT']) ? " DEFAULT '".$attributes['DEFAULT']."'" : '')
    -					.((isset($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    -					.((isset($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '')
    -					.((isset($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) ? ' UNIQUE' : '');
    +					.(( ! empty($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.(( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '')
    +					.(( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) ? ' UNIQUE' : '');
     			}
     
     			// don't add a comma on the end of the last field
    
    From b537c4d32d109cef2ddf541aa976c3e96736bf06 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 14:45:45 +0200
    Subject: [PATCH 0350/5397] Fix _limit()
    
    ---
     system/database/drivers/sqlite/sqlite_driver.php | 2 +-
     system/database/drivers/sqlite/sqlite_forge.php  | 8 ++++----
     2 files changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php
    index 96458e032ea..119722d2f14 100644
    --- a/system/database/drivers/sqlite/sqlite_driver.php
    +++ b/system/database/drivers/sqlite/sqlite_driver.php
    @@ -583,7 +583,7 @@ protected function _delete($table, $where = array(), $like = array(), $limit = F
     	 */
     	protected function _limit($sql, $limit, $offset)
     	{
    -		return $sql.'LIMIT '.($offset == 0 ? '' : ', ').$limit;
    +		return $sql.'LIMIT '.($offset == 0 ? '' : $offset.', ').$limit;
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php
    index 5339f6e3e61..99766878b6f 100644
    --- a/system/database/drivers/sqlite/sqlite_forge.php
    +++ b/system/database/drivers/sqlite/sqlite_forge.php
    @@ -104,11 +104,11 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     
     				$sql .= "\n\t".$this->db->protect_identifiers($field)
     					.' '.$attributes['TYPE']
    -					.(isset($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    -					.((isset($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.( ! empty($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.(( ! empty($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
     					.(isset($attributes['DEFAULT']) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    -					.((isset($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    -					.((isset($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
    +					.(( ! empty($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.(( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    
    From fe3428ae6c3a563e2ada653e3d099231827c2c3d Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 14:47:29 +0200
    Subject: [PATCH 0351/5397] Another minor improvement
    
    ---
     system/database/drivers/sqlite3/sqlite3_forge.php | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php
    index 43f08ed7ae9..68da7627e2d 100644
    --- a/system/database/drivers/sqlite3/sqlite3_forge.php
    +++ b/system/database/drivers/sqlite3/sqlite3_forge.php
    @@ -113,11 +113,11 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     
     				$sql .= "\n\t".$this->db->protect_identifiers($field)
     					.' '.$attributes['TYPE']
    -					.(isset($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    -					.((isset($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.( ! empty($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.(( ! empty($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
     					.(isset($attributes['DEFAULT']) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    -					.((isset($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    -					.((isset($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
    +					.(( ! empty($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.(( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    
    From 993f932cb27f68ac4a3272502a823af0835b291c Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 14:49:23 +0200
    Subject: [PATCH 0352/5397] Another minor improvement and fix a possible
     false-positive
    
    ---
     system/database/drivers/sqlsrv/sqlsrv_driver.php | 2 +-
     system/database/drivers/sqlsrv/sqlsrv_forge.php  | 8 ++++----
     2 files changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php
    index cdd178261f5..0c24ef38f86 100644
    --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php
    +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php
    @@ -303,7 +303,7 @@ public function count_all($table = '')
     		}
     
     		$query = $this->query('SELECT COUNT(*) AS numrows FROM '.$this->dbprefix.$table);
    -		if ($query->num_rows() === 0)
    +		if ($query->num_rows() == 0)
     		{
     			return 0;
     		}
    diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php
    index c0271f67172..3beb86b4e32 100644
    --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php
    +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php
    @@ -110,11 +110,11 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi
     
     				$sql .= "\n\t".$this->db->protect_identifiers($field)
     					.' '.$attributes['TYPE']
    -					.(isset($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    -					.((isset($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.( ! empty($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.(( ! empty($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
     					.(isset($attributes['DEFAULT']) ? ' DEFAULT \''.$attributes['DEFAULT'].'\'' : '')
    -					.((isset($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    -					.((isset($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
    +					.(( ! empty($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.(( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    
    From b76029d8be1f2d98f1668d61e7f7ac3d9274b8f3 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 15:13:19 +0200
    Subject: [PATCH 0353/5397] Improve the ODBC database driver
    
    ---
     system/database/drivers/odbc/odbc_driver.php  | 220 +++++++-----------
     system/database/drivers/odbc/odbc_forge.php   | 143 +++---------
     system/database/drivers/odbc/odbc_result.php  | 129 +++++-----
     system/database/drivers/odbc/odbc_utility.php |  44 ++--
     4 files changed, 185 insertions(+), 351 deletions(-)
    
    diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php
    index 6ba39f0cd55..a674c390e22 100644
    --- a/system/database/drivers/odbc/odbc_driver.php
    +++ b/system/database/drivers/odbc/odbc_driver.php
    @@ -1,13 +1,13 @@
    -hostname, $this->username, $this->password);
     	}
    @@ -83,10 +79,9 @@ function db_connect()
     	/**
     	 * Persistent database connection
     	 *
    -	 * @access	private called by the base class
     	 * @return	resource
     	 */
    -	function db_pconnect()
    +	public function db_pconnect()
     	{
     		return @odbc_pconnect($this->hostname, $this->username, $this->password);
     	}
    @@ -99,10 +94,9 @@ function db_pconnect()
     	 * 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()
    +	public function reconnect()
     	{
     		// not implemented in odbc
     	}
    @@ -112,10 +106,9 @@ function reconnect()
     	/**
     	 * Select the database
     	 *
    -	 * @access	private called by the base class
     	 * @return	resource
     	 */
    -	function db_select()
    +	public function db_select()
     	{
     		// Not needed for ODBC
     		return TRUE;
    @@ -126,12 +119,11 @@ function db_select()
     	/**
     	 * Set client character set
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @param	string
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function db_set_charset($charset, $collation)
    +	public function db_set_charset($charset, $collation)
     	{
     		// @todo - add support if needed
     		return TRUE;
    @@ -142,12 +134,11 @@ function db_set_charset($charset, $collation)
     	/**
     	 * Version number query string
     	 *
    -	 * @access	public
     	 * @return	string
     	 */
    -	function _version()
    +	protected function _version()
     	{
    -		return "SELECT version() AS ver";
    +		return 'SELECT version() AS ver';
     	}
     
     	// --------------------------------------------------------------------
    @@ -155,14 +146,12 @@ function _version()
     	/**
     	 * Execute the query
     	 *
    -	 * @access	private called by the base class
     	 * @param	string	an SQL query
     	 * @return	resource
     	 */
    -	function _execute($sql)
    +	protected function _execute($sql)
     	{
    -		$sql = $this->_prep_query($sql);
    -		return @odbc_exec($this->conn_id, $sql);
    +		return @odbc_exec($this->conn_id, $this->_prep_query($sql));
     	}
     
     	// --------------------------------------------------------------------
    @@ -172,11 +161,10 @@ function _execute($sql)
     	 *
     	 * 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)
    +	protected function _prep_query($sql)
     	{
     		return $sql;
     	}
    @@ -186,18 +174,12 @@ function _prep_query($sql)
     	/**
     	 * Begin Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_begin($test_mode = FALSE)
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -205,7 +187,7 @@ function trans_begin($test_mode = FALSE)
     		// 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->_trans_failure = ($test_mode === TRUE);
     
     		return odbc_autocommit($this->conn_id, FALSE);
     	}
    @@ -215,18 +197,12 @@ function trans_begin($test_mode = FALSE)
     	/**
     	 * Commit Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_commit()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -241,18 +217,12 @@ function trans_commit()
     	/**
     	 * Rollback Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_rollback()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -267,12 +237,11 @@ function trans_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)
    +	public function escape_str($str, $like = FALSE)
     	{
     		if (is_array($str))
     		{
    @@ -290,9 +259,9 @@ function escape_str($str, $like = FALSE)
     		// 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_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;
    @@ -303,10 +272,9 @@ function escape_str($str, $like = FALSE)
     	/**
     	 * Affected Rows
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function affected_rows()
    +	public function affected_rows()
     	{
     		return @odbc_num_rows($this->conn_id);
     	}
    @@ -316,10 +284,9 @@ function affected_rows()
     	/**
     	 * Insert ID
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function insert_id()
    +	public function insert_id()
     	{
     		return @odbc_insert_id($this->conn_id);
     	}
    @@ -332,27 +299,26 @@ function insert_id()
     	 * Generates a platform-specific query string that counts all records in
     	 * the specified database
     	 *
    -	 * @access	public
     	 * @param	string
    -	 * @return	string
    +	 * @return	int
     	 */
    -	function count_all($table = '')
    +	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));
    +		$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();
    +		$query = $query->row();
     		$this->_reset_select();
    -		return (int) $row->numrows;
    +		return (int) $query->numrows;
     	}
     
     	// --------------------------------------------------------------------
    @@ -366,11 +332,11 @@ function count_all($table = '')
     	 * @param	boolean
     	 * @return	string
     	 */
    -	function _list_tables($prefix_limit = FALSE)
    +	protected function _list_tables($prefix_limit = FALSE)
     	{
    -		$sql = "SHOW TABLES FROM `".$this->database."`";
    +		$sql = 'SHOW TABLES FROM `'.$this->database.'`';
     
    -		if ($prefix_limit !== FALSE AND $this->dbprefix != '')
    +		if ($prefix_limit !== FALSE && $this->dbprefix != '')
     		{
     			//$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr);
     			return FALSE; // not currently supported
    @@ -386,13 +352,12 @@ function _list_tables($prefix_limit = FALSE)
     	 *
     	 * 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 = '')
    +	protected function _list_columns($table = '')
     	{
    -		return "SHOW COLUMNS FROM ".$table;
    +		return 'SHOW COLUMNS FROM '.$table;
     	}
     
     	// --------------------------------------------------------------------
    @@ -402,13 +367,12 @@ function _list_columns($table = '')
     	 *
     	 * Generates a platform-specific query so that the column data can be retrieved
     	 *
    -	 * @access	public
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	string
     	 */
    -	function _field_data($table)
    +	protected function _field_data($table)
     	{
    -		return "SELECT TOP 1 FROM ".$table;
    +		return 'SELECT TOP 1 FROM '.$table;
     	}
     
     	// --------------------------------------------------------------------
    @@ -416,10 +380,9 @@ function _field_data($table)
     	/**
     	 * The error message string
     	 *
    -	 * @access	private
     	 * @return	string
     	 */
    -	function _error_message()
    +	protected function _error_message()
     	{
     		return odbc_errormsg($this->conn_id);
     	}
    @@ -429,10 +392,9 @@ function _error_message()
     	/**
     	 * The error message number
     	 *
    -	 * @access	private
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function _error_number()
    +	protected function _error_number()
     	{
     		return odbc_error($this->conn_id);
     	}
    @@ -444,11 +406,10 @@ function _error_number()
     	 *
     	 * This function escapes column and table names
     	 *
    -	 * @access	private
     	 * @param	string
     	 * @return	string
     	 */
    -	function _escape_identifiers($item)
    +	public function _escape_identifiers($item)
     	{
     		if ($this->_escape_char == '')
     		{
    @@ -459,24 +420,20 @@ function _escape_identifiers($item)
     		{
     			if (strpos($item, '.'.$id) !== FALSE)
     			{
    -				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);
    +				$item = 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);
    +				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item);
     			}
     		}
     
     		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;
    +			$item = str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item);
     		}
     
     		// remove duplicates if the user already included the escape
    -		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
    +		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item.$this->_escape_char);
     	}
     
     	// --------------------------------------------------------------------
    @@ -487,11 +444,10 @@ function _escape_identifiers($item)
     	 * 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
    +	 * @param	string	the table name
    +	 * @return	string
     	 */
    -	function _from_tables($tables)
    +	protected function _from_tables($tables)
     	{
     		if ( ! is_array($tables))
     		{
    @@ -508,15 +464,14 @@ function _from_tables($tables)
     	 *
     	 * 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)
    +	protected function _insert($table, $keys, $values)
     	{
    -		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
    +		return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
     	}
     
     	// --------------------------------------------------------------------
    @@ -526,7 +481,6 @@ function _insert($table, $keys, $values)
     	 *
     	 * 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
    @@ -534,24 +488,17 @@ function _insert($table, $keys, $values)
     	 * @param	array	the limit clause
     	 * @return	string
     	 */
    -	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
    +	protected function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
     	{
     		foreach ($values as $key => $val)
     		{
    -			$valstr[] = $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;
    +		return 'UPDATE '.$table.' SET '.implode(', ', $valstr)
    +			.(($where != '' && count($where) > 0) ? ' WHERE '.implode(' ', $where) : '')
    +			.(count($orderby) > 0 ? ' ORDER BY '.implode(', ', $orderby) : '')
    +			.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     
    @@ -564,11 +511,10 @@ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
     	 * 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)
    +	protected function _truncate($table)
     	{
     		return $this->_delete($table);
     	}
    @@ -580,31 +526,27 @@ function _truncate($table)
     	 *
     	 * 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)
    +	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);
    +			$conditions = "\nWHERE ".implode("\n", $this->ar_where);
     
     			if (count($where) > 0 && count($like) > 0)
     			{
    -				$conditions .= " AND ";
    +				$conditions .= ' AND ';
     			}
     			$conditions .= implode("\n", $like);
     		}
     
    -		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
    -
    -		return "DELETE FROM ".$table.$conditions.$limit;
    +		return 'DELETE FROM '.$table.$conditions.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     	// --------------------------------------------------------------------
    @@ -614,16 +556,14 @@ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
     	 *
     	 * 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
    +	 * @param	int	the number of rows to limit the query to
    +	 * @param	int	the offset value
     	 * @return	string
     	 */
    -	function _limit($sql, $limit, $offset)
    +	protected function _limit($sql, $limit, $offset)
     	{
    -		// Does ODBC doesn't use the LIMIT clause?
    -		return $sql;
    +		return $sql.($offset == 0 ? '' : $offset.', ').$limit;
     	}
     
     	// --------------------------------------------------------------------
    @@ -631,19 +571,15 @@ function _limit($sql, $limit, $offset)
     	/**
     	 * Close DB Connection
     	 *
    -	 * @access	public
     	 * @param	resource
     	 * @return	void
     	 */
    -	function _close($conn_id)
    +	protected function _close($conn_id)
     	{
     		@odbc_close($conn_id);
     	}
     
    -
     }
     
    -
    -
     /* End of file odbc_driver.php */
    -/* Location: ./system/database/drivers/odbc/odbc_driver.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/odbc/odbc_driver.php */
    diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php
    index e0ec687c8d5..49e5c3e725a 100644
    --- a/system/database/drivers/odbc/odbc_forge.php
    +++ b/system/database/drivers/odbc/odbc_forge.php
    @@ -1,13 +1,13 @@
    -db->db_debug)
    -		{
    -			return $this->db->display_error('db_unsuported_feature');
    -		}
    -		return FALSE;
    +		return ($this->db->db_debug) ? $this->db->display_error('db_unsuported_feature') : FALSE;
     	}
     
     	// --------------------------------------------------------------------
    @@ -59,19 +52,14 @@ function _create_database()
     	/**
     	 * Drop database
     	 *
    -	 * @access	private
     	 * @param	string	the database name
     	 * @return	bool
     	 */
    -	function _drop_database($name)
    +	public 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;
    +		return ($this->db->db_debug) ? $this->db->display_error('db_unsuported_feature') : FALSE;
     	}
     
     	// --------------------------------------------------------------------
    @@ -79,7 +67,6 @@ function _drop_database($name)
     	/**
     	 * Create Table
     	 *
    -	 * @access	private
     	 * @param	string	the table name
     	 * @param	array	the fields
     	 * @param	mixed	primary key(s)
    @@ -87,7 +74,7 @@ function _drop_database($name)
     	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL
     	 * @return	bool
     	 */
    -	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
    +	public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	{
     		$sql = 'CREATE TABLE ';
     
    @@ -96,54 +83,29 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			$sql .= 'IF NOT EXISTS ';
     		}
     
    -		$sql .= $this->db->_escape_identifiers($table)." (";
    +		$sql .= $this->db->_escape_identifiers($table).' (';
     		$current_field_count = 0;
     
    -		foreach ($fields as $field=>$attributes)
    +		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";
    +				$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';
    -				}
    +				$sql .= "\n\t".$this->db->protect_identifiers($field)
    +					.' '.$attributes['TYPE']
    +					.( ! empty($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.(( ! empty($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.(isset($attributes['DEFAULT'], $attributes) ? " DEFAULT '".$attributes['DEFAULT']."'" : '')
    +					.(( ! empty($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.(( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    @@ -155,8 +117,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     
     		if (count($primary_keys) > 0)
     		{
    -			$primary_keys = $this->db->_protect_identifiers($primary_keys);
    -			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
    +			$sql .= ",\n\tPRIMARY KEY (".implode(', ', $this->protect_identifiers($primary_keys)).')';
     		}
     
     		if (is_array($keys) && count($keys) > 0)
    @@ -165,20 +126,18 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			{
     				if (is_array($key))
     				{
    -					$key = $this->db->_protect_identifiers($key);
    +					$key = $this->db->protect_identifiers($key);
     				}
     				else
     				{
    -					$key = array($this->db->_protect_identifiers($key));
    +					$key = array($this->db->protect_identifiers($key));
     				}
     
    -				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";
    +				$sql .= ",\n\tFOREIGN KEY (".implode(', ', $key).')';
     			}
     		}
     
    -		$sql .= "\n)";
    -
    -		return $sql;
    +		return $sql."\n)";
     	}
     
     	// --------------------------------------------------------------------
    @@ -186,17 +145,12 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	/**
     	 * Drop Table
     	 *
    -	 * @access	private
     	 * @return	bool
     	 */
    -	function _drop_table($table)
    +	public function _drop_table($table)
     	{
     		// Not a supported ODBC feature
    -		if ($this->db->db_debug)
    -		{
    -			return $this->db->display_error('db_unsuported_feature');
    -		}
    -		return FALSE;
    +		return ($this->db->db_debug) ? $this->db->display_error('db_unsuported_feature') : FALSE;
     	}
     
     	// --------------------------------------------------------------------
    @@ -207,49 +161,29 @@ function _drop_table($table)
     	 * 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	bool	should 'NOT NULL' be added
     	 * @param	string	the field after which we should add the new field
    -	 * @return	object
    +	 * @return	string
     	 */
    -	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
    +	public 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);
    +		$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')
    +		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;
    -
    +		return $sql.' '.$column_definition
    +			.($default_value != '' ? ' DEFAULT "'.$default_value.'"' : '')
    +			.($null === NULL ? ' NULL' : ' NOT NULL')
    +			.($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : '');
     	}
     
     
    @@ -260,19 +194,16 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = ''
     	 *
     	 * 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)
    +	public 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;
    +		return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name);
     	}
     
    -
     }
     
     /* End of file odbc_forge.php */
    -/* Location: ./system/database/drivers/odbc/odbc_forge.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/odbc/odbc_forge.php */
    diff --git a/system/database/drivers/odbc/odbc_result.php b/system/database/drivers/odbc/odbc_result.php
    index ba660856e08..509c77a1b85 100644
    --- a/system/database/drivers/odbc/odbc_result.php
    +++ b/system/database/drivers/odbc/odbc_result.php
    @@ -1,13 +1,13 @@
    -result_id);
     	}
     
    -	// --------------------------------------------------------------------
    -
     	/**
     	 * Number of fields in the result set
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function num_fields()
    +	public function num_fields()
     	{
     		return @odbc_num_fields($this->result_id);
     	}
    @@ -69,13 +63,12 @@ function num_fields()
     	 *
     	 * Generates an array of column names
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function list_fields()
    +	public function list_fields()
     	{
     		$field_names = array();
    -		for ($i = 0; $i < $this->num_fields(); $i++)
    +		for ($i = 0, $c = $this->num_fields(); $i < $c; $i++)
     		{
     			$field_names[]	= odbc_field_name($this->result_id, $i);
     		}
    @@ -90,22 +83,19 @@ function list_fields()
     	 *
     	 * Generates an array of objects containing field meta-data
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function field_data()
    +	public function field_data()
     	{
     		$retval = array();
    -		for ($i = 0; $i < $this->num_fields(); $i++)
    +		for ($i = 0, $c = $this->num_fields(); $i < $c; $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;
    +			$retval[$i]			= new stdClass();
    +			$retval[$i]->name		= odbc_field_name($this->result_id, $i);
    +			$retval[$i]->type		= odbc_field_type($this->result_id, $i);
    +			$retval[$i]->max_length		= odbc_field_len($this->result_id, $i);
    +			$retval[$i]->primary_key	= 0;
    +			$retval[$i]->default		= '';
     		}
     
     		return $retval;
    @@ -116,9 +106,9 @@ function field_data()
     	/**
     	 * Free the result
     	 *
    -	 * @return	null
    +	 * @return	void
     	 */
    -	function free_result()
    +	public function free_result()
     	{
     		if (is_resource($this->result_id))
     		{
    @@ -132,15 +122,15 @@ function free_result()
     	/**
     	 * Data Seek
     	 *
    -	 * Moves the internal pointer to the desired offset.  We call
    +	 * 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)
    +	protected function _data_seek($n = 0)
     	{
    +		// Not supported
     		return FALSE;
     	}
     
    @@ -151,19 +141,13 @@ function _data_seek($n = 0)
     	 *
     	 * Returns the result set as an array
     	 *
    -	 * @access	private
     	 * @return	array
     	 */
    -	function _fetch_assoc()
    +	protected 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);
    -		}
    +		return function_exists('odbc_fetch_object')
    +			? odbc_fetch_array($this->result_id)
    +			: $this->_odbc_fetch_array($this->result_id);
     	}
     
     	// --------------------------------------------------------------------
    @@ -173,40 +157,38 @@ function _fetch_assoc()
     	 *
     	 * Returns the result set as an object
     	 *
    -	 * @access	private
     	 * @return	object
     	 */
    -	function _fetch_object()
    +	protected 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);
    -		}
    +		return function_exists('odbc_fetch_object')
    +			? odbc_fetch_object($this->result_id)
    +			: $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) {
    +	private 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;
    -			}
    +		if ( ! odbc_fetch_into($odbc_result, $rs))
    +		{
    +			return FALSE;
     		}
    +
    +		$rs_obj = new stdClass();
    +		foreach ($rs as $k => $v)
    +		{
    +			$field_name = odbc_field_name($odbc_result, $k+1);
    +			$rs_obj->$field_name = $v;
    +		}
    +
     		return $rs_obj;
     	}
     
    @@ -217,24 +199,27 @@ function _odbc_fetch_object(& $odbc_result) {
     	 * subsititutes the odbc_fetch_array function when
     	 * not available (odbc_fetch_array requires unixODBC)
     	 *
    -	 * @access	private
     	 * @return	array
     	 */
    -	function _odbc_fetch_array(& $odbc_result) {
    +	private 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;
    -			}
    +		if ( ! odbc_fetch_into($odbc_result, $rs))
    +		{
    +			return FALSE;
    +		}
    +
    +		$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 */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/odbc/odbc_result.php */
    diff --git a/system/database/drivers/odbc/odbc_utility.php b/system/database/drivers/odbc/odbc_utility.php
    index bae3fe8539a..e71bc5a039a 100644
    --- a/system/database/drivers/odbc/odbc_utility.php
    +++ b/system/database/drivers/odbc/odbc_utility.php
    @@ -1,13 +1,13 @@
    -db->db_debug)
    -		{
    -			return $this->db->display_error('db_unsuported_feature');
    -		}
    -		return FALSE;
    +		return ($this->db->db_debug) ? $this->db->display_error('db_unsuported_feature') : FALSE;
     	}
     
     	// --------------------------------------------------------------------
    @@ -59,18 +52,13 @@ function _list_databases()
     	 *
     	 * Generates a platform-specific query so that a table can be optimized
     	 *
    -	 * @access	private
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	bool
     	 */
    -	function _optimize_table($table)
    +	public function _optimize_table($table)
     	{
     		// Not a supported ODBC feature
    -		if ($this->db->db_debug)
    -		{
    -			return $this->db->display_error('db_unsuported_feature');
    -		}
    -		return FALSE;
    +		return ($this->db->db_debug) ? $this->db->display_error('db_unsuported_feature') : FALSE;
     	}
     
     	// --------------------------------------------------------------------
    @@ -80,18 +68,13 @@ function _optimize_table($table)
     	 *
     	 * Generates a platform-specific query so that a table can be repaired
     	 *
    -	 * @access	private
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	bool
     	 */
    -	function _repair_table($table)
    +	public function _repair_table($table)
     	{
     		// Not a supported ODBC feature
    -		if ($this->db->db_debug)
    -		{
    -			return $this->db->display_error('db_unsuported_feature');
    -		}
    -		return FALSE;
    +		return ($this->db->db_debug) ? $this->db->display_error('db_unsuported_feature') : FALSE;
     	}
     
     	// --------------------------------------------------------------------
    @@ -99,11 +82,10 @@ function _repair_table($table)
     	/**
     	 * ODBC Export
     	 *
    -	 * @access	private
     	 * @param	array	Preferences
     	 * @return	mixed
     	 */
    -	function _backup($params = array())
    +	public function _backup($params = array())
     	{
     		// Currently unsupported
     		return $this->db->display_error('db_unsuported_feature');
    @@ -112,4 +94,4 @@ function _backup($params = array())
     }
     
     /* End of file odbc_utility.php */
    -/* Location: ./system/database/drivers/odbc/odbc_utility.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/odbc/odbc_utility.php */
    
    From 214583f1ba4c026141e595dac5868d5074095a7e Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 16:39:09 +0200
    Subject: [PATCH 0354/5397] Improve the PostgreSQL database driver
    
    ---
     .../drivers/postgre/postgre_driver.php        | 357 +++++++++---------
     .../drivers/postgre/postgre_forge.php         | 136 +++----
     .../drivers/postgre/postgre_result.php        |  60 ++-
     .../drivers/postgre/postgre_utility.php       |  33 +-
     4 files changed, 257 insertions(+), 329 deletions(-)
    
    diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php
    index 42329bded74..8b8f333710a 100644
    --- a/system/database/drivers/postgre/postgre_driver.php
    +++ b/system/database/drivers/postgre/postgre_driver.php
    @@ -1,13 +1,13 @@
    - 'host',
    -								'port'		=> 'port',
    -								'database'	=> 'dbname',
    -								'username'	=> 'user',
    -								'password'	=> 'password'
    -							);
    -
    -		$connect_string = "";
    +					'hostname'	=> 'host',
    +					'port'		=> 'port',
    +					'database'	=> 'dbname',
    +					'username'	=> 'user',
    +					'password'	=> 'password'
    +				);
    +
     		foreach ($components as $key => $val)
     		{
     			if (isset($this->$key) && $this->$key != '')
     			{
    -				$connect_string .= " $val=".$this->$key;
    +				$this->_pg_dsn .= $val.'='.$this->$key.' ';
     			}
     		}
    -		return trim($connect_string);
    +
    +		if (strlen($this->_pg_dsn) > 0)
    +		{
    +			$this->_pg_dsn = rtrim($this->_pg_dsn);
    +		}
     	}
     
     	// --------------------------------------------------------------------
    @@ -90,12 +97,17 @@ function _connect_string()
     	/**
     	 * Non-persistent database connection
     	 *
    -	 * @access	private called by the base class
     	 * @return	resource
     	 */
    -	function db_connect()
    +	public function db_connect()
     	{
    -		return @pg_connect($this->_connect_string());
    +		$ret = @pg_connect($this->_pg_dsn);
    +		if (is_resource($ret) && $this->char_set != '')
    +		{
    +			pg_set_client_encoding($ret, $this->char_set);
    +		}
    +
    +		return $ret;
     	}
     
     	// --------------------------------------------------------------------
    @@ -103,12 +115,17 @@ function db_connect()
     	/**
     	 * Persistent database connection
     	 *
    -	 * @access	private called by the base class
     	 * @return	resource
     	 */
    -	function db_pconnect()
    +	public function db_pconnect()
     	{
    -		return @pg_pconnect($this->_connect_string());
    +		$ret = @pg_pconnect($this->_pg_dsn);
    +		if (is_resource($ret) && $this->char_set != '')
    +		{
    +			pg_set_client_encoding($ret, $this->char_set);
    +		}
    +
    +		return $ret;
     	}
     
     	// --------------------------------------------------------------------
    @@ -119,10 +136,9 @@ function db_pconnect()
     	 * 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()
    +	public function reconnect()
     	{
     		if (pg_ping($this->conn_id) === FALSE)
     		{
    @@ -135,10 +151,9 @@ function reconnect()
     	/**
     	 * Select the database
     	 *
    -	 * @access	private called by the base class
     	 * @return	resource
     	 */
    -	function db_select()
    +	public function db_select()
     	{
     		// Not needed for Postgre so we'll return TRUE
     		return TRUE;
    @@ -149,15 +164,35 @@ function db_select()
     	/**
     	 * Set client character set
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @param	string
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function db_set_charset($charset, $collation)
    +	public function db_set_charset($charset, $collation)
     	{
    -		// @todo - add support if needed
    -		return TRUE;
    +		return (pg_set_client_encoding($this->conn_id, $charset) === 0);
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Database version
    +	 *
    +	 * This method overrides the one from the base class, as if PHP was
    +	 * compiled with PostgreSQL version >= 7.4 libraries, we have a native
    +	 * function to get the server's version.
    +	 *
    +	 * @return	string
    +	 */
    +
    +	public function version()
    +	{
    +		$version = pg_version($this->conn_id);
    +
    +		/* If we don't have the server version string - fall back to
    +		 * the base driver class' method
    +		 */
    +		return isset($version['server']) ? $version['server'] : parent::version();
     	}
     
     	// --------------------------------------------------------------------
    @@ -165,12 +200,11 @@ function db_set_charset($charset, $collation)
     	/**
     	 * Version number query string
     	 *
    -	 * @access	public
     	 * @return	string
     	 */
    -	function _version()
    +	protected function _version()
     	{
    -		return "SELECT version() AS ver";
    +		return 'SELECT version() AS ver';
     	}
     
     	// --------------------------------------------------------------------
    @@ -178,14 +212,12 @@ function _version()
     	/**
     	 * Execute the query
     	 *
    -	 * @access	private called by the base class
     	 * @param	string	an SQL query
     	 * @return	resource
     	 */
    -	function _execute($sql)
    +	protected function _execute($sql)
     	{
    -		$sql = $this->_prep_query($sql);
    -		return @pg_query($this->conn_id, $sql);
    +		return @pg_query($this->conn_id, $this->_prep_query($sql));
     	}
     
     	// --------------------------------------------------------------------
    @@ -195,11 +227,10 @@ function _execute($sql)
     	 *
     	 * 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)
    +	protected function _prep_query($sql)
     	{
     		return $sql;
     	}
    @@ -209,18 +240,13 @@ function _prep_query($sql)
     	/**
     	 * Begin Transaction
     	 *
    -	 * @access	public
    +	 * @param	bool
     	 * @return	bool
     	 */
    -	function trans_begin($test_mode = FALSE)
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -228,9 +254,9 @@ function trans_begin($test_mode = FALSE)
     		// 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->_trans_failure = ($test_mode === TRUE);
     
    -		return @pg_exec($this->conn_id, "begin");
    +		return (bool) @pg_query($this->conn_id, 'BEGIN');
     	}
     
     	// --------------------------------------------------------------------
    @@ -238,23 +264,17 @@ function trans_begin($test_mode = FALSE)
     	/**
     	 * Commit Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_commit()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
     
    -		return @pg_exec($this->conn_id, "commit");
    +		return (bool) @pg_query($this->conn_id, 'COMMIT');
     	}
     
     	// --------------------------------------------------------------------
    @@ -262,23 +282,17 @@ function trans_commit()
     	/**
     	 * Rollback Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_rollback()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
     
    -		return @pg_exec($this->conn_id, "rollback");
    +		return (bool) @pg_query($this->conn_id, 'ROLLBACK');
     	}
     
     	// --------------------------------------------------------------------
    @@ -286,12 +300,11 @@ function trans_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)
    +	public function escape_str($str, $like = FALSE)
     	{
     		if (is_array($str))
     		{
    @@ -308,9 +321,9 @@ function escape_str($str, $like = FALSE)
     		// 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_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;
    @@ -321,10 +334,9 @@ function escape_str($str, $like = FALSE)
     	/**
     	 * Affected Rows
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function affected_rows()
    +	public function affected_rows()
     	{
     		return @pg_affected_rows($this->result_id);
     	}
    @@ -334,40 +346,45 @@ function affected_rows()
     	/**
     	 * Insert ID
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function insert_id()
    +	public function insert_id()
     	{
    -		$v = $this->_version();
    -		$v = $v['server'];
    +		$v = pg_version($this->conn_id);
    +		$v = isset($v['server']) ? $v['server'] : 0; // 'server' key is only available since PosgreSQL 7.4
     
    -		$table	= func_num_args() > 0 ? func_get_arg(0) : NULL;
    -		$column	= func_num_args() > 1 ? func_get_arg(1) : NULL;
    +		$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);
    +			$sql = 'SELECT LASTVAL() AS ins_id';
     		}
     		elseif ($table != NULL)
     		{
    -			// seq_name passed in table parameter
    -			$sql = sprintf("SELECT CURRVAL('%s') as ins_id", $table);
    +			if ($column != NULL && $v >= '8.0')
    +			{
    +				$sql = 'SELECT pg_get_serial_sequence(\''.$table."', '".$column."') AS seq";
    +				$query = $this->query($sql);
    +				$query = $query->row();
    +				$seq = $query->seq;
    +			}
    +			else
    +			{
    +				// seq_name passed in table parameter
    +				$seq = $table;
    +			}
    +
    +			$sql = 'SELECT CURRVAL(\''.$seq."') AS ins_id";
     		}
     		else
     		{
     			return pg_last_oid($this->result_id);
     		}
    +
     		$query = $this->query($sql);
    -		$row = $query->row();
    -		return $row->ins_id;
    +		$query = $query->row();
    +		return (int) $query->ins_id;
     	}
     
     	// --------------------------------------------------------------------
    @@ -378,27 +395,25 @@ function insert_id()
     	 * Generates a platform-specific query string that counts all records in
     	 * the specified database
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @return	string
     	 */
    -	function count_all($table = '')
    +	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));
    -
    +		$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();
    +		$query = $query->row();
     		$this->_reset_select();
    -		return (int) $row->numrows;
    +		return (int) $query->numrows;
     	}
     
     	// --------------------------------------------------------------------
    @@ -408,17 +423,16 @@ function count_all($table = '')
     	 *
     	 * Generates a platform-specific query string so that the table names can be fetched
     	 *
    -	 * @access	private
    -	 * @param	boolean
    +	 * @param	bool
     	 * @return	string
     	 */
    -	function _list_tables($prefix_limit = FALSE)
    +	protected 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 != '')
    +		if ($prefix_limit !== FALSE && $this->dbprefix != '')
     		{
    -			$sql .= " AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr);
    +			return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr);
     		}
     
     		return $sql;
    @@ -431,13 +445,12 @@ function _list_tables($prefix_limit = FALSE)
     	 *
     	 * 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 = '')
    +	protected function _list_columns($table = '')
     	{
    -		return "SELECT column_name FROM information_schema.columns WHERE table_name ='".$table."'";
    +		return "SELECT column_name FROM information_schema.columns WHERE table_name = '".$table."'";
     	}
     
     	// --------------------------------------------------------------------
    @@ -447,13 +460,12 @@ function _list_columns($table = '')
     	 *
     	 * Generates a platform-specific query so that the column data can be retrieved
     	 *
    -	 * @access	public
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	string
     	 */
    -	function _field_data($table)
    +	protected function _field_data($table)
     	{
    -		return "SELECT * FROM ".$table." LIMIT 1";
    +		return 'SELECT * FROM '.$table.' LIMIT 1';
     	}
     
     	// --------------------------------------------------------------------
    @@ -461,10 +473,9 @@ function _field_data($table)
     	/**
     	 * The error message string
     	 *
    -	 * @access	private
     	 * @return	string
     	 */
    -	function _error_message()
    +	protected function _error_message()
     	{
     		return pg_last_error($this->conn_id);
     	}
    @@ -474,11 +485,11 @@ function _error_message()
     	/**
     	 * The error message number
     	 *
    -	 * @access	private
    -	 * @return	integer
    +	 * @return	string
     	 */
    -	function _error_number()
    +	protected function _error_number()
     	{
    +		// Not supported in Postgre
     		return '';
     	}
     
    @@ -489,11 +500,10 @@ function _error_number()
     	 *
     	 * This function escapes column and table names
     	 *
    -	 * @access	private
     	 * @param	string
     	 * @return	string
     	 */
    -	function _escape_identifiers($item)
    +	public function _escape_identifiers($item)
     	{
     		if ($this->_escape_char == '')
     		{
    @@ -504,24 +514,20 @@ function _escape_identifiers($item)
     		{
     			if (strpos($item, '.'.$id) !== FALSE)
     			{
    -				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);
    +				$item = 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);
    +				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item);
     			}
     		}
     
     		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;
    +			$item = str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item);
     		}
     
     		// remove duplicates if the user already included the escape
    -		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
    +		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item.$this->_escape_char);
     	}
     
     	// --------------------------------------------------------------------
    @@ -532,11 +538,10 @@ function _escape_identifiers($item)
     	 * 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
    +	 * @param	string	table name
    +	 * @return	string
     	 */
    -	function _from_tables($tables)
    +	protected function _from_tables($tables)
     	{
     		if ( ! is_array($tables))
     		{
    @@ -553,15 +558,14 @@ function _from_tables($tables)
     	 *
     	 * 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)
    +	protected function _insert($table, $keys, $values)
     	{
    -		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
    +		return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
     	}
     
     	// --------------------------------------------------------------------
    @@ -571,15 +575,14 @@ function _insert($table, $keys, $values)
     	 *
     	 * 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)
    +	protected function _insert_batch($table, $keys, $values)
     	{
    -		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values);
    +		return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES '.implode(', ', $values);
     	}
     
     	// --------------------------------------------------------------------
    @@ -589,7 +592,6 @@ function _insert_batch($table, $keys, $values)
     	 *
     	 * 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
    @@ -597,24 +599,17 @@ function _insert_batch($table, $keys, $values)
     	 * @param	array	the limit clause
     	 * @return	string
     	 */
    -	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
    +	protected function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
     	{
     		foreach ($values as $key => $val)
     		{
    -			$valstr[] = $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;
    +		return 'UPDATE '.$table.' SET '.implode(', ', $valstr)
    +			.(($where != '' && count($where) > 0) ? ' WHERE '.implode(' ', $where) : '')
    +			.(count($orderby) > 0 ? ' ORDER BY '.implode(', ', $orderby) : '')
    +			.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     	// --------------------------------------------------------------------
    @@ -626,13 +621,12 @@ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
     	 * 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)
    +	protected function _truncate($table)
     	{
    -		return "TRUNCATE ".$table;
    +		return 'TRUNCATE '.$table;
     	}
     
     	// --------------------------------------------------------------------
    @@ -642,31 +636,27 @@ function _truncate($table)
     	 *
     	 * 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)
    +	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);
    +			$conditions = "\nWHERE ".implode("\n", $this->ar_where);
     
     			if (count($where) > 0 && count($like) > 0)
     			{
    -				$conditions .= " AND ";
    +				$conditions .= ' AND ';
     			}
     			$conditions .= implode("\n", $like);
     		}
     
    -		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
    -
    -		return "DELETE FROM ".$table.$conditions.$limit;
    +		return 'DELETE FROM '.$table.$conditions.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     	// --------------------------------------------------------------------
    @@ -675,22 +665,14 @@ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
     	 *
     	 * 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
    +	 * @param	int	the number of rows to limit the query to
    +	 * @param	int	the offset value
     	 * @return	string
     	 */
    -	function _limit($sql, $limit, $offset)
    +	protected function _limit($sql, $limit, $offset)
     	{
    -		$sql .= "LIMIT ".$limit;
    -
    -		if ($offset > 0)
    -		{
    -			$sql .= " OFFSET ".$offset;
    -		}
    -
    -		return $sql;
    +		return $sql.' LIMIT '.$limit.($offset == 0 ? '' : ' OFFSET '.$offset);
     	}
     
     	// --------------------------------------------------------------------
    @@ -698,18 +680,15 @@ function _limit($sql, $limit, $offset)
     	/**
     	 * Close DB Connection
     	 *
    -	 * @access	public
     	 * @param	resource
     	 * @return	void
     	 */
    -	function _close($conn_id)
    +	protected function _close($conn_id)
     	{
     		@pg_close($conn_id);
     	}
     
    -
     }
     
    -
     /* End of file postgre_driver.php */
    -/* Location: ./system/database/drivers/postgre/postgre_driver.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/postgre/postgre_driver.php */
    diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php
    index 756fd347a34..5af834b8db2 100644
    --- a/system/database/drivers/postgre/postgre_forge.php
    +++ b/system/database/drivers/postgre/postgre_forge.php
    @@ -1,13 +1,13 @@
    -$attributes)
    +		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";
    +				$sql .= "\n\t".$attributes;
     			}
     			else
     			{
    -				$attributes = array_change_key_case($attributes, CASE_UPPER);
    -
    -				$sql .= "\n\t".$this->db->_protect_identifiers($field);
    +				$sql .= "\n\t".$this->db->protect_identifiers($field);
     
    -				$is_unsigned = (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE);
    +				$attributes = array_change_key_case($attributes, CASE_UPPER);
    +				$is_unsigned = ( ! empty($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE);
     
     				// Convert datatypes to be PostgreSQL-compatible
     				switch (strtoupper($attributes['TYPE']))
    @@ -122,44 +117,24 @@ function _process_fields($fields, $primary_keys=array())
     					case 'BLOB':
     						$attributes['TYPE'] = 'BYTEA';
     						break;
    +					default:
    +						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'];
    -				}
    +				$sql .= (in_array($field, $primary_keys) && ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE)
    +					? ' SERIAL' : ' '.$attributes['TYPE'];
     
     				// Modified to prevent constraints with integer data types
    -				if (array_key_exists('CONSTRAINT', $attributes) && strpos($attributes['TYPE'], 'INT') === false)
    +				if ( ! empty($attributes['CONSTRAINT']) && 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';
    -				}
    +				$sql .= (isset($attributes['DEFAULT']) ? " DEFAULT '".$attributes['DEFAULT']."'" : '')
    +					.(( ! empty($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					// Added new attribute to create unqite fields. Also works with MySQL
    +					.(( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) ? ' UNIQUE' : '');
     			}
     
     			// don't add a comma on the end of the last field
    @@ -168,7 +143,7 @@ function _process_fields($fields, $primary_keys=array())
     				$sql .= ',';
     			}
     		}
    -		
    +
     		return $sql;
     	}
     
    @@ -177,15 +152,14 @@ function _process_fields($fields, $primary_keys=array())
     	/**
     	 * 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
    +	 * @param	bool	should 'IF NOT EXISTS' be added to the SQL
     	 * @return	bool
     	 */
    -	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
    +	public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	{
     		$sql = 'CREATE TABLE ';
     
    @@ -198,18 +172,17 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			}
     		}
     
    -		$sql .= $this->db->_escape_identifiers($table)." (";
    -		$sql .= $this->_process_fields($fields, $primary_keys);
    +		$sql .= $this->db->_escape_identifiers($table).' ('.$this->_process_fields($fields, $primary_keys);
     
     		if (count($primary_keys) > 0)
     		{
    -			// Something seems to break when passing an array to _protect_identifiers()
    +			// 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);
    +				$primary_keys[$index] = $this->db->protect_identifiers($key);
     			}
     
    -			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
    +			$sql .= ",\n\tPRIMARY KEY (".implode(', ', $primary_keys).')';
     		}
     
     		$sql .= "\n);";
    @@ -220,16 +193,16 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			{
     				if (is_array($key))
     				{
    -					$key = $this->db->_protect_identifiers($key);
    +					$key = $this->db->protect_identifiers($key);
     				}
     				else
     				{
    -					$key = array($this->db->_protect_identifiers($key));
    +					$key = array($this->db->protect_identifiers($key));
     				}
     
     				foreach ($key as $field)
     				{
    -					$sql .= "CREATE INDEX " . $table . "_" . str_replace(array('"', "'"), '', $field) . "_index ON $table ($field); ";
    +					$sql .= 'CREATE INDEX '.$table.'_'.str_replace(array('"', "'"), '', $field).'_index ON '.$table.' ('.$field.'); ';
     				}
     			}
     		}
    @@ -241,10 +214,13 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     
     	/**
     	 * Drop Table
    +	 *
    +	 * @param	string	table name
    +	 * @return	string
     	 */
    -	function _drop_table($table)
    +	public function _drop_table($table)
     	{
    -		return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table)." CASCADE";
    +		return 'DROP TABLE IF EXISTS '.$this->db->_escape_identifiers($table).' CASCADE';
     	}
     
     	// --------------------------------------------------------------------
    @@ -255,34 +231,27 @@ function _drop_table($table)
     	 * 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	bool	should 'NOT NULL' be added
     	 * @param	string	the field after which we should add the new field
    -	 * @return	object
    +	 * @return	string
     	 */
    - 	function _alter_table($alter_type, $table, $fields, $after_field = '')
    +	public function _alter_table($alter_type, $table, $fields, $after_field = '')
      	{
    - 		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";
    + 		$sql = 'ALTER TABLE '.$this->db->protect_identifiers($table).' '.$alter_type.' ';
     
      		// DROP has everything it needs now.
    - 		if ($alter_type == 'DROP')
    + 		if ($alter_type === 'DROP')
      		{
    - 			return $sql.$this->db->_protect_identifiers($fields);
    + 			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;
    + 		return $sql.$this->_process_fields($fields)
    +			.($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : '');
      	}
     
     	// --------------------------------------------------------------------
    @@ -292,17 +261,16 @@ function _alter_table($alter_type, $table, $fields, $after_field = '')
     	 *
     	 * 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)
    +	public 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;
    +		return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name);
     	}
    +
     }
     
     /* End of file postgre_forge.php */
    -/* Location: ./system/database/drivers/postgre/postgre_forge.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/postgre/postgre_forge.php */
    diff --git a/system/database/drivers/postgre/postgre_result.php b/system/database/drivers/postgre/postgre_result.php
    index 9161bf955c2..2cfa997e7ad 100644
    --- a/system/database/drivers/postgre/postgre_result.php
    +++ b/system/database/drivers/postgre/postgre_result.php
    @@ -1,13 +1,13 @@
    -result_id);
     	}
    @@ -54,10 +51,9 @@ function num_rows()
     	/**
     	 * Number of fields in the result set
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function num_fields()
    +	public function num_fields()
     	{
     		return @pg_num_fields($this->result_id);
     	}
    @@ -69,13 +65,12 @@ function num_fields()
     	 *
     	 * Generates an array of column names
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function list_fields()
    +	public function list_fields()
     	{
     		$field_names = array();
    -		for ($i = 0; $i < $this->num_fields(); $i++)
    +		for ($i = 0, $c = $this->num_fields(); $i < $c; $i++)
     		{
     			$field_names[] = pg_field_name($this->result_id, $i);
     		}
    @@ -90,22 +85,19 @@ function list_fields()
     	 *
     	 * Generates an array of objects containing field meta-data
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function field_data()
    +	public function field_data()
     	{
     		$retval = array();
    -		for ($i = 0; $i < $this->num_fields(); $i++)
    +		for ($i = 0, $c = $this->num_fields(); $i < $c; $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;
    +			$retval[$i]			= new stdClass();
    +			$retval[$i]->name		= pg_field_name($this->result_id, $i);
    +			$retval[$i]->type		= pg_field_type($this->result_id, $i);
    +			$retval[$i]->max_length		= pg_field_size($this->result_id, $i);
    +			$retval[$i]->primary_key	= 0;
    +			$retval[$i]->default		= '';
     		}
     
     		return $retval;
    @@ -116,9 +108,9 @@ function field_data()
     	/**
     	 * Free the result
     	 *
    -	 * @return	null
    +	 * @return	void
     	 */
    -	function free_result()
    +	public function free_result()
     	{
     		if (is_resource($this->result_id))
     		{
    @@ -132,14 +124,13 @@ function free_result()
     	/**
     	 * Data Seek
     	 *
    -	 * Moves the internal pointer to the desired offset.  We call
    +	 * 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)
    +	protected function _data_seek($n = 0)
     	{
     		return pg_result_seek($this->result_id, $n);
     	}
    @@ -151,10 +142,9 @@ function _data_seek($n = 0)
     	 *
     	 * Returns the result set as an array
     	 *
    -	 * @access	private
     	 * @return	array
     	 */
    -	function _fetch_assoc()
    +	protected function _fetch_assoc()
     	{
     		return pg_fetch_assoc($this->result_id);
     	}
    @@ -166,16 +156,14 @@ function _fetch_assoc()
     	 *
     	 * Returns the result set as an object
     	 *
    -	 * @access	private
     	 * @return	object
     	 */
    -	function _fetch_object()
    +	protected function _fetch_object()
     	{
     		return pg_fetch_object($this->result_id);
     	}
     
     }
     
    -
     /* End of file postgre_result.php */
    -/* Location: ./system/database/drivers/postgre/postgre_result.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/postgre/postgre_result.php */
    diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php
    index dffd8c549d7..c175a382b7f 100644
    --- a/system/database/drivers/postgre/postgre_utility.php
    +++ b/system/database/drivers/postgre/postgre_utility.php
    @@ -1,13 +1,13 @@
    -db->display_error('db_unsuported_feature');
     	}
     }
     
    -
     /* End of file postgre_utility.php */
    -/* Location: ./system/database/drivers/postgre/postgre_utility.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/postgre/postgre_utility.php */
    
    From 0e5a17f6c736397c1e9581071cb852b5291fa97e Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 16:49:03 +0200
    Subject: [PATCH 0355/5397] Update the changelog
    
    ---
     user_guide_src/source/changelog.rst | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 48011f208e3..0e5b21395a3 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -47,6 +47,7 @@ Release Date: Not Released
           get_compiled_insert(), get_compiled_update(), get_compiled_delete().
        -  Taking care of LIKE condition when used with MySQL UPDATE statement.
        -  Adding $escape parameter to the order_by function, this enables ordering by custom fields.
    +   -  The PostgreSQL database driver now uses pg_version() for server version checking, when appropriate.
     
     -  Libraries
     
    
    From ca7e5f1eb15408b9d71e55d9a0e54b96f5ddc6aa Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 26 Jan 2012 17:58:28 +0200
    Subject: [PATCH 0356/5397] Call parent::__construct() in our constructor
    
    ---
     system/database/drivers/cubrid/cubrid_driver.php | 4 +++-
     1 file changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php
    index b89746b7d22..d1fc5f0fa7e 100644
    --- a/system/database/drivers/cubrid/cubrid_driver.php
    +++ b/system/database/drivers/cubrid/cubrid_driver.php
    @@ -57,8 +57,10 @@ class CI_DB_cubrid_driver extends CI_DB {
     	protected $_count_string = 'SELECT COUNT(*) AS ';
     	protected $_random_keyword = ' RAND()'; // database specific random keyword
     
    -	public function __construct()
    +	public function __construct($params)
     	{
    +		parent::__construct($params);
    +
     		// If no port is defined by the user, use the default value
     		if ($this->port == '')
     		{
    
    From 2caf289a893b8af69bbdce3f29d84d29e5433b58 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Fri, 27 Jan 2012 00:12:03 +0200
    Subject: [PATCH 0357/5397] Improve the MySQL database driver
    
    ---
     .../database/drivers/mysql/mysql_driver.php   | 322 ++++++------------
     system/database/drivers/mysql/mysql_forge.php | 131 +++----
     .../database/drivers/mysql/mysql_result.php   |  57 ++--
     .../database/drivers/mysql/mysql_utility.php  |  70 ++--
     4 files changed, 205 insertions(+), 375 deletions(-)
    
    diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php
    index 0f69a07236b..067710ff023 100644
    --- a/system/database/drivers/mysql/mysql_driver.php
    +++ b/system/database/drivers/mysql/mysql_driver.php
    @@ -1,13 +1,13 @@
    -port != '')
     		{
     			$this->hostname .= ':'.$this->port;
     		}
    +	}
     
    +	/**
    +	 * Non-persistent database connection
    +	 *
    +	 * @return	resource
    +	 */
    +	public function db_connect()
    +	{
     		return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);
     	}
     
    @@ -90,16 +89,10 @@ function db_connect()
     	/**
     	 * Persistent database connection
     	 *
    -	 * @access	private called by the base class
     	 * @return	resource
     	 */
    -	function db_pconnect()
    +	public function db_pconnect()
     	{
    -		if ($this->port != '')
    -		{
    -			$this->hostname .= ':'.$this->port;
    -		}
    -
     		return @mysql_pconnect($this->hostname, $this->username, $this->password);
     	}
     
    @@ -111,10 +104,9 @@ function db_pconnect()
     	 * 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()
    +	public function reconnect()
     	{
     		if (mysql_ping($this->conn_id) === FALSE)
     		{
    @@ -127,10 +119,9 @@ function reconnect()
     	/**
     	 * Select the database
     	 *
    -	 * @access	private called by the base class
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function db_select()
    +	public function db_select()
     	{
     		return @mysql_select_db($this->database, $this->conn_id);
     	}
    @@ -140,12 +131,11 @@ function db_select()
     	/**
     	 * Set client character set
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @param	string
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function db_set_charset($charset, $collation)
    +	public function db_set_charset($charset, $collation)
     	{
     		return function_exists('mysql_set_charset')
     			? @mysql_set_charset($charset, $this->conn_id)
    @@ -157,12 +147,11 @@ function db_set_charset($charset, $collation)
     	/**
     	 * Version number query string
     	 *
    -	 * @access	public
     	 * @return	string
     	 */
    -	function _version()
    +	protected function _version()
     	{
    -		return "SELECT version() AS ver";
    +		return 'SELECT version() AS ver';
     	}
     
     	// --------------------------------------------------------------------
    @@ -170,14 +159,12 @@ function _version()
     	/**
     	 * Execute the query
     	 *
    -	 * @access	private called by the base class
     	 * @param	string	an SQL query
    -	 * @return	resource
    +	 * @return	mixed
     	 */
    -	function _execute($sql)
    +	protected function _execute($sql)
     	{
    -		$sql = $this->_prep_query($sql);
    -		return @mysql_query($sql, $this->conn_id);
    +		return @mysql_query($this->_prep_query($sql), $this->conn_id);
     	}
     
     	// --------------------------------------------------------------------
    @@ -187,20 +174,16 @@ function _execute($sql)
     	 *
     	 * 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)
    +	protected 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)
    +		// mysql_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack
    +		// modifies the query so that it a proper number of affected rows is returned.
    +		if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
     		{
    -			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 preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', 'DELETE FROM \\1 WHERE 1=1', $sql);
     		}
     
     		return $sql;
    @@ -211,18 +194,12 @@ function _prep_query($sql)
     	/**
     	 * Begin Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_begin($test_mode = FALSE)
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -230,7 +207,7 @@ function trans_begin($test_mode = FALSE)
     		// 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->_trans_failure = ($test_mode === TRUE);
     
     		$this->simple_query('SET AUTOCOMMIT=0');
     		$this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK
    @@ -242,18 +219,12 @@ function trans_begin($test_mode = FALSE)
     	/**
     	 * Commit Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_commit()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -268,18 +239,12 @@ function trans_commit()
     	/**
     	 * Rollback Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_rollback()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -294,12 +259,11 @@ function trans_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)
    +	public function escape_str($str, $like = FALSE)
     	{
     		if (is_array($str))
     		{
    @@ -311,7 +275,7 @@ function escape_str($str, $like = FALSE)
     	   		return $str;
     	   	}
     
    -		if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))
    +		if (function_exists('mysql_real_escape_string') && is_resource($this->conn_id))
     		{
     			$str = mysql_real_escape_string($str, $this->conn_id);
     		}
    @@ -327,7 +291,7 @@ function escape_str($str, $like = FALSE)
     		// escape LIKE condition wildcards
     		if ($like === TRUE)
     		{
    -			$str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
    +			return str_replace(array('%', '_'), array('\\%', '\\_'), $str);
     		}
     
     		return $str;
    @@ -338,10 +302,9 @@ function escape_str($str, $like = FALSE)
     	/**
     	 * Affected Rows
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function affected_rows()
    +	public function affected_rows()
     	{
     		return @mysql_affected_rows($this->conn_id);
     	}
    @@ -351,10 +314,9 @@ function affected_rows()
     	/**
     	 * Insert ID
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function insert_id()
    +	public function insert_id()
     	{
     		return @mysql_insert_id($this->conn_id);
     	}
    @@ -367,27 +329,25 @@ function insert_id()
     	 * Generates a platform-specific query string that counts all records in
     	 * the specified database
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @return	string
     	 */
    -	function count_all($table = '')
    +	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));
    -
    +		$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();
    +		$query = $query->row();
     		$this->_reset_select();
    -		return (int) $row->numrows;
    +		return (int) $query->numrows;
     	}
     
     	// --------------------------------------------------------------------
    @@ -397,17 +357,16 @@ function count_all($table = '')
     	 *
     	 * Generates a platform-specific query string so that the table names can be fetched
     	 *
    -	 * @access	private
    -	 * @param	boolean
    +	 * @param	bool
     	 * @return	string
     	 */
    -	function _list_tables($prefix_limit = FALSE)
    +	protected function _list_tables($prefix_limit = FALSE)
     	{
    -		$sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char;
    +		$sql = 'SHOW TABLES FROM '.$this->_escape_char.$this->database.$this->_escape_char;
     
    -		if ($prefix_limit !== FALSE AND $this->dbprefix != '')
    +		if ($prefix_limit !== FALSE && $this->dbprefix != '')
     		{
    -			$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'";
    +			return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'";
     		}
     
     		return $sql;
    @@ -420,13 +379,12 @@ function _list_tables($prefix_limit = FALSE)
     	 *
     	 * 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 = '')
    +	public function _list_columns($table = '')
     	{
    -		return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE);
    +		return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE);
     	}
     
     	// --------------------------------------------------------------------
    @@ -436,13 +394,12 @@ function _list_columns($table = '')
     	 *
     	 * Generates a platform-specific query so that the column data can be retrieved
     	 *
    -	 * @access	public
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	string
     	 */
    -	function _field_data($table)
    +	public function _field_data($table)
     	{
    -		return "DESCRIBE ".$table;
    +		return 'DESCRIBE '.$table;
     	}
     
     	// --------------------------------------------------------------------
    @@ -450,10 +407,9 @@ function _field_data($table)
     	/**
     	 * The error message string
     	 *
    -	 * @access	private
     	 * @return	string
     	 */
    -	function _error_message()
    +	protected function _error_message()
     	{
     		return mysql_error($this->conn_id);
     	}
    @@ -463,10 +419,9 @@ function _error_message()
     	/**
     	 * The error message number
     	 *
    -	 * @access	private
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function _error_number()
    +	protected function _error_number()
     	{
     		return mysql_errno($this->conn_id);
     	}
    @@ -478,11 +433,10 @@ function _error_number()
     	 *
     	 * This function escapes column and table names
     	 *
    -	 * @access	private
     	 * @param	string
     	 * @return	string
     	 */
    -	function _escape_identifiers($item)
    +	public function _escape_identifiers($item)
     	{
     		if ($this->_escape_char == '')
     		{
    @@ -493,24 +447,20 @@ function _escape_identifiers($item)
     		{
     			if (strpos($item, '.'.$id) !== FALSE)
     			{
    -				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);
    +				$item = 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);
    +				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item);
     			}
     		}
     
     		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;
    +			$item = str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item);
     		}
     
     		// remove duplicates if the user already included the escape
    -		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
    +		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item.$this->_escape_char);
     	}
     
     	// --------------------------------------------------------------------
    @@ -521,11 +471,10 @@ function _escape_identifiers($item)
     	 * 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
    +	 * @param	string	table name
    +	 * @return	string
     	 */
    -	function _from_tables($tables)
    +	protected function _from_tables($tables)
     	{
     		if ( ! is_array($tables))
     		{
    @@ -542,15 +491,14 @@ function _from_tables($tables)
     	 *
     	 * 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)
    +	protected function _insert($table, $keys, $values)
     	{
    -		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
    +		return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
     	}
     
     	// --------------------------------------------------------------------
    @@ -561,15 +509,14 @@ function _insert($table, $keys, $values)
     	 *
     	 * 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)
    +	protected function _replace($table, $keys, $values)
     	{
    -		return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
    +		return 'REPLACE INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
     	}
     
     	// --------------------------------------------------------------------
    @@ -579,15 +526,14 @@ function _replace($table, $keys, $values)
     	 *
     	 * 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)
    +	protected function _insert_batch($table, $keys, $values)
     	{
    -		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values);
    +		return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES '.implode(', ', $values);
     	}
     
     	// --------------------------------------------------------------------
    @@ -598,7 +544,6 @@ function _insert_batch($table, $keys, $values)
     	 *
     	 * 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
    @@ -606,34 +551,22 @@ function _insert_batch($table, $keys, $values)
     	 * @param	array	the limit clause
     	 * @return	string
     	 */
    -	function _update($table, $values, $where, $orderby = array(), $limit = FALSE, $like = array())
    +	protected function _update($table, $values, $where, $orderby = array(), $limit = FALSE, $like = array())
     	{
     		foreach ($values as $key => $val)
     		{
    -			$valstr[] = $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) : '';
    -		
    -		if (count($like) > 0) 
    +		$where = ($where != '' && count($where) > 0) ? ' WHERE '.implode(' ', $where) : '';
    +		if (count($like) > 0)
     		{
    -			$sql .= ($where == '' AND count($where) <1) ? " WHERE " : ' AND ';
    -			
    -			foreach ($like as $st_like) 
    -			{
    -				$sql .= " " . $st_like;	
    -			}
    +			$where .= ($where == '' ? ' WHERE ' : ' AND ').implode(' ', $like);
     		}
     
    -		$sql .= $orderby.$limit;
    -
    -		return $sql;
    +		return 'UPDATE '.$table.' SET '.implode(', ', $valstr).$where
    +			.(count($orderby) > 0 ? ' ORDER BY '.implode(', ', $orderby) : '')
    +			.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     	// --------------------------------------------------------------------
    @@ -644,17 +577,14 @@ function _update($table, $values, $where, $orderby = array(), $limit = FALSE, $l
     	 *
     	 * 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)
    +	protected 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];
    @@ -668,30 +598,21 @@ function _update_batch($table, $values, $index, $where = NULL)
     			}
     		}
     
    -		$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, ';
    +			$cases .= $k." = CASE \n"
    +				.implode("\n", $v)."\n"
    +				.'ELSE '.$k.' END, ';
     		}
     
    -		$sql .= substr($cases, 0, -2);
    -
    -		$sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')';
    -
    -		return $sql;
    +		return 'UPDATE '.$table.' SET '.substr($cases, 0, -2)
    +			.' WHERE '.(($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : '')
    +			.$index.' IN('.implode(',', $ids).')';
     	}
     
     	// --------------------------------------------------------------------
     
    -
     	/**
     	 * Truncate statement
     	 *
    @@ -699,13 +620,12 @@ function _update_batch($table, $values, $index, $where = NULL)
     	 * 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)
    +	protected function _truncate($table)
     	{
    -		return "TRUNCATE ".$table;
    +		return 'TRUNCATE '.$table;
     	}
     
     	// --------------------------------------------------------------------
    @@ -715,31 +635,27 @@ function _truncate($table)
     	 *
     	 * 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)
    +	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);
    +			$conditions = "\nWHERE ".implode("\n", $this->ar_where);
     
     			if (count($where) > 0 && count($like) > 0)
     			{
    -				$conditions .= " AND ";
    +				$conditions .= ' AND ';
     			}
     			$conditions .= implode("\n", $like);
     		}
     
    -		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
    -
    -		return "DELETE FROM ".$table.$conditions.$limit;
    +		return 'DELETE FROM '.$table.$conditions.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     	// --------------------------------------------------------------------
    @@ -749,24 +665,14 @@ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
     	 *
     	 * 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
    +	 * @param	int	the number of rows to limit the query to
    +	 * @param	int	the offset value
     	 * @return	string
     	 */
    -	function _limit($sql, $limit, $offset)
    +	protected function _limit($sql, $limit, $offset)
     	{
    -		if ($offset == 0)
    -		{
    -			$offset = '';
    -		}
    -		else
    -		{
    -			$offset .= ", ";
    -		}
    -
    -		return $sql."LIMIT ".$offset.$limit;
    +		return $sql.' LIMIT '.($offset == 0 ? '' : $offset.', ').$limit;
     	}
     
     	// --------------------------------------------------------------------
    @@ -774,17 +680,15 @@ function _limit($sql, $limit, $offset)
     	/**
     	 * Close DB Connection
     	 *
    -	 * @access	public
     	 * @param	resource
     	 * @return	void
     	 */
    -	function _close($conn_id)
    +	protected function _close($conn_id)
     	{
     		@mysql_close($conn_id);
     	}
     
     }
     
    -
     /* End of file mysql_driver.php */
    -/* Location: ./system/database/drivers/mysql/mysql_driver.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/mysql/mysql_driver.php */
    diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php
    index a41a7b4466a..d3107134e5c 100644
    --- a/system/database/drivers/mysql/mysql_forge.php
    +++ b/system/database/drivers/mysql/mysql_forge.php
    @@ -1,13 +1,13 @@
    -$attributes)
    +		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";
    +				$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']).' ';
    -				}
    +				$sql .= "\n\t".$this->db->protect_identifiers($field)
    +					.( ! empty($attributes['NAME']) ? ' '.$this->db->protect_identifiers($attributes['NAME']).' ' : '');
     
    -				if (array_key_exists('TYPE', $attributes))
    +				if ( ! empty($attributes['TYPE']))
     				{
     					$sql .=  ' '.$attributes['TYPE'];
     
    -					if (array_key_exists('CONSTRAINT', $attributes))
    +					if ( ! empty($attributes['CONSTRAINT']))
     					{
    -						switch ($attributes['TYPE'])
    +						switch (strtolower($attributes['TYPE']))
     						{
     							case 'decimal':
     							case 'float':
     							case 'numeric':
     								$sql .= '('.implode(',', $attributes['CONSTRAINT']).')';
    -							break;
    -
    +								break;
     							case 'enum':
     							case 'set':
     								$sql .= '("'.implode('","', $attributes['CONSTRAINT']).'")';
    -							break;
    -
    +								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';
    -				}
    +				$sql .= (( ! empty($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.(isset($attributes['DEFAULT']) ? " DEFAULT '".$attributes['DEFAULT']."'" : '')
    +					.(( ! empty($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.(( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    @@ -161,15 +131,14 @@ function _process_fields($fields)
     	/**
     	 * 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
    +	 * @param	bool	should 'IF NOT EXISTS' be added to the SQL
     	 * @return	bool
     	 */
    -	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
    +	public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	{
     		$sql = 'CREATE TABLE ';
     
    @@ -178,15 +147,12 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			$sql .= 'IF NOT EXISTS ';
     		}
     
    -		$sql .= $this->db->_escape_identifiers($table)." (";
    -
    -		$sql .= $this->_process_fields($fields);
    +		$sql .= $this->db->_escape_identifiers($table).' ('.$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) . ")";
    +			$sql .= ",\n\tPRIMARY KEY ".$key_name.' ('.implode(', ', $this->db->protect_identifiers($primary_keys)).')';
     		}
     
     		if (is_array($keys) && count($keys) > 0)
    @@ -204,13 +170,11 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     					$key = array($key_name);
     				}
     
    -				$sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";
    +				$sql .= ",\n\tKEY ".$key_name.' ('.implode(', ', $key).')';
     			}
     		}
     
    -		$sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";
    -
    -		return $sql;
    +		return $sql."\n) DEFAULT CHARACTER SET ".$this->db->char_set.' COLLATE '.$this->db->dbcollat.';';
     	}
     
     	// --------------------------------------------------------------------
    @@ -218,12 +182,12 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	/**
     	 * Drop Table
     	 *
    -	 * @access	private
    +	 * @param	string	table name
     	 * @return	string
     	 */
    -	function _drop_table($table)
    +	public function _drop_table($table)
     	{
    -		return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);
    +		return 'DROP TABLE IF EXISTS '.$this->db->_escape_identifiers($table);
     	}
     
     	// --------------------------------------------------------------------
    @@ -232,33 +196,26 @@ function _drop_table($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(),
    +	 * 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
    +	 * @return	string
     	 */
    -	function _alter_table($alter_type, $table, $fields, $after_field = '')
    +	public function _alter_table($alter_type, $table, $fields, $after_field = '')
     	{
    -		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";
    +		$sql = 'ALTER TABLE '.$this->db->protect_identifiers($table).' '.$alter_type.' ';
     
     		// DROP has everything it needs now.
    -		if ($alter_type == 'DROP')
    +		if ($alter_type === 'DROP')
     		{
    -			return $sql.$this->db->_protect_identifiers($fields);
    +			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;
    +		return $sql.$this->_process_fields($fields)
    +			.($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : '');
     	}
     
     	// --------------------------------------------------------------------
    @@ -268,18 +225,16 @@ function _alter_table($alter_type, $table, $fields, $after_field = '')
     	 *
     	 * 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)
    +	public 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;
    +		return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name);
     	}
     
     }
     
     /* End of file mysql_forge.php */
    -/* Location: ./system/database/drivers/mysql/mysql_forge.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/mysql/mysql_forge.php */
    diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php
    index dcb99cd6016..8f04a936d9d 100644
    --- a/system/database/drivers/mysql/mysql_result.php
    +++ b/system/database/drivers/mysql/mysql_result.php
    @@ -1,13 +1,13 @@
    -result_id);
     	}
    @@ -54,10 +51,9 @@ function num_rows()
     	/**
     	 * Number of fields in the result set
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function num_fields()
    +	public function num_fields()
     	{
     		return @mysql_num_fields($this->result_id);
     	}
    @@ -69,10 +65,9 @@ function num_fields()
     	 *
     	 * Generates an array of column names
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function list_fields()
    +	public function list_fields()
     	{
     		$field_names = array();
     		while ($field = mysql_fetch_field($this->result_id))
    @@ -90,25 +85,21 @@ function list_fields()
     	 *
     	 * Generates an array of objects containing field meta-data
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function field_data()
    +	public 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 );
    +			$F		= new stdClass();
    +			$F->name	= $field->Field;
    +			$F->type	= ( ! empty($matches[1])) ? $matches[1] : NULL;
    +			$F->default	= $field->Default;
    +			$F->max_length	= ( ! empty($matches[2])) ? preg_replace('/[^\d]/', '', $matches[2]) : NULL;
    +			$F->primary_key = (int) ($field->Key === 'PRI');
     
     			$retval[] = $F;
     		}
    @@ -121,9 +112,9 @@ function field_data()
     	/**
     	 * Free the result
     	 *
    -	 * @return	null
    +	 * @return	void
     	 */
    -	function free_result()
    +	public function free_result()
     	{
     		if (is_resource($this->result_id))
     		{
    @@ -137,14 +128,13 @@ function free_result()
     	/**
     	 * Data Seek
     	 *
    -	 * Moves the internal pointer to the desired offset.  We call
    +	 * 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)
    +	protected function _data_seek($n = 0)
     	{
     		return mysql_data_seek($this->result_id, $n);
     	}
    @@ -156,10 +146,9 @@ function _data_seek($n = 0)
     	 *
     	 * Returns the result set as an array
     	 *
    -	 * @access	private
     	 * @return	array
     	 */
    -	function _fetch_assoc()
    +	protected function _fetch_assoc()
     	{
     		return mysql_fetch_assoc($this->result_id);
     	}
    @@ -171,16 +160,14 @@ function _fetch_assoc()
     	 *
     	 * Returns the result set as an object
     	 *
    -	 * @access	private
     	 * @return	object
     	 */
    -	function _fetch_object()
    +	protected function _fetch_object()
     	{
     		return mysql_fetch_object($this->result_id);
     	}
     
     }
     
    -
     /* End of file mysql_result.php */
    -/* Location: ./system/database/drivers/mysql/mysql_result.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/mysql/mysql_result.php */
    diff --git a/system/database/drivers/mysql/mysql_utility.php b/system/database/drivers/mysql/mysql_utility.php
    index 70352416509..0e7c18e1608 100644
    --- a/system/database/drivers/mysql/mysql_utility.php
    +++ b/system/database/drivers/mysql/mysql_utility.php
    @@ -1,13 +1,13 @@
    -db->_escape_identifiers($table);
    +		return 'OPTIMIZE TABLE '.$this->db->_escape_identifiers($table);
     	}
     
     	// --------------------------------------------------------------------
    @@ -70,26 +66,24 @@ function _optimize_table($table)
     	 *
     	 * Generates a platform-specific query so that a table can be repaired
     	 *
    -	 * @access	private
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	string
     	 */
    -	function _repair_table($table)
    +	public function _repair_table($table)
     	{
    -		return "REPAIR TABLE ".$this->db->_escape_identifiers($table);
    +		return 'REPAIR TABLE '.$this->db->_escape_identifiers($table);
     	}
     
     	// --------------------------------------------------------------------
     	/**
     	 * MySQL Export
     	 *
    -	 * @access	private
     	 * @param	array	Preferences
     	 * @return	mixed
     	 */
    -	function _backup($params = array())
    +	public function _backup($params = array())
     	{
    -		if (count($params) == 0)
    +		if (count($params) === 0)
     		{
     			return FALSE;
     		}
    @@ -99,16 +93,16 @@ function _backup($params = array())
     
     		// Build the output
     		$output = '';
    -		foreach ((array)$tables as $table)
    +		foreach ( (array) $tables as $table)
     		{
     			// Is the table in the "ignore" list?
    -			if (in_array($table, (array)$ignore, TRUE))
    +			if (in_array($table, (array) $ignore, TRUE))
     			{
     				continue;
     			}
     
     			// Get the table schema
    -			$query = $this->db->query("SHOW CREATE TABLE `".$this->db->database.'`.`'.$table.'`');
    +			$query = $this->db->query('SHOW CREATE TABLE `'.$this->db->database.'`.`'.$table.'`');
     
     			// No result means the table name was invalid
     			if ($query === FALSE)
    @@ -141,7 +135,7 @@ function _backup($params = array())
     			}
     
     			// Grab all the data from the current table
    -			$query = $this->db->query("SELECT * FROM $table");
    +			$query = $this->db->query('SELECT * FROM '.$table);
     
     			if ($query->num_rows() == 0)
     			{
    @@ -149,7 +143,7 @@ function _backup($params = array())
     			}
     
     			// Fetch the field names and determine if the field is an
    -			// integer type.  We use this info to decide whether to
    +			// integer type. We use this info to decide whether to
     			// surround the data with quotes or not
     
     			$i = 0;
    @@ -158,11 +152,9 @@ function _backup($params = 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;
    +				$is_int[$i] = in_array(strtolower(mysql_field_type($query->result_id, $i)),
    +							array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'),
    +							TRUE);
     
     				// Create a string of field names
     				$field_str .= '`'.$field->name.'`, ';
    @@ -170,8 +162,7 @@ function _backup($params = array())
     			}
     
     			// Trim off the end comma
    -			$field_str = preg_replace( "/, $/" , "" , $field_str);
    -
    +			$field_str = preg_replace('/, $/' , '', $field_str);
     
     			// Build the insert string
     			foreach ($query->result_array() as $row)
    @@ -189,14 +180,7 @@ function _backup($params = array())
     					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;
    -						}
    +						$val_str .= ($is_int[$i] == FALSE) ? $this->db->escape($v) : $v;
     					}
     
     					// Append a comma
    @@ -205,13 +189,13 @@ function _backup($params = array())
     				}
     
     				// Remove the comma at the end of the string
    -				$val_str = preg_replace( "/, $/" , "" , $val_str);
    +				$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.$newline.$newline;
     		}
     
     		return $output;
    @@ -219,4 +203,4 @@ function _backup($params = array())
     }
     
     /* End of file mysql_utility.php */
    -/* Location: ./system/database/drivers/mysql/mysql_utility.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/mysql/mysql_utility.php */
    
    From 82c83078a91acc3ce25572e28096b0b4bbe8d67c Mon Sep 17 00:00:00 2001
    From: Timothy Warren 
    Date: Thu, 26 Jan 2012 19:02:05 -0500
    Subject: [PATCH 0358/5397] Added try catch example in style guide
    
    ---
     user_guide_src/source/general/styleguide.rst | 16 ++++++++++++++++
     1 file changed, 16 insertions(+)
    
    diff --git a/user_guide_src/source/general/styleguide.rst b/user_guide_src/source/general/styleguide.rst
    index b3dc088717d..d8bdd05317d 100644
    --- a/user_guide_src/source/general/styleguide.rst
    +++ b/user_guide_src/source/general/styleguide.rst
    @@ -441,6 +441,13 @@ same level as the control statement that "owns" them.
     			// ...
     			}
     		}
    +		
    +	try {
    +		// ...
    +	}
    +	catch() {
    +		// ...
    +	}
     
     **CORRECT**::
     
    @@ -470,6 +477,15 @@ same level as the control statement that "owns" them.
     			// ...
     		}
     	}
    +	
    +	try 
    +	{
    +		// ...
    +	}
    +	catch()
    +	{
    +		// ...
    +	}
     
     Bracket and Parenthetic Spacing
     ===============================
    
    From 5c078ceeb926119fc3b4e55ca7c33ff2d1a207cd Mon Sep 17 00:00:00 2001
    From: "Thor (atiredmachine)" 
    Date: Thu, 26 Jan 2012 17:18:35 -0800
    Subject: [PATCH 0359/5397] Added javascript. Improved based on comments.
    
    ---
     system/core/Output.php | 74 +++++++++++++++++++++++++++++++-----------
     1 file changed, 55 insertions(+), 19 deletions(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index 9bc02fc8409..c4eba30bb50 100755
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -593,12 +593,12 @@ public function minify($output, $type='text/html')
     
     				$size_before = strlen($output);
     
    -				// Keep track of 
      and }msU', $output, $textareas_clean);
    +				preg_match_all('{}msU', $output, $javascript_clean);
     
     				// Minify the CSS in all the }msU', $output, $style_clean);
    @@ -606,39 +606,75 @@ public function minify($output, $type='text/html')
     				{
     					$output = str_replace($s, $this->minify($s,'text/css'), $output);
     				}
    +				
    +				// Minify the javascript in }msU', $output, $javascript_messed);
    +					$output = str_replace($javascript_messed[0], $javascript_mini, $output);
    +				}
    +				
    +				$size_removed = $size_before - strlen($output);
    +				$savings_percent = round(($size_removed / $size_before * 100));
    +
    +				log_message('debug', 'Minifier shaved '.($size_removed / 1000).'KB ('.$savings_percent.'%) off final HTML output.');
     
     			break;
     			
     			
     			case 'text/css':
     			
    -				// Remove spaces around curly brackets, colons, and semi-colons
    -				$output = preg_replace('!\s*(:|;|}|{)\s*!', '$1', $output);
    -				
    -				// Replace spaces with line breaks to limit line lengths
    -				$output = preg_replace('!\s+!', "\n", $output);
    +				//Remove CSS comments
    +				$output = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $output);
    +			
    +				// Remove spaces around curly brackets, colons,
    +				// semi-colons, parenthesis, commas
    +				$output = preg_replace('!\s*(:|;|,|}|{|\(|\))\s*!', '$1', $output);
    +
    +			break;
    +			
    +			
    +			case 'text/javascript':
    +
    +				// Replace multiple spaces with a single newline.
    +				$output = preg_replace('!\s{2,}!',"\n", $output);
    +
    +				// Remove excessive newlines.
    +				$output = preg_replace('!(;|{|})\n!','$1', $output);
     
     			break;
     		}
    
    From 6c5992da5cf3579a29079b0aae3e9ba0700fda5c Mon Sep 17 00:00:00 2001
    From: "Thor (atiredmachine)" 
    Date: Thu, 26 Jan 2012 18:45:57 -0800
    Subject: [PATCH 0360/5397] Removed javascript for now...
    
    ---
     system/core/Output.php | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index c4eba30bb50..d8c230968e0 100755
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -670,11 +670,11 @@ public function minify($output, $type='text/html')
     			
     			case 'text/javascript':
     
    -				// Replace multiple spaces with a single newline.
    -				$output = preg_replace('!\s{2,}!',"\n", $output);
    +				// Replace multiple whitespace characters with a single newline.
    +				//$output = preg_replace('!\s{2,}!',"\n", $output);
     
     				// Remove excessive newlines.
    -				$output = preg_replace('!(;|{|})\n!','$1', $output);
    +				//$output = preg_replace('!(;|{|})\n!','$1', $output);
     
     			break;
     		}
    
    From 1ff49e05b8cb6a7d41a5ed36ff477b8d51b4ef12 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Fri, 27 Jan 2012 11:30:41 +0200
    Subject: [PATCH 0361/5397] Improve the MySQLi database driver
    
    ---
     system/database/DB_driver.php                 |   2 +-
     .../database/drivers/mysqli/mysqli_driver.php | 313 ++++++------------
     .../database/drivers/mysqli/mysqli_forge.php  | 137 +++-----
     .../database/drivers/mysqli/mysqli_result.php |  57 ++--
     .../drivers/mysqli/mysqli_utility.php         |  34 +-
     5 files changed, 189 insertions(+), 354 deletions(-)
    
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index 661b42ced81..7445a5069b5 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -257,7 +257,7 @@ function version()
     
     		// Some DBs have functions that return the version, and don't run special
     		// SQL queries per se. In these instances, just return the result.
    -		$driver_version_exceptions = array('oci8', 'sqlite', 'cubrid', 'pdo');
    +		$driver_version_exceptions = array('oci8', 'sqlite', 'cubrid', 'pdo', 'mysqli');
     
     		if (in_array($this->dbdriver, $driver_version_exceptions))
     		{
    diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php
    index aff62a37df6..c6ffb492994 100644
    --- a/system/database/drivers/mysqli/mysqli_driver.php
    +++ b/system/database/drivers/mysqli/mysqli_driver.php
    @@ -1,13 +1,13 @@
    -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);
    -		}
    -
    +		return ($this->port != '')
    +			? @mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port)
    +			: @mysqli_connect($this->hostname, $this->username, $this->password, $this->database);
     	}
     
     	// --------------------------------------------------------------------
    @@ -95,12 +81,13 @@ function db_connect()
     	/**
     	 * Persistent database connection
     	 *
    -	 * @access	private called by the base class
    -	 * @return	resource
    +	 * @return	object
     	 */
    -	function db_pconnect()
    +	public function db_pconnect()
     	{
    -		return $this->db_connect();
    +		return ($this->port != '')
    +			? @mysqli_connect('p:'.$this->hostname, $this->username, $this->password, $this->database, $this->port)
    +			: @mysqli_connect('p:'.$this->hostname, $this->username, $this->password, $this->database);
     	}
     
     	// --------------------------------------------------------------------
    @@ -111,10 +98,9 @@ function db_pconnect()
     	 * 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()
    +	public function reconnect()
     	{
     		if (mysqli_ping($this->conn_id) === FALSE)
     		{
    @@ -127,10 +113,9 @@ function reconnect()
     	/**
     	 * Select the database
     	 *
    -	 * @access	private called by the base class
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function db_select()
    +	public function db_select()
     	{
     		return @mysqli_select_db($this->conn_id, $this->database);
     	}
    @@ -140,12 +125,11 @@ function db_select()
     	/**
     	 * Set client character set
     	 *
    -	 * @access	private
     	 * @param	string
     	 * @param	string
    -	 * @return	resource
    +	 * @return	bool
     	 */
    -	function _db_set_charset($charset, $collation)
    +	protected function _db_set_charset($charset, $collation)
     	{
     		return function_exists('mysqli_set_charset')
     			? @mysqli_set_charset($this->conn_id, $charset)
    @@ -157,12 +141,11 @@ function _db_set_charset($charset, $collation)
     	/**
     	 * Version number query string
     	 *
    -	 * @access	public
     	 * @return	string
     	 */
    -	function _version()
    +	protected function _version()
     	{
    -		return "SELECT version() AS ver";
    +		return @mysqli_get_server_info($this->conn_id);
     	}
     
     	// --------------------------------------------------------------------
    @@ -170,15 +153,12 @@ function _version()
     	/**
     	 * Execute the query
     	 *
    -	 * @access	private called by the base class
     	 * @param	string	an SQL query
    -	 * @return	resource
    +	 * @return	mixed
     	 */
    -	function _execute($sql)
    +	protected function _execute($sql)
     	{
    -		$sql = $this->_prep_query($sql);
    -		$result = @mysqli_query($this->conn_id, $sql);
    -		return $result;
    +		return @mysqli_query($this->conn_id, $this->_prep_query($sql));
     	}
     
     	// --------------------------------------------------------------------
    @@ -188,20 +168,16 @@ function _execute($sql)
     	 *
     	 * 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)
    +	protected 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)
    +		// mysqli_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack
    +		// modifies the query so that it a proper number of affected rows is returned.
    +		if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
     		{
    -			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 preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', 'DELETE FROM \\1 WHERE 1=1', $sql);
     		}
     
     		return $sql;
    @@ -212,18 +188,12 @@ function _prep_query($sql)
     	/**
     	 * Begin Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_begin($test_mode = FALSE)
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -231,7 +201,7 @@ function trans_begin($test_mode = FALSE)
     		// 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->_trans_failure = ($test_mode === TRUE);
     
     		$this->simple_query('SET AUTOCOMMIT=0');
     		$this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK
    @@ -243,18 +213,12 @@ function trans_begin($test_mode = FALSE)
     	/**
     	 * Commit Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_commit()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -269,18 +233,12 @@ function trans_commit()
     	/**
     	 * Rollback Transaction
     	 *
    -	 * @access	public
     	 * @return	bool
     	 */
    -	function trans_rollback()
    +	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)
    +		if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
     		{
     			return TRUE;
     		}
    @@ -295,12 +253,11 @@ function trans_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)
    +	public function escape_str($str, $like = FALSE)
     	{
     		if (is_array($str))
     		{
    @@ -312,7 +269,7 @@ function escape_str($str, $like = FALSE)
     			return $str;
     		}
     
    -		if (function_exists('mysqli_real_escape_string') AND is_object($this->conn_id))
    +		if (function_exists('mysqli_real_escape_string') && is_object($this->conn_id))
     		{
     			$str = mysqli_real_escape_string($this->conn_id, $str);
     		}
    @@ -328,7 +285,7 @@ function escape_str($str, $like = FALSE)
     		// escape LIKE condition wildcards
     		if ($like === TRUE)
     		{
    -			$str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
    +			return str_replace(array('%', '_'), array('\\%', '\\_'), $str);
     		}
     
     		return $str;
    @@ -339,10 +296,9 @@ function escape_str($str, $like = FALSE)
     	/**
     	 * Affected Rows
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function affected_rows()
    +	public function affected_rows()
     	{
     		return @mysqli_affected_rows($this->conn_id);
     	}
    @@ -352,10 +308,9 @@ function affected_rows()
     	/**
     	 * Insert ID
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function insert_id()
    +	public function insert_id()
     	{
     		return @mysqli_insert_id($this->conn_id);
     	}
    @@ -368,27 +323,25 @@ function insert_id()
     	 * Generates a platform-specific query string that counts all records in
     	 * the specified database
     	 *
    -	 * @access	public
     	 * @param	string
     	 * @return	string
     	 */
    -	function count_all($table = '')
    +	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));
    -
    +		$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();
    +		$query = $query->row();
     		$this->_reset_select();
    -		return (int) $row->numrows;
    +		return (int) $query->numrows;
     	}
     
     	// --------------------------------------------------------------------
    @@ -399,16 +352,16 @@ function count_all($table = '')
     	 * Generates a platform-specific query string so that the table names can be fetched
     	 *
     	 * @access	private
    -	 * @param	boolean
    +	 * @param	bool
     	 * @return	string
     	 */
    -	function _list_tables($prefix_limit = FALSE)
    +	protected function _list_tables($prefix_limit = FALSE)
     	{
    -		$sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char;
    +		$sql = 'SHOW TABLES FROM '.$this->_escape_char.$this->database.$this->_escape_char;
     
    -		if ($prefix_limit !== FALSE AND $this->dbprefix != '')
    +		if ($prefix_limit !== FALSE && $this->dbprefix != '')
     		{
    -			$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'";
    +			return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'";
     		}
     
     		return $sql;
    @@ -421,13 +374,12 @@ function _list_tables($prefix_limit = FALSE)
     	 *
     	 * 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 = '')
    +	protected function _list_columns($table = '')
     	{
    -		return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE);
    +		return 'SHOW COLUMNS FROM '.$this->_protect_identifiers($table, TRUE, NULL, FALSE);
     	}
     
     	// --------------------------------------------------------------------
    @@ -437,13 +389,12 @@ function _list_columns($table = '')
     	 *
     	 * Generates a platform-specific query so that the column data can be retrieved
     	 *
    -	 * @access	public
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	string
     	 */
    -	function _field_data($table)
    +	protected function _field_data($table)
     	{
    -		return "DESCRIBE ".$table;
    +		return 'DESCRIBE '.$table;
     	}
     
     	// --------------------------------------------------------------------
    @@ -451,10 +402,9 @@ function _field_data($table)
     	/**
     	 * The error message string
     	 *
    -	 * @access	private
     	 * @return	string
     	 */
    -	function _error_message()
    +	protected function _error_message()
     	{
     		return mysqli_error($this->conn_id);
     	}
    @@ -464,10 +414,9 @@ function _error_message()
     	/**
     	 * The error message number
     	 *
    -	 * @access	private
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function _error_number()
    +	protected function _error_number()
     	{
     		return mysqli_errno($this->conn_id);
     	}
    @@ -479,11 +428,10 @@ function _error_number()
     	 *
     	 * This function escapes column and table names
     	 *
    -	 * @access	private
     	 * @param	string
     	 * @return	string
     	 */
    -	function _escape_identifiers($item)
    +	public function _escape_identifiers($item)
     	{
     		if ($this->_escape_char == '')
     		{
    @@ -494,24 +442,20 @@ function _escape_identifiers($item)
     		{
     			if (strpos($item, '.'.$id) !== FALSE)
     			{
    -				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);
    +				$item = 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);
    +				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item);
     			}
     		}
     
     		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;
    +			$item = str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item);
     		}
     
     		// remove duplicates if the user already included the escape
    -		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
    +		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $this->_escape_char.$item.$this->_escape_char);
     	}
     
     	// --------------------------------------------------------------------
    @@ -522,11 +466,10 @@ function _escape_identifiers($item)
     	 * 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
    +	 * @param	string
    +	 * @return	string
     	 */
    -	function _from_tables($tables)
    +	protected function _from_tables($tables)
     	{
     		if ( ! is_array($tables))
     		{
    @@ -543,15 +486,14 @@ function _from_tables($tables)
     	 *
     	 * 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)
    +	protected function _insert($table, $keys, $values)
     	{
    -		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
    +		return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
     	}
     
     	// --------------------------------------------------------------------
    @@ -561,15 +503,14 @@ function _insert($table, $keys, $values)
     	 *
     	 * 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)
    +	protected function _insert_batch($table, $keys, $values)
     	{
    -		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values);
    +		return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES '.implode(', ', $values);
     	}
     
     	// --------------------------------------------------------------------
    @@ -580,17 +521,16 @@ function _insert_batch($table, $keys, $values)
     	 *
     	 * 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)
    +	protected function _replace($table, $keys, $values)
     	{
    -		return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
    +		return 'REPLACE INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
     	}
    -	
    +
     	// --------------------------------------------------------------------
     
     	/**
    @@ -598,7 +538,6 @@ function _replace($table, $keys, $values)
     	 *
     	 * 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
    @@ -606,24 +545,17 @@ function _replace($table, $keys, $values)
     	 * @param	array	the limit clause
     	 * @return	string
     	 */
    -	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
    +	protected function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
     	{
     		foreach ($values as $key => $val)
     		{
    -			$valstr[] = $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;
    +		return 'UPDATE '.$table.' SET '.implode(', ', $valstr)
    +			.(($where != '' && count($where) > 0) ? ' WHERE '.implode(' ', $where) : '')
    +			.(count($orderby) > 0 ? ' ORDER BY '.implode(', ', $orderby) : '')
    +			.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     	// --------------------------------------------------------------------
    @@ -633,17 +565,14 @@ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
     	 *
     	 * 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)
    +	protected 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];
    @@ -657,25 +586,19 @@ function _update_batch($table, $values, $index, $where = NULL)
     			}
     		}
     
    -		$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, ';
    +			$cases .= $k.' = CASE '."\n"
    +				.implode("\n", $v)."\n"
    +				.'ELSE '.$k.' END, ';
     		}
     
    -		$sql .= substr($cases, 0, -2);
    -
    -		$sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')';
    +		$where = ($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : '';
     
    -		return $sql;
    +		return 'UPDATE '.$table.' SET '.substr($cases, 0, -2)
    +			.' WHERE '.(($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : '')
    +			.$index.' IN('.implode(',', $ids).')';
     	}
     
     	// --------------------------------------------------------------------
    @@ -687,13 +610,12 @@ function _update_batch($table, $values, $index, $where = NULL)
     	 * 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)
    +	protected function _truncate($table)
     	{
    -		return "TRUNCATE ".$table;
    +		return 'TRUNCATE '.$table;
     	}
     
     	// --------------------------------------------------------------------
    @@ -703,31 +625,26 @@ function _truncate($table)
     	 *
     	 * 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)
    +	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);
    +			$conditions = "\nWHERE ".implode("\n", $this->ar_where);
     
     			if (count($where) > 0 && count($like) > 0)
     			{
    -				$conditions .= " AND ";
    +				$conditions .= ' AND ';
     			}
     			$conditions .= implode("\n", $like);
     		}
     
    -		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
    -
    -		return "DELETE FROM ".$table.$conditions.$limit;
    +		return 'DELETE FROM '.$table.$conditions.( ! $limit ? '' : ' LIMIT '.$limit);
     	}
     
     	// --------------------------------------------------------------------
    @@ -737,22 +654,15 @@ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
     	 *
     	 * 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
    +	 * @param	int	the number of rows to limit the query to
    +	 * @param	int	the offset value
     	 * @return	string
     	 */
    -	function _limit($sql, $limit, $offset)
    +	protected function _limit($sql, $limit, $offset)
     	{
    -		$sql .= "LIMIT ".$limit;
    -
    -		if ($offset > 0)
    -		{
    -			$sql .= " OFFSET ".$offset;
    -		}
    -
    -		return $sql;
    +		return $sql.' LIMIT '.$limit
    +			.($offset > 0 ? ' OFFSET '.$offset : '');
     	}
     
     	// --------------------------------------------------------------------
    @@ -760,18 +670,15 @@ function _limit($sql, $limit, $offset)
     	/**
     	 * Close DB Connection
     	 *
    -	 * @access	public
    -	 * @param	resource
    +	 * @param	object
     	 * @return	void
     	 */
    -	function _close($conn_id)
    +	protected function _close($conn_id)
     	{
     		@mysqli_close($conn_id);
     	}
     
    -
     }
     
    -
     /* End of file mysqli_driver.php */
    -/* Location: ./system/database/drivers/mysqli/mysqli_driver.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/mysqli/mysqli_driver.php */
    diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php
    index 590efa9397a..319c6fdac08 100644
    --- a/system/database/drivers/mysqli/mysqli_forge.php
    +++ b/system/database/drivers/mysqli/mysqli_forge.php
    @@ -1,13 +1,13 @@
    -$attributes)
    +		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";
    +				$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';
    -				}
    +				$sql .= "\n\t".$this->db->protect_identifiers($field)
    +					.( ! empty($attributes['NAME']) ? ' '.$this->db->protect_identifiers($attributes['NAME']).' ' : '')
    +					.( ! empty($attributes['TYPE']) ? ' '.$attributes['TYPE'] : '')
    +					.( ! empty($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '')
    +					.(( ! empty($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '')
    +					.(isset($attributes['DEFAULT']) ? " DEFAULT '".$attributes['DEFAULT']."'" : '')
    +					.(( ! empty($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL')
    +					.(( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : '');
     			}
     
     			// don't add a comma on the end of the last field
    @@ -146,15 +109,14 @@ function _process_fields($fields)
     	/**
     	 * 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
    +	 * @param	bool	should 'IF NOT EXISTS' be added to the SQL
     	 * @return	bool
     	 */
    -	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
    +	public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	{
     		$sql = 'CREATE TABLE ';
     
    @@ -163,15 +125,12 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			$sql .= 'IF NOT EXISTS ';
     		}
     
    -		$sql .= $this->db->_escape_identifiers($table)." (";
    -
    -		$sql .= $this->_process_fields($fields);
    +		$sql .= $this->db->_escape_identifiers($table).' ('.$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) . ")";
    +			$key_name = $this->db->protect_identifiers(implode('_', $primary_keys));
    +			$sql .= ",\n\tPRIMARY KEY ".$key_name.' ('.implode(', ', $this->db->protect_identifiers($primary_keys)).')';
     		}
     
     		if (is_array($keys) && count($keys) > 0)
    @@ -180,22 +139,20 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     			{
     				if (is_array($key))
     				{
    -					$key_name = $this->db->_protect_identifiers(implode('_', $key));
    -					$key = $this->db->_protect_identifiers($key);
    +					$key_name = $this->db->protect_identifiers(implode('_', $key));
    +					$key = $this->db->protect_identifiers($key);
     				}
     				else
     				{
    -					$key_name = $this->db->_protect_identifiers($key);
    +					$key_name = $this->db->protect_identifiers($key);
     					$key = array($key_name);
     				}
     
    -				$sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";
    +				$sql .= ",\n\tKEY ".$key_name.' ('.implode(', ', $key).')';
     			}
     		}
     
    -		$sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";
    -
    -		return $sql;
    +		return $sql."\n) DEFAULT CHARACTER SET ".$this->db->char_set.' COLLATE '.$this->db->dbcollat.';';
     	}
     
     	// --------------------------------------------------------------------
    @@ -203,12 +160,11 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
     	/**
     	 * Drop Table
     	 *
    -	 * @access	private
     	 * @return	string
     	 */
    -	function _drop_table($table)
    +	public function _drop_table($table)
     	{
    -		return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);
    +		return 'DROP TABLE IF EXISTS '.$this->db->_escape_identifiers($table);
     	}
     
     	// --------------------------------------------------------------------
    @@ -219,31 +175,24 @@ function _drop_table($table)
     	 * 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
    +	 * @return	string
     	 */
    -	function _alter_table($alter_type, $table, $fields, $after_field = '')
    +	public function _alter_table($alter_type, $table, $fields, $after_field = '')
     	{
    -		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";
    +		$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 != '')
    +		if ($alter_type === 'DROP')
     		{
    -			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
    +			return $sql.$this->db->protect_identifiers($fields);
     		}
     
    -		return $sql;
    +		return $sql.$this->_process_fields($fields)
    +			.($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : '');
     	}
     
     	// --------------------------------------------------------------------
    @@ -253,18 +202,16 @@ function _alter_table($alter_type, $table, $fields, $after_field = '')
     	 *
     	 * 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)
    +	public 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;
    +		return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name);
     	}
     
     }
     
     /* End of file mysqli_forge.php */
    -/* Location: ./system/database/drivers/mysqli/mysqli_forge.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/mysqli/mysqli_forge.php */
    diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php
    index 89dd4ded801..0a50cccacd3 100644
    --- a/system/database/drivers/mysqli/mysqli_result.php
    +++ b/system/database/drivers/mysqli/mysqli_result.php
    @@ -1,13 +1,13 @@
    -result_id);
     	}
    @@ -54,10 +51,9 @@ function num_rows()
     	/**
     	 * Number of fields in the result set
     	 *
    -	 * @access	public
    -	 * @return	integer
    +	 * @return	int
     	 */
    -	function num_fields()
    +	public function num_fields()
     	{
     		return @mysqli_num_fields($this->result_id);
     	}
    @@ -69,10 +65,9 @@ function num_fields()
     	 *
     	 * Generates an array of column names
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function list_fields()
    +	public function list_fields()
     	{
     		$field_names = array();
     		while ($field = mysqli_fetch_field($this->result_id))
    @@ -90,40 +85,36 @@ function list_fields()
     	 *
     	 * Generates an array of objects containing field meta-data
     	 *
    -	 * @access	public
     	 * @return	array
     	 */
    -	function field_data()
    +	public 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 );
    +			$F		= new stdClass();
    +			$F->name	= $field->Field;
    +			$F->type	= ( ! empty($matches[1])) ? $matches[1] : NULL;
    +			$F->default	= $field->Default;
    +			$F->max_length	= ( ! empty($matches[2])) ? preg_replace('/[^\d]/', '', $matches[2]) : NULL;
    +			$F->primary_key = (int) ($field->Key === 'PRI');
     
     			$retval[] = $F;
     		}
     
     		return $retval;
     	}
    -	
    +
     	// --------------------------------------------------------------------
     
     	/**
     	 * Free the result
     	 *
    -	 * @return	null
    +	 * @return	void
     	 */
    -	function free_result()
    +	public function free_result()
     	{
     		if (is_object($this->result_id))
     		{
    @@ -141,10 +132,9 @@ function free_result()
     	 * this internally before fetching results to make sure the
     	 * result set starts at zero
     	 *
    -	 * @access	private
     	 * @return	array
     	 */
    -	function _data_seek($n = 0)
    +	protected function _data_seek($n = 0)
     	{
     		return mysqli_data_seek($this->result_id, $n);
     	}
    @@ -156,10 +146,9 @@ function _data_seek($n = 0)
     	 *
     	 * Returns the result set as an array
     	 *
    -	 * @access	private
     	 * @return	array
     	 */
    -	function _fetch_assoc()
    +	protected function _fetch_assoc()
     	{
     		return mysqli_fetch_assoc($this->result_id);
     	}
    @@ -171,16 +160,14 @@ function _fetch_assoc()
     	 *
     	 * Returns the result set as an object
     	 *
    -	 * @access	private
     	 * @return	object
     	 */
    -	function _fetch_object()
    +	protected function _fetch_object()
     	{
     		return mysqli_fetch_object($this->result_id);
     	}
     
     }
     
    -
     /* End of file mysqli_result.php */
    -/* Location: ./system/database/drivers/mysqli/mysqli_result.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/mysqli/mysqli_result.php */
    diff --git a/system/database/drivers/mysqli/mysqli_utility.php b/system/database/drivers/mysqli/mysqli_utility.php
    index 76bd49e315a..3fdc5c7231c 100644
    --- a/system/database/drivers/mysqli/mysqli_utility.php
    +++ b/system/database/drivers/mysqli/mysqli_utility.php
    @@ -1,13 +1,13 @@
    -db->_escape_identifiers($table);
    +		return 'OPTIMIZE TABLE '.$this->db->_escape_identifiers($table);
     	}
     
     	// --------------------------------------------------------------------
    @@ -70,13 +66,12 @@ function _optimize_table($table)
     	 *
     	 * Generates a platform-specific query so that a table can be repaired
     	 *
    -	 * @access	private
     	 * @param	string	the table name
    -	 * @return	object
    +	 * @return	string
     	 */
    -	function _repair_table($table)
    +	public function _repair_table($table)
     	{
    -		return "REPAIR TABLE ".$this->db->_escape_identifiers($table);
    +		return 'REPAIR TABLE '.$this->db->_escape_identifiers($table);
     	}
     
     	// --------------------------------------------------------------------
    @@ -84,11 +79,10 @@ function _repair_table($table)
     	/**
     	 * MySQLi Export
     	 *
    -	 * @access	private
     	 * @param	array	Preferences
     	 * @return	mixed
     	 */
    -	function _backup($params = array())
    +	public function _backup($params = array())
     	{
     		// Currently unsupported
     		return $this->db->display_error('db_unsuported_feature');
    @@ -96,4 +90,4 @@ function _backup($params = array())
     }
     
     /* End of file mysqli_utility.php */
    -/* Location: ./system/database/drivers/mysqli/mysqli_utility.php */
    \ No newline at end of file
    +/* Location: ./system/database/drivers/mysqli/mysqli_utility.php */
    
    From c25c3d3d61ff38a348224252c1b3c9041e50ac32 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Fri, 27 Jan 2012 11:35:30 +0200
    Subject: [PATCH 0362/5397] Remove an empty line :)
    
    ---
     system/database/drivers/postgre/postgre_driver.php | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php
    index 8b8f333710a..4e35cd6d71c 100644
    --- a/system/database/drivers/postgre/postgre_driver.php
    +++ b/system/database/drivers/postgre/postgre_driver.php
    @@ -184,7 +184,6 @@ public function db_set_charset($charset, $collation)
     	 *
     	 * @return	string
     	 */
    -
     	public function version()
     	{
     		$version = pg_version($this->conn_id);
    
    From 3a91cabf0cb346bbd4d44fe249f9f726101ba310 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Fri, 27 Jan 2012 11:42:28 +0200
    Subject: [PATCH 0363/5397] Update the changelog
    
    ---
     user_guide_src/source/changelog.rst | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 48011f208e3..bc77b201b10 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -47,6 +47,8 @@ Release Date: Not Released
           get_compiled_insert(), get_compiled_update(), get_compiled_delete().
        -  Taking care of LIKE condition when used with MySQL UPDATE statement.
        -  Adding $escape parameter to the order_by function, this enables ordering by custom fields.
    +   -  MySQLi driver now uses mysqli_get_server_info() for server version checking.
    +   -  MySQLi driver now supports persistent connections.
     
     -  Libraries
     
    
    From f1993c825f568e0ab5d08a8810f96363f0713dad Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Fri, 27 Jan 2012 14:35:39 +0200
    Subject: [PATCH 0364/5397] Missing word in the changelog entry
    
    ---
     user_guide_src/source/changelog.rst | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 0bd63ad97bc..750dd77a3cd 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -97,7 +97,7 @@ Bug fixes for 3.0
     -  In Pagination library, when use_page_numbers=TRUE previous link and page 1 link do not have the same url
     -  Fixed a bug (#561) - Errors in :doc:`XML-RPC Library ` were not properly escaped.
     -  Fixed a bug (#904) - ``CI_Loader::initialize()`` caused a PHP Fatal error to be triggered if error level E_STRICT is used.
    --  Fixed a bug in CI_DB_driver::version() where it failed when using a database driver needs to run a query in order to get the version.
    +-  Fixed a bug in CI_DB_driver::version() where it failed when using a database driver that needs to run a query in order to get the version.
     
     Version 2.1.0
     =============
    
    From 8d5b24a8c55dc1ae7721e10de094c4aba2ca7eae Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Fri, 27 Jan 2012 14:37:38 +0200
    Subject: [PATCH 0365/5397] Fix issue #128
    
    ---
     system/core/Lang.php                | 23 ++++++++++++-----------
     user_guide_src/source/changelog.rst |  1 +
     2 files changed, 13 insertions(+), 11 deletions(-)
    
    diff --git a/system/core/Lang.php b/system/core/Lang.php
    index c40a6856ed8..d68c04812dd 100755
    --- a/system/core/Lang.php
    +++ b/system/core/Lang.php
    @@ -25,8 +25,6 @@
      * @filesource
      */
     
    -// ------------------------------------------------------------------------
    -
     /**
      * Language Class
      *
    @@ -74,22 +72,20 @@ public function load($langfile = '', $idiom = '', $return = FALSE, $add_suffix =
     
     		if ($add_suffix == TRUE)
     		{
    -			$langfile = str_replace('_lang.', '', $langfile).'_lang';
    +			$langfile = str_replace('_lang', '', $langfile).'_lang';
     		}
     
     		$langfile .= '.php';
     
    -		if (in_array($langfile, $this->is_loaded, TRUE))
    +		if ($idiom == '')
     		{
    -			return;
    +			$config =& get_config();
    +			$idiom = ( ! empty($config['language'])) ? $config['language'] : 'english';
     		}
     
    -		$config =& get_config();
    -
    -		if ($idiom == '')
    +		if ($return == FALSE && isset($this->is_loaded[$langfile]) && $this->is_loaded[$langfile] === $idiom)
     		{
    -			$deft_lang = ( ! isset($config['language'])) ? 'english' : $config['language'];
    -			$idiom = ($deft_lang == '') ? 'english' : $deft_lang;
    +			return;
     		}
     
     		// Determine where the language file is and load it
    @@ -121,6 +117,11 @@ public function load($langfile = '', $idiom = '', $return = FALSE, $add_suffix =
     		if ( ! isset($lang) OR ! is_array($lang))
     		{
     			log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile);
    +
    +			if ($return == TRUE)
    +			{
    +				return array();
    +			}
     			return;
     		}
     
    @@ -129,7 +130,7 @@ public function load($langfile = '', $idiom = '', $return = FALSE, $add_suffix =
     			return $lang;
     		}
     
    -		$this->is_loaded[] = $langfile;
    +		$this->is_loaded[$langfile] = $idiom;
     		$this->language = array_merge($this->language, $lang);
     		unset($lang);
     
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 48011f208e3..71143b99b93 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -97,6 +97,7 @@ Bug fixes for 3.0
     -  In Pagination library, when use_page_numbers=TRUE previous link and page 1 link do not have the same url
     -  Fixed a bug (#561) - Errors in :doc:`XML-RPC Library ` were not properly escaped.
     -  Fixed a bug (#904) - ``CI_Loader::initialize()`` caused a PHP Fatal error to be triggered if error level E_STRICT is used.
    +-  Fixed a bug (#128) - :doc:`Language Library ` did not correctly keep track of loaded language files.
     
     Version 2.1.0
     =============
    
    From 65571d9d9684573887dc4a481b44f33b13584059 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Fri, 27 Jan 2012 14:51:58 +0200
    Subject: [PATCH 0366/5397] Remove an unnecessary unset()
    
    ---
     system/core/Lang.php | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/system/core/Lang.php b/system/core/Lang.php
    index d68c04812dd..711ccab7002 100755
    --- a/system/core/Lang.php
    +++ b/system/core/Lang.php
    @@ -132,7 +132,6 @@ public function load($langfile = '', $idiom = '', $return = FALSE, $add_suffix =
     
     		$this->is_loaded[$langfile] = $idiom;
     		$this->language = array_merge($this->language, $lang);
    -		unset($lang);
     
     		log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile);
     		return TRUE;
    
    From f055fa98c7c7dbdd44ca485cde9efe112f713123 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Fri, 27 Jan 2012 20:36:23 +0200
    Subject: [PATCH 0367/5397] Add PHP version check in db_pconnect()
    
    ---
     system/database/drivers/mysqli/mysqli_driver.php | 6 ++++++
     user_guide_src/source/changelog.rst              | 2 +-
     2 files changed, 7 insertions(+), 1 deletion(-)
    
    diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php
    index c6ffb492994..a79b2a4adb8 100644
    --- a/system/database/drivers/mysqli/mysqli_driver.php
    +++ b/system/database/drivers/mysqli/mysqli_driver.php
    @@ -85,6 +85,12 @@ public function db_connect()
     	 */
     	public function db_pconnect()
     	{
    +		// Persistent connection support was added in PHP 5.3.0
    +		if ( ! is_php('5.3'))
    +		{
    +			return $this->db_connect();
    +		}
    +
     		return ($this->port != '')
     			? @mysqli_connect('p:'.$this->hostname, $this->username, $this->password, $this->database, $this->port)
     			: @mysqli_connect('p:'.$this->hostname, $this->username, $this->password, $this->database);
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index bc77b201b10..e27ff88774e 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -48,7 +48,7 @@ Release Date: Not Released
        -  Taking care of LIKE condition when used with MySQL UPDATE statement.
        -  Adding $escape parameter to the order_by function, this enables ordering by custom fields.
        -  MySQLi driver now uses mysqli_get_server_info() for server version checking.
    -   -  MySQLi driver now supports persistent connections.
    +   -  MySQLi driver now supports persistent connections when running on PHP >= 5.3.
     
     -  Libraries
     
    
    From 093fe17231b7e7ce371d0e19c44e7a5c5fb5a858 Mon Sep 17 00:00:00 2001
    From: Iban Eguia 
    Date: Fri, 27 Jan 2012 19:41:11 +0100
    Subject: [PATCH 0368/5397] Added some more doctypes. Fixes #952.
    
    ---
     application/config/doctypes.php | 32 +++++++++++++++++++++-----------
     1 file changed, 21 insertions(+), 11 deletions(-)
    
    diff --git a/application/config/doctypes.php b/application/config/doctypes.php
    index 984da596512..76e9534b297 100644
    --- a/application/config/doctypes.php
    +++ b/application/config/doctypes.php
    @@ -5,9 +5,9 @@
      * An open source application development framework for PHP 5.1.6 or newer
      *
      * NOTICE OF LICENSE
    - * 
    + *
      * Licensed under the Academic Free License version 3.0
    - * 
    + *
      * This source file is subject to the Academic Free License (AFL 3.0) that is
      * bundled with this package in the files license_afl.txt / license_afl.rst.
      * It is also available through the world wide web at this URL:
    @@ -26,15 +26,25 @@
      */
     
     $_doctypes = array(
    -					'xhtml11'		=> '',
    -					'xhtml1-strict'	=> '',
    -					'xhtml1-trans'	=> '',
    -					'xhtml1-frame'	=> '',
    -					'xhtml-basic11'	=> '',
    -					'html5'			=> '',
    -					'html4-strict'	=> '',
    -					'html4-trans'	=> '',
    -					'html4-frame'	=> ''
    +					'xhtml11'			=> '',
    +					'xhtml1-strict'		=> '',
    +					'xhtml1-trans'		=> '',
    +					'xhtml1-frame'		=> '',
    +					'xhtml-basic11'		=> '',
    +					'html5'				=> '',
    +					'html4-strict'		=> '',
    +					'html4-trans'		=> '',
    +					'html4-frame'		=> '',
    +					'mathml1'			=> '',
    +					'mathml2'			=> '',
    +					'svg11'				=> '',
    +					'svg10'				=> '',
    +					'svg11-basic'		=> '',
    +					'svg11-tiny'		=> '',
    +					'xhtml-math-svg-xh'	=> '',
    +					'xhtml-math-svg-sh'	=> '',
    +					'xhtml-rdfa-1'		=> '',
    +					'xhtml-rdfa-2'		=> ''
     					);
     
     /* End of file doctypes.php */
    
    From a3c5cfca6b4a1ec183f3b3c9af88c7f686cf167e Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Fri, 27 Jan 2012 20:50:33 +0200
    Subject: [PATCH 0369/5397] Switch _process_fields() from private to protected
    
    ---
     system/database/drivers/mysqli/mysqli_forge.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php
    index 319c6fdac08..7de03612790 100644
    --- a/system/database/drivers/mysqli/mysqli_forge.php
    +++ b/system/database/drivers/mysqli/mysqli_forge.php
    @@ -66,7 +66,7 @@ public function _drop_database($name)
     	 * @param	mixed	the fields
     	 * @return	string
     	 */
    -	private function _process_fields($fields)
    +	public function _process_fields($fields)
     	{
     		$current_field_count = 0;
     		$sql = '';
    
    From 7719a037c4648be714ebe577aa38acba012f7d90 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Fri, 27 Jan 2012 21:05:55 +0200
    Subject: [PATCH 0370/5397] Switch _process_fields() from private to protected
    
    ---
     system/database/drivers/cubrid/cubrid_forge.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php
    index 4b1c2839ae0..8423180e90e 100644
    --- a/system/database/drivers/cubrid/cubrid_forge.php
    +++ b/system/database/drivers/cubrid/cubrid_forge.php
    @@ -70,7 +70,7 @@ public function _drop_database($name)
     	 * @param	mixed	the fields
     	 * @return	string
     	 */
    -	private function _process_fields($fields)
    +	protected function _process_fields($fields)
     	{
     		$current_field_count = 0;
     		$sql = '';
    
    From a7c0656a530ca405d2ed18b8e9bd252975bb8505 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Fri, 27 Jan 2012 21:18:48 +0200
    Subject: [PATCH 0371/5397] Removed a few more unnecessary lines
    
    ---
     system/database/DB_driver.php | 11 ++---------
     1 file changed, 2 insertions(+), 9 deletions(-)
    
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index 03fc8a69832..39eb1cc8a6f 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -180,12 +180,7 @@ public function initialize()
     			else
     			{
     				// We've selected the DB. Now we set the character set
    -				if ( ! $this->db_set_charset($this->char_set, $this->dbcollat))
    -				{
    -					return FALSE;
    -				}
    -
    -				return TRUE;
    +				return $this->db_set_charset($this->char_set, $this->dbcollat);
     			}
     		}
     
    @@ -247,9 +242,7 @@ public function version()
     
     		// Some DBs have functions that return the version, and don't run special
     		// SQL queries per se. In these instances, just return the result.
    -		$driver_version_exceptions = array('oci8', 'sqlite', 'cubrid', 'pdo', 'mysqli');
    -
    -		if (in_array($this->dbdriver, $driver_version_exceptions))
    +		if (in_array($this->dbdriver, array('oci8', 'sqlite', 'cubrid', 'pdo', 'mysqli'))
     		{
     			return $sql;
     		}
    
    From 0baf232d1d0f29585f1487b87905e1c1a08d5f23 Mon Sep 17 00:00:00 2001
    From: Iban Eguia 
    Date: Fri, 27 Jan 2012 20:21:43 +0100
    Subject: [PATCH 0372/5397] Added doccumentation for the new doctypes.
    
    ---
     application/config/doctypes.php               |  2 +-
     user_guide_src/source/helpers/html_helper.rst | 62 ++++++++++++-------
     2 files changed, 42 insertions(+), 22 deletions(-)
    
    diff --git a/application/config/doctypes.php b/application/config/doctypes.php
    index 76e9534b297..9cf4808a5eb 100644
    --- a/application/config/doctypes.php
    +++ b/application/config/doctypes.php
    @@ -37,8 +37,8 @@
     					'html4-frame'		=> '',
     					'mathml1'			=> '',
     					'mathml2'			=> '',
    -					'svg11'				=> '',
     					'svg10'				=> '',
    +					'svg11'				=> '',
     					'svg11-basic'		=> '',
     					'svg11-tiny'		=> '',
     					'xhtml-math-svg-xh'	=> '',
    diff --git a/user_guide_src/source/helpers/html_helper.rst b/user_guide_src/source/helpers/html_helper.rst
    index 2e217898e99..17c28cd2a8b 100644
    --- a/user_guide_src/source/helpers/html_helper.rst
    +++ b/user_guide_src/source/helpers/html_helper.rst
    @@ -325,24 +325,44 @@ Strict is used by default, but many doctypes are available.
     The following is a list of doctype choices. These are configurable, and
     pulled from application/config/doctypes.php
     
    -+------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
    -| Doctype                | Option                   | Result                                                                                                                    |
    -+========================+==========================+===========================================================================================================================+
    -| XHTML 1.1              | doctype('xhtml11')       |                          |
    -+------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
    -| XHTML 1.0 Strict       | doctype('xhtml1-strict') |              |
    -+------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
    -| XHTML 1.0 Transitional | doctype('xhtml1-trans')  |  |
    -+------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
    -| XHTML 1.0 Frameset     | doctype('xhtml1-frame')  |          |
    -+------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
    -| XHTML Basic 1.1        | doctype('xhtml-basic11') |              |
    -+------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
    -| HTML 5                 | doctype('html5')         |                                                                                                            |
    -+------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
    -| HTML 4 Strict          | doctype('html4-strict')  |                                 |
    -+------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
    -| HTML 4 Transitional    | doctype('html4-trans')   |                     |
    -+------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
    -| HTML 4 Frameset        | doctype('html4-frame')   |                      |
    -+------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| Doctype                       | Option                       | Result                                                                                                                                           |
    ++===============================+==============================+==================================================================================================================================================+
    +| XHTML 1.1                     | doctype('xhtml11')           |                                                 |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| XHTML 1.0 Strict              | doctype('xhtml1-strict')     |                                     |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| XHTML 1.0 Transitional        | doctype('xhtml1-trans')      |                         |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| XHTML 1.0 Frameset            | doctype('xhtml1-frame')      |                                 |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| XHTML Basic 1.1               | doctype('xhtml-basic11')     |                                     |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| HTML 5                        | doctype('html5')             |                                                                                                                                   |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| HTML 4 Strict                 | doctype('html4-strict')      |                                                        |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| HTML 4 Transitional           | doctype('html4-trans')       |                                            |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| HTML 4 Frameset               | doctype('html4-frame')       |                                             |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| MathML 1.01                   | doctype('mathml1')	       |                                                                            |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| MathML 2.0                    | doctype('mathml2')           |                                              |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| SVG 1.0                       | doctype('svg10')             |                                        |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| SVG 1.1 Full                  | doctype('svg11')             |                                                |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| SVG 1.1 Basic                 | doctype('svg11-basic')       |                                    |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| SVG 1.1 Tiny                  | doctype('svg11-tiny')        |                                      |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| XHTML+MathML+SVG (XHTML host) | doctype('xhtml-math-svg-xh') |     |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| XHTML+MathML+SVG (SVG host)   | doctype('xhtml-math-svg-sh') |  |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| XHTML+RDFa 1.0                | doctype('xhtml-rdfa-1')      |                                           |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    +| XHTML+RDFa 1.1                | doctype('xhtml-rdfa-2')      |                                           |
    ++-------------------------------+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
    \ No newline at end of file
    
    From 4304b96d830232badf3604ad7dfd411e7fc8050f Mon Sep 17 00:00:00 2001
    From: Iban Eguia 
    Date: Fri, 27 Jan 2012 20:23:54 +0100
    Subject: [PATCH 0373/5397] Added information to changelog.
    
    ---
     user_guide_src/source/changelog.rst | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 48011f208e3..ec3570393b7 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -33,6 +33,7 @@ Release Date: Not Released
        -  Removed previously deprecated SHA1 Library.
        -  Removed previously deprecated use of ``$autoload['core']`` in application/config/autoload.php.
           Only entries in ``$autoload['libraries']`` are auto-loaded now.
    +   -  Added some more doctypes.
     
     -  Helpers
     
    
    From 1b8d0ef6491b77375bb068711bc5e10fe4ca4b8f Mon Sep 17 00:00:00 2001
    From: Thor 
    Date: Sat, 28 Jan 2012 01:48:04 -0800
    Subject: [PATCH 0374/5397] Fixed some spaces.
    
    ---
     system/core/Output.php | 13 ++++---------
     1 file changed, 4 insertions(+), 9 deletions(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index d8c230968e0..4682740020f 100755
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -604,17 +604,17 @@ public function minify($output, $type='text/html')
     				preg_match_all('{}msU', $output, $style_clean);
     				foreach ($style_clean[0] as $s)
     				{
    -					$output = str_replace($s, $this->minify($s,'text/css'), $output);
    +					$output = str_replace($s, $this->minify($s, 'text/css'), $output);
     				}
     				
     				// Minify the javascript in '),
    -							array('phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'), $str);
    +					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
    @@ -311,25 +311,15 @@ function highlight_code($str)
     		// All the magic happens here, baby!
     		$str = highlight_string($str, TRUE);
     
    -		// Prior to PHP 5, the highligh function used icky  tags
    -		// so we'll replace them with  tags.
    -
    -		if (abs(PHP_VERSION) < 5)
    -		{
    -			$str = str_replace(array(''), array(''), $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('/<\?php( | )/i', '', $str);
     		$str = preg_replace('/(.*?)\?><\/span>\n<\/span>\n<\/code>/is', "$1\n\n", $str);
     		$str = preg_replace('/<\/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;
    +		return str_replace(array('phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'),
    +					array('<?', '?>', '<%', '%>', '\\', '</script>'),
    +					$str);
     	}
     }
     
    @@ -544,4 +534,4 @@ function ellipsize($str, $max_length, $position = 1, $ellipsis = '…')
     }
     
     /* End of file text_helper.php */
    -/* Location: ./system/helpers/text_helper.php */
    \ No newline at end of file
    +/* Location: ./system/helpers/text_helper.php */
    
    From ef7474c6ca9887283c964e17c450ca09559643c4 Mon Sep 17 00:00:00 2001
    From: Ryan Dial 
    Date: Thu, 1 Mar 2012 16:11:36 -0500
    Subject: [PATCH 0528/5397] compile binds before caching the query, otherwise
     the cached query will never match the unbound query. updated changlog to
     mention bug fix.
    
    ---
     system/database/DB_driver.php | 12 ++++++------
     user_guide/changelog.html     |  1 +
     2 files changed, 7 insertions(+), 6 deletions(-)
    
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index 4dfb584f277..6161f149b4b 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -265,6 +265,12 @@ function query($sql, $binds = FALSE, $return_object = TRUE)
     			$sql = preg_replace("/(\W)".$this->swap_pre."(\S+?)/", "\\1".$this->dbprefix."\\2", $sql);
     		}
     
    +		// Compile binds if needed
    +		if ($binds !== FALSE)
    +		{
    +			$sql = $this->compile_binds($sql, $binds);
    +		}
    +
     		// Is query caching enabled?  If the query is a "read type"
     		// we will load the caching class and return the previously
     		// cached query if it exists
    @@ -280,12 +286,6 @@ function query($sql, $binds = FALSE, $return_object = TRUE)
     			}
     		}
     
    -		// Compile binds if needed
    -		if ($binds !== FALSE)
    -		{
    -			$sql = $this->compile_binds($sql, $binds);
    -		}
    -
     		// Save the  query for debugging
     		if ($this->save_queries == TRUE)
     		{
    diff --git a/user_guide/changelog.html b/user_guide/changelog.html
    index 76a0bcb192d..b87e61ba829 100644
    --- a/user_guide/changelog.html
    +++ b/user_guide/changelog.html
    @@ -79,6 +79,7 @@ 

    Bug fixes for 2.1.1

  • Fixed a bug - form_open() compared $action against site_url() instead of base_url()
  • Fixed a bug - CI_Upload::_file_mime_type() could've failed if mime_content_type() is used for the detection and returns FALSE.
  • Fixed a bug (#538) - Windows paths were ignored when using the Image Manipulation Class to create a new file.
  • +
  • Fixed a bug - When database caching was enabled, $this->db->query() checked the cache before binding variables which resulted in cached queries never being found.
  • From 963386ba6072d240840b58d6dbe54287edcb04ad Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Mar 2012 01:52:01 +0200 Subject: [PATCH 0529/5397] Fix issue #803 (Profiler library didn't handle objects properly) --- system/libraries/Profiler.php | 12 +++++------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index 89c61654332..04216be5d31 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -270,7 +270,7 @@ protected function _compile_get() } $output .= "$_GET[".$key."]   " - . (is_array($val) ? "
    " . htmlspecialchars(stripslashes(print_r($val, true))) . "
    " : htmlspecialchars(stripslashes($val))) + . ((is_array($val) OR is_object($val)) ? "
    " . htmlspecialchars(stripslashes(print_r($val, true))) . "
    " : htmlspecialchars(stripslashes($val))) . "\n"; } @@ -311,7 +311,7 @@ protected function _compile_post() } $output .= "$_POST[".$key."]   "; - if (is_array($val)) + if (is_array($val) OR is_object($val)) { $output .= "
    " . htmlspecialchars(stripslashes(print_r($val, TRUE))) . "
    "; } @@ -426,9 +426,9 @@ protected function _compile_config() . '  '.$this->CI->lang->line('profiler_config').'  ('.$this->CI->lang->line('profiler_section_show').')' . "\n\n\n\n"; - foreach ($this->CI->config->config as $config=>$val) + foreach ($this->CI->config->config as $config => $val) { - if (is_array($val)) + if (is_array($val) OR is_object($val)) { $val = print_r($val, TRUE); } @@ -459,7 +459,7 @@ protected function _compile_session_data() foreach ($this->CI->session->all_userdata() as $key => $val) { - if (is_array($val) || is_object($val)) + if (is_array($val) OR is_object($val)) { $val = print_r($val, TRUE); } @@ -501,7 +501,5 @@ public function run() } } -// END CI_Profiler class - /* End of file Profiler.php */ /* Location: ./system/libraries/Profiler.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 0446c112dfc..d652f1cbde1 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -122,6 +122,7 @@ Bug fixes for 3.0 - Fixed a bug in CUBRID's affected_rows() method where a connection resource was passed to cubrid_affected_rows() instead of a result. - Fixed a bug (#638) - db_set_charset() ignored its arguments and always used the configured charset and collation instead. - Fixed a bug (#413) - Oracle's _error_message() and _error_number() methods used to only return connection-related errors. +- Fixed a bug (#804) - Profiler library was trying to handle objects as strings in some cases, resulting in warnings being issued by htmlspecialchars(). Version 2.1.1 ============= From 676a0dd74409e7e838b94484ef9ba066dcf6db91 Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Fri, 2 Mar 2012 10:10:34 +0100 Subject: [PATCH 0530/5397] updated error_array #565 --- system/libraries/Form_validation.php | 14 ++++++++++++++ user_guide_src/source/changelog.rst | 1 + .../source/libraries/form_validation.rst | 9 +++++++++ 3 files changed, 24 insertions(+) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 2ee734ae679..5069a44c16d 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -234,6 +234,20 @@ public function error($field = '', $prefix = '', $suffix = '') // -------------------------------------------------------------------- + /** + * Get Array of Error Messages + * + * Returns the error messages as an array + * + * @return array + */ + public function error_array() + { + return $this->_error_array; + } + + // -------------------------------------------------------------------- + /** * Error String * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d652f1cbde1..6505e7489e1 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -75,6 +75,7 @@ Release Date: Not Released - Minor speed optimizations and method & property visibility declarations in the Calendar Library. - Removed SHA1 function in the :doc:`Encryption Library `. - Added $config['csrf_regeneration'] to the CSRF protection in the :doc:`Security library `, which makes token regeneration optional. + - Added function error_array() to return all error messages as an array in the Form_validation class. - Core diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index e7875bc22cf..09a192bb0fa 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -930,6 +930,15 @@ $this->form_validation->set_message(); Permits you to set custom error messages. See :ref:`setting-error-messages` +$this->form_validation->error_array(); +======================================== + + .. php:method:: error_array () + + :rtype: Array + + Returns the error messages as an array. + .. _helper-functions: **************** From effd0133b3fa805e21ec934196e8e7d75608ba00 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Mar 2012 12:34:54 +0200 Subject: [PATCH 0531/5397] Fix issue #1101 (MySQL/MySQLi result field_data()) --- .../database/drivers/mysql/mysql_result.php | 18 +++++++----------- .../database/drivers/mysqli/mysqli_result.php | 19 ++++++++----------- user_guide_src/source/changelog.rst | 1 + 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php index 8f04a936d9d..5a65d9c7209 100644 --- a/system/database/drivers/mysql/mysql_result.php +++ b/system/database/drivers/mysql/mysql_result.php @@ -90,18 +90,14 @@ public function list_fields() public function field_data() { $retval = array(); - while ($field = mysql_fetch_object($this->result_id)) + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) { - preg_match('/([a-zA-Z]+)(\(\d+\))?/', $field->Type, $matches); - - $F = new stdClass(); - $F->name = $field->Field; - $F->type = ( ! empty($matches[1])) ? $matches[1] : NULL; - $F->default = $field->Default; - $F->max_length = ( ! empty($matches[2])) ? preg_replace('/[^\d]/', '', $matches[2]) : NULL; - $F->primary_key = (int) ($field->Key === 'PRI'); - - $retval[] = $F; + $retval[$i] = new stdClass(); + $retval[$i]->name = mysql_field_name($this->result_id, $i); + $retval[$i]->type = mysql_field_type($this->result_id, $i); + $retval[$i]->max_length = mysql_field_len($this->result_id, $i); + $retval[$i]->primary_key = (strpos(mysql_field_flags($this->result_id, $i), 'primary_key') === FALSE) ? 0 : 1; + $retval[$i]->default = ''; } return $retval; diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php index 0a50cccacd3..8b909cc5632 100644 --- a/system/database/drivers/mysqli/mysqli_result.php +++ b/system/database/drivers/mysqli/mysqli_result.php @@ -90,18 +90,15 @@ public function list_fields() public function field_data() { $retval = array(); - while ($field = mysqli_fetch_object($this->result_id)) + $field_data = mysqli_fetch_fields($this->result_id); + for ($i = 0, $c = count($field_data); $i < $c; $i++) { - preg_match('/([a-zA-Z]+)(\(\d+\))?/', $field->Type, $matches); - - $F = new stdClass(); - $F->name = $field->Field; - $F->type = ( ! empty($matches[1])) ? $matches[1] : NULL; - $F->default = $field->Default; - $F->max_length = ( ! empty($matches[2])) ? preg_replace('/[^\d]/', '', $matches[2]) : NULL; - $F->primary_key = (int) ($field->Key === 'PRI'); - - $retval[] = $F; + $retval[$i] = new stdClass(); + $retval[$i]->name = $field_data[$i]->name; + $retval[$i]->type = $field_data[$i]->type; + $retval[$i]->max_length = $field_data[$i]->max_length; + $retval[$i]->primary_key = (int) ($field_data[$i]->flags & 2); + $retval[$i]->default = ''; } return $retval; diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 6505e7489e1..f827faa9fef 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -124,6 +124,7 @@ Bug fixes for 3.0 - Fixed a bug (#638) - db_set_charset() ignored its arguments and always used the configured charset and collation instead. - Fixed a bug (#413) - Oracle's _error_message() and _error_number() methods used to only return connection-related errors. - Fixed a bug (#804) - Profiler library was trying to handle objects as strings in some cases, resulting in warnings being issued by htmlspecialchars(). +- Fixed a bug (#1101) - MySQL/MySQLi result method field_data() was implemented as if it was handling a DESCRIBE result instead of the actual result set. Version 2.1.1 ============= From 8f22057724dd8fe2b9d41ba98bfc4da282572c5e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Mar 2012 13:05:45 +0200 Subject: [PATCH 0532/5397] Fix a bug in Oracle's DB forge _create_table() method (AUTO_INCREMENT is not supported) --- system/database/drivers/oci8/oci8_forge.php | 64 ++++++--------------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 18 insertions(+), 47 deletions(-) diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index b4a24cdcaf0..0aa11990796 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -67,15 +67,14 @@ function _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 + * @param bool should 'IF NOT EXISTS' be added to the SQL * @return bool */ - function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) + public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { $sql = 'CREATE TABLE '; @@ -84,54 +83,27 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) $sql .= 'IF NOT EXISTS '; } - $sql .= $this->db->_escape_identifiers($table)." ("; + $sql .= $this->db->_escape_identifiers($table).' ('; $current_field_count = 0; - foreach ($fields as $field=>$attributes) + 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"; + $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'; - } + $sql .= "\n\t".$this->db->protect_identifiers($field).' '.$attributes['TYPE'] + .((isset($attributes['UNSINGED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '') + .(isset($attributes['DEFAULT']) ? " DEFAULT '".$attributes['DEFAULT']."'" : '') + .((isset($attributes['NULL']) && $attributes['NULL'] === TRUE) ? '' : ' NOT NULL') + .(isset($attributes['CONSTRAINT']) ? ' CONSTRAINT '.$attributes['CONSTRAINT'] : ''); } // don't add a comma on the end of the last field @@ -143,8 +115,8 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) if (count($primary_keys) > 0) { - $primary_keys = $this->db->_protect_identifiers($primary_keys); - $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; + $primary_keys = $this->db->protect_identifiers($primary_keys); + $sql .= ",\n\tCONSTRAINT ".$table.' PRIMARY KEY ('.implode(', ', $primary_keys).')'; } if (is_array($keys) && count($keys) > 0) @@ -153,20 +125,18 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { if (is_array($key)) { - $key = $this->db->_protect_identifiers($key); + $key = $this->db->protect_identifiers($key); } else { - $key = array($this->db->_protect_identifiers($key)); + $key = array($this->db->protect_identifiers($key)); } - $sql .= ",\n\tUNIQUE COLUMNS (" . implode(', ', $key) . ")"; + $sql .= ",\n\tUNIQUE COLUMNS (".implode(', ', $key).")"; } } - $sql .= "\n)"; - - return $sql; + return $sql."\n)"; } // -------------------------------------------------------------------- @@ -257,4 +227,4 @@ function _rename_table($table_name, $new_table_name) } /* End of file oci8_forge.php */ -/* Location: ./system/database/drivers/oci8/oci8_forge.php */ \ No newline at end of file +/* Location: ./system/database/drivers/oci8/oci8_forge.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f827faa9fef..cece286c550 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -125,6 +125,7 @@ Bug fixes for 3.0 - Fixed a bug (#413) - Oracle's _error_message() and _error_number() methods used to only return connection-related errors. - Fixed a bug (#804) - Profiler library was trying to handle objects as strings in some cases, resulting in warnings being issued by htmlspecialchars(). - Fixed a bug (#1101) - MySQL/MySQLi result method field_data() was implemented as if it was handling a DESCRIBE result instead of the actual result set. +- Fixed a bug in Oracle's :doc:`Database Forge Class ` method _create_table() where it failed with AUTO_INCREMENT as it's not supported. Version 2.1.1 ============= From a0c2785f91bc70fb4a0a02f1c9c28cb99c975457 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Mar 2012 13:49:28 +0200 Subject: [PATCH 0533/5397] Change SQLite _execute() to use is_write_type() --- system/database/drivers/sqlite/sqlite_driver.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index 20b05af0d18..8116cfb18af 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -154,13 +154,9 @@ public function _version() protected function _execute($sql) { $sql = $this->_prep_query($sql); - - if ( ! preg_match('/^(SELECT|EXPLAIN).+$/i', ltrim($sql))) - { - return @sqlite_exec($this->conn_id, $sql); - } - - return @sqlite_query($this->conn_id, $sql); + return $this->is_write_type($sql) + ? @sqlite_exec($this->conn_id, $sql) + : @sqlite_query($this->conn_id, $sql); } // -------------------------------------------------------------------- From a92c7cdeddd9f1b46a6c8f254b2949ad047bbc21 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Mar 2012 13:51:22 +0200 Subject: [PATCH 0534/5397] Change SQLite3 _execute to use is_write_type() --- system/database/drivers/sqlite3/sqlite3_driver.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index 1f2d8f0a09b..2af97387506 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -139,14 +139,12 @@ protected function _version() */ protected function _execute($sql) { - if ( ! preg_match('/^(SELECT|EXPLAIN).+$/i', ltrim($sql))) - { - return $this->conn_id->exec($sql); - } - // TODO: Implement use of SQLite3::querySingle(), if needed // TODO: Use $this->_prep_query(), if needed - return $this->conn_id->query($sql); + + return $this->is_write_type($sql) + ? $this->conn_id->exec($sql) + : $this->conn_id->query($sql); } // -------------------------------------------------------------------- From bcb3bbb97c8c046f80009a2bd8dffb96795ed239 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Mar 2012 13:56:15 +0200 Subject: [PATCH 0535/5397] Added method visibility declarations to SQLite DB utility class --- .../drivers/sqlite/sqlite_utility.php | 41 +++++++------------ 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/system/database/drivers/sqlite/sqlite_utility.php b/system/database/drivers/sqlite/sqlite_utility.php index f00687e3833..8fefcd9e2f2 100644 --- a/system/database/drivers/sqlite/sqlite_utility.php +++ b/system/database/drivers/sqlite/sqlite_utility.php @@ -1,13 +1,13 @@ -db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return array(); + return ($this->db_debug) ? $this->db->display_error('db_unsuported_feature') : FALSE; } // -------------------------------------------------------------------- @@ -61,14 +54,12 @@ function _list_databases() /** * Optimize table query * - * Is optimization even supported in SQLite? - * - * @access private * @param string the table name - * @return object + * @return bool */ - function _optimize_table($table) + public function _optimize_table($table) { + // Not supported return FALSE; } @@ -77,14 +68,12 @@ function _optimize_table($table) /** * Repair table query * - * Are table repairs even supported in SQLite? - * - * @access private * @param string the table name - * @return object + * @return bool */ - function _repair_table($table) + public function _repair_table($table) { + // Not supported return FALSE; } @@ -93,16 +82,16 @@ function _repair_table($table) /** * SQLite Export * - * @access private * @param array Preferences * @return mixed */ - function _backup($params = array()) + public 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 */ \ No newline at end of file +/* Location: ./system/database/drivers/sqlite/sqlite_utility.php */ From 4be5de1d11eefd9f0b7cf0589a2942f067cefe35 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Mar 2012 15:45:41 +0200 Subject: [PATCH 0536/5397] Replaced DB methods _error_message() and _error_number() with error() (issue #1097) --- system/database/DB_driver.php | 22 ++++----- .../database/drivers/cubrid/cubrid_driver.php | 25 +++------- .../database/drivers/mssql/mssql_driver.php | 26 ++++------ .../database/drivers/mysql/mysql_driver.php | 21 +++------ .../database/drivers/mysqli/mysqli_driver.php | 21 +++------ system/database/drivers/oci8/oci8_driver.php | 35 +++----------- system/database/drivers/odbc/odbc_driver.php | 23 +++------ system/database/drivers/pdo/pdo_driver.php | 35 +++++++------- .../drivers/postgre/postgre_driver.php | 23 +++------ .../database/drivers/sqlite/sqlite_driver.php | 25 ++++------ .../database/drivers/sqlsrv/sqlsrv_driver.php | 47 ++++++++----------- user_guide_src/source/changelog.rst | 7 +-- user_guide_src/source/database/queries.rst | 17 +++++++ 13 files changed, 122 insertions(+), 205 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 5f435e363c7..03a222f9b13 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -330,30 +330,28 @@ function query($sql, $binds = FALSE, $return_object = TRUE) // This will trigger a rollback if transactions are being used $this->_trans_status = FALSE; - // Grab the error number and message now, as we might run some - // additional queries before displaying the error - $error_no = $this->_error_number(); - $error_msg = $this->_error_message(); + // Grab the error now, as we might run some additional queries before displaying the error + $error = $this->error(); // Log errors - log_message('error', 'Query error: '.$error_msg); + log_message('error', 'Query error: '.$error['message']); if ($this->db_debug) { // We call this function in order to roll-back queries - // if transactions are enabled. If we don't call this here + // if transactions are enabled. If we don't call this here // the error message will trigger an exit, causing the // transactions to remain in limbo. $this->trans_complete(); // Display errors return $this->display_error( - array( - 'Error Number: '.$error_no, - $error_msg, - $sql - ) - ); + array( + 'Error Number: '.$error['code'], + $error['message'], + $sql + ) + ); } return FALSE; diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index 42f08fbf63d..cb33919a450 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -453,31 +453,18 @@ function _field_data($table) // -------------------------------------------------------------------- /** - * The error message string + * Error * - * @access private - * @return string - */ - function _error_message() - { - return cubrid_error($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * The error message number + * Returns an array containing code and message of the last + * database error that has occured. * - * @access private - * @return integer + * @return array */ - function _error_number() + public function error() { - return cubrid_errno($this->conn_id); + return array('code' => cubrid_errno($this->conn_id), 'message' => cubrid_error($this->conn_id)); } - // -------------------------------------------------------------------- - /** * Escape the SQL Identifiers * diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 2a4f2b575c5..188c91f9b02 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -438,28 +438,18 @@ function _field_data($table) // -------------------------------------------------------------------- /** - * The error message string + * Error * - * @access private - * @return string - */ - function _error_message() - { - return mssql_get_last_message(); - } - - // -------------------------------------------------------------------- - - /** - * The error message number + * Returns an array containing code and message of the last + * database error that has occured. * - * @access private - * @return integer + * @return array */ - function _error_number() + public function error() { - // Are error numbers supported? - return ''; + $query = $this->query('SELECT @@ERROR AS code'); + $query = $query->row(); + return array('code' => $query->code, 'message' => mssql_get_last_message()); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index c88a8a76624..a7f08d1a8de 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -417,25 +417,16 @@ public function _field_data($table) // -------------------------------------------------------------------- /** - * The error message string + * Error * - * @return string - */ - protected function _error_message() - { - return mysql_error($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * The error message number + * Returns an array containing code and message of the last + * database error that has occured. * - * @return int + * @return array */ - protected function _error_number() + public function error() { - return mysql_errno($this->conn_id); + return array('code' => mysql_errno($this->conn_id), 'message' => mysql_error($this->conn_id)); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index dbba12e155c..0313713458b 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -418,25 +418,16 @@ protected function _field_data($table) // -------------------------------------------------------------------- /** - * The error message string + * Error * - * @return string - */ - protected function _error_message() - { - return mysqli_error($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * The error message number + * Returns an array containing code and message of the last + * database error that has occured. * - * @return int + * @return array */ - protected function _error_number() + public function error() { - return mysqli_errno($this->conn_id); + return array('code' => mysqli_errno($this->conn_id), 'message' => mysqli_error($this->conn_id)); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 6da6dc72493..97efb464733 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -527,39 +527,18 @@ protected function _field_data($table) // -------------------------------------------------------------------- /** - * The error message string + * Error * - * @return string - */ - protected function _error_message() - { - $error = $this->_oci8_error_data(); - return $error['message']; - } - - // -------------------------------------------------------------------- - - /** - * The error message number - * - * @return string - */ - protected function _error_number() - { - $error = $this->_oci8_error_data(); - return $error['code']; - } - - // -------------------------------------------------------------------- - - /** - * OCI8-specific method to get errors. - * Used by _error_message() and _error_code(). + * Returns an array containing code and message of the last + * database error that has occured. * * @return array */ - protected function _oci8_error_data() + public function error() { + /* oci_error() returns an array that already contains the + * 'code' and 'message' keys, so we can just return it. + */ if (is_resource($this->curs_id)) { return oci_error($this->curs_id); diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index abb660324d1..5a93f7cad70 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -398,27 +398,16 @@ function _field_data($table) // -------------------------------------------------------------------- /** - * The error message string + * Error * - * @access private - * @return string - */ - function _error_message() - { - return odbc_errormsg($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * The error message number + * Returns an array containing code and message of the last + * database error that has occured. * - * @access private - * @return integer + * @return array */ - function _error_number() + public function error() { - return odbc_error($this->conn_id); + return array('code' => odbc_error($this->conn_id), 'message' => odbc_errormsg($this->conn_id)); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 90f0fd791ce..de5e1f05e59 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -609,29 +609,30 @@ function _field_data($table) // -------------------------------------------------------------------- /** - * The error message string + * Error * - * @access private - * @return string + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array */ - function _error_message() + public function error() { - $error_array = $this->conn_id->errorInfo(); + $error = array('code' => '00000', 'message' => ''); + $pdo_error = $this->conn_id->errorInfo(); - return $error_array[2]; - } + if (empty($pdo_error[0])) + { + return $error; + } - // -------------------------------------------------------------------- + $error['code'] = isset($pdo_error[1]) ? $pdo_error[0].'/'.$pdo_error[1] : $pdo_error[0]; + if (isset($pdo_error[2])) + { + $error['message'] = $pdo_error[2]; + } - /** - * The error message number - * - * @access private - * @return integer - */ - function _error_number() - { - return $this->conn_id->errorCode(); + return $error; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 89541e5fa30..0fcd954e967 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -443,27 +443,16 @@ function _field_data($table) // -------------------------------------------------------------------- /** - * The error message string + * Error * - * @access private - * @return string - */ - function _error_message() - { - return pg_last_error($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * The error message number + * Returns an array containing code and message of the last + * database error that has occured. * - * @access private - * @return integer + * @return array */ - function _error_number() + public function error() { - return ''; + return array('code' => '', 'message' => pg_last_error($this->conn_id)); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index 718501b202a..3e4b3732001 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -412,27 +412,18 @@ function _field_data($table) // -------------------------------------------------------------------- /** - * The error message string + * Error * - * @access private - * @return string - */ - function _error_message() - { - return sqlite_error_string(sqlite_last_error($this->conn_id)); - } - - // -------------------------------------------------------------------- - - /** - * The error message number + * Returns an array containing code and message of the last + * database error that has occured. * - * @access private - * @return integer + * @return array */ - function _error_number() + public function error() { - return sqlite_last_error($this->conn_id); + $error = array('code' => sqlite_last_error($this->conn_id)); + $error['message'] = sqlite_error_string($error['code']); + return $error; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index 9b903818972..03d7c7199bf 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -406,46 +406,39 @@ function _field_data($table) // -------------------------------------------------------------------- /** - * The error message string + * Error * - * @return string + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array */ - protected function _error_message() + public function error() { - $error = sqlsrv_errors(); - if ( ! is_array($error)) + $error = array('code' => '00000', 'message' => ''); + $sqlsrv_errors = sqlsrv_errors(SQLSRV_ERR_ERRORS); + + if ( ! is_array($sqlsrv_errors)) { - return ''; + return $error; } - $error = array_shift($error); - return isset($error['message']) ? $error['message'] : ''; - } - - // -------------------------------------------------------------------- - - /** - * The error message number - * - * @return string - */ - protected function _error_number() - { - $error = sqlsrv_errors(); - if ( ! is_array($error)) + $sqlsrv_error = array_shift($sqlsrv_errors); + if (isset($sqlsrv_error['SQLSTATE'])) { - return ''; + $error['code'] = isset($sqlsrv_error['code']) ? $sqlsrv_error['SQLSTATE'].'/'.$sqlsrv_error['code'] : $sqlsrv_error['SQLSTATE']; } - elseif (isset($error['SQLSTATE'])) + elseif (isset($sqlsrv_error['code'])) { - return isset($error['code']) ? $error['SQLSTATE'].'/'.$error['code'] : $error['SQLSTATE']; + $error['code'] = $sqlsrv_error['code']; } - elseif (isset($error['code'])) + + if (isset($sqlsrv_error['message'])) { - return $error['code']; + $error['message'] = $sqlsrv_error['message']; } - return ''; + return $error; } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index cece286c550..cf139bc1cd2 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -54,7 +54,8 @@ Release Date: Not Released - MySQLi driver now supports persistent connections when running on PHP >= 5.3. - Added dsn if the group connections in the config use PDO or any driver which need DSN. - Improved PDO database support. - - An optional database name parameter was added db_select(). + - Added an optional database name parameter to db_select(). + - Replaced the _error_message() and _error_number() methods with error(), that returns an array containing the last database error code and message. - Libraries @@ -116,13 +117,13 @@ Bug fixes for 3.0 - Fixed a bug (#81) - ODBC's list_fields() and field_data() methods skipped the first column due to odbc_field_*() functions' index starting at 1 instead of 0. - Fixed a bug (#129) - ODBC's num_rows() returned -1 in some cases, due to not all subdrivers supporting the odbc_num_rows() function. - Fixed a bug (#153) - E_NOTICE being generated by getimagesize() in the :doc:`File Uploading Library `. -- Fixed a bug (#611) - SQLSRV's _error_message() and _error_number() methods used to issue warnings when there's no actual error. +- Fixed a bug (#611) - SQLSRV's error handling methods used to issue warnings when there's no actual error. - Fixed a bug (#1036) - is_write_type() method in the :doc:`Database Library ` didn't return TRUE for RENAME and OPTIMIZE queries. - Fixed a bug in PDO's _version() method where it used to return the client version as opposed to the server one. - Fixed a bug in PDO's insert_id() method where it could've failed if it's used with Postgre versions prior to 8.1. - Fixed a bug in CUBRID's affected_rows() method where a connection resource was passed to cubrid_affected_rows() instead of a result. - Fixed a bug (#638) - db_set_charset() ignored its arguments and always used the configured charset and collation instead. -- Fixed a bug (#413) - Oracle's _error_message() and _error_number() methods used to only return connection-related errors. +- Fixed a bug (#413) - Oracle's error handling methods used to only return connection-related errors. - Fixed a bug (#804) - Profiler library was trying to handle objects as strings in some cases, resulting in warnings being issued by htmlspecialchars(). - Fixed a bug (#1101) - MySQL/MySQLi result method field_data() was implemented as if it was handling a DESCRIBE result instead of the actual result set. - Fixed a bug in Oracle's :doc:`Database Forge Class ` method _create_table() where it failed with AUTO_INCREMENT as it's not supported. diff --git a/user_guide_src/source/database/queries.rst b/user_guide_src/source/database/queries.rst index 971d5d61dc1..15a73614a73 100644 --- a/user_guide_src/source/database/queries.rst +++ b/user_guide_src/source/database/queries.rst @@ -112,3 +112,20 @@ The secondary benefit of using binds is that the values are automatically escaped, producing safer queries. You don't have to remember to manually escape data; the engine does it automatically for you. + +*************** +Handling Errors +*************** + +$this->db->error(); +=================== + +If you need to get the last error that has occured, the error() method +will return an array containing its code and message. Here's a quick +example:: + + if ( ! $this->db->simple_query('SELECT `example_field` FROM `example_table`')) + { + $error = $this->db->error(); // Has keys 'code' and 'message' + } + From 00df2e3183dc1cbef82dafe6cc432d73fe659ae9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Mar 2012 18:37:16 +0200 Subject: [PATCH 0537/5397] Replace Interbase _error_message(), _error_number() with the new error() method --- .../drivers/interbase/interbase_driver.php | 48 ++++++++----------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/system/database/drivers/interbase/interbase_driver.php b/system/database/drivers/interbase/interbase_driver.php index 4dca7c8a964..17fcffa6560 100644 --- a/system/database/drivers/interbase/interbase_driver.php +++ b/system/database/drivers/interbase/interbase_driver.php @@ -58,7 +58,7 @@ class CI_DB_interbase_driver extends CI_DB { */ protected $_count_string = "SELECT COUNT(*) AS "; protected $_random_keyword = ' Random()'; // database specific random keyword - + // Keeps track of the resource for the current transaction protected $trans; @@ -139,12 +139,12 @@ protected function _version() if (($service = ibase_service_attach($this->hostname, $this->username, $this->password))) { $version = ibase_server_info($service, IBASE_SVC_SERVER_VERSION); - + // Don't keep the service open ibase_service_detach($service); return $version; } - + return FALSE; } @@ -203,7 +203,7 @@ public function trans_begin($test_mode = FALSE) $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; $this->trans = @ibase_trans($this->conn_id); - + return TRUE; } @@ -226,7 +226,7 @@ public function trans_commit() { return TRUE; } - + return @ibase_commit($this->trans); } @@ -398,7 +398,7 @@ protected function _list_columns($table = '') protected function _field_data($table) { // Need to find a more efficient way to do this - // but Interbase/Firebird seems to lack the + // but Interbase/Firebird seems to lack the // limit clause return "SELECT * FROM {$table}"; } @@ -406,25 +406,16 @@ protected function _field_data($table) // -------------------------------------------------------------------- /** - * The error message string + * Error * - * @return string - */ - protected function _error_message() - { - return ibase_errmsg(); - } - - // -------------------------------------------------------------------- - - /** - * The error message number + * Returns an array containing code and message of the last + * database error that has occured. * - * @return integer + * @return array */ - protected function _error_number() + public function error() { - return ibase_errcode(); + return array('code' => ibase_errcode(), 'message' => ibase_errmsg()); } // -------------------------------------------------------------------- @@ -603,12 +594,12 @@ protected function _limit($sql, $limit, $offset) { // Keep the current sql string safe for a moment $orig_sql = $sql; - + // Limit clause depends on if Interbase or Firebird if (stripos($this->_version(), 'firebird') !== FALSE) { $sql = 'FIRST '. (int) $limit; - + if ($offset > 0) { $sql .= ' SKIP '. (int) $offset; @@ -617,16 +608,14 @@ protected function _limit($sql, $limit, $offset) else { $sql = 'ROWS ' . (int) $limit; - + if ($offset > 0) { $sql = 'ROWS '. (int) $offset . ' TO ' . ($limit + $offset); } } - - $sql = preg_replace("`SELECT`i", "SELECT {$sql}", $orig_sql); - - return $sql; + + return preg_replace('`SELECT`i', "SELECT {$sql}", $orig_sql); } // -------------------------------------------------------------------- @@ -641,7 +630,8 @@ protected function _close($conn_id) { @ibase_close($conn_id); } + } /* End of file interbase_driver.php */ -/* Location: ./system/database/drivers/interbase/interbase_driver.php */ \ No newline at end of file +/* Location: ./system/database/drivers/interbase/interbase_driver.php */ From f142192a97033c4f8d398212443bc4776bd2ca98 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Fri, 2 Mar 2012 11:51:42 -0500 Subject: [PATCH 0538/5397] Limit db session select to single row --- system/libraries/Session.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session.php b/system/libraries/Session.php index 66b39a6a20d..dd50a91e1e9 100644 --- a/system/libraries/Session.php +++ b/system/libraries/Session.php @@ -219,7 +219,7 @@ public function sess_read() $this->CI->db->where('user_agent', $session['user_agent']); } - $query = $this->CI->db->get($this->sess_table_name); + $query = $this->CI->db->limit(1)->get($this->sess_table_name); // No result? Kill it! if ($query->num_rows() === 0) From c7916c1048f54fcff6427c25fee4f0815d4bcfa5 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Fri, 2 Mar 2012 11:53:15 -0500 Subject: [PATCH 0539/5397] Removed welcome_message view changes --- application/views/welcome_message.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/application/views/welcome_message.php b/application/views/welcome_message.php index 4d9161aa0ed..acc36b6d443 100644 --- a/application/views/welcome_message.php +++ b/application/views/welcome_message.php @@ -89,8 +89,6 @@ margin: 10px; border: 1px solid #D0D0D0; -webkit-box-shadow: 0 0 8px #D0D0D0; - -moz-box-shadow: 0 0 8px #D0D0D0; - box-shadow: 0 0 8px #D0D0D0; } From 7fcc7bdf7eb9c65920b1e14f242e31e3d71d1fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diogo=20Os=C3=B3rio?= Date: Fri, 2 Mar 2012 16:54:52 +0000 Subject: [PATCH 0540/5397] #1080 - Check if the SMTP connection and authentication were successfull. --- system/libraries/Email.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index c8a5b41af03..39a7059dd03 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1359,6 +1359,7 @@ protected function _spool_email() if ( ! $this->$method()) { $this->_set_error_message('lang:email_send_failure_' . ($this->_get_protocol() === 'mail' ? 'phpmail' : $this->_get_protocol())); + return FALSE; } $this->_set_error_message('lang:email_sent', $this->_get_protocol()); @@ -1433,8 +1434,10 @@ protected function _send_with_smtp() return FALSE; } - $this->_smtp_connect(); - $this->_smtp_authenticate(); + if ( !($this->_smtp_connect() && $this->_smtp_authenticate()) ) + { + return FALSE; + } $this->_send_command('from', $this->clean_email($this->_headers['From'])); From 78ca39bc8c4b7edf0468e4a0a7251f808f352414 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Mar 2012 19:04:31 +0200 Subject: [PATCH 0541/5397] Removed db_set_charset() from Interbase driver (no longer needed) --- .../drivers/interbase/interbase_driver.php | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/system/database/drivers/interbase/interbase_driver.php b/system/database/drivers/interbase/interbase_driver.php index 17fcffa6560..51e814e16e5 100644 --- a/system/database/drivers/interbase/interbase_driver.php +++ b/system/database/drivers/interbase/interbase_driver.php @@ -114,21 +114,6 @@ public function db_select() // -------------------------------------------------------------------- - /** - * Set client character set - * - * @param string - * @param string - * @return bool - */ - public function db_set_charset($charset, $collation) - { - // Must be determined at connection - return TRUE; - } - - // -------------------------------------------------------------------- - /** * Version number query string * From 92aeaaa6b56cd02908641b4ee481a0c246874f29 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Fri, 2 Mar 2012 12:18:11 -0500 Subject: [PATCH 0542/5397] Updated changelog --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 69d7efc6cb3..9a7fc814ce4 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -78,6 +78,7 @@ Release Date: Not Released - Removed SHA1 function in the :doc:`Encryption Library `. - Added $config['csrf_regeneration'] to the CSRF protection in the :doc:`Security library `, which makes token regeneration optional. - Added function error_array() to return all error messages as an array in the Form_validation class. + - Changed the Session library to select only one row when using database sessions. - Core From 593f798a0b463f45e00a207e4fe4b8cc82dedc35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diogo=20Os=C3=B3rio?= Date: Fri, 2 Mar 2012 18:04:17 +0000 Subject: [PATCH 0543/5397] Made the code more readable, updated the changelog. --- system/libraries/Email.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 39a7059dd03..8d839d0c9ad 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1434,7 +1434,7 @@ protected function _send_with_smtp() return FALSE; } - if ( !($this->_smtp_connect() && $this->_smtp_authenticate()) ) + if ( ! $this->_smtp_connect() OR ! $this->_smtp_authenticate()) { return FALSE; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 69d7efc6cb3..1eae6fea00a 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -128,6 +128,7 @@ Bug fixes for 3.0 - Fixed a bug (#804) - Profiler library was trying to handle objects as strings in some cases, resulting in warnings being issued by htmlspecialchars(). - Fixed a bug (#1101) - MySQL/MySQLi result method field_data() was implemented as if it was handling a DESCRIBE result instead of the actual result set. - Fixed a bug in Oracle's :doc:`Database Forge Class ` method _create_table() where it failed with AUTO_INCREMENT as it's not supported. +- Fixed a bug (#1080) - When using the SMTP protocol, the :doc:`Email Library ` send() method was returning TRUE even if the connection/authentication against the server failed. Version 2.1.1 ============= From 100934cf6d8d3bc3bcff7c7a16d0d2c29bf2f6a9 Mon Sep 17 00:00:00 2001 From: Mike Davies Date: Fri, 2 Mar 2012 19:18:22 -0500 Subject: [PATCH 0544/5397] Updated tabs, reinserted license, and fixed logic on get() --- .../Cache/drivers/Cache_wincache.php | 62 +++++++++++-------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_wincache.php b/system/libraries/Cache/drivers/Cache_wincache.php index a1b1bb3de32..8164b5a7b04 100644 --- a/system/libraries/Cache/drivers/Cache_wincache.php +++ b/system/libraries/Cache/drivers/Cache_wincache.php @@ -4,13 +4,25 @@ * * An open source application development framework for PHP 5.1.6 or newer * + * NOTICE OF LICENSE + * + * Licensed under the Open Software License version 3.0 + * + * This source file is subject to the Open Software License (OSL 3.0) that is + * bundled with this package in the files license.txt / license.rst. It is + * also available through the world wide web at this URL: + * http://opensource.org/licenses/OSL-3.0 + * If you did not receive a copy of the license and are unable to obtain it + * through the world wide web, please send an email to + * licensing@ellislab.com so we can send you a copy immediately. + * * @package CodeIgniter - * @author Mike Murkovic - * @copyright - * @license http://codeigniter.com/user_guide/license.html + * @author EllisLab Dev Team + * @copyright Copyright (c) 2006 - 2012 EllisLab, Inc. + * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) * @link http://codeigniter.com * @since Version 2.0 - * @filesource + * @filesource */ // ------------------------------------------------------------------------ @@ -41,11 +53,11 @@ class CI_Cache_wincache extends CI_Driver { */ public function get($id) { - if ($data = wincache_ucache_get($id)) - { - return $data; - } - return FALSE; + $success = FALSE; + $data = wincache_ucache_get($id, $success); + + //Success returned by reference from wincache_ucache_get + return ($success) ? $data : FALSE; } // ------------------------------------------------------------------------ @@ -111,20 +123,20 @@ public function cache_info() */ public function get_metadata($id) { - if ($stored = wincache_ucache_info(false, $id)) - { - $age = $stored['ucache_entries'][1]['age_seconds']; - $ttl = $stored['ucache_entries'][1]['ttl_seconds']; - $hitcount = $stored['ucache_entries'][1]['hitcount']; - - return array( - 'expire' => $ttl - $age, - 'hitcount' => $hitcount, - 'age' => $age, - 'ttl' => $ttl - ); - } - return false; + if ($stored = wincache_ucache_info(false, $id)) + { + $age = $stored['ucache_entries'][1]['age_seconds']; + $ttl = $stored['ucache_entries'][1]['ttl_seconds']; + $hitcount = $stored['ucache_entries'][1]['hitcount']; + + return array( + 'expire' => $ttl - $age, + 'hitcount' => $hitcount, + 'age' => $age, + 'ttl' => $ttl + ); + } + return false; } // ------------------------------------------------------------------------ @@ -138,8 +150,8 @@ public function is_supported() { if ( ! extension_loaded('wincache') ) { - log_message('error', 'The Wincache PHP extension must be loaded to use Wincache Cache.'); - return FALSE; + log_message('error', 'The Wincache PHP extension must be loaded to use Wincache Cache.'); + return FALSE; } return TRUE; From 08856b8738ea4fc17b13986c9f2619383cb4a6e9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 3 Mar 2012 03:19:28 +0200 Subject: [PATCH 0545/5397] Improve DB version() implementation and add pg_version() support --- system/database/DB_driver.php | 46 ++++++++++--------- .../database/drivers/cubrid/cubrid_driver.php | 14 ++---- .../drivers/interbase/interbase_driver.php | 15 ++++-- .../database/drivers/mssql/mssql_driver.php | 7 ++- .../database/drivers/mysql/mysql_driver.php | 8 ++-- .../database/drivers/mysqli/mysqli_driver.php | 8 ++-- system/database/drivers/oci8/oci8_driver.php | 11 +++-- system/database/drivers/odbc/odbc_driver.php | 13 ------ system/database/drivers/pdo/pdo_driver.php | 10 ++-- .../drivers/postgre/postgre_driver.php | 27 ++++++++--- .../database/drivers/sqlite/sqlite_driver.php | 9 ++-- .../database/drivers/sqlite/sqlite_forge.php | 4 +- .../database/drivers/sqlsrv/sqlsrv_driver.php | 24 ++++++---- user_guide_src/source/changelog.rst | 2 + 14 files changed, 111 insertions(+), 87 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 075cab2c9a1..b41a42051b9 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -222,36 +222,40 @@ function platform() // -------------------------------------------------------------------- /** - * Database Version Number. Returns a string containing the - * version of the database being used + * Database version number + * + * Returns a string containing the version of the database being used. + * Most drivers will override this method. * - * @access public * @return string */ - function version() + public function version() { - if (FALSE === ($sql = $this->_version())) + if (isset($this->data_cache['version'])) { - if ($this->db_debug) - { - return $this->display_error('db_unsupported_function'); - } - return FALSE; + return $this->data_cache['version']; } - // Some DBs have functions that return the version, and don't run special - // SQL queries per se. In these instances, just return the result. - $driver_version_exceptions = array('oci8', 'sqlite', 'cubrid', 'pdo', 'mysqli', 'interbase'); - - if (in_array($this->dbdriver, $driver_version_exceptions)) - { - return $sql; - } - else + if (FALSE === ($sql = $this->_version())) { - $query = $this->query($sql); - return $query->row('ver'); + return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; } + + $query = $this->query($sql); + $query = $query->row(); + return $this->data_cache['version'] = $query->ver; + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @return string + */ + protected function _version() + { + return 'SELECT VERSION() AS ver'; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index cb33919a450..afdaef3518f 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -156,19 +156,15 @@ function db_select() // -------------------------------------------------------------------- /** - * Version number query string + * Database version number * - * @access public * @return string */ - function _version() + public 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); + return isset($this->data_cache['version']) + ? $this->data_cache['version'] + : $this->data_cache['version'] = cubrid_get_server_info($this->conn_id); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/interbase/interbase_driver.php b/system/database/drivers/interbase/interbase_driver.php index 51e814e16e5..f4bd9e271dd 100644 --- a/system/database/drivers/interbase/interbase_driver.php +++ b/system/database/drivers/interbase/interbase_driver.php @@ -115,19 +115,24 @@ public function db_select() // -------------------------------------------------------------------- /** - * Version number query string + * Database version number * * @return string */ - protected function _version() + public function version() { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + if (($service = ibase_service_attach($this->hostname, $this->username, $this->password))) { - $version = ibase_server_info($service, IBASE_SVC_SERVER_VERSION); + $this->data_cache['version'] = ibase_server_info($service, IBASE_SVC_SERVER_VERSION); // Don't keep the service open ibase_service_detach($service); - return $version; + return $this->data_cache['version']; } return FALSE; @@ -581,7 +586,7 @@ protected function _limit($sql, $limit, $offset) $orig_sql = $sql; // Limit clause depends on if Interbase or Firebird - if (stripos($this->_version(), 'firebird') !== FALSE) + if (stripos($this->version(), 'firebird') !== FALSE) { $sql = 'FIRST '. (int) $limit; diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 188c91f9b02..147c6348345 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -339,12 +339,11 @@ function _parse_major_version($version) /** * Version number query string * - * @access public - * @return string + * @return string */ - function _version() + protected function _version() { - return "SELECT @@VERSION AS ver"; + return 'SELECT @@VERSION AS ver'; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index a7f08d1a8de..7108a6db18a 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -157,13 +157,15 @@ public function db_set_charset($charset, $collation) // -------------------------------------------------------------------- /** - * Version number query string + * Database version number * * @return string */ - protected function _version() + public function version() { - return 'SELECT version() AS ver'; + return isset($this->data_cache['version']) + ? $this->data_cache['version'] + : $this->data_cache['version'] = @mysql_get_server_info($this->conn_id); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 0313713458b..19353944d27 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -157,13 +157,15 @@ protected function _db_set_charset($charset, $collation) // -------------------------------------------------------------------- /** - * Version number query string + * Database version number * * @return string */ - protected function _version() + public function version() { - return @mysqli_get_server_info($this->conn_id); + return isset($this->data_cache['version']) + ? $this->data_cache['version'] + : $this->data_cache['version'] = @mysqli_get_server_info($this->conn_id); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 97efb464733..35cafff6c8f 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -139,14 +139,15 @@ public function db_select() // -------------------------------------------------------------------- /** - * Version number query string + * Database version number * - * @access protected - * @return string + * @return string */ - protected function _version() + public function version() { - return oci_server_version($this->conn_id); + return isset($this->data_cache['version']) + ? $this->data_cache['version'] + : $this->data_cache['version'] = oci_server_version($this->conn_id); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 5a93f7cad70..779b0c62f9f 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -123,19 +123,6 @@ function db_select() // -------------------------------------------------------------------- - /** - * Version number query string - * - * @access public - * @return string - */ - function _version() - { - return "SELECT version() AS ver"; - } - - // -------------------------------------------------------------------- - /** * Execute the query * diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index de5e1f05e59..8fdfd58fb0b 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -289,13 +289,15 @@ function db_select() // -------------------------------------------------------------------- /** - * Version number query string + * Database version number * * @return string */ - protected function _version() + public function version() { - return $this->conn_id->getAttribute(PDO::ATTR_SERVER_VERSION); + return isset($this->data_cache['version']) + ? $this->data_cache['version'] + : $this->data_cache['version'] = $this->conn_id->getAttribute(PDO::ATTR_SERVER_VERSION); } // -------------------------------------------------------------------- @@ -499,7 +501,7 @@ function affected_rows() */ public function insert_id($name = NULL) { - if ($this->pdodriver === 'pgsql' && $name === NULL && $this->_version() >= '8.1') + if ($this->pdodriver === 'pgsql' && $name === NULL && $this->version() >= '8.1') { $query = $this->query('SELECT LASTVAL() AS ins_id'); $query = $query->row(); diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 0fcd954e967..d6681086a0c 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -147,14 +147,30 @@ function db_select() // -------------------------------------------------------------------- /** - * Version number query string + * Database version number * - * @access public * @return string */ - function _version() + public function version() { - return "SELECT version() AS ver"; + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if (($pg_version = pg_version($this->conn_id)) === FALSE) + { + return FALSE; + } + + /* If PHP was compiled with PostgreSQL lib versions earlier + * than 7.4, pg_version() won't return the server version + * and so we'll have to fall back to running a query in + * order to get it. + */ + return isset($pg_version['server']) + ? $this->data_cache['version'] = $pg_version['server'] + : parent::version(); } // -------------------------------------------------------------------- @@ -323,8 +339,7 @@ function affected_rows() */ function insert_id() { - $v = $this->_version(); - $v = $v['server']; + $v = $this->version(); $table = func_num_args() > 0 ? func_get_arg(0) : NULL; $column = func_num_args() > 1 ? func_get_arg(1) : NULL; diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index 3e4b3732001..3eaec949cec 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -141,14 +141,15 @@ function db_select() // -------------------------------------------------------------------- /** - * Version number query string + * Database version number * - * @access public * @return string */ - function _version() + public function version() { - return sqlite_libversion(); + return isset($this->data_cache['version']) + ? $this->data_cache['version'] + : $this->data_cache['version'] = sqlite_libversion(); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php index 2b723be0b65..fd0f3eb9804 100644 --- a/system/database/drivers/sqlite/sqlite_forge.php +++ b/system/database/drivers/sqlite/sqlite_forge.php @@ -89,7 +89,7 @@ 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) + if ($if_not_exists === TRUE && version_compare($this->db->version(), '3.3.0', '>=') === TRUE) { $sql .= 'IF NOT EXISTS '; } @@ -274,4 +274,4 @@ function _rename_table($table_name, $new_table_name) } /* End of file sqlite_forge.php */ -/* Location: ./system/database/drivers/sqlite/sqlite_forge.php */ \ No newline at end of file +/* Location: ./system/database/drivers/sqlite/sqlite_forge.php */ diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index 03d7c7199bf..5c90cb4f2a0 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -317,15 +317,23 @@ function _parse_major_version($version) // -------------------------------------------------------------------- /** - * Version number query string - * - * @access public - * @return string - */ - function _version() + * Database version number + * + * @return string + */ + public function version() { - $info = sqlsrv_server_info($this->conn_id); - return sprintf("select '%s' as ver", $info['SQLServerVersion']); + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if (($info = sqlsrv_server_info($this->conn_id)) === FALSE) + { + return FALSE; + } + + return $this->data_cache['version'] = $info['SQLServerVersion']; } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f00021cd93a..ca36ecd31f5 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -57,6 +57,8 @@ Release Date: Not Released - Added Interbase/Firebird database support via the "interbase" driver - Added an optional database name parameter to db_select(). - Replaced the _error_message() and _error_number() methods with error(), that returns an array containing the last database error code and message. + - Improved version() implementation so that drivers that have a native function to get the version number don't have to be defined in the core DB_driver class. + - PostgreSQL driver now uses pg_version() to get the database version number, when possible. - Libraries From 8e89df8f92444eb02dc73b6c3e66077a4fb3f710 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 3 Mar 2012 03:48:12 +0200 Subject: [PATCH 0546/5397] Add db_set_charset() support for PostgreSQL and change its implementation for 'mysql' --- system/database/drivers/mysql/mysql_driver.php | 2 +- system/database/drivers/postgre/postgre_driver.php | 13 +++++++++++++ user_guide_src/source/changelog.rst | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 7108a6db18a..84f7791c77b 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -147,7 +147,7 @@ public function db_select($database = '') * @param string * @return bool */ - public function db_set_charset($charset, $collation) + protected function _db_set_charset($charset, $collation) { return function_exists('mysql_set_charset') ? @mysql_set_charset($charset, $this->conn_id) diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index d6681086a0c..8df90f6a42e 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -146,6 +146,19 @@ function db_select() // -------------------------------------------------------------------- + /** + * Set client character set + * + * @param string + * @return bool + */ + protected function _db_set_charset($charset) + { + return (pg_set_client_encoding($this->conn_id, $charset) === 0); + } + + // -------------------------------------------------------------------- + /** * Database version number * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ca36ecd31f5..6f3b030a022 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -59,6 +59,7 @@ Release Date: Not Released - Replaced the _error_message() and _error_number() methods with error(), that returns an array containing the last database error code and message. - Improved version() implementation so that drivers that have a native function to get the version number don't have to be defined in the core DB_driver class. - PostgreSQL driver now uses pg_version() to get the database version number, when possible. + - Added db_set_charset() support for PostgreSQL. - Libraries From a6a1496b27c87718106645b6f1438023a18ad40c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 3 Mar 2012 03:57:26 +0200 Subject: [PATCH 0547/5397] Remove pg_set_client_encoding() from db_connect(), db_pconnect() --- .../database/drivers/postgre/postgre_driver.php | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index ce5dc96c395..d8b43695c74 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -126,13 +126,7 @@ public function __construct($params) */ public function db_connect() { - $ret = @pg_connect($this->dsn); - if (is_resource($ret) && $this->char_set != '') - { - pg_set_client_encoding($ret, $this->char_set); - } - - return $ret; + return @pg_connect($this->dsn); } // -------------------------------------------------------------------- @@ -144,13 +138,7 @@ public function db_connect() */ public function db_pconnect() { - $ret = @pg_pconnect($this->dsn); - if (is_resource($ret) && $this->char_set != '') - { - pg_set_client_encoding($ret, $this->char_set); - } - - return $ret; + return @pg_pconnect($this->dsn); } // -------------------------------------------------------------------- From 5fa729827d63774457ad34b57109a2f6ab20d20f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 3 Mar 2012 04:13:20 +0200 Subject: [PATCH 0548/5397] Added _optimize_table() support for PostgreSQL --- system/database/DB_driver.php | 2 +- .../drivers/postgre/postgre_utility.php | 35 +++++++------------ user_guide_src/source/changelog.rst | 6 ++-- 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index b41a42051b9..15195b20a04 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -651,7 +651,7 @@ function compile_binds($sql, $binds) */ public function is_write_type($sql) { - return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD DATA|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|OPTIMIZE)\s+/i', $sql); + return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD DATA|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|OPTIMIZE|REINDEX)\s+/i', $sql); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php index dffd8c549d7..c426b363b4b 100644 --- a/system/database/drivers/postgre/postgre_utility.php +++ b/system/database/drivers/postgre/postgre_utility.php @@ -1,13 +1,13 @@ -db->protect_identifiers($table); } // -------------------------------------------------------------------- @@ -68,13 +62,10 @@ function _optimize_table($table) /** * Repair table query * - * Are table repairs supported in Postgre? - * - * @access private * @param string the table name - * @return object + * @return bool */ - function _repair_table($table) + public function _repair_table($table) { return FALSE; } @@ -84,7 +75,6 @@ function _repair_table($table) /** * Postgre Export * - * @access private * @param array Preferences * @return mixed */ @@ -95,6 +85,5 @@ function _backup($params = array()) } } - /* End of file postgre_utility.php */ -/* Location: ./system/database/drivers/postgre/postgre_utility.php */ \ No newline at end of file +/* Location: ./system/database/drivers/postgre/postgre_utility.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 6f3b030a022..cb33336a164 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -58,8 +58,10 @@ Release Date: Not Released - Added an optional database name parameter to db_select(). - Replaced the _error_message() and _error_number() methods with error(), that returns an array containing the last database error code and message. - Improved version() implementation so that drivers that have a native function to get the version number don't have to be defined in the core DB_driver class. - - PostgreSQL driver now uses pg_version() to get the database version number, when possible. - - Added db_set_charset() support for PostgreSQL. + - Improved support of the PostgreSQL driver, including: + - pg_version() is now used to get the database version number, when possible. + - Added db_set_charset() support. + - Added _optimize_table() support for the :doc:`Database Utility Class ` (rebuilds table indexes). - Libraries From a19beb0c580ac78c4b75548a046240a85f30cb29 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 3 Mar 2012 04:20:50 +0200 Subject: [PATCH 0549/5397] Replace usage of legacy alias pg_exec() in favor of pg_query() and improve PostgreSQL driver trans_*() methods --- .../drivers/postgre/postgre_driver.php | 38 +++++-------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 8df90f6a42e..df0f50da55c 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -222,18 +222,12 @@ function _prep_query($sql) /** * Begin Transaction * - * @access public * @return bool */ - function trans_begin($test_mode = FALSE) + 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) + if ( ! $this->trans_enabled OR $this->_trans_depth > 0) { return TRUE; } @@ -241,9 +235,9 @@ function trans_begin($test_mode = FALSE) // 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->_trans_failure = ($test_mode === TRUE); - return @pg_exec($this->conn_id, "begin"); + return @pg_query($this->conn_id, 'BEGIN'); } // -------------------------------------------------------------------- @@ -251,23 +245,17 @@ function trans_begin($test_mode = FALSE) /** * Commit Transaction * - * @access public * @return bool */ - function trans_commit() + 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) + if ( ! $this->trans_enabled OR $this->_trans_depth > 0) { return TRUE; } - return @pg_exec($this->conn_id, "commit"); + return @pg_query($this->conn_id, 'COMMIT'); } // -------------------------------------------------------------------- @@ -275,23 +263,17 @@ function trans_commit() /** * Rollback Transaction * - * @access public * @return bool */ - function trans_rollback() + 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) + if ( ! $this->trans_enabled OR $this->_trans_depth > 0) { return TRUE; } - return @pg_exec($this->conn_id, "rollback"); + return @pg_query($this->conn_id, 'ROLLBACK'); } // -------------------------------------------------------------------- From 2f8473c031e8a1fa62a5556e013e293c297c41da Mon Sep 17 00:00:00 2001 From: Brenderous Date: Fri, 2 Mar 2012 20:29:38 -0700 Subject: [PATCH 0550/5397] Just a grammar fix. Changed "...as the code these file contain will be minimized" to "...as the code these files contain will be minimized". --- user_guide_src/source/overview/at_a_glance.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/overview/at_a_glance.rst b/user_guide_src/source/overview/at_a_glance.rst index 31f0b4dd90c..6dcfdbb1453 100644 --- a/user_guide_src/source/overview/at_a_glance.rst +++ b/user_guide_src/source/overview/at_a_glance.rst @@ -41,7 +41,7 @@ CodeIgniter Uses M-V-C CodeIgniter uses the Model-View-Controller approach, which allows great separation between logic and presentation. This is particularly good for projects in which designers are working with your template files, as the -code these file contain will be minimized. We describe MVC in more +code these files contain will be minimized. We describe MVC in more detail on its own page. CodeIgniter Generates Clean URLs From 3722e50439fd88281f8730fd329b41812cd19963 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 3 Mar 2012 15:04:38 +0200 Subject: [PATCH 0551/5397] Fix MySQL/MySQLi field_data() --- .../database/drivers/mysql/mysql_driver.php | 31 +++++++++++++++---- .../database/drivers/mysqli/mysqli_driver.php | 31 +++++++++++++++---- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 84f7791c77b..7fd08a6ed68 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -404,16 +404,35 @@ public function _list_columns($table = '') // -------------------------------------------------------------------- /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved + * Returns an object with field data * * @param string the table name - * @return string + * @return object */ - public function _field_data($table) + public function field_data($table = '') { - return 'DESCRIBE '.$table; + if ($table == '') + { + return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE; + } + + $query = $this->query('DESCRIBE '.$this->_protect_identifiers($table, TRUE, NULL, FALSE)); + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + preg_match('/([a-z]+)(\(\d+\))?/', $query[$i]->Type, $matches); + + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->Field; + $retval[$i]->type = empty($matches[1]) ? NULL : $matches[1]; + $retval[$i]->default = $query[$i]->Default; + $retval[$i]->max_length = empty($matches[2]) ? NULL : preg_replace('/[^\d]/', '', $matches[2]); + $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retval; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 19353944d27..25b6ceca1bc 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -405,16 +405,35 @@ protected function _list_columns($table = '') // -------------------------------------------------------------------- /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved + * Returns an object with field data * * @param string the table name - * @return string + * @return object */ - protected function _field_data($table) + public function field_data($table = '') { - return 'DESCRIBE '.$table; + if ($table == '') + { + return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE; + } + + $query = $this->query('DESCRIBE '.$this->_protect_identifiers($table, TRUE, NULL, FALSE)); + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + preg_match('/([a-z]+)(\(\d+\))?/', $query[$i]->Type, $matches); + + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->Field; + $retval[$i]->type = empty($matches[1]) ? NULL : $matches[1]; + $retval[$i]->default = $query[$i]->Default; + $retval[$i]->max_length = empty($matches[2]) ? NULL : preg_replace('/[^\d]/', '', $matches[2]); + $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retval; } // -------------------------------------------------------------------- From 3edd88eee84886fc6ba3e1fc25beda3c424370bc Mon Sep 17 00:00:00 2001 From: tubalmartin Date: Sat, 3 Mar 2012 22:10:34 +0100 Subject: [PATCH 0552/5397] An even better url_title helper. Tests: http://codepad.org/tuJgvkyN Changelog entry added for 2.1.1 --- system/helpers/url_helper.php | 27 +++++++-------------------- user_guide/changelog.html | 5 +++++ 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index 9f4b852483f..cdb6dae9c59 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -478,27 +478,14 @@ function prep_url($str = '') { function url_title($str, $separator = 'dash', $lowercase = FALSE) { - if ($separator == 'dash') - { - $search = '_'; - $replace = '-'; - } - else - { - $search = '-'; - $replace = '_'; - } + $replace = $separator == 'dash' ? '-' : '_'; $trans = array( - '&\#\d+?;' => '', - '&\S+?;' => '', - '\s+' => $replace, - '[^a-z0-9\-\._]' => '', - $replace.'+' => $replace, - $replace.'$' => $replace, - '^'.$replace => $replace, - '\.+$' => '' - ); + '&.+?;' => '', + '[^a-z0-9 _-]' => '', + '\s+' => $replace, + $replace.'+' => $replace + ); $str = strip_tags($str); @@ -512,7 +499,7 @@ function url_title($str, $separator = 'dash', $lowercase = FALSE) $str = strtolower($str); } - return trim(stripslashes($str)); + return trim($str, $replace); } } diff --git a/user_guide/changelog.html b/user_guide/changelog.html index b87e61ba829..b85dc8d52e0 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -71,6 +71,11 @@

    Version 2.1.1

  • Further improved MIME type detection in the File Uploading Library.
  • +
  • Helpers +
      +
    • url_title() performance and output improved.
    • +
    +
  • Bug fixes for 2.1.1

    From 010f1f4b315c8f5aef2e0b4c6571e4c4752f56c6 Mon Sep 17 00:00:00 2001 From: tubalmartin Date: Sat, 3 Mar 2012 22:24:31 +0100 Subject: [PATCH 0553/5397] Fixed a bug - CI_Upload::_file_mime_type() could've failed if popen() is used for the detection. --- system/libraries/Upload.php | 2 +- user_guide/changelog.html | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 91fbf66cad4..b0490de30aa 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1095,7 +1095,7 @@ protected function _file_mime_type($file) $proc = @popen($cmd, 'r'); if (is_resource($proc)) { - $mime = @fread($test, 512); + $mime = @fread($proc, 512); @pclose($proc); if ($mime !== FALSE) { diff --git a/user_guide/changelog.html b/user_guide/changelog.html index b87e61ba829..cf693685b37 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -78,6 +78,7 @@

    Bug fixes for 2.1.1

  • Fixed a bug (#697) - A wrong array key was used in the Upload library to check for mime-types.
  • Fixed a bug - form_open() compared $action against site_url() instead of base_url()
  • Fixed a bug - CI_Upload::_file_mime_type() could've failed if mime_content_type() is used for the detection and returns FALSE.
  • +
  • Fixed a bug - CI_Upload::_file_mime_type() could've failed if popen() is used for the detection.
  • Fixed a bug (#538) - Windows paths were ignored when using the Image Manipulation Class to create a new file.
  • Fixed a bug - When database caching was enabled, $this->db->query() checked the cache before binding variables which resulted in cached queries never being found.
  • From 69dcfbc0f45097e5471858e2ef8d6c92096bc1e7 Mon Sep 17 00:00:00 2001 From: tubalmartin Date: Sun, 4 Mar 2012 14:17:52 +0100 Subject: [PATCH 0554/5397] Removed changelog entry --- user_guide/changelog.html | 1 - 1 file changed, 1 deletion(-) diff --git a/user_guide/changelog.html b/user_guide/changelog.html index cf693685b37..b87e61ba829 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -78,7 +78,6 @@

    Bug fixes for 2.1.1

  • Fixed a bug (#697) - A wrong array key was used in the Upload library to check for mime-types.
  • Fixed a bug - form_open() compared $action against site_url() instead of base_url()
  • Fixed a bug - CI_Upload::_file_mime_type() could've failed if mime_content_type() is used for the detection and returns FALSE.
  • -
  • Fixed a bug - CI_Upload::_file_mime_type() could've failed if popen() is used for the detection.
  • Fixed a bug (#538) - Windows paths were ignored when using the Image Manipulation Class to create a new file.
  • Fixed a bug - When database caching was enabled, $this->db->query() checked the cache before binding variables which resulted in cached queries never being found.
  • From f8f04ce990a46f1967cd58def4929c476f4595a5 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Sun, 4 Mar 2012 14:21:12 +0000 Subject: [PATCH 0555/5397] Fixed conflicts. --- system/helpers/form_helper.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index bed2cb29794..6efef2324f5 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -22,7 +22,6 @@ * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) * @link http://codeigniter.com * @since Version 1.0 - * @filesource */ // ------------------------------------------------------------------------ @@ -72,8 +71,8 @@ function form_open($action = '', $attributes = '', $hidden = array()) $form = '
    \n"; - // Add CSRF field if enabled, but leave it out for GET requests and requests to external websites - if ($CI->config->item('csrf_protection') === TRUE AND ! (strpos($action, $CI->config->site_url()) === FALSE OR strpos($form, 'method="get"'))) + // Add CSRF field if enabled, but leave it out for GET requests and requests to external websites + if ($CI->config->item('csrf_protection') === TRUE AND ! (strpos($action, $CI->config->base_url()) === FALSE OR strpos($form, 'method="get"'))) { $hidden[$CI->security->get_csrf_token_name()] = $CI->security->get_csrf_hash(); } From 099c478b2ebafd0a1b74e76221ed06c214e195f4 Mon Sep 17 00:00:00 2001 From: JonoB Date: Sun, 4 Mar 2012 14:37:30 +0000 Subject: [PATCH 0556/5397] Allow users to specify an array for validation, instead of alway using the $_POST array --- system/libraries/Form_validation.php | 67 +++++++++++++++---- user_guide_src/source/changelog.rst | 1 + .../source/libraries/form_validation.rst | 35 +++++++++- 3 files changed, 88 insertions(+), 15 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 5069a44c16d..b3efe82cf22 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -47,7 +47,8 @@ class CI_Form_validation { protected $_error_suffix = '

    '; protected $error_string = ''; protected $_safe_form_data = FALSE; - + protected $validation_data = array(); + /** * Constructor */ @@ -84,8 +85,9 @@ public function __construct($rules = array()) */ public function set_rules($field, $label = '', $rules = '') { - // No reason to set rules if we have no POST data - if (count($_POST) === 0) + // No reason to set rules if we have no POST data + // or a validation array has not been specified + if (count($_POST) === 0 && count($this->validation_data) === 0) { return $this; } @@ -159,13 +161,31 @@ public function set_rules($field, $label = '', $rules = '') return $this; } + // -------------------------------------------------------------------- + + /** + * By default, form validation uses the $_POST array to validate + * + * If an array is set through this method, then this array will + * be used instead of the $_POST array + * + * @param array $data + */ + public function set_data($data = '') + { + if ( ! empty($data) && is_array($data)) + { + $this->validation_data = $data; + } + } + // -------------------------------------------------------------------- /** * Set Error Message * * Lets users set their own error messages on the fly. Note: The key - * name has to match the function name that it corresponds to. + * name has to match the function name that it corresponds to. * * @param string * @param string @@ -300,10 +320,14 @@ public function error_string($prefix = '', $suffix = '') public function run($group = '') { // Do we even have any data to process? Mm? - if (count($_POST) === 0) + $validation_array = ( ! empty($this->validation_data)) ? $this->validation_data : $_POST; + if (count($validation_array) === 0) { return FALSE; } + + // Clear any previous validation data + $this->_reset_validation(); // Does the _field_data array containing the validation rules exist? // If not, we look to see if they were assigned via a config file @@ -342,18 +366,18 @@ public function run($group = '') // corresponding $_POST item and test for errors foreach ($this->_field_data as $field => $row) { - // Fetch the data from the corresponding $_POST array and cache it in the _field_data array. + // Fetch the data from the corresponding $_POST or validation array and cache it in the _field_data array. // Depending on whether the field name is an array or a string will determine where we get it from. if ($row['is_array'] === TRUE) { - $this->_field_data[$field]['postdata'] = $this->_reduce_array($_POST, $row['keys']); + $this->_field_data[$field]['postdata'] = $this->_reduce_array($validation_array, $row['keys']); } else { - if (isset($_POST[$field]) AND $_POST[$field] != "") + if (isset($validation_array[$field]) AND $validation_array[$field] != "") { - $this->_field_data[$field]['postdata'] = $_POST[$field]; + $this->_field_data[$field]['postdata'] = $validation_array[$field]; } } @@ -867,12 +891,13 @@ public function regex_match($str, $regex) */ public function matches($str, $field) { - if ( ! isset($_POST[$field])) + $validation_array = ( ! empty($this->validation_data)) ? $this->validation_data : $_POST; + if ( ! isset($validation_array[$field])) { return FALSE; } - return ($str === $_POST[$field]); + return ($str === $validation_array[$field]); } // -------------------------------------------------------------------- @@ -1282,7 +1307,25 @@ public function encode_php_tags($str) { return str_replace(array(''), array('<?php', '<?PHP', '<?', '?>'), $str); } - + + // -------------------------------------------------------------------- + + /** + * Reset validation vars + * + * Prevents subsequent validation routines from being affected by the + * results of any previous validation routine due to the CI singleton. + * + * @return void + */ + protected function _reset_validation() + { + $this->_field_data = array(); + $this->_config_rules = array(); + $this->_error_array = array(); + $this->_error_messages = array(); + $this->error_string = ''; + } } /* End of file Form_validation.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2ada9ee671a..2158104f987 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -83,6 +83,7 @@ Release Date: Not Released - Removed SHA1 function in the :doc:`Encryption Library `. - Added $config['csrf_regeneration'] to the CSRF protection in the :doc:`Security library `, which makes token regeneration optional. - Added function error_array() to return all error messages as an array in the Form_validation class. + - Added function set_data() to Form_validation library, which can be used in place of the default $_POST array. - Changed the Session library to select only one row when using database sessions. - Core diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 09a192bb0fa..2fe315dbaa3 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -579,7 +579,27 @@ must supply it as an array to the function. Example:: For more info please see the :ref:`using-arrays-as-field-names` section below. -.. _saving-groups: +Validating An Array (Other Than The $_POST Array) +================================================= + +Sometimes you may want to validate an array that does not originate from $_POST data. + +In this case, you can specify the array to be validated:: + + $data = array( + 'username' => 'johndoe', + 'password' => 'mypassword', + 'passconf' => 'mypassword' + )); + + $this->form_validation->set_data($data); + +Creating validation rules, running the validation and retrieving error messages works the same whether you are +validating $_POST data or an array. + +For more info please see the :ref:`function-reference` section below. + +-.. _saving-groups: ************************************************ Saving Sets of Validation Rules to a Config File @@ -930,6 +950,16 @@ $this->form_validation->set_message(); Permits you to set custom error messages. See :ref:`setting-error-messages` +$this->form_validation->set_data(); +======================================== + + .. php:method:: set_data ($data = '') + + :param array $data: The data to validate + + Permits you to set an array for validation, instead of using the default + $_POST array. + $this->form_validation->error_array(); ======================================== @@ -1019,5 +1049,4 @@ This function is identical to the **set_checkbox()** function above. :: /> - /> - + /> \ No newline at end of file From 1a6971030718e2e92e6fc80750f7a14faf035257 Mon Sep 17 00:00:00 2001 From: tubalmartin Date: Sun, 4 Mar 2012 16:01:11 +0100 Subject: [PATCH 0557/5397] Allow developers to use any string as a separator, not just dashes or underscores. Backwards compatible when using 'dash' or 'underscore' as string separator. Tests: http://codepad.org/DWcxVH5r --- system/helpers/url_helper.php | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index cdb6dae9c59..f1e8c6ac626 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -466,25 +466,34 @@ function prep_url($str = '') * Create URL Title * * Takes a "title" string as input and creates a - * human-friendly URL string with either a dash - * or an underscore as the word separator. + * human-friendly URL string with a "separator" string + * as the word separator. * * @access public * @param string the string - * @param string the separator: dash, or underscore + * @param string the separator * @return string */ if ( ! function_exists('url_title')) { - function url_title($str, $separator = 'dash', $lowercase = FALSE) + function url_title($str, $separator = '-', $lowercase = FALSE) { - $replace = $separator == 'dash' ? '-' : '_'; + if ($separator == 'dash') + { + $separator = '-'; + } + else if ($separator == 'underscore') + { + $separator = '_'; + } + + $q_separator = preg_quote($separator); $trans = array( - '&.+?;' => '', - '[^a-z0-9 _-]' => '', - '\s+' => $replace, - $replace.'+' => $replace + '&.+?;' => '', + '[^a-z0-9 _-]' => '', + '\s+' => $separator, + '('.$q_separator.')+' => $separator ); $str = strip_tags($str); @@ -499,7 +508,7 @@ function url_title($str, $separator = 'dash', $lowercase = FALSE) $str = strtolower($str); } - return trim($str, $replace); + return trim($str, $separator); } } From a67ddc61937d178231607f66f2af3ef729f208d4 Mon Sep 17 00:00:00 2001 From: tubalmartin Date: Sun, 4 Mar 2012 16:18:04 +0100 Subject: [PATCH 0558/5397] User guide updated --- user_guide/helpers/url_helper.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user_guide/helpers/url_helper.html b/user_guide/helpers/url_helper.html index 76ec32ab291..c23c5ac929a 100644 --- a/user_guide/helpers/url_helper.html +++ b/user_guide/helpers/url_helper.html @@ -231,11 +231,11 @@

    url_title()

    -

    The second parameter determines the word delimiter. By default dashes are used. Options are: dash, or underscore:

    +

    The second parameter determines the word delimiter. By default dashes are used.

    $title = "What's wrong with CSS?";

    -$url_title = url_title($title, 'underscore');
    +$url_title = url_title($title, '_');

    // Produces: Whats_wrong_with_CSS
    @@ -244,7 +244,7 @@

    url_title()

    $title = "What's wrong with CSS?";

    -$url_title = url_title($title, 'underscore', TRUE);
    +$url_title = url_title($title, '_', TRUE);

    // Produces: whats_wrong_with_css
    From 6f6897cdce965e1cf54deb40ce93ba9be281108f Mon Sep 17 00:00:00 2001 From: tubalmartin Date: Sun, 4 Mar 2012 16:24:04 +0100 Subject: [PATCH 0559/5397] Changelog updated --- user_guide/changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide/changelog.html b/user_guide/changelog.html index b85dc8d52e0..613c4e65d87 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -73,7 +73,7 @@

    Version 2.1.1

  • Helpers
      -
    • url_title() performance and output improved.
    • +
    • url_title() performance and output improved. You can now use any string as the word delimiter. Backwards compatible with 'dash' or 'underscore' as words delimiters.
  • From c8da4fe74d9cb0d456a18316fa9a0879d50e33f4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 4 Mar 2012 19:20:33 +0200 Subject: [PATCH 0560/5397] Fix indentation for changes from pull #1121 --- system/libraries/Form_validation.php | 49 +++++++++---------- .../source/libraries/form_validation.rst | 18 +++---- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index b3efe82cf22..1c0089d8559 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -48,10 +48,7 @@ class CI_Form_validation { protected $error_string = ''; protected $_safe_form_data = FALSE; protected $validation_data = array(); - - /** - * Constructor - */ + public function __construct($rules = array()) { $this->CI =& get_instance(); @@ -85,7 +82,7 @@ public function __construct($rules = array()) */ public function set_rules($field, $label = '', $rules = '') { - // No reason to set rules if we have no POST data + // No reason to set rules if we have no POST data // or a validation array has not been specified if (count($_POST) === 0 && count($this->validation_data) === 0) { @@ -162,23 +159,24 @@ public function set_rules($field, $label = '', $rules = '') } // -------------------------------------------------------------------- - + /** * By default, form validation uses the $_POST array to validate - * + * * If an array is set through this method, then this array will * be used instead of the $_POST array - * - * @param array $data + * + * @param array $data + * @return void */ public function set_data($data = '') { if ( ! empty($data) && is_array($data)) { - $this->validation_data = $data; + $this->validation_data = $data; } } - + // -------------------------------------------------------------------- /** @@ -325,7 +323,7 @@ public function run($group = '') { return FALSE; } - + // Clear any previous validation data $this->_reset_validation(); @@ -891,7 +889,7 @@ public function regex_match($str, $regex) */ public function matches($str, $field) { - $validation_array = ( ! empty($this->validation_data)) ? $this->validation_data : $_POST; + $validation_array = ( ! empty($this->validation_data)) ? $this->validation_data : $_POST; if ( ! isset($validation_array[$field])) { return FALSE; @@ -1307,25 +1305,26 @@ public function encode_php_tags($str) { return str_replace(array(''), array('<?php', '<?PHP', '<?', '?>'), $str); } - + // -------------------------------------------------------------------- - - /** - * Reset validation vars - * - * Prevents subsequent validation routines from being affected by the + + /** + * Reset validation vars + * + * Prevents subsequent validation routines from being affected by the * results of any previous validation routine due to the CI singleton. - * - * @return void - */ - protected function _reset_validation() - { + * + * @return void + */ + protected function _reset_validation() + { $this->_field_data = array(); $this->_config_rules = array(); $this->_error_array = array(); $this->_error_messages = array(); $this->error_string = ''; - } + } + } /* End of file Form_validation.php */ diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 2fe315dbaa3..0d8218374fa 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -579,20 +579,20 @@ must supply it as an array to the function. Example:: For more info please see the :ref:`using-arrays-as-field-names` section below. -Validating An Array (Other Than The $_POST Array) -================================================= +Validating an Array (other than $_POST) +======================================= Sometimes you may want to validate an array that does not originate from $_POST data. In this case, you can specify the array to be validated:: - $data = array( - 'username' => 'johndoe', - 'password' => 'mypassword', - 'passconf' => 'mypassword' - )); + $data = array( + 'username' => 'johndoe', + 'password' => 'mypassword', + 'passconf' => 'mypassword' + ); - $this->form_validation->set_data($data); + $this->form_validation->set_data($data); Creating validation rules, running the validation and retrieving error messages works the same whether you are validating $_POST data or an array. @@ -1049,4 +1049,4 @@ This function is identical to the **set_checkbox()** function above. :: /> - /> \ No newline at end of file + /> From 8af2fdfda32303b8e2766d1fc873d1111baeb57e Mon Sep 17 00:00:00 2001 From: JonoB Date: Mon, 5 Mar 2012 09:51:27 +0000 Subject: [PATCH 0561/5397] Removed reset_validation() method from run() method --- system/libraries/Form_validation.php | 9 +++++---- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/libraries/form_validation.rst | 11 +++++++++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index eb6031697c1..cdb3d3d627a 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -165,6 +165,10 @@ public function set_rules($field, $label = '', $rules = '') * * If an array is set through this method, then this array will * be used instead of the $_POST array + * + * Note that if you are validating multiple arrays, then the + * reset_validation() function should be called after validating + * each array due to the limitations of CI's singleton * * @param array $data * @return void @@ -324,9 +328,6 @@ public function run($group = '') return FALSE; } - // Clear any previous validation data - $this->_reset_validation(); - // Does the _field_data array containing the validation rules exist? // If not, we look to see if they were assigned via a config file if (count($this->_field_data) === 0) @@ -1352,7 +1353,7 @@ public function encode_php_tags($str) * * @return void */ - protected function _reset_validation() + public function reset_validation() { $this->_field_data = array(); $this->_config_rules = array(); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e96076164b8..21675bd161c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -84,6 +84,7 @@ Release Date: Not Released - Added $config['csrf_regeneration'] to the CSRF protection in the :doc:`Security library `, which makes token regeneration optional. - Added function error_array() to return all error messages as an array in the Form_validation class. - Added function set_data() to Form_validation library, which can be used in place of the default $_POST array. + - Added function reset_validation() to form validation library, which resets internal validation variables in case of multiple validation routines. - Changed the Session library to select only one row when using database sessions. - Core diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 0d6a49e7941..5aa64d03243 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -597,6 +597,9 @@ In this case, you can specify the array to be validated:: Creating validation rules, running the validation and retrieving error messages works the same whether you are validating $_POST data or an array. +**Important Note:** If you want to validate more than one array during a single execution, then you should +call the reset_validation() function before setting up rules and validating the new array. + For more info please see the :ref:`function-reference` section below. -.. _saving-groups: @@ -966,6 +969,14 @@ $this->form_validation->set_data(); Permits you to set an array for validation, instead of using the default $_POST array. +$this->form_validation->reset_validation(); +======================================== + + .. php:method:: reset_validation () + + Permits you to reset the validation when you validate more than one array. + This function should be called before validating each new array. + $this->form_validation->error_array(); ======================================== From cc5af53346397846f2035dc2bf6a2c2f9b0cd4ab Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 5 Mar 2012 14:02:15 +0200 Subject: [PATCH 0562/5397] Fix issue #1125 --- system/database/drivers/odbc/odbc_result.php | 36 +++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/system/database/drivers/odbc/odbc_result.php b/system/database/drivers/odbc/odbc_result.php index 572e110cae9..2d5b50a8dff 100644 --- a/system/database/drivers/odbc/odbc_result.php +++ b/system/database/drivers/odbc/odbc_result.php @@ -245,8 +245,42 @@ function _odbc_fetch_array(& $odbc_result) { return $rs_assoc; } -} + // -------------------------------------------------------------------- + + /** + * Query result. Array version. + * + * @return array + */ + public function result_array() + { + if (count($this->result_array) > 0) + { + return $this->result_array; + } + elseif (($c = count($this->result_object)) > 0) + { + for ($i = 0; $i < $c; $i++) + { + $this->result_array[$i] = (array) $this->result_object[$i]; + } + } + elseif ($this->result_id === FALSE) + { + return array(); + } + else + { + while ($row = $this->_fetch_assoc()) + { + $this->result_array[] = $row; + } + } + return $this->result_array; + } + +} /* End of file odbc_result.php */ /* Location: ./system/database/drivers/odbc/odbc_result.php */ From 8af76666474c42b45518c08bec16b4f8d700dd3c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 5 Mar 2012 14:33:41 +0200 Subject: [PATCH 0563/5397] Partially fix issue #306 --- system/database/drivers/odbc/odbc_driver.php | 7 +++---- user_guide_src/source/changelog.rst | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 779b0c62f9f..a6e08cf2fff 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -287,12 +287,11 @@ function affected_rows() /** * Insert ID * - * @access public - * @return integer + * @return bool */ - function insert_id() + public function insert_id() { - return @odbc_insert_id($this->conn_id); + return ($this->db->db_debug) ? $this->db->display_error('db_unsuported_feature') : FALSE; } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 81be64b4d1a..0de85a46b55 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -137,6 +137,7 @@ Bug fixes for 3.0 - Fixed a bug in Oracle's :doc:`Database Forge Class ` method _create_table() where it failed with AUTO_INCREMENT as it's not supported. - Fixed a bug (#1080) - When using the SMTP protocol, the :doc:`Email Library ` send() method was returning TRUE even if the connection/authentication against the server failed. - Fixed a bug (#499) - a CSRF cookie was created even with CSRF protection being disabled. +- Fixed a bug (#306) - ODBC's insert_id() method was calling non-existent function odbc_insert_id(), which resulted in a fatal error. Version 2.1.1 ============= From 57bdeb61bf199d1ae3ceaede4e9a9af8290ce715 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 5 Mar 2012 15:59:16 +0200 Subject: [PATCH 0564/5397] Removed oci8-specific stuff from DB_driver.php and added a constructor to DB_result to handle initialization --- system/database/DB_driver.php | 22 ++------------------ system/database/DB_result.php | 6 ++++++ system/database/drivers/oci8/oci8_result.php | 15 ++++++++++--- user_guide_src/source/changelog.rst | 2 ++ 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index e403efb9fa2..a61450d4c63 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -77,12 +77,6 @@ class CI_DB_driver { var $_protect_identifiers = TRUE; var $_reserved_identifiers = array('*'); // Identifiers that should NOT be escaped - // These are use with Oracle - var $stmt_id; - var $curs_id; - var $limit_used; - - /** * Constructor. Accepts one parameter containing the database * connection settings. @@ -396,21 +390,9 @@ function query($sql, $binds = FALSE, $return_object = TRUE) } // Load and instantiate the result driver + $driver = $this->load_rdriver(); + $RES = new $driver($this); - $driver = $this->load_rdriver(); - $RES = new $driver(); - $RES->conn_id = $this->conn_id; - $RES->result_id = $this->result_id; - - if ($this->dbdriver == 'oci8') - { - $RES->stmt_id = $this->stmt_id; - $RES->curs_id = NULL; - $RES->limit_used = $this->limit_used; - $this->stmt_id = FALSE; - } - - // oci8 vars must be set before calling this $RES->num_rows = $RES->num_rows(); // Is query caching enabled? If so, we'll serialize the diff --git a/system/database/DB_result.php b/system/database/DB_result.php index 730443222fa..61aa56121ff 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -47,6 +47,12 @@ class CI_DB_result { public $num_rows = 0; public $row_data = NULL; + public function __construct(&$driver_object) + { + $this->conn_id = $driver_object->conn_id; + $this->result_id = $driver_object->result_id; + } + /** * Query result. Acts as a wrapper function for the following functions. * diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index 0f69fa9ef88..383b9f1a06c 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -38,9 +38,18 @@ */ class CI_DB_oci8_result extends CI_DB_result { - var $stmt_id; - var $curs_id; - var $limit_used; + public $stmt_id; + public $curs_id; + public $limit_used; + + public function __construct(&$driver_object) + { + parent::__construct($driver_object); + $this->stmt_id = $driver_object->stmt_id; + $this->curs_id = $driver_object->curs_id; + $this->limit_used = $driver_object->limit_used; + $driver_object->stmt_id = FALSE; + } /** * Number of rows in the result set. diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 0de85a46b55..53374606546 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -62,6 +62,7 @@ Release Date: Not Released - pg_version() is now used to get the database version number, when possible. - Added db_set_charset() support. - Added _optimize_table() support for the :doc:`Database Utility Class ` (rebuilds table indexes). + - Added a constructor to the DB_result class and moved all driver-specific properties and logic out of the base DB_driver class to allow better abstraction. - Libraries @@ -138,6 +139,7 @@ Bug fixes for 3.0 - Fixed a bug (#1080) - When using the SMTP protocol, the :doc:`Email Library ` send() method was returning TRUE even if the connection/authentication against the server failed. - Fixed a bug (#499) - a CSRF cookie was created even with CSRF protection being disabled. - Fixed a bug (#306) - ODBC's insert_id() method was calling non-existent function odbc_insert_id(), which resulted in a fatal error. +- Fixed a bug in Oracle's DB_result class where the cursor id passed to it was always NULL. Version 2.1.1 ============= From fdb75418c9c4b87e9d7f15f1b59fe8d55739c8f3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 5 Mar 2012 16:32:17 +0200 Subject: [PATCH 0565/5397] Add a note to the num_rows() documentation --- user_guide_src/source/database/results.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/database/results.rst b/user_guide_src/source/database/results.rst index 4f93c794dc8..90d2efce36e 100644 --- a/user_guide_src/source/database/results.rst +++ b/user_guide_src/source/database/results.rst @@ -150,6 +150,12 @@ is the variable that the query result object is assigned to:: echo $query->num_rows(); +..note:: + Not all database drivers have a native way of getting the total + number of rows for a result set. When this is the case, all of + the data is prefetched and count() is manually called on the + resulting array in order to achieve the same functionality. + $query->num_fields() ===================== @@ -182,5 +188,4 @@ Example:: $row = $query2->row(); echo $row->name; - $query2->free_result();// The $query2 result object will no longer be available - + $query2->free_result(); // The $query2 result object will no longer be available From 69bb408cefe7ae496353f0d81692699f6ef83353 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Mon, 5 Mar 2012 12:49:55 -0500 Subject: [PATCH 0566/5397] Fixed note in documentation --- user_guide_src/source/database/results.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/database/results.rst b/user_guide_src/source/database/results.rst index 90d2efce36e..865345762f4 100644 --- a/user_guide_src/source/database/results.rst +++ b/user_guide_src/source/database/results.rst @@ -150,7 +150,7 @@ is the variable that the query result object is assigned to:: echo $query->num_rows(); -..note:: +.. note:: Not all database drivers have a native way of getting the total number of rows for a result set. When this is the case, all of the data is prefetched and count() is manually called on the From d3c1ccf1fa5f4a38cfc9b8f5e3eba8bb23c83cdd Mon Sep 17 00:00:00 2001 From: Hamza Bhatti Date: Mon, 5 Mar 2012 22:58:56 +0400 Subject: [PATCH 0567/5397] Fix issue #64 Modify regular expression to be able to handle SQL bracket delimiters for column names that contain special characters or SQL keywords. Signed-off-by: Hamza Bhatti --- system/database/DB_active_rec.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index eaae23f3095..f648e559198 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -341,7 +341,7 @@ public function join($table, $cond, $type = '') $this->_track_aliases($table); // Strip apart the condition and protect the identifiers - if (preg_match('/([\w\.]+)([\W\s]+)(.+)/', $cond, $match)) + if (preg_match('/([\[\w\.]+)([\W\s]+)(.+)/', $cond, $match)) { $cond = $this->_protect_identifiers($match[1]).$match[2].$this->_protect_identifiers($match[3]); } From 2eee0aaacc1b4aff6e1137954dfe1a09c491cdb6 Mon Sep 17 00:00:00 2001 From: Hamza Bhatti Date: Mon, 5 Mar 2012 23:23:31 +0400 Subject: [PATCH 0568/5397] Add changelog entry (bug fix for issue #64) Signed-off-by: Hamza Bhatti --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 53374606546..2f525b10ae3 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -158,6 +158,7 @@ Release Date: Not Released Bug fixes for 2.1.1 ------------------- +- Fixed a bug (#64) - Regular expression in DB_active_rec.php failed to handle queries containing SQL bracket delimiters in the join condition. - Fixed a bug (#697) - A wrong array key was used in the Upload library to check for mime-types. - Fixed a bug - form_open() compared $action against site_url() instead of base_url(). - Fixed a bug - CI_Upload::_file_mime_type() could've failed if mime_content_type() is used for the detection and returns FALSE. From 567474528e0c1a4e305dbe8787b83e526b46eb02 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Mon, 5 Mar 2012 19:38:08 +0000 Subject: [PATCH 0569/5397] Moved change log entry from 2.1.1 to 3.0. --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2f525b10ae3..683dd551622 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -140,6 +140,7 @@ Bug fixes for 3.0 - Fixed a bug (#499) - a CSRF cookie was created even with CSRF protection being disabled. - Fixed a bug (#306) - ODBC's insert_id() method was calling non-existent function odbc_insert_id(), which resulted in a fatal error. - Fixed a bug in Oracle's DB_result class where the cursor id passed to it was always NULL. +- Fixed a bug (#64) - Regular expression in DB_active_rec.php failed to handle queries containing SQL bracket delimiters in the join condition. Version 2.1.1 ============= @@ -158,7 +159,6 @@ Release Date: Not Released Bug fixes for 2.1.1 ------------------- -- Fixed a bug (#64) - Regular expression in DB_active_rec.php failed to handle queries containing SQL bracket delimiters in the join condition. - Fixed a bug (#697) - A wrong array key was used in the Upload library to check for mime-types. - Fixed a bug - form_open() compared $action against site_url() instead of base_url(). - Fixed a bug - CI_Upload::_file_mime_type() could've failed if mime_content_type() is used for the detection and returns FALSE. From dc8dc745557c2f256abad50d32f5aae85e996b1e Mon Sep 17 00:00:00 2001 From: SammyK Date: Mon, 5 Mar 2012 16:38:29 -0600 Subject: [PATCH 0570/5397] Fixed bug for PostgreSQL driver where setting a limit() on update() or delete() would throw a syntax error from Postgres. --- system/database/drivers/postgre/postgre_driver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index df0f50da55c..3fdcfa79e20 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -587,7 +587,7 @@ function _update($table, $values, $where, $orderby = array(), $limit = FALSE) $valstr[] = $key." = ".$val; } - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + $limit = ''; $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; @@ -647,7 +647,7 @@ function _delete($table, $where = array(), $like = array(), $limit = FALSE) $conditions .= implode("\n", $like); } - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + $limit = ''; return "DELETE FROM ".$table.$conditions.$limit; } From 1bf8eebec1d2eb71f4553c9ec8ae82402b869887 Mon Sep 17 00:00:00 2001 From: SammyK Date: Mon, 5 Mar 2012 16:56:06 -0600 Subject: [PATCH 0571/5397] Removed order_by() from PostgreSQL driver too. --- system/database/drivers/postgre/postgre_driver.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 3fdcfa79e20..5b248e9bc38 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -587,16 +587,10 @@ function _update($table, $values, $where, $orderby = array(), $limit = FALSE) $valstr[] = $key." = ".$val; } - $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; } @@ -647,9 +641,7 @@ function _delete($table, $where = array(), $like = array(), $limit = FALSE) $conditions .= implode("\n", $like); } - $limit = ''; - - return "DELETE FROM ".$table.$conditions.$limit; + return "DELETE FROM ".$table.$conditions; } // -------------------------------------------------------------------- From 92d68cc37dd8644563bfcc7199fec29e89ecc1ba Mon Sep 17 00:00:00 2001 From: SammyK Date: Mon, 5 Mar 2012 17:27:56 -0600 Subject: [PATCH 0572/5397] Updated changelog --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 683dd551622..e376497c9f7 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -63,6 +63,7 @@ Release Date: Not Released - Added db_set_charset() support. - Added _optimize_table() support for the :doc:`Database Utility Class ` (rebuilds table indexes). - Added a constructor to the DB_result class and moved all driver-specific properties and logic out of the base DB_driver class to allow better abstraction. + - Removed limit() and order_by() support for UPDATE and DELETE queries in PostgreSQL driver. Postgres does not support those features. - Libraries From 9c68c3173c84041b1ee77929e540a4a4382edeee Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 6 Mar 2012 10:34:58 +0200 Subject: [PATCH 0573/5397] Fix issue #1125 ... for real --- system/database/drivers/odbc/odbc_result.php | 35 ++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/system/database/drivers/odbc/odbc_result.php b/system/database/drivers/odbc/odbc_result.php index 2d5b50a8dff..de2c58cb938 100644 --- a/system/database/drivers/odbc/odbc_result.php +++ b/system/database/drivers/odbc/odbc_result.php @@ -280,6 +280,41 @@ public function result_array() return $this->result_array; } + // -------------------------------------------------------------------- + + /** + * Query result. Object version. + * + * @return array + */ + public function result_object() + { + if (count($this->result_object) > 0) + { + return $this->result_object; + } + elseif (($c = count($this->result_array)) > 0) + { + for ($i = 0; $i < $c; $i++) + { + $this->result_object[$i] = (object) $this->result_array[$i]; + } + } + elseif ($this->result_id === FALSE) + { + return array(); + } + else + { + while ($row = $this->_fetch_object()) + { + $this->result_object[] = $row; + } + } + + return $this->result_object; + } + } /* End of file odbc_result.php */ From 6b83123dce4a78e06f6eedc7cb1b2bb78d2294f0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 6 Mar 2012 11:16:57 +0200 Subject: [PATCH 0574/5397] Fixed a bug in CI_Session::_unserialize() --- system/libraries/Session.php | 10 ++++++---- user_guide_src/source/changelog.rst | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/system/libraries/Session.php b/system/libraries/Session.php index dd50a91e1e9..104b888100c 100644 --- a/system/libraries/Session.php +++ b/system/libraries/Session.php @@ -454,7 +454,7 @@ public function sess_destroy() */ public function userdata($item) { - return ( ! isset($this->userdata[$item])) ? FALSE : $this->userdata[$item]; + return isset($this->userdata[$item]) ? $this->userdata[$item] : FALSE; } // -------------------------------------------------------------------- @@ -729,7 +729,7 @@ protected function _escape_slashes(&$val, $key) */ protected function _unserialize($data) { - $data = @unserialize(strip_slashes($data)); + $data = @unserialize(strip_slashes(trim($data))); if (is_array($data)) { @@ -737,9 +737,11 @@ protected function _unserialize($data) return $data; } - return (is_string($data)) ? str_replace('{{slash}}', '\\', $data) : $data; + return is_string($data) ? str_replace('{{slash}}', '\\', $data) : $data; } + // -------------------------------------------------------------------- + /** * Unescape slashes * @@ -779,7 +781,7 @@ protected function _sess_gc() { $expire = $this->now - $this->sess_expiration; - $this->CI->db->where("last_activity < {$expire}"); + $this->CI->db->where('last_activity < '.$expire); $this->CI->db->delete($this->sess_table_name); log_message('debug', 'Session garbage collection performed.'); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e376497c9f7..663e204e187 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -142,6 +142,7 @@ Bug fixes for 3.0 - Fixed a bug (#306) - ODBC's insert_id() method was calling non-existent function odbc_insert_id(), which resulted in a fatal error. - Fixed a bug in Oracle's DB_result class where the cursor id passed to it was always NULL. - Fixed a bug (#64) - Regular expression in DB_active_rec.php failed to handle queries containing SQL bracket delimiters in the join condition. +- Fixed a bug in the :doc:`Session Library ` where a PHP E_NOTICE error was triggered by _unserialize() due to results from databases such as MSSQL and Oracle being space-padded on the right. Version 2.1.1 ============= From 883f80f7ed758f384847af3db0082f9fb6e525ee Mon Sep 17 00:00:00 2001 From: JonoB Date: Mon, 5 Mar 2012 09:51:27 +0000 Subject: [PATCH 0575/5397] Removed reset_validation() method from run() method --- system/libraries/Form_validation.php | 9 +++++---- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/libraries/form_validation.rst | 11 +++++++++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index eb6031697c1..cdb3d3d627a 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -165,6 +165,10 @@ public function set_rules($field, $label = '', $rules = '') * * If an array is set through this method, then this array will * be used instead of the $_POST array + * + * Note that if you are validating multiple arrays, then the + * reset_validation() function should be called after validating + * each array due to the limitations of CI's singleton * * @param array $data * @return void @@ -324,9 +328,6 @@ public function run($group = '') return FALSE; } - // Clear any previous validation data - $this->_reset_validation(); - // Does the _field_data array containing the validation rules exist? // If not, we look to see if they were assigned via a config file if (count($this->_field_data) === 0) @@ -1352,7 +1353,7 @@ public function encode_php_tags($str) * * @return void */ - protected function _reset_validation() + public function reset_validation() { $this->_field_data = array(); $this->_config_rules = array(); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 683dd551622..6c8344248fa 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -85,6 +85,7 @@ Release Date: Not Released - Added $config['csrf_regeneration'] to the CSRF protection in the :doc:`Security library `, which makes token regeneration optional. - Added function error_array() to return all error messages as an array in the Form_validation class. - Added function set_data() to Form_validation library, which can be used in place of the default $_POST array. + - Added function reset_validation() to form validation library, which resets internal validation variables in case of multiple validation routines. - Changed the Session library to select only one row when using database sessions. - Core diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 0d6a49e7941..5aa64d03243 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -597,6 +597,9 @@ In this case, you can specify the array to be validated:: Creating validation rules, running the validation and retrieving error messages works the same whether you are validating $_POST data or an array. +**Important Note:** If you want to validate more than one array during a single execution, then you should +call the reset_validation() function before setting up rules and validating the new array. + For more info please see the :ref:`function-reference` section below. -.. _saving-groups: @@ -966,6 +969,14 @@ $this->form_validation->set_data(); Permits you to set an array for validation, instead of using the default $_POST array. +$this->form_validation->reset_validation(); +======================================== + + .. php:method:: reset_validation () + + Permits you to reset the validation when you validate more than one array. + This function should be called before validating each new array. + $this->form_validation->error_array(); ======================================== From f5e8e1c61e4ed82db42d82d01c4e52b767effa78 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 6 Mar 2012 13:11:27 +0200 Subject: [PATCH 0576/5397] Changed rewrite_short_tags to have no effect on PHP 5.4 --- system/core/Loader.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index 12daaa92868..20cf7ef3302 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -833,7 +833,7 @@ protected function _ci_load($_ci_data) // If the PHP installation does not support short tags we'll // do a little string replacement, changing the short tags // to standard PHP echo statements. - if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE) + if ( ! is_php('5.4') && (bool) @ini_get('short_open_tag') === FALSE && config_item('rewrite_short_tags') == TRUE) { echo eval('?>'.preg_replace('/;*\s*\?>/', '; ?>', str_replace('load->vars(). - is_loaded() function from system/core/Commons.php now returns a reference. + - $config['rewrite_short_tags'] now has no effect when using PHP 5.4 as * Date: Tue, 6 Mar 2012 07:38:00 -0500 Subject: [PATCH 0577/5397] Added visibility keywords to DB_driver methods --- system/database/DB_driver.php | 108 ++++++++++++---------------------- 1 file changed, 38 insertions(+), 70 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index a61450d4c63..71cf8630671 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -83,7 +83,7 @@ class CI_DB_driver { * * @param array */ - function __construct($params) + public function __construct($params) { if (is_array($params)) { @@ -208,7 +208,7 @@ public function db_set_charset($charset, $collation = '') * @access public * @return string */ - function platform() + public function platform() { return $this->dbdriver; } @@ -268,7 +268,7 @@ protected function _version() * @param array An array of binding data * @return mixed */ - function query($sql, $binds = FALSE, $return_object = TRUE) + public function query($sql, $binds = FALSE, $return_object = TRUE) { if ($sql == '') { @@ -425,10 +425,9 @@ function query($sql, $binds = FALSE, $return_object = TRUE) /** * Load the result drivers * - * @access public * @return string the name of the result class */ - function load_rdriver() + public function load_rdriver() { $driver = 'CI_DB_'.$this->dbdriver.'_result'; @@ -449,11 +448,10 @@ function load_rdriver() * we only use it when running transaction commands since they do * not require all the features of the main query() function. * - * @access public * @param string the sql query * @return mixed */ - function simple_query($sql) + public function simple_query($sql) { if ( ! $this->conn_id) { @@ -469,10 +467,9 @@ function simple_query($sql) * Disable Transactions * This permits transactions to be disabled at run-time. * - * @access public * @return void */ - function trans_off() + public function trans_off() { $this->trans_enabled = FALSE; } @@ -486,10 +483,9 @@ function trans_off() * If strict mode is disabled, each group is treated autonomously, meaning * a failure of one group will not affect any others * - * @access public * @return void */ - function trans_strict($mode = TRUE) + public function trans_strict($mode = TRUE) { $this->trans_strict = is_bool($mode) ? $mode : TRUE; } @@ -499,10 +495,9 @@ function trans_strict($mode = TRUE) /** * Start Transaction * - * @access public * @return void */ - function trans_start($test_mode = FALSE) + public function trans_start($test_mode = FALSE) { if ( ! $this->trans_enabled) { @@ -525,10 +520,9 @@ function trans_start($test_mode = FALSE) /** * Complete Transaction * - * @access public * @return bool */ - function trans_complete() + public function trans_complete() { if ( ! $this->trans_enabled) { @@ -572,10 +566,9 @@ function trans_complete() /** * Lets you retrieve the transaction flag to determine if it has failed * - * @access public * @return bool */ - function trans_status() + public function trans_status() { return $this->_trans_status; } @@ -585,12 +578,11 @@ function trans_status() /** * Compile Bindings * - * @access public * @param string the sql statement * @param array an array of bind data * @return string */ - function compile_binds($sql, $binds) + public function compile_binds($sql, $binds) { if (strpos($sql, $this->bind_marker) === FALSE) { @@ -641,11 +633,10 @@ public function is_write_type($sql) /** * Calculate the aggregate query elapsed time * - * @access public * @param integer The number of decimal places * @return integer */ - function elapsed_time($decimals = 6) + public function elapsed_time($decimals = 6) { return number_format($this->benchmark, $decimals); } @@ -655,10 +646,9 @@ function elapsed_time($decimals = 6) /** * Returns the total number of queries * - * @access public * @return integer */ - function total_queries() + public function total_queries() { return $this->query_count; } @@ -668,10 +658,9 @@ function total_queries() /** * Returns the last query that was executed * - * @access public * @return void */ - function last_query() + public function last_query() { return end($this->queries); } @@ -684,11 +673,10 @@ function last_query() * Escapes data based on type * Sets boolean and null types * - * @access public * @param string * @return mixed */ - function escape($str) + public function escape($str) { if (is_string($str)) { @@ -714,11 +702,10 @@ function escape($str) * Calls the individual driver for platform * specific escaping for LIKE conditions * - * @access public * @param string * @return mixed */ - function escape_like_str($str) + public function escape_like_str($str) { return $this->escape_str($str, TRUE); } @@ -731,11 +718,10 @@ function escape_like_str($str) * Retrieves the primary key. It assumes that the row in the first * position is the primary key * - * @access public * @param string the table name * @return string */ - function primary($table = '') + public function primary($table = '') { $fields = $this->list_fields($table); @@ -752,10 +738,9 @@ function primary($table = '') /** * Returns an array of table names * - * @access public * @return array */ - function list_tables($constrain_by_prefix = FALSE) + public function list_tables($constrain_by_prefix = FALSE) { // Is there a cached result? if (isset($this->data_cache['table_names'])) @@ -801,10 +786,10 @@ function list_tables($constrain_by_prefix = FALSE) /** * Determine if a particular table exists - * @access public + * * @return boolean */ - function table_exists($table_name) + public function table_exists($table_name) { return ( ! in_array($this->_protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables())) ? FALSE : TRUE; } @@ -814,11 +799,10 @@ function table_exists($table_name) /** * Fetch MySQL Field Names * - * @access public * @param string the table name * @return array */ - function list_fields($table = '') + public function list_fields($table = '') { // Is there a cached result? if (isset($this->data_cache['field_names'][$table])) @@ -867,12 +851,12 @@ function list_fields($table = '') /** * Determine if a particular field exists - * @access public + * * @param string * @param string * @return boolean */ - function field_exists($field_name, $table_name) + public function field_exists($field_name, $table_name) { return ( ! in_array($field_name, $this->list_fields($table_name))) ? FALSE : TRUE; } @@ -882,11 +866,10 @@ function field_exists($field_name, $table_name) /** * Returns an object with field data * - * @access public * @param string the table name * @return object */ - function field_data($table = '') + public function field_data($table = '') { if ($table == '') { @@ -907,12 +890,11 @@ function field_data($table = '') /** * Generate an insert string * - * @access public * @param string the table upon which the query will be performed * @param array an associative array data of key/values * @return string */ - function insert_string($table, $data) + public function insert_string($table, $data) { $fields = array(); $values = array(); @@ -931,13 +913,12 @@ function insert_string($table, $data) /** * Generate an update string * - * @access public * @param string the table upon which the query will be performed * @param array an associative array data of key/values * @param mixed the "where" statement * @return string */ - function update_string($table, $data, $where) + public function update_string($table, $data, $where) { if ($where == '') { @@ -984,11 +965,10 @@ function update_string($table, $data, $where) /** * Tests whether the string has an SQL operator * - * @access private * @param string * @return bool */ - function _has_operator($str) + protected function _has_operator($str) { $str = trim($str); if ( ! preg_match("/(\s|<|>|!|=|is null|is not null)/i", $str)) @@ -1004,12 +984,11 @@ function _has_operator($str) /** * Enables a native PHP function to be run, using a platform agnostic wrapper. * - * @access public * @param string the function name * @param mixed any parameters needed by the function * @return mixed */ - function call_function($function) + public function call_function($function) { $driver = ($this->dbdriver == 'postgre') ? 'pg_' : $this->dbdriver.'_'; @@ -1046,11 +1025,10 @@ function call_function($function) /** * Set Cache Directory Path * - * @access public * @param string the path to the cache directory * @return void */ - function cache_set_path($path = '') + public function cache_set_path($path = '') { $this->cachedir = $path; } @@ -1060,10 +1038,9 @@ function cache_set_path($path = '') /** * Enable Query Caching * - * @access public * @return void */ - function cache_on() + public function cache_on() { $this->cache_on = TRUE; return TRUE; @@ -1074,10 +1051,9 @@ function cache_on() /** * Disable Query Caching * - * @access public * @return void */ - function cache_off() + public function cache_off() { $this->cache_on = FALSE; return FALSE; @@ -1089,10 +1065,9 @@ function cache_off() /** * Delete the cache files associated with a particular URI * - * @access public * @return void */ - function cache_delete($segment_one = '', $segment_two = '') + public function cache_delete($segment_one = '', $segment_two = '') { if ( ! $this->_cache_init()) { @@ -1106,10 +1081,9 @@ function cache_delete($segment_one = '', $segment_two = '') /** * Delete All cache files * - * @access public * @return void */ - function cache_delete_all() + public function cache_delete_all() { if ( ! $this->_cache_init()) { @@ -1124,10 +1098,9 @@ function cache_delete_all() /** * Initialize the Cache Class * - * @access private * @return void */ - function _cache_init() + protected function _cache_init() { if (is_object($this->CACHE) AND class_exists('CI_DB_Cache')) { @@ -1151,10 +1124,9 @@ function _cache_init() /** * Close DB Connection * - * @access public * @return void */ - function close() + public function close() { if (is_resource($this->conn_id) OR is_object($this->conn_id)) { @@ -1168,13 +1140,12 @@ function close() /** * Display an error message * - * @access public * @param string the error message * @param string any "swap" values * @param boolean whether to localize the message * @return string sends the application/error_db.php template */ - function display_error($error = '', $swap = '', $native = FALSE) + public function display_error($error = '', $swap = '', $native = FALSE) { $LANG =& load_class('Lang', 'core'); $LANG->load('db'); @@ -1220,11 +1191,10 @@ function display_error($error = '', $swap = '', $native = FALSE) * * This function adds backticks if appropriate based on db type * - * @access private * @param mixed the item to escape * @return mixed the item with backticks */ - function protect_identifiers($item, $prefix_single = FALSE) + protected function protect_identifiers($item, $prefix_single = FALSE) { return $this->_protect_identifiers($item, $prefix_single); } @@ -1251,14 +1221,13 @@ function protect_identifiers($item, $prefix_single = FALSE) * insert the table prefix (if it exists) in the proper position, and escape only * the correct identifiers. * - * @access private * @param string * @param bool * @param mixed * @param bool * @return string */ - function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) + protected function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) { if ( ! is_bool($protect_identifiers)) { @@ -1410,7 +1379,6 @@ function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifier * * This function is used extensively by every db driver. * - * @access private * @return void */ protected function _reset_select() From 7869559a56f0974c1bcf42d6ebd13bd872b3421c Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Tue, 6 Mar 2012 08:02:49 -0500 Subject: [PATCH 0578/5397] Made protect_identifiers public --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 71cf8630671..7bb5dfabe2e 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1194,7 +1194,7 @@ public function display_error($error = '', $swap = '', $native = FALSE) * @param mixed the item to escape * @return mixed the item with backticks */ - protected function protect_identifiers($item, $prefix_single = FALSE) + public function protect_identifiers($item, $prefix_single = FALSE) { return $this->_protect_identifiers($item, $prefix_single); } From a4c33fe97910c92f9bc53570722b5b81108e64d7 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Tue, 6 Mar 2012 08:31:02 -0500 Subject: [PATCH 0579/5397] Made _protect_identifiers public --- system/database/DB_driver.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 7bb5dfabe2e..3977b35c14c 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1221,13 +1221,16 @@ public function protect_identifiers($item, $prefix_single = FALSE) * insert the table prefix (if it exists) in the proper position, and escape only * the correct identifiers. * + * While this should be protected, the db forge drivers apparently use this instead + * of the unprefixed function + * * @param string * @param bool * @param mixed * @param bool * @return string */ - protected function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) + public function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) { if ( ! is_bool($protect_identifiers)) { From 032e7ea646b953a8f4d28327d7f487de2ffa7288 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 6 Mar 2012 19:48:35 +0200 Subject: [PATCH 0580/5397] Resolve _protect_identifiers()/protect_identifiers() usage issues --- system/database/DB_active_rec.php | 62 +++++++++---------- system/database/DB_driver.php | 34 +++------- .../database/drivers/cubrid/cubrid_driver.php | 5 +- .../database/drivers/cubrid/cubrid_forge.php | 30 +++++---- .../drivers/interbase/interbase_driver.php | 3 +- .../database/drivers/mssql/mssql_driver.php | 3 +- system/database/drivers/mssql/mssql_forge.php | 17 +++-- .../database/drivers/mysql/mysql_driver.php | 2 +- system/database/drivers/mysql/mysql_forge.php | 8 +-- .../database/drivers/mysqli/mysqli_driver.php | 6 +- .../database/drivers/mysqli/mysqli_forge.php | 2 +- system/database/drivers/oci8/oci8_driver.php | 3 +- system/database/drivers/oci8/oci8_forge.php | 8 +-- system/database/drivers/odbc/odbc_driver.php | 2 +- system/database/drivers/odbc/odbc_forge.php | 18 +++--- system/database/drivers/pdo/pdo_driver.php | 3 +- system/database/drivers/pdo/pdo_forge.php | 17 +++-- .../drivers/postgre/postgre_driver.php | 3 +- .../drivers/postgre/postgre_forge.php | 21 +++---- .../database/drivers/sqlite/sqlite_driver.php | 3 +- .../database/drivers/sqlite/sqlite_forge.php | 16 ++--- .../database/drivers/sqlsrv/sqlsrv_forge.php | 19 +++--- user_guide_src/source/changelog.rst | 1 + 23 files changed, 124 insertions(+), 162 deletions(-) diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index f648e559198..de8cfc1ca54 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -212,7 +212,7 @@ protected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') $alias = $this->_create_alias_from_table(trim($select)); } - $sql = $this->_protect_identifiers($type.'('.trim($select).')').' AS '.$this->_protect_identifiers(trim($alias)); + $sql = $this->protect_identifiers($type.'('.trim($select).')').' AS '.$this->protect_identifiers(trim($alias)); $this->ar_select[] = $sql; if ($this->ar_caching === TRUE) @@ -279,7 +279,7 @@ public function from($from) { $v = trim($v); $this->_track_aliases($v); - $v = $this->ar_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE); + $v = $this->ar_from[] = $this->protect_identifiers($v, TRUE, NULL, FALSE); if ($this->ar_caching === TRUE) { @@ -295,7 +295,7 @@ public function from($from) // Extract any aliases that might exist. We use this information // in the _protect_identifiers to know whether to add a table prefix $this->_track_aliases($val); - $this->ar_from[] = $val = $this->_protect_identifiers($val, TRUE, NULL, FALSE); + $this->ar_from[] = $val = $this->protect_identifiers($val, TRUE, NULL, FALSE); if ($this->ar_caching === TRUE) { @@ -343,11 +343,11 @@ public function join($table, $cond, $type = '') // Strip apart the condition and protect the identifiers if (preg_match('/([\[\w\.]+)([\W\s]+)(.+)/', $cond, $match)) { - $cond = $this->_protect_identifiers($match[1]).$match[2].$this->_protect_identifiers($match[3]); + $cond = $this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3]); } // Assemble the JOIN statement - $this->ar_join[] = $join = $type.'JOIN '.$this->_protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond; + $this->ar_join[] = $join = $type.'JOIN '.$this->protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond; if ($this->ar_caching === TRUE) { @@ -433,7 +433,7 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) { if ($escape === TRUE) { - $k = $this->_protect_identifiers($k, FALSE, $escape); + $k = $this->protect_identifiers($k, FALSE, $escape); $v = ' '.$this->escape($v); } @@ -444,7 +444,7 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) } else { - $k = $this->_protect_identifiers($k, FALSE, $escape); + $k = $this->protect_identifiers($k, FALSE, $escape); } $this->ar_where[] = $prefix.$k.$v; @@ -562,7 +562,7 @@ protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = } $prefix = (count($this->ar_where) === 0) ? '' : $type; - $this->ar_where[] = $where_in = $prefix.$this->_protect_identifiers($key).$not.' IN ('.implode(', ', $this->ar_wherein).') '; + $this->ar_where[] = $where_in = $prefix.$this->protect_identifiers($key).$not.' IN ('.implode(', ', $this->ar_wherein).') '; if ($this->ar_caching === TRUE) { @@ -666,7 +666,7 @@ protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $n foreach ($field as $k => $v) { - $k = $this->_protect_identifiers($k); + $k = $this->protect_identifiers($k); $prefix = (count($this->ar_like) === 0) ? '' : $type; $v = $this->escape_like_str($v); @@ -827,7 +827,7 @@ public function group_by($by) if ($val != '') { - $this->ar_groupby[] = $val = $this->_protect_identifiers($val); + $this->ar_groupby[] = $val = $this->protect_identifiers($val); if ($this->ar_caching === TRUE) { @@ -896,7 +896,7 @@ protected function _having($key, $value = '', $type = 'AND ', $escape = TRUE) if ($escape === TRUE) { - $k = $this->_protect_identifiers($k); + $k = $this->protect_identifiers($k); } if ( ! $this->_has_operator($k)) @@ -951,7 +951,7 @@ public function order_by($orderby, $direction = '', $escape = TRUE) $part = trim($part); if ( ! in_array($part, $this->ar_aliased_tables)) { - $part = $this->_protect_identifiers(trim($part)); + $part = $this->protect_identifiers(trim($part)); } $temp[] = $part; @@ -963,7 +963,7 @@ public function order_by($orderby, $direction = '', $escape = TRUE) { if ($escape === TRUE) { - $orderby = $this->_protect_identifiers($orderby); + $orderby = $this->protect_identifiers($orderby); } } @@ -1036,11 +1036,11 @@ public function set($key, $value = '', $escape = TRUE) { if ($escape === FALSE) { - $this->ar_set[$this->_protect_identifiers($k)] = $v; + $this->ar_set[$this->protect_identifiers($k)] = $v; } else { - $this->ar_set[$this->_protect_identifiers($k, FALSE, TRUE)] = $this->escape($v); + $this->ar_set[$this->protect_identifiers($k, FALSE, TRUE)] = $this->escape($v); } } @@ -1125,7 +1125,7 @@ public function count_all_results($table = '') $this->from($table); } - $result = $this->query($this->_compile_select($this->_count_string.$this->_protect_identifiers('numrows'))); + $result = $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); $this->_reset_select(); if ($result->num_rows() === 0) @@ -1211,7 +1211,7 @@ public function insert_batch($table = '', $set = NULL) // Batch this baby for ($i = 0, $total = count($this->ar_set); $i < $total; $i += 100) { - $this->query($this->_insert_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_keys, array_slice($this->ar_set, $i, 100))); + $this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_keys, array_slice($this->ar_set, $i, 100))); } $this->_reset_write(); @@ -1269,7 +1269,7 @@ public function set_insert_batch($key, $value = '', $escape = TRUE) foreach ($keys as $k) { - $this->ar_keys[] = $this->_protect_identifiers($k); + $this->ar_keys[] = $this->protect_identifiers($k); } return $this; @@ -1295,9 +1295,7 @@ public function get_compiled_insert($table = '', $reset = TRUE) } $sql = $this->_insert( - $this->_protect_identifiers( - $this->ar_from[0], TRUE, NULL, FALSE - ), + $this->protect_identifiers($this->ar_from[0], TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set) ); @@ -1335,9 +1333,7 @@ public function insert($table = '', $set = NULL) } $sql = $this->_insert( - $this->_protect_identifiers( - $this->ar_from[0], TRUE, NULL, FALSE - ), + $this->protect_identifiers($this->ar_from[0], TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set) ); @@ -1414,7 +1410,7 @@ public function replace($table = '', $set = NULL) $table = $this->ar_from[0]; } - $sql = $this->_replace($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set)); + $sql = $this->_replace($this->protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set)); $this->_reset_write(); return $this->query($sql); } @@ -1441,7 +1437,7 @@ public function get_compiled_update($table = '', $reset = TRUE) return FALSE; } - $sql = $this->_update($this->_protect_identifiers($this->ar_from[0], TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit); + $sql = $this->_update($this->protect_identifiers($this->ar_from[0], TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit); if ($reset === TRUE) { @@ -1488,7 +1484,7 @@ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) $this->limit($limit); } - $sql = $this->_update($this->_protect_identifiers($this->ar_from[0], TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit, $this->ar_like); + $sql = $this->_update($this->protect_identifiers($this->ar_from[0], TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit, $this->ar_like); $this->_reset_write(); return $this->query($sql); } @@ -1573,7 +1569,7 @@ public function update_batch($table = '', $set = NULL, $index = NULL) // Batch this baby for ($i = 0, $total = count($this->ar_set); $i < $total; $i += 100) { - $this->query($this->_update_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->ar_set, $i, 100), $this->_protect_identifiers($index), $this->ar_where)); + $this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->ar_set, $i, 100), $this->protect_identifiers($index), $this->ar_where)); } $this->_reset_write(); @@ -1614,7 +1610,7 @@ public function set_update_batch($key, $index = '', $escape = TRUE) $not[] = $k.'-'.$v; } - $clean[$this->_protect_identifiers($k2)] = ($escape === FALSE) ? $v2 : $this->escape($v2); + $clean[$this->protect_identifiers($k2)] = ($escape === FALSE) ? $v2 : $this->escape($v2); } if ($index_set == FALSE) @@ -1651,7 +1647,7 @@ public function empty_table($table = '') } else { - $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE); + $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); } $sql = $this->_delete($table); @@ -1684,7 +1680,7 @@ public function truncate($table = '') } else { - $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE); + $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); } $sql = $this->_truncate($table); @@ -1751,7 +1747,7 @@ public function delete($table = '', $where = '', $limit = NULL, $reset_data = TR } else { - $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE); + $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); } if ($where != '') @@ -1894,7 +1890,7 @@ protected function _compile_select($select_override = FALSE) foreach ($this->ar_select as $key => $val) { $no_escape = isset($this->ar_no_escape[$key]) ? $this->ar_no_escape[$key] : NULL; - $this->ar_select[$key] = $this->_protect_identifiers($val, FALSE, $no_escape); + $this->ar_select[$key] = $this->protect_identifiers($val, FALSE, $no_escape); } $sql .= implode(', ', $this->ar_select); diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 3977b35c14c..597f5e9a5df 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -791,7 +791,7 @@ public function list_tables($constrain_by_prefix = FALSE) */ public function table_exists($table_name) { - return ( ! in_array($this->_protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables())) ? FALSE : TRUE; + return in_array($this->protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables()); } // -------------------------------------------------------------------- @@ -880,7 +880,7 @@ public function field_data($table = '') return FALSE; } - $query = $this->query($this->_field_data($this->_protect_identifiers($table, TRUE, NULL, FALSE))); + $query = $this->query($this->_field_data($this->protect_identifiers($table, TRUE, NULL, FALSE))); return $query->field_data(); } @@ -905,7 +905,7 @@ public function insert_string($table, $data) $values[] = $this->escape($val); } - return $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values); + return $this->_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values); } // -------------------------------------------------------------------- @@ -928,7 +928,7 @@ public function update_string($table, $data, $where) $fields = array(); foreach ($data as $key => $val) { - $fields[$this->_protect_identifiers($key)] = $this->escape($val); + $fields[$this->protect_identifiers($key)] = $this->escape($val); } if ( ! is_array($where)) @@ -941,7 +941,7 @@ public function update_string($table, $data, $where) foreach ($where as $key => $val) { $prefix = (count($dest) == 0) ? '' : ' AND '; - $key = $this->_protect_identifiers($key); + $key = $this->protect_identifiers($key); if ($val !== '') { @@ -957,7 +957,7 @@ public function update_string($table, $data, $where) } } - return $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $dest); + return $this->_update($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields, $dest); } // -------------------------------------------------------------------- @@ -1186,21 +1186,6 @@ public function display_error($error = '', $swap = '', $native = FALSE) // -------------------------------------------------------------------- - /** - * Protect Identifiers - * - * This function adds backticks if appropriate based on db type - * - * @param mixed the item to escape - * @return mixed the item with backticks - */ - public function protect_identifiers($item, $prefix_single = FALSE) - { - return $this->_protect_identifiers($item, $prefix_single); - } - - // -------------------------------------------------------------------- - /** * Protect Identifiers * @@ -1221,16 +1206,13 @@ public function protect_identifiers($item, $prefix_single = FALSE) * insert the table prefix (if it exists) in the proper position, and escape only * the correct identifiers. * - * While this should be protected, the db forge drivers apparently use this instead - * of the unprefixed function - * * @param string * @param bool * @param mixed * @param bool * @return string */ - public function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) + public function protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) { if ( ! is_bool($protect_identifiers)) { @@ -1243,7 +1225,7 @@ public function _protect_identifiers($item, $prefix_single = FALSE, $protect_ide foreach ($item as $k => $v) { - $escaped_array[$this->_protect_identifiers($k)] = $this->_protect_identifiers($v); + $escaped_array[$this->protect_identifiers($k)] = $this->protect_identifiers($v); } return $escaped_array; diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index afdaef3518f..3c0850ad307 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -378,9 +378,8 @@ function count_all($table = '') { return 0; } - - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + $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; @@ -427,7 +426,7 @@ function _list_tables($prefix_limit = FALSE) */ function _list_columns($table = '') { - return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE); + return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php index 85e7400574d..76002cb3849 100644 --- a/system/database/drivers/cubrid/cubrid_forge.php +++ b/system/database/drivers/cubrid/cubrid_forge.php @@ -93,11 +93,11 @@ function _process_fields($fields) { $attributes = array_change_key_case($attributes, CASE_UPPER); - $sql .= "\n\t\"" . $this->db->_protect_identifiers($field) . "\""; + $sql .= "\n\t\"".$this->db->protect_identifiers($field).'"'; if (array_key_exists('NAME', $attributes)) { - $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' '; + $sql .= ' '.$this->db->protect_identifiers($attributes['NAME']).' '; } if (array_key_exists('TYPE', $attributes)) @@ -197,10 +197,9 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) // 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); + $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) . ")"; } @@ -210,15 +209,15 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { if (is_array($key)) { - $key_name = $this->db->_protect_identifiers(implode('_', $key)); - $key = $this->db->_protect_identifiers($key); + $key_name = $this->db->protect_identifiers(implode('_', $key)); + $key = $this->db->protect_identifiers($key); } else { - $key_name = $this->db->_protect_identifiers($key); + $key_name = $this->db->protect_identifiers($key); $key = array($key_name); } - + $sql .= ",\n\tKEY \"{$key_name}\" (" . implode(', ', $key) . ")"; } } @@ -258,19 +257,19 @@ function _drop_table($table) */ function _alter_table($alter_type, $table, $fields, $after_field = '') { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type "; + $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); + 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.' AFTER '.$this->db->protect_identifiers($after_field); } return $sql; @@ -290,11 +289,10 @@ function _alter_table($alter_type, $table, $fields, $after_field = '') */ 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; + return 'RENAME TABLE '.$this->db->protect_identifiers($table_name).' AS '.$this->db->protect_identifiers($new_table_name); } } /* End of file cubrid_forge.php */ -/* Location: ./system/database/drivers/cubrid/cubrid_forge.php */ \ No newline at end of file +/* Location: ./system/database/drivers/cubrid/cubrid_forge.php */ diff --git a/system/database/drivers/interbase/interbase_driver.php b/system/database/drivers/interbase/interbase_driver.php index f4bd9e271dd..bacb6688ccc 100644 --- a/system/database/drivers/interbase/interbase_driver.php +++ b/system/database/drivers/interbase/interbase_driver.php @@ -320,8 +320,7 @@ public function count_all($table = '') return 0; } - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . ' FROM ' . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - + $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; diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 147c6348345..39b84f9c66a 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -365,8 +365,7 @@ function count_all($table = '') return 0; } - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - + $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; diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php index dd8aa3448a2..ec97805acf2 100644 --- a/system/database/drivers/mssql/mssql_forge.php +++ b/system/database/drivers/mssql/mssql_forge.php @@ -113,7 +113,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { $attributes = array_change_key_case($attributes, CASE_UPPER); - $sql .= "\n\t".$this->db->_protect_identifiers($field); + $sql .= "\n\t".$this->db->protect_identifiers($field); $sql .= ' '.$attributes['TYPE']; @@ -156,7 +156,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) if (count($primary_keys) > 0) { - $primary_keys = $this->db->_protect_identifiers($primary_keys); + $primary_keys = $this->db->protect_identifiers($primary_keys); $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; } @@ -166,11 +166,11 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { if (is_array($key)) { - $key = $this->db->_protect_identifiers($key); + $key = $this->db->protect_identifiers($key); } else { - $key = array($this->db->_protect_identifiers($key)); + $key = array($this->db->protect_identifiers($key)); } $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; @@ -202,7 +202,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) */ 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); + $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') @@ -228,7 +228,7 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = '' if ($after_field != '') { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + return $sql.' AFTER '.$this->db->protect_identifiers($after_field); } return $sql; @@ -250,11 +250,10 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = '' 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; + return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name); } } /* End of file mssql_forge.php */ -/* Location: ./system/database/drivers/mssql/mssql_forge.php */ \ No newline at end of file +/* Location: ./system/database/drivers/mssql/mssql_forge.php */ diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 7fd08a6ed68..cd176375150 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -416,7 +416,7 @@ public function field_data($table = '') return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE; } - $query = $this->query('DESCRIBE '.$this->_protect_identifiers($table, TRUE, NULL, FALSE)); + $query = $this->query('DESCRIBE '.$this->protect_identifiers($table, TRUE, NULL, FALSE)); $query = $query->result_object(); $retval = array(); diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php index 0f251b086ec..a907b20fa6c 100644 --- a/system/database/drivers/mysql/mysql_forge.php +++ b/system/database/drivers/mysql/mysql_forge.php @@ -151,7 +151,7 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi if (count($primary_keys) > 0) { - $key_name = $this->db->_protect_identifiers(implode('_', $primary_keys)); + $key_name = $this->db->protect_identifiers(implode('_', $primary_keys)); $sql .= ",\n\tPRIMARY KEY ".$key_name.' ('.implode(', ', $this->db->protect_identifiers($primary_keys)).')'; } @@ -161,12 +161,12 @@ public function _create_table($table, $fields, $primary_keys, $keys, $if_not_exi { if (is_array($key)) { - $key_name = $this->db->_protect_identifiers(implode('_', $key)); - $key = $this->db->_protect_identifiers($key); + $key_name = $this->db->protect_identifiers(implode('_', $key)); + $key = $this->db->protect_identifiers($key); } else { - $key_name = $this->db->_protect_identifiers($key); + $key_name = $this->db->protect_identifiers($key); $key = array($key_name); } diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 25b6ceca1bc..d06119a1340 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -353,7 +353,7 @@ public function count_all($table = '') return 0; } - $query = $this->query($this->_count_string.$this->_protect_identifiers('numrows').' FROM '.$this->_protect_identifiers($table, TRUE, NULL, FALSE)); + $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; @@ -399,7 +399,7 @@ protected function _list_tables($prefix_limit = FALSE) */ protected function _list_columns($table = '') { - return 'SHOW COLUMNS FROM '.$this->_protect_identifiers($table, TRUE, NULL, FALSE); + return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); } // -------------------------------------------------------------------- @@ -417,7 +417,7 @@ public function field_data($table = '') return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE; } - $query = $this->query('DESCRIBE '.$this->_protect_identifiers($table, TRUE, NULL, FALSE)); + $query = $this->query('DESCRIBE '.$this->protect_identifiers($table, TRUE, NULL, FALSE)); $query = $query->result_object(); $retval = array(); diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php index 7de03612790..744525f02a9 100644 --- a/system/database/drivers/mysqli/mysqli_forge.php +++ b/system/database/drivers/mysqli/mysqli_forge.php @@ -183,7 +183,7 @@ public function _drop_table($table) */ public function _alter_table($alter_type, $table, $fields, $after_field = '') { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table).' '.$alter_type.' '; + $sql = 'ALTER TABLE '.$this->db->protect_identifiers($table).' '.$alter_type.' '; // DROP has everything it needs now. if ($alter_type === 'DROP') diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 35cafff6c8f..8db6c12868a 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -458,8 +458,7 @@ public function count_all($table = '') return 0; } - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - + $query = $this->query($this->_count_string.$this->protect_identifiers('numrows').' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE)); if ($query == FALSE) { return 0; diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index 0aa11990796..48f98d022e5 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -172,7 +172,7 @@ function _drop_table($table) */ 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); + $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') @@ -198,7 +198,7 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = '' if ($after_field != '') { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + return $sql.' AFTER '.$this->db->protect_identifiers($after_field); } return $sql; @@ -219,11 +219,9 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = '' */ 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; + return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name); } - } /* End of file oci8_forge.php */ diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index a6e08cf2fff..2575f431dd8 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -313,7 +313,7 @@ function count_all($table = '') return 0; } - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + $query = $this->query($this->_count_string . $this->protect_identifiers('numrows') . " FROM " . $this->protect_identifiers($table, TRUE, NULL, FALSE)); if ($query->num_rows() == 0) { diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php index e0ec687c8d5..51addf03d6d 100644 --- a/system/database/drivers/odbc/odbc_forge.php +++ b/system/database/drivers/odbc/odbc_forge.php @@ -112,7 +112,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { $attributes = array_change_key_case($attributes, CASE_UPPER); - $sql .= "\n\t".$this->db->_protect_identifiers($field); + $sql .= "\n\t".$this->db->protect_identifiers($field); $sql .= ' '.$attributes['TYPE']; @@ -155,7 +155,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) if (count($primary_keys) > 0) { - $primary_keys = $this->db->_protect_identifiers($primary_keys); + $primary_keys = $this->db->protect_identifiers($primary_keys); $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; } @@ -165,11 +165,11 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { if (is_array($key)) { - $key = $this->db->_protect_identifiers($key); + $key = $this->db->protect_identifiers($key); } else { - $key = array($this->db->_protect_identifiers($key)); + $key = array($this->db->protect_identifiers($key)); } $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; @@ -219,7 +219,7 @@ function _drop_table($table) */ 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); + $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') @@ -245,7 +245,7 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = '' if ($after_field != '') { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + return $sql.' AFTER '.$this->db->protect_identifiers($after_field); } return $sql; @@ -267,12 +267,10 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = '' */ 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; + return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name); } - } /* End of file odbc_forge.php */ -/* Location: ./system/database/drivers/odbc/odbc_forge.php */ \ No newline at end of file +/* Location: ./system/database/drivers/odbc/odbc_forge.php */ diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 8fdfd58fb0b..eadb78ffe32 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -530,8 +530,7 @@ function count_all($table = '') return 0; } - $sql = $this->_count_string.$this->_protect_identifiers('numrows').' FROM '; - $sql .= $this->_protect_identifiers($table, TRUE, NULL, FALSE); + $sql = $this->_count_string.$this->protect_identifiers('numrows').' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); $query = $this->query($sql); if ($query->num_rows() == 0) diff --git a/system/database/drivers/pdo/pdo_forge.php b/system/database/drivers/pdo/pdo_forge.php index 478b2dbfb2a..b4ddca5fe0d 100644 --- a/system/database/drivers/pdo/pdo_forge.php +++ b/system/database/drivers/pdo/pdo_forge.php @@ -113,7 +113,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) $attributes = array_change_key_case($attributes, CASE_UPPER); $numeric = array('SERIAL', 'INTEGER'); - $sql .= "\n\t".$this->db->_protect_identifiers($field); + $sql .= "\n\t".$this->db->protect_identifiers($field); $sql .= ' '.$attributes['TYPE']; @@ -160,7 +160,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) if (count($primary_keys) > 0) { - $primary_keys = $this->db->_protect_identifiers($primary_keys); + $primary_keys = $this->db->protect_identifiers($primary_keys); $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; } @@ -170,11 +170,11 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { if (is_array($key)) { - $key = $this->db->_protect_identifiers($key); + $key = $this->db->protect_identifiers($key); } else { - $key = array($this->db->_protect_identifiers($key)); + $key = array($this->db->protect_identifiers($key)); } $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; @@ -224,7 +224,7 @@ function _drop_table($table) */ 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); + $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') @@ -250,7 +250,7 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = '' if ($after_field != '') { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + return $sql.' AFTER '.$this->db->protect_identifiers($after_field); } return $sql; @@ -272,11 +272,10 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = '' */ 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; + return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name); } } /* End of file pdo_forge.php */ -/* Location: ./system/database/drivers/pdo/pdo_forge.php */ \ No newline at end of file +/* Location: ./system/database/drivers/pdo/pdo_forge.php */ diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 5b248e9bc38..6feec73533a 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -383,8 +383,7 @@ function count_all($table = '') return 0; } - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - + $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; diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php index 756fd347a34..4a7348aa633 100644 --- a/system/database/drivers/postgre/postgre_forge.php +++ b/system/database/drivers/postgre/postgre_forge.php @@ -88,7 +88,7 @@ function _process_fields($fields, $primary_keys=array()) { $attributes = array_change_key_case($attributes, CASE_UPPER); - $sql .= "\n\t".$this->db->_protect_identifiers($field); + $sql .= "\n\t".$this->db->protect_identifiers($field); $is_unsigned = (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE); @@ -203,10 +203,10 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) if (count($primary_keys) > 0) { - // Something seems to break when passing an array to _protect_identifiers() + // 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); + $primary_keys[$index] = $this->db->protect_identifiers($key); } $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; @@ -220,11 +220,11 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { if (is_array($key)) { - $key = $this->db->_protect_identifiers($key); + $key = $this->db->protect_identifiers($key); } else { - $key = array($this->db->_protect_identifiers($key)); + $key = array($this->db->protect_identifiers($key)); } foreach ($key as $field) @@ -267,19 +267,19 @@ function _drop_table($table) */ function _alter_table($alter_type, $table, $fields, $after_field = '') { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type "; + $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); + 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.' AFTER '.$this->db->protect_identifiers($after_field); } return $sql; @@ -299,10 +299,9 @@ function _alter_table($alter_type, $table, $fields, $after_field = '') */ 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; + return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name); } } /* End of file postgre_forge.php */ -/* Location: ./system/database/drivers/postgre/postgre_forge.php */ \ No newline at end of file +/* Location: ./system/database/drivers/postgre/postgre_forge.php */ diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index 3eaec949cec..91598ab0f07 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -343,8 +343,7 @@ function count_all($table = '') return 0; } - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - + $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; diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php index fd0f3eb9804..4f379d96fca 100644 --- a/system/database/drivers/sqlite/sqlite_forge.php +++ b/system/database/drivers/sqlite/sqlite_forge.php @@ -110,7 +110,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { $attributes = array_change_key_case($attributes, CASE_UPPER); - $sql .= "\n\t".$this->db->_protect_identifiers($field); + $sql .= "\n\t".$this->db->protect_identifiers($field); $sql .= ' '.$attributes['TYPE']; @@ -153,7 +153,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) if (count($primary_keys) > 0) { - $primary_keys = $this->db->_protect_identifiers($primary_keys); + $primary_keys = $this->db->protect_identifiers($primary_keys); $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; } @@ -163,11 +163,11 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { if (is_array($key)) { - $key = $this->db->_protect_identifiers($key); + $key = $this->db->protect_identifiers($key); } else { - $key = array($this->db->_protect_identifiers($key)); + $key = array($this->db->protect_identifiers($key)); } $sql .= ",\n\tUNIQUE (" . implode(', ', $key) . ")"; @@ -218,7 +218,7 @@ function _drop_table($table) */ 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); + $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') @@ -247,7 +247,7 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = '' if ($after_field != '') { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + return $sql.' AFTER '.$this->db->protect_identifiers($after_field); } return $sql; @@ -268,9 +268,9 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = '' */ 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; + return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name); } + } /* End of file sqlite_forge.php */ diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php index 2a77669272f..1521922412b 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -113,7 +113,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { $attributes = array_change_key_case($attributes, CASE_UPPER); - $sql .= "\n\t".$this->db->_protect_identifiers($field); + $sql .= "\n\t".$this->db->protect_identifiers($field); $sql .= ' '.$attributes['TYPE']; @@ -156,7 +156,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) if (count($primary_keys) > 0) { - $primary_keys = $this->db->_protect_identifiers($primary_keys); + $primary_keys = $this->db->protect_identifiers($primary_keys); $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; } @@ -166,11 +166,11 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { if (is_array($key)) { - $key = $this->db->_protect_identifiers($key); + $key = $this->db->protect_identifiers($key); } else { - $key = array($this->db->_protect_identifiers($key)); + $key = array($this->db->protect_identifiers($key)); } $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; @@ -202,7 +202,7 @@ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) */ 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); + $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') @@ -228,7 +228,7 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = '' if ($after_field != '') { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + return $sql.' AFTER '.$this->db->protect_identifiers($after_field); } return $sql; @@ -250,11 +250,10 @@ function _alter_table($alter_type, $table, $column_name, $column_definition = '' 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; + return 'ALTER TABLE '.$this->db->protect_identifiers($table_name).' RENAME TO '.$this->db->protect_identifiers($new_table_name); } } -/* End of file mssql_forge.php */ -/* Location: ./system/database/drivers/mssql/mssql_forge.php */ \ No newline at end of file +/* End of file sqlsrv_forge.php */ +/* Location: ./system/database/drivers/sqlsrv/sqlsrv_forge.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 37016f83296..b5fb52df499 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -64,6 +64,7 @@ Release Date: Not Released - Added _optimize_table() support for the :doc:`Database Utility Class ` (rebuilds table indexes). - Added a constructor to the DB_result class and moved all driver-specific properties and logic out of the base DB_driver class to allow better abstraction. - Removed limit() and order_by() support for UPDATE and DELETE queries in PostgreSQL driver. Postgres does not support those features. + - Removed protect_identifiers() and renamed _protect_identifiers() to it instead - it was just an alias. - Libraries From d1add43b7972f89a89371bb090aea793c72ed7bc Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 6 Mar 2012 20:26:01 +0200 Subject: [PATCH 0581/5397] Property visibility declarations for CI_DB_driver --- system/database/DB_driver.php | 75 ++++++++++++++++------------------- 1 file changed, 35 insertions(+), 40 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 597f5e9a5df..7b8d0870fb6 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -42,47 +42,42 @@ */ class CI_DB_driver { - var $username; - var $password; - var $hostname; - var $database; - var $dbdriver = 'mysql'; - var $dbprefix = ''; - var $char_set = 'utf8'; - var $dbcollat = 'utf8_general_ci'; - var $autoinit = TRUE; // Whether to automatically initialize the DB - var $swap_pre = ''; - var $port = ''; - var $pconnect = FALSE; - var $conn_id = FALSE; - var $result_id = FALSE; - var $db_debug = FALSE; - var $benchmark = 0; - var $query_count = 0; - var $bind_marker = '?'; - var $save_queries = TRUE; - var $queries = array(); - var $query_times = array(); - var $data_cache = array(); - var $trans_enabled = TRUE; - var $trans_strict = TRUE; - var $_trans_depth = 0; - var $_trans_status = TRUE; // Used with transactions to determine if a rollback should occur - var $cache_on = FALSE; - var $cachedir = ''; - var $cache_autodel = FALSE; - var $CACHE; // The cache class object - - // Private variables - var $_protect_identifiers = TRUE; - var $_reserved_identifiers = array('*'); // Identifiers that should NOT be escaped + public $username; + public $password; + public $hostname; + public $database; + public $dbdriver = 'mysql'; + public $dbprefix = ''; + public $char_set = 'utf8'; + public $dbcollat = 'utf8_general_ci'; + public $autoinit = TRUE; // Whether to automatically initialize the DB + public $swap_pre = ''; + public $port = ''; + public $pconnect = FALSE; + public $conn_id = FALSE; + public $result_id = FALSE; + public $db_debug = FALSE; + public $benchmark = 0; + public $query_count = 0; + public $bind_marker = '?'; + public $save_queries = TRUE; + public $queries = array(); + public $query_times = array(); + public $data_cache = array(); + + public $trans_enabled = TRUE; + public $trans_strict = TRUE; + protected $_trans_depth = 0; + protected $_trans_status = TRUE; // Used with transactions to determine if a rollback should occur + + public $cache_on = FALSE; + public $cachedir = ''; + public $cache_autodel = FALSE; + public $CACHE; // The cache class object + + protected $_protect_identifiers = TRUE; + protected $_reserved_identifiers = array('*'); // Identifiers that should NOT be escaped - /** - * Constructor. Accepts one parameter containing the database - * connection settings. - * - * @param array - */ public function __construct($params) { if (is_array($params)) From 4c20260e72a4f2aae21417121a864b34bab51496 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 6 Mar 2012 20:34:52 +0200 Subject: [PATCH 0582/5397] Just some comment fixes and cleared spaces --- system/database/DB_driver.php | 60 ++++++++++++++++------------------- 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 7b8d0870fb6..af496aa7fcb 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1,13 +1,13 @@ -compile_binds($sql, $binds); } - // Is query caching enabled? If the query is a "read type" + // Is query caching enabled? If the query is a "read type" // we will load the caching class and return the previously // cached query if it exists if ($this->cache_on == TRUE AND stristr($sql, 'SELECT')) @@ -439,7 +435,7 @@ public function load_rdriver() /** * Simple Query - * This is a simplified version of the query() function. Internally + * This is a simplified version of the query() function. Internally * we only use it when running transaction commands since they do * not require all the features of the main query() function. * @@ -628,8 +624,8 @@ public function is_write_type($sql) /** * Calculate the aggregate query elapsed time * - * @param integer The number of decimal places - * @return integer + * @param int The number of decimal places + * @return int */ public function elapsed_time($decimals = 6) { @@ -641,7 +637,7 @@ public function elapsed_time($decimals = 6) /** * Returns the total number of queries * - * @return integer + * @return int */ public function total_queries() { @@ -653,7 +649,7 @@ public function total_queries() /** * Returns the last query that was executed * - * @return void + * @return string */ public function last_query() { @@ -710,7 +706,7 @@ public function escape_like_str($str) /** * Primary * - * Retrieves the primary key. It assumes that the row in the first + * Retrieves the primary key. It assumes that the row in the first * position is the primary key * * @param string the table name @@ -773,7 +769,7 @@ public function list_tables($constrain_by_prefix = FALSE) } $this->data_cache['table_names'] = $retval; - + return $this->data_cache['table_names']; } @@ -782,7 +778,7 @@ public function list_tables($constrain_by_prefix = FALSE) /** * Determine if a particular table exists * - * @return boolean + * @return bool */ public function table_exists($table_name) { @@ -849,7 +845,7 @@ public function list_fields($table = '') * * @param string * @param string - * @return boolean + * @return bool */ public function field_exists($field_name, $table_name) { @@ -917,7 +913,7 @@ public function update_string($table, $data, $where) { if ($where == '') { - return false; + return FALSE; } $fields = array(); @@ -1033,7 +1029,7 @@ public function cache_set_path($path = '') /** * Enable Query Caching * - * @return void + * @return bool cache_on value */ public function cache_on() { @@ -1046,7 +1042,7 @@ public function cache_on() /** * Disable Query Caching * - * @return void + * @return bool cache_on value */ public function cache_off() { @@ -1060,7 +1056,7 @@ public function cache_off() /** * Delete the cache files associated with a particular URI * - * @return void + * @return bool */ public function cache_delete($segment_one = '', $segment_two = '') { @@ -1076,7 +1072,7 @@ public function cache_delete($segment_one = '', $segment_two = '') /** * Delete All cache files * - * @return void + * @return bool */ public function cache_delete_all() { @@ -1093,7 +1089,7 @@ public function cache_delete_all() /** * Initialize the Cache Class * - * @return void + * @return bool */ protected function _cache_init() { @@ -1137,7 +1133,7 @@ public function close() * * @param string the error message * @param string any "swap" values - * @param boolean whether to localize the message + * @param bool whether to localize the message * @return string sends the application/error_db.php template */ public function display_error($error = '', $swap = '', $native = FALSE) @@ -1188,7 +1184,7 @@ public function display_error($error = '', $swap = '', $native = FALSE) * a couple functions in this class. * It takes a column or table name (optionally with an alias) and inserts * the table prefix onto it. Some logic is necessary in order to deal with - * column names that include the path. Consider a query like this: + * column names that include the path. Consider a query like this: * * SELECT * FROM hostname.database.table.column AS c FROM hostname.database.table * @@ -1217,7 +1213,6 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden if (is_array($item)) { $escaped_array = array(); - foreach ($item as $k => $v) { $escaped_array[$this->protect_identifiers($k)] = $this->protect_identifiers($v); @@ -1240,7 +1235,7 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden // This is basically a bug fix for queries that use MAX, MIN, etc. // If a parenthesis is found we know that we do not need to - // escape the data or add a prefix. There's probably a more graceful + // escape the data or add a prefix. There's probably a more graceful // way to deal with this, but I'm not thinking of it -- Rick if (strpos($item, '(') !== FALSE) { @@ -1255,7 +1250,7 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden $parts = explode('.', $item); // Does the first segment of the exploded item match - // one of the aliases previously identified? If so, + // one of the aliases previously identified? If so, // we have nothing more to do other than escape the item if (in_array($parts[0], $this->ar_aliased_tables)) { @@ -1274,7 +1269,7 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden return $item.$alias; } - // Is there a table prefix defined in the config file? If not, no need to do anything + // Is there a table prefix defined in the config file? If not, no need to do anything if ($this->dbprefix != '') { // We now add the table prefix based on some logic. @@ -1328,7 +1323,7 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden return $item.$alias; } - // Is there a table prefix? If not, no need to insert it + // Is there a table prefix? If not, no need to insert it if ($this->dbprefix != '') { // Verify table prefix and replace if necessary @@ -1351,7 +1346,7 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden return $item.$alias; } - + // -------------------------------------------------------------------- /** @@ -1363,7 +1358,6 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden */ protected function _reset_select() { - } } From 5d93e13326b86344610cf13008726e40bef0a5b8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 6 Mar 2012 20:36:21 +0200 Subject: [PATCH 0583/5397] Revert a comment change --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 1dc80a10447..482a6c8f35d 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -854,7 +854,7 @@ public function field_exists($field_name, $table_name) * Returns an object with field data * * @param string the table name - * @return mixed + * @return object */ public function field_data($table = '') { From 738f53448fecd1a27c7f89965fbfc47b3bafdb9b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 6 Mar 2012 20:43:40 +0200 Subject: [PATCH 0584/5397] Move dsn property from the PDO to CI_DB_driver so other DB drivers can use it without declaring it --- system/database/DB_driver.php | 1 + system/database/drivers/pdo/pdo_driver.php | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index af496aa7fcb..025441f902f 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -40,6 +40,7 @@ */ class CI_DB_driver { + public $dsn; public $username; public $password; public $hostname; diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index eadb78ffe32..c8732ac3c24 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -59,8 +59,7 @@ class CI_DB_pdo_driver extends CI_DB { var $_count_string = "SELECT COUNT(*) AS "; var $_random_keyword; - // need to track the pdo DSN, driver and options - var $dsn; + // need to track the pdo driver and options var $pdodriver; var $options = array(); From 17c1bedbab426ce383138f2bc720a1134afbe475 Mon Sep 17 00:00:00 2001 From: Jamie Rumbelow Date: Tue, 6 Mar 2012 21:30:38 +0000 Subject: [PATCH 0585/5397] Updating a couple more references to the AR class in documentation [#1061] --- system/database/DB_driver.php | 2 +- system/database/DB_query_builder.php | 40 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index e379755eda2..6a20c001a7d 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1351,7 +1351,7 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden // -------------------------------------------------------------------- /** - * Dummy method that allows Active Record class to be disabled + * Dummy method that allows Query Builder class to be disabled * * This function is used extensively by every db driver. * diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index ab59462b1f8..8cbe7d9f9ea 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1058,7 +1058,7 @@ public function set($key, $value = '', $escape = TRUE) * * @access public * @param string the table name to select from (optional) - * @param boolean TRUE: resets AR values; FALSE: leave AR vaules alone + * @param boolean TRUE: resets QB values; FALSE: leave QB vaules alone * @return string */ public function get_compiled_select($table = '', $reset = TRUE) @@ -1286,7 +1286,7 @@ public function set_insert_batch($key, $value = '', $escape = TRUE) * * @access public * @param string the table to insert into - * @param boolean TRUE: reset AR values; FALSE: leave AR values alone + * @param boolean TRUE: reset QB values; FALSE: leave QB values alone * @return string */ public function get_compiled_insert($table = '', $reset = TRUE) @@ -1431,7 +1431,7 @@ public function replace($table = '', $set = NULL) * * @access public * @param string the table to update - * @param boolean TRUE: reset AR values; FALSE: leave AR values alone + * @param boolean TRUE: reset QB values; FALSE: leave QB values alone * @return string */ public function get_compiled_update($table = '', $reset = TRUE) @@ -1705,7 +1705,7 @@ public function truncate($table = '') * * @access public * @param string the table to delete from - * @param boolean TRUE: reset AR values; FALSE: leave AR values alone + * @param boolean TRUE: reset QB values; FALSE: leave QB values alone * @return string */ public function get_compiled_delete($table = '', $reset = TRUE) @@ -2039,7 +2039,7 @@ public function _object_to_array_batch($object) /** * Start Cache * - * Starts AR caching + * Starts QB caching * * @return void */ @@ -2053,7 +2053,7 @@ public function start_cache() /** * Stop Cache * - * Stops AR caching + * Stops QB caching * * @return void */ @@ -2067,7 +2067,7 @@ public function stop_cache() /** * Flush Cache * - * Empties the AR cache + * Empties the QB cache * * @access public * @return void @@ -2075,17 +2075,17 @@ public function stop_cache() public function flush_cache() { $this->_reset_run(array( - 'ar_cache_select' => array(), - 'ar_cache_from' => array(), - 'ar_cache_join' => array(), - 'ar_cache_where' => array(), - 'ar_cache_like' => array(), - 'ar_cache_groupby' => array(), - 'ar_cache_having' => array(), - 'ar_cache_orderby' => array(), - 'ar_cache_set' => array(), - 'ar_cache_exists' => array(), - 'ar_cache_no_escape' => array() + 'qb_cache_select' => array(), + 'qb_cache_from' => array(), + 'qb_cache_join' => array(), + 'qb_cache_where' => array(), + 'qb_cache_like' => array(), + 'qb_cache_groupby' => array(), + 'qb_cache_having' => array(), + 'qb_cache_orderby' => array(), + 'qb_cache_set' => array(), + 'qb_cache_exists' => array(), + 'qb_cache_no_escape' => array() )); } @@ -2094,7 +2094,7 @@ public function flush_cache() /** * Merge Cache * - * When called, this function merges any cached AR arrays with + * When called, this function merges any cached QB arrays with * locally called ones. * * @return void @@ -2134,7 +2134,7 @@ protected function _merge_cache() /** * Reset Query Builder values. * - * Publicly-visible method to reset the AR values. + * Publicly-visible method to reset the QB values. * * @return void */ From 0c09299363bb27d6a115ee1377167a6bc71e09a7 Mon Sep 17 00:00:00 2001 From: Jamie Rumbelow Date: Tue, 6 Mar 2012 22:05:16 +0000 Subject: [PATCH 0586/5397] accounting for the rename of protect_identifiers --- system/database/DB_driver.php | 4 +-- system/database/DB_query_builder.php | 44 ++++++++++++++-------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 6a20c001a7d..986916964ee 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -74,7 +74,7 @@ class CI_DB_driver { public $cache_autodel = FALSE; public $CACHE; // The cache class object - protected $_protect_identifiers = TRUE; + protected $protect_identifiers = TRUE; protected $_reserved_identifiers = array('*'); // Identifiers that should NOT be escaped public function __construct($params) @@ -1208,7 +1208,7 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden { if ( ! is_bool($protect_identifiers)) { - $protect_identifiers = $this->_protect_identifiers; + $protect_identifiers = $this->protect_identifiers; } if (is_array($item)) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 8cbe7d9f9ea..7691d5eba75 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -212,7 +212,7 @@ protected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') $alias = $this->_create_alias_from_table(trim($select)); } - $sql = $this->_protect_identifiers($type.'('.trim($select).')').' AS '.$this->_protect_identifiers(trim($alias)); + $sql = $this->protect_identifiers($type.'('.trim($select).')').' AS '.$this->protect_identifiers(trim($alias)); $this->qb_select[] = $sql; if ($this->qb_caching === TRUE) @@ -280,7 +280,7 @@ public function from($from) $v = trim($v); $this->_track_aliases($v); - $v = $this->qb_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE); + $v = $this->qb_from[] = $this->protect_identifiers($v, TRUE, NULL, FALSE); if ($this->qb_caching === TRUE) { @@ -294,10 +294,10 @@ public function from($from) $val = trim($val); // Extract any aliases that might exist. We use this information - // in the _protect_identifiers to know whether to add a table prefix + // in the protect_identifiers to know whether to add a table prefix $this->_track_aliases($val); - $this->qb_from[] = $val = $this->_protect_identifiers($val, TRUE, NULL, FALSE); + $this->qb_from[] = $val = $this->protect_identifiers($val, TRUE, NULL, FALSE); if ($this->qb_caching === TRUE) { @@ -339,7 +339,7 @@ public function join($table, $cond, $type = '') } // Extract any aliases that might exist. We use this information - // in the _protect_identifiers to know whether to add a table prefix + // in the protect_identifiers to know whether to add a table prefix $this->_track_aliases($table); // Strip apart the condition and protect the identifiers @@ -349,7 +349,7 @@ public function join($table, $cond, $type = '') } // Assemble the JOIN statement - $this->qb_join[] = $join = $type.'JOIN '.$this->_protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond; + $this->qb_join[] = $join = $type.'JOIN '.$this->protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond; if ($this->qb_caching === TRUE) { @@ -418,7 +418,7 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) // If the escape value was not set will will base it on the global setting if ( ! is_bool($escape)) { - $escape = $this->_protect_identifiers; + $escape = $this->protect_identifiers; } foreach ($key as $k => $v) @@ -564,7 +564,7 @@ protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = } $prefix = (count($this->qb_where) === 0) ? '' : $type; - $this->qb_where[] = $where_in = $prefix.$this->_protect_identifiers($key).$not.' IN ('.implode(', ', $this->qb_wherein).') '; + $this->qb_where[] = $where_in = $prefix.$this->protect_identifiers($key).$not.' IN ('.implode(', ', $this->qb_wherein).') '; if ($this->qb_caching === TRUE) { @@ -668,7 +668,7 @@ protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $n foreach ($field as $k => $v) { - $k = $this->_protect_identifiers($k); + $k = $this->protect_identifiers($k); $prefix = (count($this->qb_like) === 0) ? '' : $type; $v = $this->escape_like_str($v); @@ -829,7 +829,7 @@ public function group_by($by) if ($val != '') { - $this->qb_groupby[] = $val = $this->_protect_identifiers($val); + $this->qb_groupby[] = $val = $this->protect_identifiers($val); if ($this->qb_caching === TRUE) { @@ -1038,11 +1038,11 @@ public function set($key, $value = '', $escape = TRUE) { if ($escape === FALSE) { - $this->qb_set[$this->_protect_identifiers($k)] = $v; + $this->qb_set[$this->protect_identifiers($k)] = $v; } else { - $this->qb_set[$this->_protect_identifiers($k, FALSE, TRUE)] = $this->escape($v); + $this->qb_set[$this->protect_identifiers($k, FALSE, TRUE)] = $this->escape($v); } } @@ -1213,7 +1213,7 @@ public function insert_batch($table = '', $set = NULL) // Batch this baby for ($i = 0, $total = count($this->qb_set); $i < $total; $i += 100) { - $this->query($this->_insert_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, 100))); + $this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, 100))); } $this->_reset_write(); @@ -1271,7 +1271,7 @@ public function set_insert_batch($key, $value = '', $escape = TRUE) foreach ($keys as $k) { - $this->qb_keys[] = $this->_protect_identifiers($k); + $this->qb_keys[] = $this->protect_identifiers($k); } return $this; @@ -1297,7 +1297,7 @@ public function get_compiled_insert($table = '', $reset = TRUE) } $sql = $this->_insert( - $this->_protect_identifiers( + $this->protect_identifiers( $this->qb_from[0], TRUE, NULL, FALSE ), array_keys($this->qb_set), @@ -1337,7 +1337,7 @@ public function insert($table = '', $set = NULL) } $sql = $this->_insert( - $this->_protect_identifiers( + $this->protect_identifiers( $this->qb_from[0], TRUE, NULL, FALSE ), array_keys($this->qb_set), @@ -1416,7 +1416,7 @@ public function replace($table = '', $set = NULL) $table = $this->qb_from[0]; } - $sql = $this->_replace($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->qb_set), array_values($this->qb_set)); + $sql = $this->_replace($this->protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->qb_set), array_values($this->qb_set)); $this->_reset_write(); return $this->query($sql); @@ -1444,7 +1444,7 @@ public function get_compiled_update($table = '', $reset = TRUE) return FALSE; } - $sql = $this->_update($this->_protect_identifiers($this->qb_from[0], TRUE, NULL, FALSE), $this->qb_set, $this->qb_where, $this->qb_orderby, $this->qb_limit); + $sql = $this->_update($this->protect_identifiers($this->qb_from[0], TRUE, NULL, FALSE), $this->qb_set, $this->qb_where, $this->qb_orderby, $this->qb_limit); if ($reset === TRUE) { @@ -1491,7 +1491,7 @@ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) $this->limit($limit); } - $sql = $this->_update($this->_protect_identifiers($this->qb_from[0], TRUE, NULL, FALSE), $this->qb_set, $this->qb_where, $this->qb_orderby, $this->qb_limit, $this->qb_like); + $sql = $this->_update($this->protect_identifiers($this->qb_from[0], TRUE, NULL, FALSE), $this->qb_set, $this->qb_where, $this->qb_orderby, $this->qb_limit, $this->qb_like); $this->_reset_write(); return $this->query($sql); @@ -1577,7 +1577,7 @@ public function update_batch($table = '', $set = NULL, $index = NULL) // Batch this baby for ($i = 0, $total = count($this->qb_set); $i < $total; $i += 100) { - $this->query($this->_update_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, 100), $this->_protect_identifiers($index), $this->qb_where)); + $this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, 100), $this->protect_identifiers($index), $this->qb_where)); } $this->_reset_write(); @@ -1898,7 +1898,7 @@ protected function _compile_select($select_override = FALSE) foreach ($this->qb_select as $key => $val) { $no_escape = isset($this->qb_no_escape[$key]) ? $this->qb_no_escape[$key] : NULL; - $this->qb_select[$key] = $this->_protect_identifiers($val, FALSE, $no_escape); + $this->qb_select[$key] = $this->protect_identifiers($val, FALSE, $no_escape); } $sql .= implode(', ', $this->qb_select); @@ -2121,7 +2121,7 @@ protected function _merge_cache() // If we are "protecting identifiers" we need to examine the "from" // portion of the query to determine if there are any aliases - if ($this->_protect_identifiers === TRUE AND count($this->qb_cache_from) > 0) + if ($this->protect_identifiers === TRUE AND count($this->qb_cache_from) > 0) { $this->_track_aliases($this->qb_from); } From 1d571971be8be78a92d31aad27dda4009770043f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 7 Mar 2012 11:49:35 +0200 Subject: [PATCH 0587/5397] Update the example on extending libraries with a constructor --- .../source/general/creating_libraries.rst | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/user_guide_src/source/general/creating_libraries.rst b/user_guide_src/source/general/creating_libraries.rst index bc545b483c7..673fbd4bbba 100644 --- a/user_guide_src/source/general/creating_libraries.rst +++ b/user_guide_src/source/general/creating_libraries.rst @@ -188,17 +188,23 @@ application/libraries/MY_Email.php, and declare your class with:: } -Note: If you need to use a constructor in your class make sure you +If you need to use a constructor in your class make sure you extend the parent constructor:: class MY_Email extends CI_Email { - public function __construct() - { - parent::__construct(); - } + public function __construct($config = array()) + { + parent::__construct($config); + } + } +.. note:: + Not all of the libraries have the same (or any) parameters + in their constructor. Take a look at the library that you're + extending first to see how it should be implemented. + Loading Your Sub-class ---------------------- From be0ca26c9006981eced5d938060ba5bad4145e3b Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Wed, 7 Mar 2012 19:09:51 +0100 Subject: [PATCH 0588/5397] added method() and is_method() --- system/core/Input.php | 29 +++++++++++++++++++++ user_guide_src/source/changelog.rst | 2 ++ user_guide_src/source/libraries/input.rst | 31 ++++++++++++++++++++--- 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index ee15f4013e4..e8e3b1d9c90 100755 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -699,6 +699,35 @@ public function is_cli_request() return (php_sapi_name() === 'cli' OR defined('STDIN')); } + // -------------------------------------------------------------------- + + /** + * Get Request Method + * + * Return the Request Method in lowercase + * + * @return mixed + */ + public function method() + { + return strtolower($this->server('REQUEST_METHOD')); + } + + // -------------------------------------------------------------------- + + /** + * Validate parameter against $_SERVER['REQUEST_METHOD'] + * + * Return TRUE if method equals $_SERVER['REQUEST_METHOD'], otherwise return FALSE + * + * @param string request method to match + * @return bool + */ + public function is_method($method = '') + { + return ($this->method() === strtolower($method)); + } + } /* End of file Input.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b5fb52df499..f8c4ba144b8 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -97,6 +97,8 @@ Release Date: Not Released - Added method get_vars() to CI_Loader to retrieve all variables loaded with $this->load->vars(). - is_loaded() function from system/core/Commons.php now returns a reference. - $config['rewrite_short_tags'] now has no effect when using PHP 5.4 as *input->post(NULL, TRUE); // returns all POST items with XSS filter + $this->input->post(NULL, TRUE); // returns all POST items with XSS filter $this->input->post(); // returns all POST items without XSS filter $this->input->get() @@ -119,9 +119,9 @@ The function returns FALSE (boolean) if there are no items in the GET. :: - $this->input->get(NULL, TRUE); // returns all GET items with XSS filter + $this->input->get(NULL, TRUE); // returns all GET items with XSS filter $this->input->get(); // returns all GET items without XSS filtering - + $this->input->get_post() ========================= @@ -298,3 +298,28 @@ see if PHP is being run on the command line. $this->input->is_cli_request() +$this->input->method(); +===================================== + +Returns the $_SERVER['REQUEST_METHOD'] in lowercase. + +:: + + $this->input->method(); + +$this->input->is_method($method); +===================================== + +Returns TRUE if given method equals $_SERVER['REQUEST_METHOD'], otherwise returns FALSE. + +:: + + if ( ! $this->input->is_method('post')) + { + echo 'This is NOT a POST request'; + } + else + { + echo 'This is a POST request'; + } + From dc900df67972ed1c961fc3e4173db98047bdbd1b Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Wed, 7 Mar 2012 20:41:37 +0100 Subject: [PATCH 0589/5397] removed is_method --- system/core/Input.php | 24 ++++++----------------- user_guide_src/source/changelog.rst | 3 +-- user_guide_src/source/libraries/input.rst | 23 ++++------------------ 3 files changed, 11 insertions(+), 39 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index e8e3b1d9c90..65de8c82446 100755 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -704,28 +704,16 @@ public function is_cli_request() /** * Get Request Method * - * Return the Request Method in lowercase + * Return the Request Method * + * @param bool uppercase or lowercase * @return mixed */ - public function method() + public function method($upper = TRUE) { - return strtolower($this->server('REQUEST_METHOD')); - } - - // -------------------------------------------------------------------- - - /** - * Validate parameter against $_SERVER['REQUEST_METHOD'] - * - * Return TRUE if method equals $_SERVER['REQUEST_METHOD'], otherwise return FALSE - * - * @param string request method to match - * @return bool - */ - public function is_method($method = '') - { - return ($this->method() === strtolower($method)); + return ($upper) + ? strtoupper($this->server('REQUEST_METHOD')) + : strtolower($this->server('REQUEST_METHOD')); } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f8c4ba144b8..58a4cb76b42 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -97,8 +97,7 @@ Release Date: Not Released - Added method get_vars() to CI_Loader to retrieve all variables loaded with $this->load->vars(). - is_loaded() function from system/core/Commons.php now returns a reference. - $config['rewrite_short_tags'] now has no effect when using PHP 5.4 as *input->method(); ===================================== -Returns the $_SERVER['REQUEST_METHOD'] in lowercase. +Returns the $_SERVER['REQUEST_METHOD'], optional set uppercase or lowercase (standard lowercase). :: - $this->input->method(); - -$this->input->is_method($method); -===================================== - -Returns TRUE if given method equals $_SERVER['REQUEST_METHOD'], otherwise returns FALSE. - -:: - - if ( ! $this->input->is_method('post')) - { - echo 'This is NOT a POST request'; - } - else - { - echo 'This is a POST request'; - } - + echo $this->input->method(TRUE); // Outputs: POST + echo $this->input->method(FALSE); // Outputs: post + echo $this->input->method(); // Outputs: post From 704fb1697f0db2369a9395c362c931999c8831f1 Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Wed, 7 Mar 2012 20:42:33 +0100 Subject: [PATCH 0590/5397] oops --- system/core/Input.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Input.php b/system/core/Input.php index 65de8c82446..79910890ed5 100755 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -709,7 +709,7 @@ public function is_cli_request() * @param bool uppercase or lowercase * @return mixed */ - public function method($upper = TRUE) + public function method($upper = FALSE) { return ($upper) ? strtoupper($this->server('REQUEST_METHOD')) From 7c8841f7b2fca5822e05b5d3044c748e07c800e4 Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Wed, 7 Mar 2012 20:49:06 +0100 Subject: [PATCH 0591/5397] comment fix --- system/core/Input.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Input.php b/system/core/Input.php index 79910890ed5..5a4659a5a22 100755 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -707,7 +707,7 @@ public function is_cli_request() * Return the Request Method * * @param bool uppercase or lowercase - * @return mixed + * @return bool */ public function method($upper = FALSE) { From 1e9fb49a9eb5cebbe2e3cdf106892d9af72cfdc5 Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Wed, 7 Mar 2012 20:51:25 +0100 Subject: [PATCH 0592/5397] userguide fix --- user_guide_src/source/libraries/input.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/input.rst b/user_guide_src/source/libraries/input.rst index c63c627db9e..1f2ea650a4a 100644 --- a/user_guide_src/source/libraries/input.rst +++ b/user_guide_src/source/libraries/input.rst @@ -301,7 +301,7 @@ see if PHP is being run on the command line. $this->input->method(); ===================================== -Returns the $_SERVER['REQUEST_METHOD'], optional set uppercase or lowercase (standard lowercase). +Returns the $_SERVER['REQUEST_METHOD'], optional set uppercase or lowercase (default lowercase). :: From c2659b8e91afd0af69b371c0ad92e6b1be99a5e9 Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Wed, 7 Mar 2012 21:34:52 +0100 Subject: [PATCH 0593/5397] fix + style fix --- system/helpers/captcha_helper.php | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 668b034d491..4a48df27eac 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -5,9 +5,9 @@ * An open source application development framework for PHP 5.1.6 or newer * * NOTICE OF LICENSE - * + * * Licensed under the Open Software License version 3.0 - * + * * This source file is subject to the Open Software License (OSL 3.0) that is * bundled with this package in the files license.txt / license.rst. It is * also available through the world wide web at this URL: @@ -94,16 +94,15 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = // Remove old images // ----------------------------------- - list($usec, $sec) = explode(" ", microtime()); - $now = ((float)$usec + (float)$sec); + $now = microtime(TRUE); $current_dir = @opendir($img_path); while ($filename = @readdir($current_dir)) { - if ($filename != "." and $filename != ".." and $filename != "index.html") + if ($filename != '.' && $filename != '..' && $filename != 'index.html') { - $name = str_replace(".jpg", "", $filename); + $name = str_replace('.jpg', '', $filename); if (($name + $expiration) < $now) { @@ -198,7 +197,7 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = // Write the text // ----------------------------------- - $use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE; + $use_font = ($font_path != '' && file_exists($font_path) && function_exists('imagettftext')) ? TRUE : FALSE; if ($use_font == FALSE) { From 3b2c5083034675d88d9e516b5c5aca5119d6f918 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 7 Mar 2012 22:49:24 +0200 Subject: [PATCH 0594/5397] Fix issue #501 --- system/libraries/Form_validation.php | 20 +++++++++----------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index cdb3d3d627a..bd8b7c2167a 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -65,7 +65,7 @@ public function __construct($rules = array()) mb_internal_encoding($this->CI->config->item('charset')); } - log_message('debug', "Form Validation Class Initialized"); + log_message('debug', 'Form Validation Class Initialized'); } // -------------------------------------------------------------------- @@ -84,7 +84,7 @@ public function set_rules($field, $label = '', $rules = '') { // No reason to set rules if we have no POST data // or a validation array has not been specified - if (count($_POST) === 0 && count($this->validation_data) === 0) + if ($this->CI->input->method() !== 'post' && empty($this->validation_data)) { return $this; } @@ -165,9 +165,9 @@ public function set_rules($field, $label = '', $rules = '') * * If an array is set through this method, then this array will * be used instead of the $_POST array - * - * Note that if you are validating multiple arrays, then the - * reset_validation() function should be called after validating + * + * Note that if you are validating multiple arrays, then the + * reset_validation() function should be called after validating * each array due to the limitations of CI's singleton * * @param array $data @@ -1156,15 +1156,14 @@ public function greater_than($str, $min) } // -------------------------------------------------------------------- - + /** * Equal to or Greater than * - * @access public * @param string * @return bool */ - function greater_than_equal_to($str, $min) + public function greater_than_equal_to($str, $min) { if ( ! is_numeric($str)) { @@ -1195,11 +1194,10 @@ public function less_than($str, $max) /** * Equal to or Less than * - * @access public * @param string * @return bool */ - function less_than_equal_to($str, $max) + public function less_than_equal_to($str, $max) { if ( ! is_numeric($str)) { @@ -1351,7 +1349,7 @@ public function encode_php_tags($str) * Prevents subsequent validation routines from being affected by the * results of any previous validation routine due to the CI singleton. * - * @return void + * @return void */ public function reset_validation() { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 58a4cb76b42..4c6fd38bcb8 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -147,6 +147,7 @@ Bug fixes for 3.0 - Fixed a bug in Oracle's DB_result class where the cursor id passed to it was always NULL. - Fixed a bug (#64) - Regular expression in DB_active_rec.php failed to handle queries containing SQL bracket delimiters in the join condition. - Fixed a bug in the :doc:`Session Library ` where a PHP E_NOTICE error was triggered by _unserialize() due to results from databases such as MSSQL and Oracle being space-padded on the right. +- Fixed a bug (#501) - set_rules() to check if the request method is not 'POST' before aborting, instead of depending on count($_POST) in the :doc:`Form Validation Library `. Version 2.1.1 ============= From fd15423734b23ce1f10a24b6fc57f6b16a3b361b Mon Sep 17 00:00:00 2001 From: Mike Funk Date: Wed, 7 Mar 2012 19:58:58 -0500 Subject: [PATCH 0595/5397] Fixed bug with rules not being passed to _config_delimiters or back into $this->_config_rules. --- system/libraries/Form_validation.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index f2f3712d97c..f3535b22554 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -54,7 +54,7 @@ public function __construct($rules = array()) $this->CI =& get_instance(); // applies delimiters set in config file. - $this->_config_delimiters(); + $rules = $this->_config_delimiters($rules); // Validation rules can be stored in a config file. $this->_config_rules = $rules; @@ -76,9 +76,10 @@ public function __construct($rules = array()) /** * if prefixes/suffixes set in config, assign and unset. * - * @return void + * @param array + * @return array */ - protected function _config_delimiters() + protected function _config_delimiters($rules) { if (isset($rules['error_prefix'])) { @@ -90,6 +91,7 @@ protected function _config_delimiters() $this->_error_suffix = $rules['error_suffix']; unset($rules['error_suffix']); } + return $rules; } // -------------------------------------------------------------------- From 5d27c43d29fc049497010ea62ac7877a64bfed92 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 8 Mar 2012 12:01:52 +0200 Subject: [PATCH 0596/5397] Fix issue #940 --- system/core/Security.php | 4 ++-- user_guide_src/source/changelog.rst | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/system/core/Security.php b/system/core/Security.php index 6f25fb5bb26..2bffa41b71b 100755 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -138,8 +138,8 @@ public function __construct() */ public function csrf_verify() { - // If no POST data exists we will set the CSRF cookie - if (count($_POST) === 0) + // If it's not a POST request we will set the CSRF cookie + if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST') { return $this->csrf_set_cookie(); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4c6fd38bcb8..587c64c5aa9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -148,6 +148,7 @@ Bug fixes for 3.0 - Fixed a bug (#64) - Regular expression in DB_active_rec.php failed to handle queries containing SQL bracket delimiters in the join condition. - Fixed a bug in the :doc:`Session Library ` where a PHP E_NOTICE error was triggered by _unserialize() due to results from databases such as MSSQL and Oracle being space-padded on the right. - Fixed a bug (#501) - set_rules() to check if the request method is not 'POST' before aborting, instead of depending on count($_POST) in the :doc:`Form Validation Library `. +- Fixed a bug (#940) - csrf_verify() used to set the CSRF cookie while processing a POST request with no actual POST data, which resulted in validating a request that should be considered invalid. Version 2.1.1 ============= From 0cd8c798de4b99b5ad41bacdeef77a4a7b815a03 Mon Sep 17 00:00:00 2001 From: Jamie Rumbelow Date: Thu, 8 Mar 2012 12:52:24 +0000 Subject: [PATCH 0597/5397] Just the method, not the property --- system/database/DB_driver.php | 2 +- system/database/DB_query_builder.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 986916964ee..9e1c605ec52 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1208,7 +1208,7 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden { if ( ! is_bool($protect_identifiers)) { - $protect_identifiers = $this->protect_identifiers; + $protect_identifiers = $this->_protect_identifiers; } if (is_array($item)) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 7691d5eba75..8979dc15b72 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -418,7 +418,7 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) // If the escape value was not set will will base it on the global setting if ( ! is_bool($escape)) { - $escape = $this->protect_identifiers; + $escape = $this->_protect_identifiers; } foreach ($key as $k => $v) @@ -2121,7 +2121,7 @@ protected function _merge_cache() // If we are "protecting identifiers" we need to examine the "from" // portion of the query to determine if there are any aliases - if ($this->protect_identifiers === TRUE AND count($this->qb_cache_from) > 0) + if ($this->_protect_identifiers === TRUE AND count($this->qb_cache_from) > 0) { $this->_track_aliases($this->qb_from); } From bcee50ff3247dee71d83bf273e52bc10096cd48c Mon Sep 17 00:00:00 2001 From: Jamie Rumbelow Date: Thu, 8 Mar 2012 13:00:15 +0000 Subject: [PATCH 0598/5397] missed one :bomb: --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 9e1c605ec52..6a20c001a7d 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -74,7 +74,7 @@ class CI_DB_driver { public $cache_autodel = FALSE; public $CACHE; // The cache class object - protected $protect_identifiers = TRUE; + protected $_protect_identifiers = TRUE; protected $_reserved_identifiers = array('*'); // Identifiers that should NOT be escaped public function __construct($params) From 7f42d060fb828bfb0bd857ad1a17b91070e52628 Mon Sep 17 00:00:00 2001 From: Mike Funk Date: Thu, 8 Mar 2012 09:00:57 -0500 Subject: [PATCH 0599/5397] moved delimiter assigning to constructor, removed extra function. --- system/libraries/Form_validation.php | 34 ++++++++-------------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index f3535b22554..3e16d69ed43 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -54,7 +54,16 @@ public function __construct($rules = array()) $this->CI =& get_instance(); // applies delimiters set in config file. - $rules = $this->_config_delimiters($rules); + if (isset($rules['error_prefix'])) + { + $this->_error_prefix = $rules['error_prefix']; + unset($rules['error_prefix']); + } + if (isset($rules['error_suffix'])) + { + $this->_error_suffix = $rules['error_suffix']; + unset($rules['error_suffix']); + } // Validation rules can be stored in a config file. $this->_config_rules = $rules; @@ -70,29 +79,6 @@ public function __construct($rules = array()) log_message('debug', "Form Validation Class Initialized"); } - - // -------------------------------------------------------------------- - - /** - * if prefixes/suffixes set in config, assign and unset. - * - * @param array - * @return array - */ - protected function _config_delimiters($rules) - { - if (isset($rules['error_prefix'])) - { - $this->_error_prefix = $rules['error_prefix']; - unset($rules['error_prefix']); - } - if (isset($rules['error_suffix'])) - { - $this->_error_suffix = $rules['error_suffix']; - unset($rules['error_suffix']); - } - return $rules; - } // -------------------------------------------------------------------- From c016a1102e2a77e0c27b9656c19a0460df24dfb6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 9 Mar 2012 00:13:42 +0200 Subject: [PATCH 0600/5397] Fix documentation entry for the decimal form validation rule (issue #1149) --- user_guide_src/source/libraries/form_validation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 5aa64d03243..39b389f09c6 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -869,7 +869,7 @@ Rule Parameter Description underscores or dashes. **numeric** No Returns FALSE if the form element contains anything other than numeric characters. **integer** No Returns FALSE if the form element contains anything other than an integer. -**decimal** Yes Returns FALSE if the form element is not exactly the parameter value. +**decimal** No Returns FALSE if the form element contains anything other than a decimal number. **is_natural** No Returns FALSE if the form element contains anything other than a natural number: 0, 1, 2, 3, etc. **is_natural_no_zero** No Returns FALSE if the form element contains anything other than a natural From a03cbc5d2d2747b48be47c6fdef51f338701c583 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 9 Mar 2012 17:00:56 +0700 Subject: [PATCH 0601/5397] Add tiyowan suggestion #1147 --- phpunit.xml | 13 +++++++++++++ tests/Bootstrap.php | 10 ---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/phpunit.xml b/phpunit.xml index aca7809cc04..2ae7ba3b867 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -22,4 +22,17 @@ + + + PEAR_INSTALL_DIR + PHP_LIBDIR + PROJECT_BASE.'tests' + '../system/core/CodeIgniter.php' + + + + + \ No newline at end of file diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index 28c63f0b20d..94dafdce401 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -17,14 +17,4 @@ require_once $dir.'/lib/common.php'; require_once $dir.'/lib/ci_testcase.php'; - -// Omit files in the PEAR & PHP Paths from ending up in the coverage report -// PHP_CodeCoverage_Filter::getInstance()->addDirectoryToBlacklist(PEAR_INSTALL_DIR); -// PHP_CodeCoverage_Filter::getInstance()->addDirectoryToBlacklist(PHP_LIBDIR); -// PHP_CodeCoverage_Filter::getInstance()->addDirectoryToBlacklist(PROJECT_BASE.'tests'); - -// Omit Tests from the coverage reports. -// PHP_CodeCoverage_Filter::getInstance()->addDirectoryToWhiteList('../system/core'); -// PHP_CodeCoverage_Filter::getInstance()->addFileToBlackList('../system/core/CodeIgniter.php'); - unset($dir); \ No newline at end of file From 5e18e891a14400a96f9b4af36925457b79b62005 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 9 Mar 2012 14:25:00 +0200 Subject: [PATCH 0602/5397] Fix an eventual issue with LIKE escaping --- system/database/drivers/odbc/odbc_driver.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 01515221b6c..47d3a340b95 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -232,14 +232,13 @@ public function escape_str($str, $like = FALSE) return $str; } - // ODBC doesn't require escaping $str = remove_invisible_characters($str); // escape LIKE condition wildcards if ($like === TRUE) { - return str_replace(array('%', '_', $this->_like_escape_chr), - array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), + return 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); } From 0aa9f2e86124194cd64fde098ba7a4169625d353 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 9 Mar 2012 14:55:20 +0200 Subject: [PATCH 0603/5397] _protect_identifiers() to protect_identifier() --- system/database/drivers/sqlite3/sqlite3_driver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index 0db366eb3f9..6affb8745b5 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -303,8 +303,8 @@ public function count_all($table = '') return 0; } - $result = $this->conn_id->querySingle($this->_count_string.$this->_protect_identifiers('numrows') - .' FROM '.$this->_protect_identifiers($table, TRUE, NULL, FALSE)); + $result = $this->conn_id->querySingle($this->_count_string.$this->protect_identifiers('numrows') + .' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE)); return empty($result) ? 0 : (int) $result; } From 07c1ac830b4e98aa40f48baef3dd05fb68c0a836 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Fri, 9 Mar 2012 17:03:37 +0000 Subject: [PATCH 0604/5397] Bumped CodeIgniter's PHP requirement to 5.2.4. Yes I know PHP 5.4 just came out, and yes I know PHP 5.3 has lovely features, but there are plenty of corporate systems running on CodeIgniter and PHP 5.3 still is not widely supported enough. CodeIgniter is great for distributed applications, and this is the highest we can reasonably go without breaking support. PHP 5.3 will most likely happen in another year or so. Fingers crossed on that one anyway... --- application/config/autoload.php | 2 +- application/config/config.php | 2 +- application/config/constants.php | 2 +- application/config/database.php | 2 +- application/config/doctypes.php | 2 +- application/config/foreign_chars.php | 2 +- application/config/hooks.php | 2 +- application/config/memcached.php | 2 +- application/config/migration.php | 2 +- application/config/mimes.php | 2 +- application/config/profiler.php | 2 +- application/config/routes.php | 2 +- application/config/smileys.php | 2 +- application/config/user_agents.php | 2 +- application/controllers/welcome.php | 2 +- application/errors/error_404.php | 2 +- application/errors/error_db.php | 2 +- application/errors/error_general.php | 2 +- application/errors/error_php.php | 2 +- application/views/welcome_message.php | 2 +- index.php | 2 +- readme.rst | 8 ++++---- system/core/Benchmark.php | 2 +- system/core/CodeIgniter.php | 2 +- system/core/Common.php | 2 +- system/core/Config.php | 2 +- system/core/Controller.php | 2 +- system/core/Exceptions.php | 2 +- system/core/Hooks.php | 2 +- system/core/Input.php | 2 +- system/core/Lang.php | 2 +- system/core/Loader.php | 2 +- system/core/Model.php | 2 +- system/core/Output.php | 2 +- system/core/Router.php | 2 +- system/core/Security.php | 2 +- system/core/URI.php | 2 +- system/core/Utf8.php | 2 +- system/database/DB.php | 2 +- system/database/DB_active_rec.php | 2 +- system/database/DB_cache.php | 2 +- system/database/DB_driver.php | 2 +- system/database/DB_forge.php | 2 +- system/database/DB_result.php | 2 +- system/database/DB_utility.php | 2 +- system/database/drivers/cubrid/cubrid_driver.php | 2 +- system/database/drivers/cubrid/cubrid_forge.php | 2 +- system/database/drivers/cubrid/cubrid_result.php | 2 +- system/database/drivers/cubrid/cubrid_utility.php | 2 +- system/database/drivers/interbase/interbase_driver.php | 2 +- system/database/drivers/interbase/interbase_forge.php | 2 +- system/database/drivers/interbase/interbase_result.php | 2 +- system/database/drivers/interbase/interbase_utility.php | 2 +- system/database/drivers/mssql/mssql_driver.php | 2 +- system/database/drivers/mssql/mssql_forge.php | 2 +- system/database/drivers/mssql/mssql_result.php | 2 +- system/database/drivers/mssql/mssql_utility.php | 2 +- system/database/drivers/mysql/mysql_driver.php | 2 +- system/database/drivers/mysql/mysql_forge.php | 2 +- system/database/drivers/mysql/mysql_result.php | 2 +- system/database/drivers/mysql/mysql_utility.php | 2 +- system/database/drivers/mysqli/mysqli_driver.php | 2 +- system/database/drivers/mysqli/mysqli_forge.php | 2 +- system/database/drivers/mysqli/mysqli_result.php | 2 +- system/database/drivers/mysqli/mysqli_utility.php | 2 +- system/database/drivers/oci8/oci8_driver.php | 2 +- system/database/drivers/oci8/oci8_forge.php | 2 +- system/database/drivers/oci8/oci8_result.php | 2 +- system/database/drivers/oci8/oci8_utility.php | 2 +- system/database/drivers/odbc/odbc_driver.php | 2 +- system/database/drivers/odbc/odbc_forge.php | 2 +- system/database/drivers/odbc/odbc_result.php | 2 +- system/database/drivers/odbc/odbc_utility.php | 2 +- system/database/drivers/pdo/pdo_driver.php | 2 +- system/database/drivers/pdo/pdo_forge.php | 2 +- system/database/drivers/pdo/pdo_result.php | 2 +- system/database/drivers/pdo/pdo_utility.php | 2 +- system/database/drivers/postgre/postgre_driver.php | 2 +- system/database/drivers/postgre/postgre_forge.php | 2 +- system/database/drivers/postgre/postgre_result.php | 2 +- system/database/drivers/postgre/postgre_utility.php | 2 +- system/database/drivers/sqlite/sqlite_driver.php | 2 +- system/database/drivers/sqlite/sqlite_forge.php | 2 +- system/database/drivers/sqlite/sqlite_result.php | 2 +- system/database/drivers/sqlite/sqlite_utility.php | 2 +- system/database/drivers/sqlsrv/sqlsrv_driver.php | 2 +- system/database/drivers/sqlsrv/sqlsrv_forge.php | 2 +- system/database/drivers/sqlsrv/sqlsrv_result.php | 2 +- system/database/drivers/sqlsrv/sqlsrv_utility.php | 2 +- system/helpers/array_helper.php | 2 +- system/helpers/captcha_helper.php | 2 +- system/helpers/cookie_helper.php | 2 +- system/helpers/date_helper.php | 2 +- system/helpers/directory_helper.php | 2 +- system/helpers/download_helper.php | 2 +- system/helpers/email_helper.php | 2 +- system/helpers/file_helper.php | 2 +- system/helpers/form_helper.php | 2 +- system/helpers/html_helper.php | 2 +- system/helpers/inflector_helper.php | 2 +- system/helpers/language_helper.php | 2 +- system/helpers/number_helper.php | 2 +- system/helpers/path_helper.php | 2 +- system/helpers/security_helper.php | 2 +- system/helpers/smiley_helper.php | 2 +- system/helpers/string_helper.php | 2 +- system/helpers/text_helper.php | 2 +- system/helpers/typography_helper.php | 2 +- system/helpers/url_helper.php | 2 +- system/helpers/xml_helper.php | 2 +- system/language/english/calendar_lang.php | 2 +- system/language/english/date_lang.php | 2 +- system/language/english/db_lang.php | 2 +- system/language/english/email_lang.php | 2 +- system/language/english/form_validation_lang.php | 2 +- system/language/english/ftp_lang.php | 2 +- system/language/english/imglib_lang.php | 2 +- system/language/english/migration_lang.php | 2 +- system/language/english/number_lang.php | 2 +- system/language/english/profiler_lang.php | 2 +- system/language/english/unit_test_lang.php | 2 +- system/language/english/upload_lang.php | 2 +- system/libraries/Cache/Cache.php | 2 +- system/libraries/Cache/drivers/Cache_apc.php | 2 +- system/libraries/Cache/drivers/Cache_dummy.php | 2 +- system/libraries/Cache/drivers/Cache_file.php | 2 +- system/libraries/Cache/drivers/Cache_memcached.php | 2 +- system/libraries/Calendar.php | 2 +- system/libraries/Cart.php | 2 +- system/libraries/Driver.php | 2 +- system/libraries/Email.php | 2 +- system/libraries/Encrypt.php | 2 +- system/libraries/Form_validation.php | 2 +- system/libraries/Ftp.php | 2 +- system/libraries/Image_lib.php | 2 +- system/libraries/Javascript.php | 2 +- system/libraries/Log.php | 2 +- system/libraries/Migration.php | 2 +- system/libraries/Pagination.php | 2 +- system/libraries/Parser.php | 2 +- system/libraries/Profiler.php | 2 +- system/libraries/Session.php | 2 +- system/libraries/Table.php | 2 +- system/libraries/Trackback.php | 2 +- system/libraries/Typography.php | 2 +- system/libraries/Unit_test.php | 2 +- system/libraries/Upload.php | 2 +- system/libraries/User_agent.php | 2 +- system/libraries/Xmlrpc.php | 2 +- system/libraries/Xmlrpcs.php | 2 +- system/libraries/Zip.php | 2 +- system/libraries/javascript/Jquery.php | 2 +- user_guide_src/cilexer/cilexer/cilexer.py | 2 +- .../source/_themes/eldocs/static/asset/css/common.css | 2 +- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/general/requirements.rst | 4 ++-- user_guide_src/source/installation/upgrade_200.rst | 2 +- 157 files changed, 161 insertions(+), 160 deletions(-) diff --git a/application/config/autoload.php b/application/config/autoload.php index db49ca1092c..e8c999334fd 100644 --- a/application/config/autoload.php +++ b/application/config/autoload.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/config.php b/application/config/config.php index 17b854b29b7..4ad9d1d6a10 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/constants.php b/application/config/constants.php index c7203e47dfb..fce10132029 100644 --- a/application/config/constants.php +++ b/application/config/constants.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/database.php b/application/config/database.php index bd68db1d878..154638d1fb7 100644 --- a/application/config/database.php +++ b/application/config/database.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/doctypes.php b/application/config/doctypes.php index 984da596512..e5e70daf6b4 100644 --- a/application/config/doctypes.php +++ b/application/config/doctypes.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/foreign_chars.php b/application/config/foreign_chars.php index 1ae0cef5f76..d3713fe988d 100644 --- a/application/config/foreign_chars.php +++ b/application/config/foreign_chars.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/hooks.php b/application/config/hooks.php index 80269df5937..1b10fc27d79 100644 --- a/application/config/hooks.php +++ b/application/config/hooks.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/memcached.php b/application/config/memcached.php index 2b1a7726647..7166b70ba3d 100644 --- a/application/config/memcached.php +++ b/application/config/memcached.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/migration.php b/application/config/migration.php index 668c3574059..e1ce1ae6f38 100644 --- a/application/config/migration.php +++ b/application/config/migration.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/mimes.php b/application/config/mimes.php index d69497a30f6..7ec782b604a 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/profiler.php b/application/config/profiler.php index f956142416e..53391892d41 100644 --- a/application/config/profiler.php +++ b/application/config/profiler.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/routes.php b/application/config/routes.php index 53fc7e7997e..686573deba2 100644 --- a/application/config/routes.php +++ b/application/config/routes.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/smileys.php b/application/config/smileys.php index 4132aed2f73..8e3844a89d3 100644 --- a/application/config/smileys.php +++ b/application/config/smileys.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/config/user_agents.php b/application/config/user_agents.php index e7a689402ad..0baa25220b8 100644 --- a/application/config/user_agents.php +++ b/application/config/user_agents.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/controllers/welcome.php b/application/controllers/welcome.php index 5eb0e962585..2451d9776c6 100644 --- a/application/controllers/welcome.php +++ b/application/controllers/welcome.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/errors/error_404.php b/application/errors/error_404.php index 4dd8fc407d2..9af9e39dec6 100644 --- a/application/errors/error_404.php +++ b/application/errors/error_404.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/errors/error_db.php b/application/errors/error_db.php index 130ffc11dae..81ff02adb74 100644 --- a/application/errors/error_db.php +++ b/application/errors/error_db.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/errors/error_general.php b/application/errors/error_general.php index 2a844a8e2a9..8efcfd9919e 100644 --- a/application/errors/error_general.php +++ b/application/errors/error_general.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/errors/error_php.php b/application/errors/error_php.php index 8e293cd5ecc..42e5f5a28f2 100644 --- a/application/errors/error_php.php +++ b/application/errors/error_php.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/application/views/welcome_message.php b/application/views/welcome_message.php index acc36b6d443..0dd892441ba 100644 --- a/application/views/welcome_message.php +++ b/application/views/welcome_message.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/index.php b/index.php index a3782669066..5a11901121b 100644 --- a/index.php +++ b/index.php @@ -2,7 +2,7 @@ /** * CodeIgniter * - * An open source application development framework for PHP 5.1.6 or newer + * An open source application development framework for PHP 5.2.4 or newer * * NOTICE OF LICENSE * diff --git a/readme.rst b/readme.rst index 2369a8ddb51..4707847c7ef 100644 --- a/readme.rst +++ b/readme.rst @@ -29,7 +29,7 @@ guide change log `_ version 5.1.6 or newer. +- `PHP `_ version 5.2.4 or newer. - A Database is required for most web application programming. Current - supported databases are MySQL (4.1+), MySQLi, MS SQL, Postgres, Oracle, + supported databases are MySQL (5.1+), MySQLi, MS SQL, Postgres, Oracle, SQLite, ODBC and CUBRID. \ No newline at end of file diff --git a/user_guide_src/source/installation/upgrade_200.rst b/user_guide_src/source/installation/upgrade_200.rst index 0bcbd5c9938..b39f4fd2341 100644 --- a/user_guide_src/source/installation/upgrade_200.rst +++ b/user_guide_src/source/installation/upgrade_200.rst @@ -102,7 +102,7 @@ Please refer to the :ref:`2.0.0 Change Log <2.0.0-changelog>` for full details, but here are some of the larger changes that are more likely to impact your code: -- CodeIgniter now requires PHP 5.1.6. +- CodeIgniter now requires PHP 5.2.4. - Scaffolding has been removed. - The CAPTCHA plugin in now a :doc:`helper `. - The JavaScript calendar plugin was removed. From ca6404749a8dd3ee5dd68d64832374dce05fe6a3 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Fri, 9 Mar 2012 17:19:35 +0000 Subject: [PATCH 0605/5397] Allow arrays to be used for enum/set constraint. This was working in MySQL but not MySQLi. --- .../database/drivers/mysqli/mysqli_forge.php | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php index 4ab7a639ddf..9cb1a0c70cb 100644 --- a/system/database/drivers/mysqli/mysqli_forge.php +++ b/system/database/drivers/mysqli/mysqli_forge.php @@ -86,9 +86,32 @@ public function _process_fields($fields) $sql .= "\n\t".$this->db->protect_identifiers($field) .( ! empty($attributes['NAME']) ? ' '.$this->db->protect_identifiers($attributes['NAME']).' ' : '') - .( ! empty($attributes['TYPE']) ? ' '.$attributes['TYPE'] : '') - .( ! empty($attributes['CONSTRAINT']) ? '('.$attributes['CONSTRAINT'].')' : '') - .(( ! empty($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '') + ; + + if ( ! empty($attributes['TYPE'])) + { + $sql .= ' '.$attributes['TYPE']; + + if ( ! empty($attributes['CONSTRAINT'])) + { + switch (strtolower($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'].')'; + } + } + } + + $sql .= (( ! empty($attributes['UNSIGNED']) && $attributes['UNSIGNED'] === TRUE) ? ' UNSIGNED' : '') .(isset($attributes['DEFAULT']) ? " DEFAULT '".$attributes['DEFAULT']."'" : '') .(( ! empty($attributes['NULL']) && $attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL') .(( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) ? ' AUTO_INCREMENT' : ''); From 10aa8e660c6f439958b79fce5d85ce7e8eecf028 Mon Sep 17 00:00:00 2001 From: Joel Kallman Date: Fri, 9 Mar 2012 14:54:53 -0500 Subject: [PATCH 0606/5397] Adding Support to Properly Escape Objects that have __toString() magic method so that the object can be passed directly as a parameter in a condition without having to manually convert to a string Signed-off-by: Joel Kallman --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 9d92f2f87a2..a72bf3101e3 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -727,7 +727,7 @@ function last_query() */ function escape($str) { - if (is_string($str)) + if (is_string($str) OR method_exists($str, '__toString')) { $str = "'".$this->escape_str($str)."'"; } From e39728c55d3745ff60742d7dd1c5114ec690d1db Mon Sep 17 00:00:00 2001 From: tiyowan Date: Sat, 10 Mar 2012 02:10:44 +0400 Subject: [PATCH 0607/5397] Fix issue #1148 Rewrote tests to use reflection to access protected/private functions of Table class. This fixes fatal errors that prevent the test suite from executing other tests. Signed-off-by: tiyowan --- tests/codeigniter/libraries/Table_test.php | 64 ++++++++++++++-------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/tests/codeigniter/libraries/Table_test.php b/tests/codeigniter/libraries/Table_test.php index 133179f3a06..045216b1647 100644 --- a/tests/codeigniter/libraries/Table_test.php +++ b/tests/codeigniter/libraries/Table_test.php @@ -106,42 +106,50 @@ public function test_prep_args() // test what would be discreet args, // basically means a single array as the calling method // will use func_get_args() + + $reflectionOfTable = new ReflectionClass($this->table); + $method = $reflectionOfTable->getMethod('_prep_args'); + + $method->setAccessible(true); + $this->assertEquals( $expected, - $this->table->_prep_args(array( - 'name', 'color', 'size' - )), - 'discreet'); - + $method->invokeArgs( + $this->table, array(array('name', 'color', 'size'), 'discreet') + ) + ); // test what would be a single array argument. Again, nested // due to func_get_args on calling methods $this->assertEquals( $expected, - $this->table->_prep_args(array( - array('name', 'color', 'size') - )), - 'array'); + $method->invokeArgs( + $this->table, array(array('name', 'color', 'size'), 'array') + ) + ); // with cell attributes // need to add that new argument row to our expected outcome $expected[] = array('data' => 'weight', 'class' => 'awesome'); - + $this->assertEquals( $expected, - $this->table->_prep_args(array( - array('name', 'color', 'size', - array('data' => 'weight', 'class' => 'awesome') - ) - )), - 'attributes'); + $method->invokeArgs( + $this->table, array(array('name', 'color', 'size', array('data' => 'weight', 'class' => 'awesome')), 'attributes') + ) + ); } public function test_default_template_keys() { - $deft_template = $this->table->_default_template(); + $reflectionOfTable = new ReflectionClass($this->table); + $method = $reflectionOfTable->getMethod('_default_template'); + + $method->setAccessible(true); + + $deft_template = $method->invoke($this->table); $keys = array( 'table_open', 'thead_open', 'thead_close', @@ -160,18 +168,23 @@ public function test_default_template_keys() public function test_compile_template() { + $reflectionOfTable = new ReflectionClass($this->table); + $method = $reflectionOfTable->getMethod('_compile_template'); + + $method->setAccessible(true); + $this->assertFalse($this->table->set_template('invalid_junk')); // non default key $this->table->set_template(array('nonsense' => 'foo')); - $this->table->_compile_template(); + $method->invoke($this->table); $this->assertArrayHasKey('nonsense', $this->table->template); $this->assertEquals('foo', $this->table->template['nonsense']); // override default $this->table->set_template(array('table_close' => '
    ')); - $this->table->_compile_template(); + $method->invoke($this->table); $this->assertArrayHasKey('table_close', $this->table->template); $this->assertEquals('', $this->table->template['table_close']); @@ -242,8 +255,13 @@ public function test_clear() public function test_set_from_array() { - $this->assertFalse($this->table->_set_from_array('bogus')); - $this->assertFalse($this->table->_set_from_array(array())); + $reflectionOfTable = new ReflectionClass($this->table); + $method = $reflectionOfTable->getMethod('_set_from_array'); + + $method->setAccessible(true); + + $this->assertFalse($method->invokeArgs($this->table, array('bogus'))); + $this->assertFalse($method->invoke($this->table, array())); $data = array( array('name', 'color', 'number'), @@ -251,7 +269,7 @@ public function test_set_from_array() array('Katie', 'Blue') ); - $this->table->_set_from_array($data, FALSE); + $method->invokeArgs($this->table, array($data, FALSE)); $this->assertEmpty($this->table->heading); $this->table->clear(); @@ -267,7 +285,7 @@ public function test_set_from_array() array('data' => 'Blue'), ); - $this->table->_set_from_array($data); + $method->invokeArgs($this->table, array($data)); $this->assertEquals(count($this->table->rows), 2); $this->assertEquals( From 9929d6f77a0e54288b1696343439b0e91b21866e Mon Sep 17 00:00:00 2001 From: Christopher Guiney Date: Fri, 9 Mar 2012 19:53:24 -0800 Subject: [PATCH 0608/5397] Allow drivers to be loaded as an array, like models and libraries. --- system/core/Loader.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index 3d91915c421..42d8162bbb0 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -615,13 +615,22 @@ public function config($file = '', $use_sections = FALSE, $fail_gracefully = FAL * * Loads a driver library * - * @param string the name of the class + * @param mixed the name of the class or array of classes * @param mixed the optional parameters * @param string an optional object name * @return void */ public function driver($library = '', $params = NULL, $object_name = NULL) { + if(is_array($library)) + { + foreach ( $library as $driver ) + { + $this->driver($driver); + } + return FALSE; + } + if ( ! class_exists('CI_Driver_Library')) { // we aren't instantiating an object here, that'll be done by the Library itself From 7729faa553c0ec93a13533003a53dc66078467a8 Mon Sep 17 00:00:00 2001 From: Hamza Bhatti Date: Sat, 10 Mar 2012 13:07:05 +0400 Subject: [PATCH 0609/5397] Fix test errors in Loader_test.php and URI_test.php Change exceptions from Exception to RuntimeException since PHPUnit 3.6 doesn't like you to expect generic exceptions. The error it gives is: InvalidArgumentException: You must not expect the generic exception class travis-ci.org/#!/tiyowan/CodeIgniter/builds/832518 This issue addressed by using exceptions that are more specific. --- tests/codeigniter/core/Loader_test.php | 12 ++++++------ tests/codeigniter/core/URI_test.php | 4 ++-- tests/lib/common.php | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index 9ba870b7d55..b86fd347726 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -104,7 +104,7 @@ private function _setup_config_mock() public function test_non_existent_model() { $this->setExpectedException( - 'Exception', + 'RuntimeException', 'CI Error: Unable to locate the model you have specified: ci_test_nonexistent_model.php' ); @@ -170,7 +170,7 @@ public function test_load_view() public function test_non_existent_view() { $this->setExpectedException( - 'Exception', + 'RuntimeException', 'CI Error: Unable to load the requested file: ci_test_nonexistent_view.php' ); @@ -192,7 +192,7 @@ public function test_file() $this->assertEquals($content, $load); $this->setExpectedException( - 'Exception', + 'RuntimeException', 'CI Error: Unable to load the requested file: ci_test_file_not_exists' ); @@ -219,7 +219,7 @@ public function test_helper() $this->assertEquals(NULL, $this->load->helper('array')); $this->setExpectedException( - 'Exception', + 'RuntimeException', 'CI Error: Unable to load the requested file: helpers/bad_helper.php' ); @@ -256,7 +256,7 @@ public function test_load_bad_config() $this->_setup_config_mock(); $this->setExpectedException( - 'Exception', + 'RuntimeException', 'CI Error: The configuration file foobar.php does not exist.' ); @@ -268,4 +268,4 @@ public function test_load_bad_config() -} \ No newline at end of file +} diff --git a/tests/codeigniter/core/URI_test.php b/tests/codeigniter/core/URI_test.php index 87d921b11d2..40252aa146c 100644 --- a/tests/codeigniter/core/URI_test.php +++ b/tests/codeigniter/core/URI_test.php @@ -189,7 +189,7 @@ public function test_filter_uri_escaping() public function test_filter_uri_throws_error() { - $this->setExpectedException('Exception'); + $this->setExpectedException('RuntimeException'); $this->uri->config->set_item('enable_query_strings', FALSE); $this->uri->config->set_item('permitted_uri_chars', 'a-z 0-9~%.:_\-'); @@ -341,4 +341,4 @@ public function test_slash_segment() // END URI_test Class /* End of file URI_test.php */ -/* Location: ./tests/core/URI_test.php */ \ No newline at end of file +/* Location: ./tests/core/URI_test.php */ diff --git a/tests/lib/common.php b/tests/lib/common.php index 6d29eb0d616..4a832587df5 100644 --- a/tests/lib/common.php +++ b/tests/lib/common.php @@ -87,17 +87,17 @@ function remove_invisible_characters($str, $url_encoded = TRUE) function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') { - throw new Exception('CI Error: '.$message); + throw new RuntimeException('CI Error: '.$message); } function show_404($page = '', $log_error = TRUE) { - throw new Exception('CI Error: 404'); + throw new RuntimeException('CI Error: 404'); } function _exception_handler($severity, $message, $filepath, $line) { - throw new Exception('CI Exception: '.$message.' | '.$filepath.' | '.$line); + throw new RuntimeException('CI Exception: '.$message.' | '.$filepath.' | '.$line); } @@ -129,4 +129,4 @@ function set_status_header($code = 200, $text = '') return TRUE; } -// EOF \ No newline at end of file +// EOF From 02197502bb507022d7740d9f38d1a670ba16c96b Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Sat, 10 Mar 2012 16:39:50 +0700 Subject: [PATCH 0610/5397] Travis setup --- .travis.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000000..7f290e6be3d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,11 @@ +language: php + +phps: + - 5.2 + - 5.3 + - 5.4 + +branches: + except: + - develop + - master From 4da9478ca00a9316c525b71001e0c6260d7d85fa Mon Sep 17 00:00:00 2001 From: dododedodonl Date: Sat, 10 Mar 2012 13:56:17 +0100 Subject: [PATCH 0611/5397] Removed quotes from the Content-Type header to support mime-type detection on android --- system/helpers/download_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 47d55dbf512..f3f0ff2cacc 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -91,7 +91,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) } // Generate the server headers - header('Content-Type: "'.$mime.'"'); + header('Content-Type: '.$mime); header('Content-Disposition: attachment; filename="'.$filename.'"'); header('Expires: 0'); header('Content-Transfer-Encoding: binary'); From e40c763bf969acbaa7c4c61be50f01e870062080 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Sat, 10 Mar 2012 13:05:08 +0000 Subject: [PATCH 0612/5397] Fixed camelize. --- .travis.yml | 2 +- system/helpers/inflector_helper.php | 2 +- phpunit.xml => tests/phpunit.xml | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) rename phpunit.xml => tests/phpunit.xml (75%) diff --git a/.travis.yml b/.travis.yml index c5a999359a1..4e13a83d79f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,4 +10,4 @@ before_script: - pyrus install http://pear.php-tools.net/get/vfsStream-0.11.2.tgz - phpenv rehash -script: phpunit --configuration phpunit.xml \ No newline at end of file +script: phpunit --configuration tests/phpunit.xml \ No newline at end of file diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index 02c425b8a29..5acfd6bc5d7 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -173,7 +173,7 @@ function plural($str, $force = FALSE) { function camelize($str) { - return substr(str_replace(' ', '', ucwords(preg_replace('/[\s_]+/', ' ', $str))), 1); + return strtolower($str[0]).substr(str_replace(' ', '', ucwords(preg_replace('/[\s_]+/', ' ', $str))), 1); } } diff --git a/phpunit.xml b/tests/phpunit.xml similarity index 75% rename from phpunit.xml rename to tests/phpunit.xml index 2ae7ba3b867..abb9881b994 100644 --- a/phpunit.xml +++ b/tests/phpunit.xml @@ -1,7 +1,7 @@ - tests/codeigniter/Setup_test.php - tests/codeigniter/core - tests/codeigniter/helpers - tests/codeigniter/libraries + codeigniter/Setup_test.php + codeigniter/core + codeigniter/helpers + codeigniter/libraries - From c3b36f4c6b8e8b15c96d6653ebdf07c76eb57d9e Mon Sep 17 00:00:00 2001 From: Matteo Mattei Date: Mon, 26 Mar 2012 10:27:17 +0200 Subject: [PATCH 0769/5397] Centralize handling of attach() function for both real file and buffer string. Update documentation. --- system/libraries/Email.php | 10 ++++------ user_guide_src/source/libraries/email.rst | 20 +++++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 7320ea56601..7429035f8f4 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -83,7 +83,6 @@ class CI_Email { protected $_attach_name = array(); protected $_attach_type = array(); protected $_attach_disp = array(); - protected $_attach_content = array(); protected $_protocols = array('mail', 'sendmail', 'smtp'); protected $_base_charsets = array('us-ascii', 'iso-2022-'); // 7-bit charsets (excluding language suffix) protected $_bit_depths = array('7bit', '8bit'); @@ -172,7 +171,6 @@ public function clear($clear_attachments = FALSE) $this->_attach_name = array(); $this->_attach_type = array(); $this->_attach_disp = array(); - $this->_attach_content = array(); } return $this; @@ -408,12 +406,11 @@ public function message($body) * @param string * @return object */ - public function attach($filename, $disposition = '', $str = '', $mime = '', $newname = NULL) + public function attach($filename, $disposition = '', $newname = NULL, $mime = '') { $this->_attach_name[] = array($filename, $newname); - $this->_attach_type[] = ($mime == '') ? $this->_mime_types(pathinfo($filename, PATHINFO_EXTENSION)) : $mime; $this->_attach_disp[] = empty($disposition) ? 'attachment' : $disposition; // Can also be 'inline' Not sure if it matters - $this->_attach_content[] = $str; + $this->_attach_type[] = $mime; return $this; } @@ -1053,7 +1050,7 @@ protected function _build_message() $ctype = $this->_attach_type[$i]; $file_content = ''; - if ($this->_attach_content[$i] === '') + if ($this->_attach_type[$i] == '') { if ( ! file_exists($filename)) { @@ -1069,6 +1066,7 @@ protected function _build_message() return FALSE; } + $ctype = $this->_mime_types(pathinfo($filename, PATHINFO_EXTENSION)); $file_content = fread($fp, $file); fclose($fp); } diff --git a/user_guide_src/source/libraries/email.rst b/user_guide_src/source/libraries/email.rst index 2be50fd35ec..19c2706d972 100644 --- a/user_guide_src/source/libraries/email.rst +++ b/user_guide_src/source/libraries/email.rst @@ -228,18 +228,20 @@ use the function multiple times. For example:: $this->email->attach('/path/to/photo2.jpg'); $this->email->attach('/path/to/photo3.jpg'); -To use the default disposition (attachment), leave the second parameter blank. -If you need to use a buffer string instead of a real (physical) file you can use the -third and fourth parameters that are respectively the buffer and the mime-type:: +To use the default disposition (attachment), leave the second parameter blank, +otherwise use a custom disposition:: - $this->email->attach('report.pdf', 'inline', $buffer, 'application/pdf'); + $this->email->attach('image.jpg', 'inline'); -If you'd like to add a custom file name, you can use the fifth paramaters. -Here's an example:: - - $this->email->attach('/path/to/photo1.jpg', '', '', '', 'inline'); - $this->email->attach('/path/to/photo1.jpg', '', '', '', 'birthday.jpg'); +If you'd like to use a custom file name, you can use the third paramater:: + $this->email->attach('filename.pdf', 'attachment', 'report.pdf'); + +If you need to use a buffer string instead of a real - physical - file you can +use the first parameter as buffer, the third parameter as file name and the fourth +parameter as mime-type:: + + $this->email->attach($buffer, 'attachment', 'report.pdf', 'application/pdf'); $this->email->print_debugger() ------------------------------- From 94708bd62022f9a0cfb06d2f26e8441b6c4c562c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 12:09:28 +0300 Subject: [PATCH 0770/5397] Alter SQLite's escape_str() for LIKE queries --- system/database/drivers/sqlite/sqlite_driver.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index fa7e4846a2a..08b074cca91 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -245,9 +245,9 @@ public function escape_str($str, $like = FALSE) // 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_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; From 830f5af4bac8da4b6f9392334348bc9e33b09240 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 12:11:38 +0300 Subject: [PATCH 0771/5397] Add a missing comma --- system/database/drivers/sqlite/sqlite_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index 08b074cca91..102c79bb3a7 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -246,7 +246,7 @@ public function escape_str($str, $like = FALSE) if ($like === TRUE) { return str_replace(array($this->_like_escape_chr, '%', '_'), - array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_') + array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'), $str); } From a00e50483ab27d8ba3d3a2aa1a5138bfa8c8be70 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 12:23:13 +0300 Subject: [PATCH 0772/5397] Add DSN string and persistent connections support for CUBRID --- .../database/drivers/cubrid/cubrid_driver.php | 85 ++++++++++++------- user_guide_src/source/changelog.rst | 2 + 2 files changed, 58 insertions(+), 29 deletions(-) diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index f39c2ad7624..bed3d86859e 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -57,38 +57,35 @@ class CI_DB_cubrid_driver extends CI_DB { protected $_count_string = 'SELECT COUNT(*) AS '; protected $_random_keyword = ' RAND()'; // database specific random keyword - /** - * Non-persistent database connection - * - * @return resource - */ - public function db_connect() - { - // If no port is defined by the user, use the default value - if ($this->port == '') - { - // Default CUBRID Broker port - $this->port = 33000; - } + // CUBRID-specific properties + public $auto_commit = TRUE; - $conn = cubrid_connect($this->hostname, $this->port, $this->database, $this->username, $this->password); + public function __construct($params) + { + parent::__construct($params); - if ($conn) + if (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:[^:]*:[^:]*:(\?.+)?$/', $this->dsn, $matches)) { - // 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) + if (stripos($matches[2], 'autocommit=off') !== FALSE) { - cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_FALSE); - } - else - { - cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_TRUE); - $this->auto_commit = TRUE; + $this->auto_commit = FALSE; } } + else + { + // If no port is defined by the user, use the default value + $this->port == '' OR $this->port = 33000; + } + } - return $conn; + /** + * Non-persistent database connection + * + * @return resource + */ + public function db_connect() + { + return $this->_cubrid_connect(); } // -------------------------------------------------------------------- @@ -100,15 +97,45 @@ public function db_connect() * 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. + * server will become persistent. * * @return resource */ public function db_pconnect() { - return $this->db_connect(); + return $this->_cubrid_connect(TRUE); + } + + // -------------------------------------------------------------------- + + /** + * CUBRID connection + * + * A CUBRID-specific method to create a connection to the database. + * Except for determining if a persistent connection should be used, + * the rest of the logic is the same for db_connect() and db_pconnect(). + * + * @param bool + * @return resource + */ + protected function _cubrid_connect($persistent = FALSE) + { + if (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:([^:]*):([^:]*):(\?.+)?$/', $this->dsn, $matches)) + { + $_temp = ($persistent !== TRUE) ? 'cubrid_connect_with_url' : 'cubrid_pconnect_with_url'; + $conn_id = ($matches[2] === '' && $matches[3] === '' && $this->username !== '' && $this->password !== '') + ? $_temp($this->dsn, $this->username, $this->password) + : $_temp($this->dsn); + } + else + { + $_temp = ($persistent !== TRUE) ? 'cubrid_connect' : 'cubrid_pconnect'; + $conn_id = ($this->username !== '') + ? $_temp($this->hostname, $this->port, $this->database, $this->username, $this->password) + : $_temp($this->hostname, $this->port, $this->database); + } + + return $conn_id; } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 44ecf43d283..42d468eed4c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -73,6 +73,8 @@ Release Date: Not Released - Removed protect_identifiers() and renamed _protect_identifiers() to it instead - it was just an alias. - MySQL and MySQLi drivers now require at least MySQL version 5.1. - db_set_charset() now only requires one parameter (collation was only needed due to legacy support for MySQL versions prior to 5.1). + - Added DSN string support for CUBRID. + - Added persistent connections support for CUBRID. - Libraries From 6192bc0cd34e214d5287ba45994d84789def31af Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 12:32:32 +0300 Subject: [PATCH 0773/5397] Improve PostgreSQL DSN string support and add a missing method visibility declaration --- .../drivers/postgre/postgre_driver.php | 71 ++++++++++++++----- .../drivers/postgre/postgre_utility.php | 2 +- 2 files changed, 54 insertions(+), 19 deletions(-) diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 3bfccad0590..3e2d05ce803 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -57,29 +57,64 @@ class CI_DB_postgre_driver extends CI_DB { protected $_random_keyword = ' RANDOM()'; // database specific random keyword /** - * Connection String + * Constructor * - * @return string + * Creates a DSN string to be used for db_connect() and db_pconnect() + * + * @return void */ - protected function _connect_string() + public function __construct($params) { - $components = array( - 'hostname' => 'host', - 'port' => 'port', - 'database' => 'dbname', - 'username' => 'user', - 'password' => 'password' - ); - - $connect_string = ""; - foreach ($components as $key => $val) + parent::__construct($params); + + if ( ! empty($this->dsn)) + { + return; + } + + $this->dsn === '' OR $this->dsn = ''; + + if (strpos($this->hostname, '/') !== FALSE) + { + // If UNIX sockets are used, we shouldn't set a port + $this->port = ''; + } + + $this->hostname === '' OR $this->dsn = 'host='.$this->hostname; + + if ( ! empty($this->port) && ctype_digit($this->port)) + { + $this->dsn .= 'host='.$this->port.' '; + } + + if ($this->username !== '') { - if (isset($this->$key) && $this->$key != '') + $this->dsn .= 'username='.$this->username.' '; + + /* An empty password is valid! + * + * $db['password'] = NULL must be done in order to ignore it. + */ + $this->password === NULL OR $this->dsn .= "password='".$this->password."' "; + } + + $this->database === '' OR $this->dsn .= 'dbname='.$this->database.' '; + + /* We don't have these options as elements in our standard configuration + * array, but they might be set by parse_url() if the configuration was + * provided via string. Example: + * + * postgre://username:password@localhost:5432/database?connect_timeout=5&sslmode=1 + */ + foreach (array('connect_timeout', 'options', 'sslmode', 'service') as $key) + { + if (isset($this->$key) && is_string($this->key) && $this->key !== '') { - $connect_string .= " $val=".$this->$key; + $this->dsn .= $key."='".$this->key."' "; } } - return trim($connect_string); + + $this->dsn = rtrim($this->dsn); } // -------------------------------------------------------------------- @@ -91,7 +126,7 @@ protected function _connect_string() */ public function db_connect() { - return @pg_connect($this->_connect_string()); + return @pg_connect($this->dsn); } // -------------------------------------------------------------------- @@ -103,7 +138,7 @@ public function db_connect() */ public function db_pconnect() { - return @pg_pconnect($this->_connect_string()); + return @pg_pconnect($this->dsn); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php index c6b71b4d99b..cf29201ff07 100644 --- a/system/database/drivers/postgre/postgre_utility.php +++ b/system/database/drivers/postgre/postgre_utility.php @@ -78,7 +78,7 @@ public function _repair_table($table) * @param array Preferences * @return mixed */ - function _backup($params = array()) + public function _backup($params = array()) { // Currently unsupported return $this->db->display_error('db_unsuported_feature'); From 9a1fc2013e876347e9c8d336bade7ac589712bf7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 12:38:34 +0300 Subject: [PATCH 0774/5397] Add ODBC support for the new 'dsn' config value --- system/database/drivers/odbc/odbc_driver.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 901787ff34d..ad773117f19 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -57,12 +57,17 @@ class CI_DB_odbc_driver extends CI_DB { protected $_count_string = 'SELECT COUNT(*) AS '; protected $_random_keyword; - public function __construct($params) { parent::__construct($params); $this->_random_keyword = ' RND('.time().')'; // database specific random keyword + + // Legacy support for DSN in the hostname field + if ($this->dsn == '') + { + $this->dsn = $this->hostname; + } } /** @@ -72,7 +77,7 @@ public function __construct($params) */ public function db_connect() { - return @odbc_connect($this->hostname, $this->username, $this->password); + return @odbc_connect($this->dsn, $this->username, $this->password); } // -------------------------------------------------------------------- @@ -84,7 +89,7 @@ public function db_connect() */ public function db_pconnect() { - return @odbc_pconnect($this->hostname, $this->username, $this->password); + return @odbc_pconnect($this->dsn, $this->username, $this->password); } // -------------------------------------------------------------------- From 59ad0af04debb4e10e20fbdfc1827a620a88b7be Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 12:47:45 +0300 Subject: [PATCH 0775/5397] Add DSN string support for Oracle --- system/database/drivers/oci8/oci8_driver.php | 87 +++++++++++++++++++- user_guide_src/source/changelog.rst | 1 + 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index c9e791d639c..3bc8c114ca6 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -78,6 +78,85 @@ class CI_DB_oci8_driver extends CI_DB { // throw off num_fields later public $limit_used; + public function __construct($params) + { + parent::__construct($params); + + $valid_dsns = array( + 'tns' => '/^\(DESCRIPTION=(\(.+\)){2,}\)$/', // TNS + // Easy Connect string (Oracle 10g+) + 'ec' => '/^(\/\/)?[a-z0-9.:_-]+(:[1-9][0-9]{0,4})?(\/[a-z0-9$_]+)?(:[^\/])?(\/[a-z0-9$_]+)?$/i', + 'in' => '/^[a-z0-9$_]+$/i' // Instance name (defined in tnsnames.ora) + ); + + /* Space characters don't have any effect when actually + * connecting, but can be a hassle while validating the DSN. + */ + $this->dsn = str_replace(array("\n", "\r", "\t", ' '), '', $this->dsn); + + if ($this->dsn !== '') + { + foreach ($valid_dsns as $regexp) + { + if (preg_match($regexp, $this->dsn)) + { + return; + } + } + } + + // Legacy support for TNS in the hostname configuration field + $this->hostname = str_replace(array("\n", "\r", "\t", ' '), '', $this->hostname); + if (preg_match($valid_dsns['tns'], $this->hostname)) + { + $this->dsn = $this->hostname; + return; + } + elseif ($this->hostname !== '' && strpos($this->hostname, '/') === FALSE && strpos($this->hostname, ':') === FALSE + && (( ! empty($this->port) && ctype_digit($this->port)) OR $this->database !== '')) + { + /* If the hostname field isn't empty, doesn't contain + * ':' and/or '/' and if port and/or database aren't + * empty, then the hostname field is most likely indeed + * just a hostname. Therefore we'll try and build an + * Easy Connect string from these 3 settings, assuming + * that the database field is a service name. + */ + $this->dsn = $this->hostname + .(( ! empty($this->port) && ctype_digit($this->port)) ? ':'.$this->port : '') + .($this->database !== '' ? '/'.ltrim($this->database, '/') : ''); + + if (preg_match($valid_dsns['ec'], $this->dsn)) + { + return; + } + } + + /* At this point, we can only try and validate the hostname and + * database fields separately as DSNs. + */ + if (preg_match($valid_dsns['ec'], $this->hostname) OR preg_match($valid_dsns['in'], $this->hostname)) + { + $this->dsn = $this->hostname; + return; + } + + $this->database = str_replace(array("\n", "\r", "\t", ' '), '', $this->database); + foreach ($valid_dsns as $regexp) + { + if (preg_match($regexp, $this->database)) + { + return; + } + } + + /* Well - OK, an empty string should work as well. + * PHP will try to use environment variables to + * determine which Oracle instance to connect to. + */ + $this->dsn = ''; + } + /** * Non-persistent database connection * @@ -85,7 +164,9 @@ class CI_DB_oci8_driver extends CI_DB { */ public function db_connect() { - return @oci_connect($this->username, $this->password, $this->hostname, $this->char_set); + return ( ! empty($this->char_set)) + ? @oci_connect($this->username, $this->password, $this->dsn, $this->char_set) + : @oci_connect($this->username, $this->password, $this->dsn); } // -------------------------------------------------------------------- @@ -97,7 +178,9 @@ public function db_connect() */ public function db_pconnect() { - return @oci_pconnect($this->username, $this->password, $this->hostname, $this->char_set); + return ( ! empty($this->char_set)) + ? @oci_pconnect($this->username, $this->password, $this->dsn, $this->char_set) + : @oci_pconnect($this->username, $this->password, $this->dsn); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 42d468eed4c..7ec417d427b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -75,6 +75,7 @@ Release Date: Not Released - db_set_charset() now only requires one parameter (collation was only needed due to legacy support for MySQL versions prior to 5.1). - Added DSN string support for CUBRID. - Added persistent connections support for CUBRID. + - Added DSN string support (Easy Connect and TNS) for Oracle. - Libraries From 968bbbb40d188c2bfff6712555b380bd9678d995 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 12:59:05 +0300 Subject: [PATCH 0776/5397] Minor adjustments in the changelog --- user_guide_src/source/changelog.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 7ec417d427b..7afe8be68ee 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -58,7 +58,7 @@ Release Date: Not Released - Adding $escape parameter to the order_by function, this enables ordering by custom fields. - MySQLi driver now uses mysqli_get_server_info() for server version checking. - MySQLi driver now supports persistent connections when running on PHP >= 5.3. - - Added dsn if the group connections in the config use PDO or any driver which need DSN. + - Added 'dsn' configuration setting for drivers that support DSN strings (PDO, PostgreSQL, Oracle, ODBC, CUBRID). - Improved PDO database support. - Added Interbase/Firebird database support via the "interbase" driver - Added an optional database name parameter to db_select(). @@ -252,11 +252,9 @@ Release Date: November 14, 2011 override them. - Removed CI_CORE boolean constant from CodeIgniter.php (no longer Reactor and Core versions). - Bug fixes for 2.1.0 ------------------- - - Fixed #378 Robots identified as regular browsers by the User Agent class. - If a config class was loaded first then a library with the same name @@ -1255,7 +1253,7 @@ Bug fixes for 1.6.3 - Added a language key for valid_emails in validation_lang.php. - Amended fixes for bug (#3419) with parsing DSN database connections. -- Moved the _has_operators() function (#4535) into DB_driver from +- Moved the _has_operator() function (#4535) into DB_driver from DB_active_rec. - Fixed a syntax error in upload_lang.php. - Fixed a bug (#4542) with a regular expression in the Image library. From c2697db0f2721cc9fefb58b85bf55e6bdb91db9b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 13:05:24 +0300 Subject: [PATCH 0777/5397] Rename a variable and style fixes in system/database/DB.php --- system/database/DB.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/system/database/DB.php b/system/database/DB.php index 116116bf446..96e49551581 100755 --- a/system/database/DB.php +++ b/system/database/DB.php @@ -37,11 +37,11 @@ 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) + if (is_string($params) && strpos($params, '://') === FALSE) { // Is the config file in the environment folder? if (( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/database.php')) - AND ! file_exists($file_path = APPPATH.'config/database.php')) + && ! file_exists($file_path = APPPATH.'config/database.php')) { show_error('The configuration file database.php does not exist.'); } @@ -74,24 +74,24 @@ function &DB($params = '', $active_record_override = NULL) * parameter. DSNs must have this prototype: * $dsn = 'driver://username:password@hostname/database'; */ - if (($dns = @parse_url($params)) === FALSE) + if (($dsn = @parse_url($params)) === FALSE) { show_error('Invalid DB Connection String'); } $params = array( - 'dbdriver' => $dns['scheme'], - 'hostname' => (isset($dns['host'])) ? rawurldecode($dns['host']) : '', - 'port' => (isset($dns['port'])) ? rawurldecode($dns['port']) : '', - 'username' => (isset($dns['user'])) ? rawurldecode($dns['user']) : '', - 'password' => (isset($dns['pass'])) ? rawurldecode($dns['pass']) : '', - 'database' => (isset($dns['path'])) ? rawurldecode(substr($dns['path'], 1)) : '' + 'dbdriver' => $dsn['scheme'], + 'hostname' => isset($dsn['host']) ? rawurldecode($dsn['host']) : '', + 'port' => isset($dsn['port']) ? rawurldecode($dsn['port']) : '', + 'username' => isset($dsn['user']) ? rawurldecode($dsn['user']) : '', + 'password' => isset($dsn['pass']) ? rawurldecode($dsn['pass']) : '', + 'database' => isset($dsn['path']) ? rawurldecode(substr($dsn['path'], 1)) : '' ); // were additional config items set? - if (isset($dns['query'])) + if (isset($dsn['query'])) { - parse_str($dns['query'], $extra); + parse_str($dsn['query'], $extra); foreach ($extra as $key => $val) { // booleans please @@ -158,4 +158,4 @@ class CI_DB extends CI_DB_driver { } } /* End of file DB.php */ -/* Location: ./system/database/DB.php */ +/* Location: ./system/database/DB.php */ \ No newline at end of file From e734b38e0f4cde3ebe17cdb1844faa0129fe8b11 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 13:42:36 +0300 Subject: [PATCH 0778/5397] Clear some spaces and fix some inconsistencies in application/ php files --- application/config/autoload.php | 6 +++--- application/config/config.php | 6 +++--- application/config/constants.php | 10 +++++----- application/config/database.php | 6 +++--- application/config/doctypes.php | 2 +- application/config/foreign_chars.php | 6 +++--- application/config/hooks.php | 7 +++---- application/config/migration.php | 6 +++--- application/config/mimes.php | 5 +++-- application/config/profiler.php | 7 +++---- application/config/routes.php | 7 +++---- application/config/smileys.php | 6 +++--- application/config/user_agents.php | 4 ++-- application/controllers/welcome.php | 10 +++++----- application/errors/error_404.php | 10 ++++------ application/errors/error_db.php | 10 ++++------ application/errors/error_general.php | 10 ++++------ application/errors/error_php.php | 14 +++++++------- application/views/welcome_message.php | 14 ++++++-------- 19 files changed, 68 insertions(+), 78 deletions(-) diff --git a/application/config/autoload.php b/application/config/autoload.php index e8c999334fd..b3e63cbf60e 100644 --- a/application/config/autoload.php +++ b/application/config/autoload.php @@ -1,13 +1,13 @@ - array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'), +$mimes = array( + 'hqx' => array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'), 'cpt' => 'application/mac-compactpro', 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel'), 'bin' => array('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'), @@ -165,4 +166,4 @@ ); /* End of file mimes.php */ -/* Location: ./application/config/mimes.php */ +/* Location: ./application/config/mimes.php */ \ No newline at end of file diff --git a/application/config/profiler.php b/application/config/profiler.php index 53391892d41..c161a4d5950 100644 --- a/application/config/profiler.php +++ b/application/config/profiler.php @@ -1,13 +1,13 @@ - - - +?> diff --git a/application/errors/error_db.php b/application/errors/error_db.php index 81ff02adb74..eb3a752604c 100644 --- a/application/errors/error_db.php +++ b/application/errors/error_db.php @@ -1,13 +1,13 @@ - - - +?> diff --git a/application/errors/error_general.php b/application/errors/error_general.php index 8efcfd9919e..59896e1eafc 100644 --- a/application/errors/error_general.php +++ b/application/errors/error_general.php @@ -1,13 +1,13 @@ - - - +?> diff --git a/application/errors/error_php.php b/application/errors/error_php.php index 42e5f5a28f2..3855720de74 100644 --- a/application/errors/error_php.php +++ b/application/errors/error_php.php @@ -1,13 +1,13 @@ -Filename:

    Line Number:

    - - + +

    Backtrace:

    - +

    File:
    @@ -47,7 +47,7 @@ Function:

    - +

    diff --git a/application/views/welcome_message.php b/application/views/welcome_message.php index 0dd892441ba..45360da6055 100644 --- a/application/views/welcome_message.php +++ b/application/views/welcome_message.php @@ -1,13 +1,13 @@ - - - +?> @@ -75,7 +73,7 @@ #body{ margin: 0 15px 0 15px; } - + p.footer{ text-align: right; font-size: 11px; @@ -84,7 +82,7 @@ padding: 0 10px 0 10px; margin: 20px 0 0 0; } - + #container{ margin: 10px; border: 1px solid #D0D0D0; From e684bdac2d6282e3b9a5c57e1006d5ed1664f647 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 13:47:29 +0300 Subject: [PATCH 0779/5397] Clear some spaces and fix some inconsistencies in the Zip library and system/helpers/ files --- system/helpers/captcha_helper.php | 4 +--- system/helpers/date_helper.php | 2 +- system/helpers/smiley_helper.php | 13 ++++++------- system/helpers/string_helper.php | 10 +++++----- system/helpers/text_helper.php | 8 ++++---- system/libraries/Zip.php | 8 ++++---- 6 files changed, 21 insertions(+), 24 deletions(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 57879657367..5955e054af5 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -1,4 +1,4 @@ -now); - + $time['file_mtime'] = ($date['hours'] << 11) + ($date['minutes'] << 5) + $date['seconds'] / 2; $time['file_mdate'] = (($date['year'] - 1980) << 9) + ($date['mon'] << 5) + $date['mday']; From c6a68e04169802c8aa82e41634ce350eafd1ec1e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 14:30:10 +0300 Subject: [PATCH 0780/5397] Add visibility declarations where they remain missing --- system/core/Exceptions.php | 6 ++---- system/database/drivers/mssql/mssql_driver.php | 3 +-- system/database/drivers/pdo/pdo_driver.php | 2 +- user_guide_src/source/changelog.rst | 1 + 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php index d7282b1f347..f36b31598f3 100755 --- a/system/core/Exceptions.php +++ b/system/core/Exceptions.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * Exceptions Class * @@ -163,7 +161,7 @@ public function show_error($heading, $message, $template = 'error_general', $sta * @param string the error line number * @return string */ - function show_php_error($severity, $message, $filepath, $line) + public function show_php_error($severity, $message, $filepath, $line) { $severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity]; $filepath = str_replace('\\', '/', $filepath); @@ -189,4 +187,4 @@ function show_php_error($severity, $message, $filepath, $line) } /* End of file Exceptions.php */ -/* Location: ./system/core/Exceptions.php */ +/* Location: ./system/core/Exceptions.php */ \ No newline at end of file diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index f2933fe4325..91280863117 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -539,13 +539,12 @@ protected function _truncate($table) * * 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) + protected function _delete($table, $where = array(), $like = array(), $limit = FALSE) { $conditions = ''; diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 19338e30fd4..f336eb0ab59 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -484,7 +484,7 @@ public function insert_id($name = NULL) * @param string * @return string */ - function count_all($table = '') + public function count_all($table = '') { if ($table == '') { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 34d6a0b6312..47220d61a1d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -36,6 +36,7 @@ Release Date: Not Released - Removed previously deprecated use of ``$autoload['core']`` in application/config/autoload.php. Only entries in ``$autoload['libraries']`` are auto-loaded now. - Added some more doctypes. + - Updated all classes to be written in PHP 5 style, with visibility declarations and no ``var`` usage for properties. - Helpers From a5dd2976044b856a875d50e612a2b39ae05787ea Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 14:43:01 +0300 Subject: [PATCH 0781/5397] Make _initialize() a constructor and rename _call_hook() to call_hook in the Hooks class --- system/core/CodeIgniter.php | 14 ++++++------- system/core/Hooks.php | 32 +++++++++++------------------ user_guide_src/source/changelog.rst | 1 + 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index a79a6959006..4885f310cf7 100755 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -133,7 +133,7 @@ * Is there a "pre_system" hook? * ------------------------------------------------------ */ - $EXT->_call_hook('pre_system'); + $EXT->call_hook('pre_system'); /* * ------------------------------------------------------ @@ -194,7 +194,7 @@ * Is there a valid cache file? If so, we're done... * ------------------------------------------------------ */ - if ($EXT->_call_hook('cache_override') === FALSE + if ($EXT->call_hook('cache_override') === FALSE && $OUT->_display_cache($CFG, $URI) == TRUE) { exit; @@ -297,7 +297,7 @@ function &get_instance() * Is there a "pre_controller" hook? * ------------------------------------------------------ */ - $EXT->_call_hook('pre_controller'); + $EXT->call_hook('pre_controller'); /* * ------------------------------------------------------ @@ -314,7 +314,7 @@ function &get_instance() * Is there a "post_controller_constructor" hook? * ------------------------------------------------------ */ - $EXT->_call_hook('post_controller_constructor'); + $EXT->call_hook('post_controller_constructor'); /* * ------------------------------------------------------ @@ -369,14 +369,14 @@ function &get_instance() * Is there a "post_controller" hook? * ------------------------------------------------------ */ - $EXT->_call_hook('post_controller'); + $EXT->call_hook('post_controller'); /* * ------------------------------------------------------ * Send the final rendered output to the browser * ------------------------------------------------------ */ - if ($EXT->_call_hook('display_override') === FALSE) + if ($EXT->call_hook('display_override') === FALSE) { $OUT->_display(); } @@ -386,7 +386,7 @@ function &get_instance() * Is there a "post_system" hook? * ------------------------------------------------------ */ - $EXT->_call_hook('post_system'); + $EXT->call_hook('post_system'); /* * ------------------------------------------------------ diff --git a/system/core/Hooks.php b/system/core/Hooks.php index 493822f3626..68e30ef0f06 100755 --- a/system/core/Hooks.php +++ b/system/core/Hooks.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Hooks Class * @@ -51,7 +49,7 @@ class CI_Hooks { * * @var array */ - public $hooks = array(); + public $hooks = array(); /** * Determines wether hook is in progress, used to prevent infinte loops * @@ -59,23 +57,17 @@ class CI_Hooks { */ public $in_progress = FALSE; - public function __construct() - { - $this->_initialize(); - log_message('debug', 'Hooks Class Initialized'); - } - - // -------------------------------------------------------------------- - /** * Initialize the Hooks Preferences * * @return void */ - private function _initialize() + public function __construct() { $CFG =& load_class('Config', 'core'); + log_message('debug', 'Hooks Class Initialized'); + // If hooks are not enabled in the config file // there is nothing else to do if ($CFG->item('enable_hooks') == FALSE) @@ -84,7 +76,7 @@ private function _initialize() } // Grab the "hooks" definition file. - if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) + if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'); } @@ -113,14 +105,14 @@ private function _initialize() * @param string the hook name * @return mixed */ - public function _call_hook($which = '') + public 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])) + if (isset($this->hooks[$which][0]) && is_array($this->hooks[$which][0])) { foreach ($this->hooks[$which] as $val) { @@ -167,7 +159,7 @@ protected function _run_hook($data) // Set file path // ----------------------------------- - if ( ! isset($data['filepath']) OR ! isset($data['filename'])) + if ( ! isset($data['filepath'], $data['filename'])) { return FALSE; } @@ -187,12 +179,12 @@ protected function _run_hook($data) $function = FALSE; $params = ''; - if (isset($data['class']) AND $data['class'] != '') + if ( ! empty($data['class'])) { $class = $data['class']; } - if (isset($data['function'])) + if ( ! empty($data['function'])) { $function = $data['function']; } @@ -202,7 +194,7 @@ protected function _run_hook($data) $params = $data['params']; } - if ($class === FALSE AND $function === FALSE) + if ($class === FALSE && $function === FALSE) { return FALSE; } @@ -244,4 +236,4 @@ protected function _run_hook($data) } /* End of file Hooks.php */ -/* Location: ./system/core/Hooks.php */ +/* Location: ./system/core/Hooks.php */ \ No newline at end of file diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 47220d61a1d..37c38f16a29 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -117,6 +117,7 @@ Release Date: Not Released - Added method() to CI_Input to retrieve $_SERVER['REQUEST_METHOD']. - Modified valid_ip() to use PHP's filter_var() in the :doc:`Input Library `. - Added support for HTTP-Only cookies with new config option ``cookie_httponly`` (default FALSE). + - Renamed method _call_hook() to call_hook() in the :doc:`Hooks Library `. Bug fixes for 3.0 ------------------ From c4d979c45297ecc021e385a96dc3bae04a4cdbc4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 14:53:00 +0300 Subject: [PATCH 0782/5397] Switch private methods to protected and cleanup the Ftp library --- system/libraries/Ftp.php | 109 +++++++++++++++------------------------ 1 file changed, 41 insertions(+), 68 deletions(-) diff --git a/system/libraries/Ftp.php b/system/libraries/Ftp.php index 4d96c00cc87..8aa1650d262 100644 --- a/system/libraries/Ftp.php +++ b/system/libraries/Ftp.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * FTP Class * @@ -42,16 +40,11 @@ class CI_FTP { public $username = ''; public $password = ''; public $port = 21; - public $passive = TRUE; + public $passive = TRUE; public $debug = FALSE; - public $conn_id = FALSE; + public $conn_id = FALSE; - /** - * Constructor - Sets Preferences - * - * The constructor can be passed an array of config values - */ public function __construct($config = array()) { if (count($config) > 0) @@ -59,7 +52,7 @@ public function __construct($config = array()) $this->initialize($config); } - log_message('debug', "FTP Class Initialized"); + log_message('debug', 'FTP Class Initialized'); } // -------------------------------------------------------------------- @@ -67,7 +60,6 @@ public function __construct($config = array()) /** * Initialize preferences * - * @access public * @param array * @return void */ @@ -90,7 +82,6 @@ public function initialize($config = array()) /** * FTP Connect * - * @access public * @param array the connection values * @return bool */ @@ -133,10 +124,9 @@ public function connect($config = array()) /** * FTP Login * - * @access private * @return bool */ - private function _login() + protected function _login() { return @ftp_login($this->conn_id, $this->username, $this->password); } @@ -146,10 +136,9 @@ private function _login() /** * Validates the connection ID * - * @access private * @return bool */ - private function _is_conn() + protected function _is_conn() { if ( ! is_resource($this->conn_id)) { @@ -164,17 +153,15 @@ private function _is_conn() // -------------------------------------------------------------------- - /** * Change directory * * The second parameter lets us momentarily turn off debugging so that * this function can be used to test for the existence of a folder - * without throwing an error. There's no FTP equivalent to is_dir() + * without throwing an error. There's no FTP equivalent to is_dir() * so we do it by trying to change to a particular directory. * Internally, this parameter is only used by the "mirror" function below. * - * @access public * @param string * @param bool * @return bool @@ -190,7 +177,7 @@ public function changedir($path = '', $supress_debug = FALSE) if ($result === FALSE) { - if ($this->debug == TRUE AND $supress_debug == FALSE) + if ($this->debug == TRUE && $supress_debug == FALSE) { $this->_error('ftp_unable_to_changedir'); } @@ -205,8 +192,8 @@ public function changedir($path = '', $supress_debug = FALSE) /** * Create a directory * - * @access public * @param string + * @param int * @return bool */ public function mkdir($path = '', $permissions = NULL) @@ -230,7 +217,7 @@ public function mkdir($path = '', $permissions = NULL) // Set file permissions if needed if ( ! is_null($permissions)) { - $this->chmod($path, (int)$permissions); + $this->chmod($path, (int) $permissions); } return TRUE; @@ -241,10 +228,10 @@ public function mkdir($path = '', $permissions = NULL) /** * Upload a file to the server * - * @access public * @param string * @param string * @param string + * @param int * @return bool */ public function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL) @@ -284,7 +271,7 @@ public function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL) // Set file permissions if needed if ( ! is_null($permissions)) { - $this->chmod($rempath, (int)$permissions); + $this->chmod($rempath, (int) $permissions); } return TRUE; @@ -295,7 +282,6 @@ public function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL) /** * Download a file from a remote server to the local server * - * @access public * @param string * @param string * @param string @@ -337,7 +323,6 @@ public function download($rempath, $locpath, $mode = 'auto') /** * Rename (or move) a file * - * @access public * @param string * @param string * @param bool @@ -369,7 +354,6 @@ public function rename($old_file, $new_file, $move = FALSE) /** * Move a file * - * @access public * @param string * @param string * @return bool @@ -384,7 +368,6 @@ public function move($old_file, $new_file) /** * Rename (or move) a file * - * @access public * @param string * @return bool */ @@ -415,7 +398,6 @@ public function delete_file($filepath) * Delete a folder and recursively delete everything (including sub-folders) * containted within it. * - * @access public * @param string * @return bool */ @@ -427,11 +409,11 @@ public function delete_dir($filepath) } // Add a trailing slash to the file path if needed - $filepath = preg_replace("/(.+?)\/*$/", "\\1/", $filepath); + $filepath = preg_replace('/(.+?)\/*$/', '\\1/', $filepath); $list = $this->list_files($filepath); - if ($list !== FALSE AND count($list) > 0) + if ($list !== FALSE && count($list) > 0) { foreach ($list as $item) { @@ -463,7 +445,6 @@ public function delete_dir($filepath) /** * Set file permissions * - * @access public * @param string the file path * @param string the permissions * @return bool @@ -494,7 +475,6 @@ public function chmod($path, $perm) /** * FTP List files in the specified directory * - * @access public * @return array */ public function list_files($path = '.') @@ -512,11 +492,11 @@ public function list_files($path = '.') /** * Read a directory and recreate it remotely * - * This function recursively reads a folder and everything it contains (including - * sub-folders) and creates a mirror via FTP based on it. Whatever the directory structure - * of the original file path will be recreated on the server. + * This function recursively reads a folder and everything it contains + * (including sub-folders) and creates a mirror via FTP based on it. + * Whatever the directory structure of the original file path will be + * recreated on the server. * - * @access public * @param string path to source with trailing slash * @param string path to destination - include the base folder with trailing slash * @return bool @@ -532,7 +512,7 @@ public function mirror($locpath, $rempath) if ($fp = @opendir($locpath)) { // Attempt to open the remote file path and try to create it, if it doesn't exist - if ( ! $this->changedir($rempath, TRUE) AND ( ! $this->mkdir($rempath) OR ! $this->changedir($rempath))) + if ( ! $this->changedir($rempath, TRUE) && ( ! $this->mkdir($rempath) OR ! $this->changedir($rempath))) { return FALSE; } @@ -542,9 +522,9 @@ public function mirror($locpath, $rempath) { if (@is_dir($locpath.$file) && $file[0] !== '.') { - $this->mirror($locpath.$file."/", $rempath.$file."/"); + $this->mirror($locpath.$file.'/', $rempath.$file.'/'); } - elseif ($file[0] !== ".") + elseif ($file[0] !== '.') { // Get the file extension so we can se the upload type $ext = $this->_getext($file); @@ -565,11 +545,10 @@ public function mirror($locpath, $rempath) /** * Extract the file extension * - * @access private * @param string * @return string */ - private function _getext($filename) + protected function _getext($filename) { if (FALSE === strpos($filename, '.')) { @@ -580,36 +559,34 @@ private function _getext($filename) return end($x); } - // -------------------------------------------------------------------- /** * Set the upload type * - * @access private * @param string * @return string */ - private function _settype($ext) + protected function _settype($ext) { $text_types = array( - 'txt', - 'text', - 'php', - 'phps', - 'php4', - 'js', - 'css', - 'htm', - 'html', - 'phtml', - 'shtml', - 'log', - 'xml' - ); - - - return (in_array($ext, $text_types)) ? 'ascii' : 'binary'; + 'txt', + 'text', + 'php', + 'phps', + 'php4', + 'js', + 'css', + 'htm', + 'html', + 'phtml', + 'shtml', + 'log', + 'xml' + ); + + + return in_array($ext, $text_types) ? 'ascii' : 'binary'; } // ------------------------------------------------------------------------ @@ -617,7 +594,6 @@ private function _settype($ext) /** * Close the connection * - * @access public * @return bool */ public function close() @@ -635,20 +611,17 @@ public function close() /** * Display error message * - * @access private * @param string * @return void */ - private function _error($line) + protected function _error($line) { $CI =& get_instance(); $CI->lang->load('ftp'); show_error($CI->lang->line($line)); } - } -// END FTP Class /* End of file Ftp.php */ -/* Location: ./system/libraries/Ftp.php */ +/* Location: ./system/libraries/Ftp.php */ \ No newline at end of file From 6f042ccc261645530e897bb8c390eae0640bacb0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 14:58:33 +0300 Subject: [PATCH 0783/5397] Switch private methods and properties to protected and cleanup the Cart library --- system/libraries/Cart.php | 46 +++++++++++++-------------------------- 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index 60a1e52fe19..305960f5fd3 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * Shopping Cart Class * @@ -41,12 +39,11 @@ class CI_Cart { // These are the regular expression rules that we use to validate the product ID and product name public $product_id_rules = '\.a-z0-9_-'; // alpha-numeric, dashes, underscores, or periods public $product_name_rules = '\.\:\-_ a-z0-9'; // alpha-numeric, dashes, underscores, colons or periods - public $product_name_safe = true; // only allow safe product names - - // Private variables. Do not change! - private $CI; - private $_cart_contents = array(); + public $product_name_safe = TRUE; // only allow safe product names + // Protected variables. Do not change! + protected $CI; + protected $_cart_contents = array(); /** * Shopping Class Constructor @@ -72,7 +69,7 @@ public function __construct($params = array()) $this->_cart_contents = array('cart_total' => 0, 'total_items' => 0); } - log_message('debug', "Cart Class Initialized"); + log_message('debug', 'Cart Class Initialized'); } // -------------------------------------------------------------------- @@ -80,7 +77,6 @@ public function __construct($params = array()) /** * Insert items into the cart and save it to the session table * - * @access public * @param array * @return bool */ @@ -110,7 +106,7 @@ public function insert($items = array()) { foreach ($items as $val) { - if (is_array($val) AND isset($val['id'])) + if (is_array($val) && isset($val['id'])) { if ($this->_insert($val)) { @@ -135,7 +131,6 @@ public function insert($items = array()) /** * Insert * - * @access private * @param array * @return bool */ @@ -213,7 +208,7 @@ private function _insert($items = array()) // Internally, we need to treat identical submissions, but with different options, as a unique product. // Our solution is to convert the options array to a string and MD5 it along with the product ID. // This becomes the unique "row ID" - if (isset($items['options']) AND count($items['options']) > 0) + if (isset($items['options']) && count($items['options']) > 0) { $rowid = md5($items['id'].implode('', $items['options'])); } @@ -249,7 +244,6 @@ private function _insert($items = array()) * changes to the quantity before checkout. That array must contain the * product ID and quantity for each item. * - * @access public * @param array * @param string * @return bool @@ -308,11 +302,10 @@ public function update($items = array()) * changes to the quantity before checkout. That array must contain the * product ID and quantity for each item. * - * @access private * @param array * @return bool */ - private function _update($items = array()) + protected function _update($items = array()) { // Without these array indexes there is nothing we can do if ( ! isset($items['qty']) OR ! isset($items['rowid']) OR ! isset($this->_cart_contents[$items['rowid']])) @@ -348,10 +341,9 @@ private function _update($items = array()) /** * Save the cart array to the session DB * - * @access private * @return bool */ - private function _save_cart() + protected function _save_cart() { // Lets add up the individual prices and set the cart sub-total $this->_cart_contents['total_items'] = $this->_cart_contents['cart_total'] = 0; @@ -390,8 +382,7 @@ private function _save_cart() /** * Cart Total * - * @access public - * @return integer + * @return int */ public function total() { @@ -405,8 +396,7 @@ public function total() * * Removes an item from the cart * - * @access public - * @return boolean + * @return bool */ public function remove($rowid) { @@ -423,8 +413,7 @@ public function remove($rowid) * * Returns the total item count * - * @access public - * @return integer + * @return int */ public function total_items() { @@ -438,7 +427,6 @@ public function total_items() * * Returns the entire cart array * - * @access public * @return array */ public function contents($newest_first = FALSE) @@ -461,7 +449,6 @@ public function contents($newest_first = FALSE) * Returns TRUE if the rowid passed to this function correlates to an item * that has options associated with it. * - * @access public * @return bool */ public function has_options($rowid = '') @@ -476,7 +463,7 @@ public function has_options($rowid = '') * * Returns the an array of options, for a particular product row ID * - * @access public + * @param int * @return array */ public function product_options($rowid = '') @@ -491,7 +478,7 @@ public function product_options($rowid = '') * * Returns the supplied number with commas and a decimal point. * - * @access public + * @param float * @return string */ public function format_number($n = '') @@ -514,7 +501,6 @@ public function format_number($n = '') * * Empties the cart and kills the session * - * @access public * @return void */ public function destroy() @@ -523,9 +509,7 @@ public function destroy() $this->CI->session->unset_userdata('cart_contents'); } - } -// END Cart Class /* End of file Cart.php */ -/* Location: ./system/libraries/Cart.php */ +/* Location: ./system/libraries/Cart.php */ \ No newline at end of file From 74476e1c4371bb7dc8c9727898026687d875284f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 15:03:40 +0300 Subject: [PATCH 0784/5397] Switch private methods and properties to protected and cleanup the Parser library --- system/libraries/Cart.php | 2 +- system/libraries/Parser.php | 47 ++++++++++++++----------------------- 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index 305960f5fd3..ca7be555e4a 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -134,7 +134,7 @@ public function insert($items = array()) * @param array * @return bool */ - private function _insert($items = array()) + protected function _insert($items = array()) { // Was any cart data passed? No? Bah... if ( ! is_array($items) OR count($items) === 0) diff --git a/system/libraries/Parser.php b/system/libraries/Parser.php index 290e17fc0e8..d1b5b764bd2 100644 --- a/system/libraries/Parser.php +++ b/system/libraries/Parser.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * Parser Class * @@ -41,15 +39,14 @@ class CI_Parser { public $l_delim = '{'; public $r_delim = '}'; public $object; - private $CI; + protected $CI; /** - * Parse a template + * Parse a template * * Parses pseudo-variables contained in the specified template view, * replacing them with the data in the second param * - * @access public * @param string * @param array * @param bool @@ -66,12 +63,11 @@ public function parse($template, $data, $return = FALSE) // -------------------------------------------------------------------- /** - * Parse a String + * Parse a String * * Parses pseudo-variables contained in the specified string, * replacing them with the data in the second param * - * @access public * @param string * @param array * @param bool @@ -85,18 +81,17 @@ public function parse_string($template, $data, $return = FALSE) // -------------------------------------------------------------------- /** - * Parse a template + * Parse a template * * Parses pseudo-variables contained in the specified template, * replacing them with the data in the second param * - * @access private * @param string * @param array * @param bool * @return string */ - private function _parse($template, $data, $return = FALSE) + protected function _parse($template, $data, $return = FALSE) { if ($template == '') { @@ -126,9 +121,8 @@ private function _parse($template, $data, $return = FALSE) // -------------------------------------------------------------------- /** - * Set the left/right variable delimiters + * Set the left/right variable delimiters * - * @access public * @param string * @param string * @return void @@ -142,15 +136,14 @@ public function set_delimiters($l = '{', $r = '}') // -------------------------------------------------------------------- /** - * Parse a single key/value + * Parse a single key/value * - * @access private * @param string * @param string * @param string * @return string */ - private function _parse_single($key, $val, $string) + protected function _parse_single($key, $val, $string) { return str_replace($this->l_delim.$key.$this->r_delim, (string) $val, $string); } @@ -158,17 +151,16 @@ private function _parse_single($key, $val, $string) // -------------------------------------------------------------------- /** - * Parse a tag pair + * Parse a tag pair * - * Parses tag pairs: {some_tag} string... {/some_tag} + * Parses tag pairs: {some_tag} string... {/some_tag} * - * @access private * @param string * @param array * @param string * @return string */ - private function _parse_pair($variable, $data, $string) + protected function _parse_pair($variable, $data, $string) { if (FALSE === ($match = $this->_match_pair($string, $variable))) { @@ -200,25 +192,20 @@ private function _parse_pair($variable, $data, $string) // -------------------------------------------------------------------- /** - * Matches a variable pair + * Matches a variable pair * - * @access private * @param string * @param string * @return mixed */ - private function _match_pair($string, $variable) + protected function _match_pair($string, $variable) { - if ( ! preg_match("|" . preg_quote($this->l_delim) . $variable . preg_quote($this->r_delim) . "(.+?)". preg_quote($this->l_delim) . '/' . $variable . preg_quote($this->r_delim) . "|s", $string, $match)) - { - return FALSE; - } - - return $match; + return preg_match('|'.preg_quote($this->l_delim).$variable.preg_quote($this->r_delim).'(.+?)'.preg_quote($this->l_delim).'/'.$variable.preg_quote($this->r_delim).'|s', + $string, $match) + ? $match : FALSE; } } -// END Parser Class /* End of file Parser.php */ -/* Location: ./system/libraries/Parser.php */ +/* Location: ./system/libraries/Parser.php */ \ No newline at end of file From 03c644d7224847402058cde0fa3fbb4e810bfdf2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 15:09:34 +0300 Subject: [PATCH 0785/5397] Temporarily remove PHP 5.2 from travis config --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2584e8ac209..29111bcf597 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: php php: - - 5.2 - 5.3 - 5.4 From b24b033a9c285c98802fbd7bf16d486e355e2f97 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 15:34:39 +0300 Subject: [PATCH 0786/5397] Switch private methods and properties to protected and cleanup the Cache library and drivers --- system/libraries/Cache/Cache.php | 109 ++++++++---------- system/libraries/Cache/drivers/Cache_apc.php | 43 +++---- .../libraries/Cache/drivers/Cache_dummy.php | 37 +++--- system/libraries/Cache/drivers/Cache_file.php | 42 +++---- .../Cache/drivers/Cache_memcached.php | 57 ++++----- .../Cache/drivers/Cache_wincache.php | 7 +- 6 files changed, 125 insertions(+), 170 deletions(-) diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php index 7642a52701e..f9824161731 100644 --- a/system/libraries/Cache/Cache.php +++ b/system/libraries/Cache/Cache.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Caching Class * @@ -50,11 +48,37 @@ class CI_Cache extends CI_Driver_Library { protected $_adapter = 'dummy'; protected $_backup_driver; + /** + * Constructor + * + * Initialize class properties based on the configuration array. + * + * @param array + * @return void + */ public function __construct($config = array()) { - if ( ! empty($config)) + $default_config = array( + 'adapter', + 'memcached' + ); + + foreach ($default_config as $key) { - $this->_initialize($config); + if (isset($config[$key])) + { + $param = '_'.$key; + + $this->{$param} = $config[$key]; + } + } + + if (isset($config['backup'])) + { + if (in_array('cache_'.$config['backup'], $this->valid_drivers)) + { + $this->_backup_driver = $config['backup']; + } } } @@ -63,11 +87,11 @@ public function __construct($config = array()) /** * Get * - * Look for a value in the cache. If it exists, return the data + * Look for a value in the cache. If it exists, return the data * if not, return FALSE * - * @param string - * @return mixed value that is stored/FALSE on failure + * @param string + * @return mixed value that is stored/FALSE on failure */ public function get($id) { @@ -79,11 +103,10 @@ public function get($id) /** * Cache Save * - * @param string Unique Key - * @param mixed Data to store - * @param int Length of time (in seconds) to cache the data - * - * @return boolean true on success/false on failure + * @param string Unique Key + * @param mixed Data to store + * @param int Length of time (in seconds) to cache the data + * @return bool true on success/false on failure */ public function save($id, $data, $ttl = 60) { @@ -95,8 +118,8 @@ public function save($id, $data, $ttl = 60) /** * Delete from Cache * - * @param mixed unique identifier of the item in the cache - * @return boolean true on success/false on failure + * @param mixed unique identifier of the item in the cache + * @return bool true on success/false on failure */ public function delete($id) { @@ -108,7 +131,7 @@ public function delete($id) /** * Clean the cache * - * @return boolean false on failure/true on success + * @return bool false on failure/true on success */ public function clean() { @@ -120,8 +143,8 @@ public function clean() /** * Cache Info * - * @param string user/filehits - * @return mixed array on success, false on failure + * @param string user/filehits + * @return mixed array on success, false on failure */ public function cache_info($type = 'user') { @@ -133,8 +156,8 @@ public function cache_info($type = 'user') /** * Get Cache Metadata * - * @param mixed key to get cache metadata on - * @return mixed return value from child method + * @param mixed key to get cache metadata on + * @return mixed return value from child method */ public function get_metadata($id) { @@ -143,47 +166,11 @@ public function get_metadata($id) // ------------------------------------------------------------------------ - /** - * Initialize - * - * Initialize class properties based on the configuration array. - * - * @param array - * @return void - */ - private function _initialize($config) - { - $default_config = array( - 'adapter', - 'memcached' - ); - - foreach ($default_config as $key) - { - if (isset($config[$key])) - { - $param = '_'.$key; - - $this->{$param} = $config[$key]; - } - } - - if (isset($config['backup'])) - { - if (in_array('cache_'.$config['backup'], $this->valid_drivers)) - { - $this->_backup_driver = $config['backup']; - } - } - } - - // ------------------------------------------------------------------------ - /** * Is the requested driver supported in this environment? * - * @param string The driver to test. - * @return array + * @param string The driver to test. + * @return array */ public function is_supported($driver) { @@ -202,8 +189,8 @@ public function is_supported($driver) /** * __get() * - * @param child - * @return object + * @param child + * @return object */ public function __get($child) { @@ -217,9 +204,7 @@ public function __get($child) return $obj; } - // ------------------------------------------------------------------------ } -// End Class /* End of file Cache.php */ -/* Location: ./system/libraries/Cache/Cache.php */ +/* Location: ./system/libraries/Cache/Cache.php */ \ No newline at end of file diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php index c387a30fc04..59ab67533db 100644 --- a/system/libraries/Cache/drivers/Cache_apc.php +++ b/system/libraries/Cache/drivers/Cache_apc.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter APC Caching Class * @@ -36,23 +34,22 @@ * @author EllisLab Dev Team * @link */ - class CI_Cache_apc extends CI_Driver { /** * Get * - * Look for a value in the cache. If it exists, return the data + * Look for a value in the cache. If it exists, return the data * if not, return FALSE * - * @param string - * @return mixed value that is stored/FALSE on failure + * @param string + * @return mixed value that is stored/FALSE on failure */ public function get($id) { $data = apc_fetch($id); - return (is_array($data)) ? $data[0] : FALSE; + return is_array($data) ? $data[0] : FALSE; } // ------------------------------------------------------------------------ @@ -60,11 +57,11 @@ public function get($id) /** * Cache Save * - * @param string Unique Key - * @param mixed Data to store - * @param int Length of time (in seconds) to cache the data + * @param string Unique Key + * @param mixed Data to store + * @param int Length of time (in seconds) to cache the data * - * @return boolean true on success/false on failure + * @return bool true on success/false on failure */ public function save($id, $data, $ttl = 60) { @@ -77,8 +74,8 @@ public function save($id, $data, $ttl = 60) /** * Delete from Cache * - * @param mixed unique identifier of the item in the cache - * @param boolean true on success/false on failure + * @param mixed unique identifier of the item in the cache + * @param bool true on success/false on failure */ public function delete($id) { @@ -90,7 +87,7 @@ public function delete($id) /** * Clean the cache * - * @return boolean false on failure/true on success + * @return bool false on failure/true on success */ public function clean() { @@ -102,8 +99,8 @@ public function clean() /** * Cache Info * - * @param string user/filehits - * @return mixed array on success, false on failure + * @param string user/filehits + * @return mixed array on success, false on failure */ public function cache_info($type = NULL) { @@ -115,8 +112,8 @@ public function cache_info($type = NULL) /** * Get Cache Metadata * - * @param mixed key to get cache metadata on - * @return mixed array on success/false on failure + * @param mixed key to get cache metadata on + * @return mixed array on success/false on failure */ public function get_metadata($id) { @@ -142,10 +139,12 @@ public function get_metadata($id) * is_supported() * * Check to see if APC is available on this system, bail if it isn't. + * + * @return bool */ public function is_supported() { - if ( ! extension_loaded('apc') OR ini_get('apc.enabled') != "1") + if ( ! extension_loaded('apc') OR ! (bool) @ini_get('apc.enabled')) { log_message('error', 'The APC PHP extension must be loaded to use APC Cache.'); return FALSE; @@ -154,11 +153,7 @@ public function is_supported() return TRUE; } - // ------------------------------------------------------------------------ - - } -// End Class /* End of file Cache_apc.php */ -/* Location: ./system/libraries/Cache/drivers/Cache_apc.php */ +/* Location: ./system/libraries/Cache/drivers/Cache_apc.php */ \ No newline at end of file diff --git a/system/libraries/Cache/drivers/Cache_dummy.php b/system/libraries/Cache/drivers/Cache_dummy.php index c9767e4015c..e8b791c5b25 100644 --- a/system/libraries/Cache/drivers/Cache_dummy.php +++ b/system/libraries/Cache/drivers/Cache_dummy.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Dummy Caching Class * @@ -36,7 +34,6 @@ * @author EllisLab Dev Team * @link */ - class CI_Cache_dummy extends CI_Driver { /** @@ -44,8 +41,8 @@ class CI_Cache_dummy extends CI_Driver { * * Since this is the dummy class, it's always going to return FALSE. * - * @param string - * @return Boolean FALSE + * @param string + * @return bool FALSE */ public function get($id) { @@ -57,11 +54,10 @@ public function get($id) /** * Cache Save * - * @param string Unique Key - * @param mixed Data to store - * @param int Length of time (in seconds) to cache the data - * - * @return boolean TRUE, Simulating success + * @param string Unique Key + * @param mixed Data to store + * @param int Length of time (in seconds) to cache the data + * @return bool TRUE, Simulating success */ public function save($id, $data, $ttl = 60) { @@ -73,8 +69,8 @@ public function save($id, $data, $ttl = 60) /** * Delete from Cache * - * @param mixed unique identifier of the item in the cache - * @param boolean TRUE, simulating success + * @param mixed unique identifier of the item in the cache + * @param bool TRUE, simulating success */ public function delete($id) { @@ -86,7 +82,7 @@ public function delete($id) /** * Clean the cache * - * @return boolean TRUE, simulating success + * @return bool TRUE, simulating success */ public function clean() { @@ -98,8 +94,8 @@ public function clean() /** * Cache Info * - * @param string user/filehits - * @return boolean FALSE + * @param string user/filehits + * @return bool FALSE */ public function cache_info($type = NULL) { @@ -111,8 +107,8 @@ public function cache_info($type = NULL) /** * Get Cache Metadata * - * @param mixed key to get cache metadata on - * @return boolean FALSE + * @param mixed key to get cache metadata on + * @return bool FALSE */ public function get_metadata($id) { @@ -125,17 +121,14 @@ public function get_metadata($id) * Is this caching driver supported on the system? * Of course this one is. * - * @return TRUE; + * @return bool TRUE */ public function is_supported() { return TRUE; } - // ------------------------------------------------------------------------ - } -// End Class /* End of file Cache_dummy.php */ -/* Location: ./system/libraries/Cache/drivers/Cache_dummy.php */ +/* Location: ./system/libraries/Cache/drivers/Cache_dummy.php */ \ No newline at end of file diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index c0be0def4b2..dd27aa90e25 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Memcached Caching Class * @@ -36,14 +34,10 @@ * @author EllisLab Dev Team * @link */ - class CI_Cache_file extends CI_Driver { protected $_cache_path; - /** - * Constructor - */ public function __construct() { $CI =& get_instance(); @@ -57,8 +51,8 @@ public function __construct() /** * Fetch from cache * - * @param mixed unique key id - * @return mixed data on success/false on failure + * @param mixed unique key id + * @return mixed data on success/false on failure */ public function get($id) { @@ -83,11 +77,11 @@ public function get($id) /** * Save into cache * - * @param string unique key - * @param mixed data to store - * @param int length of time (in seconds) the cache is valid - * - Default is 60 seconds - * @return boolean true on success/false on failure + * @param string unique key + * @param mixed data to store + * @param int length of time (in seconds) the cache is valid + * - Default is 60 seconds + * @return bool true on success/false on failure */ public function save($id, $data, $ttl = 60) { @@ -111,12 +105,12 @@ public function save($id, $data, $ttl = 60) /** * Delete from Cache * - * @param mixed unique identifier of item in cache - * @return boolean true on success/false on failure + * @param mixed unique identifier of item in cache + * @return bool true on success/false on failure */ public function delete($id) { - return (file_exists($this->_cache_path.$id)) ? unlink($this->_cache_path.$id) : FALSE; + return file_exists($this->_cache_path.$id) ? unlink($this->_cache_path.$id) : FALSE; } // ------------------------------------------------------------------------ @@ -124,7 +118,7 @@ public function delete($id) /** * Clean the Cache * - * @return boolean false on failure/true on success + * @return bool false on failure/true on success */ public function clean() { @@ -138,8 +132,8 @@ public function clean() * * Not supported by file-based caching * - * @param string user/filehits - * @return mixed FALSE + * @param string user/filehits + * @return mixed FALSE */ public function cache_info($type = NULL) { @@ -151,8 +145,8 @@ public function cache_info($type = NULL) /** * Get Cache Metadata * - * @param mixed key to get cache metadata on - * @return mixed FALSE on failure, array on success. + * @param mixed key to get cache metadata on + * @return mixed FALSE on failure, array on success. */ public function get_metadata($id) { @@ -188,16 +182,14 @@ public function get_metadata($id) * * In the file driver, check to see that the cache directory is indeed writable * - * @return boolean + * @return bool */ public function is_supported() { return is_really_writable($this->_cache_path); } - // ------------------------------------------------------------------------ } -// End Class /* End of file Cache_file.php */ -/* Location: ./system/libraries/Cache/drivers/Cache_file.php */ +/* Location: ./system/libraries/Cache/drivers/Cache_file.php */ \ No newline at end of file diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index b8f2d7e4c49..1028c8fd522 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Memcached Caching Class * @@ -36,12 +34,11 @@ * @author EllisLab Dev Team * @link */ - class CI_Cache_memcached extends CI_Driver { - private $_memcached; // Holds the memcached object + protected $_memcached; // Holds the memcached object - protected $_memcache_conf = array( + protected $_memcache_conf = array( 'default' => array( 'default_host' => '127.0.0.1', 'default_port' => 11211, @@ -49,19 +46,17 @@ class CI_Cache_memcached extends CI_Driver { ) ); - // ------------------------------------------------------------------------ - /** * Fetch from cache * - * @param mixed unique key id - * @return mixed data on success/false on failure + * @param mixed unique key id + * @return mixed data on success/false on failure */ public function get($id) { $data = $this->_memcached->get($id); - return (is_array($data)) ? $data[0] : FALSE; + return is_array($data) ? $data[0] : FALSE; } // ------------------------------------------------------------------------ @@ -69,18 +64,18 @@ public function get($id) /** * Save * - * @param string unique identifier - * @param mixed data being cached - * @param int time to live - * @return boolean true on success, false on failure + * @param string unique identifier + * @param mixed data being cached + * @param int time to live + * @return bool true on success, false on failure */ public function save($id, $data, $ttl = 60) { - if (get_class($this->_memcached) == 'Memcached') + if (get_class($this->_memcached) === 'Memcached') { return $this->_memcached->set($id, array($data, time(), $ttl), $ttl); } - else if (get_class($this->_memcached) == 'Memcache') + elseif (get_class($this->_memcached) === 'Memcache') { return $this->_memcached->set($id, array($data, time(), $ttl), 0, $ttl); } @@ -93,8 +88,8 @@ public function save($id, $data, $ttl = 60) /** * Delete from Cache * - * @param mixed key to be deleted. - * @return boolean true on success, false on failure + * @param mixed key to be deleted. + * @return bool true on success, false on failure */ public function delete($id) { @@ -106,7 +101,7 @@ public function delete($id) /** * Clean the Cache * - * @return boolean false on failure/true on success + * @return bool false on failure/true on success */ public function clean() { @@ -118,10 +113,9 @@ public function clean() /** * Cache Info * - * @param null type not supported in memcached - * @return mixed array on success, false on failure + * @return mixed array on success, false on failure */ - public function cache_info($type = NULL) + public function cache_info() { return $this->_memcached->getStats(); } @@ -131,8 +125,8 @@ public function cache_info($type = NULL) /** * Get Cache Metadata * - * @param mixed key to get cache metadata on - * @return mixed FALSE on failure, array on success. + * @param mixed key to get cache metadata on + * @return mixed FALSE on failure, array on success. */ public function get_metadata($id) { @@ -156,8 +150,10 @@ public function get_metadata($id) /** * Setup memcached. + * + * @return bool */ - private function _setup_memcached() + protected function _setup_memcached() { // Try to load memcached server info from the config file. $CI =& get_instance(); @@ -179,14 +175,13 @@ private function _setup_memcached() { $this->_memcached = new Memcached(); } - else if (class_exists('Memcache')) + elseif (class_exists('Memcache')) { $this->_memcached = new Memcache(); } else { log_message('error', 'Failed to create object for Memcached Cache; extension not loaded?'); - return FALSE; } @@ -237,23 +232,21 @@ private function _setup_memcached() * * Returns FALSE if memcached is not supported on the system. * If it is, we setup the memcached object & return TRUE + * + * @return bool */ public function is_supported() { if ( ! extension_loaded('memcached') && ! extension_loaded('memcache')) { log_message('error', 'The Memcached Extension must be loaded to use Memcached Cache.'); - return FALSE; } return $this->_setup_memcached(); } - // ------------------------------------------------------------------------ - } -// End Class /* End of file Cache_memcached.php */ -/* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */ +/* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */ \ No newline at end of file diff --git a/system/libraries/Cache/drivers/Cache_wincache.php b/system/libraries/Cache/drivers/Cache_wincache.php index df619d4e6dd..b32e66a465e 100644 --- a/system/libraries/Cache/drivers/Cache_wincache.php +++ b/system/libraries/Cache/drivers/Cache_wincache.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Wincache Caching Class * @@ -39,7 +37,6 @@ * @author Mike Murkovic * @link */ - class CI_Cache_wincache extends CI_Driver { /** @@ -68,7 +65,7 @@ public function get($id) * @param string Unique Key * @param mixed Data to store * @param int Length of time (in seconds) to cache the data - * @return bool true on success/false on failure + * @return bool true on success/false on failure */ public function save($id, $data, $ttl = 60) { @@ -162,4 +159,4 @@ public function is_supported() } /* End of file Cache_wincache.php */ -/* Location: ./system/libraries/Cache/drivers/Cache_wincache.php */ +/* Location: ./system/libraries/Cache/drivers/Cache_wincache.php */ \ No newline at end of file From 6dbabb565e1411a2c62fa86d46b0b2bbb98ab9b0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 15:41:48 +0300 Subject: [PATCH 0787/5397] Switch a private property to protected and cleanup the Calendar library --- system/libraries/Calendar.php | 61 +++++++++++++++-------------------- 1 file changed, 26 insertions(+), 35 deletions(-) diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php index 6c04de8a266..b6f145d953b 100644 --- a/system/libraries/Calendar.php +++ b/system/libraries/Calendar.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Calendar Class * @@ -40,7 +38,7 @@ */ class CI_Calendar { - private $CI; + protected $CI; public $lang; public $local_time; public $template = ''; @@ -54,6 +52,9 @@ class CI_Calendar { * Constructor * * Loads the calendar language file and sets the default time reference + * + * @param array + * @return void */ public function __construct($config = array()) { @@ -71,7 +72,7 @@ public function __construct($config = array()) $this->initialize($config); } - log_message('debug', "Calendar Class Initialized"); + log_message('debug', 'Calendar Class Initialized'); } // -------------------------------------------------------------------- @@ -81,7 +82,6 @@ public function __construct($config = array()) * * Accepts an associative array as input, containing display preferences * - * @access public * @param array config preferences * @return void */ @@ -101,9 +101,8 @@ public function initialize($config = array()) /** * Generate the calendar * - * @access public - * @param integer the year - * @param integer the month + * @param int the year + * @param int the month * @param array the data to be shown in the calendar cells * @return string */ @@ -147,7 +146,7 @@ public function generate($year = '', $month = '', $data = array()) // Set the starting day number $local_date = mktime(12, 0, 0, $month, 1, $year); $date = getdate($local_date); - $day = $start_day + 1 - $date["wday"]; + $day = $start_day + 1 - $date['wday']; while ($day > 1) { @@ -160,7 +159,7 @@ public function generate($year = '', $month = '', $data = array()) $cur_month = date('m', $this->local_time); $cur_day = date('j', $this->local_time); - $is_current_month = ($cur_year == $year AND $cur_month == $month) ? TRUE : FALSE; + $is_current_month = ($cur_year == $year && $cur_month == $month); // Generate the template data array $this->parse_template(); @@ -172,7 +171,7 @@ public function generate($year = '', $month = '', $data = array()) if ($this->show_next_prev == TRUE) { // Add a trailing slash to the URL if needed - $this->next_prev_url = preg_replace("/(.+?)\/*$/", "\\1/", $this->next_prev_url); + $this->next_prev_url = preg_replace('/(.+?)\/*$/', '\\1/', $this->next_prev_url); $adjusted_date = $this->adjust_date($month - 1, $year); $out .= str_replace('{previous_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->temp['heading_previous_cell'])."\n"; @@ -213,21 +212,21 @@ public function generate($year = '', $month = '', $data = array()) for ($i = 0; $i < 7; $i++) { - $out .= ($is_current_month === TRUE AND $day == $cur_day) ? $this->temp['cal_cell_start_today'] : $this->temp['cal_cell_start']; + $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->temp['cal_cell_start_today'] : $this->temp['cal_cell_start']; - if ($day > 0 AND $day <= $total_days) + if ($day > 0 && $day <= $total_days) { if (isset($data[$day])) { // Cells with content - $temp = ($is_current_month === TRUE AND $day == $cur_day) ? + $temp = ($is_current_month === TRUE && $day == $cur_day) ? $this->temp['cal_cell_content_today'] : $this->temp['cal_cell_content']; $out .= str_replace(array('{content}', '{day}'), array($data[$day], $day), $temp); } else { // Cells with no content - $temp = ($is_current_month === TRUE AND $day == $cur_day) ? + $temp = ($is_current_month === TRUE && $day == $cur_day) ? $this->temp['cal_cell_no_content_today'] : $this->temp['cal_cell_no_content']; $out .= str_replace('{day}', $day, $temp); } @@ -238,7 +237,7 @@ public function generate($year = '', $month = '', $data = array()) $out .= $this->temp['cal_cell_blank']; } - $out .= ($is_current_month === TRUE AND $day == $cur_day) ? $this->temp['cal_cell_end_today'] : $this->temp['cal_cell_end']; + $out .= ($is_current_month === TRUE && $day == $cur_day) ? $this->temp['cal_cell_end_today'] : $this->temp['cal_cell_end']; $day++; } @@ -258,8 +257,7 @@ public function generate($year = '', $month = '', $data = array()) * Generates a textual month name based on the numeric * month provided. * - * @access public - * @param integer the month + * @param int the month * @return string */ public function get_month_name($month) @@ -289,9 +287,8 @@ public function get_month_name($month) * Get Day Names * * Returns an array of day names (Sunday, Monday, etc.) based - * on the type. Options: long, short, abrev + * on the type. Options: long, short, abrev * - * @access public * @param string * @return array */ @@ -333,9 +330,8 @@ public function get_day_names($day_type = '') * For example, if you submit 13 as the month, the year will * increment and the month will become January. * - * @access public - * @param integer the month - * @param integer the year + * @param int the month + * @param int the year * @return array */ public function adjust_date($month, $year) @@ -370,10 +366,9 @@ public function adjust_date($month, $year) /** * Total days in a given month * - * @access public - * @param integer the month - * @param integer the year - * @return integer + * @param int the month + * @param int the year + * @return int */ public function get_total_days($month, $year) { @@ -387,7 +382,7 @@ public function get_total_days($month, $year) // Is the year a leap year? if ($month == 2) { - if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0)) + if ($year % 400 == 0 OR ($year % 4 == 0 && $year % 100 != 0)) { return 29; } @@ -403,8 +398,7 @@ public function get_total_days($month, $year) * * This is used in the event that the user has not created their own template * - * @access public - * @return array + * @return array */ public function default_template() { @@ -441,7 +435,6 @@ public function default_template() * Harvests the data within the template {pseudo-variables} * used to display the calendar * - * @access public * @return void */ public function parse_template() @@ -457,7 +450,7 @@ public function parse_template() foreach (array('table_open', 'table_close', 'heading_row_start', 'heading_previous_cell', 'heading_title_cell', 'heading_next_cell', 'heading_row_end', 'week_row_start', 'week_day_cell', 'week_row_end', 'cal_row_start', 'cal_cell_start', 'cal_cell_content', 'cal_cell_no_content', 'cal_cell_blank', 'cal_cell_end', 'cal_row_end', 'cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today') as $val) { - if (preg_match("/\{".$val."\}(.*?)\{\/".$val."\}/si", $this->template, $match)) + if (preg_match('/\{'.$val.'\}(.*?)\{\/'.$val.'\}/si', $this->template, $match)) { $this->temp[$val] = $match[1]; } @@ -470,7 +463,5 @@ public function parse_template() } -// END CI_Calendar class - /* End of file Calendar.php */ -/* Location: ./system/libraries/Calendar.php */ +/* Location: ./system/libraries/Calendar.php */ \ No newline at end of file From bb30d79ef0a7d2a3949c479783ab2a1390118836 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 15:49:09 +0300 Subject: [PATCH 0788/5397] Remove access description lines and fix comments in system/core/Common.php --- system/core/Common.php | 190 +++++++++++++++++++++-------------------- 1 file changed, 96 insertions(+), 94 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index f20acafd45f..aeb784bbea2 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * Common Functions * @@ -42,15 +40,14 @@ // ------------------------------------------------------------------------ /** -* 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 -*/ + * 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. + * + * @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') @@ -76,7 +73,7 @@ function is_php($version = '5.0.0') * the file, based on the read-only attribute. is_writable() is also unreliable * on Unix servers if safe_mode is on. * - * @access public + * @param string * @return void */ if ( ! function_exists('is_really_writable')) @@ -118,18 +115,17 @@ function is_really_writable($file) // ------------------------------------------------------------------------ /** -* 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 -*/ + * 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. + * + * @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_') @@ -192,12 +188,12 @@ function &load_class($class, $directory = 'libraries', $prefix = 'CI_') // -------------------------------------------------------------------- /** -* Keeps track of which libraries have been loaded. This function is -* called by the load_class() function above -* -* @access public -* @return array -*/ + * Keeps track of which libraries have been loaded. This function is + * called by the load_class() function above + * + * @param string + * @return array + */ if ( ! function_exists('is_loaded')) { function &is_loaded($class = '') @@ -216,14 +212,14 @@ function &is_loaded($class = '') // ------------------------------------------------------------------------ /** -* 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 -*/ + * Loads the main config.php file + * + * This function lets us grab the config file even if the Config class + * hasn't been instantiated yet + * + * @param array + * @return array + */ if ( ! function_exists('get_config')) { function &get_config($replace = array()) @@ -276,11 +272,11 @@ function &get_config($replace = array()) // ------------------------------------------------------------------------ /** -* Returns the specified config item -* -* @access public -* @return mixed -*/ + * Returns the specified config item + * + * @param string + * @return mixed + */ if ( ! function_exists('config_item')) { function config_item($item) @@ -305,17 +301,19 @@ function 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 -*/ + * 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. + * + * @param string + * @param int + * @param string + * @return void + */ if ( ! function_exists('show_error')) { function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') @@ -329,15 +327,16 @@ function show_error($message, $status_code = 500, $heading = 'An Error Was Encou // ------------------------------------------------------------------------ /** -* 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 -*/ + * 404 Page Handler + * + * This function is similar to the show_error() function above + * However, instead of the standard error template it displays + * 404 errors. + * + * @param string + * @param bool + * @return void + */ if ( ! function_exists('show_404')) { function show_404($page = '', $log_error = TRUE) @@ -351,14 +350,16 @@ function show_404($page = '', $log_error = TRUE) // ------------------------------------------------------------------------ /** -* 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 -*/ + * Error Logging Interface + * + * We use this as a simple mechanism to access the logging + * class and send messages to be logged. + * + * @param string + * @param string + * @param bool + * @return void + */ if ( ! function_exists('log_message')) { function log_message($level = 'error', $message, $php_error = FALSE) @@ -380,8 +381,7 @@ function log_message($level = 'error', $message, $php_error = FALSE) /** * Set HTTP Status Header * - * @access public - * @param int the status code + * @param int the status code * @param string * @return void */ @@ -467,19 +467,22 @@ function set_status_header($code = 200, $text = '') // -------------------------------------------------------------------- /** -* 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 -*/ + * 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. + * + * @param int + * @param string + * @param string + * @param int + * @return void + */ if ( ! function_exists('_exception_handler')) { function _exception_handler($severity, $message, $filepath, $line) @@ -521,8 +524,8 @@ function _exception_handler($severity, $message, $filepath, $line) * This prevents sandwiching null characters * between ascii characters, like Java\0script. * - * @access public * @param string + * @param bool * @return string */ if ( ! function_exists('remove_invisible_characters')) @@ -554,12 +557,11 @@ function remove_invisible_characters($str, $url_encoded = TRUE) // ------------------------------------------------------------------------ /** -* Returns HTML escaped variable -* -* @access public -* @param mixed -* @return mixed -*/ + * Returns HTML escaped variable + * + * @param mixed + * @return mixed + */ if ( ! function_exists('html_escape')) { function html_escape($var) @@ -571,4 +573,4 @@ function html_escape($var) } /* End of file Common.php */ -/* Location: ./system/core/Common.php */ +/* Location: ./system/core/Common.php */ \ No newline at end of file From a8bb4be3b2aa5984c465bbcf1ef51fd3eba92208 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 15:54:23 +0300 Subject: [PATCH 0789/5397] Remove remaining access description lines from database classes and styleguide example --- system/database/DB_active_rec.php | 40 +++++++------------ .../database/drivers/mysqli/mysqli_driver.php | 1 - user_guide_src/source/general/styleguide.rst | 1 - 3 files changed, 15 insertions(+), 27 deletions(-) diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index fe591dda1c3..b324226ab18 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * Active Record Class * @@ -422,7 +420,7 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) foreach ($key as $k => $v) { - $prefix = (count($this->ar_where) === 0 AND count($this->ar_cache_where) === 0) ? '' : $type; + $prefix = (count($this->ar_where) === 0 && count($this->ar_cache_where) === 0) ? '' : $type; if (is_null($v) && ! $this->_has_operator($k)) { @@ -537,7 +535,7 @@ public function or_where_not_in($key = NULL, $values = NULL) * * @param string The field to search * @param array The values searched on - * @param boolean If the statement would be IN or NOT IN + * @param bool If the statement would be IN or NOT IN * @param string * @return object */ @@ -719,7 +717,7 @@ public function group_start($not = '', $type = 'AND ') { $type = $this->_group_get_type($type); $this->ar_where_group_started = TRUE; - $prefix = (count($this->ar_where) === 0 AND count($this->ar_cache_where) === 0) ? '' : $type; + $prefix = (count($this->ar_where) === 0 && count($this->ar_cache_where) === 0) ? '' : $type; $this->ar_where[] = $value = $prefix.$not.str_repeat(' ', ++$this->ar_where_group_count).' ('; if ($this->ar_caching) @@ -984,8 +982,8 @@ public function order_by($orderby, $direction = '', $escape = TRUE) /** * Sets the LIMIT value * - * @param integer the limit value - * @param integer the offset value + * @param int the limit value + * @param int the offset value * @return object */ public function limit($value, $offset = NULL) @@ -1005,7 +1003,7 @@ public function limit($value, $offset = NULL) /** * Sets the OFFSET value * - * @param integer the offset value + * @param int the offset value * @return object */ public function offset($offset) @@ -1021,7 +1019,7 @@ public function offset($offset) * * @param mixed * @param string - * @param boolean + * @param bool * @return object */ public function set($key, $value = '', $escape = TRUE) @@ -1055,9 +1053,8 @@ public function set($key, $value = '', $escape = TRUE) * * Compiles a SELECT query string and returns the sql. * - * @access public * @param string the table name to select from (optional) - * @param boolean TRUE: resets AR values; FALSE: leave AR vaules alone + * @param bool TRUE: resets AR values; FALSE: leave AR vaules alone * @return string */ public function get_compiled_select($table = '', $reset = TRUE) @@ -1226,7 +1223,7 @@ public function insert_batch($table = '', $set = NULL) * * @param mixed * @param string - * @param boolean + * @param bool * @return object */ public function set_insert_batch($key, $value = '', $escape = TRUE) @@ -1283,9 +1280,8 @@ public function set_insert_batch($key, $value = '', $escape = TRUE) * * Compiles an insert query and returns the sql * - * @access public * @param string the table to insert into - * @param boolean TRUE: reset AR values; FALSE: leave AR values alone + * @param bool TRUE: reset AR values; FALSE: leave AR values alone * @return string */ public function get_compiled_insert($table = '', $reset = TRUE) @@ -1316,7 +1312,6 @@ public function get_compiled_insert($table = '', $reset = TRUE) * * Compiles an insert string and runs the query * - * @access public * @param string the table to insert data into * @param array an associative array of insert values * @return object @@ -1352,7 +1347,6 @@ public function insert($table = '', $set = NULL) * validate that the there data is actually being set and that table * has been chosen to be inserted into. * - * @access public * @param string the table to insert data into * @return string */ @@ -1423,9 +1417,8 @@ public function replace($table = '', $set = NULL) * * Compiles an update query and returns the sql * - * @access public * @param string the table to update - * @param boolean TRUE: reset AR values; FALSE: leave AR values alone + * @param bool TRUE: reset AR values; FALSE: leave AR values alone * @return string */ public function get_compiled_update($table = '', $reset = TRUE) @@ -1499,7 +1492,6 @@ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) * validate that data is actually being set and that a table has been * chosen to be update. * - * @access public * @param string the table to update data on * @return bool */ @@ -1584,7 +1576,7 @@ public function update_batch($table = '', $set = NULL, $index = NULL) * * @param array * @param string - * @param boolean + * @param bool * @return object */ public function set_update_batch($key, $index = '', $escape = TRUE) @@ -1696,9 +1688,8 @@ public function truncate($table = '') * * Compiles a delete query string and returns the sql * - * @access public * @param string the table to delete from - * @param boolean TRUE: reset AR values; FALSE: leave AR values alone + * @param bool TRUE: reset AR values; FALSE: leave AR values alone * @return string */ public function get_compiled_delete($table = '', $reset = TRUE) @@ -1719,7 +1710,7 @@ public function get_compiled_delete($table = '', $reset = TRUE) * @param mixed the table(s) to delete from. String or array * @param mixed the where clause * @param mixed the limit clause - * @param boolean + * @param bool * @return object */ public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE) @@ -2062,7 +2053,6 @@ public function stop_cache() * * Empties the AR cache * - * @access public * @return void */ public function flush_cache() @@ -2114,7 +2104,7 @@ protected function _merge_cache() // If we are "protecting identifiers" we need to examine the "from" // portion of the query to determine if there are any aliases - if ($this->_protect_identifiers === TRUE AND count($this->ar_cache_from) > 0) + if ($this->_protect_identifiers === TRUE && count($this->ar_cache_from) > 0) { $this->_track_aliases($this->ar_from); } diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 4c5d52127f2..041daf71093 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -357,7 +357,6 @@ public function count_all($table = '') * * Generates a platform-specific query string so that the table names can be fetched * - * @access private * @param bool * @return string */ diff --git a/user_guide_src/source/general/styleguide.rst b/user_guide_src/source/general/styleguide.rst index d8bdd05317d..c97f2381739 100644 --- a/user_guide_src/source/general/styleguide.rst +++ b/user_guide_src/source/general/styleguide.rst @@ -168,7 +168,6 @@ picked up by IDEs:: /** * Encodes string for use in XML * - * @access public * @param string * @return string */ From 5227837eca102b5aa2c14daa4201ffcb0a79f246 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 16:02:30 +0300 Subject: [PATCH 0790/5397] Remove access description lines and cleanup the Xmlrpcs library --- system/libraries/Xmlrpcs.php | 64 +++++++++++------------------------- 1 file changed, 20 insertions(+), 44 deletions(-) diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php index fc41444bc59..6d270c2ea3d 100644 --- a/system/libraries/Xmlrpcs.php +++ b/system/libraries/Xmlrpcs.php @@ -54,10 +54,7 @@ class CI_Xmlrpcs extends CI_Xmlrpc public $controller_obj; public $object = FALSE; - /** - * Constructor - */ - public function __construct($config=array()) + public function __construct($config = array()) { parent::__construct(); $this->set_system_methods(); @@ -67,7 +64,7 @@ public function __construct($config=array()) $this->methods = array_merge($this->methods, $config['functions']); } - log_message('debug', "XML-RPC Server Class Initialized"); + log_message('debug', 'XML-RPC Server Class Initialized'); } // -------------------------------------------------------------------- @@ -75,7 +72,6 @@ public function __construct($config=array()) /** * Initialize Prefs and Serve * - * @access public * @param mixed * @return void */ @@ -107,7 +103,6 @@ public function initialize($config = array()) /** * Setting of System Methods * - * @access public * @return void */ public function set_system_methods() @@ -137,7 +132,6 @@ public function set_system_methods() /** * Main Server Function * - * @access public * @return void */ public function serve() @@ -145,8 +139,8 @@ public function serve() $r = $this->parseRequest(); $payload = 'xmlrpc_defencoding.'"?'.'>'."\n".$this->debug_msg.$r->prepare_response(); - header("Content-Type: text/xml"); - header("Content-Length: ".strlen($payload)); + header('Content-Type: text/xml'); + header('Content-Length: '.strlen($payload)); exit($payload); } @@ -155,7 +149,6 @@ public function serve() /** * Add Method to Class * - * @access public * @param string method name * @param string function * @param string signature @@ -176,7 +169,6 @@ public function add_to_map($methodname, $function, $sig, $doc) /** * Parse Server Request * - * @access public * @param string data * @return object xmlrpc response */ @@ -198,7 +190,7 @@ public function parseRequest($data = '') //------------------------------------- $parser = xml_parser_create($this->xmlrpc_defencoding); - $parser_object = new XML_RPC_Message("filler"); + $parser_object = new XML_RPC_Message('filler'); $parser_object->xh[$parser] = array( 'isf' => 0, @@ -215,7 +207,6 @@ public function parseRequest($data = '') xml_set_character_data_handler($parser, 'character_data'); //xml_set_default_handler($parser, 'default_handler'); - //------------------------------------- // PARSE + PROCESS XML DATA //------------------------------------- @@ -245,7 +236,7 @@ public function parseRequest($data = '') { if ($this->debug === TRUE) { - $plist .= "$i - " . print_r(get_object_vars($parser_object->xh[$parser]['params'][$i]), TRUE). ";\n"; + $plist .= $i.' - '.print_r(get_object_vars($parser_object->xh[$parser]['params'][$i]), TRUE).";\n"; } $m->addParam($parser_object->xh[$parser]['params'][$i]); @@ -276,7 +267,6 @@ public function parseRequest($data = '') /** * Executes the Method * - * @access protected * @param object * @return mixed */ @@ -305,7 +295,7 @@ protected function _execute($m) // Check for Method (and Object) //------------------------------------- - $method_parts = explode(".", $this->methods[$methName]['function']); + $method_parts = explode('.', $this->methods[$methName]['function']); $objectCall = (isset($method_parts[1]) && $method_parts[1] != ''); if ($system_call === TRUE) @@ -315,14 +305,11 @@ protected function _execute($m) return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); } } - else + elseif (($objectCall && ! is_callable(array($method_parts[0], $method_parts[1]))) + OR ( ! $objectCall && ! is_callable($this->methods[$methName]['function'])) + ) { - if (($objectCall AND ! is_callable(array($method_parts[0], $method_parts[1]))) - OR ( ! $objectCall AND ! is_callable($this->methods[$methName]['function'])) - ) - { - return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); - } + return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); } //------------------------------------- @@ -351,7 +338,7 @@ protected function _execute($m) return new XML_RPC_Response(0, $this->xmlrpcerr['incorrect_params'], $this->xmlrpcstr['incorrect_params'] . - ": Wanted {$wanted}, got {$pt} at param {$pno})"); + ': Wanted '.$wanted.', got '.$pt.' at param '.$pno.')'); } } } @@ -393,7 +380,6 @@ protected function _execute($m) /** * Server Function: List Methods * - * @access public * @param mixed * @return object */ @@ -409,7 +395,7 @@ public function listMethods($m) foreach ($this->system_methods as $key => $value) { - $output[]= new XML_RPC_Values($key, 'string'); + $output[] = new XML_RPC_Values($key, 'string'); } $v->addArray($output); @@ -421,7 +407,6 @@ public function listMethods($m) /** * Server Function: Return Signature for Method * - * @access public * @param mixed * @return object */ @@ -447,18 +432,14 @@ public function methodSignature($m) } $sigs[] = new XML_RPC_Values($cursig, 'array'); } - $r = new XML_RPC_Response(new XML_RPC_Values($sigs, 'array')); - } - else - { - $r = new XML_RPC_Response(new XML_RPC_Values('undef', 'string')); + + return new XML_RPC_Response(new XML_RPC_Values($sigs, 'array')); } + + return new XML_RPC_Response(new XML_RPC_Values('undef', 'string')); } - else - { - $r = new XML_RPC_Response(0,$this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']); - } - return $r; + + return new XML_RPC_Response(0,$this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']); } // -------------------------------------------------------------------- @@ -466,7 +447,6 @@ public function methodSignature($m) /** * Server Function: Doc String for Method * - * @access public * @param mixed * @return object */ @@ -492,7 +472,6 @@ public function methodHelp($m) /** * Server Function: Multi-call * - * @access public * @param mixed * @return object */ @@ -536,7 +515,6 @@ public function multicall($m) /** * Multi-call Function: Error Handling * - * @access public * @param mixed * @return object */ @@ -556,7 +534,6 @@ public function multicall_error($err) /** * Multi-call Function: Processes method * - * @access public * @param mixed * @return object */ @@ -610,7 +587,6 @@ public function do_multicall($call) } } -// END XML_RPC_Server class /* End of file Xmlrpcs.php */ -/* Location: ./system/libraries/Xmlrpcs.php */ +/* Location: ./system/libraries/Xmlrpcs.php */ \ No newline at end of file From d69082b8af130ac74806203140a391fc8ca18b82 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 16:14:26 +0300 Subject: [PATCH 0791/5397] Remove access description lines and cleanup the Typography library --- system/libraries/Typography.php | 53 +++++++++++++-------------------- 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/system/libraries/Typography.php b/system/libraries/Typography.php index 65e30b089d8..21bbad038e2 100644 --- a/system/libraries/Typography.php +++ b/system/libraries/Typography.php @@ -25,13 +25,11 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * Typography Class * - * - * @access protected + * @package CodeIgniter + * @subpackage Libraries * @category Helpers * @author EllisLab Dev Team * @link http://codeigniter.com/user_guide/libraries/typography.html @@ -67,7 +65,6 @@ class CI_Typography { * - Converts double dashes into em-dashes. * - Converts two spaces into entities * - * @access public * @param string * @param bool whether to reduce more then two consecutive newlines to two * @return string @@ -94,15 +91,12 @@ public function auto_typography($str, $reduce_linebreaks = FALSE) // HTML comment tags don't conform to patterns of normal tags, so pull them out separately, only if needed $html_comments = array(); - if (strpos($str, '", - "'", - "<", - ">", - '"', - '&', - '$', - '=', - ';', - '?', - '/', - "%20", - "%22", - "%3c", // < - "%253c", // < - "%3e", // > - "%0e", // > - "%28", // ( - "%29", // ) - "%2528", // ( - "%26", // & - "%24", // $ - "%3f", // ? - "%3b", // ; - "%3d" // = - ); - - $filename = str_replace($bad, '', $filename); - - return stripslashes($filename); + '', + "'", '"', + '<', '>', + '&', '$', + '=', + ';', + '?', + '/', + '%20', + '%22', + '%3c', // < + '%253c', // < + '%3e', // > + '%0e', // > + '%28', // ( + '%29', // ) + '%2528', // ( + '%26', // & + '%24', // $ + '%3f', // ? + '%3b', // ; + '%3d' // = + ); + + return stripslashes(str_replace($bad, '', $filename)); } // -------------------------------------------------------------------- @@ -847,7 +817,7 @@ public function do_xss_clean() $current = ini_get('memory_limit') * 1024 * 1024; // There was a bug/behavioural change in PHP 5.2, where numbers over one million get output - // into scientific notation. number_format() ensures this number is an integer + // into scientific notation. number_format() ensures this number is an integer // http://bugs.php.net/bug.php?id=43053 $new_memory = number_format(ceil(filesize($file) + $current), 0, '.', ''); @@ -857,8 +827,8 @@ public function do_xss_clean() // If the file being uploaded is an image, then we should have no problem with XSS attacks (in theory), but // IE can be fooled into mime-type detecting a malformed image as an html file, thus executing an XSS attack on anyone - // using IE who looks at the image. It does this by inspecting the first 255 bytes of an image. To get around this - // CI will itself look at the first 255 bytes of an image to determine its relative safety. This can save a lot of + // using IE who looks at the image. It does this by inspecting the first 255 bytes of an image. To get around this + // CI will itself look at the first 255 bytes of an image to determine its relative safety. This can save a lot of // processor power and time if it is actually a clean image, as it will be in nearly all instances _except_ an // attempted XSS attack. @@ -932,7 +902,7 @@ public function set_error($msg) */ public function display_errors($open = '

    ', $close = '

    ') { - return (count($this->error_msg) > 0) ? $open . implode($close . $open, $this->error_msg) . $close : ''; + return (count($this->error_msg) > 0) ? $open.implode($close.$open, $this->error_msg).$close : ''; } // -------------------------------------------------------------------- @@ -940,7 +910,7 @@ public function display_errors($open = '

    ', $close = '

    ') /** * List of Mime Types * - * This is a list of mime types. We use it to validate + * This is a list of mime types. We use it to validate * the "allowed types" set by the developer * * @param string @@ -952,7 +922,7 @@ public function mimes_types($mime) if (count($this->mimes) == 0) { - if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) + if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); } @@ -966,10 +936,9 @@ public function mimes_types($mime) } $this->mimes = $mimes; - unset($mimes); } - return ( ! isset($this->mimes[$mime])) ? FALSE : $this->mimes[$mime]; + return isset($this->mimes[$mime]) ? $this->mimes[$mime] : FALSE; } // -------------------------------------------------------------------- @@ -1006,9 +975,7 @@ protected function _prep_filename($filename) } } - $filename .= '.'.$ext; - - return $filename; + return $filename.'.'.$ext; } // -------------------------------------------------------------------- @@ -1129,10 +1096,7 @@ protected function _file_mime_type($file) $this->file_type = $file['type']; } - // -------------------------------------------------------------------- - } -// END Upload Class /* End of file Upload.php */ -/* Location: ./system/libraries/Upload.php */ +/* Location: ./system/libraries/Upload.php */ \ No newline at end of file From 8486e9cbdd28e80b41e517afe786e9b0c917af8a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 20:24:12 +0300 Subject: [PATCH 0796/5397] Renamed (with an underscore prefix) and switched from private to protected properties in the Driver library --- system/libraries/Driver.php | 52 +++++++++++++++---------------------- 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index 9a073b336cc..f409f47d426 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Driver Library Class * @@ -84,8 +82,8 @@ public function __get($child) // it's a valid driver, but the file simply can't be found if ( ! class_exists($child_class)) { - log_message('error', "Unable to load the requested driver: ".$child_class); - show_error("Unable to load the requested driver: ".$child_class); + log_message('error', 'Unable to load the requested driver: '.$child_class); + show_error('Unable to load the requested driver: '.$child_class); } } @@ -96,15 +94,11 @@ public function __get($child) } // The requested driver isn't valid! - log_message('error', "Invalid driver requested: ".$child_class); - show_error("Invalid driver requested: ".$child_class); + log_message('error', 'Invalid driver requested: '.$child_class); + show_error('Invalid driver requested: '.$child_class); } - // -------------------------------------------------------------------- - } -// END CI_Driver_Library CLASS - /** * CodeIgniter Driver Class @@ -120,12 +114,12 @@ public function __get($child) */ class CI_Driver { - protected $parent; + protected $_parent; - private $methods = array(); - private $properties = array(); + protected $_methods = array(); + protected $_properties = array(); - private static $reflections = array(); + protected static $_reflections = array(); /** * Decorate @@ -137,14 +131,14 @@ class CI_Driver { */ public function decorate($parent) { - $this->parent = $parent; + $this->_parent = $parent; // Lock down attributes to what is defined in the class // and speed up references in magic methods $class_name = get_class($parent); - if ( ! isset(self::$reflections[$class_name])) + if ( ! isset(self::$_reflections[$class_name])) { $r = new ReflectionObject($parent); @@ -152,7 +146,7 @@ public function decorate($parent) { if ($method->isPublic()) { - $this->methods[] = $method->getName(); + $this->_methods[] = $method->getName(); } } @@ -160,15 +154,15 @@ public function decorate($parent) { if ($prop->isPublic()) { - $this->properties[] = $prop->getName(); + $this->_properties[] = $prop->getName(); } } - self::$reflections[$class_name] = array($this->methods, $this->properties); + self::$_reflections[$class_name] = array($this->_methods, $this->_properties); } else { - list($this->methods, $this->properties) = self::$reflections[$class_name]; + list($this->_methods, $this->_properties) = self::$_reflections[$class_name]; } } @@ -179,16 +173,15 @@ public function decorate($parent) * * Handles access to the parent driver library's methods * - * @access public * @param string * @param array * @return mixed */ public function __call($method, $args = array()) { - if (in_array($method, $this->methods)) + if (in_array($method, $this->_methods)) { - return call_user_func_array(array($this->parent, $method), $args); + return call_user_func_array(array($this->_parent, $method), $args); } $trace = debug_backtrace(); @@ -208,9 +201,9 @@ public function __call($method, $args = array()) */ public function __get($var) { - if (in_array($var, $this->properties)) + if (in_array($var, $this->_properties)) { - return $this->parent->$var; + return $this->_parent->$var; } } @@ -227,16 +220,13 @@ public function __get($var) */ public function __set($var, $val) { - if (in_array($var, $this->properties)) + if (in_array($var, $this->_properties)) { - $this->parent->$var = $val; + $this->_parent->$var = $val; } } - // -------------------------------------------------------------------- - } -// END CI_Driver CLASS /* End of file Driver.php */ -/* Location: ./system/libraries/Driver.php */ +/* Location: ./system/libraries/Driver.php */ \ No newline at end of file From 627e172fd3ada0fc2b648a3fff10af4a0022378f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 20:53:47 +0300 Subject: [PATCH 0797/5397] Remove access description lines and cleanup the download, language, number, path & xml helpers --- system/helpers/download_helper.php | 3 +-- system/helpers/language_helper.php | 7 ++----- system/helpers/number_helper.php | 5 +---- system/helpers/path_helper.php | 3 +-- system/helpers/xml_helper.php | 14 ++++++-------- 5 files changed, 11 insertions(+), 21 deletions(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 96ff29decf2..19192a147cf 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -42,7 +42,6 @@ * * Generates headers that force a download to happen * - * @access public * @param string filename * @param mixed the data to be downloaded * @param bool wether to try and send the actual file MIME type @@ -125,4 +124,4 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) } /* End of file download_helper.php */ -/* Location: ./system/helpers/download_helper.php */ +/* Location: ./system/helpers/download_helper.php */ \ No newline at end of file diff --git a/system/helpers/language_helper.php b/system/helpers/language_helper.php index 1d66df59f41..b31c971077e 100644 --- a/system/helpers/language_helper.php +++ b/system/helpers/language_helper.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Language Helpers * @@ -44,7 +42,6 @@ * * 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 @@ -58,7 +55,7 @@ function lang($line, $id = '') if ($id != '') { - $line = '"; + $line = ''; } return $line; @@ -66,4 +63,4 @@ function lang($line, $id = '') } /* End of file language_helper.php */ -/* Location: ./system/helpers/language_helper.php */ +/* Location: ./system/helpers/language_helper.php */ \ No newline at end of file diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index b6c823d8b16..40da6e7bf59 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Number Helpers * @@ -42,7 +40,6 @@ /** * Formats a numbers as bytes, based on size, and adds the appropriate suffix * - * @access public * @param mixed // will be cast as int * @return string */ @@ -84,4 +81,4 @@ function byte_format($num, $precision = 1) } /* End of file number_helper.php */ -/* Location: ./system/helpers/number_helper.php */ +/* Location: ./system/helpers/number_helper.php */ \ No newline at end of file diff --git a/system/helpers/path_helper.php b/system/helpers/path_helper.php index c31f0bdc582..6ee99072c5d 100644 --- a/system/helpers/path_helper.php +++ b/system/helpers/path_helper.php @@ -40,7 +40,6 @@ /** * Set Realpath * - * @access public * @param string * @param bool checks to see if the path exists * @return string @@ -71,4 +70,4 @@ function set_realpath($path, $check_existance = FALSE) } /* End of file path_helper.php */ -/* Location: ./system/helpers/path_helper.php */ +/* Location: ./system/helpers/path_helper.php */ \ No newline at end of file diff --git a/system/helpers/xml_helper.php b/system/helpers/xml_helper.php index f3ff5764cb1..67fd34b9704 100644 --- a/system/helpers/xml_helper.php +++ b/system/helpers/xml_helper.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter XML Helpers * @@ -42,8 +40,8 @@ /** * Convert Reserved XML characters to Entities * - * @access public * @param string + * @param bool * @return string */ if ( ! function_exists('xml_convert')) @@ -54,11 +52,11 @@ function xml_convert($str, $protect_all = FALSE) // Replace entities to temporary markers so that // ampersands won't get messed up - $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str); + $str = preg_replace('/&#(\d+);/', $temp.'\\1;', $str); if ($protect_all == TRUE) { - $str = preg_replace('/&(\w+);/', "$temp\\1;", $str); + $str = preg_replace('/&(\w+);/', $temp.'\\1;', $str); } $str = str_replace(array('&', '<', '>', '"', "'", '-'), @@ -66,11 +64,11 @@ function xml_convert($str, $protect_all = FALSE) $str); // Decode the temp markers back to entities - $str = preg_replace('/$temp(\d+);/', '&#\\1;', $str); + $str = preg_replace('/'.$temp.'(\d+);/', '&#\\1;', $str); if ($protect_all == TRUE) { - return preg_replace("/$temp(\w+);/", '&\\1;', $str); + return preg_replace('/'.$temp.'(\w+);/', '&\\1;', $str); } return $str; @@ -78,4 +76,4 @@ function xml_convert($str, $protect_all = FALSE) } /* End of file xml_helper.php */ -/* Location: ./system/helpers/xml_helper.php */ +/* Location: ./system/helpers/xml_helper.php */ \ No newline at end of file From 2046b1a14f68495e6324edb26250916037bce9e1 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 21:07:04 +0300 Subject: [PATCH 0798/5397] Remove access description lines and cleanup the html helper --- system/helpers/html_helper.php | 66 +++++++++++++--------------------- 1 file changed, 25 insertions(+), 41 deletions(-) diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index b8c4f36f684..0417bd253d3 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -25,8 +25,6 @@ * @filesource */ -// ------------------------------------------------------------------------ - /** * CodeIgniter HTML Helpers * @@ -42,12 +40,10 @@ /** * Heading * - * Generates an HTML heading tag. First param is the data. - * Second param is the size of the heading tag. + * Generates an HTML heading tag. * - * @access public - * @param string - * @param integer + * @param string content + * @param int heading level * @return string */ if ( ! function_exists('heading')) @@ -65,7 +61,6 @@ function heading($data = '', $h = '1', $attributes = '') * * Generates an HTML unordered list from an single or multi-dimensional array. * - * @access public * @param array * @param mixed * @return string @@ -85,7 +80,6 @@ function ul($list, $attributes = '') * * Generates an HTML ordered list from an single or multi-dimensional array. * - * @access public * @param array * @param mixed * @return string @@ -105,11 +99,10 @@ function ol($list, $attributes = '') * * Generates an HTML ordered list from an single or multi-dimensional array. * - * @access private * @param string * @param mixed * @param mixed - * @param integer + * @param int * @return string */ if ( ! function_exists('_list')) @@ -131,13 +124,13 @@ function _list($type = 'ul', $list, $attributes = '', $depth = 0) $atts = ''; foreach ($attributes as $key => $val) { - $atts .= ' ' . $key . '="' . $val . '"'; + $atts .= ' '.$key.'="'.$val.'"'; } $attributes = $atts; } - elseif (is_string($attributes) AND strlen($attributes) > 0) + elseif (is_string($attributes) && strlen($attributes) > 0) { - $attributes = ' '. $attributes; + $attributes = ' '.$attributes; } // Write the opening list tag @@ -175,8 +168,7 @@ function _list($type = 'ul', $list, $attributes = '', $depth = 0) /** * Generates HTML BR tags based on number supplied * - * @access public - * @param integer + * @param int * @return string */ if ( ! function_exists('br')) @@ -194,8 +186,8 @@ function br($num = 1) * * Generates an element * - * @access public * @param mixed + * @param bool * @return string */ if ( ! function_exists('img')) @@ -217,7 +209,7 @@ function img($src = '', $index_page = FALSE) foreach ($src as $k => $v) { - if ($k === 'src' AND strpos($v, '://') === FALSE) + if ($k === 'src' && strpos($v, '://') === FALSE) { $CI =& get_instance(); @@ -232,7 +224,7 @@ function img($src = '', $index_page = FALSE) } else { - $img .= " $k=\"$v\""; + $img .= ' '.$k.'="'.$v.'"'; } } @@ -248,10 +240,9 @@ function img($src = '', $index_page = FALSE) * 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 + * 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 */ @@ -263,7 +254,7 @@ function doctype($type = 'xhtml1-strict') if ( ! is_array($_doctypes)) { - if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php')) + if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php'); } @@ -278,7 +269,7 @@ function doctype($type = 'xhtml1-strict') } } - return (isset($_doctypes[$type])) ? $_doctypes[$type] : FALSE; + return isset($_doctypes[$type]) ? $_doctypes[$type] : FALSE; } } @@ -289,13 +280,12 @@ function doctype($type = 'xhtml1-strict') * * 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 + * @param bool should index_page be added to the css path * @return string */ if ( ! function_exists('link_tag')) @@ -309,7 +299,7 @@ function link_tag($href = '', $rel = 'stylesheet', $type = 'text/css', $title = { foreach ($href as $k => $v) { - if ($k === 'href' AND strpos($v, '://') === FALSE) + if ($k === 'href' && strpos($v, '://') === FALSE) { if ($index_page === TRUE) { @@ -322,11 +312,9 @@ function link_tag($href = '', $rel = 'stylesheet', $type = 'text/css', $title = } else { - $link .= "$k=\"$v\" "; + $link .= $k.'="'.$v.'" '; } } - - $link .= '/>'; } else { @@ -354,11 +342,9 @@ function link_tag($href = '', $rel = 'stylesheet', $type = 'text/css', $title = { $link .= 'title="'.$title.'" '; } - - $link .= '/>'; } - return $link."\n"; + return $link."/>\n"; } } @@ -367,8 +353,10 @@ function link_tag($href = '', $rel = 'stylesheet', $type = 'text/css', $title = /** * Generates meta tags from an array of key/values * - * @access public * @param array + * @param string + * @param string + * @param string * @return string */ if ( ! function_exists('meta')) @@ -381,13 +369,10 @@ function meta($name = '', $content = '', $type = 'name', $newline = "\n") { $name = array(array('name' => $name, 'content' => $content, 'type' => $type, 'newline' => $newline)); } - else + elseif (isset($name['name'])) { // Turn single array into multidimensional - if (isset($name['name'])) - { - $name = array($name); - } + $name = array($name); } $str = ''; @@ -410,8 +395,7 @@ function meta($name = '', $content = '', $type = 'name', $newline = "\n") /** * Generates non-breaking space entities based on number supplied * - * @access public - * @param integer + * @param int * @return string */ if ( ! function_exists('nbs')) @@ -423,4 +407,4 @@ function nbs($num = 1) } /* End of file html_helper.php */ -/* Location: ./system/helpers/html_helper.php */ +/* Location: ./system/helpers/html_helper.php */ \ No newline at end of file From 93a83c720e69d1d363896f6b685d2b7ef475ebbc Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Mar 2012 21:24:02 +0300 Subject: [PATCH 0799/5397] Remove access description lines and cleanup the form helper --- system/helpers/form_helper.php | 161 ++++++++++++--------------------- 1 file changed, 56 insertions(+), 105 deletions(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 37337d9753e..ada822860c2 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -24,8 +24,6 @@ * @since Version 1.0 */ -// ------------------------------------------------------------------------ - /** * CodeIgniter Form Helpers * @@ -43,7 +41,6 @@ * * Creates the opening portion of the form. * - * @access public * @param string the URI segments of the form destination * @param array a key/value pair of attributes * @param array a key/value pair hidden data @@ -71,15 +68,15 @@ function form_open($action = '', $attributes = '', $hidden = array()) $form = '\n"; - // Add CSRF field if enabled, but leave it out for GET requests and requests to external websites - if ($CI->config->item('csrf_protection') === TRUE AND ! (strpos($action, $CI->config->base_url()) === FALSE OR strpos($form, 'method="get"'))) + // Add CSRF field if enabled, but leave it out for GET requests and requests to external websites + if ($CI->config->item('csrf_protection') === TRUE && ! (strpos($action, $CI->config->base_url()) === FALSE OR strpos($form, 'method="get"'))) { $hidden[$CI->security->get_csrf_token_name()] = $CI->security->get_csrf_hash(); } - if (is_array($hidden) AND count($hidden) > 0) + if (is_array($hidden) && count($hidden) > 0) { - $form .= sprintf("
    %s
    ", form_hidden($hidden)); + $form .= sprintf('
    %s
    ', form_hidden($hidden)); } return $form; @@ -93,7 +90,6 @@ function form_open($action = '', $attributes = '', $hidden = array()) * * Creates the opening portion of the form, but with "multipart/form-data". * - * @access public * @param string the URI segments of the form destination * @param array a key/value pair of attributes * @param array a key/value pair hidden data @@ -121,10 +117,9 @@ function form_open_multipart($action = '', $attributes = array(), $hidden = arra /** * Hidden Input Field * - * Generates hidden fields. You can pass a simple key/value string or an associative - * array with multiple values. + * Generates hidden fields. You can pass a simple key/value string or + * an associative array with multiple values. * - * @access public * @param mixed * @param string * @return string @@ -157,7 +152,7 @@ function form_hidden($name, $value = '', $recursing = FALSE) { foreach ($value as $k => $v) { - $k = (is_int($k)) ? '' : $k; + $k = is_int($k) ? '' : $k; form_hidden($name.'['.$k.']', $v, TRUE); } } @@ -171,7 +166,6 @@ function form_hidden($name, $value = '', $recursing = FALSE) /** * Text Input Field * - * @access public * @param mixed * @param string * @param string @@ -181,7 +175,7 @@ function form_hidden($name, $value = '', $recursing = FALSE) { function form_input($data = '', $value = '', $extra = '') { - $defaults = array('type' => 'text', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value); + $defaults = array('type' => 'text', 'name' => ( ! is_array($data) ? $data : ''), 'value' => $value); return '\n"; } @@ -194,7 +188,6 @@ function form_input($data = '', $value = '', $extra = '') * * Identical to the input function but adds the "password" type * - * @access public * @param mixed * @param string * @param string @@ -221,7 +214,6 @@ function form_password($data = '', $value = '', $extra = '') * * Identical to the input function but adds the "file" type * - * @access public * @param mixed * @param string * @param string @@ -246,7 +238,6 @@ function form_upload($data = '', $value = '', $extra = '') /** * Textarea field * - * @access public * @param mixed * @param string * @param string @@ -256,7 +247,7 @@ function form_upload($data = '', $value = '', $extra = '') { function form_textarea($data = '', $value = '', $extra = '') { - $defaults = array('name' => (( ! is_array($data)) ? $data : ''), 'cols' => '40', 'rows' => '10'); + $defaults = array('name' => ( ! is_array($data) ? $data : ''), 'cols' => '40', 'rows' => '10'); if ( ! is_array($data) OR ! isset($data['value'])) { @@ -268,7 +259,7 @@ function form_textarea($data = '', $value = '', $extra = '') unset($data['value']); // textareas don't use the value attribute } - $name = (is_array($data)) ? $data['name'] : $data; + $name = is_array($data) ? $data['name'] : $data; return '\n"; } } @@ -278,12 +269,11 @@ function form_textarea($data = '', $value = '', $extra = '') /** * Multi-select menu * - * @access public * @param string * @param array * @param mixed * @param string - * @return type + * @return string */ if ( ! function_exists('form_multiselect')) { @@ -303,7 +293,6 @@ function form_multiselect($name = '', $options = array(), $selected = array(), $ /** * Drop-down Menu * - * @access public * @param string * @param array * @param string @@ -314,28 +303,16 @@ function form_multiselect($name = '', $options = array(), $selected = array(), $ { function form_dropdown($name = '', $options = array(), $selected = array(), $extra = '') { - // If name is really an array then we'll call the function again using the array - if (is_array($name) && isset($name['name'])) - { - - if ( ! isset($name['options'])) - { - $name['options'] = array(); - } - - if ( ! isset($name['selected'])) - { - $name['selected'] = array(); - } - - if ( ! isset($name['extra'])) - { - $name['extra'] = ''; - } - - return form_dropdown($name['name'], $name['options'], $name['selected'], $name['extra']); - } - + // If name is really an array then we'll call the function again using the array + if (is_array($name) && isset($name['name'])) + { + isset($name['options']) OR $name['options'] = array(); + isset($name['selected']) OR $name['selected'] = array(); + isset($name['extra']) OR $name['extra'] = array(); + + return form_dropdown($name['name'], $name['options'], $name['selected'], $name['extra']); + } + if ( ! is_array($selected)) { $selected = array($selected); @@ -363,11 +340,11 @@ function form_dropdown($name = '', $options = array(), $selected = array(), $ext foreach ($val as $optgroup_key => $optgroup_val) { - $sel = (in_array($optgroup_key, $selected)) ? ' selected="selected"' : ''; + $sel = in_array($optgroup_key, $selected) ? ' selected="selected"' : ''; $form .= '\n"; } - $form .= ''."\n"; + $form .= "\n"; } else { @@ -375,9 +352,7 @@ function form_dropdown($name = '', $options = array(), $selected = array(), $ext } } - $form .= "\n"; - - return $form; + return $form."\n"; } } @@ -386,7 +361,6 @@ function form_dropdown($name = '', $options = array(), $selected = array(), $ext /** * Checkbox Field * - * @access public * @param mixed * @param string * @param bool @@ -397,9 +371,9 @@ function form_dropdown($name = '', $options = array(), $selected = array(), $ext { function form_checkbox($data = '', $value = '', $checked = FALSE, $extra = '') { - $defaults = array('type' => 'checkbox', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value); + $defaults = array('type' => 'checkbox', 'name' => ( ! is_array($data) ? $data : ''), 'value' => $value); - if (is_array($data) AND array_key_exists('checked', $data)) + if (is_array($data) && array_key_exists('checked', $data)) { $checked = $data['checked']; @@ -431,7 +405,6 @@ function form_checkbox($data = '', $value = '', $checked = FALSE, $extra = '') /** * Radio Button * - * @access public * @param mixed * @param string * @param bool @@ -457,7 +430,6 @@ function form_radio($data = '', $value = '', $checked = FALSE, $extra = '') /** * Submit Button * - * @access public * @param mixed * @param string * @param string @@ -467,7 +439,7 @@ function form_radio($data = '', $value = '', $checked = FALSE, $extra = '') { function form_submit($data = '', $value = '', $extra = '') { - $defaults = array('type' => 'submit', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value); + $defaults = array('type' => 'submit', 'name' => ( ! is_array($data) ? $data : ''), 'value' => $value); return '\n"; } } @@ -477,7 +449,6 @@ function form_submit($data = '', $value = '', $extra = '') /** * Reset Button * - * @access public * @param mixed * @param string * @param string @@ -487,7 +458,7 @@ function form_submit($data = '', $value = '', $extra = '') { function form_reset($data = '', $value = '', $extra = '') { - $defaults = array('type' => 'reset', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value); + $defaults = array('type' => 'reset', 'name' => ( ! is_array($data) ? $data : ''), 'value' => $value); return '\n"; } } @@ -497,7 +468,6 @@ function form_reset($data = '', $value = '', $extra = '') /** * Form Button * - * @access public * @param mixed * @param string * @param string @@ -507,8 +477,8 @@ function form_reset($data = '', $value = '', $extra = '') { function form_button($data = '', $content = '', $extra = '') { - $defaults = array('name' => (( ! is_array($data)) ? $data : ''), 'type' => 'button'); - if ( is_array($data) AND isset($data['content'])) + $defaults = array('name' => ( ! is_array($data) ? $data : ''), 'type' => 'button'); + if (is_array($data) && isset($data['content'])) { $content = $data['content']; unset($data['content']); // content is not an attribute @@ -523,7 +493,6 @@ function form_button($data = '', $content = '', $extra = '') /** * Form Label Tag * - * @access public * @param string The text to appear onscreen * @param string The id the label applies to * @param string Additional attributes @@ -538,10 +507,10 @@ function form_label($label_text = '', $id = '', $attributes = array()) if ($id != '') { - $label .= " for=\"$id\""; + $label .= ' for="'.$id.'"'; } - if (is_array($attributes) AND count($attributes) > 0) + if (is_array($attributes) && count($attributes) > 0) { foreach ($attributes as $key => $val) { @@ -549,7 +518,7 @@ function form_label($label_text = '', $id = '', $attributes = array()) } } - return $label .= ">$label_text"; + return $label.'>'.$label_text.''; } } @@ -560,7 +529,6 @@ function form_label($label_text = '', $id = '', $attributes = array()) * Used to produce
    text. To close fieldset * use form_fieldset_close() * - * @access public * @param string The legend text * @param string Additional attributes * @return string @@ -572,7 +540,7 @@ function form_fieldset($legend_text = '', $attributes = array()) $fieldset = '\n"; if ($legend_text != '') { - $fieldset .= "$legend_text\n"; + return $fieldset.''.$legend_text."\n"; } return $fieldset; @@ -584,7 +552,6 @@ function form_fieldset($legend_text = '', $attributes = array()) /** * Fieldset Close Tag * - * @access public * @param string * @return string */ @@ -592,7 +559,7 @@ function form_fieldset($legend_text = '', $attributes = array()) { function form_fieldset_close($extra = '') { - return "
    ".$extra; + return ''.$extra; } } @@ -601,7 +568,6 @@ function form_fieldset_close($extra = '') /** * Form Close Tag * - * @access public * @param string * @return string */ @@ -609,7 +575,7 @@ function form_fieldset_close($extra = '') { function form_close($extra = '') { - return "".$extra; + return ''.$extra; } } @@ -670,10 +636,9 @@ function form_prep($str = '', $field_name = '') * Form Value * * Grabs a value from the POST array for the specified field so you can - * re-populate an input field or textarea. If Form Validation + * re-populate an input field or textarea. If Form Validation * is active it retrieves the info from the validation class * - * @access public * @param string * @return mixed */ @@ -703,7 +668,6 @@ function set_value($field = '', $default = '') * Let's you set the selected value of a "; - - return $menu; + return $menu.''; } } diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 97e6986b0bc..470b61ede38 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -100,7 +100,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) $x[count($x) - 1] = strtoupper($extension); $filename = implode('.', $x); } - + // Clean output buffer ob_clean(); diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index b246d72f3a6..eca6c5f1eda 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -184,7 +184,6 @@ function form_input($data = '', $value = '', $extra = '') // ------------------------------------------------------------------------ - if ( ! function_exists('form_password')) { /** diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index 124f58009bc..92a6db47714 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -379,10 +379,10 @@ function meta($name = '', $content = '', $type = 'name', $newline = "\n") $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']; + $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']) ? $meta['newline'] : "\n"; $str .= ''.$newline; } diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index feeaf57d720..2a9466305a2 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -201,7 +201,7 @@ function underscore($str) * * @param string $str * @param string $separator - * @return str + * @return string */ if ( ! function_exists('humanize')) { diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index 5576c2748d2..cf6df4ef501 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -198,7 +198,7 @@ function anchor_popup($uri = '', $title = '', $attributes = FALSE) if ($attributes === FALSE) { - return "".$title.''; + return '".$title.''; } if ( ! is_array($attributes)) @@ -217,7 +217,7 @@ function anchor_popup($uri = '', $title = '', $attributes = FALSE) $attributes = _parse_attributes($attributes); } - return "'.$title.''; + return ''.$title.''; } } From d013c63462b4eaa2ac2f684b2ad498a9c4fb7dd5 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Thu, 17 May 2012 08:15:47 -0400 Subject: [PATCH 1051/5397] tweak and changelog entry --- system/helpers/email_helper.php | 5 +---- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/system/helpers/email_helper.php b/system/helpers/email_helper.php index ea9f6105dc7..628667d4d22 100644 --- a/system/helpers/email_helper.php +++ b/system/helpers/email_helper.php @@ -42,15 +42,12 @@ /** * Validate email address * - * Updated to be more accurate to RFC822 - * see: http://www.iamcal.com/publish/articles/php/parsing_email/ - * * @param string * @return bool */ function valid_email($email) { - return (bool) filter_var($email, FILTER_VALIDATE_EMAIL); + return filter_var($email, FILTER_VALIDATE_EMAIL); } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d33a6a6351d..f835a8c8d15 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -52,6 +52,7 @@ Release Date: Not Released - set_realpath() can now also handle file paths as opposed to just directories. - do_hash() now uses PHP's native hash() function, supporting more algorithms. - Added an optional paramater to ``delete_files()`` to enable it to skip deleting files such as .htaccess and index.html. + - Updated email helper to use ``filter_var`` to validate email addresses - Database From 16642c71403f4463dfe6e83c13a0e3120474cd1d Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Thu, 17 May 2012 08:20:16 -0400 Subject: [PATCH 1052/5397] Update inflector docblocks, add changelog entry --- system/helpers/inflector_helper.php | 10 +++++----- user_guide_src/source/changelog.rst | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index 72615671c8b..647d840e491 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -45,7 +45,7 @@ * Takes a plural word and makes it singular * * @param string - * @return str + * @return string */ function singular($str) { @@ -110,7 +110,7 @@ function singular($str) * * @param string * @param bool - * @return str + * @return string */ function plural($str, $force = FALSE) { @@ -166,7 +166,7 @@ function plural($str, $force = FALSE) * Takes multiple words separated by spaces or underscores and camelizes them * * @param string - * @return str + * @return string */ function camelize($str) { @@ -184,7 +184,7 @@ function camelize($str) * Takes multiple words separated by spaces and underscores them * * @param string - * @return str + * @return string */ function underscore($str) { @@ -203,7 +203,7 @@ function underscore($str) * * @param string $str * @param string $separator - * @return str + * @return string */ function humanize($str, $separator = '_') { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d33a6a6351d..0066af9ad57 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -52,6 +52,7 @@ Release Date: Not Released - set_realpath() can now also handle file paths as opposed to just directories. - do_hash() now uses PHP's native hash() function, supporting more algorithms. - Added an optional paramater to ``delete_files()`` to enable it to skip deleting files such as .htaccess and index.html. + - Removed deprecated helper function ``js_insert_smiley`` from smiley helper. - Database From f0eb2f133bf43be7ffa1bf71babf4ed28852e71b Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Thu, 17 May 2012 08:32:11 -0400 Subject: [PATCH 1053/5397] Suggested changes --- system/helpers/number_helper.php | 2 +- system/helpers/smiley_helper.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index 2a906ba1b75..e49f2f7a000 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -42,7 +42,7 @@ /** * Formats a numbers as bytes, based on size, and adds the appropriate suffix * - * @param mixed // will be cast as int + * @param mixed will be cast as int * @param int * @return string */ diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php index 4320dd39219..5e6de08af5e 100644 --- a/system/helpers/smiley_helper.php +++ b/system/helpers/smiley_helper.php @@ -130,7 +130,7 @@ function insert_smiley(smiley, field_id) { * * @param string the URL to the folder containing the smiley images * @param array - * @param array + * @param array * @return array */ function get_clickable_smileys($image_url, $alias = '', $smileys = NULL) From 98fde46fb938694feb1f36e590c4cfa5c97c3261 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Thu, 17 May 2012 08:33:05 -0400 Subject: [PATCH 1054/5397] Add parens to changelog entry --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 0066af9ad57..7fc5ee5a02f 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -52,7 +52,7 @@ Release Date: Not Released - set_realpath() can now also handle file paths as opposed to just directories. - do_hash() now uses PHP's native hash() function, supporting more algorithms. - Added an optional paramater to ``delete_files()`` to enable it to skip deleting files such as .htaccess and index.html. - - Removed deprecated helper function ``js_insert_smiley`` from smiley helper. + - Removed deprecated helper function ``js_insert_smiley()`` from smiley helper. - Database From 97aefa5cd41475d5b404ced56052008beebf8f40 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Thu, 17 May 2012 08:55:55 -0400 Subject: [PATCH 1055/5397] Added changelog entry --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 7fc5ee5a02f..933743c3860 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -38,6 +38,7 @@ Release Date: Not Released Only entries in ``$autoload['libraries']`` are auto-loaded now. - Added some more doctypes. - Updated all classes to be written in PHP 5 style, with visibility declarations and no ``var`` usage for properties. + - Moved error templates to "application/views/errors" - Helpers From 7d22f0adbe5df5c93ae1ee367acad7568d555f0a Mon Sep 17 00:00:00 2001 From: Pawel Decowski Date: Thu, 17 May 2012 15:06:25 +0200 Subject: [PATCH 1056/5397] Remove set_time_limit() call. CodeIgniter should respect php.ini setting. --- system/core/CodeIgniter.php | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 00db6e13a15..e1892ee7e73 100755 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -99,17 +99,6 @@ get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix'])); } -/* - * ------------------------------------------------------ - * Set a liberal script execution time limit - * ------------------------------------------------------ - */ - if (function_exists('set_time_limit') && @ini_get('safe_mode') == 0 - && php_sapi_name() !== 'cli') // Do not override the Time Limit value if running from Command Line - { - @set_time_limit(300); - } - /* * ------------------------------------------------------ * Start the timer... tick tock tick tock... From 324ef078dda5a3596444152ba49dd591a61adba6 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Thu, 17 May 2012 14:45:25 +0100 Subject: [PATCH 1057/5397] Added upgrade for 2.1.1 and updated version. --- system/core/CodeIgniter.php | 2 +- system/database/drivers/pdo/pdo_driver.php | 2 +- system/database/drivers/pdo/pdo_forge.php | 2 +- system/database/drivers/pdo/pdo_result.php | 2 +- system/database/drivers/pdo/pdo_utility.php | 2 +- system/libraries/Cache/Cache.php | 2 +- system/libraries/Cache/drivers/Cache_apc.php | 2 +- .../libraries/Cache/drivers/Cache_dummy.php | 2 +- system/libraries/Cache/drivers/Cache_file.php | 2 +- .../Cache/drivers/Cache_memcached.php | 2 +- system/libraries/Cart.php | 2 +- system/libraries/Driver.php | 2 +- system/libraries/Migration.php | 2 +- user_guide/changelog.html | 4 +- user_guide/database/active_record.html | 4 +- user_guide/database/caching.html | 4 +- user_guide/database/call_function.html | 4 +- user_guide/database/configuration.html | 4 +- user_guide/database/connecting.html | 4 +- user_guide/database/examples.html | 4 +- user_guide/database/fields.html | 4 +- user_guide/database/forge.html | 4 +- user_guide/database/helpers.html | 4 +- user_guide/database/index.html | 4 +- user_guide/database/queries.html | 4 +- user_guide/database/results.html | 4 +- user_guide/database/table_data.html | 4 +- user_guide/database/transactions.html | 4 +- user_guide/database/utilities.html | 4 +- user_guide/doc_style/index.html | 4 +- user_guide/doc_style/template.html | 2 +- user_guide/general/alternative_php.html | 4 +- user_guide/general/ancillary_classes.html | 4 +- user_guide/general/autoloader.html | 4 +- user_guide/general/caching.html | 4 +- user_guide/general/cli.html | 4 +- user_guide/general/common_functions.html | 4 +- user_guide/general/controllers.html | 4 +- user_guide/general/core_classes.html | 4 +- user_guide/general/creating_drivers.html | 4 +- user_guide/general/creating_libraries.html | 4 +- user_guide/general/credits.html | 4 +- user_guide/general/drivers.html | 4 +- user_guide/general/environments.html | 4 +- user_guide/general/errors.html | 4 +- user_guide/general/helpers.html | 4 +- user_guide/general/hooks.html | 4 +- user_guide/general/libraries.html | 4 +- user_guide/general/managing_apps.html | 4 +- user_guide/general/models.html | 4 +- user_guide/general/profiling.html | 4 +- user_guide/general/quick_reference.html | 4 +- user_guide/general/requirements.html | 4 +- user_guide/general/reserved_names.html | 4 +- user_guide/general/routing.html | 4 +- user_guide/general/security.html | 4 +- user_guide/general/styleguide.html | 4 +- user_guide/general/urls.html | 4 +- user_guide/general/views.html | 4 +- user_guide/helpers/array_helper.html | 4 +- user_guide/helpers/captcha_helper.html | 4 +- user_guide/helpers/cookie_helper.html | 4 +- user_guide/helpers/date_helper.html | 4 +- user_guide/helpers/directory_helper.html | 4 +- user_guide/helpers/download_helper.html | 4 +- user_guide/helpers/email_helper.html | 4 +- user_guide/helpers/file_helper.html | 4 +- user_guide/helpers/form_helper.html | 4 +- user_guide/helpers/html_helper.html | 4 +- user_guide/helpers/inflector_helper.html | 4 +- user_guide/helpers/language_helper.html | 4 +- user_guide/helpers/number_helper.html | 4 +- user_guide/helpers/path_helper.html | 4 +- user_guide/helpers/security_helper.html | 4 +- user_guide/helpers/smiley_helper.html | 4 +- user_guide/helpers/string_helper.html | 4 +- user_guide/helpers/text_helper.html | 4 +- user_guide/helpers/typography_helper.html | 4 +- user_guide/helpers/url_helper.html | 4 +- user_guide/helpers/xml_helper.html | 4 +- user_guide/index.html | 4 +- user_guide/installation/downloads.html | 16 ++-- user_guide/installation/index.html | 4 +- user_guide/installation/troubleshooting.html | 4 +- user_guide/installation/upgrade_120.html | 4 +- user_guide/installation/upgrade_130.html | 4 +- user_guide/installation/upgrade_131.html | 4 +- user_guide/installation/upgrade_132.html | 4 +- user_guide/installation/upgrade_133.html | 4 +- user_guide/installation/upgrade_140.html | 4 +- user_guide/installation/upgrade_141.html | 4 +- user_guide/installation/upgrade_150.html | 4 +- user_guide/installation/upgrade_152.html | 4 +- user_guide/installation/upgrade_153.html | 4 +- user_guide/installation/upgrade_154.html | 4 +- user_guide/installation/upgrade_160.html | 4 +- user_guide/installation/upgrade_161.html | 4 +- user_guide/installation/upgrade_162.html | 4 +- user_guide/installation/upgrade_163.html | 4 +- user_guide/installation/upgrade_170.html | 4 +- user_guide/installation/upgrade_171.html | 4 +- user_guide/installation/upgrade_172.html | 4 +- user_guide/installation/upgrade_200.html | 4 +- user_guide/installation/upgrade_201.html | 4 +- user_guide/installation/upgrade_202.html | 4 +- user_guide/installation/upgrade_203.html | 4 +- user_guide/installation/upgrade_210.html | 4 +- user_guide/installation/upgrade_211.html | 89 +++++++++++++++++++ user_guide/installation/upgrade_b11.html | 4 +- user_guide/installation/upgrading.html | 5 +- user_guide/libraries/benchmark.html | 4 +- user_guide/libraries/caching.html | 4 +- user_guide/libraries/calendar.html | 4 +- user_guide/libraries/cart.html | 4 +- user_guide/libraries/config.html | 4 +- user_guide/libraries/email.html | 4 +- user_guide/libraries/encryption.html | 4 +- user_guide/libraries/file_uploading.html | 4 +- user_guide/libraries/form_validation.html | 4 +- user_guide/libraries/ftp.html | 4 +- user_guide/libraries/image_lib.html | 4 +- user_guide/libraries/input.html | 4 +- user_guide/libraries/javascript.html | 4 +- user_guide/libraries/language.html | 4 +- user_guide/libraries/loader.html | 4 +- user_guide/libraries/migration.html | 4 +- user_guide/libraries/output.html | 4 +- user_guide/libraries/pagination.html | 4 +- user_guide/libraries/parser.html | 4 +- user_guide/libraries/security.html | 4 +- user_guide/libraries/sessions.html | 4 +- user_guide/libraries/table.html | 4 +- user_guide/libraries/trackback.html | 4 +- user_guide/libraries/typography.html | 4 +- user_guide/libraries/unit_testing.html | 4 +- user_guide/libraries/uri.html | 4 +- user_guide/libraries/user_agent.html | 4 +- user_guide/libraries/xmlrpc.html | 4 +- user_guide/libraries/zip.html | 4 +- user_guide/license.html | 4 +- user_guide/overview/appflow.html | 4 +- user_guide/overview/at_a_glance.html | 4 +- user_guide/overview/cheatsheets.html | 4 +- user_guide/overview/features.html | 4 +- user_guide/overview/getting_started.html | 4 +- user_guide/overview/goals.html | 4 +- user_guide/overview/index.html | 4 +- user_guide/overview/mvc.html | 4 +- user_guide/toc.html | 4 +- user_guide/tutorial/conclusion.html | 4 +- user_guide/tutorial/create_news_items.html | 4 +- user_guide/tutorial/hard_coded_pages.html | 4 +- user_guide/tutorial/index.html | 4 +- user_guide/tutorial/news_section.html | 4 +- user_guide/tutorial/static_pages.html | 4 +- 155 files changed, 391 insertions(+), 299 deletions(-) create mode 100644 user_guide/installation/upgrade_211.html diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index db1aee57430..ec729410216 100755 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -33,7 +33,7 @@ * @var string * */ - define('CI_VERSION', '2.1.0'); + define('CI_VERSION', '2.1.1'); /** * CodeIgniter Branch (Core = TRUE, Reactor = FALSE) diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 5de2079bb20..4fc65aeb41e 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -9,7 +9,7 @@ * @license http://codeigniter.com/user_guide/license.html * @author EllisLab Dev Team * @link http://codeigniter.com - * @since Version 2.1.0 + * @since Version 2.1.1 * @filesource */ diff --git a/system/database/drivers/pdo/pdo_forge.php b/system/database/drivers/pdo/pdo_forge.php index 1462e8c218c..1a076d4a281 100644 --- a/system/database/drivers/pdo/pdo_forge.php +++ b/system/database/drivers/pdo/pdo_forge.php @@ -9,7 +9,7 @@ * @license http://codeigniter.com/user_guide/license.html * @author EllisLab Dev Team * @link http://codeigniter.com - * @since Version 2.1.0 + * @since Version 2.1.1 * @filesource */ diff --git a/system/database/drivers/pdo/pdo_result.php b/system/database/drivers/pdo/pdo_result.php index 7f3058ff093..7c4a2f97765 100644 --- a/system/database/drivers/pdo/pdo_result.php +++ b/system/database/drivers/pdo/pdo_result.php @@ -9,7 +9,7 @@ * @license http://codeigniter.com/user_guide/license.html * @author EllisLab Dev Team * @link http://codeigniter.com - * @since Version 2.1.0 + * @since Version 2.1.1 * @filesource */ diff --git a/system/database/drivers/pdo/pdo_utility.php b/system/database/drivers/pdo/pdo_utility.php index 29aefca8099..fec27645812 100644 --- a/system/database/drivers/pdo/pdo_utility.php +++ b/system/database/drivers/pdo/pdo_utility.php @@ -9,7 +9,7 @@ * @license http://codeigniter.com/user_guide/license.html * @author EllisLab Dev Team * @link http://codeigniter.com - * @since Version 2.1.0 + * @since Version 2.1.1 * @filesource */ diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php index 61e7aa76162..261fc367b1c 100644 --- a/system/libraries/Cache/Cache.php +++ b/system/libraries/Cache/Cache.php @@ -6,7 +6,7 @@ * * @package CodeIgniter * @author ExpressionEngine Dev Team - * @copyright Copyright (c) 2006 - 2011 EllisLab, Inc. + * @copyright Copyright (c) 2006 - 2012 EllisLab, Inc. * @license http://codeigniter.com/user_guide/license.html * @link http://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php index 79d91b32020..f750e6cb754 100644 --- a/system/libraries/Cache/drivers/Cache_apc.php +++ b/system/libraries/Cache/drivers/Cache_apc.php @@ -6,7 +6,7 @@ * * @package CodeIgniter * @author ExpressionEngine Dev Team - * @copyright Copyright (c) 2006 - 2011 EllisLab, Inc. + * @copyright Copyright (c) 2006 - 2012 EllisLab, Inc. * @license http://codeigniter.com/user_guide/license.html * @link http://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_dummy.php b/system/libraries/Cache/drivers/Cache_dummy.php index f96a68e27c2..b11b5b8fc77 100644 --- a/system/libraries/Cache/drivers/Cache_dummy.php +++ b/system/libraries/Cache/drivers/Cache_dummy.php @@ -6,7 +6,7 @@ * * @package CodeIgniter * @author ExpressionEngine Dev Team - * @copyright Copyright (c) 2006 - 2011 EllisLab, Inc. + * @copyright Copyright (c) 2006 - 2012 EllisLab, Inc. * @license http://codeigniter.com/user_guide/license.html * @link http://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index 13e2d1af67e..c50043660e1 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -6,7 +6,7 @@ * * @package CodeIgniter * @author ExpressionEngine Dev Team - * @copyright Copyright (c) 2006 - 2011 EllisLab, Inc. + * @copyright Copyright (c) 2006 - 2012 EllisLab, Inc. * @license http://codeigniter.com/user_guide/license.html * @link http://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index fc586e0255e..7478420910c 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -6,7 +6,7 @@ * * @package CodeIgniter * @author ExpressionEngine Dev Team - * @copyright Copyright (c) 2006 - 2011 EllisLab, Inc. + * @copyright Copyright (c) 2006 - 2012 EllisLab, Inc. * @license http://codeigniter.com/user_guide/license.html * @link http://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index ab5a70c9885..da47b5a195a 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -6,7 +6,7 @@ * * @package CodeIgniter * @author ExpressionEngine Dev Team - * @copyright Copyright (c) 2006 - 2011, EllisLab, Inc. + * @copyright Copyright (c) 2006 - 2012, EllisLab, Inc. * @license http://codeigniter.com/user_guide/license.html * @link http://codeigniter.com * @since Version 1.0 diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index 9881c1eecf3..f9959ff8193 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -6,7 +6,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2006 - 2011, EllisLab, Inc. + * @copyright Copyright (c) 2006 - 2012, EllisLab, Inc. * @license http://codeigniter.com/user_guide/license.html * @link http://codeigniter.com * @since Version 1.0 diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index 3943ec1304b..5a41377ea23 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -6,7 +6,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2006 - 2011, EllisLab, Inc. + * @copyright Copyright (c) 2006 - 2012, EllisLab, Inc. * @license http://codeigniter.com/user_guide/license.html * @link http://codeigniter.com * @since Version 1.0 diff --git a/user_guide/changelog.html b/user_guide/changelog.html index 55fbceeaf91..d8fa374cbe3 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -58,7 +58,7 @@

    Change Log

    Version 2.1.1

    -

    Release Date: not yet released

    +

    Release Date: May 18, 2012

    diff --git a/user_guide/database/active_record.html b/user_guide/database/active_record.html index 17c58c9f17b..734b284110a 100644 --- a/user_guide/database/active_record.html +++ b/user_guide/database/active_record.html @@ -27,7 +27,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -817,7 +817,7 @@

    $this->db->flush_cache()

    User Guide Home   ·   Next Topic:  Transactions

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/caching.html b/user_guide/database/caching.html index e6e72f269dd..6cf6ebd9804 100644 --- a/user_guide/database/caching.html +++ b/user_guide/database/caching.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -213,7 +213,7 @@

    $this->db->cache_delete_all()

    User Guide Home   ·   Next Topic:  Database manipulation with Database Forge

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/call_function.html b/user_guide/database/call_function.html index 4fc89474318..b28a05050c0 100644 --- a/user_guide/database/call_function.html +++ b/user_guide/database/call_function.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -111,7 +111,7 @@

    $this->db->call_function();

    User Guide Home   ·   Next Topic:  Query Caching

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/configuration.html b/user_guide/database/configuration.html index 17a291ac2e6..01a28c0b5d9 100644 --- a/user_guide/database/configuration.html +++ b/user_guide/database/configuration.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -157,7 +157,7 @@

    Explanation of Values:

    User Guide Home   ·   Next Topic:  Connecting to your Database

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/connecting.html b/user_guide/database/connecting.html index f86602269bf..531f6a10485 100644 --- a/user_guide/database/connecting.html +++ b/user_guide/database/connecting.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -181,7 +181,7 @@

    Manually closing the Connection

    User Guide Home   ·   Next Topic:  Queries

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/examples.html b/user_guide/database/examples.html index 58035557d08..1a1d71be607 100644 --- a/user_guide/database/examples.html +++ b/user_guide/database/examples.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -210,7 +210,7 @@

    Active Record Insert

    User Guide Home   ·   Next Topic:  Database Configuration

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/fields.html b/user_guide/database/fields.html index 56c9d9fdf07..546a4ca1f1b 100644 --- a/user_guide/database/fields.html +++ b/user_guide/database/fields.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -156,7 +156,7 @@

    $this->db->field_data()

    User Guide Home   ·   Next Topic:  Custom Function Calls

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/forge.html b/user_guide/database/forge.html index 2289e148e18..e6153721d6d 100644 --- a/user_guide/database/forge.html +++ b/user_guide/database/forge.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -227,7 +227,7 @@

    $this->dbforge->modify_column()

    Top of Page   ·   User Guide Home   ·   Next Topic:  Database Utilities Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/helpers.html b/user_guide/database/helpers.html index 82f5c1d2177..db03de1e96d 100644 --- a/user_guide/database/helpers.html +++ b/user_guide/database/helpers.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -144,7 +144,7 @@

    $this->db->update_string();

    User Guide Home   ·   Next Topic:  Active Record Pattern

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/index.html b/user_guide/database/index.html index 8a957ecef78..2a08f0a69f9 100644 --- a/user_guide/database/index.html +++ b/user_guide/database/index.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -92,7 +92,7 @@

    The Database Class

    User Guide Home   ·   Next Topic:  Quick Start: Usage Examples

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/queries.html b/user_guide/database/queries.html index 3152997ca0c..263752f52d8 100644 --- a/user_guide/database/queries.html +++ b/user_guide/database/queries.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -151,7 +151,7 @@

    Query Bindings

    User Guide Home   ·   Next Topic:  Query Results

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/results.html b/user_guide/database/results.html index 0baf992fb75..395714073d9 100644 --- a/user_guide/database/results.html +++ b/user_guide/database/results.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -252,7 +252,7 @@

    $query->free_result()

    User Guide Home   ·   Next Topic:  Query Helper Functions

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/table_data.html b/user_guide/database/table_data.html index dc5b5419856..5ebe368d8a5 100644 --- a/user_guide/database/table_data.html +++ b/user_guide/database/table_data.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -106,7 +106,7 @@

    $this->db->table_exists();

    User Guide Home   ·   Next Topic:   Field Metadata

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/transactions.html b/user_guide/database/transactions.html index dd5f73ed12e..53e667046c7 100644 --- a/user_guide/database/transactions.html +++ b/user_guide/database/transactions.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -193,7 +193,7 @@

    Running Transactions Manually

    User Guide Home   ·   Next Topic:  Table Metadata

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/database/utilities.html b/user_guide/database/utilities.html index 7c30070f66c..4a3005f9f22 100644 --- a/user_guide/database/utilities.html +++ b/user_guide/database/utilities.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -307,7 +307,7 @@

    Description of Backup Preferences

    Top of Page   ·   User Guide Home   ·   Next Topic:  Javascript Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/doc_style/index.html b/user_guide/doc_style/index.html index aa7fff43d93..ad5c65a5b65 100644 --- a/user_guide/doc_style/index.html +++ b/user_guide/doc_style/index.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -80,7 +80,7 @@

    Files

    User Guide Home   ·   Next Topic:  Benchmarking Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/doc_style/template.html b/user_guide/doc_style/template.html index d59d5e4ed56..3fde59c9e8a 100644 --- a/user_guide/doc_style/template.html +++ b/user_guide/doc_style/template.html @@ -121,7 +121,7 @@

    $this->foo->bar()

    User Guide Home   ·   Next Topic:  Next Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/alternative_php.html b/user_guide/general/alternative_php.html index 6e601af4428..6d2165fda4c 100644 --- a/user_guide/general/alternative_php.html +++ b/user_guide/general/alternative_php.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -140,7 +140,7 @@

    Alternative Control Structures

    User Guide Home   ·   Next Topic:  Security

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/ancillary_classes.html b/user_guide/general/ancillary_classes.html index 0e3d54deb08..9c209c0b743 100644 --- a/user_guide/general/ancillary_classes.html +++ b/user_guide/general/ancillary_classes.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -110,7 +110,7 @@

    get_instance()

    User Guide Home   ·   Next Topic:  Auto-loading Resources

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/autoloader.html b/user_guide/general/autoloader.html index 699751202f8..fdc02e9061b 100644 --- a/user_guide/general/autoloader.html +++ b/user_guide/general/autoloader.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -93,7 +93,7 @@

    Auto-loading Resources

    Top of Page   ·   User Guide Home   ·   Next Topic:  Common Functions

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/caching.html b/user_guide/general/caching.html index a0d7596ed2a..5ccc791904a 100644 --- a/user_guide/general/caching.html +++ b/user_guide/general/caching.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -108,7 +108,7 @@

    Deleting Caches

    User Guide Home   ·   Next Topic:  Profiling Your Application

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/cli.html b/user_guide/general/cli.html index 5dda24b5613..e21d1de511e 100644 --- a/user_guide/general/cli.html +++ b/user_guide/general/cli.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -143,7 +143,7 @@

    That's it!

    Top of Page   ·   User Guide Home   ·   Next Topic:  Reserved Names

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/common_functions.html b/user_guide/general/common_functions.html index f290521a99e..ac2ff529ba0 100644 --- a/user_guide/general/common_functions.html +++ b/user_guide/general/common_functions.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -120,7 +120,7 @@

    html_escape($mixed)

    Top of Page   ·   User Guide Home   ·   Next Topic:  URI Routing

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/controllers.html b/user_guide/general/controllers.html index 91dd95a003c..ee482e512ee 100644 --- a/user_guide/general/controllers.html +++ b/user_guide/general/controllers.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -381,7 +381,7 @@

    That's it!

    Top of Page   ·   User Guide Home   ·   Next Topic:  Reserved Names

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/core_classes.html b/user_guide/general/core_classes.html index be711903c70..ae43eef27a7 100644 --- a/user_guide/general/core_classes.html +++ b/user_guide/general/core_classes.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -179,7 +179,7 @@

    Setting Your Own Prefix

    User Guide Home   ·   Next Topic:  Hooks - Extending the Core

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/creating_drivers.html b/user_guide/general/creating_drivers.html index 77cccd03c53..eaa626566ce 100644 --- a/user_guide/general/creating_drivers.html +++ b/user_guide/general/creating_drivers.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -93,7 +93,7 @@

    Driver Directory and File Structure

    User Guide Home   ·   Next Topic:  Creating Core System Classes

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/creating_libraries.html b/user_guide/general/creating_libraries.html index f905bb7c3d7..977cfae4d80 100644 --- a/user_guide/general/creating_libraries.html +++ b/user_guide/general/creating_libraries.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -286,7 +286,7 @@

    Setting Your Own Prefix

    User Guide Home   ·   Next Topic:  Using CodeIgniter Drivers

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/credits.html b/user_guide/general/credits.html index 00c57787170..90e7d030613 100644 --- a/user_guide/general/credits.html +++ b/user_guide/general/credits.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -80,7 +80,7 @@

    Credits

    User Guide Home   ·   Next Topic:  Downloading CodeIgniter

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/drivers.html b/user_guide/general/drivers.html index f463adb1031..9ea7df6b6a2 100644 --- a/user_guide/general/drivers.html +++ b/user_guide/general/drivers.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -97,7 +97,7 @@

    Creating Your Own Drivers

    User Guide Home   ·   Next Topic:  Creating Drivers

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/environments.html b/user_guide/general/environments.html index 0245b085dc6..38285a6621d 100644 --- a/user_guide/general/environments.html +++ b/user_guide/general/environments.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -119,7 +119,7 @@

    Configuration Files

    User Guide Home   ·   Next Topic:  Alternative PHP Syntax

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/errors.html b/user_guide/general/errors.html index d6bed9ea103..3f0830419f3 100644 --- a/user_guide/general/errors.html +++ b/user_guide/general/errors.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -133,7 +133,7 @@

    log_message('level', 'message')

    User Guide Home   ·   Next Topic:  Page Caching

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/helpers.html b/user_guide/general/helpers.html index 619e9ff78f2..099430bea7f 100644 --- a/user_guide/general/helpers.html +++ b/user_guide/general/helpers.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -178,7 +178,7 @@

    Now What?

    User Guide Home   ·   Next Topic:  Using Libraries

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/hooks.html b/user_guide/general/hooks.html index 07d302a7dd7..70fb9648eb5 100644 --- a/user_guide/general/hooks.html +++ b/user_guide/general/hooks.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -158,7 +158,7 @@

    Hook Points

    User Guide Home   ·   Next Topic:  Auto-loading Resources

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/libraries.html b/user_guide/general/libraries.html index 73b642bef5b..648b6cba915 100644 --- a/user_guide/general/libraries.html +++ b/user_guide/general/libraries.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -91,7 +91,7 @@

    Creating Your Own Libraries

    User Guide Home   ·   Next Topic:  Creating Libraries

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/managing_apps.html b/user_guide/general/managing_apps.html index 3885197969b..97312a01e5f 100644 --- a/user_guide/general/managing_apps.html +++ b/user_guide/general/managing_apps.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -126,7 +126,7 @@

    Running Multiple Applications with one CodeIgniter Installation

    User Guide Home   ·   Next Topic:  Alternative PHP Syntax

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/models.html b/user_guide/general/models.html index 7bda4d9a941..a416a80d91b 100644 --- a/user_guide/general/models.html +++ b/user_guide/general/models.html @@ -27,7 +27,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -244,7 +244,7 @@

    Connecting to your Database

    User Guide Home   ·   Next Topic:  Helpers

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/profiling.html b/user_guide/general/profiling.html index 451b6f9e6c8..b6d5721fd8a 100644 --- a/user_guide/general/profiling.html +++ b/user_guide/general/profiling.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -174,7 +174,7 @@

    Enabling and Disabling Profiler Sections

    User Guide Home   ·   Next Topic:  Managing Applications

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/quick_reference.html b/user_guide/general/quick_reference.html index 6c07b335c28..1eb78992b10 100644 --- a/user_guide/general/quick_reference.html +++ b/user_guide/general/quick_reference.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -70,7 +70,7 @@

    Quick Reference Chart

    Top of Page   ·   User Guide Home

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/requirements.html b/user_guide/general/requirements.html index 1393b40e020..230ab7809ff 100644 --- a/user_guide/general/requirements.html +++ b/user_guide/general/requirements.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -75,7 +75,7 @@

    Server Requirements

    User Guide Home   ·   Next Topic:  License Agreement

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/reserved_names.html b/user_guide/general/reserved_names.html index 450c0f667e5..80df6fd110e 100644 --- a/user_guide/general/reserved_names.html +++ b/user_guide/general/reserved_names.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -121,7 +121,7 @@

    Constants

    Top of Page   ·   User Guide Home   ·   Next Topic:  Views

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/routing.html b/user_guide/general/routing.html index d5c90a1b8c2..e2252e02821 100644 --- a/user_guide/general/routing.html +++ b/user_guide/general/routing.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -164,7 +164,7 @@

    Reserved Routes

    User Guide Home   ·   Next Topic:  Error Handling

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/security.html b/user_guide/general/security.html index 9e78d4c6852..b91266f92e1 100644 --- a/user_guide/general/security.html +++ b/user_guide/general/security.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -157,7 +157,7 @@

    Best Practices

    User Guide Home   ·   Next Topic:  PHP Style Guide

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/styleguide.html b/user_guide/general/styleguide.html index c9431336529..3ca16496b38 100644 --- a/user_guide/general/styleguide.html +++ b/user_guide/general/styleguide.html @@ -34,7 +34,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -672,7 +672,7 @@

    Default Function Arguments

    User Guide Home   ·   Next Topic:  Writing Documentation

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/urls.html b/user_guide/general/urls.html index edf03309bf0..d5d85df8a5d 100644 --- a/user_guide/general/urls.html +++ b/user_guide/general/urls.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -144,7 +144,7 @@

    Enabling Query Strings

    Top of Page   ·   User Guide Home   ·   Next Topic:  Controllers

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/general/views.html b/user_guide/general/views.html index 5dc1d325030..68686e1e604 100644 --- a/user_guide/general/views.html +++ b/user_guide/general/views.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -267,7 +267,7 @@

    Returning views as data

    User Guide Home   ·   Next Topic:  Models

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/array_helper.html b/user_guide/helpers/array_helper.html index 92a11ed6933..9b7a90b8571 100644 --- a/user_guide/helpers/array_helper.html +++ b/user_guide/helpers/array_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -163,7 +163,7 @@

    elements()

    Top of Page   ·   User Guide Home   ·   Next Topic:  CAPTCHA Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/captcha_helper.html b/user_guide/helpers/captcha_helper.html index 6c2671ad0ab..d6b46fdc066 100644 --- a/user_guide/helpers/captcha_helper.html +++ b/user_guide/helpers/captcha_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -188,7 +188,7 @@

    Adding a Database

    Top of Page   ·   User Guide Home   ·   Next Topic:  Cookie Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/cookie_helper.html b/user_guide/helpers/cookie_helper.html index 2fde7f8411b..beba67a966b 100644 --- a/user_guide/helpers/cookie_helper.html +++ b/user_guide/helpers/cookie_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -100,7 +100,7 @@

    delete_cookie()

    Top of Page   ·   User Guide Home   ·   Next Topic:  Date Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/date_helper.html b/user_guide/helpers/date_helper.html index e705593b084..f39971a0c7f 100644 --- a/user_guide/helpers/date_helper.html +++ b/user_guide/helpers/date_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -401,7 +401,7 @@

    Timezone Reference

    User Guide Home   ·   Next Topic:  Directory Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/directory_helper.html b/user_guide/helpers/directory_helper.html index 7fd7797af8c..c5ac082cd1a 100644 --- a/user_guide/helpers/directory_helper.html +++ b/user_guide/helpers/directory_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -136,7 +136,7 @@

    directory_map('source directory')

    User Guide Home   ·   Next Topic:  Download Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/download_helper.html b/user_guide/helpers/download_helper.html index ccfe9ac728e..b669202ad61 100644 --- a/user_guide/helpers/download_helper.html +++ b/user_guide/helpers/download_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -105,7 +105,7 @@

    force_download('filename', 'data')

    Top of Page   ·   User Guide Home   ·   Next Topic:  Email Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/email_helper.html b/user_guide/helpers/email_helper.html index 13ae220fe7d..ae8d2da0ee9 100644 --- a/user_guide/helpers/email_helper.html +++ b/user_guide/helpers/email_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -95,7 +95,7 @@

    send_email('recipient', 'subject', 'message Top of Page   ·   User Guide Home   ·   Next Topic:  File Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/file_helper.html b/user_guide/helpers/file_helper.html index 0296191ffcd..3302cd0483b 100644 --- a/user_guide/helpers/file_helper.html +++ b/user_guide/helpers/file_helper.html @@ -27,7 +27,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -172,7 +172,7 @@

    octal_permissions($perms)

    Top of Page   ·   User Guide Home   ·   Next Topic:  Form Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/form_helper.html b/user_guide/helpers/form_helper.html index ce809e9464e..02952b67910 100644 --- a/user_guide/helpers/form_helper.html +++ b/user_guide/helpers/form_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -477,7 +477,7 @@

    set_radio()

    User Guide Home   ·   Next Topic:  HTML Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/html_helper.html b/user_guide/helpers/html_helper.html index a8277febeac..6ade2d13736 100644 --- a/user_guide/helpers/html_helper.html +++ b/user_guide/helpers/html_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -383,7 +383,7 @@

    doctype()

    Top of Page   ·   User Guide Home   ·   Next Topic:   Path Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/inflector_helper.html b/user_guide/helpers/inflector_helper.html index 66982e8b3ed..d441ca1ebdc 100644 --- a/user_guide/helpers/inflector_helper.html +++ b/user_guide/helpers/inflector_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -144,7 +144,7 @@

    humanize()

    User Guide Home   ·   Next Topic:  Number Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/language_helper.html b/user_guide/helpers/language_helper.html index 073c368d8d0..9761b96b77e 100644 --- a/user_guide/helpers/language_helper.html +++ b/user_guide/helpers/language_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -91,7 +91,7 @@

    lang('language line', 'element id')

    User Guide Home   ·   Next Topic:  Download Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/number_helper.html b/user_guide/helpers/number_helper.html index c48987e6c11..8dd9287a8e2 100644 --- a/user_guide/helpers/number_helper.html +++ b/user_guide/helpers/number_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -106,7 +106,7 @@

    byte_format()

    User Guide Home   ·   Next Topic:  Path Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/path_helper.html b/user_guide/helpers/path_helper.html index 00f4aa2ec6a..04826bb1914 100644 --- a/user_guide/helpers/path_helper.html +++ b/user_guide/helpers/path_helper.html @@ -27,7 +27,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -99,7 +99,7 @@

     

    User Guide Home   ·   Next Topic:  Security Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/security_helper.html b/user_guide/helpers/security_helper.html index 16d5c51f2ba..b05d8e07600 100644 --- a/user_guide/helpers/security_helper.html +++ b/user_guide/helpers/security_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -125,7 +125,7 @@

    encode_php_tags()

    Top of Page   ·   User Guide Home   ·   Next Topic:  Smiley Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/smiley_helper.html b/user_guide/helpers/smiley_helper.html index 8bdd1df2cbb..3441cd8a3a8 100644 --- a/user_guide/helpers/smiley_helper.html +++ b/user_guide/helpers/smiley_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -208,7 +208,7 @@

    parse_smileys()

    User Guide Home   ·   Next Topic:  String Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/string_helper.html b/user_guide/helpers/string_helper.html index 3d7ba1c51b2..d4023841d7f 100644 --- a/user_guide/helpers/string_helper.html +++ b/user_guide/helpers/string_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -182,7 +182,7 @@

    strip_quotes()

    User Guide Home   ·   Next Topic:  Text Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/text_helper.html b/user_guide/helpers/text_helper.html index 9f0d22ffc6b..775ded677d8 100644 --- a/user_guide/helpers/text_helper.html +++ b/user_guide/helpers/text_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -204,7 +204,7 @@

    ellipsize()

    User Guide Home   ·   Next Topic:  Typography Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/typography_helper.html b/user_guide/helpers/typography_helper.html index a6bd809a5a5..16e3ca989ea 100644 --- a/user_guide/helpers/typography_helper.html +++ b/user_guide/helpers/typography_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -105,7 +105,7 @@

    nl2br_except_pre()

    User Guide Home   ·   Next Topic:  URL Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/url_helper.html b/user_guide/helpers/url_helper.html index c23c5ac929a..488078c39ef 100644 --- a/user_guide/helpers/url_helper.html +++ b/user_guide/helpers/url_helper.html @@ -27,7 +27,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -295,7 +295,7 @@

    redirect()

    User Guide Home   ·   Next Topic:  XML Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/helpers/xml_helper.html b/user_guide/helpers/xml_helper.html index f410b21141a..ce037c2517e 100644 --- a/user_guide/helpers/xml_helper.html +++ b/user_guide/helpers/xml_helper.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -98,7 +98,7 @@

    xml_convert('string')

    Top of Page   ·   User Guide Home

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/index.html b/user_guide/index.html index fa90983e1ff..b7ae61887b6 100644 --- a/user_guide/index.html +++ b/user_guide/index.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -89,7 +89,7 @@

    Who is CodeIgniter For?

    diff --git a/user_guide/installation/downloads.html b/user_guide/installation/downloads.html index 14c65edd0f7..12252ad47f6 100644 --- a/user_guide/installation/downloads.html +++ b/user_guide/installation/downloads.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -58,7 +58,8 @@

    Downloading CodeIgniter

      -
    • CodeIgniter V 2.1.0 (Current version)
    • +
    • CodeIgniter V 2.1.1 (Current version)
    • +
    • CodeIgniter V 2.1.0
    • CodeIgniter V 2.0.3
    • CodeIgniter V 2.0.2
    • CodeIgniter V 2.0.1
    • @@ -91,11 +92,12 @@

      Downloading CodeIgniter

      Git Server

      Git is a distributed version control system.

      -

      Public Git access is available at GitHub. - Please note that while every effort is made to keep this code base functional, we cannot guarantee the functionality of code taken - from the tip.

      +

      Public Git access is available at GitHub. + Please note that while every effort is made to keep this code base functional, we cannot guarantee the functionality of code taken + from the tip.

      + +

      Beginning with version 2.0.3, stable tags are also available via GitHub, simply select the version from the Tags dropdown.

      -

      Beginning with version 2.0.3, stable tags are also available via GitHub, simply select the version from the Tags dropdown.

    @@ -108,7 +110,7 @@

    Git Server

    User Guide Home   ·   Next Topic:  Installation Instructions

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/index.html b/user_guide/installation/index.html index f01c8b8d582..aca760ca410 100644 --- a/user_guide/installation/index.html +++ b/user_guide/installation/index.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -101,7 +101,7 @@

    Installation Instructions

    Next Topic:  Upgrading from a Previous Version

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/troubleshooting.html b/user_guide/installation/troubleshooting.html index e79eb6a9f8f..bb7cadebae9 100644 --- a/user_guide/installation/troubleshooting.html +++ b/user_guide/installation/troubleshooting.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -83,7 +83,7 @@

    Troubleshooting

    User Guide Home   ·   Next Topic:  CodeIgniter at a Glance

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_120.html b/user_guide/installation/upgrade_120.html index 2b3d066cd10..b80c02ad946 100644 --- a/user_guide/installation/upgrade_120.html +++ b/user_guide/installation/upgrade_120.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -85,7 +85,7 @@

    Upgrading From Beta 1.0 to Final 1.2

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_130.html b/user_guide/installation/upgrade_130.html index dd1465617ae..3a335738e6c 100644 --- a/user_guide/installation/upgrade_130.html +++ b/user_guide/installation/upgrade_130.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -196,7 +196,7 @@

    Step 6: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_131.html b/user_guide/installation/upgrade_131.html index 202468dac93..4a91c6cebbf 100644 --- a/user_guide/installation/upgrade_131.html +++ b/user_guide/installation/upgrade_131.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -95,7 +95,7 @@

    Step 2: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_132.html b/user_guide/installation/upgrade_132.html index 99f8fd3ab08..1763f2b9c59 100644 --- a/user_guide/installation/upgrade_132.html +++ b/user_guide/installation/upgrade_132.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -93,7 +93,7 @@

    Step 2: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_133.html b/user_guide/installation/upgrade_133.html index b9b7a7fd39d..fd1887d0ec2 100644 --- a/user_guide/installation/upgrade_133.html +++ b/user_guide/installation/upgrade_133.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -105,7 +105,7 @@

    Step 3: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_140.html b/user_guide/installation/upgrade_140.html index 50891b9129d..d82472551a2 100644 --- a/user_guide/installation/upgrade_140.html +++ b/user_guide/installation/upgrade_140.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -138,7 +138,7 @@

    Step 3: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_141.html b/user_guide/installation/upgrade_141.html index afa8018b8fc..3ed11e7b53d 100644 --- a/user_guide/installation/upgrade_141.html +++ b/user_guide/installation/upgrade_141.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -141,7 +141,7 @@

    Step 4: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_150.html b/user_guide/installation/upgrade_150.html index f910aa0396c..5909a463a19 100644 --- a/user_guide/installation/upgrade_150.html +++ b/user_guide/installation/upgrade_150.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -171,7 +171,7 @@

    Step 5: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_152.html b/user_guide/installation/upgrade_152.html index 55e43f7282c..f46aee96794 100644 --- a/user_guide/installation/upgrade_152.html +++ b/user_guide/installation/upgrade_152.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -104,7 +104,7 @@

    Step 2: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_153.html b/user_guide/installation/upgrade_153.html index 3e6af7a3833..3d28c6c77f1 100644 --- a/user_guide/installation/upgrade_153.html +++ b/user_guide/installation/upgrade_153.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -93,7 +93,7 @@

    Step 2: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_154.html b/user_guide/installation/upgrade_154.html index 627fa0896ea..d8dffc99d2f 100644 --- a/user_guide/installation/upgrade_154.html +++ b/user_guide/installation/upgrade_154.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -109,7 +109,7 @@

    Step 4: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_160.html b/user_guide/installation/upgrade_160.html index 70e589ccf25..b90a2e370e2 100644 --- a/user_guide/installation/upgrade_160.html +++ b/user_guide/installation/upgrade_160.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -118,7 +118,7 @@

    Step 5: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_161.html b/user_guide/installation/upgrade_161.html index 40877369ddb..69bf8489380 100644 --- a/user_guide/installation/upgrade_161.html +++ b/user_guide/installation/upgrade_161.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -91,7 +91,7 @@

    Step 2: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_162.html b/user_guide/installation/upgrade_162.html index d6719084249..270507c598d 100644 --- a/user_guide/installation/upgrade_162.html +++ b/user_guide/installation/upgrade_162.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -99,7 +99,7 @@

    Step 5: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_163.html b/user_guide/installation/upgrade_163.html index cdf6bdf6f16..35e7f5c52c9 100644 --- a/user_guide/installation/upgrade_163.html +++ b/user_guide/installation/upgrade_163.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -92,7 +92,7 @@

    Step 2: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_170.html b/user_guide/installation/upgrade_170.html index 7c67f9125b8..3a7943905e1 100644 --- a/user_guide/installation/upgrade_170.html +++ b/user_guide/installation/upgrade_170.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -114,7 +114,7 @@

    Step 4: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_171.html b/user_guide/installation/upgrade_171.html index 014b2c589f6..43710d4444e 100644 --- a/user_guide/installation/upgrade_171.html +++ b/user_guide/installation/upgrade_171.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -91,7 +91,7 @@

    Step 2: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_172.html b/user_guide/installation/upgrade_172.html index 961f3cae10f..1882da71257 100644 --- a/user_guide/installation/upgrade_172.html +++ b/user_guide/installation/upgrade_172.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -102,7 +102,7 @@

    Step 4: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_200.html b/user_guide/installation/upgrade_200.html index b5d6e75ecb8..fb4fdaf7116 100644 --- a/user_guide/installation/upgrade_200.html +++ b/user_guide/installation/upgrade_200.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -124,7 +124,7 @@

    Step 8: Update your user guide

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_201.html b/user_guide/installation/upgrade_201.html index 7edd0ba6abd..16177e94080 100644 --- a/user_guide/installation/upgrade_201.html +++ b/user_guide/installation/upgrade_201.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -98,7 +98,7 @@

    Step 3: Check for forms posting to default controller

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_202.html b/user_guide/installation/upgrade_202.html index 9aaa561eb0e..a0d78711565 100644 --- a/user_guide/installation/upgrade_202.html +++ b/user_guide/installation/upgrade_202.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -90,7 +90,7 @@

    Step 3: Move MY_Security

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_203.html b/user_guide/installation/upgrade_203.html index d4b703af0cd..0969164df29 100644 --- a/user_guide/installation/upgrade_203.html +++ b/user_guide/installation/upgrade_203.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -114,7 +114,7 @@

    Update Sessions Database Tables

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_210.html b/user_guide/installation/upgrade_210.html index d9a7213a91a..7c34806e7c5 100644 --- a/user_guide/installation/upgrade_210.html +++ b/user_guide/installation/upgrade_210.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -82,7 +82,7 @@

    Step 2: Replace config/user_agents.php

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrade_211.html b/user_guide/installation/upgrade_211.html new file mode 100644 index 00000000000..a2afdee2b72 --- /dev/null +++ b/user_guide/installation/upgrade_211.html @@ -0,0 +1,89 @@ + + + + + +Upgrading from 2.0.3 to 2.1.0 : CodeIgniter User Guide + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +

    CodeIgniter User Guide Version 2.1.1

    +
    + + + + + + + + + +
    + + +
    + + + +
    + +

    Upgrading from 2.1.0 to 2.1.1

    + +

    Before performing an update you should take your site offline by replacing the index.php file with a static one.

    + +

    Step 1: Update your CodeIgniter files

    + +

    Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.

    + +

    Note: If you have any custom developed files in these folders please make copies of them first.

    + +

    Step 2: Replace config/mimes.php

    + +

    This config file has been updated to contain more user mime-types, please copy it to application/config/mimes.php.

    + + +
    + + + + + + + \ No newline at end of file diff --git a/user_guide/installation/upgrade_b11.html b/user_guide/installation/upgrade_b11.html index dc3c1f07c13..0e52aa601bb 100644 --- a/user_guide/installation/upgrade_b11.html +++ b/user_guide/installation/upgrade_b11.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -137,7 +137,7 @@

    Step 5: Edit your config file

    User Guide Home   ·   Next Topic:  Troubleshooting

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/installation/upgrading.html b/user_guide/installation/upgrading.html index c3f5ae6ddad..1c8be902579 100644 --- a/user_guide/installation/upgrading.html +++ b/user_guide/installation/upgrading.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -60,6 +60,7 @@

    Upgrading From a Previous Version

    Please read the upgrade notes corresponding to the version you are upgrading from.

    diff --git a/user_guide/libraries/benchmark.html b/user_guide/libraries/benchmark.html index 602e6fac0e1..55592857a38 100644 --- a/user_guide/libraries/benchmark.html +++ b/user_guide/libraries/benchmark.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -191,7 +191,7 @@

    Displaying Memory Consumption

    User Guide Home   ·   Next Topic:  Calendar Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/caching.html b/user_guide/libraries/caching.html index 9808aaa51e6..a818fe807e0 100644 --- a/user_guide/libraries/caching.html +++ b/user_guide/libraries/caching.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -186,7 +186,7 @@

    Dummy Cache

    User Guide Home   ·   Next Topic:  Database Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/calendar.html b/user_guide/libraries/calendar.html index 2abc43975ce..ac0c8252a45 100644 --- a/user_guide/libraries/calendar.html +++ b/user_guide/libraries/calendar.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -242,7 +242,7 @@

    Creating a Calendar Template

    User Guide Home   ·   Next Topic:  Cart Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/cart.html b/user_guide/libraries/cart.html index b867b709c59..c10ab4488d1 100644 --- a/user_guide/libraries/cart.html +++ b/user_guide/libraries/cart.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -339,7 +339,7 @@

    $this->cart->destroy();

    User Guide Home   ·   Next Topic:  Config Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/config.html b/user_guide/libraries/config.html index 08b612e7798..a689bd5cf82 100644 --- a/user_guide/libraries/config.html +++ b/user_guide/libraries/config.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -215,7 +215,7 @@

    $this->config->system_url();

    User Guide Home   ·   Next Topic:  Database Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/email.html b/user_guide/libraries/email.html index 7fc56d55b1a..e418d528d9f 100644 --- a/user_guide/libraries/email.html +++ b/user_guide/libraries/email.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -300,7 +300,7 @@

    Overriding Word Wrapping

    User Guide Home   ·   Next Topic:  Encryption Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/encryption.html b/user_guide/libraries/encryption.html index 6ec629f96fb..935e0bfa048 100644 --- a/user_guide/libraries/encryption.html +++ b/user_guide/libraries/encryption.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -217,7 +217,7 @@

    $this->encrypt->encode_from_legacy($orig_data, $ User Guide Home   ·   Next Topic:  File Uploading Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/file_uploading.html b/user_guide/libraries/file_uploading.html index 2cb1ef5ea58..2ada111ab99 100644 --- a/user_guide/libraries/file_uploading.html +++ b/user_guide/libraries/file_uploading.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -444,7 +444,7 @@

    Explanation

    User Guide Home   ·   Next Topic:  Form Validation Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  Ellislab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  Ellislab, Inc.

    diff --git a/user_guide/libraries/form_validation.html b/user_guide/libraries/form_validation.html index 2028bcd2ccc..81f2b958294 100644 --- a/user_guide/libraries/form_validation.html +++ b/user_guide/libraries/form_validation.html @@ -27,7 +27,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -1243,7 +1243,7 @@

    set_radio()

    User Guide Home   ·   Next Topic:  FTP Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/ftp.html b/user_guide/libraries/ftp.html index 175efe19bcf..8cf60893e5d 100644 --- a/user_guide/libraries/ftp.html +++ b/user_guide/libraries/ftp.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -308,7 +308,7 @@

    $this->ftp->close();

    User Guide Home   ·   Next Topic:  HTML Table Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/image_lib.html b/user_guide/libraries/image_lib.html index 1caf791d85f..8df6976e1bd 100644 --- a/user_guide/libraries/image_lib.html +++ b/user_guide/libraries/image_lib.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -660,7 +660,7 @@

    Overlay Preferences

    User Guide Home   ·   Next Topic:  Input Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/input.html b/user_guide/libraries/input.html index 10c84a9ea58..2f2d1830b33 100644 --- a/user_guide/libraries/input.html +++ b/user_guide/libraries/input.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -288,7 +288,7 @@

    $this->input->is_cli_request()

    User Guide Home   ·   Next Topic:  Loader Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/javascript.html b/user_guide/libraries/javascript.html index 3dda1fd69db..6b72ed6c2ee 100644 --- a/user_guide/libraries/javascript.html +++ b/user_guide/libraries/javascript.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -240,7 +240,7 @@

    calendar()

    Top of Page   ·   User Guide Home   ·   Next Topic:  Array Helper

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/language.html b/user_guide/libraries/language.html index a9afcef9004..44a4cb654e0 100644 --- a/user_guide/libraries/language.html +++ b/user_guide/libraries/language.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -130,7 +130,7 @@

    Auto-loading Languages

    User Guide Home   ·   Next Topic:  Output Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/loader.html b/user_guide/libraries/loader.html index 53440c53c7b..862430b9f39 100644 --- a/user_guide/libraries/loader.html +++ b/user_guide/libraries/loader.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -266,7 +266,7 @@

    Package view files

    User Guide Home   ·   Next Topic:  Language Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/migration.html b/user_guide/libraries/migration.html index ed99044d1d9..64677219887 100644 --- a/user_guide/libraries/migration.html +++ b/user_guide/libraries/migration.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -169,7 +169,7 @@

    Migration Preferences

    User Guide Home   ·   Next Topic:  HTML Table Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/output.html b/user_guide/libraries/output.html index 77fe464ce7b..cf2324bd844 100644 --- a/user_guide/libraries/output.html +++ b/user_guide/libraries/output.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -170,7 +170,7 @@

    Parsing Execution Variables

    User Guide Home   ·   Next Topic:  Pagination Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/pagination.html b/user_guide/libraries/pagination.html index 6478694d06a..54c7efcc214 100644 --- a/user_guide/libraries/pagination.html +++ b/user_guide/libraries/pagination.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -226,7 +226,7 @@

    Adding a class to every anchor

    User Guide Home   ·   Next Topic:  Session Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/parser.html b/user_guide/libraries/parser.html index f449145acc0..4d909223c5f 100644 --- a/user_guide/libraries/parser.html +++ b/user_guide/libraries/parser.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -205,7 +205,7 @@

    Variable Pairs

    User Guide Home   ·   Next Topic:  Typography

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/security.html b/user_guide/libraries/security.html index ad1d9ae8670..25f1fe879fe 100644 --- a/user_guide/libraries/security.html +++ b/user_guide/libraries/security.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -128,7 +128,7 @@

    Cross-site request forgery (CSRF)

    User Guide Home   ·   Next Topic:  Session Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/sessions.html b/user_guide/libraries/sessions.html index dfb73249103..ba9085f5928 100644 --- a/user_guide/libraries/sessions.html +++ b/user_guide/libraries/sessions.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -334,7 +334,7 @@

    Session Preferences

    User Guide Home   ·   Next Topic:  Trackback Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/table.html b/user_guide/libraries/table.html index 003916ef3c2..1c46b5faccf 100644 --- a/user_guide/libraries/table.html +++ b/user_guide/libraries/table.html @@ -27,7 +27,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -308,7 +308,7 @@

    $this->table->function

    User Guide Home   ·   Next Topic:  Image Manipulation Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/trackback.html b/user_guide/libraries/trackback.html index 0351584639a..f77937a9bce 100644 --- a/user_guide/libraries/trackback.html +++ b/user_guide/libraries/trackback.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -239,7 +239,7 @@

    Notes:

    User Guide Home   ·   Next Topic:  Template Parser Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/typography.html b/user_guide/libraries/typography.html index 12be119cc85..81c244790cb 100644 --- a/user_guide/libraries/typography.html +++ b/user_guide/libraries/typography.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -153,7 +153,7 @@

    protect_braced_quotes

    User Guide Home   ·   Next Topic:  Unit Testing Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/unit_testing.html b/user_guide/libraries/unit_testing.html index 7d27ff1dd7b..df1748e5c96 100644 --- a/user_guide/libraries/unit_testing.html +++ b/user_guide/libraries/unit_testing.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -219,7 +219,7 @@

    Creating a Template

    User Guide Home   ·   Next Topic:  URI Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/uri.html b/user_guide/libraries/uri.html index f04bb9f10e0..9b9b5d8895d 100644 --- a/user_guide/libraries/uri.html +++ b/user_guide/libraries/uri.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -245,7 +245,7 @@

    $this->uri->rsegment_array()

    User Guide Home   ·   Next Topic:  User Agent Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/user_agent.html b/user_guide/libraries/user_agent.html index 8b3dcee62d9..829fdba03cd 100644 --- a/user_guide/libraries/user_agent.html +++ b/user_guide/libraries/user_agent.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -219,7 +219,7 @@

    $this->agent->accept_charset()

    User Guide Home   ·   Next Topic:  XML-RPC Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/xmlrpc.html b/user_guide/libraries/xmlrpc.html index bb939dff459..ad714efbf1f 100644 --- a/user_guide/libraries/xmlrpc.html +++ b/user_guide/libraries/xmlrpc.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -512,7 +512,7 @@

    Data Types

    User Guide Home   ·   Next Topic:  Zip Encoding Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/libraries/zip.html b/user_guide/libraries/zip.html index 53fc71ef3d7..3324bd16c92 100644 --- a/user_guide/libraries/zip.html +++ b/user_guide/libraries/zip.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -281,7 +281,7 @@

    $this->zip->clear_data()

    User Guide Home   ·   Next Topic:  Caching Class

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/license.html b/user_guide/license.html index f9769a417c4..bc25c30b429 100644 --- a/user_guide/license.html +++ b/user_guide/license.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -100,7 +100,7 @@

    Limitations of Liability

    User Guide Home   ·   Next Topic:  Change Log

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/overview/appflow.html b/user_guide/overview/appflow.html index 61bf907a6b4..a59758f0b98 100644 --- a/user_guide/overview/appflow.html +++ b/user_guide/overview/appflow.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -88,7 +88,7 @@

    Application Flow Chart

    User Guide Home   ·   Next Topic:  Model-View-Controller

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/overview/at_a_glance.html b/user_guide/overview/at_a_glance.html index 7e93bd2a619..18688d34fd0 100644 --- a/user_guide/overview/at_a_glance.html +++ b/user_guide/overview/at_a_glance.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -155,7 +155,7 @@

    CodeIgniter has a Friendly Community of Users

    User Guide Home   ·   Next Topic:  CodeIgniter Cheatsheets

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/overview/cheatsheets.html b/user_guide/overview/cheatsheets.html index 60e655229b5..005890a556f 100644 --- a/user_guide/overview/cheatsheets.html +++ b/user_guide/overview/cheatsheets.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -76,7 +76,7 @@

    Helpers Reference

    User Guide Home   ·   Next Topic:  CodeIgniter Features

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/overview/features.html b/user_guide/overview/features.html index d1d5c8c25e7..c97044414b7 100644 --- a/user_guide/overview/features.html +++ b/user_guide/overview/features.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -111,7 +111,7 @@

    CodeIgniter Features

    User Guide Home   ·   Next Topic:  Application Flow Chart

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/overview/getting_started.html b/user_guide/overview/getting_started.html index ad6fa01ed0b..8d8a8af35a5 100644 --- a/user_guide/overview/getting_started.html +++ b/user_guide/overview/getting_started.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -85,7 +85,7 @@

    Getting Started With CodeIgniter

    User Guide Home   ·   Next Topic:  CodeIgniter At a Glance

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/overview/goals.html b/user_guide/overview/goals.html index f2263c7ae21..0d2eeb5c959 100644 --- a/user_guide/overview/goals.html +++ b/user_guide/overview/goals.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -91,7 +91,7 @@

    Design and Architectural Goals

    User Guide Home   ·   Next Topic:  Getting Started

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/overview/index.html b/user_guide/overview/index.html index f295d4e812e..732a245ffa4 100644 --- a/user_guide/overview/index.html +++ b/user_guide/overview/index.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -77,7 +77,7 @@

    CodeIgniter Overview

    diff --git a/user_guide/overview/mvc.html b/user_guide/overview/mvc.html index 4aebb1095b2..989ad7afb17 100644 --- a/user_guide/overview/mvc.html +++ b/user_guide/overview/mvc.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -93,7 +93,7 @@

    Model-View-Controller

    User Guide Home   ·   Next Topic:  Architectural Goals

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/toc.html b/user_guide/toc.html index 01b5a7b928b..07bfbd23468 100644 --- a/user_guide/toc.html +++ b/user_guide/toc.html @@ -29,7 +29,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -221,7 +221,7 @@

    Helper Reference

    diff --git a/user_guide/tutorial/conclusion.html b/user_guide/tutorial/conclusion.html index 9cf14674698..b4a1e000541 100644 --- a/user_guide/tutorial/conclusion.html +++ b/user_guide/tutorial/conclusion.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -84,7 +84,7 @@

    Tutorial - Conclusion

    User Guide Home   ·   Next Topic:  CodeIgniter URLs

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/tutorial/create_news_items.html b/user_guide/tutorial/create_news_items.html index 26b1ed10f27..9afeed9ecb0 100644 --- a/user_guide/tutorial/create_news_items.html +++ b/user_guide/tutorial/create_news_items.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -172,7 +172,7 @@

    Routing

    User Guide Home   ·   Next Topic:  Conclusion

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/tutorial/hard_coded_pages.html b/user_guide/tutorial/hard_coded_pages.html index b34e9f1be52..354dcb0e65a 100644 --- a/user_guide/tutorial/hard_coded_pages.html +++ b/user_guide/tutorial/hard_coded_pages.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -151,7 +151,7 @@

    Routing

    User Guide Home   ·   Next Topic:  Application Flow Chart

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/tutorial/index.html b/user_guide/tutorial/index.html index 65075fb2a85..d3392669e10 100644 --- a/user_guide/tutorial/index.html +++ b/user_guide/tutorial/index.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -94,7 +94,7 @@

    Tutorial − Introduction

    User Guide Home   ·   Next Topic:  Static pages

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/tutorial/news_section.html b/user_guide/tutorial/news_section.html index cf3377ff9b9..1cb67c66e51 100644 --- a/user_guide/tutorial/news_section.html +++ b/user_guide/tutorial/news_section.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -223,7 +223,7 @@

    Routing

    User Guide Home   ·   Next Topic:  Create news items

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    diff --git a/user_guide/tutorial/static_pages.html b/user_guide/tutorial/static_pages.html index da2c58cda00..a7112f36231 100644 --- a/user_guide/tutorial/static_pages.html +++ b/user_guide/tutorial/static_pages.html @@ -28,7 +28,7 @@
    - +

    CodeIgniter User Guide Version 2.1.0

    CodeIgniter User Guide Version 2.1.1

    @@ -199,7 +199,7 @@

    Routing

    User Guide Home   ·   Next Topic:  News section

    -

    CodeIgniter  ·  Copyright © 2006 - 2011  ·  EllisLab, Inc.

    +

    CodeIgniter  ·  Copyright © 2006 - 2012  ·  EllisLab, Inc.

    From 1ef19196e32d081bd5db1a7f87599acea0ecac6e Mon Sep 17 00:00:00 2001 From: Alex Bilbie Date: Thu, 17 May 2012 20:41:12 +0100 Subject: [PATCH 1058/5397] Changed the default controller route to use single quotes instead of double quotes --- application/config/routes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/config/routes.php b/application/config/routes.php index 474bda9691b..0011986158e 100644 --- a/application/config/routes.php +++ b/application/config/routes.php @@ -64,7 +64,7 @@ | */ -$route['default_controller'] = "welcome"; +$route['default_controller'] = 'welcome'; $route['404_override'] = ''; /* End of file routes.php */ From 3020b24545381a72add33d67a488a7e39674ec7e Mon Sep 17 00:00:00 2001 From: Juan Ignacio Borda Date: Fri, 18 May 2012 18:27:50 -0300 Subject: [PATCH 1059/5397] added unbuffered_row() to DB_result.php to avoid memory exhausting when dealing with large results. --- system/database/DB_result.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/system/database/DB_result.php b/system/database/DB_result.php index 196febe2c8d..574cd985883 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -370,6 +370,24 @@ public function previous_row($type = 'object') // -------------------------------------------------------------------- + /** + * Returns an unbuffered row and move pointer to next row + * + * @return object + */ + public function unbuffered_row($type = 'object') + { + if ($type == 'object') + { + return $this->_fetch_object(); + } else + { + return $this->_fetch_assoc(); + } + } + + // -------------------------------------------------------------------- + /** * The following functions are normally overloaded by the identically named * methods in the platform-specific driver -- except when query caching From d981e2915cbd37f866e6f74c3a86a41e8a43e02e Mon Sep 17 00:00:00 2001 From: Juan Ignacio Borda Date: Fri, 18 May 2012 18:29:24 -0300 Subject: [PATCH 1060/5397] Added doc notes for unbuffered_row() function --- user_guide_src/source/database/results.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/user_guide_src/source/database/results.rst b/user_guide_src/source/database/results.rst index 865345762f4..6a0dbf92a3d 100644 --- a/user_guide_src/source/database/results.rst +++ b/user_guide_src/source/database/results.rst @@ -136,6 +136,26 @@ parameter: | **$row = $query->next_row('array')** | **$row = $query->previous_row('array')** +.. note:: all the functions above will load the whole result into memory (prefetching) use unbuffered_row() for processing large result sets. + +unbuffered_row($type) +===== + +This function returns a single result row without prefetching the whole result in memory as row() does. +If your query has more than one row, it returns the current row and moves the internal data pointer ahead. +The result is returned as $type could be 'object' (default) or 'array' that will return an associative array. + + + + $query = $this->db->query("YOUR QUERY"); + + while ($row=$query->unbuffered_rows()) + { + echo $row->title; + echo $row->name; + echo $row->body; + } + *********************** Result Helper Functions *********************** From fbd31c8d98bd7e5eac5c8e8c2f102b05350db93e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 19 May 2012 13:19:43 +0300 Subject: [PATCH 1061/5397] Fix issue #726 --- system/database/drivers/pdo/pdo_driver.php | 16 ++++++++-------- user_guide/changelog.html | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 5de2079bb20..c38b79c5a4d 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -51,23 +51,23 @@ class CI_DB_pdo_driver extends CI_DB { 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}"; } - else if (strpos($this->hostname, 'odbc') !== FALSE) + elseif (strpos($this->hostname, 'odbc') !== FALSE) { $this->_like_escape_str = " {escape '%s'} "; $this->_like_escape_chr = '!'; @@ -77,9 +77,9 @@ function __construct($params) $this->_like_escape_str = " ESCAPE '%s' "; $this->_like_escape_chr = '!'; } - - $this->hostname .= ";dbname=".$this->database; - + + empty($this->database) OR $this->hostname .= ';dbname='.$this->database; + $this->trans_enabled = FALSE; $this->_random_keyword = ' RND('.time().')'; // database specific random keyword @@ -94,7 +94,7 @@ function __construct($params) function db_connect() { $this->options['PDO::ATTR_ERRMODE'] = PDO::ERRMODE_SILENT; - + return new PDO($this->hostname, $this->username, $this->password, $this->options); } diff --git a/user_guide/changelog.html b/user_guide/changelog.html index 55fbceeaf91..4e332a013bf 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -86,6 +86,7 @@

    Bug fixes for 2.1.1

  • Fixed a bug (#538) - Windows paths were ignored when using the Image Manipulation Class to create a new file.
  • Fixed a bug - When database caching was enabled, $this->db->query() checked the cache before binding variables which resulted in cached queries never being found.
  • Fixed a bug - CSRF cookie value was allowed to be any (non-empty) string before being written to the output, making code injection a risk.
  • +
  • Fixed a bug (#726) - PDO put a 'dbname' argument in it's connection string regardless of the database platform in use, which made it impossible to use SQLite.
  • From 67a08ed578350d3a25c77855dc3467320be9e6f6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 19 May 2012 13:35:40 +0300 Subject: [PATCH 1062/5397] Add missing changelog entries from 2.1-stable --- user_guide_src/source/changelog.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 7fc5ee5a02f..6192fecfdbc 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -241,7 +241,9 @@ Bug fixes for 2.1.1 - Fixed a bug - form_open() compared $action against site_url() instead of base_url(). - Fixed a bug - CI_Upload::_file_mime_type() could've failed if mime_content_type() is used for the detection and returns FALSE. - Fixed a bug (#538) - Windows paths were ignored when using the :doc:`Image Manipulation Library ` to create a new file. -- Fixed a bug - When database caching was enabled, $this->db->query() checked the cache before binding variables which resulted in cached queries never being found +- Fixed a bug - When database caching was enabled, $this->db->query() checked the cache before binding variables which resulted in cached queries never being found. +- Fixed a bug - CSRF cookie value was allowed to be any (non-empty) string before being written to the output, making code injection a risk. +- Fixed a bug (#726) - PDO put a 'dbname' argument in it's connection string regardless of the database platform in use, which made it impossible to use SQLite. Version 2.1.0 ============= From fece884ea610485425208c648ba207fa43593e8b Mon Sep 17 00:00:00 2001 From: Juan Ignacio Borda Date: Sat, 19 May 2012 09:33:07 -0300 Subject: [PATCH 1063/5397] Fixed return line and comments --- system/database/DB_result.php | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/system/database/DB_result.php b/system/database/DB_result.php index 574cd985883..25b4fb9110c 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -373,17 +373,12 @@ public function previous_row($type = 'object') /** * Returns an unbuffered row and move pointer to next row * - * @return object + * @return mixed either a result object or array */ public function unbuffered_row($type = 'object') { - if ($type == 'object') - { - return $this->_fetch_object(); - } else - { - return $this->_fetch_assoc(); - } + return ($type !== 'array') ? $this->_fetch_object() : $this->_fetch_assoc(); + } // -------------------------------------------------------------------- From 49cbec5870612c30b6e5bd0582616d519d1ea515 Mon Sep 17 00:00:00 2001 From: Juan Ignacio Borda Date: Sat, 19 May 2012 09:34:53 -0300 Subject: [PATCH 1064/5397] Fixed some spaces --- user_guide_src/source/database/results.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/database/results.rst b/user_guide_src/source/database/results.rst index 6a0dbf92a3d..2158c6df6cb 100644 --- a/user_guide_src/source/database/results.rst +++ b/user_guide_src/source/database/results.rst @@ -149,7 +149,7 @@ The result is returned as $type could be 'object' (default) or 'array' that will $query = $this->db->query("YOUR QUERY"); - while ($row=$query->unbuffered_rows()) + while ($row = $query->unbuffered_rows()) { echo $row->title; echo $row->name; From da7c9e033bd33ba27b549dface68e17177115963 Mon Sep 17 00:00:00 2001 From: Juan Ignacio Borda Date: Sat, 19 May 2012 09:42:40 -0300 Subject: [PATCH 1065/5397] Fixed typo --- user_guide_src/source/database/results.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/database/results.rst b/user_guide_src/source/database/results.rst index 2158c6df6cb..ac4fc3733bd 100644 --- a/user_guide_src/source/database/results.rst +++ b/user_guide_src/source/database/results.rst @@ -149,7 +149,7 @@ The result is returned as $type could be 'object' (default) or 'array' that will $query = $this->db->query("YOUR QUERY"); - while ($row = $query->unbuffered_rows()) + while ($row = $query->unbuffered_row()) { echo $row->title; echo $row->name; From 9fa8d404790833a098a8bbd855f1452897d6ff88 Mon Sep 17 00:00:00 2001 From: Rogerio Prado de Jesus Date: Sat, 19 May 2012 13:38:26 -0300 Subject: [PATCH 1066/5397] Fix a issue with affect_rows in CI_DB_pdo_driver::_execute() In case of SELECT queries PDOStatement::rowCount doesn't work as expected. This commit makes affect_rows be initialized properly. Signed-off-by: Rogerio Prado de Jesus --- system/database/drivers/pdo/pdo_driver.php | 13 +++++++++++-- user_guide/changelog.html | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index c38b79c5a4d..95201684853 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -189,11 +189,20 @@ function _version() function _execute($sql) { $sql = $this->_prep_query($sql); - $result_id = $this->conn_id->query($sql); + $result_id = $this->conn_id->prepare($sql); + $result_id->execute(); if (is_object($result_id)) { - $this->affect_rows = $result_id->rowCount(); + if (is_numeric(stripos($sql, 'SELECT'))) + { + $this->affect_rows = count($result_id->fetchAll()); + $result_id->execute(); + } + else + { + $this->affect_rows = $result_id->rowCount(); + } } else { diff --git a/user_guide/changelog.html b/user_guide/changelog.html index 4e332a013bf..e1a87d96351 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -87,6 +87,7 @@

    Bug fixes for 2.1.1

  • Fixed a bug - When database caching was enabled, $this->db->query() checked the cache before binding variables which resulted in cached queries never being found.
  • Fixed a bug - CSRF cookie value was allowed to be any (non-empty) string before being written to the output, making code injection a risk.
  • Fixed a bug (#726) - PDO put a 'dbname' argument in it's connection string regardless of the database platform in use, which made it impossible to use SQLite.
  • +
  • Fixed a bug - CI_DB_pdo_driver::affect_row was not being initialized properly with SELECT queries, cause it was relying on PDOStatement::rowCount().
  • From 27738491fc11d0b9ce5670b2f6a7957fc421ee4b Mon Sep 17 00:00:00 2001 From: Rogerio Prado de Jesus Date: Sat, 19 May 2012 13:45:44 -0300 Subject: [PATCH 1067/5397] Fix a issue with CI_DB_pdo_result::num_rows() In case of SELECT queries PDOStatement::rowCount doesn't work as expected. This commit makes it returns the expected value. --- system/database/drivers/pdo/pdo_result.php | 13 ++++++++++++- user_guide/changelog.html | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/system/database/drivers/pdo/pdo_result.php b/system/database/drivers/pdo/pdo_result.php index 7f3058ff093..c05fbc908a1 100644 --- a/system/database/drivers/pdo/pdo_result.php +++ b/system/database/drivers/pdo/pdo_result.php @@ -34,7 +34,18 @@ class CI_DB_pdo_result extends CI_DB_result { */ function num_rows() { - return $this->result_id->rowCount(); + if (is_numeric(stripos($this->result_id->queryString, 'SELECT'))) + { + $dbh = $this->conn_id; + $query = $dbh->query($this->result_id->queryString); + $result = $query->fetchAll(); + unset($dbh, $query); + return count($result); + } + else + { + return $this->result_id->rowCount(); + } } // -------------------------------------------------------------------- diff --git a/user_guide/changelog.html b/user_guide/changelog.html index e1a87d96351..ca1a55bac79 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -88,6 +88,7 @@

    Bug fixes for 2.1.1

  • Fixed a bug - CSRF cookie value was allowed to be any (non-empty) string before being written to the output, making code injection a risk.
  • Fixed a bug (#726) - PDO put a 'dbname' argument in it's connection string regardless of the database platform in use, which made it impossible to use SQLite.
  • Fixed a bug - CI_DB_pdo_driver::affect_row was not being initialized properly with SELECT queries, cause it was relying on PDOStatement::rowCount().
  • +
  • Fixed a bug - CI_DB_pdo_result::num_rows() was not returning properly value with SELECT queries, cause it was relying on PDOStatement::rowCount().
  • From f1aff707128865741a70d732283c0702183c52b3 Mon Sep 17 00:00:00 2001 From: Thanasis Polychronakis Date: Sun, 20 May 2012 18:44:21 +0300 Subject: [PATCH 1068/5397] Indended code to meet CI standards --- system/core/Common.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 01b0d86731e..eb080aa2b20 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -233,7 +233,8 @@ function &get_config($replace = array()) $file_path = APPPATH.'config/config.php'; $found = false; - if (file_exists($file_path)) { + if (file_exists($file_path)) + { $found = true; require($file_path); } @@ -242,7 +243,10 @@ function &get_config($replace = array()) if (defined(ENVIRONMENT) && file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) { require($file_path); - } else if (!$found) { + } + else if (!$found) + { + set_status_header(503); exit('The configuration file does not exist.'); } From 441dfc3a17f48c741a930cfc8a6d667bf0c352ba Mon Sep 17 00:00:00 2001 From: Juan Ignacio Borda Date: Sun, 20 May 2012 21:46:32 -0300 Subject: [PATCH 1069/5397] added a comment for unbuffered_row --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 7fc5ee5a02f..defac54a247 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -102,6 +102,7 @@ Release Date: Not Released - Added PDO support for create_database(), drop_database and drop_table() in :doc:`Database Forge `. - Added MSSQL, SQLSRV support for optimize_table() in :doc:`Database Utility `. - Improved CUBRID support for list_databases() in :doc:`Database Utility ` (until now only the currently used database was returned). + - Added unbuffered_row() function for getting a row without prefetching whole result (consume less memory) - Libraries From ccbd827076b83a7ff903fb8264192d2beea1260e Mon Sep 17 00:00:00 2001 From: Thanasis Polychronakis Date: Mon, 21 May 2012 14:38:22 +0300 Subject: [PATCH 1070/5397] Edit to meet CI coding standards --- system/core/Common.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index eb080aa2b20..15082a101d1 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -232,10 +232,10 @@ function &get_config($replace = array()) } $file_path = APPPATH.'config/config.php'; - $found = false; + $found = FALSE; if (file_exists($file_path)) { - $found = true; + $found = TRUE; require($file_path); } @@ -244,7 +244,7 @@ function &get_config($replace = array()) { require($file_path); } - else if (!$found) + elseif ( ! $found) { set_status_header(503); exit('The configuration file does not exist.'); From 36237d8305260282b46f52f9fec91b5b7176088f Mon Sep 17 00:00:00 2001 From: Root Date: Mon, 21 May 2012 18:30:00 -0400 Subject: [PATCH 1071/5397] Move closing of database connection to CI_DB_driver->__destruct - #1376 --- system/core/CodeIgniter.php | 10 ---------- system/database/DB_driver.php | 7 +++++++ 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 00db6e13a15..585bb7b3143 100755 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -393,15 +393,5 @@ function &get_instance() */ $EXT->call_hook('post_system'); -/* - * ------------------------------------------------------ - * Close the DB connection if one exists - * ------------------------------------------------------ - */ - if (class_exists('CI_DB') && isset($CI->db) && ! $CI->db->pconnect) - { - $CI->db->close(); - } - /* End of file CodeIgniter.php */ /* Location: ./system/core/CodeIgniter.php */ \ No newline at end of file diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index ef77b594e88..c757277ced7 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -92,6 +92,13 @@ public function __construct($params) // -------------------------------------------------------------------- + public function __destruct() + { + $this->close(); + } + + // -------------------------------------------------------------------- + /** * Initialize Database Settings * From 4337771961de19f7cffb444aa2bd2866e9dad18a Mon Sep 17 00:00:00 2001 From: Brent Ashley Date: Tue, 22 May 2012 12:45:10 -0300 Subject: [PATCH 1072/5397] Add step to move existing core extensions to new folder --- user_guide_src/source/installation/upgrade_200.rst | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/installation/upgrade_200.rst b/user_guide_src/source/installation/upgrade_200.rst index b39f4fd2341..74b7443d846 100644 --- a/user_guide_src/source/installation/upgrade_200.rst +++ b/user_guide_src/source/installation/upgrade_200.rst @@ -87,7 +87,14 @@ All native CodeIgniter classes now use the PHP 5 \__construct() convention. Please update extended libraries to call parent::\__construct(). -Step 8: Update your user guide +Step 8: Move any core extensions to application/core +==================================================== + +Any extensions to core classes (e.g. MY_Controller.php) in your +application/liblraries folder must be moved to the new +application/core folder. + +Step 9: Update your user guide ============================== Please replace your local copy of the user guide with the new version, From 0b427951859e393b5c6b31699fe0f1c1ae89b403 Mon Sep 17 00:00:00 2001 From: Brent Ashley Date: Tue, 22 May 2012 16:24:04 -0300 Subject: [PATCH 1073/5397] fix typo in step 8 --- user_guide_src/source/installation/upgrade_200.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/installation/upgrade_200.rst b/user_guide_src/source/installation/upgrade_200.rst index 74b7443d846..29f44bd9edc 100644 --- a/user_guide_src/source/installation/upgrade_200.rst +++ b/user_guide_src/source/installation/upgrade_200.rst @@ -91,7 +91,7 @@ Step 8: Move any core extensions to application/core ==================================================== Any extensions to core classes (e.g. MY_Controller.php) in your -application/liblraries folder must be moved to the new +application/libraries folder must be moved to the new application/core folder. Step 9: Update your user guide From ab396b4a56d3eaa91c559ccc4df2817c53897aef Mon Sep 17 00:00:00 2001 From: Gints Murans Date: Wed, 23 May 2012 00:21:39 +0300 Subject: [PATCH 1074/5397] Moved destruct to the end of file --- system/database/DB_driver.php | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index c757277ced7..44c864e6472 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -90,13 +90,6 @@ public function __construct($params) log_message('debug', 'Database Driver Class Initialized'); } - // -------------------------------------------------------------------- - - public function __destruct() - { - $this->close(); - } - // -------------------------------------------------------------------- /** @@ -1397,6 +1390,23 @@ protected function _reset_select() { } + // -------------------------------------------------------------------- + + /** + * Destructor + * + * Closes the database connection, if needed. + * + * @return void + */ + public function __destruct() + { + if ($this->conn_id && ! $this->pconnect) + { + $this->close(); + } + } + } /* End of file DB_driver.php */ From 89f77eedf9118dfccd52a7bc3e559d6bac5aa07c Mon Sep 17 00:00:00 2001 From: Gints Murans Date: Wed, 23 May 2012 00:23:50 +0300 Subject: [PATCH 1075/5397] Removed a space after comment line --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 44c864e6472..a955f45d2a0 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -90,7 +90,7 @@ public function __construct($params) log_message('debug', 'Database Driver Class Initialized'); } - // -------------------------------------------------------------------- + // -------------------------------------------------------------------- /** * Initialize Database Settings From 79922c0d963de9728315db02deaf4d2516c94d5b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 23 May 2012 12:27:17 +0300 Subject: [PATCH 1076/5397] Removed the parameter use in database drivers' _close() and added a default _close() method in CI_DB_driver + some changelog fixes --- system/database/DB_driver.php | 20 +++++-- system/database/DB_result.php | 3 +- .../database/drivers/cubrid/cubrid_driver.php | 9 ++-- .../drivers/interbase/interbase_driver.php | 5 +- .../database/drivers/mssql/mssql_driver.php | 7 ++- .../database/drivers/mysql/mysql_driver.php | 7 ++- .../database/drivers/mysqli/mysqli_driver.php | 6 +-- system/database/drivers/oci8/oci8_driver.php | 7 ++- system/database/drivers/odbc/odbc_driver.php | 7 ++- system/database/drivers/pdo/pdo_driver.php | 15 +----- .../drivers/postgre/postgre_driver.php | 5 +- .../database/drivers/sqlite/sqlite_driver.php | 7 ++- .../drivers/sqlite3/sqlite3_driver.php | 3 +- .../database/drivers/sqlsrv/sqlsrv_driver.php | 7 ++- user_guide_src/source/changelog.rst | 53 ++++++++----------- 15 files changed, 71 insertions(+), 90 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index a955f45d2a0..a0812d4c765 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1152,13 +1152,27 @@ public function close() { if ($this->conn_id) { - $this->_close($this->conn_id); + $this->_close(); $this->conn_id = FALSE; } } // -------------------------------------------------------------------- + /** + * Close DB Connection + * + * This method would be overriden by most of the drivers. + * + * @return void + */ + protected function _close() + { + $this->conn_id = FALSE; + } + + // -------------------------------------------------------------------- + /** * Display an error message * @@ -1401,7 +1415,7 @@ protected function _reset_select() */ public function __destruct() { - if ($this->conn_id && ! $this->pconnect) + if ( ! $this->pconnect) { $this->close(); } @@ -1410,4 +1424,4 @@ public function __destruct() } /* End of file DB_driver.php */ -/* Location: ./system/database/DB_driver.php */ +/* Location: ./system/database/DB_driver.php */ \ No newline at end of file diff --git a/system/database/DB_result.php b/system/database/DB_result.php index 25b4fb9110c..690734b0880 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -378,11 +378,10 @@ public function previous_row($type = 'object') public function unbuffered_row($type = 'object') { return ($type !== 'array') ? $this->_fetch_object() : $this->_fetch_assoc(); - } // -------------------------------------------------------------------- - + /** * The following functions are normally overloaded by the identically named * methods in the platform-specific driver -- except when query caching diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index 1373faa8847..944df99b51e 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -485,7 +485,7 @@ protected function _update_batch($table, $values, $index, $where = NULL) } // -------------------------------------------------------------------- - + /** * Limit string * @@ -506,15 +506,14 @@ protected function _limit($sql, $limit, $offset) /** * Close DB Connection * - * @param resource * @return void */ - protected function _close($conn_id) + protected function _close() { - @cubrid_close($conn_id); + @cubrid_close($this->conn_id); } } /* End of file cubrid_driver.php */ -/* Location: ./system/database/drivers/cubrid/cubrid_driver.php */ +/* Location: ./system/database/drivers/cubrid/cubrid_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/interbase/interbase_driver.php b/system/database/drivers/interbase/interbase_driver.php index 1b18de80329..c457f6340d7 100644 --- a/system/database/drivers/interbase/interbase_driver.php +++ b/system/database/drivers/interbase/interbase_driver.php @@ -472,12 +472,11 @@ protected function _limit($sql, $limit, $offset) /** * Close DB Connection * - * @param resource * @return void */ - protected function _close($conn_id) + protected function _close() { - @ibase_close($conn_id); + @ibase_close($this->conn_id); } } diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index f60ec8168d1..914de499fb2 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -523,15 +523,14 @@ protected function _limit($sql, $limit, $offset) /** * Close DB Connection * - * @param resource * @return void */ - protected function _close($conn_id) + protected function _close() { - @mssql_close($conn_id); + @mssql_close($this->conn_id); } } /* End of file mssql_driver.php */ -/* Location: ./system/database/drivers/mssql/mssql_driver.php */ +/* Location: ./system/database/drivers/mssql/mssql_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 32c51865d57..161f99541b4 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -520,15 +520,14 @@ protected function _limit($sql, $limit, $offset) /** * Close DB Connection * - * @param resource * @return void */ - protected function _close($conn_id) + protected function _close() { - @mysql_close($conn_id); + @mysql_close($this->conn_id); } } /* End of file mysql_driver.php */ -/* Location: ./system/database/drivers/mysql/mysql_driver.php */ +/* Location: ./system/database/drivers/mysql/mysql_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index e2684e4f2b4..9261883f5a1 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -523,16 +523,14 @@ protected function _limit($sql, $limit, $offset) /** * Close DB Connection * - * @param object * @return void */ - protected function _close($conn_id) + protected function _close() { $this->conn_id->close(); - $this->conn_id = FALSE; } } /* End of file mysqli_driver.php */ -/* Location: ./system/database/drivers/mysqli/mysqli_driver.php */ +/* Location: ./system/database/drivers/mysqli/mysqli_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 33a89df9486..e2fa5134907 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -671,15 +671,14 @@ protected function _limit($sql, $limit, $offset) /** * Close DB Connection * - * @param resource * @return void */ - protected function _close($conn_id) + protected function _close() { - @oci_close($conn_id); + @oci_close($this->conn_id); } } /* End of file oci8_driver.php */ -/* Location: ./system/database/drivers/oci8/oci8_driver.php */ +/* Location: ./system/database/drivers/oci8/oci8_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index e36f2d23345..e3172117a47 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -402,15 +402,14 @@ protected function _limit($sql, $limit, $offset) /** * Close DB Connection * - * @param resource * @return void */ - protected function _close($conn_id) + protected function _close() { - @odbc_close($conn_id); + @odbc_close($this->conn_id); } } /* End of file odbc_driver.php */ -/* Location: ./system/database/drivers/odbc/odbc_driver.php */ +/* Location: ./system/database/drivers/odbc/odbc_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 89e69676d41..e38c1145cb9 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -667,20 +667,7 @@ protected function _limit($sql, $limit, $offset) } } - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @param object - * @return void - */ - protected function _close($conn_id) - { - $this->conn_id = NULL; - } - } /* End of file pdo_driver.php */ -/* Location: ./system/database/drivers/pdo/pdo_driver.php */ +/* Location: ./system/database/drivers/pdo/pdo_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 17bd37b3825..0ddfd0abe6e 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -653,12 +653,11 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) /** * Close DB Connection * - * @param resource * @return void */ - protected function _close($conn_id) + protected function _close() { - @pg_close($conn_id); + @pg_close($this->conn_id); } } diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index 551704f83fb..d710b945df9 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -450,15 +450,14 @@ protected function _limit($sql, $limit, $offset) /** * Close DB Connection * - * @param resource * @return void */ - protected function _close($conn_id) + protected function _close() { - @sqlite_close($conn_id); + @sqlite_close($this->conn_id); } } /* End of file sqlite_driver.php */ -/* Location: ./system/database/drivers/sqlite/sqlite_driver.php */ +/* Location: ./system/database/drivers/sqlite/sqlite_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index d22f6a4429b..ad2848ed8ca 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -417,10 +417,9 @@ protected function _limit($sql, $limit, $offset) /** * Close DB Connection * - * @param object (ignored) * @return void */ - protected function _close($conn_id) + protected function _close() { $this->conn_id->close(); } diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index 8cc500f556a..3e9fa7b1afc 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -510,15 +510,14 @@ protected function _limit($sql, $limit, $offset) /** * Close DB Connection * - * @param resource * @return void */ - protected function _close($conn_id) + protected function _close() { - @sqlsrv_close($conn_id); + @sqlsrv_close($this->conn_id); } } /* End of file sqlsrv_driver.php */ -/* Location: ./system/database/drivers/sqlsrv/sqlsrv_driver.php */ +/* Location: ./system/database/drivers/sqlsrv/sqlsrv_driver.php */ \ No newline at end of file diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 45e6ebc07ba..a65a658ed33 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -9,8 +9,7 @@ Release Date: Not Released - License - - CodeIgniter has been relicensed with the Open Software License (3.0), - eliminating its old proprietary licensing. + - CodeIgniter has been relicensed with the Open Software License (3.0), eliminating its old proprietary licensing. - All system files are licensed with OSL 3.0. - Config, error, and sample files shipped in the application folder are @@ -43,7 +42,7 @@ Release Date: Not Released - url_title() will now trim extra dashes from beginning and end. - Added XHTML Basic 1.1 doctype to :doc:`HTML Helper `. - - Changed humanize to include a second param for the separator. + - Changed humanize() to include a second param for the separator. - Refactored ``plural()`` and ``singular()`` to avoid double pluralization and support more words. - Added an optional third parameter to ``force_download()`` that enables/disables sending the actual file MIME type in the Content-Type header (disabled by default). - Added an optional third parameter to ``timespan()`` that constrains the number of time units displayed. @@ -56,21 +55,17 @@ Release Date: Not Released - Database - - Renamed the Active Record class to Query Builder to remove confusion with - the Active Record design pattern - - Added new :doc:`Query Builder ` methods that return + - Renamed the Active Record class to Query Builder to remove confusion with the Active Record design pattern. - Added the ability to insert objects with insert_batch() in :doc:`Query Builder `. - - Added new :doc:`Query Builder ` methods that return - the SQL string of queries without executing them: get_compiled_select(), - get_compiled_insert(), get_compiled_update(), get_compiled_delete(). - - Adding $escape parameter to the order_by function, this enables ordering by custom fields. + - Added new :doc:`Query Builder ` methods that return the SQL string of queries without executing them: get_compiled_select(), get_compiled_insert(), get_compiled_update(), get_compiled_delete(). + - Adding $escape parameter to the order_by() method, this enables ordering by custom fields. - Improved support for the MySQLi driver, including: - OOP style of the PHP extension is now used, instead of the procedural aliases. - Server version checking is now done via ``mysqli::$server_info`` instead of running an SQL query. - Added persistent connections support for PHP >= 5.3. - Added 'dsn' configuration setting for drivers that support DSN strings (PDO, PostgreSQL, Oracle, ODBC, CUBRID). - Improved PDO database support. - - Added Interbase/Firebird database support via the "interbase" driver + - Added Interbase/Firebird database support via the "interbase" driver. - Added an optional database name parameter to db_select(). - Replaced the _error_message() and _error_number() methods with error(), that returns an array containing the last database error code and message. - Improved version() implementation so that drivers that have a native function to get the version number don't have to be defined in the core DB_driver class. @@ -102,7 +97,7 @@ Release Date: Not Released - Added PDO support for create_database(), drop_database and drop_table() in :doc:`Database Forge `. - Added MSSQL, SQLSRV support for optimize_table() in :doc:`Database Utility `. - Improved CUBRID support for list_databases() in :doc:`Database Utility ` (until now only the currently used database was returned). - - Added unbuffered_row() function for getting a row without prefetching whole result (consume less memory) + - Added unbuffered_row() method for getting a row without prefetching whole result (consume less memory). - Libraries @@ -110,17 +105,15 @@ Release Date: Not Released - CI_Loader::_ci_autoloader() is now a protected method. - Added custom filename to Email::attach() as $this->email->attach($filename, $disposition, $newname). - Added possibility to send attachment as buffer string in Email::attach() as $this->email->attach($buffer, $disposition, $newname, $mime). - - Cart library changes include: + - :doc:`Cart library ` changes include: - It now auto-increments quantity's instead of just resetting it, this is the default behaviour of large e-commerce sites. - - Product Name strictness can be disabled via the Cart Library by switching "$product_name_safe" - - Added function remove() to remove a cart item, updating with quantity of 0 seemed like a hack but has remained to retain compatability + - Product Name strictness can be disabled via the Cart Library by switching "$product_name_safe". + - Added function remove() to remove a cart item, updating with quantity of 0 seemed like a hack but has remained to retain compatability. - :doc:`Image Manipulation library ` changes include: - The initialize() method now only sets existing class properties. - Added support for 3-length hex color values for wm_font_color and wm_shadow_color properties, as well as validation for them. - - Class properties wm_font_color, wm_shadow_color and wm_use_drop_shadow are now protected, to avoid breaking the text_watermark() method - if they are set manually after initialization. + - Class properties wm_font_color, wm_shadow_color and wm_use_drop_shadow are now protected, to avoid breaking the text_watermark() method if they are set manually after initialization. - If property maintain_ratio is set to TRUE, image_reproportion() now doesn't need both width and height to be specified. - - Minor speed optimizations and method & property visibility declarations in the Calendar Library. - Removed SHA1 function in the :doc:`Encryption Library `. - Added $config['csrf_regeneration'] to the CSRF protection in the :doc:`Security library `, which makes token regeneration optional. - :doc:`Form Validation library ` changes include: @@ -153,26 +146,26 @@ Release Date: Not Released Bug fixes for 3.0 ------------------ -- Unlink raised an error if cache file did not exist when you try to delete it. +- Fixed a bug where ``unlink()`` raised an error if cache file did not exist when you try to delete it. - Fixed a bug (#181) where a mis-spelling was in the form validation language file. - Fixed a bug (#159, #163) that mishandled Active Record nested transactions because _trans_depth was not getting incremented. - Fixed a bug (#737, #75) where pagination anchor class was not set properly when using initialize method. - Fixed a bug (#419) - auto_link() now recognizes URLs that come after a word boundary. - Fixed a bug (#724) - is_unique in form validation now checks that you are connected to a database. -- Fixed a bug (#647) - _get_mod_time() in Zip library no longer generates stat failed errors -- Fixed a bug (#608) - Fixes an issue with the Image_lib class not clearing properties completely -- Fixed bugs (#157 and #174) - the Image_lib clear() function now resets all variables to their default values. +- Fixed a bug (#647) - _get_mod_time() in Zip library no longer generates stat failed errors. +- Fixed a bug (#608) - Fixes an issue with the Image_lib class not clearing properties completely. +- Fixed a bug (#157, #174) - the Image_lib clear() function now resets all variables to their default values. - Fixed a bug where using $this->dbforge->create_table() with PostgreSQL database could lead to fetching whole table. - Fixed a bug (#795) - Fixed form method and accept-charset when passing an empty array. -- Fixed a bug (#797) - timespan was using incorrect seconds for year and month. +- Fixed a bug (#797) - timespan() was using incorrect seconds for year and month. - Fixed a bug in CI_Cart::contents() where if called without a TRUE (or equal) parameter, it would fail due to a typo. -- Fixed a bug (#696) - make oci_execute calls inside num_rows non-committing, since they are only there to reset which row is next in line for oci_fetch calls and thus don't need to be committed. -- Fixed a bug (#406) - sqlsrv DB driver not reuturning resource on db_pconnect(). +- Fixed a bug (#696) - make oci_execute() calls inside num_rows() non-committing, since they are only there to reset which row is next in line for oci_fetch calls and thus don't need to be committed. +- Fixed a bug (#406) - sqlsrv DB driver not reuturning resource on ``db_pconnect()``. - Fixed a bug in CI_Image_lib::gd_loaded() where it was possible for the script execution to end or a PHP E_WARNING message to be emitted. -- In Pagination library, when use_page_numbers=TRUE previous link and page 1 link do not have the same url +- Fixed a bug in the :doc:`Pagination library ` where when use_page_numbers=TRUE previous link and page 1 link did not have the same url. - Fixed a bug (#561) - Errors in :doc:`XML-RPC Library ` were not properly escaped. - Fixed a bug (#904) - ``CI_Loader::initialize()`` caused a PHP Fatal error to be triggered if error level E_STRICT is used. -- Fixed a hosting edge case where an empty $_SERVER['HTTPS'] variable would evaluate to 'on' +- Fixed a hosting edge case where an empty $_SERVER['HTTPS'] variable would evaluate to 'on'. - Fixed a bug (#154) - ``CI_Session::sess_update()`` caused the session to be destroyed on pages where multiple AJAX requests were executed at once. - Fixed a possible bug in ``CI_Input::is_ajax_request()`` where some clients might not send the X-Requested-With HTTP header value exactly as 'XmlHttpRequest'. - Fixed a bug (#1039) - MySQL's _backup() method failed due to a table name not being escaped. @@ -183,7 +176,7 @@ Bug fixes for 3.0 - Fixed a bug (#129) - ODBC's num_rows() returned -1 in some cases, due to not all subdrivers supporting the odbc_num_rows() function. - Fixed a bug (#153) - E_NOTICE being generated by getimagesize() in the :doc:`File Uploading Library `. - Fixed a bug (#611) - SQLSRV's error handling methods used to issue warnings when there's no actual error. -- Fixed a bug (#1036) - is_write_type() method in the :doc:`Database Library ` didn't return TRUE for RENAME and OPTIMIZE queries. +- Fixed a bug (#1036) - is_write_type() method in the :doc:`Database Library ` didn't return TRUE for RENAME queries. - Fixed a bug in PDO's _version() method where it used to return the client version as opposed to the server one. - Fixed a bug in PDO's insert_id() method where it could've failed if it's used with Postgre versions prior to 8.1. - Fixed a bug in CUBRID's affected_rows() method where a connection resource was passed to cubrid_affected_rows() instead of a result. @@ -207,7 +200,7 @@ Bug fixes for 3.0 - Fixed a bug (#23, #1238) - delete_all() in the `Database Caching Library ` used to delete .htaccess and index.html files, which is a potential security risk. - Fixed a bug in :doc:`Trackback Library ` method validate_url() where it didn't actually do anything, due to input not being passed by reference. - Fixed a bug (#11, #183, #863) - CI_Form_validation::_execute() silently continued to the next rule, if a rule method/function is not found. -- Fixed a bug (#122) Where routed uri string was being reported incorrectly in sub-directories +- Fixed a bug (#122) Where routed uri string was being reported incorrectly in sub-directories. - Fixed a bug (#1242) - read_dir() in the :doc:`Zip Library ` wasn't compatible with Windows. - Fixed a bug (#306) - ODBC driver didn't have an _insert_batch() method, which resulted in fatal error being triggered when insert_batch() is used with it. - Fixed a bug in MSSQL and SQLSrv's _truncate() where the TABLE keyword was missing. @@ -217,7 +210,7 @@ Bug fixes for 3.0 - Fixed a bug in SQLSRV's delete() method where like() and limit() conditions were ignored. - Fixed a bug (#1265) - Database connections were always closed, regardless of the 'pconnect' option value. - Fixed a bug (#128) - :doc:`Language Library ` did not correctly keep track of loaded language files. -- Fixed a bug (#1242) - Added Windows path compatibility to function read_dir of ZIP library +- Fixed a bug (#1242) - Added Windows path compatibility to function read_dir of ZIP library. - Fixed a bug (#1314) - sess_destroy() did not destroy userdata. - Fixed a bug (#1349) - get_extension() in the `File Uploading Library ` returned the original filename when it didn't have an actual extension. From f46e726cfb726da2ec2095011ffe8625b6f9c816 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 23 May 2012 13:16:00 +0300 Subject: [PATCH 1077/5397] Fix a typo in the changelog --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a65a658ed33..2b15c3f559c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -160,7 +160,7 @@ Bug fixes for 3.0 - Fixed a bug (#797) - timespan() was using incorrect seconds for year and month. - Fixed a bug in CI_Cart::contents() where if called without a TRUE (or equal) parameter, it would fail due to a typo. - Fixed a bug (#696) - make oci_execute() calls inside num_rows() non-committing, since they are only there to reset which row is next in line for oci_fetch calls and thus don't need to be committed. -- Fixed a bug (#406) - sqlsrv DB driver not reuturning resource on ``db_pconnect()``. +- Fixed a bug (#406) - sqlsrv DB driver not returning resource on ``db_pconnect()``. - Fixed a bug in CI_Image_lib::gd_loaded() where it was possible for the script execution to end or a PHP E_WARNING message to be emitted. - Fixed a bug in the :doc:`Pagination library ` where when use_page_numbers=TRUE previous link and page 1 link did not have the same url. - Fixed a bug (#561) - Errors in :doc:`XML-RPC Library ` were not properly escaped. From 74b648c2da3ee5d92920cea2355ccf36d5e0519e Mon Sep 17 00:00:00 2001 From: Nithin Date: Sun, 21 Aug 2011 01:23:47 -0300 Subject: [PATCH 1078/5397] Added ability to _like paramater side to use 'none', in case one wants to query like instead of where without case being sensitive --- system/database/DB_active_rec.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php index 7bab729f500..841ede28e22 100644 --- a/system/database/DB_active_rec.php +++ b/system/database/DB_active_rec.php @@ -660,8 +660,12 @@ protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $n $prefix = (count($this->ar_like) == 0) ? '' : $type; $v = $this->escape_like_str($v); - - if ($side == 'before') + + if ($side == 'none') + { + $like_statement = $prefix." $k $not LIKE '{$v}'"; + } + elseif ($side == 'before') { $like_statement = $prefix." $k $not LIKE '%{$v}'"; } From e65f4893c9b3e7c2b34e0fef7c7de04112329063 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Wed, 23 May 2012 19:27:54 +0200 Subject: [PATCH 1079/5397] Removed the starting slash from uri_string() documentation. --- user_guide/libraries/uri.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide/libraries/uri.html b/user_guide/libraries/uri.html index f04bb9f10e0..663fca5bce2 100644 --- a/user_guide/libraries/uri.html +++ b/user_guide/libraries/uri.html @@ -191,7 +191,7 @@

    $this->uri->uri_string()

    The function would return this:

    -/news/local/345 +news/local/345

    $this->uri->ruri_string()

    From 55a6ddb0c7bab1149bb1ddfa3a1aff46612c91d4 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Wed, 23 May 2012 18:37:24 +0100 Subject: [PATCH 1080/5397] Input, Session and Cookie get's will return NULL. Read more about this change here: http://codeigniter.com/forums/viewthread/215833 --- system/core/Input.php | 4 ++-- system/core/URI.php | 18 +++++++++--------- system/libraries/Session.php | 6 +++--- tests/codeigniter/core/Input_test.php | 18 ++++++++++-------- user_guide_src/source/libraries/input.rst | 17 +++++------------ user_guide_src/source/libraries/uri.rst | 2 +- 6 files changed, 30 insertions(+), 35 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index e916ac66d4d..97be9e69002 100755 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -135,7 +135,7 @@ protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) { if ( ! isset($array[$index])) { - return FALSE; + return NULL; } if ($xss_clean === TRUE) @@ -659,7 +659,7 @@ public function get_request_header($index, $xss_clean = FALSE) if ( ! isset($this->headers[$index])) { - return FALSE; + return NULL; } return ($xss_clean === TRUE) diff --git a/system/core/URI.php b/system/core/URI.php index e66cb6dc59b..a9432e05d13 100755 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -358,10 +358,10 @@ public function _reindex_segments() * This function returns the URI segment based on the number provided. * * @param int - * @param bool + * @param mixed * @return string */ - public function segment($n, $no_result = FALSE) + public function segment($n, $no_result = NULL) { return isset($this->segments[$n]) ? $this->segments[$n] : $no_result; } @@ -376,10 +376,10 @@ public function segment($n, $no_result = FALSE) * same result as $this->segment() * * @param int - * @param bool + * @param mixed * @return string */ - public function rsegment($n, $no_result = FALSE) + public function rsegment($n, $no_result = NULL) { return isset($this->rsegments[$n]) ? $this->rsegments[$n] : $no_result; } @@ -462,7 +462,7 @@ protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') { return (count($default) === 0) ? array() - : array_fill_keys($default, FALSE); + : array_fill_keys($default, NULL); } $segments = array_slice($this->$segment_array(), ($n - 1)); @@ -477,7 +477,7 @@ protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') } else { - $retval[$seg] = FALSE; + $retval[$seg] = NULL; $lastval = $seg; } @@ -490,7 +490,7 @@ protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') { if ( ! array_key_exists($val, $retval)) { - $retval[$val] = FALSE; + $retval[$val] = NULL; } } } @@ -511,7 +511,7 @@ protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') public function assoc_to_uri($array) { $temp = array(); - foreach ( (array) $array as $key => $val) + foreach ((array) $array as $key => $val) { $temp[] = $key; $temp[] = $val; @@ -644,7 +644,7 @@ public function uri_string() */ public function ruri_string() { - return '/'.implode('/', $this->rsegment_array()); + return implode('/', $this->rsegment_array()); } } diff --git a/system/libraries/Session.php b/system/libraries/Session.php index 783109a60e0..4d6aa0ce882 100644 --- a/system/libraries/Session.php +++ b/system/libraries/Session.php @@ -276,7 +276,7 @@ public function sess_read() $session = $this->CI->input->cookie($this->sess_cookie_name); // No cookie? Goodbye cruel world!... - if ($session === FALSE) + if ($session === NULL) { log_message('debug', 'A session cookie was not found.'); return FALSE; @@ -586,7 +586,7 @@ public function sess_destroy() */ public function userdata($item) { - return isset($this->userdata[$item]) ? $this->userdata[$item] : FALSE; + return isset($this->userdata[$item]) ? $this->userdata[$item] : NULL; } // -------------------------------------------------------------------- @@ -715,7 +715,7 @@ public function keep_flashdata($key) { // 'old' flashdata gets removed. Here we mark all // flashdata as 'new' to preserve it from _flashdata_sweep() - // Note the function will return FALSE if the $key + // Note the function will return NULL if the $key // provided cannot be found $value = $this->userdata($this->flashdata_key.':old:'.$key); diff --git a/tests/codeigniter/core/Input_test.php b/tests/codeigniter/core/Input_test.php index fd0576e38c0..a066d9960ac 100644 --- a/tests/codeigniter/core/Input_test.php +++ b/tests/codeigniter/core/Input_test.php @@ -28,11 +28,13 @@ public function test_get_not_exists() $this->assertTrue( ! $this->input->get()); $this->assertTrue( ! $this->input->get('foo')); - $this->assertTrue($this->input->get() == FALSE); - $this->assertTrue($this->input->get('foo') == FALSE); + // Test we're getting empty results + $this->assertTrue($this->input->get() == NULL); + $this->assertTrue($this->input->get('foo') == NULL); - $this->assertTrue($this->input->get() === FALSE); - $this->assertTrue($this->input->get('foo') === FALSE); + // Test new 3.0 behaviour for non existant results (used to be FALSE) + $this->assertTrue($this->input->get() === NULL); + $this->assertTrue($this->input->get('foo') === NULL); } // -------------------------------------------------------------------- @@ -68,11 +70,11 @@ public function test_post_not_exists() $this->assertTrue( ! $this->input->post()); $this->assertTrue( ! $this->input->post('foo')); - $this->assertTrue($this->input->post() == FALSE); - $this->assertTrue($this->input->post('foo') == FALSE); + $this->assertTrue($this->input->post() == NULL); + $this->assertTrue($this->input->post('foo') == NULL); - $this->assertTrue($this->input->post() === FALSE); - $this->assertTrue($this->input->post('foo') === FALSE); + $this->assertTrue($this->input->post() === NULL); + $this->assertTrue($this->input->post('foo') === NULL); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/libraries/input.rst b/user_guide_src/source/libraries/input.rst index 1f2ea650a4a..432bac3c741 100644 --- a/user_guide_src/source/libraries/input.rst +++ b/user_guide_src/source/libraries/input.rst @@ -18,7 +18,7 @@ The security filtering function is called automatically when a new :doc:`controller <../general/controllers>` is invoked. It does the following: -- If $config['allow_get_array'] is FALSE(default is TRUE), destroys +- If $config['allow_get_array'] is FALSE (default is TRUE), destroys the global GET array. - Destroys all global variables in the event register_globals is turned on. @@ -53,14 +53,7 @@ false (boolean) if not. This lets you conveniently use data without having to test whether an item exists first. In other words, normally you might do something like this:: - if ( ! isset($_POST['something'])) - { - $something = FALSE; - } - else - { - $something = $_POST['something']; - } + $something = isset($_POST['something']) ? $_POST['something'] : NULL; With CodeIgniter's built in functions you can simply do this:: @@ -95,7 +88,7 @@ To return an array of all POST items call without any parameters. To return all POST items and pass them through the XSS filter set the first parameter NULL while setting the second parameter to boolean; -The function returns FALSE (boolean) if there are no items in the POST. +The function returns NULL if there are no items in the POST. :: @@ -115,7 +108,7 @@ To return an array of all GET items call without any parameters. To return all GET items and pass them through the XSS filter set the first parameter NULL while setting the second parameter to boolean; -The function returns FALSE (boolean) if there are no items in the GET. +The function returns NULL if there are no items in the GET. :: @@ -210,7 +203,7 @@ the cookie you are looking for (including any prefixes):: cookie('some_cookie'); -The function returns FALSE (boolean) if the item you are attempting to +The function returns NULL if the item you are attempting to retrieve does not exist. The second optional parameter lets you run the data through the XSS diff --git a/user_guide_src/source/libraries/uri.rst b/user_guide_src/source/libraries/uri.rst index ee60b77d717..cdd76e322f3 100644 --- a/user_guide_src/source/libraries/uri.rst +++ b/user_guide_src/source/libraries/uri.rst @@ -25,7 +25,7 @@ The segment numbers would be this: #. metro #. crime_is_up -By default the function returns FALSE (boolean) if the segment does not +By default the function returns NULL if the segment does not exist. There is an optional second parameter that permits you to set your own default value if the segment is missing. For example, this would tell the function to return the number zero in the event of From f49c407d587d35fc12ad27c045fbcb51f89f59f8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 24 May 2012 14:57:33 +0300 Subject: [PATCH 1081/5397] Fix issue #1388 --- system/core/Lang.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/core/Lang.php b/system/core/Lang.php index 5cb0cad71b0..73c9127acc9 100755 --- a/system/core/Lang.php +++ b/system/core/Lang.php @@ -65,14 +65,14 @@ public function __construct() /** * Load a language file * - * @param mixed the name of the language file to be loaded. Can be an array + * @param mixed the name of the language file to be loaded * @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 */ - public function load($langfile = '', $idiom = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '') + public function load($langfile, $idiom = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '') { $langfile = str_replace('.php', '', $langfile); From 7f57a016358a5ae19470d6c45b09d647246e3462 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 24 May 2012 18:40:50 +0300 Subject: [PATCH 1082/5397] Remove the DB destructor (db->close()) --- system/database/DB.php | 2 +- system/database/DB_driver.php | 17 ----------------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/system/database/DB.php b/system/database/DB.php index b28439b2920..9b96c7fcdb3 100755 --- a/system/database/DB.php +++ b/system/database/DB.php @@ -159,4 +159,4 @@ class CI_DB extends CI_DB_driver { } } /* End of file DB.php */ -/* Location: ./system/database/DB.php */ +/* Location: ./system/database/DB.php */ \ No newline at end of file diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index a0812d4c765..d8a1c13f06e 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1404,23 +1404,6 @@ protected function _reset_select() { } - // -------------------------------------------------------------------- - - /** - * Destructor - * - * Closes the database connection, if needed. - * - * @return void - */ - public function __destruct() - { - if ( ! $this->pconnect) - { - $this->close(); - } - } - } /* End of file DB_driver.php */ From d45f9503a45e099ed35df3e83aaa12bd91217dea Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 24 May 2012 19:31:39 +0300 Subject: [PATCH 1083/5397] Add backwards compatibility work-around for the configuration setting --- system/database/DB.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/system/database/DB.php b/system/database/DB.php index 9b96c7fcdb3..1fe44c0e522 100755 --- a/system/database/DB.php +++ b/system/database/DB.php @@ -118,6 +118,13 @@ function &DB($params = '', $query_builder_override = NULL) { $query_builder = $query_builder_override; } + // Backwards compatibility work-around for keeping the + // $active_record config variable working. Should be + // removed in v3.1 + elseif ( ! isset($query_builder) && isset($active_record)) + { + $query_builder = $active_record; + } require_once(BASEPATH.'database/DB_driver.php'); From 7b5eb7310e5980ffb23fde8a11261e4a40c3b90e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 24 May 2012 20:52:41 +0300 Subject: [PATCH 1084/5397] Fix issue #1273 and some cleanup in Query Builder --- system/database/DB_query_builder.php | 43 ++++++++++++---------------- user_guide_src/source/changelog.rst | 7 +++-- 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index d0af66de193..cee4354e9e9 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -211,8 +211,8 @@ protected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') $alias = $this->_create_alias_from_table(trim($select)); } - $sql = $this->protect_identifiers($type.'('.trim($select).')').' AS '.$this->protect_identifiers(trim($alias)); - + $sql = $this->protect_identifiers($type.'('.trim($select).')').' AS '.$this->escape_identifiers(trim($alias)); + $this->qb_select[] = $sql; $this->qb_no_escape[] = NULL; @@ -256,7 +256,7 @@ protected function _create_alias_from_table($item) */ public function distinct($val = TRUE) { - $this->qb_distinct = (is_bool($val)) ? $val : TRUE; + $this->qb_distinct = is_bool($val) ? $val : TRUE; return $this; } @@ -272,7 +272,7 @@ public function distinct($val = TRUE) */ public function from($from) { - foreach ((array)$from as $val) + foreach ((array) $from as $val) { if (strpos($val, ',') !== FALSE) { @@ -1111,6 +1111,8 @@ public function get($table = '', $limit = null, $offset = null) return $result; } + // -------------------------------------------------------------------- + /** * "Count All Results" query * @@ -1139,6 +1141,7 @@ public function count_all_results($table = '') $row = $result->row(); return (int) $row->numrows; } + // -------------------------------------------------------------------- /** @@ -1401,16 +1404,13 @@ protected function _validate_insert($table = '') return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } - if ($table == '') + if ($table != '') { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } + $this->qb_from[0] = $table; } - else + elseif ( ! isset($this->qb_from[0])) { - $this->qb_from[0] = $table; + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } return TRUE; @@ -1600,16 +1600,13 @@ protected function _validate_update($table = '') return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } - if ($table == '') + if ($table != '') { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } + $this->qb_from[0] = $table; } - else + elseif ( ! isset($this->qb_from[0])) { - $this->qb_from[0] = $table; + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; } return TRUE; @@ -1696,15 +1693,11 @@ public function set_update_batch($key, $index = '', $escape = TRUE) { $index_set = TRUE; } - else - { - $not[] = $k.'-'.$v; - } $clean[$this->protect_identifiers($k2)] = ($escape === FALSE) ? $v2 : $this->escape($v2); } - if ($index_set == FALSE) + if ($index_set === FALSE) { return $this->display_error('db_batch_missing_index'); } @@ -2102,7 +2095,7 @@ protected function _compile_select($select_override = FALSE) * @param object * @return array */ - public function _object_to_array($object) + protected function _object_to_array($object) { if ( ! is_object($object)) { @@ -2132,7 +2125,7 @@ public function _object_to_array($object) * @param object * @return array */ - public function _object_to_array_batch($object) + protected function _object_to_array_batch($object) { if ( ! is_object($object)) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e0d745fd8d9..8ddeb0eac4d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -149,7 +149,7 @@ Bug fixes for 3.0 - Fixed a bug where ``unlink()`` raised an error if cache file did not exist when you try to delete it. - Fixed a bug (#181) where a mis-spelling was in the form validation language file. -- Fixed a bug (#159, #163) that mishandled Active Record nested transactions because _trans_depth was not getting incremented. +- Fixed a bug (#159, #163) that mishandled Query Builder nested transactions because _trans_depth was not getting incremented. - Fixed a bug (#737, #75) where pagination anchor class was not set properly when using initialize method. - Fixed a bug (#419) - auto_link() now recognizes URLs that come after a word boundary. - Fixed a bug (#724) - is_unique in form validation now checks that you are connected to a database. @@ -190,7 +190,7 @@ Bug fixes for 3.0 - Fixed a bug (#499) - a CSRF cookie was created even with CSRF protection being disabled. - Fixed a bug (#306) - ODBC's insert_id() method was calling non-existent function odbc_insert_id(), which resulted in a fatal error. - Fixed a bug in Oracle's DB_result class where the cursor id passed to it was always NULL. -- Fixed a bug (#64) - Regular expression in DB_active_rec.php failed to handle queries containing SQL bracket delimiters in the join condition. +- Fixed a bug (#64) - Regular expression in DB_query_builder.php failed to handle queries containing SQL bracket delimiters in the join condition. - Fixed a bug in the :doc:`Session Library ` where a PHP E_NOTICE error was triggered by _unserialize() due to results from databases such as MSSQL and Oracle being space-padded on the right. - Fixed a bug (#501) - set_rules() to check if the request method is not 'POST' before aborting, instead of depending on count($_POST) in the :doc:`Form Validation Library `. - Fixed a bug (#940) - csrf_verify() used to set the CSRF cookie while processing a POST request with no actual POST data, which resulted in validating a request that should be considered invalid. @@ -213,7 +213,8 @@ Bug fixes for 3.0 - Fixed a bug (#128) - :doc:`Language Library ` did not correctly keep track of loaded language files. - Fixed a bug (#1242) - Added Windows path compatibility to function read_dir of ZIP library. - Fixed a bug (#1314) - sess_destroy() did not destroy userdata. -- Fixed a bug (#1349) - get_extension() in the `File Uploading Library ` returned the original filename when it didn't have an actual extension. +- Fixed a bug (#1349) - get_extension() in the :doc:`File Uploading Library ` returned the original filename when it didn't have an actual extension. +- Fixed a bug (#1273) - E_NOTICE being generated by :doc:`Query Builder `'s set_update_batch() method. Version 2.1.1 ============= From 389d3cafa7cda7cdf5f891d1a9cd2e00c2711c39 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 01:05:23 +0700 Subject: [PATCH 1085/5397] Update vfsStream reference, run the test --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 97ea0422dbd..d82be588800 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,8 +13,8 @@ env: - DB=pdo/sqlite before_script: - - pyrus channel-discover pear.php-tools.net - - pyrus install http://pear.php-tools.net/get/vfsStream-0.11.2.tgz + - pyrus channel-discover pear.bovigo.org + - pyrus install bovigo/vfsStream-beta - phpenv rehash - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" @@ -25,4 +25,4 @@ script: phpunit --configuration tests/travis/$DB.phpunit.xml branches: only: - develop - - master \ No newline at end of file + - travis-ci From 337c35406e9f9588317f8ebedfc5cf89d9ffa236 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 01:12:34 +0700 Subject: [PATCH 1086/5397] Update vfsStream repo --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d82be588800..1d9f350fc1c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ env: before_script: - pyrus channel-discover pear.bovigo.org - - pyrus install bovigo/vfsStream-beta + - pyrus install http://pear.bovigo.org/get/vfsStream-0.12.0.tgz - phpenv rehash - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" From de883e3bdb112ad721926f4274f89f61079a1c81 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 01:27:17 +0700 Subject: [PATCH 1087/5397] Force install --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1d9f350fc1c..bfaf4036a67 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ env: before_script: - pyrus channel-discover pear.bovigo.org - - pyrus install http://pear.bovigo.org/get/vfsStream-0.12.0.tgz + - pyrus install -f bovigo/vfsStream-beta - phpenv rehash - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" From f61d9f3758cbc6848d6df2cc83cc262fc36fa156 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 01:38:58 +0700 Subject: [PATCH 1088/5397] Write permission --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index bfaf4036a67..4076e2bdc68 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,8 +13,8 @@ env: - DB=pdo/sqlite before_script: - - pyrus channel-discover pear.bovigo.org - - pyrus install -f bovigo/vfsStream-beta + - sudo pyrus channel-discover pear.bovigo.org + - sudo pyrus install -f bovigo/vfsStream-beta - phpenv rehash - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" From 6bca9f836836f4bea2112cd6635a384e862b4db2 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 01:55:36 +0700 Subject: [PATCH 1089/5397] get vfsStream via composer if its PEAR package not exists --- .travis.yml | 5 ++--- composer.json | 5 +++++ tests/Bootstrap.php | 11 ++++++++++- 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 composer.json diff --git a/.travis.yml b/.travis.yml index 4076e2bdc68..5eff68d18c5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,9 +13,8 @@ env: - DB=pdo/sqlite before_script: - - sudo pyrus channel-discover pear.bovigo.org - - sudo pyrus install -f bovigo/vfsStream-beta - - phpenv rehash + - curl -s http://getcomposer.org/installer | php + - php composer.phar install - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi" diff --git a/composer.json b/composer.json new file mode 100644 index 00000000000..fa6dc02e44a --- /dev/null +++ b/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "mikey179/vfsStream": "*" + } +} \ No newline at end of file diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index 9f89d1be8b6..c14a4dee2a1 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -12,8 +12,17 @@ define('APPPATH', PROJECT_BASE.'application/'); define('VIEWPATH', PROJECT_BASE.''); +// Get vfsStream either via pear or composer +if (file_exists('vfsStream/vfsStream.php')) +{ + require_once 'vfsStream/vfsStream.php'; +} +else +{ + include_once '../vendor/autoload.php'; +} + // Prep our test environment -require_once 'vfsStream/vfsStream.php'; include_once $dir.'/mocks/core/common.php'; include_once $dir.'/mocks/autoloader.php'; spl_autoload_register('autoload'); From 470805b12a8a25faddc9caafe573c15dbd89f8ed Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 24 May 2012 21:57:21 +0300 Subject: [PATCH 1090/5397] Fix issues #44 & #110 --- system/libraries/Upload.php | 2 ++ user_guide_src/source/changelog.rst | 1 + 2 files changed, 3 insertions(+) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 271c6d21f5f..7456e922a78 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -747,6 +747,8 @@ public function clean_file_name($filename) ';', '?', '/', + '!', + '#', '%20', '%22', '%3c', // < diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8ddeb0eac4d..8ee224fc67c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -215,6 +215,7 @@ Bug fixes for 3.0 - Fixed a bug (#1314) - sess_destroy() did not destroy userdata. - Fixed a bug (#1349) - get_extension() in the :doc:`File Uploading Library ` returned the original filename when it didn't have an actual extension. - Fixed a bug (#1273) - E_NOTICE being generated by :doc:`Query Builder `'s set_update_batch() method. +- Fixed a bug (#44, #110) - :doc:`Upload library `'s clean_file_name() method didn't clear '!' and '#' characters. Version 2.1.1 ============= From 55d3ad4faf2727b900832884e7c219076a255b66 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 24 May 2012 22:13:06 +0300 Subject: [PATCH 1091/5397] Fix issue #121 --- system/database/DB_result.php | 16 +++++++++------- system/database/drivers/oci8/oci8_result.php | 16 ++++++++-------- .../database/drivers/sqlite3/sqlite3_result.php | 16 ++++++++-------- user_guide_src/source/changelog.rst | 1 + 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/system/database/DB_result.php b/system/database/DB_result.php index 690734b0880..334e08c72de 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -242,7 +242,7 @@ public function custom_row_object($n, $type) $result = $this->custom_result_object($type); if (count($result) === 0) { - return $result; + return NULL; } if ($n != $this->current_row && isset($result[$n])) @@ -253,6 +253,8 @@ public function custom_row_object($n, $type) return $result[$this->current_row]; } + // -------------------------------------------------------------------- + /** * Returns a single result row - object version * @@ -263,7 +265,7 @@ public function row_object($n = 0) $result = $this->result_object(); if (count($result) === 0) { - return $result; + return NULL; } if ($n != $this->current_row && isset($result[$n])) @@ -286,7 +288,7 @@ public function row_array($n = 0) $result = $this->result_array(); if (count($result) === 0) { - return $result; + return NULL; } if ($n != $this->current_row && isset($result[$n])) @@ -307,7 +309,7 @@ public function row_array($n = 0) public function first_row($type = 'object') { $result = $this->result($type); - return (count($result) === 0) ? $result : $result[0]; + return (count($result) === 0) ? NULL : $result[0]; } // -------------------------------------------------------------------- @@ -320,7 +322,7 @@ public function first_row($type = 'object') public function last_row($type = 'object') { $result = $this->result($type); - return (count($result) === 0) ? $result : $result[count($result) - 1]; + return (count($result) === 0) ? NULL : $result[count($result) - 1]; } // -------------------------------------------------------------------- @@ -335,7 +337,7 @@ public function next_row($type = 'object') $result = $this->result($type); if (count($result) === 0) { - return $result; + return NULL; } if (isset($result[$this->current_row + 1])) @@ -358,7 +360,7 @@ public function previous_row($type = 'object') $result = $this->result($type); if (count($result) === 0) { - return $result; + return NULL; } if (isset($result[$this->current_row - 1])) diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index 7b05e0a4318..6fb6c81f12a 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -419,7 +419,7 @@ public function row_array($n = 0) OR $n < $this->current_row) { // No such row exists - return array(); + return NULL; } // Get the next row index that would actually need to be fetched @@ -460,7 +460,7 @@ public function row_array($n = 0) $this->num_rows = 0; } - return array(); + return NULL; } $this->current_row = $n; @@ -507,7 +507,7 @@ public function row_object($n = 0) return (object) $row; } - return array(); + return NULL; } // -------------------------------------------------------------------- @@ -539,19 +539,19 @@ public function custom_row_object($n = 0, $class_name) } else { - return array(); + return NULL; } } elseif ( ! class_exists($class_name)) // No such class exists { - return array(); + return NULL; } $row = $this->row_array($n); - // An array would mean that the row doesn't exist - if (is_array($row)) + // A non-array would mean that the row doesn't exist + if ( ! is_array($row)) { - return $row; + return NULL; } // Convert to the desired class and return diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php index d83d6b2cd04..946b36557b0 100644 --- a/system/database/drivers/sqlite3/sqlite3_result.php +++ b/system/database/drivers/sqlite3/sqlite3_result.php @@ -386,7 +386,7 @@ public function row_array($n = 0) OR count($this->result_array) > 0 OR $n < $this->current_row) { // No such row exists - return array(); + return NULL; } // Get the next row index that would actually need to be fetched @@ -427,7 +427,7 @@ public function row_array($n = 0) $this->num_rows = 0; } - return array(); + return NULL; } $this->current_row = $n; @@ -469,7 +469,7 @@ public function row_object($n = 0) return (object) $row; } - return array(); + return NULL; } // -------------------------------------------------------------------- @@ -501,19 +501,19 @@ public function custom_row_object($n = 0, $class_name) } else { - return array(); + return NULL; } } elseif ( ! class_exists($class_name)) // No such class exists { - return array(); + return NULL; } $row = $this->row_array($n); - // An array would mean that the row doesn't exist - if (is_array($row)) + // A non-array would mean that the row doesn't exist + if ( ! is_array($row)) { - return $row; + return NULL; } // Convert to the desired class and return diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8ee224fc67c..67f1271f127 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -216,6 +216,7 @@ Bug fixes for 3.0 - Fixed a bug (#1349) - get_extension() in the :doc:`File Uploading Library ` returned the original filename when it didn't have an actual extension. - Fixed a bug (#1273) - E_NOTICE being generated by :doc:`Query Builder `'s set_update_batch() method. - Fixed a bug (#44, #110) - :doc:`Upload library `'s clean_file_name() method didn't clear '!' and '#' characters. +- Fixed a bug (#121) - ``CI_DB_result::row()`` returned an array when there's no actual result to be returned. Version 2.1.1 ============= From e13511a1368adb9914a4252d98cb2d0165138e0d Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 02:15:42 +0700 Subject: [PATCH 1092/5397] Global class aliasing, at least until namespace introduced into further release --- tests/Bootstrap.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index c14a4dee2a1..71394720ada 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -12,14 +12,17 @@ define('APPPATH', PROJECT_BASE.'application/'); define('VIEWPATH', PROJECT_BASE.''); -// Get vfsStream either via pear or composer +// Get vfsStream either via PEAR or composer if (file_exists('vfsStream/vfsStream.php')) { require_once 'vfsStream/vfsStream.php'; } else { - include_once '../vendor/autoload.php'; + include_once PROJECT_BASE.'vendor/autoload.php'; + class_alias('org\bovigo\vfs\vfsStream', 'vfsStream'); + class_alias('org\bovigo\vfs\vfsStreamDirectory', 'vfsStreamDirectory'); + class_alias('org\bovigo\vfs\vfsStreamWrapper', 'vfsStreamWrapper'); } // Prep our test environment From 76e2f034f55b7e0f678f22043eb841b428377fa6 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 02:18:59 +0700 Subject: [PATCH 1093/5397] Remove temporary branch from whitelist --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5eff68d18c5..6a7d3781225 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,5 +23,4 @@ script: phpunit --configuration tests/travis/$DB.phpunit.xml branches: only: - - develop - - travis-ci + - develop \ No newline at end of file From eeca6d265c4e104e3a6b34b8581180d2926b3dba Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 03:15:19 +0700 Subject: [PATCH 1094/5397] Backward compatibility, in case someone already has vfsStream in their PEAR or other include_path --- tests/Bootstrap.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index 71394720ada..1dbd178ca8d 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -13,11 +13,16 @@ define('VIEWPATH', PROJECT_BASE.''); // Get vfsStream either via PEAR or composer -if (file_exists('vfsStream/vfsStream.php')) +foreach (explode(PATH_SEPARATOR, get_include_path()) as $path) { - require_once 'vfsStream/vfsStream.php'; + if (file_exists($path.DIRECTORY_SEPARATOR.'vfsStream/vfsStream.phps')) + { + require_once 'vfsStream/vfsStream.php'; + break; + } } -else + +if ( ! class_exists('vfsStream') && file_exists(PROJECT_BASE.'vendor/autoload.php')) { include_once PROJECT_BASE.'vendor/autoload.php'; class_alias('org\bovigo\vfs\vfsStream', 'vfsStream'); From 846acc7926ccb991d39135353d5047e7de5bcb60 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 24 May 2012 23:27:46 +0300 Subject: [PATCH 1095/5397] Fix issue #319 --- system/database/drivers/sqlsrv/sqlsrv_driver.php | 10 ++++------ user_guide_src/source/changelog.rst | 1 + 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index 3e9fa7b1afc..5a24f5532de 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -132,11 +132,9 @@ public function db_select($database = '') */ protected function _execute($sql) { - return sqlsrv_query($this->conn_id, - $sql, - NULL, - array('Scrollable'=> SQLSRV_CURSOR_STATIC, 'SendStreamParamsAtExec' => TRUE) - ); + return (is_write_type($sql) && stripos($sql, 'INSERT') === FALSE) + ? sqlsrv_query($this->conn_id, $sql) + : sqlsrv_query($this->conn_id, $sql, NULL, array('Scrollable' => SQLSRV_CURSOR_STATIC)); } // -------------------------------------------------------------------- @@ -237,7 +235,7 @@ public function escape_str($str, $like = FALSE) */ public function affected_rows() { - return @sqlrv_rows_affected($this->conn_id); + return sqlrv_rows_affected($this->result_id); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 67f1271f127..f21f1266d7d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -217,6 +217,7 @@ Bug fixes for 3.0 - Fixed a bug (#1273) - E_NOTICE being generated by :doc:`Query Builder `'s set_update_batch() method. - Fixed a bug (#44, #110) - :doc:`Upload library `'s clean_file_name() method didn't clear '!' and '#' characters. - Fixed a bug (#121) - ``CI_DB_result::row()`` returned an array when there's no actual result to be returned. +- Fixed a bug (#319) - SQLSRV's affected_rows() method failed due to a scrollable cursor being created for write-type queries. Version 2.1.1 ============= From 2d57445ba66f8b6e5fef526b932d691b0e5690db Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 04:03:56 +0700 Subject: [PATCH 1096/5397] Escape like tests, #136 verification --- tests/Bootstrap.php | 2 +- .../database/query_builder/escape_test.php | 47 +++++++++++++++++++ tests/mocks/database/schema/skeleton.php | 21 +++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 tests/codeigniter/database/query_builder/escape_test.php diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index 1dbd178ca8d..38615dd892f 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -15,7 +15,7 @@ // Get vfsStream either via PEAR or composer foreach (explode(PATH_SEPARATOR, get_include_path()) as $path) { - if (file_exists($path.DIRECTORY_SEPARATOR.'vfsStream/vfsStream.phps')) + if (file_exists($path.DIRECTORY_SEPARATOR.'vfsStream/vfsStream.php')) { require_once 'vfsStream/vfsStream.php'; break; diff --git a/tests/codeigniter/database/query_builder/escape_test.php b/tests/codeigniter/database/query_builder/escape_test.php new file mode 100644 index 00000000000..6d220d65dd6 --- /dev/null +++ b/tests/codeigniter/database/query_builder/escape_test.php @@ -0,0 +1,47 @@ +db = Mock_Database_Schema_Skeleton::init(DB_DRIVER); + + Mock_Database_Schema_Skeleton::create_tables(); + Mock_Database_Schema_Skeleton::create_data(); + } + + // ------------------------------------------------------------------------ + + /** + * @see ./mocks/schema/skeleton.php + */ + public function test_escape_like_percent_sign() + { + $string = $this->db->escape_like_str('\%foo'); + $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%';"; + $res = $this->db->query($sql)->result_array(); + + // Check the result + $this->assertEquals(1, count($res)); + } + + // ------------------------------------------------------------------------ + + /** + * @see ./mocks/schema/skeleton.php + */ + public function test_escape_like_backslash_sign() + { + $string = $this->db->escape_like_str('\\'); + $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%';"; + $res = $this->db->query($sql)->result_array(); + + // Check the result + $this->assertEquals(2, count($res)); + } +} \ No newline at end of file diff --git a/tests/mocks/database/schema/skeleton.php b/tests/mocks/database/schema/skeleton.php index 671336cc4fd..05499f82fd9 100644 --- a/tests/mocks/database/schema/skeleton.php +++ b/tests/mocks/database/schema/skeleton.php @@ -88,6 +88,23 @@ public static function create_tables() )); static::$forge->add_key('id', TRUE); static::$forge->create_table('job', (strpos(static::$driver, 'pgsql') === FALSE)); + + // Misc Table + static::$forge->add_field(array( + 'id' => array( + 'type' => 'INTEGER', + 'constraint' => 3, + ), + 'key' => array( + 'type' => 'VARCHAR', + 'constraint' => 40, + ), + 'value' => array( + 'type' => 'TEXT', + ), + )); + static::$forge->add_key('id', TRUE); + static::$forge->create_table('misc', (strpos(static::$driver, 'pgsql') === FALSE)); } /** @@ -111,6 +128,10 @@ public static function create_data() array('id' => 3, 'name' => 'Accountant', 'description' => 'Boring job, but you will get free snack at lunch'), array('id' => 4, 'name' => 'Musician', 'description' => 'Only Coldplay can actually called Musician'), ), + 'misc' => array( + array('id' => 1, 'key' => '\\xxxfoo456', 'value' => 'Entry with \\xxx'), + array('id' => 2, 'key' => '\\%foo456', 'value' => 'Entry with \\%'), + ), ); foreach ($data as $table => $dummy_data) From 6a43244e1d739db17db266456221099232d120d6 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 04:09:38 +0700 Subject: [PATCH 1097/5397] replace space with tab --- tests/codeigniter/database/query_builder/escape_test.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/codeigniter/database/query_builder/escape_test.php b/tests/codeigniter/database/query_builder/escape_test.php index 6d220d65dd6..f2d1b84cab8 100644 --- a/tests/codeigniter/database/query_builder/escape_test.php +++ b/tests/codeigniter/database/query_builder/escape_test.php @@ -23,8 +23,8 @@ public function set_up() public function test_escape_like_percent_sign() { $string = $this->db->escape_like_str('\%foo'); - $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%';"; - $res = $this->db->query($sql)->result_array(); + $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%';"; + $res = $this->db->query($sql)->result_array(); // Check the result $this->assertEquals(1, count($res)); @@ -38,8 +38,8 @@ public function test_escape_like_percent_sign() public function test_escape_like_backslash_sign() { $string = $this->db->escape_like_str('\\'); - $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%';"; - $res = $this->db->query($sql)->result_array(); + $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%';"; + $res = $this->db->query($sql)->result_array(); // Check the result $this->assertEquals(2, count($res)); From d06acd85cdfff5411474b46afee36fb77baa1200 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 25 May 2012 00:29:09 +0300 Subject: [PATCH 1098/5397] Added update_batch() support for PostgreSQL (issue #356) --- system/database/DB_utility.php | 4 +- .../drivers/postgre/postgre_driver.php | 41 +++++++++++++++++++ user_guide_src/source/changelog.rst | 2 + 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index 587dfdc010e..cb97ff4481f 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -212,7 +212,7 @@ public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosur $out = rtrim($out).$newline; // Next blast through the result array and build out the rows - foreach ($query->result_array() as $row) + while ($row = $query->unbuffered_row('array')) { foreach ($row as $item) { @@ -258,7 +258,7 @@ public function xml_from_result($query, $params = array()) // Generate the result $xml = '<'.$root.'>'.$newline; - foreach ($query->result_array() as $row) + while ($row = $query->unbuffered_row()) { $xml .= $tab.'<'.$element.'>'.$newline; foreach ($row as $key => $val) diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 0ddfd0abe6e..30689cc7068 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -538,6 +538,47 @@ protected function _update($table, $values, $where, $orderby = array(), $limit = // -------------------------------------------------------------------- + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @param string the table name + * @param array the update data + * @param array the where clause + * @return string + */ + protected function _update_batch($table, $values, $index, $where = NULL) + { + $ids = array(); + foreach ($values as $key => $val) + { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) + { + if ($field != $index) + { + $final[$field][] = 'WHEN '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k.' = (CASE '.$k."\n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END), '; + } + + return 'UPDATE '.$table.' SET '.substr($cases, 0, -2) + .' WHERE '.(($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : '') + .$index.' IN('.implode(',', $ids).')'; + } + + // -------------------------------------------------------------------- + /** * Delete statement * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f21f1266d7d..5407fb05e93 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -75,6 +75,7 @@ Release Date: Not Released - Added db_set_charset() support. - Added _optimize_table() support for the :doc:`Database Utility Class ` (rebuilds table indexes). - Added boolean data type support in escape(). + - Added update_batch() support. - Added a constructor to the DB_result class and moved all driver-specific properties and logic out of the base DB_driver class to allow better abstraction. - Removed limit() and order_by() support for UPDATE and DELETE queries in PostgreSQL driver. Postgres does not support those features. - Removed protect_identifiers() and renamed internal method _protect_identifiers() to it instead - it was just an alias. @@ -218,6 +219,7 @@ Bug fixes for 3.0 - Fixed a bug (#44, #110) - :doc:`Upload library `'s clean_file_name() method didn't clear '!' and '#' characters. - Fixed a bug (#121) - ``CI_DB_result::row()`` returned an array when there's no actual result to be returned. - Fixed a bug (#319) - SQLSRV's affected_rows() method failed due to a scrollable cursor being created for write-type queries. +- Fixed a bug (#356) - PostgreSQL driver didn't have an _update_batch() method, which resulted in fatal error being triggered when update_batch() is used with it. Version 2.1.1 ============= From 21cb2d32edd595a38189cdba137e694c3a22e1f0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 25 May 2012 01:01:06 +0300 Subject: [PATCH 1099/5397] Fix issue #136 (MySQL escape_like_str()) --- system/database/drivers/mysql/mysql_driver.php | 6 ++++-- system/database/drivers/mysqli/mysqli_driver.php | 6 ++++-- user_guide_src/source/changelog.rst | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 161f99541b4..d801a9aaf81 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -47,7 +47,7 @@ class CI_DB_mysql_driver extends CI_DB { // clause and character used for LIKE escape sequences - not used in MySQL protected $_like_escape_str = ''; - protected $_like_escape_chr = ''; + protected $_like_escape_chr = '\\'; /** * The syntax to count rows is slightly different across different @@ -291,7 +291,9 @@ public function escape_str($str, $like = FALSE) // escape LIKE condition wildcards if ($like === TRUE) { - return str_replace(array('%', '_'), array('\\%', '\\_'), $str); + return 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; diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 9261883f5a1..61761e0c679 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -47,7 +47,7 @@ class CI_DB_mysqli_driver extends CI_DB { // clause and character used for LIKE escape sequences - not used in MySQL protected $_like_escape_str = ''; - protected $_like_escape_chr = ''; + protected $_like_escape_chr = '\\'; /** * The syntax to count rows is slightly different across different @@ -291,7 +291,9 @@ public function escape_str($str, $like = FALSE) // escape LIKE condition wildcards if ($like === TRUE) { - return str_replace(array('%', '_'), array('\\%', '\\_'), $str); + return 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; diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 5407fb05e93..4b8a0f2d342 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -195,7 +195,7 @@ Bug fixes for 3.0 - Fixed a bug in the :doc:`Session Library ` where a PHP E_NOTICE error was triggered by _unserialize() due to results from databases such as MSSQL and Oracle being space-padded on the right. - Fixed a bug (#501) - set_rules() to check if the request method is not 'POST' before aborting, instead of depending on count($_POST) in the :doc:`Form Validation Library `. - Fixed a bug (#940) - csrf_verify() used to set the CSRF cookie while processing a POST request with no actual POST data, which resulted in validating a request that should be considered invalid. -- Fixed a bug in PostgreSQL's escape_str() where it didn't properly escape LIKE wild characters. +- Fixed a bug (#136) - PostgreSQL, MySQL and MySQLi's escape_str() method didn't properly escape LIKE wild characters. - Fixed a bug in the library loader where some PHP versions wouldn't execute the class constructor. - Fixed a bug (#88) - An unexisting property was used for configuration of the Memcache cache driver. - Fixed a bug (#14) - create_database() method in the :doc:`Database Forge Library ` didn't utilize the configured database character set. From def568fcc8586db7685c4a1c2efd14c3cd75c8ad Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 25 May 2012 01:06:54 +0300 Subject: [PATCH 1100/5397] Apply fix for issue #136 on PDO+MySQL as well --- system/database/drivers/pdo/pdo_driver.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index e38c1145cb9..4784fc65b8d 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -79,13 +79,13 @@ public function __construct($params) // clause and character used for LIKE escape sequences // this one depends on the driver being used - if ($this->pdodriver == 'mysql') + if ($this->pdodriver === 'mysql') { $this->_escape_char = '`'; $this->_like_escape_str = ''; - $this->_like_escape_chr = ''; + $this->_like_escape_chr = '\\'; } - elseif ($this->pdodriver == 'odbc') + elseif ($this->pdodriver === 'odbc') { $this->_like_escape_str = " {escape '%s'} "; } From 98dcac7ea5f82cc1d5cecedd030c5f242f1dc652 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 05:07:51 +0700 Subject: [PATCH 1101/5397] Alter the escape like test, since it use raw SQL via query(), the sql statement would need to add ESCAPE clause for database(s) other than mysql --- .../database/query_builder/escape_test.php | 7 +++++-- tests/mocks/database/ci_test.sqlite | Bin 19456 -> 19456 bytes 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/codeigniter/database/query_builder/escape_test.php b/tests/codeigniter/database/query_builder/escape_test.php index f2d1b84cab8..5dd2da058e7 100644 --- a/tests/codeigniter/database/query_builder/escape_test.php +++ b/tests/codeigniter/database/query_builder/escape_test.php @@ -23,7 +23,9 @@ public function set_up() public function test_escape_like_percent_sign() { $string = $this->db->escape_like_str('\%foo'); - $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%';"; + $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%'"; + $sql .= (strpos(DB_DRIVER, 'mysql') !== FALSE) ? ";" : "ESCAPE '!';"; + $res = $this->db->query($sql)->result_array(); // Check the result @@ -38,7 +40,8 @@ public function test_escape_like_percent_sign() public function test_escape_like_backslash_sign() { $string = $this->db->escape_like_str('\\'); - $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%';"; + $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%'"; + $sql .= (strpos(DB_DRIVER, 'mysql') !== FALSE) ? ";" : "ESCAPE '!';"; $res = $this->db->query($sql)->result_array(); // Check the result diff --git a/tests/mocks/database/ci_test.sqlite b/tests/mocks/database/ci_test.sqlite index 23a3de2a478cf280594e3bba7eac9577e4faa09f..44dcef9ec5e46b649f8cce366f04e18163a5177e 100755 GIT binary patch delta 392 zcmZpe!Pqc^ae|bPO#=f1gD?;?12GQ+17piX9U~c_sO}>fUM716HpUj97?U`&F!Lp* zK&Ge6*ES2Xa4}A9Vcg@&&maWUgajG|ni$!|MMW8#m`f6qa#C|Mi<3c^)j7!3F~n6N z#L>yeRY3_Pq@4cVB0Wr|e47{5SI4-dB@B*1k%tsiQA21);EXcEi*+Ytn zg;7?WDMmFdKi|aE%r&p1s8XRkvm`?yMpcfHg;7zPF{YxT0#g117q_<9U~c_sO}>fUM7167RD9^#ug@VW?|+_ z%-2A0vmgr> Date: Fri, 25 May 2012 02:08:00 +0300 Subject: [PATCH 1102/5397] Alter LIKE escaping tests again --- tests/codeigniter/database/DB_driver_test.php | 4 +--- tests/codeigniter/database/DB_test.php | 4 +--- .../database/query_builder/escape_test.php | 16 ++++++---------- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/tests/codeigniter/database/DB_driver_test.php b/tests/codeigniter/database/DB_driver_test.php index fb40f060882..9e16e29b4bc 100644 --- a/tests/codeigniter/database/DB_driver_test.php +++ b/tests/codeigniter/database/DB_driver_test.php @@ -2,8 +2,6 @@ class DB_driver_test extends CI_TestCase { - // ------------------------------------------------------------------------ - public function test_initialize() { $config = Mock_Database_DB::config(DB_DRIVER); @@ -32,5 +30,5 @@ protected function pgsql($config) { return new Mock_Database_Drivers_Postgre($config); } - + } \ No newline at end of file diff --git a/tests/codeigniter/database/DB_test.php b/tests/codeigniter/database/DB_test.php index 9b93e223de9..d5c0dea08d9 100644 --- a/tests/codeigniter/database/DB_test.php +++ b/tests/codeigniter/database/DB_test.php @@ -2,8 +2,6 @@ class DB_test extends CI_TestCase { - // ------------------------------------------------------------------------ - public function test_db_invalid() { $connection = new Mock_Database_DB(array( @@ -45,5 +43,5 @@ public function test_db_failover() $this->assertTrue($db instanceof CI_DB); $this->assertTrue($db instanceof CI_DB_Driver); } - + } \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/escape_test.php b/tests/codeigniter/database/query_builder/escape_test.php index 5dd2da058e7..96fbd078b75 100644 --- a/tests/codeigniter/database/query_builder/escape_test.php +++ b/tests/codeigniter/database/query_builder/escape_test.php @@ -23,13 +23,10 @@ public function set_up() public function test_escape_like_percent_sign() { $string = $this->db->escape_like_str('\%foo'); - $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%'"; - $sql .= (strpos(DB_DRIVER, 'mysql') !== FALSE) ? ";" : "ESCAPE '!';"; + $res = $this->db->select('value')->from('misc')->like('key', $string, 'after')->get(); - $res = $this->db->query($sql)->result_array(); - // Check the result - $this->assertEquals(1, count($res)); + $this->assertEquals(1, count($res->result_array())); } // ------------------------------------------------------------------------ @@ -40,11 +37,10 @@ public function test_escape_like_percent_sign() public function test_escape_like_backslash_sign() { $string = $this->db->escape_like_str('\\'); - $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%'"; - $sql .= (strpos(DB_DRIVER, 'mysql') !== FALSE) ? ";" : "ESCAPE '!';"; - $res = $this->db->query($sql)->result_array(); - + $res = $this->db->select('value')->from('misc')->like('key', $string, 'after')->get(); + // Check the result - $this->assertEquals(2, count($res)); + $this->assertEquals(2, count($res->result_array())); } + } \ No newline at end of file From 0174d84401b5c5996115a4a6193161f1dab96de2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 25 May 2012 02:17:49 +0300 Subject: [PATCH 1103/5397] Alter LIKE escaping tests again --- tests/codeigniter/database/query_builder/escape_test.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/codeigniter/database/query_builder/escape_test.php b/tests/codeigniter/database/query_builder/escape_test.php index 96fbd078b75..9df82c2d0aa 100644 --- a/tests/codeigniter/database/query_builder/escape_test.php +++ b/tests/codeigniter/database/query_builder/escape_test.php @@ -23,7 +23,10 @@ public function set_up() public function test_escape_like_percent_sign() { $string = $this->db->escape_like_str('\%foo'); - $res = $this->db->select('value')->from('misc')->like('key', $string, 'after')->get(); + $this->db->select('value'); + $this->db->from('misc'); + $this->db->like('key', $string, 'after'); + $res = $this->db->get(); // Check the result $this->assertEquals(1, count($res->result_array())); @@ -38,6 +41,10 @@ public function test_escape_like_backslash_sign() { $string = $this->db->escape_like_str('\\'); $res = $this->db->select('value')->from('misc')->like('key', $string, 'after')->get(); + $this->db->select('value'); + $this->db->from('misc'); + $this->db->like('key', $string, 'after'); + $res = $this->db->get(); // Check the result $this->assertEquals(2, count($res->result_array())); From f33e2ff30b0a9c54d6e8adbe88662838b9bd525e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 25 May 2012 02:24:17 +0300 Subject: [PATCH 1104/5397] Again ... escape_like_str() tests --- tests/codeigniter/database/query_builder/escape_test.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/codeigniter/database/query_builder/escape_test.php b/tests/codeigniter/database/query_builder/escape_test.php index 9df82c2d0aa..50685922a81 100644 --- a/tests/codeigniter/database/query_builder/escape_test.php +++ b/tests/codeigniter/database/query_builder/escape_test.php @@ -22,7 +22,8 @@ public function set_up() */ public function test_escape_like_percent_sign() { - $string = $this->db->escape_like_str('\%foo'); + $string = '\%foo' +; $this->db->select('value'); $this->db->from('misc'); $this->db->like('key', $string, 'after'); @@ -39,8 +40,8 @@ public function test_escape_like_percent_sign() */ public function test_escape_like_backslash_sign() { - $string = $this->db->escape_like_str('\\'); - $res = $this->db->select('value')->from('misc')->like('key', $string, 'after')->get(); + $string = '\\'; + $this->db->select('value'); $this->db->from('misc'); $this->db->like('key', $string, 'after'); From 502942bd94fef292970df331b15652ef6e1385e7 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 07:00:41 +0700 Subject: [PATCH 1105/5397] Explicitely testing escape_like_str API --- .../database/query_builder/escape_test.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/codeigniter/database/query_builder/escape_test.php b/tests/codeigniter/database/query_builder/escape_test.php index 5dd2da058e7..ac1c8f659b4 100644 --- a/tests/codeigniter/database/query_builder/escape_test.php +++ b/tests/codeigniter/database/query_builder/escape_test.php @@ -13,6 +13,9 @@ public function set_up() Mock_Database_Schema_Skeleton::create_tables(); Mock_Database_Schema_Skeleton::create_data(); + + $this->pre = (strpos(DB_DRIVER, 'pgsql') === FALSE) ? '`' : '"'; + $this->esc = (strpos(DB_DRIVER, 'mysql') === FALSE) ? '!' : ''; } // ------------------------------------------------------------------------ @@ -23,8 +26,8 @@ public function set_up() public function test_escape_like_percent_sign() { $string = $this->db->escape_like_str('\%foo'); - $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%'"; - $sql .= (strpos(DB_DRIVER, 'mysql') !== FALSE) ? ";" : "ESCAPE '!';"; + + $sql = "SELECT {$this->pre}value{$this->pre} FROM {$this->pre}misc{$this->pre} WHERE {$this->pre}key{$this->pre} LIKE '$string%' ESCAPE '$this->esc';"; $res = $this->db->query($sql)->result_array(); @@ -40,8 +43,9 @@ public function test_escape_like_percent_sign() public function test_escape_like_backslash_sign() { $string = $this->db->escape_like_str('\\'); - $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%'"; - $sql .= (strpos(DB_DRIVER, 'mysql') !== FALSE) ? ";" : "ESCAPE '!';"; + + $sql = "SELECT {$this->pre}value{$this->pre} FROM {$this->pre}misc{$this->pre} WHERE {$this->pre}key{$this->pre} LIKE '$string%' ESCAPE '$this->esc';"; + $res = $this->db->query($sql)->result_array(); // Check the result From 3c5abf93d3031064c8181069cfee83ebfb54dcf0 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Fri, 25 May 2012 07:17:26 +0700 Subject: [PATCH 1106/5397] Clean up --- tests/codeigniter/database/query_builder/escape_test.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/codeigniter/database/query_builder/escape_test.php b/tests/codeigniter/database/query_builder/escape_test.php index fe225436a4b..5df812ca6b3 100644 --- a/tests/codeigniter/database/query_builder/escape_test.php +++ b/tests/codeigniter/database/query_builder/escape_test.php @@ -32,7 +32,7 @@ public function test_escape_like_percent_sign() $res = $this->db->query($sql)->result_array(); // Check the result - $this->assertEquals(1, count($res->result_array())); + $this->assertEquals(1, count($res)); } // ------------------------------------------------------------------------ @@ -49,7 +49,7 @@ public function test_escape_like_backslash_sign() $res = $this->db->query($sql)->result_array(); // Check the result - $this->assertEquals(2, count($res->result_array())); + $this->assertEquals(2, count($res)); } } \ No newline at end of file From 35ac46d4aad12fe723229feca403b4dee3efcc27 Mon Sep 17 00:00:00 2001 From: Root Date: Fri, 25 May 2012 18:51:48 -0400 Subject: [PATCH 1107/5397] Changed instead of turning off of the error messaging to hide them --- index.php | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/index.php b/index.php index 5a11901121b..6ffe4864efa 100644 --- a/index.php +++ b/index.php @@ -52,20 +52,23 @@ * By default development will show errors but testing and live will hide them. */ -if (defined('ENVIRONMENT')) +// By default show all except notifications, deprecated and strict errors +error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED ^ E_STRICT); + +// Show or hide errors depending on current environment +switch (ENVIRONMENT) { - switch (ENVIRONMENT) - { - case 'development': - error_reporting(-1); - break; - case 'testing': - case 'production': - error_reporting(0); - break; - default: - exit('The application environment is not set correctly.'); - } + case 'development': + ini_set('display_errors', 1); + break; + + case 'testing': + case 'production': + ini_set('display_errors', 0); + break; + + default: + exit('The application environment is not set correctly.'); } /* From 1af5b47ad6f95f805d9f411ce020f2e2fa88b302 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Sat, 26 May 2012 16:04:39 +0700 Subject: [PATCH 1108/5397] Remove ternary --- .../database/query_builder/escape_test.php | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/tests/codeigniter/database/query_builder/escape_test.php b/tests/codeigniter/database/query_builder/escape_test.php index 5df812ca6b3..5d575a37bfb 100644 --- a/tests/codeigniter/database/query_builder/escape_test.php +++ b/tests/codeigniter/database/query_builder/escape_test.php @@ -13,9 +13,6 @@ public function set_up() Mock_Database_Schema_Skeleton::create_tables(); Mock_Database_Schema_Skeleton::create_data(); - - $this->pre = (strpos(DB_DRIVER, 'pgsql') === FALSE) ? '`' : '"'; - $this->esc = (strpos(DB_DRIVER, 'mysql') === FALSE) ? '!' : ''; } // ------------------------------------------------------------------------ @@ -25,9 +22,17 @@ public function set_up() */ public function test_escape_like_percent_sign() { + // Escape the like string $string = $this->db->escape_like_str('\%foo'); - $sql = "SELECT {$this->pre}value{$this->pre} FROM {$this->pre}misc{$this->pre} WHERE {$this->pre}key{$this->pre} LIKE '$string%' ESCAPE '$this->esc';"; + if (strpos(DB_DRIVER, 'mysql') !== FALSE) + { + $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%' ESCAPE '';"; + } + else + { + $sql = 'SELECT "value" FROM "misc" WHERE "key" LIKE \''.$string.'%\' ESCAPE \'!\';'; + } $res = $this->db->query($sql)->result_array(); @@ -42,14 +47,21 @@ public function test_escape_like_percent_sign() */ public function test_escape_like_backslash_sign() { + // Escape the like string $string = $this->db->escape_like_str('\\'); - $sql = "SELECT {$this->pre}value{$this->pre} FROM {$this->pre}misc{$this->pre} WHERE {$this->pre}key{$this->pre} LIKE '$string%' ESCAPE '$this->esc';"; + if (strpos(DB_DRIVER, 'mysql') !== FALSE) + { + $sql = "SELECT `value` FROM `misc` WHERE `key` LIKE '$string%' ESCAPE '';"; + } + else + { + $sql = 'SELECT "value" FROM "misc" WHERE "key" LIKE \''.$string.'%\' ESCAPE \'!\';'; + } $res = $this->db->query($sql)->result_array(); // Check the result $this->assertEquals(2, count($res)); } - } \ No newline at end of file From 4912f8b25cd8fa1b88b4babd1bad2b6bf29dd235 Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Sat, 26 May 2012 22:09:58 +0700 Subject: [PATCH 1109/5397] Allowing main constants defined via phpunit config or other bootstraper --- tests/Bootstrap.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index 38615dd892f..5216038c600 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -7,10 +7,10 @@ $dir = realpath(dirname(__FILE__)); // Path constants -define('PROJECT_BASE', realpath($dir.'/../').'/'); -define('BASEPATH', PROJECT_BASE.'system/'); -define('APPPATH', PROJECT_BASE.'application/'); -define('VIEWPATH', PROJECT_BASE.''); +defined('PROJECT_BASE') OR define('PROJECT_BASE', realpath($dir.'/../').'/'); +defined('BASEPATH') OR define('BASEPATH', PROJECT_BASE.'system/'); +defined('APPPATH') OR define('APPPATH', PROJECT_BASE.'application/'); +defined('VIEWPATH') OR define('VIEWPATH', PROJECT_BASE.''); // Get vfsStream either via PEAR or composer foreach (explode(PATH_SEPARATOR, get_include_path()) as $path) From 16bb9bd93698335fc1692adcfbd20d8e4fda6268 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 26 May 2012 18:21:14 +0300 Subject: [PATCH 1110/5397] Move count_all() from the drivers to CI_DB_driver --- system/database/DB_driver.php | 32 +++++++++++++++++-- .../database/drivers/cubrid/cubrid_driver.php | 29 ----------------- .../drivers/interbase/interbase_driver.php | 29 ----------------- .../database/drivers/mssql/mssql_driver.php | 29 ----------------- .../database/drivers/mysql/mysql_driver.php | 29 ----------------- .../database/drivers/mysqli/mysqli_driver.php | 29 ----------------- system/database/drivers/oci8/oci8_driver.php | 29 ----------------- system/database/drivers/odbc/odbc_driver.php | 30 ----------------- system/database/drivers/pdo/pdo_driver.php | 32 ------------------- .../drivers/postgre/postgre_driver.php | 29 ----------------- .../database/drivers/sqlite/sqlite_driver.php | 29 ----------------- .../drivers/sqlite3/sqlite3_driver.php | 24 -------------- .../database/drivers/sqlsrv/sqlsrv_driver.php | 29 ----------------- 13 files changed, 30 insertions(+), 349 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index d8a1c13f06e..bbb7b7a802e 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -741,6 +741,35 @@ public function primary($table = '') // -------------------------------------------------------------------- + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @param string + * @return int + */ + public function count_all($table = '') + { + if ($table == '') + { + return 0; + } + + $query = $this->query($this->_count_string.$this->escape_identifiers('numrows').' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE)); + if ($query->num_rows() == 0) + { + return 0; + } + + $query = $query->row(); + $this->_reset_select(); + return (int) $query->numrows; + } + + // -------------------------------------------------------------------- + /** * Returns an array of table names * @@ -1395,8 +1424,7 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden /** * Dummy method that allows Query Builder class to be disabled - * - * This function is used extensively by every db driver. + * and keep count_all() working. * * @return void */ diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index 944df99b51e..817dfdc981a 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -328,35 +328,6 @@ public function insert_id() // -------------------------------------------------------------------- - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified table - * - * @param string - * @return int - */ - 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->num_rows() == 0) - { - return 0; - } - - $query = $query->row(); - $this->_reset_select(); - return (int) $query->numrows; - } - - // -------------------------------------------------------------------- - /** * List table query * diff --git a/system/database/drivers/interbase/interbase_driver.php b/system/database/drivers/interbase/interbase_driver.php index c457f6340d7..49d3cda87f1 100644 --- a/system/database/drivers/interbase/interbase_driver.php +++ b/system/database/drivers/interbase/interbase_driver.php @@ -243,35 +243,6 @@ public function insert_id($generator_name, $inc_by=0) // -------------------------------------------------------------------- - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @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->num_rows() == 0) - { - return 0; - } - - $query = $query->row(); - $this->_reset_select(); - return (int) $query->numrows; - } - - // -------------------------------------------------------------------- - /** * List table query * diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 914de499fb2..342ff264761 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -303,35 +303,6 @@ protected function _version() // -------------------------------------------------------------------- - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @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->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - /** * List table query * diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index d801a9aaf81..7a1a7b9a290 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -325,35 +325,6 @@ public function insert_id() // -------------------------------------------------------------------- - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @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->num_rows() == 0) - { - return 0; - } - - $query = $query->row(); - $this->_reset_select(); - return (int) $query->numrows; - } - - // -------------------------------------------------------------------- - /** * List table query * diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 61761e0c679..dd544f686b5 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -325,35 +325,6 @@ public function insert_id() // -------------------------------------------------------------------- - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @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->num_rows() == 0) - { - return 0; - } - - $query = $query->row(); - $this->_reset_select(); - return (int) $query->numrows; - } - - // -------------------------------------------------------------------- - /** * List table query * diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index e2fa5134907..b979c8a17b5 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -454,35 +454,6 @@ public function insert_id() // -------------------------------------------------------------------- - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @param string - * @return int - */ - 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 * diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index e3172117a47..98fd806a8eb 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -244,36 +244,6 @@ public function insert_id() // -------------------------------------------------------------------- - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @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->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - /** * Show table query * diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 4784fc65b8d..ec7f3e19b34 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -408,38 +408,6 @@ public function insert_id($name = NULL) // -------------------------------------------------------------------- - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @param string - * @return string - */ - public function count_all($table = '') - { - if ($table == '') - { - return 0; - } - - $sql = $this->_count_string.$this->protect_identifiers('numrows').' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); - $query = $this->query($sql); - - if ($query->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - /** * Show table query * diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 30689cc7068..c2a188416c1 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -389,35 +389,6 @@ public function insert_id() // -------------------------------------------------------------------- - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @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->num_rows() == 0) - { - return 0; - } - - $query = $query->row(); - $this->_reset_select(); - return (int) $query->numrows; - } - - // -------------------------------------------------------------------- - /** * Show table query * diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index d710b945df9..d8b869c2eb8 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -267,35 +267,6 @@ public function insert_id() // -------------------------------------------------------------------- - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @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->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - /** * List table query * diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index ad2848ed8ca..ea4cf2d4f98 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -244,30 +244,6 @@ public function insert_id() // -------------------------------------------------------------------- - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @param string - * @return int - */ - public function count_all($table = '') - { - if ($table == '') - { - return 0; - } - - $result = $this->conn_id->querySingle($this->_count_string.$this->protect_identifiers('numrows') - .' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE)); - - return empty($result) ? 0 : (int) $result; - } - - // -------------------------------------------------------------------- - /** * Show table query * diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index 5a24f5532de..961066da78f 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -278,35 +278,6 @@ public function version() // -------------------------------------------------------------------- - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @param string - * @return int - */ - public 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 (int) $row->numrows; - } - - // -------------------------------------------------------------------- - /** * List table query * From 650f2a2bc15dd575f50446dcc1315c131652ca49 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 26 May 2012 18:56:29 +0300 Subject: [PATCH 1111/5397] Fix issue #862 --- system/database/drivers/mssql/mssql_forge.php | 39 ++++++------------- .../database/drivers/sqlsrv/sqlsrv_forge.php | 39 ++++++------------- user_guide_src/source/changelog.rst | 1 + 3 files changed, 25 insertions(+), 54 deletions(-) diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php index 8f8e7c5b932..bbf2d9685bc 100644 --- a/system/database/drivers/mssql/mssql_forge.php +++ b/system/database/drivers/mssql/mssql_forge.php @@ -48,16 +48,13 @@ class CI_DB_mssql_forge extends CI_DB_forge { */ protected function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { - $sql = 'CREATE TABLE '; + $sql = ($if_not_exists === TRUE) + ? "IF NOT EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'".$table."') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\n" + : ''; - if ($if_not_exists === TRUE) - { - $sql .= 'IF NOT EXISTS '; - } + $sql .= 'CREATE TABLE '.$this->db->escape_identifiers($table).' ('; - $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 @@ -65,15 +62,13 @@ protected function _create_table($table, $fields, $primary_keys, $keys, $if_not_ // entered the field information, so we'll simply add it to the list if (is_numeric($field)) { - $sql .= "\n\t$attributes"; + $sql .= "\n\t".$attributes; } else { $attributes = array_change_key_case($attributes, CASE_UPPER); - $sql .= "\n\t".$this->db->protect_identifiers($field); - - $sql .= ' '.$attributes['TYPE']; + $sql .= "\n\t".$this->db->escape_identifiers($field).' '.$attributes['TYPE']; if (array_key_exists('CONSTRAINT', $attributes)) { @@ -115,7 +110,7 @@ protected function _create_table($table, $fields, $primary_keys, $keys, $if_not_ if (count($primary_keys) > 0) { $primary_keys = $this->db->protect_identifiers($primary_keys); - $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; + $sql .= ",\n\tPRIMARY KEY (".implode(', ', $primary_keys).')'; } if (is_array($keys) && count($keys) > 0) @@ -131,13 +126,11 @@ protected function _create_table($table, $fields, $primary_keys, $keys, $if_not_ $key = array($this->db->protect_identifiers($key)); } - $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; + $sql .= ",\n\tFOREIGN KEY (".implode(', ', $key).')'; } } - $sql .= "\n)"; - - return $sql; + return $sql."\n)"; } // -------------------------------------------------------------------- @@ -167,21 +160,14 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin return $sql; } - $sql .= " $column_definition"; + $sql .= " ".$column_definition; if ($default_value != '') { - $sql .= " DEFAULT \"$default_value\""; + $sql .= " DEFAULT '".$default_value."'"; } - if ($null === NULL) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } + $sql .= ($null === NULL) ? ' NULL' : ' NOT NULL'; if ($after_field != '') { @@ -189,7 +175,6 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin } return $sql; - } } diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php index e9143b26961..c817c2c5d95 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -48,16 +48,13 @@ class CI_DB_sqlsrv_forge extends CI_DB_forge { */ protected function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) { - $sql = 'CREATE TABLE '; + $sql = ($if_not_exists === TRUE) + ? "IF NOT EXISTS (SELECT * FROM sysobjects WHERE ID = object_id(N'".$table."') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)\n" + : ''; - if ($if_not_exists === TRUE) - { - $sql .= 'IF NOT EXISTS '; - } + $sql .= 'CREATE TABLE '.$this->db->escape_identifiers($table).' ('; - $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 @@ -65,15 +62,13 @@ protected function _create_table($table, $fields, $primary_keys, $keys, $if_not_ // entered the field information, so we'll simply add it to the list if (is_numeric($field)) { - $sql .= "\n\t$attributes"; + $sql .= "\n\t".$attributes; } else { $attributes = array_change_key_case($attributes, CASE_UPPER); - $sql .= "\n\t".$this->db->protect_identifiers($field); - - $sql .= ' '.$attributes['TYPE']; + $sql .= "\n\t".$this->db->escape_identifiers($field).' '.$attributes['TYPE']; if (array_key_exists('CONSTRAINT', $attributes)) { @@ -115,7 +110,7 @@ protected function _create_table($table, $fields, $primary_keys, $keys, $if_not_ if (count($primary_keys) > 0) { $primary_keys = $this->db->protect_identifiers($primary_keys); - $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; + $sql .= ",\n\tPRIMARY KEY (".implode(', ', $primary_keys).')'; } if (is_array($keys) && count($keys) > 0) @@ -131,13 +126,11 @@ protected function _create_table($table, $fields, $primary_keys, $keys, $if_not_ $key = array($this->db->protect_identifiers($key)); } - $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; + $sql .= ",\n\tFOREIGN KEY (".implode(', ', $key).')'; } } - $sql .= "\n)"; - - return $sql; + return $sql."\n)"; } // -------------------------------------------------------------------- @@ -167,21 +160,14 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin return $sql; } - $sql .= " $column_definition"; + $sql .= ' '.$column_definition; if ($default_value != '') { - $sql .= " DEFAULT \"$default_value\""; + $sql .= " DEFAULT '".$default_value."'"; } - if ($null === NULL) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } + $sql .= ($null === NULL) ? ' NULL' : ' NOT NULL'; if ($after_field != '') { @@ -189,7 +175,6 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin } return $sql; - } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4b8a0f2d342..a234d69690c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -220,6 +220,7 @@ Bug fixes for 3.0 - Fixed a bug (#121) - ``CI_DB_result::row()`` returned an array when there's no actual result to be returned. - Fixed a bug (#319) - SQLSRV's affected_rows() method failed due to a scrollable cursor being created for write-type queries. - Fixed a bug (#356) - PostgreSQL driver didn't have an _update_batch() method, which resulted in fatal error being triggered when update_batch() is used with it. +- Fixed a bug (#862) - create_table() failed on SQLSRV/MSSQL when used with 'IF NOT EXISTS'. Version 2.1.1 ============= From 6c7526c95b3fbd502dc8105a67fd38da793caa4e Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Sun, 27 May 2012 13:51:27 +0700 Subject: [PATCH 1112/5397] Continuation for Security and Table code-coverage, add coverage report to travis --- .travis.yml | 2 +- system/core/Security.php | 1 + tests/codeigniter/core/Security_test.php | 32 ++++++++++++++++++++++ tests/codeigniter/libraries/Table_test.php | 24 ++++++++++++++-- tests/mocks/autoloader.php | 4 +-- tests/travis/mysql.phpunit.xml | 11 ++++---- tests/travis/pdo/mysql.phpunit.xml | 11 ++++---- tests/travis/pdo/pgsql.phpunit.xml | 11 ++++---- tests/travis/pdo/sqlite.phpunit.xml | 11 ++++---- tests/travis/pgsql.phpunit.xml | 11 ++++---- tests/travis/sqlite.phpunit.xml | 11 ++++---- 11 files changed, 88 insertions(+), 41 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6a7d3781225..31b74b13b64 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ before_script: - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi" -script: phpunit --configuration tests/travis/$DB.phpunit.xml +script: phpunit --coverage-text --configuration tests/travis/$DB.phpunit.xml branches: only: diff --git a/system/core/Security.php b/system/core/Security.php index f953011eb09..9b7ba57991b 100755 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -191,6 +191,7 @@ public function csrf_verify() * Set Cross Site Request Forgery Protection Cookie * * @return object + * @codeCoverageIgnore */ public function csrf_set_cookie() { diff --git a/tests/codeigniter/core/Security_test.php b/tests/codeigniter/core/Security_test.php index 1796ba74de7..b2f8c69d2db 100644 --- a/tests/codeigniter/core/Security_test.php +++ b/tests/codeigniter/core/Security_test.php @@ -70,4 +70,36 @@ public function test_xss_clean() $this->assertEquals("Hello, i try to [removed]alert('Hack');[removed] your site", $harmless_string); } + + // -------------------------------------------------------------------- + + public function test_xss_hash() + { + $this->assertEmpty($this->security->xss_hash); + + // Perform hash + $this->security->xss_hash(); + + $this->assertTrue(preg_match('#^[0-9a-f]{32}$#iS', $this->security->xss_hash) === 1); + } + + // -------------------------------------------------------------------- + + public function test_entity_decode() + { + $encoded = '<div>Hello <b>Booya</b></div>'; + $decoded = $this->security->entity_decode($encoded); + + $this->assertEquals('
    Hello Booya
    ', $decoded); + } + + // -------------------------------------------------------------------- + + public function test_sanitize_filename() + { + $filename = './'; + $safe_filename = $this->security->sanitize_filename($filename); + + $this->assertEquals('foo', $safe_filename); + } } \ No newline at end of file diff --git a/tests/codeigniter/libraries/Table_test.php b/tests/codeigniter/libraries/Table_test.php index 13f338c6bd1..f5133de1e64 100644 --- a/tests/codeigniter/libraries/Table_test.php +++ b/tests/codeigniter/libraries/Table_test.php @@ -291,6 +291,26 @@ function test_set_from_object() ); } - // Test main generate method - // -------------------------------------------------------------------- + function test_generate() + { + // Prepare the data + $data = array( + array('Name', 'Color', 'Size'), + array('Fred', 'Blue', 'Small'), + array('Mary', 'Red', 'Large'), + array('John', 'Green', 'Medium') + ); + + $table = $this->table->generate($data); + + // Test the table header + $this->assertTrue(strpos($table, 'Name') !== FALSE); + $this->assertTrue(strpos($table, 'Color') !== FALSE); + $this->assertTrue(strpos($table, 'Size') !== FALSE); + + // Test the first entry + $this->assertTrue(strpos($table, 'Fred') !== FALSE); + $this->assertTrue(strpos($table, 'Blue') !== FALSE); + $this->assertTrue(strpos($table, 'Small') !== FALSE); + } } \ No newline at end of file diff --git a/tests/mocks/autoloader.php b/tests/mocks/autoloader.php index 92c9bea59d0..441c889441a 100644 --- a/tests/mocks/autoloader.php +++ b/tests/mocks/autoloader.php @@ -22,7 +22,7 @@ function autoload($class) ); $ci_libraries = array( - 'Calendar', 'Cart', 'Driver', + 'Calendar', 'Cart', 'Driver_Library', 'Email', 'Encrypt', 'Form_validation', 'Ftp', 'Image_lib', 'Javascript', 'Log', 'Migration', 'Pagination', @@ -50,7 +50,7 @@ function autoload($class) elseif (in_array($subclass, $ci_libraries)) { $dir = BASEPATH.'libraries'.DIRECTORY_SEPARATOR; - $class = $subclass; + $class = ($subclass == 'Driver_Library') ? 'Driver' : $subclass; } elseif (preg_match('/^CI_DB_(.+)_(driver|forge|result|utility)$/', $class, $m) && count($m) == 3) { diff --git a/tests/travis/mysql.phpunit.xml b/tests/travis/mysql.phpunit.xml index 1792ae38d60..38c8eba48db 100644 --- a/tests/travis/mysql.phpunit.xml +++ b/tests/travis/mysql.phpunit.xml @@ -17,10 +17,9 @@ ../codeigniter - - - PEAR_INSTALL_DIR - PHP_LIBDIR - - + + + ../../system + + \ No newline at end of file diff --git a/tests/travis/pdo/mysql.phpunit.xml b/tests/travis/pdo/mysql.phpunit.xml index 602030d4e3d..c3113a66f61 100644 --- a/tests/travis/pdo/mysql.phpunit.xml +++ b/tests/travis/pdo/mysql.phpunit.xml @@ -17,10 +17,9 @@ ../../codeigniter - - - PEAR_INSTALL_DIR - PHP_LIBDIR - - + + + ../../../system + + \ No newline at end of file diff --git a/tests/travis/pdo/pgsql.phpunit.xml b/tests/travis/pdo/pgsql.phpunit.xml index 77e1493c6e1..232025523cd 100644 --- a/tests/travis/pdo/pgsql.phpunit.xml +++ b/tests/travis/pdo/pgsql.phpunit.xml @@ -17,10 +17,9 @@ ../../codeigniter - - - PEAR_INSTALL_DIR - PHP_LIBDIR - - + + + ../../../system + + \ No newline at end of file diff --git a/tests/travis/pdo/sqlite.phpunit.xml b/tests/travis/pdo/sqlite.phpunit.xml index cdccef017be..3d1256721a4 100644 --- a/tests/travis/pdo/sqlite.phpunit.xml +++ b/tests/travis/pdo/sqlite.phpunit.xml @@ -17,10 +17,9 @@ ../../codeigniter - - - PEAR_INSTALL_DIR - PHP_LIBDIR - - + + + ../../../system + + \ No newline at end of file diff --git a/tests/travis/pgsql.phpunit.xml b/tests/travis/pgsql.phpunit.xml index dfc1bff1ce3..51e433d7610 100644 --- a/tests/travis/pgsql.phpunit.xml +++ b/tests/travis/pgsql.phpunit.xml @@ -17,10 +17,9 @@ ../codeigniter - - - PEAR_INSTALL_DIR - PHP_LIBDIR - - + + + ../../system + + \ No newline at end of file diff --git a/tests/travis/sqlite.phpunit.xml b/tests/travis/sqlite.phpunit.xml index 3223da5e797..70116573429 100644 --- a/tests/travis/sqlite.phpunit.xml +++ b/tests/travis/sqlite.phpunit.xml @@ -17,10 +17,9 @@ ../codeigniter - - - PEAR_INSTALL_DIR - PHP_LIBDIR - - + + + ../../system + + \ No newline at end of file From b2e10b7de0d8979ce19fed5859e696904e2923dd Mon Sep 17 00:00:00 2001 From: Taufan Aditya Date: Sun, 27 May 2012 15:31:53 +0700 Subject: [PATCH 1113/5397] Adding more flexibilities to mock-common --- tests/mocks/core/common.php | 167 ++++++++++++++++++++++-------------- 1 file changed, 103 insertions(+), 64 deletions(-) diff --git a/tests/mocks/core/common.php b/tests/mocks/core/common.php index fc94d7fff85..e745766266c 100644 --- a/tests/mocks/core/common.php +++ b/tests/mocks/core/common.php @@ -2,53 +2,65 @@ // Set up the global CI functions in their most minimal core representation -function &get_instance() +if ( ! function_exists('get_instance')) { - $test = CI_TestCase::instance(); - $instance = $test->ci_instance(); - return $instance; + function &get_instance() + { + $test = CI_TestCase::instance(); + $instance = $test->ci_instance(); + return $instance; + } } // -------------------------------------------------------------------- -function &get_config() { - $test = CI_TestCase::instance(); - $config = $test->ci_get_config(); - - return $config; +if ( ! function_exists('get_config')) +{ + function &get_config() { + $test = CI_TestCase::instance(); + $config = $test->ci_get_config(); + + return $config; + } } -function config_item($item) +if ( ! function_exists('config_item')) { - $config =& get_config(); - - if ( ! isset($config[$item])) + function config_item($item) { - return FALSE; + $config =& get_config(); + + if ( ! isset($config[$item])) + { + return FALSE; + } + + return $config[$item]; } - - return $config[$item]; } // -------------------------------------------------------------------- -function load_class($class, $directory = 'libraries', $prefix = 'CI_') +if ( ! function_exists('load_class')) { - if ($directory != 'core' OR $prefix != 'CI_') - { - throw new Exception('Not Implemented: Non-core load_class()'); - } - - $test = CI_TestCase::instance(); - - $obj =& $test->ci_core_class($class); - - if (is_string($obj)) + function load_class($class, $directory = 'libraries', $prefix = 'CI_') { - throw new Exception('Bad Isolation: Use ci_set_core_class to set '.$class.''); + if ($directory != 'core' OR $prefix != 'CI_') + { + throw new Exception('Not Implemented: Non-core load_class()'); + } + + $test = CI_TestCase::instance(); + + $obj =& $test->ci_core_class($class); + + if (is_string($obj)) + { + throw new Exception('Bad Isolation: Use ci_set_core_class to set '.$class.''); + } + + return $obj; } - - return $obj; } // This is sort of meh. Should probably be mocked up with @@ -57,76 +69,103 @@ function load_class($class, $directory = 'libraries', $prefix = 'CI_') // bootstrap testsuite. // -------------------------------------------------------------------- -function remove_invisible_characters($str, $url_encoded = TRUE) +if ( ! function_exists('remove_invisible_characters')) { - $non_displayables = array(); - - // every control character except newline (dec 10) - // carriage return (dec 13), and horizontal tab (dec 09) - - if ($url_encoded) + function remove_invisible_characters($str, $url_encoded = TRUE) { - $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 + $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); + do + { + $str = preg_replace($non_displayables, '', $str, -1, $count); + } + while ($count); - return $str; + return $str; + } } // Clean up error messages // -------------------------------------------------------------------- -function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') +if ( ! function_exists('show_error')) { - throw new RuntimeException('CI Error: '.$message); + function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') + { + throw new RuntimeException('CI Error: '.$message); + } } -function show_404($page = '', $log_error = TRUE) +if ( ! function_exists('show_404')) { - throw new RuntimeException('CI Error: 404'); + function show_404($page = '', $log_error = TRUE) + { + throw new RuntimeException('CI Error: 404'); + } } -function _exception_handler($severity, $message, $filepath, $line) +if ( ! function_exists('_exception_handler')) { - throw new RuntimeException('CI Exception: '.$message.' | '.$filepath.' | '.$line); + function _exception_handler($severity, $message, $filepath, $line) + { + throw new RuntimeException('CI Exception: '.$message.' | '.$filepath.' | '.$line); + } } // We assume a few things about our environment ... // -------------------------------------------------------------------- -function is_php($version = '5.0.0') +if ( ! function_exists('is_php')) { - return ! (version_compare(PHP_VERSION, $version) < 0); + function is_php($version = '5.0.0') + { + return ! (version_compare(PHP_VERSION, $version) < 0); + } } -function is_really_writable($file) +if ( ! function_exists('is_really_writable')) { - return is_writable($file); + function is_really_writable($file) + { + return is_writable($file); + } } -function is_loaded() +if ( ! function_exists('is_loaded')) { - throw new Exception('Bad Isolation: mock up environment'); + function is_loaded() + { + throw new Exception('Bad Isolation: mock up environment'); + } } -function log_message($level = 'error', $message, $php_error = FALSE) +if ( ! function_exists('log_message')) { - return TRUE; + function log_message($level = 'error', $message, $php_error = FALSE) + { + return TRUE; + } } -function set_status_header($code = 200, $text = '') +if ( ! function_exists('set_status_header')) { - return TRUE; + function set_status_header($code = 200, $text = '') + { + return TRUE; + } } // EOF \ No newline at end of file From bf50a3b15c70441a72ec3012319cd63425ba4d20 Mon Sep 17 00:00:00 2001 From: Eric Roberts Date: Sun, 27 May 2012 19:04:43 -0500 Subject: [PATCH 1114/5397] Fix issue where cache backup is ignored on first call. --- system/libraries/Cache/Cache.php | 38 ++++++++++++++------------------ 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php index ba732ee8e92..53f9f81a797 100644 --- a/system/libraries/Cache/Cache.php +++ b/system/libraries/Cache/Cache.php @@ -68,7 +68,7 @@ class CI_Cache extends CI_Driver_Library { * * @param string */ - protected $_backup_driver; + protected $_backup_driver = 'dummy'; /** * Constructor @@ -102,6 +102,22 @@ public function __construct($config = array()) $this->_backup_driver = $config['backup']; } } + + // If the specified adapter isn't available, check the backup. + if ( ! $this->is_supported($this->_adapter)) + { + if ( ! $this->is_supported($this->_backup_driver)) + { + // Backup isn't supported either. Default to 'Dummy' driver. + log_message('error', 'Cache adapter "'.$this->_adapter.'" and backup "'.$this->_backup_driver.'" are both unavailable. Cache is now using "Dummy" adapter.'); + $this->_adapter = 'dummy'; + } + else + { + // Backup is supported. Set it to primary. + $this->_adapter = $this->_backup_driver; + } + } } // ------------------------------------------------------------------------ @@ -206,26 +222,6 @@ public function is_supported($driver) return $support[$driver]; } - // ------------------------------------------------------------------------ - - /** - * __get() - * - * @param child - * @return object - */ - public function __get($child) - { - $obj = parent::__get($child); - - if ( ! $this->is_supported($child)) - { - $this->_adapter = $this->_backup_driver; - } - - return $obj; - } - } /* End of file Cache.php */ From 3cc8502b48946f7298797393cea0a7183c325244 Mon Sep 17 00:00:00 2001 From: Root Date: Sun, 27 May 2012 20:06:10 -0400 Subject: [PATCH 1115/5397] Changed to show all the errors on dev --- index.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/index.php b/index.php index 6ffe4864efa..c212cac8448 100644 --- a/index.php +++ b/index.php @@ -52,18 +52,16 @@ * By default development will show errors but testing and live will hide them. */ -// By default show all except notifications, deprecated and strict errors -error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED ^ E_STRICT); - -// Show or hide errors depending on current environment switch (ENVIRONMENT) { case 'development': + error_reporting(E_ALL); ini_set('display_errors', 1); break; case 'testing': case 'production': + error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED ^ E_STRICT); ini_set('display_errors', 0); break; From fa5a9e5f28b2ae61748bb20c2f644c3c156c3d5e Mon Sep 17 00:00:00 2001 From: madhazelnut Date: Wed, 30 May 2012 18:50:39 +0300 Subject: [PATCH 1116/5397] create_captcha() helper documentation --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a234d69690c..6e528584bea 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -40,7 +40,7 @@ Release Date: Not Released - Moved error templates to "application/views/errors" - Helpers - + - create_captcha() accepts additional colors parameter, allowing for color customization - url_title() will now trim extra dashes from beginning and end. - Added XHTML Basic 1.1 doctype to :doc:`HTML Helper `. - Changed humanize() to include a second param for the separator. From 8d021e647f6a094b6097d1ea89119a4047efc8dd Mon Sep 17 00:00:00 2001 From: Gints Murans Date: Wed, 30 May 2012 21:15:08 +0300 Subject: [PATCH 1117/5397] E_ALL -> -1 --- index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.php b/index.php index c212cac8448..a11c5c1f281 100644 --- a/index.php +++ b/index.php @@ -55,7 +55,7 @@ switch (ENVIRONMENT) { case 'development': - error_reporting(E_ALL); + error_reporting(-1); ini_set('display_errors', 1); break; From 8bbf4e09b68a4aa9beb85edbdb0bec75c7a51de6 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Thu, 31 May 2012 13:30:22 +0200 Subject: [PATCH 1118/5397] automatic list formatting was broken --- user_guide_src/source/changelog.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 6e528584bea..da3be3adbc7 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -40,6 +40,7 @@ Release Date: Not Released - Moved error templates to "application/views/errors" - Helpers + - create_captcha() accepts additional colors parameter, allowing for color customization - url_title() will now trim extra dashes from beginning and end. - Added XHTML Basic 1.1 doctype to :doc:`HTML Helper `. @@ -110,7 +111,7 @@ Release Date: Not Released - :doc:`Cart library ` changes include: - It now auto-increments quantity's instead of just resetting it, this is the default behaviour of large e-commerce sites. - Product Name strictness can be disabled via the Cart Library by switching "$product_name_safe". - - Added function remove() to remove a cart item, updating with quantity of 0 seemed like a hack but has remained to retain compatability. + - Added function remove() to remove a cart item, updating with quantity of 0 seemed like a hack but has remained to retain compatibility. - :doc:`Image Manipulation library ` changes include: - The initialize() method now only sets existing class properties. - Added support for 3-length hex color values for wm_font_color and wm_shadow_color properties, as well as validation for them. From b6e0b588522055ddffc44e63e5479309fa3b4b14 Mon Sep 17 00:00:00 2001 From: Thanasis Polychronakis Date: Mon, 14 May 2012 21:31:04 +0300 Subject: [PATCH 1119/5397] Load base config first, then environment's config --- system/core/Common.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 4b733ac9747..f468747c6b3 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -231,21 +231,21 @@ function &get_config($replace = array()) 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'; + $file_path = APPPATH.'config/config.php'; + $found = false; + if (file_exists($file_path)) { + $found = true; + require($file_path); } - // Fetch the config file - if ( ! file_exists($file_path)) + // Is the config file in the environment folder? + if (defined(ENVIRONMENT) && file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) { - set_status_header(503); + require($file_path); + } else if (!$found) { 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)) { From 8991cb85b9d9955270bdbbd96a08ba9141c5e11d Mon Sep 17 00:00:00 2001 From: Thanasis Polychronakis Date: Sun, 20 May 2012 18:44:21 +0300 Subject: [PATCH 1120/5397] Indended code to meet CI standards --- system/core/Common.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index f468747c6b3..8ed18cdae19 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -233,7 +233,8 @@ function &get_config($replace = array()) $file_path = APPPATH.'config/config.php'; $found = false; - if (file_exists($file_path)) { + if (file_exists($file_path)) + { $found = true; require($file_path); } @@ -242,7 +243,10 @@ function &get_config($replace = array()) if (defined(ENVIRONMENT) && file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) { require($file_path); - } else if (!$found) { + } + else if (!$found) + { + set_status_header(503); exit('The configuration file does not exist.'); } From 142eef9c0024420fdc1442eafe8e5cdd357451bb Mon Sep 17 00:00:00 2001 From: Thanasis Polychronakis Date: Mon, 21 May 2012 14:38:22 +0300 Subject: [PATCH 1121/5397] Edit to meet CI coding standards --- system/core/Common.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 8ed18cdae19..159cc0d2b51 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -232,10 +232,10 @@ function &get_config($replace = array()) } $file_path = APPPATH.'config/config.php'; - $found = false; + $found = FALSE; if (file_exists($file_path)) { - $found = true; + $found = TRUE; require($file_path); } @@ -244,7 +244,7 @@ function &get_config($replace = array()) { require($file_path); } - else if (!$found) + elseif ( ! $found) { set_status_header(503); exit('The configuration file does not exist.'); From 991cfa2e5843df05c6295445133882b9f35e3f7b Mon Sep 17 00:00:00 2001 From: Thanasis Polychronakis Date: Thu, 31 May 2012 21:54:35 +0300 Subject: [PATCH 1122/5397] Changed documentation and added note to changelog as per @philsturgeon request --- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/libraries/config.rst | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index da3be3adbc7..3989b52d2c3 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -38,6 +38,7 @@ Release Date: Not Released - Added some more doctypes. - Updated all classes to be written in PHP 5 style, with visibility declarations and no ``var`` usage for properties. - Moved error templates to "application/views/errors" + - Global config files are loaded first, then environment ones. Environment config keys overwrite base ones, allowing to only set the keys we want changed per Env. - Helpers diff --git a/user_guide_src/source/libraries/config.rst b/user_guide_src/source/libraries/config.rst index c81cad7b3aa..08d9c290582 100644 --- a/user_guide_src/source/libraries/config.rst +++ b/user_guide_src/source/libraries/config.rst @@ -149,11 +149,13 @@ folders: - Your own custom configuration files .. note:: - CodeIgniter always tries to load the configuration files for - the current environment first. If the file does not exist, the global - config file (i.e., the one in application/config/) is loaded. This means - you are not obligated to place **all** of your configuration files in an - environment folder − only the files that change per environment. + CodeIgniter always loads the global config file first (i.e., the one in application/config/), + then tries to load the configuration files for the current environment. + This means you are not obligated to place **all** of your configuration files in an + environment folder. Only the files that change per environment. Additionally you don't + have to copy **all** the config items in the environment config file. Only the config items + that you wish to change for your environment. The config items declared in your environment + folders always overwrite those in your global config files. Helper Functions ================ From bfc1cad4fbf6d6640d782f39169af6c3799fa3e8 Mon Sep 17 00:00:00 2001 From: Mickey Wu Date: Thu, 31 May 2012 22:28:40 -0700 Subject: [PATCH 1123/5397] Made set_header() public in Email library and updated documentation. --- system/libraries/Email.php | 32 +++++++++++------------ user_guide_src/source/libraries/email.rst | 8 ++++++ 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 56d60c80219..07a0dd584b3 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -166,8 +166,8 @@ public function clear($clear_attachments = FALSE) $this->_headers = array(); $this->_debug_msg = array(); - $this->_set_header('User-Agent', $this->useragent); - $this->_set_header('Date', $this->_set_date()); + $this->set_header('User-Agent', $this->useragent); + $this->set_header('Date', $this->_set_date()); if ($clear_attachments !== FALSE) { @@ -215,8 +215,8 @@ public function from($from, $name = '') } } - $this->_set_header('From', $name.' <'.$from.'>'); - $this->_set_header('Return-Path', '<'.$from.'>'); + $this->set_header('From', $name.' <'.$from.'>'); + $this->set_header('Return-Path', '<'.$from.'>'); return $this; } @@ -252,7 +252,7 @@ public function reply_to($replyto, $name = '') $name = '"'.$name.'"'; } - $this->_set_header('Reply-To', $name.' <'.$replyto.'>'); + $this->set_header('Reply-To', $name.' <'.$replyto.'>'); $this->_replyto_flag = TRUE; return $this; @@ -278,7 +278,7 @@ public function to($to) if ($this->_get_protocol() !== 'mail') { - $this->_set_header('To', implode(', ', $to)); + $this->set_header('To', implode(', ', $to)); } switch ($this->_get_protocol()) @@ -312,7 +312,7 @@ public function cc($cc) $this->validate_email($cc); } - $this->_set_header('Cc', implode(', ', $cc)); + $this->set_header('Cc', implode(', ', $cc)); if ($this->_get_protocol() === 'smtp') { @@ -352,7 +352,7 @@ public function bcc($bcc, $limit = '') } else { - $this->_set_header('Bcc', implode(', ', $bcc)); + $this->set_header('Bcc', implode(', ', $bcc)); } return $this; @@ -369,7 +369,7 @@ public function bcc($bcc, $limit = '') public function subject($subject) { $subject = $this->_prep_q_encoding($subject); - $this->_set_header('Subject', $subject); + $this->set_header('Subject', $subject); return $this; } @@ -424,7 +424,7 @@ public function attach($filename, $disposition = '', $newname = NULL, $mime = '' * @param string * @return void */ - protected function _set_header($header, $value) + public function set_header($header, $value) { $this->_headers[$header] = $value; } @@ -867,11 +867,11 @@ public function word_wrap($str, $charlim = '') */ protected function _build_headers() { - $this->_set_header('X-Sender', $this->clean_email($this->_headers['From'])); - $this->_set_header('X-Mailer', $this->useragent); - $this->_set_header('X-Priority', $this->_priorities[$this->priority - 1]); - $this->_set_header('Message-ID', $this->_get_message_id()); - $this->_set_header('Mime-Version', '1.0'); + $this->set_header('X-Sender', $this->clean_email($this->_headers['From'])); + $this->set_header('X-Mailer', $this->useragent); + $this->set_header('X-Priority', $this->_priorities[$this->priority - 1]); + $this->set_header('Message-ID', $this->_get_message_id()); + $this->set_header('Mime-Version', '1.0'); } // -------------------------------------------------------------------- @@ -1305,7 +1305,7 @@ public function batch_bcc_send() if ($this->protocol !== 'smtp') { - $this->_set_header('Bcc', implode(', ', $bcc)); + $this->set_header('Bcc', implode(', ', $bcc)); } else { diff --git a/user_guide_src/source/libraries/email.rst b/user_guide_src/source/libraries/email.rst index daf000907dc..f99eb91df15 100644 --- a/user_guide_src/source/libraries/email.rst +++ b/user_guide_src/source/libraries/email.rst @@ -182,6 +182,14 @@ formatting which is added to the header string for people who do not accept HTML email. If you do not set your own message CodeIgniter will extract the message from your HTML email and strip the tags. +$this->email->set_header() +----------------------- + +Appends additional headers to the e-mail:: + + $this->email->set_header('Header1', 'Value1'); + $this->email->set_header('Header2', 'Value2'); + $this->email->clear() --------------------- From 2e757d844caede9784da0b30faa7d5c405c6b172 Mon Sep 17 00:00:00 2001 From: Mickey Wu Date: Fri, 1 Jun 2012 10:24:22 -0700 Subject: [PATCH 1124/5397] Update user_guide_src/source/changelog.rst --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index da3be3adbc7..13482d8265c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -132,6 +132,7 @@ Release Date: Not Released - Allowed for setting table class defaults in a config file. - Added a Wincache driver to the :doc:`Caching Library `. - Added dsn (delivery status notification) option to the :doc:`Email Library `. + - Enabled public access to Email library's set_header() for adding additional headers to e-mails. - Core From ed944a3c70a0bad158cd5a6ca5ce1f2e717aff5d Mon Sep 17 00:00:00 2001 From: Alex Bilbie Date: Sat, 2 Jun 2012 11:07:47 +0100 Subject: [PATCH 1125/5397] Replaced `==` with `===` and `!=` with `!==` in /system/core --- system/core/Benchmark.php | 2 +- system/core/CodeIgniter.php | 4 ++-- system/core/Common.php | 14 +++++++------- system/core/Config.php | 14 +++++++------- system/core/Hooks.php | 2 +- system/core/Input.php | 18 +++++++++--------- system/core/Lang.php | 14 +++++++------- system/core/Loader.php | 26 +++++++++++++------------- system/core/Output.php | 14 +++++++------- system/core/Router.php | 8 ++++---- system/core/Security.php | 8 ++++---- system/core/URI.php | 14 +++++++------- system/core/Utf8.php | 2 +- 13 files changed, 70 insertions(+), 70 deletions(-) diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php index bb630f40b91..2fabdf46e98 100755 --- a/system/core/Benchmark.php +++ b/system/core/Benchmark.php @@ -79,7 +79,7 @@ public function mark($name) */ public function elapsed_time($point1 = '', $point2 = '', $decimals = 4) { - if ($point1 == '') + if ($point1 === '') { return '{elapsed_time}'; } diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index c8245fcfa3f..182f17ab388 100755 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -94,7 +94,7 @@ * Note: Since the config file data is cached it doesn't * hurt to load it here. */ - if (isset($assign_to_config['subclass_prefix']) && $assign_to_config['subclass_prefix'] != '') + if (isset($assign_to_config['subclass_prefix']) && $assign_to_config['subclass_prefix'] !== '') { get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix'])); } @@ -182,7 +182,7 @@ * ------------------------------------------------------ */ if ($EXT->call_hook('cache_override') === FALSE - && $OUT->_display_cache($CFG, $URI) == TRUE) + && $OUT->_display_cache($CFG, $URI) === TRUE) { exit; } diff --git a/system/core/Common.php b/system/core/Common.php index 159cc0d2b51..a773c4f2069 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -200,7 +200,7 @@ function &is_loaded($class = '') { static $_is_loaded = array(); - if ($class != '') + if ($class !== '') { $_is_loaded[strtolower($class)] = $class; } @@ -370,7 +370,7 @@ function log_message($level = 'error', $message, $php_error = FALSE) { static $_log; - if (config_item('log_threshold') == 0) + if (config_item('log_threshold') === 0) { return; } @@ -436,17 +436,17 @@ function set_status_header($code = 200, $text = '') 505 => 'HTTP Version Not Supported' ); - if ($code == '' OR ! is_numeric($code)) + if ($code === '' OR ! is_numeric($code)) { show_error('Status codes must be numeric', 500); } - if (isset($stati[$code]) && $text == '') + if (isset($stati[$code]) && $text === '') { $text = $stati[$code]; } - if ($text == '') + if ($text === '') { show_error('No status text available. Please check your status code number or supply your own message text.', 500); } @@ -495,13 +495,13 @@ function _exception_handler($severity, $message, $filepath, $line) // 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) + 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) + if (config_item('log_threshold') === 0) { return; } diff --git a/system/core/Config.php b/system/core/Config.php index c07ffa5913a..0e5fa526572 100755 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -100,7 +100,7 @@ public function __construct() */ public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) { - $file = ($file == '') ? 'config' : str_replace('.php', '', $file); + $file = ($file === '') ? 'config' : str_replace('.php', '', $file); $found = $loaded = FALSE; foreach ($this->_config_paths as $path) @@ -189,7 +189,7 @@ public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE */ public function item($item, $index = '') { - if ($index == '') + if ($index === '') { return isset($this->config[$item]) ? $this->config[$item] : FALSE; } @@ -211,7 +211,7 @@ public function slash_item($item) { return FALSE; } - elseif (trim($this->config[$item]) == '') + elseif (trim($this->config[$item]) === '') { return ''; } @@ -230,14 +230,14 @@ public function slash_item($item) */ public function site_url($uri = '') { - if ($uri == '') + if ($uri === '') { return $this->slash_item('base_url').$this->item('index_page'); } - if ($this->item('enable_query_strings') == FALSE) + if ($this->item('enable_query_strings') === FALSE) { - $suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix'); + $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 @@ -270,7 +270,7 @@ public function base_url($uri = '') */ protected function _uri_string($uri) { - if ($this->item('enable_query_strings') == FALSE) + if ($this->item('enable_query_strings') === FALSE) { if (is_array($uri)) { diff --git a/system/core/Hooks.php b/system/core/Hooks.php index 5bbb0009a01..29fd88201da 100755 --- a/system/core/Hooks.php +++ b/system/core/Hooks.php @@ -72,7 +72,7 @@ public function __construct() // If hooks are not enabled in the config file // there is nothing else to do - if ($CFG->item('enable_hooks') == FALSE) + if ($CFG->item('enable_hooks') === FALSE) { return; } diff --git a/system/core/Input.php b/system/core/Input.php index 97be9e69002..284b1569778 100755 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -263,23 +263,23 @@ public function set_cookie($name = '', $value = '', $expire = '', $domain = '', } } - if ($prefix == '' && config_item('cookie_prefix') != '') + if ($prefix === '' && config_item('cookie_prefix') !== '') { $prefix = config_item('cookie_prefix'); } - if ($domain == '' && config_item('cookie_domain') != '') + if ($domain === '' && config_item('cookie_domain') !== '') { $domain = config_item('cookie_domain'); } - if ($path == '/' && config_item('cookie_path') !== '/') + if ($path === '/' && config_item('cookie_path') !== '/') { $path = config_item('cookie_path'); } - if ($secure == FALSE && config_item('cookie_secure') != FALSE) + if ($secure === FALSE && config_item('cookie_secure') !== FALSE) { $secure = config_item('cookie_secure'); } - if ($httponly == FALSE && config_item('cookie_httponly') != FALSE) + if ($httponly === FALSE && config_item('cookie_httponly') !== FALSE) { $httponly = config_item('cookie_httponly'); } @@ -324,7 +324,7 @@ public function ip_address() return $this->ip_address; } - if (config_item('proxy_ips') != '' && $this->server('HTTP_X_FORWARDED_FOR') && $this->server('REMOTE_ADDR')) + if (config_item('proxy_ips') !== '' && $this->server('HTTP_X_FORWARDED_FOR') && $this->server('REMOTE_ADDR')) { $proxies = preg_split('/[\s,]/', config_item('proxy_ips'), -1, PREG_SPLIT_NO_EMPTY); $proxies = is_array($proxies) ? $proxies : array($proxies); @@ -459,7 +459,7 @@ protected function _sanitize_globals() } // Is $_GET data allowed? If not we'll set the $_GET to an empty array - if ($this->_allow_get_array == FALSE) + if ($this->_allow_get_array === FALSE) { $_GET = array(); } @@ -502,7 +502,7 @@ protected function _sanitize_globals() $_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); // CSRF Protection check - if ($this->_enable_csrf == TRUE) + if ($this->_enable_csrf === TRUE) { $this->security->csrf_verify(); } @@ -559,7 +559,7 @@ protected function _clean_input_data($str) } // Standardize newlines if needed - if ($this->_standardize_newlines == TRUE && strpos($str, "\r") !== FALSE) + if ($this->_standardize_newlines === TRUE && strpos($str, "\r") !== FALSE) { return str_replace(array("\r\n", "\r", "\r\n\n"), PHP_EOL, $str); } diff --git a/system/core/Lang.php b/system/core/Lang.php index 73c9127acc9..3001f1b13d4 100755 --- a/system/core/Lang.php +++ b/system/core/Lang.php @@ -76,26 +76,26 @@ public function load($langfile, $idiom = '', $return = FALSE, $add_suffix = TRUE { $langfile = str_replace('.php', '', $langfile); - if ($add_suffix == TRUE) + if ($add_suffix === TRUE) { $langfile = str_replace('_lang', '', $langfile).'_lang'; } $langfile .= '.php'; - if ($idiom == '') + if ($idiom === '') { $config =& get_config(); $idiom = ( ! empty($config['language'])) ? $config['language'] : 'english'; } - if ($return == FALSE && isset($this->is_loaded[$langfile]) && $this->is_loaded[$langfile] === $idiom) + if ($return === FALSE && isset($this->is_loaded[$langfile]) && $this->is_loaded[$langfile] === $idiom) { return; } // Determine where the language file is and load it - if ($alt_path != '' && file_exists($alt_path.'language/'.$idiom.'/'.$langfile)) + if ($alt_path !== '' && file_exists($alt_path.'language/'.$idiom.'/'.$langfile)) { include($alt_path.'language/'.$idiom.'/'.$langfile); } @@ -124,14 +124,14 @@ public function load($langfile, $idiom = '', $return = FALSE, $add_suffix = TRUE { log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile); - if ($return == TRUE) + if ($return === TRUE) { return array(); } return; } - if ($return == TRUE) + if ($return === TRUE) { return $lang; } @@ -153,7 +153,7 @@ public function load($langfile, $idiom = '', $return = FALSE, $add_suffix = TRUE */ public function line($line = '') { - $value = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line]; + $value = ($line === '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line]; // Because killer robots like unicorns! if ($value === FALSE) diff --git a/system/core/Loader.php b/system/core/Loader.php index 3eb09e6ab60..adfe92845be 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -208,7 +208,7 @@ public function library($library = '', $params = NULL, $object_name = NULL) return; } - if ($library == '' OR isset($this->_base_classes[$library])) + if ($library === '' OR isset($this->_base_classes[$library])) { return FALSE; } @@ -244,7 +244,7 @@ public function model($model, $name = '', $db_conn = FALSE) return; } - if ($model == '') + if ($model === '') { return; } @@ -261,7 +261,7 @@ public function model($model, $name = '', $db_conn = FALSE) $model = substr($model, $last_slash); } - if ($name == '') + if ($name === '') { $name = $model; } @@ -329,7 +329,7 @@ public function database($params = '', $return = FALSE, $query_builder = NULL) $CI =& get_instance(); // Do we even need to load the database class? - if (class_exists('CI_DB') && $return == FALSE && $query_builder == NULL && isset($CI->db) && is_object($CI->db)) + if (class_exists('CI_DB') && $return === FALSE && $query_builder === NULL && isset($CI->db) && is_object($CI->db)) { return FALSE; } @@ -452,7 +452,7 @@ public function file($path, $return = FALSE) */ public function vars($vars = array(), $val = '') { - if ($val != '' && is_string($vars)) + if ($val !== '' && is_string($vars)) { $vars = array($vars => $val); } @@ -642,7 +642,7 @@ public function driver($library = '', $params = NULL, $object_name = NULL) require BASEPATH.'libraries/Driver.php'; } - if ($library == '') + if ($library === '') { return FALSE; } @@ -714,7 +714,7 @@ public function remove_package_path($path = '', $remove_config_path = TRUE) { $config =& $this->_ci_get_component('config'); - if ($path == '') + if ($path === '') { array_shift($this->_ci_library_paths); array_shift($this->_ci_model_paths); @@ -775,7 +775,7 @@ protected function _ci_load($_ci_data) $file_exists = FALSE; // Set the path to the requested file - if ($_ci_path != '') + if ($_ci_path !== '') { $_ci_x = explode('/', $_ci_path); $_ci_file = end($_ci_x); @@ -783,7 +783,7 @@ protected function _ci_load($_ci_data) else { $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION); - $_ci_file = ($_ci_ext == '') ? $_ci_view.'.php' : $_ci_view; + $_ci_file = ($_ci_ext === '') ? $_ci_view.'.php' : $_ci_view; foreach ($this->_ci_view_paths as $view_file => $cascade) { @@ -847,7 +847,7 @@ protected function _ci_load($_ci_data) // If the PHP installation does not support short tags we'll // do a little string replacement, changing the short tags // to standard PHP echo statements. - if ( ! is_php('5.4') && (bool) @ini_get('short_open_tag') === FALSE && config_item('rewrite_short_tags') == TRUE) + if ( ! is_php('5.4') && (bool) @ini_get('short_open_tag') === FALSE && config_item('rewrite_short_tags') === TRUE) { echo eval('?>'.preg_replace('/;*\s*\?>/', '; ?>', str_replace('_ci_load_class($path, $params); @@ -1008,7 +1008,7 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL) // If we got this far we were unable to find the requested class. // We do not issue errors if the load call failed due to a duplicate request - if ($is_duplicate == FALSE) + if ($is_duplicate === FALSE) { log_message('error', 'Unable to load the requested class: '.$class); show_error('Unable to load the requested class: '.$class); @@ -1067,7 +1067,7 @@ protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object } } - if ($prefix == '') + if ($prefix === '') { if (class_exists('CI_'.$class)) { diff --git a/system/core/Output.php b/system/core/Output.php index c8feb4e67fe..496948ab7d4 100755 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -160,7 +160,7 @@ public function set_output($output) */ public function append_output($output) { - if ($this->final_output == '') + if ($this->final_output === '') { $this->final_output = $output; } @@ -192,7 +192,7 @@ public function set_header($header, $replace = TRUE) // 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) + if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) === 0) { return; } @@ -349,7 +349,7 @@ public function _display($output = '') // -------------------------------------------------------------------- // Set the output data - if ($output == '') + if ($output === '') { $output =& $this->final_output; } @@ -381,7 +381,7 @@ public function _display($output = '') // -------------------------------------------------------------------- // Is compression requested? - if ($CFG->item('compress_output') === TRUE && $this->_zlib_oc == FALSE + if ($CFG->item('compress_output') === TRUE && $this->_zlib_oc === FALSE && extension_loaded('zlib') && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) { @@ -416,7 +416,7 @@ public function _display($output = '') // Do we need to generate profile data? // If so, load the Profile class and run it. - if ($this->enable_profiler == TRUE) + if ($this->enable_profiler === TRUE) { $CI->load->library('profiler'); if ( ! empty($this->_profiler_sections)) @@ -460,7 +460,7 @@ public function _write_cache($output) { $CI =& get_instance(); $path = $CI->config->item('cache_path'); - $cache_path = ($path == '') ? APPPATH.'cache/' : $path; + $cache_path = ($path === '') ? APPPATH.'cache/' : $path; if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path)) { @@ -509,7 +509,7 @@ public function _write_cache($output) */ public function _display_cache(&$CFG, &$URI) { - $cache_path = ($CFG->item('cache_path') == '') ? APPPATH.'cache/' : $CFG->item('cache_path'); + $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; diff --git a/system/core/Router.php b/system/core/Router.php index 5ea13797b7c..93875bdd983 100755 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -165,7 +165,7 @@ public function _set_routing() $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 == '') + if ($this->uri->uri_string === '') { return $this->_set_default_controller(); } @@ -435,7 +435,7 @@ public function set_method($method) */ public function fetch_method() { - return ($this->method == $this->fetch_class()) ? 'index' : $this->method; + return ($this->method === $this->fetch_class()) ? 'index' : $this->method; } // -------------------------------------------------------------------- @@ -483,14 +483,14 @@ public function _set_overrides($routing) $this->set_directory($routing['directory']); } - if (isset($routing['controller']) && $routing['controller'] != '') + if (isset($routing['controller']) && $routing['controller'] !== '') { $this->set_class($routing['controller']); } if (isset($routing['function'])) { - $routing['function'] = ($routing['function'] == '') ? 'index' : $routing['function']; + $routing['function'] = ($routing['function'] === '') ? 'index' : $routing['function']; $this->set_method($routing['function']); } } diff --git a/system/core/Security.php b/system/core/Security.php index 9b7ba57991b..9cbcd92486c 100755 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -162,7 +162,7 @@ public function csrf_verify() // Do the tokens exist in both the _POST and _COOKIE arrays? if ( ! isset($_POST[$this->_csrf_token_name]) OR ! isset($_COOKIE[$this->_csrf_cookie_name]) - OR $_POST[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name]) // Do the tokens match? + OR $_POST[$this->_csrf_token_name] !== $_COOKIE[$this->_csrf_cookie_name]) // Do the tokens match? { $this->csrf_show_error(); } @@ -408,7 +408,7 @@ public function xss_clean($str, $is_image = FALSE) $str = preg_replace('#<(/*)(script|xss)(.*?)\>#si', '[removed]', $str); } } - while($original != $str); + while($original !== $str); unset($original); @@ -475,7 +475,7 @@ public function xss_clean($str, $is_image = FALSE) */ public function xss_hash() { - if ($this->_xss_hash == '') + if ($this->_xss_hash === '') { mt_srand(); $this->_xss_hash = md5(time() + mt_rand(0, 1999999999)); @@ -825,7 +825,7 @@ protected function _do_never_allowed($str) */ protected function _csrf_set_hash() { - if ($this->_csrf_hash == '') + if ($this->_csrf_hash === '') { // If the cookie exists we will use it's value. // We don't necessarily want to regenerate it with diff --git a/system/core/URI.php b/system/core/URI.php index a9432e05d13..9c5025128f8 100755 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -112,7 +112,7 @@ public function _fetch_uri_string() // 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) + if (trim($path, '/') !== '' && $path !== '/'.SELF) { $this->_set_uri_string($path); return; @@ -120,14 +120,14 @@ public function _fetch_uri_string() // No PATH_INFO?... What about QUERY_STRING? $path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); - if (trim($path, '/') != '') + 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), '/') != '') + if (is_array($_GET) && count($_GET) === 1 && trim(key($_GET), '/') !== '') { $this->_set_uri_string(key($_GET)); return; @@ -218,7 +218,7 @@ protected function _detect_uri() $_GET = array(); } - if ($uri == '/' OR empty($uri)) + if ($uri === '/' OR empty($uri)) { return '/'; } @@ -270,7 +270,7 @@ protected function _parse_cli_args() */ public function _filter_uri($str) { - if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE) + 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 @@ -298,7 +298,7 @@ public function _filter_uri($str) */ public function _remove_url_suffix() { - if ($this->config->item('url_suffix') != '') + if ($this->config->item('url_suffix') !== '') { $this->uri_string = preg_replace('|'.preg_quote($this->config->item('url_suffix')).'$|', '', $this->uri_string); } @@ -321,7 +321,7 @@ public function _explode_segments() // Filter segments for security $val = trim($this->_filter_uri($val)); - if ($val != '') + if ($val !== '') { $this->segments[] = $val; } diff --git a/system/core/Utf8.php b/system/core/Utf8.php index a6faa84ec2d..2b5a1f5ebd8 100644 --- a/system/core/Utf8.php +++ b/system/core/Utf8.php @@ -54,7 +54,7 @@ public function __construct() if ( @preg_match('/./u', 'é') === 1 // PCRE must support UTF-8 && function_exists('iconv') // iconv must be installed - && @ini_get('mbstring.func_overload') != 1 // Multibyte string function overloading cannot be enabled + && @ini_get('mbstring.func_overload') !== 1 // Multibyte string function overloading cannot be enabled && $CFG->item('charset') === 'UTF-8' // Application charset must be UTF-8 ) { From 48a2baf0e288accd206f5da5031d29076e130792 Mon Sep 17 00:00:00 2001 From: Alex Bilbie Date: Sat, 2 Jun 2012 11:09:54 +0100 Subject: [PATCH 1126/5397] Replaced `==` with `===` and `!=` with `!==` in /system/database --- system/database/DB.php | 10 ++-- system/database/DB_cache.php | 20 +++---- system/database/DB_driver.php | 50 ++++++++-------- system/database/DB_forge.php | 22 +++---- system/database/DB_query_builder.php | 60 +++++++++---------- system/database/DB_result.php | 14 ++--- system/database/DB_utility.php | 4 +- .../database/drivers/cubrid/cubrid_driver.php | 10 ++-- .../database/drivers/cubrid/cubrid_forge.php | 2 +- .../drivers/interbase/interbase_driver.php | 2 +- .../drivers/interbase/interbase_forge.php | 4 +- .../database/drivers/mssql/mssql_driver.php | 6 +- system/database/drivers/mssql/mssql_forge.php | 6 +- .../database/drivers/mysql/mysql_driver.php | 12 ++-- system/database/drivers/mysql/mysql_forge.php | 2 +- .../database/drivers/mysql/mysql_utility.php | 8 +-- .../database/drivers/mysqli/mysqli_driver.php | 14 ++--- .../database/drivers/mysqli/mysqli_forge.php | 2 +- system/database/drivers/oci8/oci8_driver.php | 6 +- system/database/drivers/oci8/oci8_forge.php | 4 +- system/database/drivers/odbc/odbc_driver.php | 4 +- system/database/drivers/odbc/odbc_forge.php | 6 +- system/database/drivers/pdo/pdo_driver.php | 22 +++---- system/database/drivers/pdo/pdo_forge.php | 8 +-- .../drivers/postgre/postgre_driver.php | 14 ++--- .../drivers/postgre/postgre_forge.php | 2 +- .../database/drivers/sqlite/sqlite_driver.php | 4 +- .../database/drivers/sqlite/sqlite_forge.php | 6 +- .../drivers/sqlite3/sqlite3_driver.php | 2 +- .../drivers/sqlite3/sqlite3_forge.php | 2 +- .../database/drivers/sqlsrv/sqlsrv_forge.php | 6 +- 31 files changed, 167 insertions(+), 167 deletions(-) diff --git a/system/database/DB.php b/system/database/DB.php index 1fe44c0e522..b0113b6f4bb 100755 --- a/system/database/DB.php +++ b/system/database/DB.php @@ -53,7 +53,7 @@ function &DB($params = '', $query_builder_override = NULL) show_error('No database connection settings were found in the database config file.'); } - if ($params != '') + if ($params !== '') { $active_group = $params; } @@ -106,7 +106,7 @@ function &DB($params = '', $query_builder_override = NULL) } // No DB specified yet? Beat them senseless... - if ( ! isset($params['dbdriver']) OR $params['dbdriver'] == '') + if ( ! isset($params['dbdriver']) OR $params['dbdriver'] === '') { show_error('You have not selected a database type to connect to.'); } @@ -128,7 +128,7 @@ function &DB($params = '', $query_builder_override = NULL) require_once(BASEPATH.'database/DB_driver.php'); - if ( ! isset($query_builder) OR $query_builder == TRUE) + if ( ! isset($query_builder) OR $query_builder === TRUE) { require_once(BASEPATH.'database/DB_query_builder.php'); if ( ! class_exists('CI_DB')) @@ -152,12 +152,12 @@ class CI_DB extends CI_DB_driver { } $driver = 'CI_DB_'.$params['dbdriver'].'_driver'; $DB = new $driver($params); - if ($DB->autoinit == TRUE) + if ($DB->autoinit === TRUE) { $DB->initialize(); } - if (isset($params['stricton']) && $params['stricton'] == TRUE) + if (isset($params['stricton']) && $params['stricton'] === TRUE) { $DB->query('SET SESSION sql_mode="STRICT_ALL_TABLES"'); } diff --git a/system/database/DB_cache.php b/system/database/DB_cache.php index ff942856b7a..443bbce5fb3 100644 --- a/system/database/DB_cache.php +++ b/system/database/DB_cache.php @@ -55,9 +55,9 @@ public function __construct(&$db) */ public function check_path($path = '') { - if ($path == '') + if ($path === '') { - if ($this->db->cachedir == '') + if ($this->db->cachedir === '') { return $this->db->cache_off(); } @@ -95,8 +95,8 @@ public function read($sql) 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); + $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))) @@ -121,8 +121,8 @@ public function write($sql, $object) 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); + $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); @@ -154,14 +154,14 @@ public function write($sql, $object) */ public function delete($segment_one = '', $segment_two = '') { - if ($segment_one == '') + if ($segment_one === '') { - $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); + $segment_one = ($this->CI->uri->segment(1) === FALSE) ? 'default' : $this->CI->uri->segment(1); } - if ($segment_two == '') + if ($segment_two === '') { - $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); + $segment_two = ($this->CI->uri->segment(2) === FALSE) ? 'index' : $this->CI->uri->segment(2); } $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index bbb7b7a802e..39c19cdf7f6 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -113,7 +113,7 @@ public function initialize() // ---------------------------------------------------------------- // Connect to the database and set the connection ID - $this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect(); + $this->conn_id = ($this->pconnect === FALSE) ? $this->db_connect() : $this->db_pconnect(); // No connection resource? Check if there is a failover else throw an error if ( ! $this->conn_id) @@ -131,7 +131,7 @@ public function initialize() } // Try to connect - $this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect(); + $this->conn_id = ($this->pconnect === FALSE) ? $this->db_connect() : $this->db_pconnect(); // If a connection is made break the foreach loop if ($this->conn_id) @@ -297,7 +297,7 @@ protected function _version() */ public function query($sql, $binds = FALSE, $return_object = TRUE) { - if ($sql == '') + if ($sql === '') { log_message('error', 'Invalid query: '.$sql); @@ -305,7 +305,7 @@ public function query($sql, $binds = FALSE, $return_object = TRUE) } // Verify table prefix and replace if necessary - if ($this->dbprefix != '' && $this->swap_pre != '' && $this->dbprefix != $this->swap_pre) + if ($this->dbprefix !== '' && $this->swap_pre !== '' && $this->dbprefix !== $this->swap_pre) { $sql = preg_replace('/(\W)'.$this->swap_pre.'(\S+?)/', '\\1'.$this->dbprefix.'\\2', $sql); } @@ -319,7 +319,7 @@ public function query($sql, $binds = FALSE, $return_object = TRUE) // Is query caching enabled? If the query is a "read type" // we will load the caching class and return the previously // cached query if it exists - if ($this->cache_on == TRUE && stripos($sql, 'SELECT') !== FALSE && $this->_cache_init()) + if ($this->cache_on === TRUE && stripos($sql, 'SELECT') !== FALSE && $this->_cache_init()) { $this->load_rdriver(); if (FALSE !== ($cache = $this->CACHE->read($sql))) @@ -329,7 +329,7 @@ public function query($sql, $binds = FALSE, $return_object = TRUE) } // Save the query for debugging - if ($this->save_queries == TRUE) + if ($this->save_queries === TRUE) { $this->queries[] = $sql; } @@ -340,7 +340,7 @@ public function query($sql, $binds = FALSE, $return_object = TRUE) // Run the Query if (FALSE === ($this->result_id = $this->simple_query($sql))) { - if ($this->save_queries == TRUE) + if ($this->save_queries === TRUE) { $this->query_times[] = 0; } @@ -373,7 +373,7 @@ public function query($sql, $binds = FALSE, $return_object = TRUE) $time_end = microtime(TRUE); $this->benchmark += $time_end - $time_start; - if ($this->save_queries == TRUE) + if ($this->save_queries === TRUE) { $this->query_times[] = $time_end - $time_start; } @@ -387,7 +387,7 @@ public function query($sql, $binds = FALSE, $return_object = TRUE) { // If caching is enabled we'll auto-cleanup any // existing files related to this particular URI - if ($this->cache_on == TRUE && $this->cache_autodel == TRUE && $this->_cache_init()) + if ($this->cache_on === TRUE && $this->cache_autodel === TRUE && $this->_cache_init()) { $this->CACHE->delete(); } @@ -409,7 +409,7 @@ public function query($sql, $binds = FALSE, $return_object = TRUE) // Is query caching enabled? If so, we'll serialize the // result object and save it to a cache file. - if ($this->cache_on == TRUE && $this->_cache_init()) + if ($this->cache_on === TRUE && $this->_cache_init()) { // We'll create a new instance of the result object // only without the platform specific driver since @@ -752,13 +752,13 @@ public function primary($table = '') */ public function count_all($table = '') { - if ($table == '') + if ($table === '') { return 0; } $query = $this->query($this->_count_string.$this->escape_identifiers('numrows').' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE)); - if ($query->num_rows() == 0) + if ($query->num_rows() === 0) { return 0; } @@ -850,7 +850,7 @@ public function list_fields($table = '') return $this->data_cache['field_names'][$table]; } - if ($table == '') + if ($table === '') { return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE; } @@ -918,7 +918,7 @@ public function field_exists($field_name, $table_name) */ public function field_data($table = '') { - if ($table == '') + if ($table === '') { return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE; } @@ -939,7 +939,7 @@ public function field_data($table = '') */ public function escape_identifiers($item) { - if ($this->_escape_char == '') + if ($this->_escape_char === '') { return $item; } @@ -998,7 +998,7 @@ public function insert_string($table, $data) */ public function update_string($table, $data, $where) { - if ($where == '') + if ($where === '') { return FALSE; } @@ -1018,7 +1018,7 @@ public function update_string($table, $data, $where) $dest = array(); foreach ($where as $key => $val) { - $prefix = (count($dest) == 0) ? '' : ' AND '; + $prefix = (count($dest) === 0) ? '' : ' AND '; $key = $this->protect_identifiers($key); if ($val !== '') @@ -1062,7 +1062,7 @@ protected function _has_operator($str) */ public function call_function($function) { - $driver = ($this->dbdriver == 'postgre') ? 'pg_' : $this->dbdriver.'_'; + $driver = ($this->dbdriver === 'postgre') ? 'pg_' : $this->dbdriver.'_'; if (FALSE === strpos($driver, $function)) { @@ -1217,7 +1217,7 @@ public function display_error($error = '', $swap = '', $native = FALSE) $heading = $LANG->line('db_error_heading'); - if ($native == TRUE) + if ($native === TRUE) { $message = (array) $error; } @@ -1345,7 +1345,7 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden } // Is there a table prefix defined in the config file? If not, no need to do anything - if ($this->dbprefix != '') + if ($this->dbprefix !== '') { // We now add the table prefix based on some logic. // Do we have 4 segments (hostname.database.table.column)? @@ -1369,13 +1369,13 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden // This flag is set when the supplied $item does not contain a field name. // This can happen when this function is being called from a JOIN. - if ($field_exists == FALSE) + if ($field_exists === FALSE) { $i++; } // Verify table prefix and replace if necessary - if ($this->swap_pre != '' && strpos($parts[$i], $this->swap_pre) === 0) + if ($this->swap_pre !== '' && strpos($parts[$i], $this->swap_pre) === 0) { $parts[$i] = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $parts[$i]); } @@ -1398,15 +1398,15 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden } // Is there a table prefix? If not, no need to insert it - if ($this->dbprefix != '') + if ($this->dbprefix !== '') { // Verify table prefix and replace if necessary - if ($this->swap_pre != '' && strpos($item, $this->swap_pre) === 0) + if ($this->swap_pre !== '' && strpos($item, $this->swap_pre) === 0) { $item = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $item); } // Do we prefix an item with no segments? - elseif ($prefix_single == TRUE && strpos($item, $this->dbprefix) !== 0) + elseif ($prefix_single === TRUE && strpos($item, $this->dbprefix) !== 0) { $item = $this->dbprefix.$item; } diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index a519575f019..ff5eb3fe638 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -85,7 +85,7 @@ public function create_database($db_name) */ public function drop_database($db_name) { - if ($db_name == '') + if ($db_name === '') { show_error('A table name is required for that operation.'); return FALSE; @@ -123,7 +123,7 @@ public function add_key($key = '', $primary = FALSE) return; } - if ($key == '') + if ($key === '') { show_error('Key information is required for that operation.'); } @@ -150,7 +150,7 @@ public function add_key($key = '', $primary = FALSE) */ public function add_field($field = '') { - if ($field == '') + if ($field === '') { show_error('Field information is required.'); } @@ -197,7 +197,7 @@ public function add_field($field = '') */ public function create_table($table = '', $if_not_exists = FALSE) { - if ($table == '') + if ($table === '') { show_error('A table name is required for that operation.'); } @@ -222,7 +222,7 @@ public function create_table($table = '', $if_not_exists = FALSE) */ public function drop_table($table_name) { - if ($table_name == '') + if ($table_name === '') { return ($this->db->db_debug) ? $this->db->display_error('db_table_name_required') : FALSE; } @@ -245,7 +245,7 @@ public function drop_table($table_name) */ public function rename_table($table_name, $new_table_name) { - if ($table_name == '' OR $new_table_name == '') + if ($table_name === '' OR $new_table_name === '') { show_error('A table name is required for that operation.'); return FALSE; @@ -273,7 +273,7 @@ public function rename_table($table_name, $new_table_name) */ public function add_column($table = '', $field = array(), $after_field = '') { - if ($table == '') + if ($table === '') { show_error('A table name is required for that operation.'); } @@ -284,7 +284,7 @@ public function add_column($table = '', $field = array(), $after_field = '') { $this->add_field(array($k => $field[$k])); - if (count($this->fields) == 0) + if (count($this->fields) === 0) { show_error('Field information is required.'); } @@ -312,12 +312,12 @@ public function add_column($table = '', $field = array(), $after_field = '') */ public function drop_column($table = '', $column_name = '') { - if ($table == '') + if ($table === '') { show_error('A table name is required for that operation.'); } - if ($column_name == '') + if ($column_name === '') { show_error('A column name is required for that operation.'); } @@ -337,7 +337,7 @@ public function drop_column($table = '', $column_name = '') */ public function modify_column($table = '', $field = array()) { - if ($table == '') + if ($table === '') { show_error('A table name is required for that operation.'); } diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index cee4354e9e9..45d68cd39c7 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -97,7 +97,7 @@ public function select($select = '*', $escape = NULL) { $val = trim($val); - if ($val != '') + if ($val !== '') { $this->qb_select[] = $val; $this->qb_no_escape[] = $escape; @@ -194,7 +194,7 @@ public function select_sum($select = '', $alias = '') */ protected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') { - if ( ! is_string($select) OR $select == '') + if ( ! is_string($select) OR $select === '') { $this->display_error('db_invalid_query'); } @@ -206,7 +206,7 @@ protected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') show_error('Invalid function type: '.$type); } - if ($alias == '') + if ($alias === '') { $alias = $this->_create_alias_from_table(trim($select)); } @@ -325,7 +325,7 @@ public function from($from) */ public function join($table, $cond, $type = '') { - if ($type != '') + if ($type !== '') { $type = strtoupper(trim($type)); @@ -691,7 +691,7 @@ protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $n } // some platforms require an escape sequence definition for LIKE wildcards - if ($this->_like_escape_str != '') + if ($this->_like_escape_str !== '') { $like_statement = $like_statement.sprintf($this->_like_escape_str, $this->_like_escape_chr); } @@ -829,7 +829,7 @@ public function group_by($by) { $val = trim($val); - if ($val != '') + if ($val !== '') { $this->qb_groupby[] = $val = $this->protect_identifiers($val); @@ -908,7 +908,7 @@ protected function _having($key, $value = '', $type = 'AND ', $escape = TRUE) $k .= ' = '; } - if ($v != '') + if ($v !== '') { $v = ' '.$this->escape($v); } @@ -941,7 +941,7 @@ public function order_by($orderby, $direction = '', $escape = TRUE) $orderby = ''; // Random results want or don't need a field name $direction = $this->_random_keyword; } - elseif (trim($direction) != '') + elseif (trim($direction) !== '') { $direction = (in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE)) ? ' '.$direction : ' ASC'; } @@ -963,7 +963,7 @@ public function order_by($orderby, $direction = '', $escape = TRUE) $orderby = implode(', ', $temp); } - elseif ($direction != $this->_random_keyword) + elseif ($direction !== $this->_random_keyword) { if ($escape === TRUE) { @@ -1064,7 +1064,7 @@ public function set($key, $value = '', $escape = TRUE) */ public function get_compiled_select($table = '', $reset = TRUE) { - if ($table != '') + if ($table !== '') { $this->_track_aliases($table); $this->from($table); @@ -1095,7 +1095,7 @@ public function get_compiled_select($table = '', $reset = TRUE) */ public function get($table = '', $limit = null, $offset = null) { - if ($table != '') + if ($table !== '') { $this->_track_aliases($table); $this->from($table); @@ -1124,7 +1124,7 @@ public function get($table = '', $limit = null, $offset = null) */ public function count_all_results($table = '') { - if ($table != '') + if ($table !== '') { $this->_track_aliases($table); $this->from($table); @@ -1156,7 +1156,7 @@ public function count_all_results($table = '') */ public function get_where($table = '', $where = null, $limit = null, $offset = null) { - if ($table != '') + if ($table !== '') { $this->from($table); } @@ -1204,7 +1204,7 @@ public function insert_batch($table = '', $set = NULL) return FALSE; } - if ($table == '') + if ($table === '') { if ( ! isset($this->qb_from[0])) { @@ -1404,7 +1404,7 @@ protected function _validate_insert($table = '') return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } - if ($table != '') + if ($table !== '') { $this->qb_from[0] = $table; } @@ -1439,7 +1439,7 @@ public function replace($table = '', $set = NULL) return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } - if ($table == '') + if ($table === '') { if ( ! isset($this->qb_from[0])) { @@ -1530,12 +1530,12 @@ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) return FALSE; } - if ($where != NULL) + if ($where !== NULL) { $this->where($where); } - if ($limit != NULL) + if ($limit !== NULL) { $this->limit($limit); } @@ -1595,12 +1595,12 @@ protected function _update($table, $values, $where, $orderby = array(), $limit = */ protected function _validate_update($table = '') { - if (count($this->qb_set) == 0) + if (count($this->qb_set) === 0) { return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } - if ($table != '') + if ($table !== '') { $this->qb_from[0] = $table; } @@ -1644,7 +1644,7 @@ public function update_batch($table = '', $set = NULL, $index = NULL) return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } - if ($table == '') + if ($table === '') { if ( ! isset($this->qb_from[0])) { @@ -1689,7 +1689,7 @@ public function set_update_batch($key, $index = '', $escape = TRUE) $clean = array(); foreach ($v as $k2 => $v2) { - if ($k2 == $index) + if ($k2 === $index) { $index_set = TRUE; } @@ -1720,7 +1720,7 @@ public function set_update_batch($key, $index = '', $escape = TRUE) */ public function empty_table($table = '') { - if ($table == '') + if ($table === '') { if ( ! isset($this->qb_from[0])) { @@ -1753,7 +1753,7 @@ public function empty_table($table = '') */ public function truncate($table = '') { - if ($table == '') + if ($table === '') { if ( ! isset($this->qb_from[0])) { @@ -1827,7 +1827,7 @@ public function delete($table = '', $where = '', $limit = NULL, $reset_data = TR // Combine any cached components with the current statements $this->_merge_cache(); - if ($table == '') + if ($table === '') { if ( ! isset($this->qb_from[0])) { @@ -1851,12 +1851,12 @@ public function delete($table = '', $where = '', $limit = NULL, $reset_data = TR $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); } - if ($where != '') + if ($where !== '') { $this->where($where); } - if ($limit != NULL) + if ($limit !== NULL) { $this->limit($limit); } @@ -1912,7 +1912,7 @@ protected function _delete($table, $where = array(), $like = array(), $limit = F */ public function dbprefix($table = '') { - if ($table == '') + if ($table === '') { $this->display_error('db_table_name_required'); } @@ -2072,7 +2072,7 @@ protected function _compile_select($select_override = FALSE) $sql .= "\nORDER BY ".implode(', ', $this->qb_orderby); if ($this->qb_order !== FALSE) { - $sql .= ($this->qb_order == 'desc') ? ' DESC' : ' ASC'; + $sql .= ($this->qb_order === 'desc') ? ' DESC' : ' ASC'; } } @@ -2106,7 +2106,7 @@ protected function _object_to_array($object) foreach (get_object_vars($object) as $key => $val) { // There are some built in keys we need to ignore for this conversion - if ( ! is_object($val) && ! is_array($val) && $key != '_parent_name') + if ( ! is_object($val) && ! is_array($val) && $key !== '_parent_name') { $array[$key] = $val; } diff --git a/system/database/DB_result.php b/system/database/DB_result.php index 334e08c72de..991f6ba9453 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -81,7 +81,7 @@ public function custom_result_object($class_name) return $this->custom_result_object[$class_name]; } - if ($this->result_id === FALSE OR $this->num_rows() == 0) + if ($this->result_id === FALSE OR $this->num_rows() === 0) { return array(); } @@ -122,7 +122,7 @@ public function 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) + if ($this->result_id === FALSE OR $this->num_rows() === 0) { return array(); } @@ -153,7 +153,7 @@ public function 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) + if ($this->result_id === FALSE OR $this->num_rows() === 0) { return array(); } @@ -224,7 +224,7 @@ public function set_row($key, $value = NULL) return; } - if ($key != '' && ! is_null($value)) + if ($key !== '' && ! is_null($value)) { $this->row_data[$key] = $value; } @@ -245,7 +245,7 @@ public function custom_row_object($n, $type) return NULL; } - if ($n != $this->current_row && isset($result[$n])) + if ($n !== $this->current_row && isset($result[$n])) { $this->current_row = $n; } @@ -268,7 +268,7 @@ public function row_object($n = 0) return NULL; } - if ($n != $this->current_row && isset($result[$n])) + if ($n !== $this->current_row && isset($result[$n])) { $this->current_row = $n; } @@ -291,7 +291,7 @@ public function row_array($n = 0) return NULL; } - if ($n != $this->current_row && isset($result[$n])) + if ($n !== $this->current_row && isset($result[$n])) { $this->current_row = $n; } diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index cb97ff4481f..02c9218347b 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -343,7 +343,7 @@ public function backup($params = array()) if ($prefs['format'] === 'zip') { // Set the filename if not provided (only needed with Zip files) - if ($prefs['filename'] == '') + if ($prefs['filename'] === '') { $prefs['filename'] = (count($prefs['tables']) === 1 ? $prefs['tables'] : $this->db->database) .date('Y-m-d_H-i', time()).'.sql'; @@ -369,7 +369,7 @@ public function backup($params = array()) $CI->zip->add_data($prefs['filename'], $this->_backup($prefs)); return $CI->zip->get_zip(); } - elseif ($prefs['format'] == 'txt') // Was a text file requested? + elseif ($prefs['format'] === 'txt') // Was a text file requested? { return $this->_backup($prefs); } diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index 817dfdc981a..b7763d90f3a 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -74,7 +74,7 @@ public function __construct($params) else { // If no port is defined by the user, use the default value - $this->port == '' OR $this->port = 33000; + $this->port === '' OR $this->port = 33000; } } @@ -340,7 +340,7 @@ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SHOW TABLES'; - if ($prefix_limit !== FALSE && $this->dbprefix != '') + if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; } @@ -435,7 +435,7 @@ protected function _update_batch($table, $values, $index, $where = NULL) foreach (array_keys($val) as $field) { - if ($field != $index) + if ($field !== $index) { $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; } @@ -451,7 +451,7 @@ protected function _update_batch($table, $values, $index, $where = NULL) } return 'UPDATE '.$table.' SET '.substr($cases, 0, -2) - .' WHERE '.(($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : '') + .' WHERE '.(($where !== '' && count($where) > 0) ? implode(' ', $where).' AND ' : '') .$index.' IN ('.implode(',', $ids).')'; } @@ -469,7 +469,7 @@ protected function _update_batch($table, $values, $index, $where = NULL) */ protected function _limit($sql, $limit, $offset) { - return $sql.'LIMIT '.($offset == 0 ? '' : $offset.', ').$limit; + return $sql.'LIMIT '.($offset === 0 ? '' : $offset.', ').$limit; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php index 4e66f81e3f5..fb9716226f0 100644 --- a/system/database/drivers/cubrid/cubrid_forge.php +++ b/system/database/drivers/cubrid/cubrid_forge.php @@ -193,7 +193,7 @@ protected function _alter_table($alter_type, $table, $fields, $after_field = '') } return $sql.$this->_process_fields($fields) - .($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : ''); + .($after_field !== '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : ''); } } diff --git a/system/database/drivers/interbase/interbase_driver.php b/system/database/drivers/interbase/interbase_driver.php index 49d3cda87f1..8cbbfa17dab 100644 --- a/system/database/drivers/interbase/interbase_driver.php +++ b/system/database/drivers/interbase/interbase_driver.php @@ -255,7 +255,7 @@ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT "RDB$RELATION_NAME" FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\''; - if ($prefix_limit !== FALSE && $this->dbprefix != '') + if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql.' AND "RDB$RELATION_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); } diff --git a/system/database/drivers/interbase/interbase_forge.php b/system/database/drivers/interbase/interbase_forge.php index c850656a8fe..5470179a118 100644 --- a/system/database/drivers/interbase/interbase_forge.php +++ b/system/database/drivers/interbase/interbase_forge.php @@ -195,7 +195,7 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin $sql .= " {$column_definition}"; - if ($default_value != '') + if ($default_value !== '') { $sql .= " DEFAULT \"{$default_value}\""; } @@ -209,7 +209,7 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin $sql .= ' NOT NULL'; } - if ($after_field != '') + if ($after_field !== '') { $sql .= ' AFTER ' . $this->db->protect_identifiers($after_field); } diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 342ff264761..5bd66696081 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -64,7 +64,7 @@ class CI_DB_mssql_driver extends CI_DB { */ public function db_connect() { - if ($this->port != '') + if ($this->port !== '') { $this->hostname .= ','.$this->port; } @@ -81,7 +81,7 @@ public function db_connect() */ public function db_pconnect() { - if ($this->port != '') + if ($this->port !== '') { $this->hostname .= ','.$this->port; } @@ -316,7 +316,7 @@ protected 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 != '') + 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 diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php index bbf2d9685bc..3708c2233c1 100644 --- a/system/database/drivers/mssql/mssql_forge.php +++ b/system/database/drivers/mssql/mssql_forge.php @@ -155,21 +155,21 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin $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') + if ($alter_type === 'DROP') { return $sql; } $sql .= " ".$column_definition; - if ($default_value != '') + if ($default_value !== '') { $sql .= " DEFAULT '".$default_value."'"; } $sql .= ($null === NULL) ? ' NULL' : ' NOT NULL'; - if ($after_field != '') + if ($after_field !== '') { return $sql.' AFTER '.$this->db->protect_identifiers($after_field); } diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 7a1a7b9a290..41e86f31552 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -68,7 +68,7 @@ public function __construct($params) { parent::__construct($params); - if ($this->port != '') + if ($this->port !== '') { $this->hostname .= ':'.$this->port; } @@ -337,7 +337,7 @@ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SHOW TABLES FROM '.$this->_escape_char.$this->database.$this->_escape_char; - if ($prefix_limit !== FALSE && $this->dbprefix != '') + if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; } @@ -370,7 +370,7 @@ public function _list_columns($table = '') */ public function field_data($table = '') { - if ($table == '') + if ($table === '') { return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE; } @@ -451,7 +451,7 @@ protected function _update_batch($table, $values, $index, $where = NULL) foreach (array_keys($val) as $field) { - if ($field != $index) + if ($field !== $index) { $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; } @@ -467,7 +467,7 @@ protected function _update_batch($table, $values, $index, $where = NULL) } return 'UPDATE '.$table.' SET '.substr($cases, 0, -2) - .' WHERE '.(($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : '') + .' WHERE '.(($where !== '' && count($where) > 0) ? implode(' ', $where).' AND ' : '') .$index.' IN('.implode(',', $ids).')'; } @@ -485,7 +485,7 @@ protected function _update_batch($table, $values, $index, $where = NULL) */ protected function _limit($sql, $limit, $offset) { - return $sql.' LIMIT '.($offset == 0 ? '' : $offset.', ').$limit; + return $sql.' LIMIT '.($offset === 0 ? '' : $offset.', ').$limit; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php index 0e39affa7e3..ffd374fbffa 100644 --- a/system/database/drivers/mysql/mysql_forge.php +++ b/system/database/drivers/mysql/mysql_forge.php @@ -178,7 +178,7 @@ protected function _alter_table($alter_type, $table, $fields, $after_field = '') } return $sql.$this->_process_fields($fields) - .($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : ''); + .($after_field !== '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : ''); } } diff --git a/system/database/drivers/mysql/mysql_utility.php b/system/database/drivers/mysql/mysql_utility.php index 642323dbda4..643682fdef8 100644 --- a/system/database/drivers/mysql/mysql_utility.php +++ b/system/database/drivers/mysql/mysql_utility.php @@ -76,7 +76,7 @@ protected function _backup($params = array()) // Write out the table schema $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; - if ($add_drop == TRUE) + if ($add_drop === TRUE) { $output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline; } @@ -92,7 +92,7 @@ protected function _backup($params = array()) } // If inserts are not needed we're done... - if ($add_insert == FALSE) + if ($add_insert === FALSE) { continue; } @@ -100,7 +100,7 @@ protected function _backup($params = array()) // Grab all the data from the current table $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table)); - if ($query->num_rows() == 0) + if ($query->num_rows() === 0) { continue; } @@ -143,7 +143,7 @@ protected function _backup($params = array()) else { // Escape the data if it's not an integer - $val_str .= ($is_int[$i] == FALSE) ? $this->db->escape($v) : $v; + $val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v; } // Append a comma diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index dd544f686b5..5814aceb970 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -71,7 +71,7 @@ class CI_DB_mysqli_driver extends CI_DB { */ public function db_connect() { - return ($this->port != '') + return ($this->port !== '') ? @new mysqli($this->hostname, $this->username, $this->password, $this->database, $this->port) : @new mysqli($this->hostname, $this->username, $this->password, $this->database); } @@ -91,7 +91,7 @@ public function db_pconnect() return $this->db_connect(); } - return ($this->port != '') + return ($this->port !== '') ? @new mysqli('p:'.$this->hostname, $this->username, $this->password, $this->database, $this->port) : @new mysqli('p:'.$this->hostname, $this->username, $this->password, $this->database); } @@ -337,7 +337,7 @@ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SHOW TABLES FROM '.$this->_escape_char.$this->database.$this->_escape_char; - if ($prefix_limit !== FALSE && $this->dbprefix != '') + if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; } @@ -370,7 +370,7 @@ protected function _list_columns($table = '') */ public function field_data($table = '') { - if ($table == '') + if ($table === '') { return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE; } @@ -451,7 +451,7 @@ protected function _update_batch($table, $values, $index, $where = NULL) foreach (array_keys($val) as $field) { - if ($field != $index) + if ($field !== $index) { $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; } @@ -466,10 +466,10 @@ protected function _update_batch($table, $values, $index, $where = NULL) .'ELSE '.$k.' END, '; } - $where = ($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : ''; + $where = ($where !== '' && count($where) > 0) ? implode(' ', $where).' AND ' : ''; return 'UPDATE '.$table.' SET '.substr($cases, 0, -2) - .' WHERE '.(($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : '') + .' WHERE '.(($where !== '' && count($where) > 0) ? implode(' ', $where).' AND ' : '') .$index.' IN('.implode(',', $ids).')'; } diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php index 503574dfc41..b00bfde4939 100644 --- a/system/database/drivers/mysqli/mysqli_forge.php +++ b/system/database/drivers/mysqli/mysqli_forge.php @@ -179,7 +179,7 @@ protected function _alter_table($alter_type, $table, $fields, $after_field = '') } return $sql.$this->_process_fields($fields) - .($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : ''); + .($after_field !== '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : ''); } } diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index b979c8a17b5..e7809161477 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -262,7 +262,7 @@ public function get_cursor() */ public function stored_procedure($package, $procedure, $params) { - if ($package == '' OR $procedure == '' OR ! is_array($params)) + if ($package === '' OR $procedure === '' OR ! is_array($params)) { if ($this->db_debug) { @@ -466,7 +466,7 @@ protected function _list_tables($prefix_limit = FALSE) { $sql = 'SELECT TABLE_NAME FROM ALL_TABLES'; - if ($prefix_limit !== FALSE && $this->dbprefix != '') + if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql." WHERE TABLE_NAME LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); } @@ -634,7 +634,7 @@ protected function _limit($sql, $limit, $offset) { $this->limit_used = TRUE; return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($offset + $limit).')' - .($offset != 0 ? ' WHERE rnum >= '.$offset : ''); + .($offset !== 0 ? ' WHERE rnum >= '.$offset : ''); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index bd265b6e0fb..837e7eaad67 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -141,9 +141,9 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin } return $sql.' '.$column_definition - .($default_value != '' ? ' DEFAULT "'.$default_value.'"' : '') + .($default_value !== '' ? ' DEFAULT "'.$default_value.'"' : '') .($null === NULL ? ' NULL' : ' NOT NULL') - .($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : ''); + .($after_field !== '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : ''); } diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 98fd806a8eb..b493e93356f 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -64,7 +64,7 @@ public function __construct($params) $this->_random_keyword = ' RND('.time().')'; // database specific random keyword // Legacy support for DSN in the hostname field - if ($this->dsn == '') + if ($this->dsn === '') { $this->dsn = $this->hostname; } @@ -256,7 +256,7 @@ protected function _list_tables($prefix_limit = FALSE) { $sql = "SHOW TABLES FROM `".$this->database."`"; - if ($prefix_limit !== FALSE AND $this->dbprefix != '') + 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 diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php index d59b8a9114d..ce7a1d2efa0 100644 --- a/system/database/drivers/odbc/odbc_forge.php +++ b/system/database/drivers/odbc/odbc_forge.php @@ -163,14 +163,14 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin $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') + if ($alter_type === 'DROP') { return $sql; } $sql .= " $column_definition"; - if ($default_value != '') + if ($default_value !== '') { $sql .= " DEFAULT \"$default_value\""; } @@ -184,7 +184,7 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin $sql .= ' NOT NULL'; } - if ($after_field != '') + if ($after_field !== '') { return $sql.' AFTER '.$this->db->protect_identifiers($after_field); } diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index ec7f3e19b34..dbbcda342c4 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -65,7 +65,7 @@ public function __construct($params) { parent::__construct($params); - if (preg_match('/([^;]+):/', $this->dsn, $match) && count($match) == 2) + if (preg_match('/([^;]+):/', $this->dsn, $match) && count($match) === 2) { // If there is a minimum valid dsn string pattern found, we're done // This is for general PDO users, who tend to have a full DSN string. @@ -418,12 +418,12 @@ public function insert_id($name = NULL) */ protected function _list_tables($prefix_limit = FALSE) { - if ($this->pdodriver == 'pgsql') + if ($this->pdodriver === 'pgsql') { // Analog function to show all tables in postgre $sql = "SELECT * FROM information_schema.tables WHERE table_schema = 'public'"; } - elseif ($this->pdodriver == 'sqlite') + elseif ($this->pdodriver === 'sqlite') { // Analog function to show all tables in sqlite $sql = "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'"; @@ -433,7 +433,7 @@ protected function _list_tables($prefix_limit = FALSE) $sql = 'SHOW TABLES FROM '.$this->escape_identifiers($this->database); } - if ($prefix_limit !== FALSE AND $this->dbprefix != '') + if ($prefix_limit !== FALSE AND $this->dbprefix !== '') { return FALSE; } @@ -468,17 +468,17 @@ protected function _list_columns($table = '') */ protected function _field_data($table) { - if ($this->pdodriver == 'mysql' or $this->pdodriver == 'pgsql') + if ($this->pdodriver === 'mysql' or $this->pdodriver === 'pgsql') { // Analog function for mysql and postgre return 'SELECT * FROM '.$this->escape_identifiers($table).' LIMIT 1'; } - elseif ($this->pdodriver == 'oci') + elseif ($this->pdodriver === 'oci') { // Analog function for oci return 'SELECT * FROM '.$this->escape_identifiers($table).' WHERE ROWNUM <= 1'; } - elseif ($this->pdodriver == 'sqlite') + elseif ($this->pdodriver === 'sqlite') { // Analog function for sqlite return 'PRAGMA table_info('.$this->escape_identifiers($table).')'; @@ -552,7 +552,7 @@ protected function _from_tables($tables) protected function _update_batch($table, $values, $index, $where = NULL) { $ids = array(); - $where = ($where != '' && count($where) >=1) ? implode(" ", $where).' AND ' : ''; + $where = ($where !== '' && count($where) >=1) ? implode(" ", $where).' AND ' : ''; foreach ($values as $key => $val) { @@ -560,7 +560,7 @@ protected function _update_batch($table, $values, $index, $where = NULL) foreach (array_keys($val) as $field) { - if ($field != $index) + if ($field !== $index) { $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; } @@ -620,9 +620,9 @@ protected function _truncate($table) */ protected function _limit($sql, $limit, $offset) { - if ($this->pdodriver == 'cubrid' OR $this->pdodriver == 'sqlite') + if ($this->pdodriver === 'cubrid' OR $this->pdodriver === 'sqlite') { - $offset = ($offset == 0) ? '' : $offset.', '; + $offset = ($offset === 0) ? '' : $offset.', '; return $sql.'LIMIT '.$offset.$limit; } diff --git a/system/database/drivers/pdo/pdo_forge.php b/system/database/drivers/pdo/pdo_forge.php index ca8657a0fb1..aee8f718acd 100644 --- a/system/database/drivers/pdo/pdo_forge.php +++ b/system/database/drivers/pdo/pdo_forge.php @@ -80,7 +80,7 @@ protected function _create_table($table, $fields, $primary_keys, $keys, $if_not_ if (array_key_exists('CONSTRAINT', $attributes)) { // Exception for Postgre numeric which not too happy with constraint within those type - if ( ! ($this->db->pdodriver == 'pgsql' && in_array($attributes['TYPE'], $numeric))) + if ( ! ($this->db->pdodriver === 'pgsql' && in_array($attributes['TYPE'], $numeric))) { $sql .= '('.$attributes['CONSTRAINT'].')'; } @@ -168,14 +168,14 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin $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') + if ($alter_type === 'DROP') { return $sql; } $sql .= " $column_definition"; - if ($default_value != '') + if ($default_value !== '') { $sql .= " DEFAULT \"$default_value\""; } @@ -189,7 +189,7 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin $sql .= ' NOT NULL'; } - if ($after_field != '') + if ($after_field !== '') { return $sql.' AFTER '.$this->db->protect_identifiers($after_field); } diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index c2a188416c1..8c51684003f 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -356,13 +356,13 @@ public function insert_id() $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') + if ($table === NULL && $v >= '8.1') { $sql = 'SELECT LASTVAL() AS ins_id'; } - elseif ($table != NULL) + elseif ($table !== NULL) { - if ($column != NULL && $v >= '8.0') + if ($column !== NULL && $v >= '8.0') { $sql = 'SELECT pg_get_serial_sequence(\''.$table."', '".$column."') AS seq"; $query = $this->query($sql); @@ -401,7 +401,7 @@ protected function _list_tables($prefix_limit = FALSE) { $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"; - if ($prefix_limit !== FALSE && $this->dbprefix != '') + if ($prefix_limit !== FALSE && $this->dbprefix !== '') { return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); } @@ -528,7 +528,7 @@ protected function _update_batch($table, $values, $index, $where = NULL) foreach (array_keys($val) as $field) { - if ($field != $index) + if ($field !== $index) { $final[$field][] = 'WHEN '.$val[$index].' THEN '.$val[$field]; } @@ -544,7 +544,7 @@ protected function _update_batch($table, $values, $index, $where = NULL) } return 'UPDATE '.$table.' SET '.substr($cases, 0, -2) - .' WHERE '.(($where != '' && count($where) > 0) ? implode(' ', $where).' AND ' : '') + .' WHERE '.(($where !== '' && count($where) > 0) ? implode(' ', $where).' AND ' : '') .$index.' IN('.implode(',', $ids).')'; } @@ -585,7 +585,7 @@ protected function _delete($table, $where = array(), $like = array(), $limit = F */ protected function _limit($sql, $limit, $offset) { - return $sql.' LIMIT '.$limit.($offset == 0 ? '' : ' OFFSET '.$offset); + return $sql.' LIMIT '.$limit.($offset === 0 ? '' : ' OFFSET '.$offset); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php index 94c97af5003..af1c45f9bc7 100644 --- a/system/database/drivers/postgre/postgre_forge.php +++ b/system/database/drivers/postgre/postgre_forge.php @@ -214,7 +214,7 @@ protected function _alter_table($alter_type, $table, $fields, $after_field = '') } return $sql.$this->_process_fields($fields) - .($after_field != '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : ''); + .($after_field !== '' ? ' AFTER '.$this->db->protect_identifiers($after_field) : ''); } } diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index d8b869c2eb8..e50239027b0 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -279,7 +279,7 @@ protected function _list_tables($prefix_limit = FALSE) { $sql = "SELECT name from sqlite_master WHERE type='table'"; - if ($prefix_limit !== FALSE AND $this->dbprefix != '') + 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); } @@ -404,7 +404,7 @@ protected function _truncate($table) */ protected function _limit($sql, $limit, $offset) { - if ($offset == 0) + if ($offset === 0) { $offset = ''; } diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php index dd6f0f78dea..35be1b74b2f 100644 --- a/system/database/drivers/sqlite/sqlite_forge.php +++ b/system/database/drivers/sqlite/sqlite_forge.php @@ -194,7 +194,7 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin $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') + if ($alter_type === 'DROP') { // SQLite does not support dropping columns // http://www.sqlite.org/omitted.html @@ -204,7 +204,7 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin $sql .= " $column_definition"; - if ($default_value != '') + if ($default_value !== '') { $sql .= " DEFAULT \"$default_value\""; } @@ -218,7 +218,7 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin $sql .= ' NOT NULL'; } - if ($after_field != '') + if ($after_field !== '') { return $sql.' AFTER '.$this->db->protect_identifiers($after_field); } diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index ea4cf2d4f98..ea7e6d43c4d 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -255,7 +255,7 @@ public function insert_id() protected function _list_tables($prefix_limit = FALSE) { return 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\'' - .(($prefix_limit !== FALSE && $this->dbprefix != '') + .(($prefix_limit !== FALSE && $this->dbprefix !== '') ? ' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix).'%\' '.sprintf($this->_like_escape_str, $this->_like_escape_chr) : ''); } diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php index 20f1e6f63f3..0a5dc9211fe 100644 --- a/system/database/drivers/sqlite3/sqlite3_forge.php +++ b/system/database/drivers/sqlite3/sqlite3_forge.php @@ -184,7 +184,7 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin return 'ALTER TABLE '.$this->db->protect_identifiers($table).' '.$alter_type.' '.$this->db->protect_identifiers($column_name) .' '.$column_definition - .($default_value != '' ? ' DEFAULT '.$default_value : '') + .($default_value !== '' ? ' DEFAULT '.$default_value : '') // If NOT NULL is specified, the field must have a DEFAULT value other than NULL .(($null !== NULL && $default_value !== 'NULL') ? ' NOT NULL' : ' NULL'); } diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php index c817c2c5d95..1529b2a21f5 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -155,21 +155,21 @@ protected function _alter_table($alter_type, $table, $column_name, $column_defin $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') + if ($alter_type === 'DROP') { return $sql; } $sql .= ' '.$column_definition; - if ($default_value != '') + if ($default_value !== '') { $sql .= " DEFAULT '".$default_value."'"; } $sql .= ($null === NULL) ? ' NULL' : ' NOT NULL'; - if ($after_field != '') + if ($after_field !== '') { return $sql.' AFTER '.$this->db->protect_identifiers($after_field); } From 773ccc318f2769c9b7579630569b5d8ba47b114b Mon Sep 17 00:00:00 2001 From: Alex Bilbie Date: Sat, 2 Jun 2012 11:11:08 +0100 Subject: [PATCH 1127/5397] Replaced `==` with `===` and `!=` with `!==` in /system/helpers --- system/helpers/captcha_helper.php | 6 ++--- system/helpers/date_helper.php | 38 ++++++++++++++--------------- system/helpers/directory_helper.php | 2 +- system/helpers/download_helper.php | 2 +- system/helpers/file_helper.php | 4 +-- system/helpers/form_helper.php | 32 ++++++++++++------------ system/helpers/html_helper.php | 6 ++--- system/helpers/language_helper.php | 2 +- system/helpers/smiley_helper.php | 4 +-- system/helpers/string_helper.php | 2 +- system/helpers/text_helper.php | 10 ++++---- system/helpers/url_helper.php | 24 +++++++++--------- system/helpers/xml_helper.php | 4 +-- 13 files changed, 68 insertions(+), 68 deletions(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index b1167065816..4676b2a65d8 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -64,7 +64,7 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = } } - if ($img_path == '' OR $img_url == '' + if ($img_path === '' OR $img_url === '' OR ! @is_dir($img_path) OR ! is_writeable($img_path) OR ! extension_loaded('gd')) { @@ -93,7 +93,7 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = // Do we have a "word" yet? // ----------------------------------- - if ($word == '') + if ($word === '') { $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $word = ''; @@ -156,7 +156,7 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = // Write the text // ----------------------------------- - $use_font = ($font_path != '' && file_exists($font_path) && function_exists('imagettftext')); + $use_font = ($font_path !== '' && file_exists($font_path) && function_exists('imagettftext')); if ($use_font === FALSE) { $font_size = 5; diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 5f0427f7dd3..0bda33378d7 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -50,7 +50,7 @@ function now() { $CI =& get_instance(); - if (strtolower($CI->config->item('time_reference')) == 'gmt') + 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)); @@ -90,12 +90,12 @@ function now() */ function mdate($datestr = '', $time = '') { - if ($datestr == '') + if ($datestr === '') { return ''; } - $time = ($time == '') ? now() : $time; + $time = ($time === '') ? now() : $time; $datestr = str_replace( '%\\', @@ -280,14 +280,14 @@ function days_in_month($month = 0, $year = '') return 0; } - if ( ! is_numeric($year) OR strlen($year) != 4) + if ( ! is_numeric($year) OR strlen($year) !== 4) { $year = date('Y'); } - if ($month == 2) + if ($month === 2) { - if ($year % 400 == 0 OR ($year % 4 == 0 && $year % 100 != 0)) + if ($year % 400 === 0 OR ($year % 4 === 0 && $year % 100 !== 0)) { return 29; } @@ -310,7 +310,7 @@ function days_in_month($month = 0, $year = '') */ function local_to_gmt($time = '') { - if ($time == '') + if ($time === '') { $time = time(); } @@ -344,14 +344,14 @@ function local_to_gmt($time = '') */ function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE) { - if ($time == '') + if ($time === '') { return now(); } $time += timezones($timezone) * 3600; - if ($dst == TRUE) + if ($dst === TRUE) { $time += 3600; } @@ -410,7 +410,7 @@ function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') { $r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' '; - if ($fmt == 'us') + if ($fmt === 'us') { $r .= date('h', $time).':'.date('i', $time); } @@ -424,7 +424,7 @@ function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') $r .= ':'.date('s', $time); } - if ($fmt == 'us') + if ($fmt === 'us') { $r .= ' '.date('A', $time); } @@ -447,7 +447,7 @@ function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') */ function human_to_unix($datestr = '') { - if ($datestr == '') + if ($datestr === '') { return FALSE; } @@ -491,7 +491,7 @@ function human_to_unix($datestr = '') $hour += 12; } - if (substr($ampm, 0, 1) === 'a' && $hour == 12) + if (substr($ampm, 0, 1) === 'a' && $hour === 12) { $hour = '00'; } @@ -562,7 +562,7 @@ function nice_date($bad_date = '', $format = FALSE) // Any other kind of string, when converted into UNIX time, // produces "0 seconds after epoc..." is probably bad... // return "Invalid Date". - if (date('U', strtotime($bad_date)) == '0') + if (date('U', strtotime($bad_date)) === '0') { return 'Invalid Date'; } @@ -591,11 +591,11 @@ function timezone_menu($default = 'UTC', $class = '', $name = 'timezones') $CI =& get_instance(); $CI->lang->load('date'); - $default = ($default == 'GMT') ? 'UTC' : $default; + $default = ($default === 'GMT') ? 'UTC' : $default; $menu = ' EOH; - + $shirts_on_sale = array('small', 'large'); - + $this->assertEquals($expected, form_dropdown('shirts', $options, $shirts_on_sale)); - + $options = array( 'Swedish Cars' => array( - 'volvo' => 'Volvo', - 'saab' => 'Saab' + 'volvo' => 'Volvo', + 'saab' => 'Saab' ), 'German Cars' => array( - 'mercedes' => 'Mercedes', - 'audi' => 'Audi' + 'mercedes' => 'Mercedes', + 'audi' => 'Audi' ) ); - + $expected = << @@ -124,13 +124,10 @@ public function test_form_dropdown() EOH; - - $cars_on_sale = array('volvo', 'audi'); - - $this->assertEquals($expected, form_dropdown('cars', $options, $cars_on_sale)); - + + $this->assertEquals($expected, form_dropdown('cars', $options, array('volvo', 'audi'))); } - + public function test_form_multiselect() { $expected = << EOH; - + $options = array( - 'small' => 'Small Shirt', - 'med' => 'Medium Shirt', - 'large' => 'Large Shirt', - 'xlarge' => 'Extra Large Shirt', - ); - + 'small' => 'Small Shirt', + 'med' => 'Medium Shirt', + 'large' => 'Large Shirt', + 'xlarge' => 'Extra Large Shirt', + ); + $this->assertEquals($expected, form_multiselect('shirts[]', $options, array('med', 'large'))); } - + public function test_form_fieldset() { $expected = <<Address Information EOH; - + $this->assertEquals($expected, form_fieldset('Address Information')); } @@ -169,10 +166,10 @@ public function test_form_fieldset_close() $expected = <<
    EOH; - + $this->assertEquals($expected, form_fieldset_close('')); } - + public function test_form_checkbox() { $expected = <<assertEquals($expected, form_checkbox('newsletter', 'accept', TRUE)); } - + public function test_form_radio() { $expected = <<assertEquals($expected, form_radio('newsletter', 'accept', TRUE)); } - + public function test_form_submit() { $expected = <<assertEquals($expected, form_submit('mysubmit', 'Submit Post!')); } - + public function test_form_label() { $expected = <<assertEquals($expected, form_label('What is your Name', 'username')); } - + public function test_form_reset() { $expected = <<assertEquals($expected, form_reset('myreset', 'Reset')); } - + public function test_form_button() { $expected = <<assertEquals($expected, form_button('name','content')); + $this->assertEquals($expected, form_button('name', 'content')); } - + public function test_form_close() { $expected = <<assertEquals($expected, form_close('')); } - + public function test_form_prep() { - $expected = "Here is a string containing "quoted" text."; - + $expected = 'Here is a string containing "quoted" text.'; + $this->assertEquals($expected, form_prep('Here is a string containing "quoted" text.')); } + } /* End of file form_helper_test.php */ \ No newline at end of file diff --git a/tests/codeigniter/helpers/html_helper_test.php b/tests/codeigniter/helpers/html_helper_test.php index 28974b0f814..9a7bb48bfad 100644 --- a/tests/codeigniter/helpers/html_helper_test.php +++ b/tests/codeigniter/helpers/html_helper_test.php @@ -6,16 +6,16 @@ public function set_up() { $this->helper('html'); } - + // ------------------------------------------------------------------------ - + public function test_br() { $this->assertEquals('

    ', br(2)); } - + // ------------------------------------------------------------------------ - + public function test_heading() { $this->assertEquals('

    foobar

    ', heading('foobar')); @@ -23,7 +23,7 @@ public function test_heading() } // ------------------------------------------------------------------------ - + public function test_Ul() { $expect = <<assertEquals($expect, ul($list)); + $this->assertEquals(ltrim($expect), ul($list)); $expect = << @@ -51,13 +49,11 @@ public function test_Ul() $expect = ltrim($expect); - $list = array('foo', 'bar'); - $this->assertEquals($expect, ul($list, 'class="test"')); $this->assertEquals($expect, ul($list, array('class' => 'test'))); } - + // ------------------------------------------------------------------------ public function test_NBS() @@ -66,15 +62,15 @@ public function test_NBS() } // ------------------------------------------------------------------------ - + public function test_meta() { $this->assertEquals("\n", meta('test', 'foo')); - + $expect = "\n"; - + $this->assertEquals($expect, meta(array('name' => 'foo'))); - + } - + } \ No newline at end of file diff --git a/tests/codeigniter/helpers/inflector_helper_test.php b/tests/codeigniter/helpers/inflector_helper_test.php index 9e9478711c6..f3b0ebbe86a 100644 --- a/tests/codeigniter/helpers/inflector_helper_test.php +++ b/tests/codeigniter/helpers/inflector_helper_test.php @@ -1,12 +1,12 @@ helper('inflector'); } - + public function test_singular() { $strs = array( @@ -16,15 +16,15 @@ public function test_singular() 'smells' => 'smell', 'equipment' => 'equipment' ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, singular($str)); } } - + // -------------------------------------------------------------------- - + public function test_plural() { $strs = array( @@ -35,15 +35,15 @@ public function test_plural() 'witch' => 'witches', 'equipment' => 'equipment' ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, plural($str)); - } - } + } + } // -------------------------------------------------------------------- - + public function test_camelize() { $strs = array( @@ -52,15 +52,15 @@ public function test_camelize() 'i-am-playing-a-trick' => 'i-am-playing-a-trick', 'what_do_you_think-yo?' => 'whatDoYouThink-yo?', ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, camelize($str)); } - } + } // -------------------------------------------------------------------- - + public function test_underscore() { $strs = array( @@ -69,7 +69,7 @@ public function test_underscore() 'i-am-playing-a-trick' => 'i-am-playing-a-trick', 'what_do_you_think-yo?' => 'what_do_you_think-yo?', ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, underscore($str)); @@ -77,7 +77,7 @@ public function test_underscore() } // -------------------------------------------------------------------- - + public function test_humanize() { $strs = array( @@ -86,10 +86,11 @@ public function test_humanize() 'i-am-playing-a-trick' => 'I-am-playing-a-trick', 'what_do_you_think-yo?' => 'What Do You Think-yo?', ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, humanize($str)); } } + } \ No newline at end of file diff --git a/tests/codeigniter/helpers/number_helper_test.php b/tests/codeigniter/helpers/number_helper_test.php index 4bb9a918ae4..23d5c5c1a42 100644 --- a/tests/codeigniter/helpers/number_helper_test.php +++ b/tests/codeigniter/helpers/number_helper_test.php @@ -1,35 +1,35 @@ helper('number'); - + // Grab the core lang class $lang_cls = $this->ci_core_class('lang'); - + // Mock away load, too much going on in there, // we'll just check for the expected parameter - + $lang = $this->getMock($lang_cls, array('load')); $lang->expects($this->once()) ->method('load') ->with($this->equalTo('number')); - + // Assign the proper language array - + $lang->language = $this->_get_lang('number'); - + // We don't have a controller, so just create // a cheap class to act as our super object. // Make sure it has a lang attribute. - + $obj = new StdClass; $obj->lang = $lang; $this->ci_instance($obj); } - + // Quick helper to actually grab the language // file. Consider moving this to ci_testcase? public function _get_lang($name) @@ -37,41 +37,40 @@ public function _get_lang($name) require BASEPATH.'language/english/'.$name.'_lang.php'; return $lang; } - + public function test_byte_format() { $this->assertEquals('456 Bytes', byte_format(456)); } - + public function test_kb_format() { $this->assertEquals('4.5 KB', byte_format(4567)); } - + public function test_kb_format_medium() { $this->assertEquals('44.6 KB', byte_format(45678)); } - + public function test_kb_format_large() { $this->assertEquals('446.1 KB', byte_format(456789)); } - + public function test_mb_format() { $this->assertEquals('3.3 MB', byte_format(3456789)); } - + public function test_gb_format() { $this->assertEquals('1.8 GB', byte_format(1932735283.2)); } - + public function test_tb_format() { $this->assertEquals('112,283.3 TB', byte_format(123456789123456789)); } -} -// EOF \ No newline at end of file +} \ No newline at end of file diff --git a/tests/codeigniter/helpers/path_helper_test.php b/tests/codeigniter/helpers/path_helper_test.php index 632f57501bd..0faf6f3835b 100644 --- a/tests/codeigniter/helpers/path_helper_test.php +++ b/tests/codeigniter/helpers/path_helper_test.php @@ -8,9 +8,8 @@ public function set_up() } public function test_set_realpath() - { - $expected = getcwd() . DIRECTORY_SEPARATOR; - $this->assertEquals($expected, set_realpath(getcwd())); + { + $this->assertEquals(getcwd().DIRECTORY_SEPARATOR, set_realpath(getcwd())); } public function test_set_realpath_nonexistent_directory() diff --git a/tests/codeigniter/helpers/string_helper_test.php b/tests/codeigniter/helpers/string_helper_test.php index 29c3d6594ea..75701ec1392 100644 --- a/tests/codeigniter/helpers/string_helper_test.php +++ b/tests/codeigniter/helpers/string_helper_test.php @@ -10,18 +10,18 @@ public function set_up() public function test_strip_slashes() { $expected = array( - "Is your name O'reilly?", + "Is your name O'reilly?", "No, my name is O'connor." ); - + $str = array( "Is your name O\'reilly?", "No, my name is O\'connor." ); - + $this->assertEquals($expected, strip_slashes($str)); } - + public function test_trim_slashes() { $strs = array( @@ -144,4 +144,5 @@ public function test_increment_string() $this->assertEquals('file-1', increment_string('file', '-', '1')); $this->assertEquals(124, increment_string('123', '')); } + } \ No newline at end of file diff --git a/tests/codeigniter/helpers/text_helper_test.php b/tests/codeigniter/helpers/text_helper_test.php index 73e2b9429fd..f131469cbc7 100644 --- a/tests/codeigniter/helpers/text_helper_test.php +++ b/tests/codeigniter/helpers/text_helper_test.php @@ -3,16 +3,16 @@ class Text_helper_test extends CI_TestCase { private $_long_string; - + public function set_up() { $this->helper('text'); - + $this->_long_string = 'Once upon a time, a framework had no tests. It sad. So some nice people began to write tests. The more time that went on, the happier it became. Everyone was happy.'; } - + // ------------------------------------------------------------------------ - + public function test_word_limiter() { $this->assertEquals('Once upon a time,…', word_limiter($this->_long_string, 4)); @@ -20,8 +20,8 @@ public function test_word_limiter() $this->assertEquals('', word_limiter('', 4)); } - // ------------------------------------------------------------------------ - + // ------------------------------------------------------------------------ + public function test_character_limiter() { $this->assertEquals('Once upon a time, a…', character_limiter($this->_long_string, 20)); @@ -30,22 +30,22 @@ public function test_character_limiter() $this->assertEquals('Short', character_limiter('Short', 5)); } - // ------------------------------------------------------------------------ - + // ------------------------------------------------------------------------ + public function test_ascii_to_entities() { $strs = array( '“‘ “test”' => '“‘ “test”', '†¥¨ˆøåß∂ƒ©˙∆˚¬' => '†¥¨ˆøåß∂ƒ©˙∆˚¬' ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, ascii_to_entities($str)); } } - // ------------------------------------------------------------------------ + // ------------------------------------------------------------------------ public function test_entities_to_ascii() { @@ -53,27 +53,27 @@ public function test_entities_to_ascii() '“‘ “test”' => '“‘ “test”', '†¥¨ˆøåß∂ƒ©˙∆˚¬' => '†¥¨ˆøåß∂ƒ©˙∆˚¬' ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, entities_to_ascii($str)); - } + } } - - // ------------------------------------------------------------------------ - - function test_convert_accented_characters() + + // ------------------------------------------------------------------------ + + public function test_convert_accented_characters() { $this->assertEquals('AAAeEEEIIOOEUUUeY', convert_accented_characters('ÀÂÄÈÊËÎÏÔŒÙÛÜŸ')); $this->assertEquals('a e i o u n ue', convert_accented_characters('á é í ó ú ñ ü')); } - // ------------------------------------------------------------------------ - + // ------------------------------------------------------------------------ + public function test_censored_words() { $censored = array('boob', 'nerd', 'ass', 'fart'); - + $strs = array( 'Ted bobbled the ball' => 'Ted bobbled the ball', 'Jake is a nerdo' => 'Jake is a nerdo', @@ -81,28 +81,26 @@ public function test_censored_words() 'Did Mary Fart?' => 'Did Mary $*#?', 'Jake is really a boob' => 'Jake is really a $*#' ); - - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, word_censor($str, $censored, '$*#')); } - + // test censored words being sent as a string $this->assertEquals('test', word_censor('test', 'test')); } - // ------------------------------------------------------------------------ + // ------------------------------------------------------------------------ public function test_highlight_code() { - $code = ''; $expect = "\n<?php var_dump(\$this); ?> \n\n"; - $this->assertEquals($expect, highlight_code($code)); + $this->assertEquals($expect, highlight_code('')); } - // ------------------------------------------------------------------------ + // ------------------------------------------------------------------------ public function test_highlight_phrase() { @@ -113,14 +111,14 @@ public function test_highlight_phrase() 'Or tell me what this is' => 'Or tell me what this is', '' => '' ); - + foreach ($strs as $str => $expect) { $this->assertEquals($expect, highlight_phrase($str, 'this is')); } } - // ------------------------------------------------------------------------ + // ------------------------------------------------------------------------ public function test_ellipsize() { @@ -144,32 +142,30 @@ public function test_ellipsize() 'short' => 'short' ), ); - + foreach ($strs as $pos => $s) { foreach ($s as $str => $expect) { - $this->assertEquals($expect, ellipsize($str, 10, $pos)); + $this->assertEquals($expect, ellipsize($str, 10, $pos)); } } } - // ------------------------------------------------------------------------ + // ------------------------------------------------------------------------ public function test_word_wrap() { - $string = "Here is a simple string of text that will help us demonstrate this function."; - $word_wrapped = word_wrap($string, 25); - $this->assertEquals(substr_count($word_wrapped, "\n"), 4); + $string = 'Here is a simple string of text that will help us demonstrate this function.'; + $this->assertEquals(substr_count(word_wrap($string, 25), "\n"), 4); } - // ------------------------------------------------------------------------ + // ------------------------------------------------------------------------ public function test_default_word_wrap_charlim() { $string = "Here is a longer string of text that will help us demonstrate the default charlim of this function."; - $word_wrapped = word_wrap($string); - $this->assertEquals(strpos($word_wrapped, "\n"), 73); + $this->assertEquals(strpos(word_wrap($string), "\n"), 73); } } \ No newline at end of file diff --git a/tests/codeigniter/helpers/url_helper_test.php b/tests/codeigniter/helpers/url_helper_test.php index c561809cefd..c81c5f1b8a9 100644 --- a/tests/codeigniter/helpers/url_helper_test.php +++ b/tests/codeigniter/helpers/url_helper_test.php @@ -72,4 +72,5 @@ public function test_pull_675() $this->assertEquals($out, auto_link($in, 'url')); } } + } \ No newline at end of file diff --git a/tests/codeigniter/helpers/xml_helper_test.php b/tests/codeigniter/helpers/xml_helper_test.php index a83fef91eb6..e8cf411daa3 100644 --- a/tests/codeigniter/helpers/xml_helper_test.php +++ b/tests/codeigniter/helpers/xml_helper_test.php @@ -6,10 +6,10 @@ public function set_up() { $this->helper('xml'); } - + public function test_xml_convert() { $this->assertEquals('<tag>my & test - </tag>', xml_convert('my & test - ')); } - + } \ No newline at end of file From c186288755aba46a2b6f0c3f104d9a6ce6b11a7f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 9 Jun 2012 23:16:58 +0300 Subject: [PATCH 1212/5397] Cleanup/optimize tests/codeigniter/ --- tests/codeigniter/Setup_test.php | 6 +- tests/codeigniter/core/Benchmark_test.php | 11 +- tests/codeigniter/core/Common_test.php | 6 +- tests/codeigniter/core/Config_test.php | 38 +-- tests/codeigniter/core/Input_test.php | 28 +-- tests/codeigniter/core/Lang_test.php | 12 +- tests/codeigniter/core/Loader_test.php | 132 +++++----- tests/codeigniter/core/Security_test.php | 23 +- tests/codeigniter/core/URI_test.php | 225 ++++++++---------- .../database/query_builder/count_test.php | 12 +- .../database/query_builder/delete_test.php | 16 +- .../database/query_builder/distinct_test.php | 9 +- .../database/query_builder/escape_test.php | 5 +- .../database/query_builder/from_test.php | 18 +- .../database/query_builder/get_test.php | 6 +- .../database/query_builder/group_test.php | 26 +- .../database/query_builder/join_test.php | 2 +- .../database/query_builder/like_test.php | 2 +- .../database/query_builder/limit_test.php | 7 +- .../database/query_builder/order_test.php | 6 +- .../database/query_builder/select_test.php | 12 +- .../database/query_builder/truncate_test.php | 7 +- .../database/query_builder/update_test.php | 26 +- .../database/query_builder/where_test.php | 28 +-- .../helpers/number_helper_test.php | 2 +- tests/codeigniter/libraries/Encrypt_test.php | 131 +++++----- tests/codeigniter/libraries/Parser_test.php | 61 +++-- tests/codeigniter/libraries/Table_test.php | 153 ++++++------ .../codeigniter/libraries/Typography_test.php | 40 ++-- .../codeigniter/libraries/Useragent_test.php | 6 +- 30 files changed, 463 insertions(+), 593 deletions(-) diff --git a/tests/codeigniter/Setup_test.php b/tests/codeigniter/Setup_test.php index b48e32bfb2b..5317c56c70b 100644 --- a/tests/codeigniter/Setup_test.php +++ b/tests/codeigniter/Setup_test.php @@ -1,13 +1,13 @@ assertTrue(defined('PROJECT_BASE')); $this->assertTrue(defined('BASEPATH')); $this->assertTrue(defined('APPPATH')); $this->assertTrue(defined('VIEWPATH')); } - + } \ No newline at end of file diff --git a/tests/codeigniter/core/Benchmark_test.php b/tests/codeigniter/core/Benchmark_test.php index 109b388210f..a239ba51d0e 100644 --- a/tests/codeigniter/core/Benchmark_test.php +++ b/tests/codeigniter/core/Benchmark_test.php @@ -1,14 +1,14 @@ benchmark = new Mock_Core_Benchmark(); } - + // -------------------------------------------------------------------- - + public function test_mark() { $this->assertEmpty($this->benchmark->marker); @@ -18,7 +18,7 @@ public function test_mark() $this->assertEquals(1, count($this->benchmark->marker)); $this->assertArrayHasKey('code_start', $this->benchmark->marker); } - + // -------------------------------------------------------------------- public function test_elapsed_time() @@ -29,7 +29,7 @@ public function test_elapsed_time() $this->benchmark->mark('code_start'); sleep(1); $this->benchmark->mark('code_end'); - + $this->assertEquals('1.0', $this->benchmark->elapsed_time('code_start', 'code_end', 1)); } @@ -39,4 +39,5 @@ public function test_memory_usage() { $this->assertEquals('{memory_usage}', $this->benchmark->memory_usage()); } + } \ No newline at end of file diff --git a/tests/codeigniter/core/Common_test.php b/tests/codeigniter/core/Common_test.php index dded2e8244f..f9bf6c27fa5 100644 --- a/tests/codeigniter/core/Common_test.php +++ b/tests/codeigniter/core/Common_test.php @@ -1,13 +1,13 @@ assertEquals(TRUE, is_php('1.2.0')); $this->assertEquals(FALSE, is_php('9999.9.9')); } - + } \ No newline at end of file diff --git a/tests/codeigniter/core/Config_test.php b/tests/codeigniter/core/Config_test.php index 30f0cc61de7..30cb90a28e1 100644 --- a/tests/codeigniter/core/Config_test.php +++ b/tests/codeigniter/core/Config_test.php @@ -5,7 +5,7 @@ class Config_test extends CI_TestCase { public function set_up() { $cls =& $this->ci_core_class('cfg'); - + // set predictable config values $this->ci_set_config(array( 'index_page' => 'index.php', @@ -13,9 +13,9 @@ public function set_up() 'subclass_prefix' => 'MY_' )); - $this->config = new $cls; + $this->config = new $cls; } - + // -------------------------------------------------------------------- public function test_item() @@ -24,30 +24,30 @@ public function test_item() // Bad Config value $this->assertFalse($this->config->item('no_good_item')); - + // Index $this->assertFalse($this->config->item('no_good_item', 'bad_index')); $this->assertFalse($this->config->item('no_good_item', 'default')); } - + // -------------------------------------------------------------------- - + public function test_set_item() { $this->assertFalse($this->config->item('not_yet_set')); - + $this->config->set_item('not_yet_set', 'is set'); - + $this->assertEquals('is set', $this->config->item('not_yet_set')); } // -------------------------------------------------------------------- - + public function test_slash_item() { // Bad Config value $this->assertFalse($this->config->slash_item('no_good_item')); - + $this->assertEquals('http://example.com/', $this->config->slash_item('base_url')); $this->assertEquals('MY_/', $this->config->slash_item('subclass_prefix')); @@ -58,33 +58,33 @@ public function test_slash_item() public function test_site_url() { $this->assertEquals('http://example.com/index.php', $this->config->site_url()); - + $base_url = $this->config->item('base_url'); - + $this->config->set_item('base_url', ''); - + $q_string = $this->config->item('enable_query_strings'); - + $this->config->set_item('enable_query_strings', FALSE); $this->assertEquals('index.php/test', $this->config->site_url('test')); $this->assertEquals('index.php/test/1', $this->config->site_url(array('test', '1'))); - + $this->config->set_item('enable_query_strings', TRUE); $this->assertEquals('index.php?test', $this->config->site_url('test')); $this->assertEquals('index.php?0=test&1=1', $this->config->site_url(array('test', '1'))); - + $this->config->set_item('base_url', $base_url); $this->assertEquals('http://example.com/index.php?test', $this->config->site_url('test')); - + // back to home base - $this->config->set_item('enable_query_strings', $q_string); + $this->config->set_item('enable_query_strings', $q_string); } // -------------------------------------------------------------------- - + public function test_system_url() { $this->assertEquals('http://example.com/system/', $this->config->system_url()); diff --git a/tests/codeigniter/core/Input_test.php b/tests/codeigniter/core/Input_test.php index c9322c02726..fe8738832fe 100644 --- a/tests/codeigniter/core/Input_test.php +++ b/tests/codeigniter/core/Input_test.php @@ -1,7 +1,7 @@ input = new Mock_Core_Input($security, $utf8); } - + // -------------------------------------------------------------------- - + public function test_get_not_exists() { $this->assertEmpty($this->input->get()); @@ -38,7 +38,7 @@ public function test_get_not_exists() } // -------------------------------------------------------------------- - + public function test_get_exist() { $_SERVER['REQUEST_METHOD'] = 'GET'; @@ -49,7 +49,7 @@ public function test_get_exist() } // -------------------------------------------------------------------- - + public function test_get_exist_with_xss_clean() { $_SERVER['REQUEST_METHOD'] = 'GET'; @@ -61,7 +61,7 @@ public function test_get_exist_with_xss_clean() } // -------------------------------------------------------------------- - + public function test_post_not_exists() { $this->assertEmpty($this->input->post()); @@ -78,7 +78,7 @@ public function test_post_not_exists() } // -------------------------------------------------------------------- - + public function test_post_exist() { $_SERVER['REQUEST_METHOD'] = 'POST'; @@ -89,7 +89,7 @@ public function test_post_exist() } // -------------------------------------------------------------------- - + public function test_post_exist_with_xss_clean() { $_SERVER['REQUEST_METHOD'] = 'POST'; @@ -101,7 +101,7 @@ public function test_post_exist_with_xss_clean() } // -------------------------------------------------------------------- - + public function test_get_post() { $_SERVER['REQUEST_METHOD'] = 'POST'; @@ -111,7 +111,7 @@ public function test_get_post() } // -------------------------------------------------------------------- - + public function test_cookie() { $_COOKIE['foo'] = 'bar'; @@ -120,14 +120,14 @@ public function test_cookie() } // -------------------------------------------------------------------- - + public function test_server() { $this->assertEquals('GET', $this->input->server('REQUEST_METHOD')); } // -------------------------------------------------------------------- - + public function test_fetch_from_array() { $data = array( @@ -145,14 +145,14 @@ public function test_fetch_from_array() } // -------------------------------------------------------------------- - + public function test_valid_ip() { $ip_v4 = '192.18.0.1'; $this->assertTrue($this->input->valid_ip($ip_v4)); $ip_v6 = array('2001:0db8:0000:85a3:0000:0000:ac1f:8001', '2001:db8:0:85a3:0:0:ac1f:8001', '2001:db8:0:85a3::ac1f:8001'); - foreach($ip_v6 as $ip) + foreach ($ip_v6 as $ip) { $this->assertTrue($this->input->valid_ip($ip)); } diff --git a/tests/codeigniter/core/Lang_test.php b/tests/codeigniter/core/Lang_test.php index 874230feb95..a410dabfa3a 100644 --- a/tests/codeigniter/core/Lang_test.php +++ b/tests/codeigniter/core/Lang_test.php @@ -1,9 +1,9 @@ ci_core_class('load'); @@ -12,9 +12,9 @@ public function set_up() $cls = $this->ci_core_class('lang'); $this->lang = new $cls; } - + // -------------------------------------------------------------------- - + public function test_load() { $this->assertTrue($this->lang->load('profiler', 'english')); @@ -22,11 +22,11 @@ public function test_load() } // -------------------------------------------------------------------- - + public function test_load_with_unspecified_language() { $this->assertTrue($this->lang->load('profiler')); $this->assertEquals('URI STRING', $this->lang->line('profiler_uri_string')); } - + } \ No newline at end of file diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index 43008651e50..fdea962b779 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -1,35 +1,35 @@ load = new Mock_Core_Loader(); - + // mock up a ci instance - $this->ci_obj = new StdClass; - + $this->ci_obj = new stdClass; + // Fix get_instance() $this->ci_instance($this->ci_obj); } // -------------------------------------------------------------------- - + public function test_library() { $this->_setup_config_mock(); - + // Test loading as an array. $this->assertNull($this->load->library(array('table'))); $this->assertTrue(class_exists('CI_Table'), 'Table class exists'); $this->assertAttributeInstanceOf('CI_Table', 'table', $this->ci_obj); - + // Test no lib given $this->assertEquals(FALSE, $this->load->library()); - + // Test a string given to params $this->assertEquals(NULL, $this->load->library('table', ' ')); } @@ -39,20 +39,18 @@ public function test_library() public function test_load_library_in_application_dir() { $this->_setup_config_mock(); - + $content = 'withContent($content) - ->at($this->load->libs_dir); - + + $model = vfsStream::newFile('Super_test_library.php')->withContent($content)->at($this->load->libs_dir); $this->assertNull($this->load->library('super_test_library')); - + // Was the model class instantiated. - $this->assertTrue(class_exists('Super_test_library')); + $this->assertTrue(class_exists('Super_test_library')); } - + // -------------------------------------------------------------------- - + private function _setup_config_mock() { // Mock up a config object until we @@ -61,7 +59,7 @@ private function _setup_config_mock() $config->expects($this->any()) ->method('load') ->will($this->returnValue(TRUE)); - + // Add the mock to our stdClass $this->ci_instance_var('config', $config); } @@ -73,64 +71,62 @@ public function test_non_existent_model() $this->setExpectedException( 'RuntimeException', 'CI Error: Unable to locate the model you have specified: ci_test_nonexistent_model.php' - ); - + ); + $this->load->model('ci_test_nonexistent_model.php'); } // -------------------------------------------------------------------- - + /** * @coverts CI_Loader::model */ public function test_models() { $this->ci_set_core_class('model', 'CI_Model'); - + $content = 'withContent($content) - ->at($this->load->models_dir); - + + $model = vfsStream::newFile('unit_test_model.php')->withContent($content)->at($this->load->models_dir); + $this->assertNull($this->load->model('unit_test_model')); - + // Was the model class instantiated. $this->assertTrue(class_exists('Unit_test_model')); - + // Test no model given - $this->assertNull($this->load->model('')); + $this->assertNull($this->load->model('')); } // -------------------------------------------------------------------- - + // public function testDatabase() // { // $this->assertEquals(NULL, $this->load->database()); - // $this->assertEquals(NULL, $this->load->dbutil()); + // $this->assertEquals(NULL, $this->load->dbutil()); // } // -------------------------------------------------------------------- - + /** * @coverts CI_Loader::view */ public function test_load_view() { $this->ci_set_core_class('output', 'CI_Output'); - + $content = 'This is my test page. '; - $view = vfsStream::newFile('unit_test_view.php')->withContent($content) - ->at($this->load->views_dir); - + $view = vfsStream::newFile('unit_test_view.php')->withContent($content)->at($this->load->views_dir); + // Use the optional return parameter in this test, so the view is not // run through the output class. $this->assertEquals('This is my test page. World!', $this->load->view('unit_test_view', array('hello' => "World!"), TRUE)); - + } // -------------------------------------------------------------------- - + /** * @coverts CI_Loader::view */ @@ -139,8 +135,8 @@ public function test_non_existent_view() $this->setExpectedException( 'RuntimeException', 'CI Error: Unable to load the requested file: ci_test_nonexistent_view.php' - ); - + ); + $this->load->view('ci_test_nonexistent_view', array('foo' => 'bar')); } @@ -149,87 +145,77 @@ public function test_non_existent_view() public function test_file() { $content = 'Here is a test file, which we will load now.'; - $file = vfsStream::newFile('ci_test_mock_file.php')->withContent($content) - ->at($this->load->views_dir); - + $file = vfsStream::newFile('ci_test_mock_file.php')->withContent($content)->at($this->load->views_dir); + // Just like load->view(), take the output class out of the mix here. - $load = $this->load->file(vfsStream::url('application').'/views/ci_test_mock_file.php', - TRUE); - + $load = $this->load->file(vfsStream::url('application').'/views/ci_test_mock_file.php', TRUE); + $this->assertEquals($content, $load); - + $this->setExpectedException( 'RuntimeException', 'CI Error: Unable to load the requested file: ci_test_file_not_exists' - ); - + ); + $this->load->file('ci_test_file_not_exists', TRUE); - } // -------------------------------------------------------------------- - + public function test_vars() { - $vars = array( - 'foo' => 'bar' - ); - - $this->assertNull($this->load->vars($vars)); + $this->assertNull($this->load->vars(array('foo' => 'bar'))); $this->assertNull($this->load->vars('foo', 'bar')); } // -------------------------------------------------------------------- - + public function test_helper() { $this->assertEquals(NULL, $this->load->helper('array')); - + $this->setExpectedException( 'RuntimeException', 'CI Error: Unable to load the requested file: helpers/bad_helper.php' - ); - + ); + $this->load->helper('bad'); } - + // -------------------------------------------------------------------- public function test_loading_multiple_helpers() { $this->assertEquals(NULL, $this->load->helpers(array('file', 'array', 'string'))); } - + // -------------------------------------------------------------------- - + // public function testLanguage() // { // $this->assertEquals(NULL, $this->load->language('test')); - // } + // } // -------------------------------------------------------------------- public function test_load_config() { $this->_setup_config_mock(); - $this->assertNull($this->load->config('config', FALSE)); } - + // -------------------------------------------------------------------- public function test_load_bad_config() { $this->_setup_config_mock(); - + $this->setExpectedException( 'RuntimeException', 'CI Error: The configuration file foobar.php does not exist.' - ); - + ); + $this->load->config('foobar', FALSE); } - // -------------------------------------------------------------------- - -} +} \ No newline at end of file diff --git a/tests/codeigniter/core/Security_test.php b/tests/codeigniter/core/Security_test.php index b2f8c69d2db..3f6e3b07aa0 100644 --- a/tests/codeigniter/core/Security_test.php +++ b/tests/codeigniter/core/Security_test.php @@ -1,7 +1,7 @@ security = new Mock_Core_Security(); } - + // -------------------------------------------------------------------- - + public function test_csrf_verify() { $_SERVER['REQUEST_METHOD'] = 'GET'; @@ -25,7 +25,7 @@ public function test_csrf_verify() } // -------------------------------------------------------------------- - + public function test_csrf_verify_invalid() { // Without issuing $_POST[csrf_token_name], this request will triggering CSRF error @@ -37,7 +37,7 @@ public function test_csrf_verify_invalid() } // -------------------------------------------------------------------- - + public function test_csrf_verify_valid() { $_SERVER['REQUEST_METHOD'] = 'POST'; @@ -47,21 +47,21 @@ public function test_csrf_verify_valid() } // -------------------------------------------------------------------- - + public function test_get_csrf_hash() { $this->assertEquals($this->security->csrf_hash, $this->security->get_csrf_hash()); } // -------------------------------------------------------------------- - + public function test_get_csrf_token_name() { $this->assertEquals('ci_csrf_token', $this->security->get_csrf_token_name()); } // -------------------------------------------------------------------- - + public function test_xss_clean() { $harm_string = "Hello, i try to your site"; @@ -72,7 +72,7 @@ public function test_xss_clean() } // -------------------------------------------------------------------- - + public function test_xss_hash() { $this->assertEmpty($this->security->xss_hash); @@ -84,7 +84,7 @@ public function test_xss_hash() } // -------------------------------------------------------------------- - + public function test_entity_decode() { $encoded = '<div>Hello <b>Booya</b></div>'; @@ -94,7 +94,7 @@ public function test_entity_decode() } // -------------------------------------------------------------------- - + public function test_sanitize_filename() { $filename = './'; @@ -102,4 +102,5 @@ public function test_sanitize_filename() $this->assertEquals('foo', $safe_filename); } + } \ No newline at end of file diff --git a/tests/codeigniter/core/URI_test.php b/tests/codeigniter/core/URI_test.php index e340ddf730b..0ba694b46e5 100644 --- a/tests/codeigniter/core/URI_test.php +++ b/tests/codeigniter/core/URI_test.php @@ -1,7 +1,7 @@ uri = new Mock_Core_URI(); @@ -13,19 +13,12 @@ public function test_set_uri_string() { // Slashes get killed $this->uri->_set_uri_string('/'); - - $a = ''; - $b =& $this->uri->uri_string; - - $this->assertEquals($a, $b); - + $this->assertEquals('', $this->uri->uri_string); + $this->uri->_set_uri_string('nice/uri'); - - $a = 'nice/uri'; - - $this->assertEquals($a, $b); + $this->assertEquals('nice/uri', $this->uri->uri_string); } - + // -------------------------------------------------------------------- public function test_fetch_uri_string() @@ -34,75 +27,61 @@ public function test_fetch_uri_string() // uri_protocol: AUTO $this->uri->config->set_item('uri_protocol', 'AUTO'); - + // Test a variety of request uris $requests = array( '/index.php/controller/method' => 'controller/method', '/index.php?/controller/method' => 'controller/method', '/index.php?/controller/method/?var=foo' => 'controller/method' ); - + foreach($requests as $request => $expected) { $_SERVER['SCRIPT_NAME'] = '/index.php'; $_SERVER['REQUEST_URI'] = $request; - + $this->uri->_fetch_uri_string(); $this->assertEquals($expected, $this->uri->uri_string ); } - + // Test a subfolder $_SERVER['SCRIPT_NAME'] = '/subfolder/index.php'; $_SERVER['REQUEST_URI'] = '/subfolder/index.php/controller/method'; - + $this->uri->_fetch_uri_string(); - - $a = 'controller/method'; - $b = $this->uri->uri_string; - - $this->assertEquals($a, $b); - + $this->assertEquals('controller/method', $this->uri->uri_string); + // death to request uri unset($_SERVER['REQUEST_URI']); - + // life to path info - $_SERVER['PATH_INFO'] = '/controller/method/'; - + $_SERVER['PATH_INFO'] = $a = '/controller/method/'; + $this->uri->_fetch_uri_string(); - - $a = '/controller/method/'; - $b =& $this->uri->uri_string; + $this->assertEquals($a, $this->uri->uri_string); - $this->assertEquals($a, $b); - // death to path info // At this point your server must be seriously drunk unset($_SERVER['PATH_INFO']); - + $_SERVER['QUERY_STRING'] = '/controller/method/'; - + $this->uri->_fetch_uri_string(); + $this->assertEquals($a, $this->uri->uri_string); - $a = '/controller/method/'; - $b = $this->uri->uri_string; - - $this->assertEquals($a, $b); - // At this point your server is a labotomy victim - unset($_SERVER['QUERY_STRING']); - + $_GET['/controller/method/'] = ''; - + $this->uri->_fetch_uri_string(); - $this->assertEquals($a, $b); + $this->assertEquals($a, $this->uri->uri_string); // Test coverage implies that these will work // uri_protocol: REQUEST_URI // uri_protocol: CLI - } - + // -------------------------------------------------------------------- public function test_explode_segments() @@ -113,18 +92,15 @@ public function test_explode_segments() '/test2/uri2' => array('test2', 'uri2'), '//test3/test3///' => array('test3', 'test3') ); - - foreach($uris as $uri => $a) + + foreach ($uris as $uri => $a) { $this->uri->segments = array(); $this->uri->uri_string = $uri; $this->uri->_explode_segments(); - - $b = $this->uri->segments; - - $this->assertEquals($a, $b); + + $this->assertEquals($a, $this->uri->segments); } - } // -------------------------------------------------------------------- @@ -133,7 +109,7 @@ public function test_filter_uri() { $this->uri->config->set_item('enable_query_strings', FALSE); $this->uri->config->set_item('permitted_uri_chars', 'a-z 0-9~%.:_\-'); - + $str_in = 'abc01239~%.:_-'; $str = $this->uri->_filter_uri($str_in); @@ -145,52 +121,52 @@ public function test_filter_uri() public function test_filter_uri_escaping() { // ensure escaping even if dodgey characters are permitted - + $this->uri->config->set_item('enable_query_strings', FALSE); $this->uri->config->set_item('permitted_uri_chars', 'a-z 0-9~%.:_\-()$'); $str = $this->uri->_filter_uri('$destroy_app(foo)'); - + $this->assertEquals($str, '$destroy_app(foo)'); } // -------------------------------------------------------------------- - public function test_filter_uri_throws_error() - { + public function test_filter_uri_throws_error() + { $this->setExpectedException('RuntimeException'); - + $this->uri->config->set_item('enable_query_strings', FALSE); $this->uri->config->set_item('permitted_uri_chars', 'a-z 0-9~%.:_\-'); $this->uri->_filter_uri('$this()'); - } + } // -------------------------------------------------------------------- public function test_remove_url_suffix() { $this->uri->config->set_item('url_suffix', '.html'); - + $this->uri->uri_string = 'controller/method/index.html'; $this->uri->_remove_url_suffix(); - + $this->assertEquals($this->uri->uri_string, 'controller/method/index'); - + $this->uri->uri_string = 'controller/method/index.htmlify.html'; $this->uri->_remove_url_suffix(); - + $this->assertEquals($this->uri->uri_string, 'controller/method/index.htmlify'); } // -------------------------------------------------------------------- - + public function test_segment() { $this->uri->segments = array(1 => 'controller'); $this->assertEquals($this->uri->segment(1), 'controller'); $this->assertEquals($this->uri->segment(2, 'default'), 'default'); } - + // -------------------------------------------------------------------- public function test_rsegment() @@ -205,32 +181,33 @@ public function test_rsegment() public function test_uri_to_assoc() { $this->uri->segments = array('a', '1', 'b', '2', 'c', '3'); - - $a = array('a' => '1', 'b' => '2', 'c' => '3'); - $b = $this->uri->uri_to_assoc(1); - $this->assertEquals($a, $b); - - $a = array('b' => '2', 'c' => '3'); - $b = $this->uri->uri_to_assoc(3); - $this->assertEquals($a, $b); - - + + $this->assertEquals( + array('a' => '1', 'b' => '2', 'c' => '3'), + $this->uri->uri_to_assoc(1) + ); + + $this->assertEquals( + array('b' => '2', 'c' => '3'), + $this->uri->uri_to_assoc(3) + ); + $this->uri->keyval = array(); // reset cache - $this->uri->segments = array('a', '1', 'b', '2', 'c'); - - $a = array('a' => '1', 'b' => '2', 'c' => FALSE); - $b = $this->uri->uri_to_assoc(1); - $this->assertEquals($a, $b); - + + $this->assertEquals( + array('a' => '1', 'b' => '2', 'c' => FALSE), + $this->uri->uri_to_assoc(1) + ); + $this->uri->keyval = array(); // reset cache - $this->uri->segments = array('a', '1'); - + // test default - $a = array('a' => '1', 'b' => FALSE); - $b = $this->uri->uri_to_assoc(1, array('a', 'b')); - $this->assertEquals($a, $b); + $this->assertEquals( + array('a' => '1', 'b' => FALSE), + $this->uri->uri_to_assoc(1, array('a', 'b')) + ); } // -------------------------------------------------------------------- @@ -238,33 +215,33 @@ public function test_uri_to_assoc() public function test_ruri_to_assoc() { $this->uri->rsegments = array('x', '1', 'y', '2', 'z', '3'); - - $a = array('x' => '1', 'y' => '2', 'z' => '3'); - $b = $this->uri->ruri_to_assoc(1); - $this->assertEquals($a, $b); - - $a = array('y' => '2', 'z' => '3'); - $b = $this->uri->ruri_to_assoc(3); - $this->assertEquals($a, $b); - - + + $this->assertEquals( + array('x' => '1', 'y' => '2', 'z' => '3'), + $this->uri->ruri_to_assoc(1) + ); + + $this->assertEquals( + array('y' => '2', 'z' => '3'), + $this->uri->ruri_to_assoc(3) + ); + $this->uri->keyval = array(); // reset cache - $this->uri->rsegments = array('x', '1', 'y', '2', 'z'); - - $a = array('x' => '1', 'y' => '2', 'z' => FALSE); - $b = $this->uri->ruri_to_assoc(1); - $this->assertEquals($a, $b); - + + $this->assertEquals( + array('x' => '1', 'y' => '2', 'z' => FALSE), + $this->uri->ruri_to_assoc(1) + ); + $this->uri->keyval = array(); // reset cache - $this->uri->rsegments = array('x', '1'); - - // test default - $a = array('x' => '1', 'y' => FALSE); - $b = $this->uri->ruri_to_assoc(1, array('x', 'y')); - $this->assertEquals($a, $b); + // test default + $this->assertEquals( + array('x' => '1', 'y' => FALSE), + $this->uri->ruri_to_assoc(1, array('x', 'y')) + ); } // -------------------------------------------------------------------- @@ -272,11 +249,7 @@ public function test_ruri_to_assoc() public function test_assoc_to_uri() { $this->uri->config->set_item('uri_string_slashes', 'none'); - - $arr = array('a' => 1, 'b' => 2); - $a = 'a/1/b/2'; - $b = $this->uri->assoc_to_uri($arr); - $this->assertEquals($a, $b); + $this->assertEquals('a/1/b/2', $this->uri->assoc_to_uri(array('a' => '1', 'b' => '2'))); } // -------------------------------------------------------------------- @@ -286,28 +259,18 @@ public function test_slash_segment() $this->uri->segments[1] = 'segment'; $this->uri->rsegments[1] = 'segment'; - $a = '/segment/'; - $b = $this->uri->slash_segment(1, 'both'); - $this->assertEquals($a, $b); - $b = $this->uri->slash_rsegment(1, 'both'); - $this->assertEquals($a, $b); - + $this->assertEquals('/segment/', $this->uri->slash_segment(1, 'both')); + $this->assertEquals('/segment/', $this->uri->slash_rsegment(1, 'both')); + $a = '/segment'; - $b = $this->uri->slash_segment(1, 'leading'); - $this->assertEquals($a, $b); - $b = $this->uri->slash_rsegment(1, 'leading'); - $this->assertEquals($a, $b); - - $a = 'segment/'; - $b = $this->uri->slash_segment(1, 'trailing'); - $this->assertEquals($a, $b); - $b = $this->uri->slash_rsegment(1, 'trailing'); - $this->assertEquals($a, $b); - } + $this->assertEquals('/segment', $this->uri->slash_segment(1, 'leading')); + $this->assertEquals('/segment', $this->uri->slash_rsegment(1, 'leading')); + $this->assertEquals('segment/', $this->uri->slash_segment(1, 'trailing')); + $this->assertEquals('segment/', $this->uri->slash_rsegment(1, 'trailing')); + } } -// END URI_test Class /* End of file URI_test.php */ -/* Location: ./tests/core/URI_test.php */ +/* Location: ./tests/core/URI_test.php */ \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/count_test.php b/tests/codeigniter/database/query_builder/count_test.php index 5e691692dbb..90ac5283e8e 100644 --- a/tests/codeigniter/database/query_builder/count_test.php +++ b/tests/codeigniter/database/query_builder/count_test.php @@ -22,10 +22,7 @@ public function set_up() */ public function test_count_all() { - $job_count = $this->db->count_all('job'); - - // Check the result - $this->assertEquals(4, $job_count); + $this->assertEquals(4, $this->db->count_all('job')); } // ------------------------------------------------------------------------ @@ -35,10 +32,7 @@ public function test_count_all() */ public function test_count_all_results() { - $job_count = $this->db->like('name', 'ian') - ->count_all_results('job'); - - // Check the result - $this->assertEquals(2, $job_count); + $this->assertEquals(2, $this->db->like('name', 'ian')->count_all_results('job')); } + } \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/delete_test.php b/tests/codeigniter/database/query_builder/delete_test.php index 84ea7616ff5..ab9d97f56be 100644 --- a/tests/codeigniter/database/query_builder/delete_test.php +++ b/tests/codeigniter/database/query_builder/delete_test.php @@ -23,9 +23,7 @@ public function set_up() public function test_delete() { // Check initial record - $job1 = $this->db->where('id', 1) - ->get('job') - ->row(); + $job1 = $this->db->where('id', 1)->get('job')->row(); $this->assertEquals('Developer', $job1->name); @@ -33,8 +31,7 @@ public function test_delete() $this->db->delete('job', array('id' => 1)); // Check the record - $job1 = $this->db->where('id', 1) - ->get('job'); + $job1 = $this->db->where('id', 1)->get('job'); $this->assertEmpty($job1->result_array()); } @@ -47,13 +44,8 @@ public function test_delete() public function test_delete_several_tables() { // Check initial record - $user4 = $this->db->where('id', 4) - ->get('user') - ->row(); - - $job4 = $this->db->where('id', 4) - ->get('job') - ->row(); + $user4 = $this->db->where('id', 4)->get('user')->row(); + $job4 = $this->db->where('id', 4)->get('job')->row(); $this->assertEquals('Musician', $job4->name); $this->assertEquals('Chris Martin', $user4->name); diff --git a/tests/codeigniter/database/query_builder/distinct_test.php b/tests/codeigniter/database/query_builder/distinct_test.php index 925eadb19ea..cc98009ced3 100644 --- a/tests/codeigniter/database/query_builder/distinct_test.php +++ b/tests/codeigniter/database/query_builder/distinct_test.php @@ -23,11 +23,10 @@ public function set_up() public function test_distinct() { $users = $this->db->select('country') - ->distinct() - ->get('user') - ->result_array(); - - // Check the result + ->distinct() + ->get('user') + ->result_array(); + $this->assertEquals(3, count($users)); } diff --git a/tests/codeigniter/database/query_builder/escape_test.php b/tests/codeigniter/database/query_builder/escape_test.php index 5d575a37bfb..c6380ddf1c8 100644 --- a/tests/codeigniter/database/query_builder/escape_test.php +++ b/tests/codeigniter/database/query_builder/escape_test.php @@ -35,7 +35,7 @@ public function test_escape_like_percent_sign() } $res = $this->db->query($sql)->result_array(); - + // Check the result $this->assertEquals(1, count($res)); } @@ -60,8 +60,9 @@ public function test_escape_like_backslash_sign() } $res = $this->db->query($sql)->result_array(); - + // Check the result $this->assertEquals(2, count($res)); } + } \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/from_test.php b/tests/codeigniter/database/query_builder/from_test.php index 95ae4dfdbf3..7aaae348db5 100644 --- a/tests/codeigniter/database/query_builder/from_test.php +++ b/tests/codeigniter/database/query_builder/from_test.php @@ -23,10 +23,9 @@ public function set_up() public function test_from_simple() { $jobs = $this->db->from('job') - ->get() - ->result_array(); - - // Check items + ->get() + ->result_array(); + $this->assertEquals(4, count($jobs)); } @@ -38,14 +37,13 @@ public function test_from_simple() public function test_from_with_where() { $job1 = $this->db->from('job') - ->where('id', 1) - ->get() - ->row(); - - // Check the result + ->where('id', 1) + ->get() + ->row(); + $this->assertEquals('1', $job1->id); $this->assertEquals('Developer', $job1->name); $this->assertEquals('Awesome job, but sometimes makes you bored', $job1->description); } - + } \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/get_test.php b/tests/codeigniter/database/query_builder/get_test.php index 0751c9332c8..699d2906a5a 100644 --- a/tests/codeigniter/database/query_builder/get_test.php +++ b/tests/codeigniter/database/query_builder/get_test.php @@ -23,7 +23,7 @@ public function set_up() public function test_get_simple() { $jobs = $this->db->get('job')->result_array(); - + // Dummy jobs contain 4 rows $this->assertCount(4, $jobs); @@ -42,12 +42,12 @@ public function test_get_simple() public function test_get_where() { $job1 = $this->db->get('job', array('id' => 1))->result_array(); - + // Dummy jobs contain 1 rows $this->assertCount(1, $job1); // Check rows item $this->assertEquals('Developer', $job1[0]['name']); } - + } \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/group_test.php b/tests/codeigniter/database/query_builder/group_test.php index 7d8abc33fba..5249f7c8764 100644 --- a/tests/codeigniter/database/query_builder/group_test.php +++ b/tests/codeigniter/database/query_builder/group_test.php @@ -23,12 +23,11 @@ public function set_up() public function test_group_by() { $jobs = $this->db->select('name') - ->from('job') - ->group_by('name') - ->get() - ->result_array(); - - // Check the result + ->from('job') + ->group_by('name') + ->get() + ->result_array(); + $this->assertEquals(4, count($jobs)); } @@ -40,14 +39,13 @@ public function test_group_by() public function test_having_by() { $jobs = $this->db->select('name') - ->from('job') - ->group_by('name') - ->having('SUM(id) > 2') - ->get() - ->result_array(); - - // Check the result + ->from('job') + ->group_by('name') + ->having('SUM(id) > 2') + ->get() + ->result_array(); + $this->assertEquals(2, count($jobs)); } - + } \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/join_test.php b/tests/codeigniter/database/query_builder/join_test.php index e05329d670a..b8cf2a82239 100644 --- a/tests/codeigniter/database/query_builder/join_test.php +++ b/tests/codeigniter/database/query_builder/join_test.php @@ -34,5 +34,5 @@ public function test_join_simple() $this->assertEquals('Derek Jones', $job_user[0]['user_name']); $this->assertEquals('Developer', $job_user[0]['job_name']); } - + } \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/like_test.php b/tests/codeigniter/database/query_builder/like_test.php index df98c713fde..5f3e5222878 100644 --- a/tests/codeigniter/database/query_builder/like_test.php +++ b/tests/codeigniter/database/query_builder/like_test.php @@ -86,5 +86,5 @@ public function test_or_not_like() $this->assertEquals('Accountant', $jobs[1]['name']); $this->assertEquals('Musician', $jobs[2]['name']); } - + } \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/limit_test.php b/tests/codeigniter/database/query_builder/limit_test.php index 704f3b651e8..a0954c7ab56 100644 --- a/tests/codeigniter/database/query_builder/limit_test.php +++ b/tests/codeigniter/database/query_builder/limit_test.php @@ -25,8 +25,7 @@ public function test_limit() $jobs = $this->db->limit(2) ->get('job') ->result_array(); - - // Check the result + $this->assertEquals(2, count($jobs)); } @@ -40,10 +39,10 @@ public function test_limit_and_offset() $jobs = $this->db->limit(2, 2) ->get('job') ->result_array(); - - // Check the result + $this->assertEquals(2, count($jobs)); $this->assertEquals('Accountant', $jobs[0]['name']); $this->assertEquals('Musician', $jobs[1]['name']); } + } \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/order_test.php b/tests/codeigniter/database/query_builder/order_test.php index 01aa1c2b483..46f452bae5e 100644 --- a/tests/codeigniter/database/query_builder/order_test.php +++ b/tests/codeigniter/database/query_builder/order_test.php @@ -25,7 +25,7 @@ public function test_order_ascending() $jobs = $this->db->order_by('name', 'asc') ->get('job') ->result_array(); - + // Check the result $this->assertEquals(4, count($jobs)); $this->assertEquals('Accountant', $jobs[0]['name']); @@ -44,12 +44,12 @@ public function test_order_descending() $jobs = $this->db->order_by('name', 'desc') ->get('job') ->result_array(); - - // Check the result + $this->assertEquals(4, count($jobs)); $this->assertEquals('Politician', $jobs[0]['name']); $this->assertEquals('Musician', $jobs[1]['name']); $this->assertEquals('Developer', $jobs[2]['name']); $this->assertEquals('Accountant', $jobs[3]['name']); } + } \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/select_test.php b/tests/codeigniter/database/query_builder/select_test.php index 0d299ed16b2..877b5d8c071 100644 --- a/tests/codeigniter/database/query_builder/select_test.php +++ b/tests/codeigniter/database/query_builder/select_test.php @@ -25,7 +25,7 @@ public function test_select_only_one_collumn() $jobs_name = $this->db->select('name') ->get('job') ->result_array(); - + // Check rows item $this->assertArrayHasKey('name',$jobs_name[0]); $this->assertFalse(array_key_exists('id', $jobs_name[0])); @@ -42,7 +42,7 @@ public function test_select_min() $job_min = $this->db->select_min('id') ->get('job') ->row(); - + // Minimum id was 1 $this->assertEquals('1', $job_min->id); } @@ -57,7 +57,7 @@ public function test_select_max() $job_max = $this->db->select_max('id') ->get('job') ->row(); - + // Maximum id was 4 $this->assertEquals('4', $job_max->id); } @@ -72,7 +72,7 @@ public function test_select_avg() $job_avg = $this->db->select_avg('id') ->get('job') ->row(); - + // Average should be 2.5 $this->assertEquals('2.5', $job_avg->id); } @@ -87,9 +87,9 @@ public function test_select_sum() $job_sum = $this->db->select_sum('id') ->get('job') ->row(); - + // Sum of ids should be 10 $this->assertEquals('10', $job_sum->id); } - + } \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/truncate_test.php b/tests/codeigniter/database/query_builder/truncate_test.php index 2a9c8a91ee8..09923c7f1f1 100644 --- a/tests/codeigniter/database/query_builder/truncate_test.php +++ b/tests/codeigniter/database/query_builder/truncate_test.php @@ -24,7 +24,6 @@ public function test_truncate() { // Check initial record $jobs = $this->db->get('job')->result_array(); - $this->assertEquals(4, count($jobs)); // Do the empty @@ -32,7 +31,6 @@ public function test_truncate() // Check the record $jobs = $this->db->get('job'); - $this->assertEmpty($jobs->result_array()); } @@ -45,16 +43,13 @@ public function test_truncate_with_from() { // Check initial record $users = $this->db->get('user')->result_array(); - $this->assertEquals(4, count($users)); // Do the empty - $this->db->from('user') - ->truncate(); + $this->db->from('user')->truncate(); // Check the record $users = $this->db->get('user'); - $this->assertEmpty($users->result_array()); } diff --git a/tests/codeigniter/database/query_builder/update_test.php b/tests/codeigniter/database/query_builder/update_test.php index f5bbffd4f4c..27a647c4510 100644 --- a/tests/codeigniter/database/query_builder/update_test.php +++ b/tests/codeigniter/database/query_builder/update_test.php @@ -23,23 +23,14 @@ public function set_up() public function test_update() { // Check initial record - $job1 = $this->db->where('id', 1) - ->get('job') - ->row(); - + $job1 = $this->db->where('id', 1)->get('job')->row(); $this->assertEquals('Developer', $job1->name); // Do the update - $job_data = array('name' => 'Programmer'); - - $this->db->where('id', 1) - ->update('job', $job_data); + $this->db->where('id', 1)->update('job', array('name' => 'Programmer')); // Check updated record - $job1 = $this->db->where('id', 1) - ->get('job') - ->row(); - + $job1 = $this->db->where('id', 1)->get('job')->row(); $this->assertEquals('Programmer', $job1->name); } @@ -51,10 +42,7 @@ public function test_update() public function test_update_with_set() { // Check initial record - $job1 = $this->db->where('id', 4) - ->get('job') - ->row(); - + $job1 = $this->db->where('id', 4)->get('job')->row(); $this->assertEquals('Musician', $job1->name); // Do the update @@ -62,10 +50,8 @@ public function test_update_with_set() $this->db->update('job', NULL, 'id = 4'); // Check updated record - $job1 = $this->db->where('id', 4) - ->get('job') - ->row(); - + $job1 = $this->db->where('id', 4)->get('job')->row(); $this->assertEquals('Vocalist', $job1->name); } + } \ No newline at end of file diff --git a/tests/codeigniter/database/query_builder/where_test.php b/tests/codeigniter/database/query_builder/where_test.php index 607eaa076fb..20b7a567ceb 100644 --- a/tests/codeigniter/database/query_builder/where_test.php +++ b/tests/codeigniter/database/query_builder/where_test.php @@ -22,11 +22,8 @@ public function set_up() */ public function test_where_simple_key_value() { - $job1 = $this->db->where('id', 1) - ->get('job') - ->row(); + $job1 = $this->db->where('id', 1)->get('job')->row(); - // Check the result $this->assertEquals('1', $job1->id); $this->assertEquals('Developer', $job1->name); } @@ -38,11 +35,7 @@ public function test_where_simple_key_value() */ public function test_where_custom_key_value() { - $jobs = $this->db->where('id !=', 1) - ->get('job') - ->result_array(); - - // Check the result + $jobs = $this->db->where('id !=', 1)->get('job')->result_array(); $this->assertEquals(3, count($jobs)); } @@ -54,16 +47,12 @@ public function test_where_custom_key_value() public function test_where_associative_array() { $where = array('id >' => 2, 'name !=' => 'Accountant'); - $jobs = $this->db->where($where) - ->get('job') - ->result_array(); + $jobs = $this->db->where($where)->get('job')->result_array(); - // Check the result $this->assertEquals(1, count($jobs)); // Should be Musician $job = current($jobs); - $this->assertEquals('Musician', $job['name']); } @@ -75,16 +64,12 @@ public function test_where_associative_array() public function test_where_custom_string() { $where = "id > 2 AND name != 'Accountant'"; - $jobs = $this->db->where($where) - ->get('job') - ->result_array(); + $jobs = $this->db->where($where)->get('job')->result_array(); - // Check the result $this->assertEquals(1, count($jobs)); // Should be Musician $job = current($jobs); - $this->assertEquals('Musician', $job['name']); } @@ -100,7 +85,6 @@ public function test_where_or() ->get('job') ->result_array(); - // Check the result $this->assertEquals(3, count($jobs)); $this->assertEquals('Developer', $jobs[0]['name']); $this->assertEquals('Politician', $jobs[1]['name']); @@ -118,7 +102,6 @@ public function test_where_in() ->get('job') ->result_array(); - // Check the result $this->assertEquals(2, count($jobs)); $this->assertEquals('Politician', $jobs[0]['name']); $this->assertEquals('Accountant', $jobs[1]['name']); @@ -135,10 +118,9 @@ public function test_where_not_in() ->get('job') ->result_array(); - // Check the result $this->assertEquals(2, count($jobs)); $this->assertEquals('Developer', $jobs[0]['name']); $this->assertEquals('Musician', $jobs[1]['name']); } - + } \ No newline at end of file diff --git a/tests/codeigniter/helpers/number_helper_test.php b/tests/codeigniter/helpers/number_helper_test.php index 23d5c5c1a42..ef6aae138e2 100644 --- a/tests/codeigniter/helpers/number_helper_test.php +++ b/tests/codeigniter/helpers/number_helper_test.php @@ -25,7 +25,7 @@ public function set_up() // a cheap class to act as our super object. // Make sure it has a lang attribute. - $obj = new StdClass; + $obj = new stdClass; $obj->lang = $lang; $this->ci_instance($obj); } diff --git a/tests/codeigniter/libraries/Encrypt_test.php b/tests/codeigniter/libraries/Encrypt_test.php index 06699018608..153a25e1d67 100644 --- a/tests/codeigniter/libraries/Encrypt_test.php +++ b/tests/codeigniter/libraries/Encrypt_test.php @@ -2,70 +2,71 @@ class Encrypt_test extends CI_TestCase { - public function set_up() - { - $obj = new StdClass; - $obj->encrypt = new Mock_Libraries_Encrypt(); - - $this->ci_instance($obj); - $this->encrypt = $obj->encrypt; - - $this->ci_set_config('encryption_key', "Encryptin'glike@boss!"); - $this->msg = 'My secret message'; - } - - // -------------------------------------------------------------------- - - public function test_encode() - { - $this->assertNotEquals($this->msg, $this->encrypt->encode($this->msg)); - } - - // -------------------------------------------------------------------- - - public function test_decode() - { - $encoded_msg = $this->encrypt->encode($this->msg); - $this->assertEquals($this->msg, $this->encrypt->decode($encoded_msg)); - } - - // -------------------------------------------------------------------- - - public function test_optional_key() - { - $key = 'Ohai!ù0129°03182%HD1892P0'; - $encoded_msg = $this->encrypt->encode($this->msg, $key); - $this->assertEquals($this->msg, $this->encrypt->decode($encoded_msg, $key)); - } - - // -------------------------------------------------------------------- - - public function test_default_cipher() - { - $this->assertEquals('rijndael-256', $this->encrypt->get_cipher()); - } - - // -------------------------------------------------------------------- - - public function test_set_cipher() - { - $this->encrypt->set_cipher(MCRYPT_BLOWFISH); - $this->assertEquals('blowfish', $this->encrypt->get_cipher()); - } - - // -------------------------------------------------------------------- - - public function test_default_mode() - { - $this->assertEquals('cbc', $this->encrypt->get_mode()); - } - - // -------------------------------------------------------------------- - - public function test_set_mode() - { - $this->encrypt->set_mode(MCRYPT_MODE_CFB); - $this->assertEquals('cfb', $this->encrypt->get_mode()); - } + public function set_up() + { + $obj = new stdClass; + $obj->encrypt = new Mock_Libraries_Encrypt(); + + $this->ci_instance($obj); + $this->encrypt = $obj->encrypt; + + $this->ci_set_config('encryption_key', "Encryptin'glike@boss!"); + $this->msg = 'My secret message'; + } + + // -------------------------------------------------------------------- + + public function test_encode() + { + $this->assertNotEquals($this->msg, $this->encrypt->encode($this->msg)); + } + + // -------------------------------------------------------------------- + + public function test_decode() + { + $encoded_msg = $this->encrypt->encode($this->msg); + $this->assertEquals($this->msg, $this->encrypt->decode($encoded_msg)); + } + + // -------------------------------------------------------------------- + + public function test_optional_key() + { + $key = 'Ohai!ù0129°03182%HD1892P0'; + $encoded_msg = $this->encrypt->encode($this->msg, $key); + $this->assertEquals($this->msg, $this->encrypt->decode($encoded_msg, $key)); + } + + // -------------------------------------------------------------------- + + public function test_default_cipher() + { + $this->assertEquals('rijndael-256', $this->encrypt->get_cipher()); + } + + // -------------------------------------------------------------------- + + + public function test_set_cipher() + { + $this->encrypt->set_cipher(MCRYPT_BLOWFISH); + $this->assertEquals('blowfish', $this->encrypt->get_cipher()); + } + + // -------------------------------------------------------------------- + + public function test_default_mode() + { + $this->assertEquals('cbc', $this->encrypt->get_mode()); + } + + // -------------------------------------------------------------------- + + public function test_set_mode() + { + $this->encrypt->set_mode(MCRYPT_MODE_CFB); + $this->assertEquals('cfb', $this->encrypt->get_mode()); + } } \ No newline at end of file diff --git a/tests/codeigniter/libraries/Parser_test.php b/tests/codeigniter/libraries/Parser_test.php index c3d88fa8501..b68f44a3303 100644 --- a/tests/codeigniter/libraries/Parser_test.php +++ b/tests/codeigniter/libraries/Parser_test.php @@ -1,73 +1,74 @@ parser = new Mock_Libraries_Parser(); - + $this->ci_instance($obj); - + $this->parser = $obj->parser; } + // -------------------------------------------------------------------- - + public function test_set_delimiters() { // Make sure default delimiters are there $this->assertEquals('{', $this->parser->l_delim); $this->assertEquals('}', $this->parser->r_delim); - + // Change them to square brackets $this->parser->set_delimiters('[', ']'); - + // Make sure they changed $this->assertEquals('[', $this->parser->l_delim); $this->assertEquals(']', $this->parser->r_delim); - + // Reset them $this->parser->set_delimiters(); - + // Make sure default delimiters are there $this->assertEquals('{', $this->parser->l_delim); $this->assertEquals('}', $this->parser->r_delim); } - + // -------------------------------------------------------------------- - + public function test_parse_simple_string() { $data = array( 'title' => 'Page Title', 'body' => 'Lorem ipsum dolor sit amet.' ); - + $template = "{title}\n{body}"; - + $result = implode("\n", $data); - + $this->assertEquals($result, $this->parser->parse_string($template, $data, TRUE)); } - + // -------------------------------------------------------------------- - + public function test_parse() { $this->_parse_no_template(); $this->_parse_var_pair(); $this->_mismatched_var_pair(); } - + // -------------------------------------------------------------------- - + private function _parse_no_template() { $this->assertFalse($this->parser->parse_string('', '', TRUE)); } - + // -------------------------------------------------------------------- - + private function _parse_var_pair() { $data = array( @@ -78,16 +79,14 @@ private function _parse_var_pair() 'flying' => 'no'), ) ); - + $template = "{title}\n{powers}{invisibility}\n{flying}{/powers}"; - - $result = "Super Heroes\nyes\nno"; - - $this->assertEquals($result, $this->parser->parse_string($template, $data, TRUE)); + + $this->assertEquals("Super Heroes\nyes\nno", $this->parser->parse_string($template, $data, TRUE)); } - + // -------------------------------------------------------------------- - + private function _mismatched_var_pair() { $data = array( @@ -98,13 +97,11 @@ private function _mismatched_var_pair() 'flying' => 'no'), ) ); - + $template = "{title}\n{powers}{invisibility}\n{flying}"; - $result = "Super Heroes\n{powers}{invisibility}\n{flying}"; - - $this->assertEquals($result, $this->parser->parse_string($template, $data, TRUE)); + + $this->assertEquals($result, $this->parser->parse_string($template, $data, TRUE)); } - // -------------------------------------------------------------------- } \ No newline at end of file diff --git a/tests/codeigniter/libraries/Table_test.php b/tests/codeigniter/libraries/Table_test.php index f5133de1e64..edfc83dd00d 100644 --- a/tests/codeigniter/libraries/Table_test.php +++ b/tests/codeigniter/libraries/Table_test.php @@ -4,43 +4,39 @@ class Table_test extends CI_TestCase { public function set_up() { - $obj = new StdClass; + $obj = new stdClass; $obj->table = new Mock_Libraries_Table(); - + $this->ci_instance($obj); - + $this->table = $obj->table; } - // Setter Methods // -------------------------------------------------------------------- - + public function test_set_template() { $this->assertFalse($this->table->set_template('not an array')); - - $template = array( - 'a' => 'b' - ); - + + $template = array('a' => 'b'); + $this->table->set_template($template); $this->assertEquals($template, $this->table->template); } - + public function test_set_empty() { $this->table->set_empty('nada'); $this->assertEquals('nada', $this->table->empty_cells); } - + public function test_set_caption() { $this->table->set_caption('awesome cap'); $this->assertEquals('awesome cap', $this->table->caption); } - - + /* * @depends testPrepArgs */ @@ -49,9 +45,9 @@ public function test_set_heading() // uses _prep_args internally, so we'll just do a quick // check to verify that func_get_args and prep_args are // being called. - + $this->table->set_heading('name', 'color', 'size'); - + $this->assertEquals( array( array('data' => 'name'), @@ -61,8 +57,7 @@ public function test_set_heading() $this->table->heading ); } - - + /* * @depends testPrepArgs */ @@ -71,13 +66,13 @@ public function test_add_row() // uses _prep_args internally, so we'll just do a quick // check to verify that func_get_args and prep_args are // being called. - + $this->table->add_row('my', 'pony', 'sings'); $this->table->add_row('your', 'pony', 'stinks'); $this->table->add_row('my pony', '>', 'your pony'); - + $this->assertEquals(count($this->table->rows), 3); - + $this->assertEquals( array( array('data' => 'your'), @@ -87,11 +82,10 @@ public function test_add_row() $this->table->rows[1] ); } - - + // Uility Methods // -------------------------------------------------------------------- - + public function test_prep_args() { $expected = array( @@ -99,7 +93,7 @@ public function test_prep_args() array('data' => 'color'), array('data' => 'size') ); - + $this->assertEquals( $expected, $this->table->prep_args(array('name', 'color', 'size')) @@ -114,7 +108,7 @@ public function test_prep_args() $this->table->prep_args(array('name', 'color', 'size', array('data' => 'weight', 'class' => 'awesome'))) ); } - + public function test_default_template_keys() { $keys = array( @@ -126,132 +120,124 @@ public function test_default_template_keys() 'row_alt_start', 'row_alt_end', 'cell_alt_start', 'cell_alt_end', 'table_close' ); - + foreach ($keys as $key) { $this->assertArrayHasKey($key, $this->table->default_template()); } } - + public function test_compile_template() { $this->assertFalse($this->table->set_template('invalid_junk')); - + // non default key $this->table->set_template(array('nonsense' => 'foo')); $this->table->compile_template(); - + $this->assertArrayHasKey('nonsense', $this->table->template); $this->assertEquals('foo', $this->table->template['nonsense']); - + // override default $this->table->set_template(array('table_close' => '')); $this->table->compile_template(); - + $this->assertArrayHasKey('table_close', $this->table->template); $this->assertEquals('', $this->table->template['table_close']); } - + public function test_make_columns() { // Test bogus parameters $this->assertFalse($this->table->make_columns('invalid_junk')); $this->assertFalse($this->table->make_columns(array())); $this->assertFalse($this->table->make_columns(array('one', 'two'), '2.5')); - - + // Now on to the actual column creation - + $five_values = array( 'Laura', 'Red', '15', 'Katie', 'Blue' ); - + // No column count - no changes to the array $this->assertEquals( $five_values, $this->table->make_columns($five_values) ); - + // Column count of 3 leaves us with one   $this->assertEquals( array( array('Laura', 'Red', '15'), - array('Katie', 'Blue', ' ') + array('Katie', 'Blue', ' ') ), $this->table->make_columns($five_values, 3) ); } - + public function test_clear() { $this->table->set_heading('Name', 'Color', 'Size'); - + // Make columns changes auto_heading $rows = $this->table->make_columns(array( 'Laura', 'Red', '15', 'Katie', 'Blue' ), 3); - + foreach ($rows as $row) { $this->table->add_row($row); } - + $this->assertFalse($this->table->auto_heading); $this->assertEquals(count($this->table->heading), 3); $this->assertEquals(count($this->table->rows), 2); - + $this->table->clear(); - + $this->assertTrue($this->table->auto_heading); $this->assertEmpty($this->table->heading); $this->assertEmpty($this->table->rows); } - - + public function test_set_from_array() { $this->assertFalse($this->table->set_from_array('bogus')); $this->assertFalse($this->table->set_from_array(NULL)); - + $data = array( array('name', 'color', 'number'), array('Laura', 'Red', '22'), - array('Katie', 'Blue') + array('Katie', 'Blue') ); - + $this->table->set_from_array($data, FALSE); $this->assertEmpty($this->table->heading); - + $this->table->clear(); - - $expected_heading = array( + + $this->table->set_from_array($data); + $this->assertEquals(count($this->table->rows), 2); + + $expected = array( array('data' => 'name'), array('data' => 'color'), array('data' => 'number') ); - - $expected_second = array( + + $this->assertEquals($expected, $this->table->heading); + + $expected = array( array('data' => 'Katie'), array('data' => 'Blue'), ); - - $this->table->set_from_array($data); - $this->assertEquals(count($this->table->rows), 2); - - $this->assertEquals( - $expected_heading, - $this->table->heading - ); - - $this->assertEquals( - $expected_second, - $this->table->rows[1] - ); + + $this->assertEquals($expected, $this->table->rows[1]); } - - function test_set_from_object() + + public function test_set_from_object() { // Make a stub of query instance $query = new CI_TestCase(); @@ -268,37 +254,31 @@ function test_set_from_object() return 2; }; - $expected_heading = array( + $this->table->set_from_object($query); + + $expected = array( array('data' => 'name'), array('data' => 'email') ); - $expected_second = array( + $this->assertEquals($expected, $this->table->heading); + + $expected = array( 'name' => array('data' => 'Foo Bar'), 'email' => array('data' => 'foo@bar.com'), ); - $this->table->set_from_object($query); - - $this->assertEquals( - $expected_heading, - $this->table->heading - ); - - $this->assertEquals( - $expected_second, - $this->table->rows[1] - ); + $this->assertEquals($expected, $this->table->rows[1]); } - - function test_generate() + + public function test_generate() { // Prepare the data $data = array( array('Name', 'Color', 'Size'), array('Fred', 'Blue', 'Small'), array('Mary', 'Red', 'Large'), - array('John', 'Green', 'Medium') + array('John', 'Green', 'Medium') ); $table = $this->table->generate($data); @@ -313,4 +293,5 @@ function test_generate() $this->assertTrue(strpos($table, 'Blue') !== FALSE); $this->assertTrue(strpos($table, 'Small') !== FALSE); } + } \ No newline at end of file diff --git a/tests/codeigniter/libraries/Typography_test.php b/tests/codeigniter/libraries/Typography_test.php index 250aefb2469..eb6dacb7352 100644 --- a/tests/codeigniter/libraries/Typography_test.php +++ b/tests/codeigniter/libraries/Typography_test.php @@ -4,11 +4,11 @@ class Typography_test extends CI_TestCase { public function set_up() { - $obj = new StdClass; + $obj = new stdClass; $obj->type = new Mock_Libraries_Typography(); - + $this->ci_instance($obj); - + $this->type = $obj->type; } @@ -33,18 +33,18 @@ public function test_format_characters() 'foo..' => 'foo..', 'foo...bar.' => 'foo…bar.', 'test. new' => 'test.  new', - ); - + ); + foreach ($strs as $str => $expected) { - $this->assertEquals($expected, $this->type->format_characters($str)); + $this->assertEquals($expected, $this->type->format_characters($str)); } } // -------------------------------------------------------------------- public function test_nl2br_except_pre() - { + { $str = <<assertEquals($expected, - $this->type->nl2br_except_pre($str)); + $this->assertEquals($expected, $this->type->nl2br_except_pre($str)); } // -------------------------------------------------------------------- - + public function test_auto_typography() { $this->_blank_string(); @@ -103,7 +102,7 @@ public function test_auto_typography() } // -------------------------------------------------------------------- - + private function _blank_string() { // Test blank string @@ -131,7 +130,7 @@ private function _reduce_linebreaks() { $str = "This has way too many linebreaks.\n\n\n\nSee?"; $expect = "

    This has way too many linebreaks.

    \n\n

    See?

    "; - + $this->assertEquals($expect, $this->type->auto_typography($str, TRUE)); } @@ -141,7 +140,7 @@ private function _remove_comments() { $str = ' But no!'; $expect = '

      But no!

    '; - + $this->assertEquals($expect, $this->type->auto_typography($str)); } @@ -151,7 +150,7 @@ private function _protect_pre() { $str = '

    My Sentence

    var_dump($this);
    '; $expect = '

    My Sentence

    var_dump($this);
    '; - + $this->assertEquals($expect, $this->type->auto_typography($str)); } @@ -161,7 +160,7 @@ private function _no_opening_block() { $str = 'My Sentence
    var_dump($this);
    '; $expect = '

    My Sentence

    var_dump($this);
    '; - + $this->assertEquals($expect, $this->type->auto_typography($str)); } @@ -170,19 +169,18 @@ private function _no_opening_block() public function _protect_braced_quotes() { $this->type->protect_braced_quotes = TRUE; - + $str = 'Test {parse="foobar"}'; $expect = '

    Test {parse="foobar"}

    '; - + $this->assertEquals($expect, $this->type->auto_typography($str)); $this->type->protect_braced_quotes = FALSE; - + $str = 'Test {parse="foobar"}'; $expect = '

    Test {parse=“foobar”}

    '; - - $this->assertEquals($expect, $this->type->auto_typography($str)); - + $this->assertEquals($expect, $this->type->auto_typography($str)); } + } \ No newline at end of file diff --git a/tests/codeigniter/libraries/Useragent_test.php b/tests/codeigniter/libraries/Useragent_test.php index 7dad7ac5409..89383f80726 100644 --- a/tests/codeigniter/libraries/Useragent_test.php +++ b/tests/codeigniter/libraries/Useragent_test.php @@ -1,7 +1,7 @@ _user_agent; - $obj = new StdClass; + $obj = new stdClass; $obj->agent = new Mock_Libraries_UserAgent(); $this->ci_instance($obj); @@ -82,6 +82,4 @@ public function test_charsets() $this->assertFalse($this->agent->accept_charset()); } - // -------------------------------------------------------------------- - } \ No newline at end of file From f243ce13b4baf5bf8bebf36586514bb243dfc355 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 9 Jun 2012 23:34:21 +0300 Subject: [PATCH 1213/5397] Cleanup/optimize tests/mocks/ --- tests/mocks/autoloader.php | 4 +- tests/mocks/ci_testcase.php | 84 +++++++++++----------- tests/mocks/core/common.php | 36 +++++----- tests/mocks/core/input.php | 6 +- tests/mocks/core/loader.php | 7 +- tests/mocks/core/security.php | 2 +- tests/mocks/core/uri.php | 9 +-- tests/mocks/core/utf8.php | 11 ++- tests/mocks/database/config/mysql.php | 10 +-- tests/mocks/database/config/pdo/mysql.php | 12 ++-- tests/mocks/database/config/pdo/pgsql.php | 12 ++-- tests/mocks/database/config/pdo/sqlite.php | 12 ++-- tests/mocks/database/config/pgsql.php | 10 +-- tests/mocks/database/config/sqlite.php | 10 +-- tests/mocks/database/db.php | 18 ++--- tests/mocks/database/db/driver.php | 7 +- tests/mocks/database/db/querybuilder.php | 9 +-- tests/mocks/database/drivers/mysql.php | 9 +-- tests/mocks/database/drivers/pdo.php | 8 +-- tests/mocks/database/drivers/postgre.php | 9 +-- tests/mocks/database/drivers/sqlite.php | 7 +- tests/mocks/database/schema/skeleton.php | 48 ++++++------- tests/mocks/libraries/encrypt.php | 21 +++--- tests/mocks/libraries/table.php | 3 +- 24 files changed, 180 insertions(+), 184 deletions(-) diff --git a/tests/mocks/autoloader.php b/tests/mocks/autoloader.php index 90aabcbe623..e3ff7a8bd2d 100644 --- a/tests/mocks/autoloader.php +++ b/tests/mocks/autoloader.php @@ -69,7 +69,7 @@ function autoload($class) } } - $file = (isset($file)) ? $file : $dir.$class.'.php'; + $file = isset($file) ? $file : $dir.$class.'.php'; if ( ! file_exists($file)) { @@ -82,7 +82,7 @@ function autoload($class) return FALSE; } - throw new InvalidArgumentException("Unable to load $class."); + throw new InvalidArgumentException("Unable to load {$class}."); } include_once($file); diff --git a/tests/mocks/ci_testcase.php b/tests/mocks/ci_testcase.php index f327e6b0752..eda9e1b603e 100644 --- a/tests/mocks/ci_testcase.php +++ b/tests/mocks/ci_testcase.php @@ -1,11 +1,11 @@ 'bm', 'config' => 'cfg', @@ -19,18 +19,17 @@ class CI_TestCase extends PHPUnit_Framework_TestCase { 'loader' => 'load', 'model' => 'model' ); - + // -------------------------------------------------------------------- - + public function __construct() { parent::__construct(); - $this->ci_config = array(); } - + // -------------------------------------------------------------------- - + public function setUp() { if (method_exists($this, 'set_up')) @@ -38,10 +37,10 @@ public function setUp() $this->set_up(); } } - + // -------------------------------------------------------------------- - - public function tearDown() + + public function tearDown() { if (method_exists($this, 'tear_down')) { @@ -50,15 +49,15 @@ public function tearDown() } // -------------------------------------------------------------------- - + public static function instance() { return self::$ci_test_instance; } - + // -------------------------------------------------------------------- - - function ci_set_config($key, $val = '') + + public function ci_set_config($key, $val = '') { if (is_array($key)) { @@ -71,36 +70,36 @@ function ci_set_config($key, $val = '') } // -------------------------------------------------------------------- - - function ci_get_config() + + public function ci_get_config() { return $this->ci_config; } - + // -------------------------------------------------------------------- - - function ci_instance($obj = FALSE) + + public function ci_instance($obj = FALSE) { if ( ! is_object($obj)) { return $this->ci_instance; } - + $this->ci_instance = $obj; } - + // -------------------------------------------------------------------- - - function ci_instance_var($name, $obj = FALSE) + + public function ci_instance_var($name, $obj = FALSE) { if ( ! is_object($obj)) { return $this->ci_instance->$name; } - + $this->ci_instance->$name =& $obj; } - + // -------------------------------------------------------------------- /** @@ -112,10 +111,10 @@ function ci_instance_var($name, $obj = FALSE) * test can modify the variable it assigns to and * still maintain the global. */ - function &ci_core_class($name) + public function &ci_core_class($name) { $name = strtolower($name); - + if (isset($this->global_map[$name])) { $class_name = ucfirst($name); @@ -130,29 +129,29 @@ function &ci_core_class($name) { throw new Exception('Not a valid core class.'); } - + if ( ! class_exists('CI_'.$class_name)) { require_once BASEPATH.'core/'.$class_name.'.php'; } - + $GLOBALS[strtoupper($global_name)] = 'CI_'.$class_name; return $GLOBALS[strtoupper($global_name)]; } - + // -------------------------------------------------------------------- - + // convenience function for global mocks - function ci_set_core_class($name, $obj) + public function ci_set_core_class($name, $obj) { $orig =& $this->ci_core_class($name); $orig = $obj; } - + // -------------------------------------------------------------------- // Internals // -------------------------------------------------------------------- - + /** * Overwrite runBare * @@ -169,28 +168,27 @@ public function runBare() } // -------------------------------------------------------------------- - - function helper($name) + + public function helper($name) { require_once(BASEPATH.'helpers/'.$name.'_helper.php'); } // -------------------------------------------------------------------- - + /** * This overload is useful to create a stub, that need to have a specific method. */ - function __call($method, $args) + public function __call($method, $args) { - if ($this->{$method} instanceof Closure) + if ($this->{$method} instanceof Closure) { return call_user_func_array($this->{$method},$args); - } - else + } + else { return parent::__call($method, $args); } } -} -// EOF \ No newline at end of file +} \ No newline at end of file diff --git a/tests/mocks/core/common.php b/tests/mocks/core/common.php index e1c493aa02f..8466e47f80c 100644 --- a/tests/mocks/core/common.php +++ b/tests/mocks/core/common.php @@ -4,11 +4,10 @@ if ( ! function_exists('get_instance')) { - function &get_instance() + function &get_instance() { $test = CI_TestCase::instance(); - $instance = $test->ci_instance(); - return $instance; + return $test->ci_instance(); } } @@ -16,11 +15,10 @@ function &get_instance() if ( ! function_exists('get_config')) { - function &get_config() { + function &get_config() + { $test = CI_TestCase::instance(); - $config = $test->ci_get_config(); - - return $config; + return $test->ci_get_config(); } } @@ -29,12 +27,12 @@ function &get_config() { function config_item($item) { $config =& get_config(); - + if ( ! isset($config[$item])) { return FALSE; } - + return $config[$item]; } } @@ -49,16 +47,16 @@ function load_class($class, $directory = 'libraries', $prefix = 'CI_') { throw new Exception('Not Implemented: Non-core load_class()'); } - + $test = CI_TestCase::instance(); - + $obj =& $test->ci_core_class($class); - + if (is_string($obj)) { - throw new Exception('Bad Isolation: Use ci_set_core_class to set '.$class.''); + throw new Exception('Bad Isolation: Use ci_set_core_class to set '.$class); } - + return $obj; } } @@ -74,16 +72,16 @@ function load_class($class, $directory = 'libraries', $prefix = 'CI_') 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 @@ -166,6 +164,4 @@ function set_status_header($code = 200, $text = '') { return TRUE; } -} - -// EOF \ No newline at end of file +} \ No newline at end of file diff --git a/tests/mocks/core/input.php b/tests/mocks/core/input.php index 8a337d2ef26..2a4aa499794 100644 --- a/tests/mocks/core/input.php +++ b/tests/mocks/core/input.php @@ -1,10 +1,10 @@ models_dir = vfsStream::newDirectory('models')->at(vfsStreamWrapper::getRoot()); $this->libs_dir = vfsStream::newDirectory('libraries')->at(vfsStreamWrapper::getRoot()); $this->helpers_dir = vfsStream::newDirectory('helpers')->at(vfsStreamWrapper::getRoot()); $this->views_dir = vfsStream::newDirectory('views')->at(vfsStreamWrapper::getRoot()); - + $this->_ci_ob_level = ob_get_level(); $this->_ci_library_paths = array(vfsStream::url('application').'/', BASEPATH); $this->_ci_helper_paths = array(vfsStream::url('application').'/', BASEPATH); $this->_ci_model_paths = array(vfsStream::url('application').'/'); $this->_ci_view_paths = array(vfsStream::url('application').'/views/' => TRUE); } + } \ No newline at end of file diff --git a/tests/mocks/core/security.php b/tests/mocks/core/security.php index d7ea0e6bdbb..e19a8b20b6f 100644 --- a/tests/mocks/core/security.php +++ b/tests/mocks/core/security.php @@ -1,7 +1,7 @@ ci_core_class('cfg'); - + // set predictable config values $test->ci_set_config(array( 'index_page' => 'index.php', @@ -14,12 +14,13 @@ public function __construct() 'subclass_prefix' => 'MY_' )); - $this->config = new $cls; + $this->config = new $cls; } - + protected function _is_cli_request() { return FALSE; } + } \ No newline at end of file diff --git a/tests/mocks/core/utf8.php b/tests/mocks/core/utf8.php index b77d717e7a2..068e74ac167 100644 --- a/tests/mocks/core/utf8.php +++ b/tests/mocks/core/utf8.php @@ -1,27 +1,26 @@ array( 'dsn' => '', @@ -9,7 +9,7 @@ 'username' => 'travis', 'password' => '', 'database' => 'ci_test', - 'dbdriver' => 'mysql', + 'dbdriver' => 'mysql' ), // Database configuration with failover @@ -28,7 +28,7 @@ 'password' => '', 'database' => 'ci_test', 'dbdriver' => 'mysql', - ), - ), - ), + ) + ) + ) ); \ No newline at end of file diff --git a/tests/mocks/database/config/pdo/mysql.php b/tests/mocks/database/config/pdo/mysql.php index cefb6b008fb..fefe0d62486 100644 --- a/tests/mocks/database/config/pdo/mysql.php +++ b/tests/mocks/database/config/pdo/mysql.php @@ -1,7 +1,7 @@ array( 'dsn' => '', @@ -10,7 +10,7 @@ 'password' => '', 'database' => 'ci_test', 'dbdriver' => 'pdo', - 'pdodriver' => 'mysql', + 'pdodriver' => 'mysql' ), // Database configuration with failover @@ -30,8 +30,8 @@ 'password' => '', 'database' => 'ci_test', 'dbdriver' => 'pdo', - 'pdodriver' => 'mysql', - ), - ), - ), + 'pdodriver' => 'mysql' + ) + ) + ) ); \ No newline at end of file diff --git a/tests/mocks/database/config/pdo/pgsql.php b/tests/mocks/database/config/pdo/pgsql.php index 5196e9ad92f..ddd638c8ac1 100644 --- a/tests/mocks/database/config/pdo/pgsql.php +++ b/tests/mocks/database/config/pdo/pgsql.php @@ -1,7 +1,7 @@ array( 'dsn' => 'pgsql:host=localhost;port=5432;dbname=ci_test;', @@ -10,7 +10,7 @@ 'password' => '', 'database' => 'ci_test', 'dbdriver' => 'pdo', - 'pdodriver' => 'pgsql', + 'pdodriver' => 'pgsql' ), // Database configuration with failover @@ -30,8 +30,8 @@ 'password' => '', 'database' => 'ci_test', 'dbdriver' => 'pdo', - 'pdodriver' => 'pgsql', - ), - ), - ), + 'pdodriver' => 'pgsql' + ) + ) + ) ); \ No newline at end of file diff --git a/tests/mocks/database/config/pdo/sqlite.php b/tests/mocks/database/config/pdo/sqlite.php index c68b4b213d0..36461843d4c 100644 --- a/tests/mocks/database/config/pdo/sqlite.php +++ b/tests/mocks/database/config/pdo/sqlite.php @@ -10,7 +10,7 @@ 'password' => 'sqlite', 'database' => 'sqlite', 'dbdriver' => 'pdo', - 'pdodriver' => 'sqlite', + 'pdodriver' => 'sqlite' ), // Database configuration with failover @@ -29,9 +29,9 @@ 'username' => 'sqlite', 'password' => 'sqlite', 'database' => 'sqlite', - 'dbdriver' => 'pdo', - 'pdodriver' => 'sqlite', - ), - ), - ), + 'dbdriver' => 'pdo', + 'pdodriver' => 'sqlite' + ) + ) + ) ); \ No newline at end of file diff --git a/tests/mocks/database/config/pgsql.php b/tests/mocks/database/config/pgsql.php index c06af8ce090..1444b0066b4 100644 --- a/tests/mocks/database/config/pgsql.php +++ b/tests/mocks/database/config/pgsql.php @@ -1,7 +1,7 @@ array( 'dsn' => '', @@ -9,7 +9,7 @@ 'username' => 'postgres', 'password' => '', 'database' => 'ci_test', - 'dbdriver' => 'postgre', + 'dbdriver' => 'postgre' ), // Database configuration with failover @@ -28,7 +28,7 @@ 'password' => '', 'database' => 'ci_test', 'dbdriver' => 'postgre', - ), - ), - ), + ) + ) + ) ); \ No newline at end of file diff --git a/tests/mocks/database/config/sqlite.php b/tests/mocks/database/config/sqlite.php index 755ce2a3ae7..d37ee48713a 100644 --- a/tests/mocks/database/config/sqlite.php +++ b/tests/mocks/database/config/sqlite.php @@ -9,7 +9,7 @@ 'username' => 'sqlite', 'password' => 'sqlite', 'database' => realpath(__DIR__.'/..').'/ci_test.sqlite', - 'dbdriver' => 'sqlite3', + 'dbdriver' => 'sqlite3' ), // Database configuration with failover @@ -27,8 +27,8 @@ 'username' => 'sqlite', 'password' => 'sqlite', 'database' => realpath(__DIR__.'/..').'/ci_test.sqlite', - 'dbdriver' => 'sqlite3', - ), - ), - ), + 'dbdriver' => 'sqlite3' + ) + ) + ) ); \ No newline at end of file diff --git a/tests/mocks/database/db.php b/tests/mocks/database/db.php index 59028ed9c81..30504bba6b4 100644 --- a/tests/mocks/database/db.php +++ b/tests/mocks/database/db.php @@ -6,7 +6,7 @@ class Mock_Database_DB { * @var array DB configuration */ private $config = array(); - + /** * Prepare database configuration skeleton * @@ -21,7 +21,7 @@ public function __construct($config = array()) /** * Build DSN connection string for DB driver instantiate process * - * @param string Group name + * @param string Group name * @return string DSN Connection string */ public function set_dsn($group = 'default') @@ -65,28 +65,27 @@ public function set_dsn($group = 'default') * Return a database config array * * @see ./config - * @param string Driver based configuration - * @return array + * @param string Driver based configuration + * @return array */ public static function config($driver) { $dir = realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR; - return include($dir.'config'.DIRECTORY_SEPARATOR.$driver.'.php'); } /** * Main DB method wrapper * - * @param string Group or DSN string - * @param bool - * @return object + * @param string Group or DSN string + * @param bool + * @return object */ public static function DB($group, $query_builder = FALSE) { include_once(BASEPATH.'database/DB.php'); - try + try { $db = DB($group, $query_builder); } @@ -97,4 +96,5 @@ public static function DB($group, $query_builder = FALSE) return $db; } + } \ No newline at end of file diff --git a/tests/mocks/database/db/driver.php b/tests/mocks/database/db/driver.php index cb1820277cb..65ac2c4ccef 100644 --- a/tests/mocks/database/db/driver.php +++ b/tests/mocks/database/db/driver.php @@ -1,7 +1,7 @@ ci_db_driver = new $driver_class($config); + if (is_string($driver_class)) + { + $this->ci_db_driver = new $driver_class($config); + } } /** diff --git a/tests/mocks/database/db/querybuilder.php b/tests/mocks/database/db/querybuilder.php index 1b95c92af71..3f2252622f6 100644 --- a/tests/mocks/database/db/querybuilder.php +++ b/tests/mocks/database/db/querybuilder.php @@ -1,10 +1,3 @@ add_field(array( 'id' => array( 'type' => 'INTEGER', - 'constraint' => 3, + 'constraint' => 3 ), 'name' => array( 'type' => 'VARCHAR', - 'constraint' => 40, + 'constraint' => 40 ), 'email' => array( 'type' => 'VARCHAR', - 'constraint' => 100, + 'constraint' => 100 ), 'country' => array( 'type' => 'VARCHAR', - 'constraint' => 40, - ), + 'constraint' => 40 + ) )); static::$forge->add_key('id', TRUE); static::$forge->create_table('user', (strpos(static::$driver, 'pgsql') === FALSE)); @@ -76,15 +75,15 @@ public static function create_tables() static::$forge->add_field(array( 'id' => array( 'type' => 'INTEGER', - 'constraint' => 3, + 'constraint' => 3 ), 'name' => array( 'type' => 'VARCHAR', - 'constraint' => 40, + 'constraint' => 40 ), 'description' => array( - 'type' => 'TEXT', - ), + 'type' => 'TEXT' + ) )); static::$forge->add_key('id', TRUE); static::$forge->create_table('job', (strpos(static::$driver, 'pgsql') === FALSE)); @@ -93,15 +92,15 @@ public static function create_tables() static::$forge->add_field(array( 'id' => array( 'type' => 'INTEGER', - 'constraint' => 3, + 'constraint' => 3 ), 'key' => array( 'type' => 'VARCHAR', - 'constraint' => 40, + 'constraint' => 40 ), 'value' => array( - 'type' => 'TEXT', - ), + 'type' => 'TEXT' + ) )); static::$forge->add_key('id', TRUE); static::$forge->create_table('misc', (strpos(static::$driver, 'pgsql') === FALSE)); @@ -120,28 +119,29 @@ public static function create_data() array('id' => 1, 'name' => 'Derek Jones', 'email' => 'derek@world.com', 'country' => 'US'), array('id' => 2, 'name' => 'Ahmadinejad', 'email' => 'ahmadinejad@world.com', 'country' => 'Iran'), array('id' => 3, 'name' => 'Richard A Causey', 'email' => 'richard@world.com', 'country' => 'US'), - array('id' => 4, 'name' => 'Chris Martin', 'email' => 'chris@world.com', 'country' => 'UK'), + array('id' => 4, 'name' => 'Chris Martin', 'email' => 'chris@world.com', 'country' => 'UK') ), 'job' => array( - array('id' => 1, 'name' => 'Developer', 'description' => 'Awesome job, but sometimes makes you bored'), + array('id' => 1, 'name' => 'Developer', 'description' => 'Awesome job, but sometimes makes you bored'), array('id' => 2, 'name' => 'Politician', 'description' => 'This is not really a job'), - array('id' => 3, 'name' => 'Accountant', 'description' => 'Boring job, but you will get free snack at lunch'), - array('id' => 4, 'name' => 'Musician', 'description' => 'Only Coldplay can actually called Musician'), + array('id' => 3, 'name' => 'Accountant', 'description' => 'Boring job, but you will get free snack at lunch'), + array('id' => 4, 'name' => 'Musician', 'description' => 'Only Coldplay can actually called Musician') ), 'misc' => array( - array('id' => 1, 'key' => '\\xxxfoo456', 'value' => 'Entry with \\xxx'), - array('id' => 2, 'key' => '\\%foo456', 'value' => 'Entry with \\%'), - ), + array('id' => 1, 'key' => '\\xxxfoo456', 'value' => 'Entry with \\xxx'), + array('id' => 2, 'key' => '\\%foo456', 'value' => 'Entry with \\%') + ) ); - foreach ($data as $table => $dummy_data) + foreach ($data as $table => $dummy_data) { static::$db->truncate($table); foreach ($dummy_data as $single_dummy_data) { - static::$db->insert($table, $single_dummy_data); + static::$db->insert($table, $single_dummy_data); } } } + } \ No newline at end of file diff --git a/tests/mocks/libraries/encrypt.php b/tests/mocks/libraries/encrypt.php index a9bbaafdc81..f1859398f20 100644 --- a/tests/mocks/libraries/encrypt.php +++ b/tests/mocks/libraries/encrypt.php @@ -2,14 +2,15 @@ class Mock_Libraries_Encrypt extends CI_Encrypt { - // Overide inaccesible protected method - public function __call($method, $params) - { - if (is_callable(array($this, '_'.$method))) - { - return call_user_func_array(array($this, '_'.$method), $params); - } - - throw new BadMethodCallException('Method '.$method.' was not found'); - } + // Overide inaccesible protected method + public function __call($method, $params) + { + if (is_callable(array($this, '_'.$method))) + { + return call_user_func_array(array($this, '_'.$method), $params); + } + + throw new BadMethodCallException('Method '.$method.' was not found'); + } + } \ No newline at end of file diff --git a/tests/mocks/libraries/table.php b/tests/mocks/libraries/table.php index 97fbb30bd1a..87c278bce35 100644 --- a/tests/mocks/libraries/table.php +++ b/tests/mocks/libraries/table.php @@ -1,7 +1,7 @@ Date: Sat, 9 Jun 2012 23:37:17 +0300 Subject: [PATCH 1214/5397] Fix defined() usage in system/core/Common.php --- system/core/Common.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Common.php b/system/core/Common.php index c08755c9138..1708653e78a 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -240,7 +240,7 @@ function &get_config($replace = array()) } // Is the config file in the environment folder? - if (defined(ENVIRONMENT) && file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) + if (defined('ENVIRONMENT') && file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) { require($file_path); } From e15e3dde9dca15e2d65f098010d3fb7004cef5e7 Mon Sep 17 00:00:00 2001 From: Iban Eguia Date: Sat, 9 Jun 2012 23:52:27 +0200 Subject: [PATCH 1215/5397] Fixed timezone change in index.php Now it does not ever change the local timezone, and it adds the option to get the 'local' time() --- index.php | 2 -- system/helpers/date_helper.php | 14 ++++++++++---- user_guide_src/source/helpers/date_helper.rst | 3 ++- user_guide_src/source/installation/upgrade_300.rst | 3 ++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/index.php b/index.php index 62fc2ab1b9a..3b00dd36084 100644 --- a/index.php +++ b/index.php @@ -162,8 +162,6 @@ // END OF USER CONFIGURABLE SETTINGS. DO NOT EDIT BELOW THIS LINE // -------------------------------------------------------------------- -date_default_timezone_set('UTC'); - /* * --------------------------------------------------------------- * Resolve the system path for increased reliability diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 3b0c3289d85..d5acec23fa2 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -57,10 +57,16 @@ function now($timezone = NULL) $timezone = $CI->config->item('timezone'); } - $timezone = new DateTimeZone($timezone); - $now = new DateTime('now', $timezone); - $offset = $timezone->getOffset($now); - $time = time() + $offset; + $time = time(); + if(strtolower($timezone) != 'local') + { + $local = new DateTime(NULL, new DateTimeZone(date_default_timezone_get())); + $now = new DateTime(NULL, new DateTimeZone($timezone)); + $lcl_offset = $local->getOffset(); + $tz_offset = $now->getOffset(); + $offset = $tz_offset - $lcl_offset; + $time = $time + $offset; + } return $time; } diff --git a/user_guide_src/source/helpers/date_helper.rst b/user_guide_src/source/helpers/date_helper.rst index b6c6ed4bbb3..33b39bd5b3a 100644 --- a/user_guide_src/source/helpers/date_helper.rst +++ b/user_guide_src/source/helpers/date_helper.rst @@ -21,7 +21,8 @@ now() ===== Returns the current time as a Unix timestamp, based on the "timezone" parameter. -All PHP available timezones are supported. +All PHP available timezones are supported. You can also use 'local' timezone, and +it will return time(). .. php:method:: now($timezone = NULL) diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index e86ef67da32..c2c3899ee39 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -47,7 +47,8 @@ Step 5: Change your use of the Date helper's now() function Function now() has been modified. You can see the changes in :doc:`Date Helper <../helpers/date_helper>` You must replace $config['time_reference'] with $config['timezone'] in your config.php file. You can select all -PHP supported timezones, listed here: `PHP's supported timezones `_. +PHP supported timezones, listed here: `Supported timezones `_. You can also +use 'local' if you want to get time(). Step 6: Move your errors folder =============================== From a9617a35ce4af051d3ad1298c2c24453460754cc Mon Sep 17 00:00:00 2001 From: Iban Eguia Date: Sun, 10 Jun 2012 00:13:04 +0200 Subject: [PATCH 1216/5397] Changed the default timezone to local and explained in the config file. --- application/config/config.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/application/config/config.php b/application/config/config.php index eb3ddddb071..12ef77c76a7 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -363,10 +363,11 @@ |-------------------------------------------------------------------------- | | You can set any PHP supported timezones to be the master timezone when -| you call the now() function. +| you call the now() function. 'local' string can be used to get the local +| time. | */ -$config['timezone'] = 'UTC'; +$config['timezone'] = 'local'; /* From 5a257187c4ca09ea61c19999bf061cec3f224cc2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 10 Jun 2012 06:18:14 +0300 Subject: [PATCH 1217/5397] Merge branch 2.1-stable into develop --- system/core/Input.php | 20 +++++++++++++++---- system/database/DB_driver.php | 10 ++++++---- system/database/DB_query_builder.php | 2 +- system/libraries/Form_validation.php | 5 +++-- user_guide_src/source/changelog.rst | 6 +++++- .../source/installation/upgrading.rst | 3 ++- .../source/libraries/form_validation.rst | 1 + user_guide_src/source/libraries/input.rst | 3 +++ user_guide_src/source/libraries/sessions.rst | 2 +- user_guide_src/source/libraries/uri.rst | 2 +- 10 files changed, 39 insertions(+), 15 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index b986c4973d6..162e40c854a 100755 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -376,14 +376,26 @@ public function ip_address() /** * Validate IP Address * - * Updated version suggested by Geert De Deckere - * * @param string + * @param string 'ipv4' or 'ipv6' * @return bool */ - public function valid_ip($ip) + public function valid_ip($ip, $which = '') { - return (bool) filter_var($ip, FILTER_VALIDATE_IP); + switch (strtolower($which)) + { + case 'ipv4': + $which = FILTER_FLAG_IPV4; + break; + case 'ipv6': + $which = FILTER_FLAG_IPV6; + break; + default: + $which = NULL; + break; + } + + return (bool) filter_var($ip, FILTER_VALIDATE_IP, $which); } // -------------------------------------------------------------------- diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 65f1f18d0f4..f5a7e2ac0b7 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1307,14 +1307,16 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden } // Convert tabs or multiple spaces into single spaces - $item = preg_replace('/[\t ]+/', ' ', $item); + $item = preg_replace('/\s+/', ' ', $item); // If the item has an alias declaration we remove it and set it aside. // Basically we remove everything to the right of the first space - if (strpos($item, ' ') !== FALSE) + if (preg_match('/^([^\s]+) (AS )*(.+)$/i', $item, $matches)) { - $alias = strstr($item, ' '); - $item = substr($item, 0, - strlen($alias)); + $item = $matches[1]; + + // Escape the alias + $alias = ' '.$matches[2].$this->escape_identifiers($matches[3]); } else { diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 5d0a2ae2cc2..3b45bbada98 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1985,7 +1985,7 @@ protected function _track_aliases($table) if (strpos($table, ' ') !== FALSE) { // if the alias is written with the AS keyword, remove it - $table = preg_replace('/ AS /i', ' ', $table); + $table = preg_replace('/\s+AS\s+/i', ' ', $table); // Grab the alias $table = trim(strrchr($table, ' ')); diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 225325d6f59..77c968e7c31 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1089,11 +1089,12 @@ public function valid_emails($str) * Validate IP Address * * @param string + * @param string 'ipv4' or 'ipv6' to validate a specific IP format * @return bool */ - public function valid_ip($ip) + public function valid_ip($ip, $which = '') { - return $this->CI->input->valid_ip($ip); + return $this->CI->input->valid_ip($ip, $which); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 17b360b622e..70d622b4b9d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -145,7 +145,6 @@ Release Date: Not Released - Added a Wincache driver to the :doc:`Caching Library `. - Added a Redis driver to the :doc:`Caching Library `. - Added dsn (delivery status notification) option to the :doc:`Email Library `. - - Input library now supports IPv6. - Renamed method _set_header() to set_header() and made it public to enable adding custom headers in the :doc:`Email Library `. - Core @@ -256,6 +255,8 @@ Release Date: Not Released - Libraries - Further improved MIME type detection in the :doc:`File Uploading Library `. + - Added support for IPv6 to the :doc:`Input Library `. + - Added support for the IP format parameter to the :doc:`Form Validation Library `. - Helpers - url_title() performance and output improved. You can now use any string as the word delimiter, but 'dash' and 'underscore' are still supported. @@ -270,6 +271,9 @@ Bug fixes for 2.1.1 - Fixed a bug - When database caching was enabled, $this->db->query() checked the cache before binding variables which resulted in cached queries never being found. - Fixed a bug - CSRF cookie value was allowed to be any (non-empty) string before being written to the output, making code injection a risk. - Fixed a bug (#726) - PDO put a 'dbname' argument in it's connection string regardless of the database platform in use, which made it impossible to use SQLite. +- Fixed a bug - CI_DB_pdo_driver::num_rows() was not returning properly value with SELECT queries, cause it was relying on PDOStatement::rowCount(). +- Fixed a bug (#1059) - CI_Image_lib::clear() was not correctly clearing all necessary object properties, namely width and height. +- Fixed a bud (#1387) - Active Record's ``from()`` method didn't escape table aliases. Version 2.1.0 ============= diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index 2badffc93d8..255c6a557c3 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -5,7 +5,8 @@ Upgrading From a Previous Version Please read the upgrade notes corresponding to the version you are upgrading from. -- :doc:`Upgrading from 2.0.3 to 2.1.0 ` +- :doc:`Upgrading from 2.1.1 to 3.0.0 ` +- :doc:`Upgrading from 2.1.0 to 2.1.1 ` - :doc:`Upgrading from 2.0.2 to 2.0.3 ` - :doc:`Upgrading from 2.0.1 to 2.0.2 ` - :doc:`Upgrading from 2.0 to 2.0.1 ` diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 028b61c4cc7..3c0e6eda45f 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -884,6 +884,7 @@ Rule Parameter Description **valid_email** No Returns FALSE if the form element does not contain a valid email address. **valid_emails** No Returns FALSE if any value provided in a comma separated list is not a valid email. **valid_ip** No Returns FALSE if the supplied IP is not valid. + Accepts an optional parameter of 'ipv4' or 'ipv6' to specify an IP format. **valid_base64** No Returns FALSE if the supplied string contains anything other than valid Base64 characters. ========================= ========== ============================================================================================= ======================= diff --git a/user_guide_src/source/libraries/input.rst b/user_guide_src/source/libraries/input.rst index 432bac3c741..7f995f0507b 100644 --- a/user_guide_src/source/libraries/input.rst +++ b/user_guide_src/source/libraries/input.rst @@ -242,6 +242,9 @@ validates the IP automatically. echo 'Valid'; } +Accepts an optional second string parameter of 'ipv4' or 'ipv6' to specify +an IP format. The default checks for both formats. + $this->input->user_agent() =========================== diff --git a/user_guide_src/source/libraries/sessions.rst b/user_guide_src/source/libraries/sessions.rst index e8332ee9787..5400524a9e5 100644 --- a/user_guide_src/source/libraries/sessions.rst +++ b/user_guide_src/source/libraries/sessions.rst @@ -245,7 +245,7 @@ session class:: CREATE TABLE IF NOT EXISTS `ci_sessions` ( session_id varchar(40) DEFAULT '0' NOT NULL, - ip_address varchar(16) DEFAULT '0' NOT NULL, + ip_address varchar(45) DEFAULT '0' NOT NULL, user_agent varchar(120) NOT NULL, last_activity int(10) unsigned DEFAULT 0 NOT NULL, user_data text NOT NULL, diff --git a/user_guide_src/source/libraries/uri.rst b/user_guide_src/source/libraries/uri.rst index cdd76e322f3..bb959b002d6 100644 --- a/user_guide_src/source/libraries/uri.rst +++ b/user_guide_src/source/libraries/uri.rst @@ -146,7 +146,7 @@ full URL:: The function would return this:: - /news/local/345 + news/local/345 $this->uri->ruri_string() ========================== From bf94058d537efc78ed2df7009db8b3261ff44619 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 10 Jun 2012 07:05:05 +0300 Subject: [PATCH 1218/5397] Fix issue #1452 --- system/database/DB_driver.php | 51 ++++++++++++++----- .../database/drivers/sqlsrv/sqlsrv_driver.php | 2 +- .../database/drivers/sqlsrv/sqlsrv_forge.php | 2 +- .../database/drivers/sqlsrv/sqlsrv_result.php | 2 +- .../drivers/sqlsrv/sqlsrv_utility.php | 2 +- user_guide_src/source/changelog.rst | 2 + 6 files changed, 44 insertions(+), 17 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index f5a7e2ac0b7..e34021e503e 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1300,38 +1300,63 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden $escaped_array = array(); foreach ($item as $k => $v) { - $escaped_array[$this->protect_identifiers($k)] = $this->protect_identifiers($v); + $escaped_array[$this->protect_identifiers($k)] = $this->protect_identifiers($v, $prefix_single, $protect_identifiers, $field_exists); } return $escaped_array; } + // This is basically a bug fix for queries that use MAX, MIN, etc. + // If a parenthesis is found we know that we do not need to + // escape the data or add a prefix. There's probably a more graceful + // way to deal with this, but I'm not thinking of it -- Rick + if (strpos($item, '(') !== FALSE) + { + return $item.$alias; + } + // Convert tabs or multiple spaces into single spaces $item = preg_replace('/\s+/', ' ', $item); + static $preg_ec = array(); + + if (empty($preg_ec)) + { + if (is_array($this->_escape_char)) + { + $preg_ec = array(preg_quote($this->_escape_char[0]), preg_quote($this->_escape_char[1])); + } + else + { + $preg_ec[0] = $preg_ec[1] = preg_quote($this->_escape_char); + } + } + // If the item has an alias declaration we remove it and set it aside. // Basically we remove everything to the right of the first space - if (preg_match('/^([^\s]+) (AS )*(.+)$/i', $item, $matches)) + preg_match('/^(('.$preg_ec[0].'[^'.$preg_ec[1].']+'.$preg_ec[1].')|([^'.$preg_ec[0].'][^\s]+))( AS)*(.+)*$/i', 'Test table]', $matches); + + if (isset($matches[4])) { $item = $matches[1]; - // Escape the alias - $alias = ' '.$matches[2].$this->escape_identifiers($matches[3]); + // Escape the alias, if needed + if ($protect_identifiers === TRUE) + { + $alias = empty($matches[5]) + ? ' '.$this->escape_identifiers(ltrim($matches[4])) + : $matches[4].' '.$this->escape_identifiers(ltrim($matches[5])); + } + else + { + $alias = $matches[4].$matches[5]; + } } else { $alias = ''; } - // This is basically a bug fix for queries that use MAX, MIN, etc. - // If a parenthesis is found we know that we do not need to - // escape the data or add a prefix. There's probably a more graceful - // way to deal with this, but I'm not thinking of it -- Rick - if (strpos($item, '(') !== FALSE) - { - return $item.$alias; - } - // Break the string apart if it contains periods, then insert the table prefix // in the correct location, assuming the period doesn't indicate that we're dealing // with an alias. While we're at it, we will escape the components diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index 655a9e90b8c..eebd6bff8e3 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -21,7 +21,7 @@ * @copyright Copyright (c) 2008 - 2012, EllisLab, Inc. (http://ellislab.com/) * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) * @link http://codeigniter.com - * @since Version 1.0 + * @since Version 2.0.3 * @filesource */ diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php index e6f7e1ac1ae..ccdb36929a2 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -21,7 +21,7 @@ * @copyright Copyright (c) 2008 - 2012, EllisLab, Inc. (http://ellislab.com/) * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) * @link http://codeigniter.com - * @since Version 1.0 + * @since Version 2.0.3 * @filesource */ diff --git a/system/database/drivers/sqlsrv/sqlsrv_result.php b/system/database/drivers/sqlsrv/sqlsrv_result.php index f802383d24d..f9d5a0d29cb 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_result.php +++ b/system/database/drivers/sqlsrv/sqlsrv_result.php @@ -21,7 +21,7 @@ * @copyright Copyright (c) 2008 - 2012, EllisLab, Inc. (http://ellislab.com/) * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) * @link http://codeigniter.com - * @since Version 1.0 + * @since Version 2.0.3 * @filesource */ diff --git a/system/database/drivers/sqlsrv/sqlsrv_utility.php b/system/database/drivers/sqlsrv/sqlsrv_utility.php index 5a71b162815..d518cc15a96 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_utility.php +++ b/system/database/drivers/sqlsrv/sqlsrv_utility.php @@ -21,7 +21,7 @@ * @copyright Copyright (c) 2008 - 2012, EllisLab, Inc. (http://ellislab.com/) * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) * @link http://codeigniter.com - * @since Version 1.0 + * @since Version 2.0.3 * @filesource */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 70d622b4b9d..5b2f59e7e06 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -244,6 +244,8 @@ Bug fixes for 3.0 - Fixed a bug (#666) - :doc:`Output library `'s set_content_type() method didn't set the document charset. - Fixed a bug (#784, #861) - :doc:`Database Forge ` method ``create_table()`` used to accept constraints for MSSQL/SQLSRV integer-type columns. - Fixed a bug (#706) - SQLSRV/MSSSQL didn't escape field names. +- Fixed a bug (#1452) - protect_identifiers() didn't properly detect identifiers with spaces in their names. +- Fixed a bug where protect_identifiers() ignored it's extra arguments when the value passed to it is an array. Version 2.1.1 ============= From 62fd52d3cfeea4a2ec73ac5b943e84eeb38953d2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 10 Jun 2012 07:11:41 +0300 Subject: [PATCH 1219/5397] Revert a change in tests/mocks/core/common.php --- tests/mocks/core/common.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/mocks/core/common.php b/tests/mocks/core/common.php index 8466e47f80c..55506a1f6c8 100644 --- a/tests/mocks/core/common.php +++ b/tests/mocks/core/common.php @@ -18,7 +18,8 @@ function &get_instance() function &get_config() { $test = CI_TestCase::instance(); - return $test->ci_get_config(); + $config = $test->ci_get_config(); + return $config; } } From 36de42e4a6c1ef552be8b7b3cb0fb86a4363c7d6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 10 Jun 2012 13:55:55 +0300 Subject: [PATCH 1220/5397] Revert a change in tests/mocks/core/common.php --- tests/mocks/core/common.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/mocks/core/common.php b/tests/mocks/core/common.php index 55506a1f6c8..a655ee1dbef 100644 --- a/tests/mocks/core/common.php +++ b/tests/mocks/core/common.php @@ -7,7 +7,8 @@ function &get_instance() { $test = CI_TestCase::instance(); - return $test->ci_instance(); + $test = $test->ci_instance(); + return $test; } } From b30426d50d84631201bcdc93439feaa37ce71df9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 10 Jun 2012 14:08:29 +0300 Subject: [PATCH 1221/5397] Fix count_all() --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index e34021e503e..d6f9f9c1793 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1334,7 +1334,7 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden // If the item has an alias declaration we remove it and set it aside. // Basically we remove everything to the right of the first space - preg_match('/^(('.$preg_ec[0].'[^'.$preg_ec[1].']+'.$preg_ec[1].')|([^'.$preg_ec[0].'][^\s]+))( AS)*(.+)*$/i', 'Test table]', $matches); + preg_match('/^(('.$preg_ec[0].'[^'.$preg_ec[1].']+'.$preg_ec[1].')|([^'.$preg_ec[0].'][^\s]+))( AS)*(.+)*$/i', $item, $matches); if (isset($matches[4])) { From 9c14f650c86f54f950695e0c628b33a59d4dd10b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 10 Jun 2012 14:35:07 +0300 Subject: [PATCH 1222/5397] Fix _where() escaping operators --- system/database/DB_query_builder.php | 9 ++++----- system/database/drivers/postgre/postgre_driver.php | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 3b45bbada98..7a54fce4872 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -426,6 +426,10 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) { $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type; + $k = $this->_has_operator($k) + ? $this->protect_identifiers(substr($k, 0, strrpos(rtrim($k), ' ')), FALSE, $escape).strrchr(rtrim($k), ' ') + : $this->protect_identifiers($k, FALSE, $escape); + if (is_null($v) && ! $this->_has_operator($k)) { // value appears not to have been set, assign the test to IS NULL @@ -436,7 +440,6 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) { if ($escape === TRUE) { - $k = $this->protect_identifiers($k, FALSE, $escape); $v = ' '.$this->escape($v); } @@ -445,10 +448,6 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) $k .= ' = '; } } - else - { - $k = $this->protect_identifiers($k, FALSE, $escape); - } $this->qb_where[] = $prefix.$k.$v; if ($this->qb_caching === TRUE) diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 7375fbf7132..9cce1a4039c 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -615,6 +615,10 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) { $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type; + $k = $this->_has_operator($k) + ? $this->protect_identifiers(substr($k, 0, strrpos(rtrim($k), ' ')), FALSE, $escape).strrchr(rtrim($k), ' ') + : $this->protect_identifiers($k, FALSE, $escape); + if (is_null($v) && ! $this->_has_operator($k)) { // value appears not to have been set, assign the test to IS NULL @@ -625,7 +629,6 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) { if ($escape === TRUE) { - $k = $this->protect_identifiers($k, FALSE, $escape); $v = ' '.$this->escape($v); } elseif (is_bool($v)) @@ -638,10 +641,6 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) $k .= ' = '; } } - else - { - $k = $this->protect_identifiers($k, FALSE, $escape); - } $this->qb_where[] = $prefix.$k.$v; if ($this->qb_caching === TRUE) From d454f0e413ba6df6494b6c0da4d32fac8a17de1c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 10 Jun 2012 14:51:04 +0300 Subject: [PATCH 1223/5397] Add BETWEEN to _has_operator() --- system/database/DB_driver.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index d6f9f9c1793..48f9fb5acb9 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1062,7 +1062,7 @@ public function update_string($table, $data, $where) */ protected function _has_operator($str) { - return (bool) preg_match('/(\s|<|>|!|=|IS NULL|IS NOT NULL)/i', trim($str)); + return (bool) preg_match('/(\s|<|>|!|=|IS NULL|IS NOT NULL|BETWEEN)/i', trim($str)); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 5b2f59e7e06..027163db779 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -246,6 +246,7 @@ Bug fixes for 3.0 - Fixed a bug (#706) - SQLSRV/MSSSQL didn't escape field names. - Fixed a bug (#1452) - protect_identifiers() didn't properly detect identifiers with spaces in their names. - Fixed a bug where protect_identifiers() ignored it's extra arguments when the value passed to it is an array. +- Fixed a bug where _has_operator() didn't detect BETWEEN. Version 2.1.1 ============= From 392b6ad264f045a5b9c19d51d09cb9f5a8675e8a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 10 Jun 2012 15:08:59 +0300 Subject: [PATCH 1224/5397] Fix _where() with multiple condition custom query --- system/database/DB_query_builder.php | 2 +- system/database/drivers/postgre/postgre_driver.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 7a54fce4872..65e2fa749f4 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -427,7 +427,7 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type; $k = $this->_has_operator($k) - ? $this->protect_identifiers(substr($k, 0, strrpos(rtrim($k), ' ')), FALSE, $escape).strrchr(rtrim($k), ' ') + ? $this->protect_identifiers(substr($k, 0, strpos(rtrim($k), ' ')), FALSE, $escape).strchr(rtrim($k), ' ') : $this->protect_identifiers($k, FALSE, $escape); if (is_null($v) && ! $this->_has_operator($k)) diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 9cce1a4039c..ad9ac900040 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -616,7 +616,7 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type; $k = $this->_has_operator($k) - ? $this->protect_identifiers(substr($k, 0, strrpos(rtrim($k), ' ')), FALSE, $escape).strrchr(rtrim($k), ' ') + ? $this->protect_identifiers(substr($k, 0, strpos(rtrim($k), ' ')), FALSE, $escape).strchr(rtrim($k), ' ') : $this->protect_identifiers($k, FALSE, $escape); if (is_null($v) && ! $this->_has_operator($k)) From 4db16326a0418776f10802ecdcccb385ff67e363 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 10 Jun 2012 15:12:02 +0300 Subject: [PATCH 1225/5397] Remove a non-existent variable usage --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 48f9fb5acb9..079ee8d052b 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1312,7 +1312,7 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden // way to deal with this, but I'm not thinking of it -- Rick if (strpos($item, '(') !== FALSE) { - return $item.$alias; + return $item; } // Convert tabs or multiple spaces into single spaces From dca9f23d2d24ccf412d239693d2d156a8ee7fabe Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Mon, 11 Jun 2012 09:17:14 +0200 Subject: [PATCH 1226/5397] get upload data with index key --- system/libraries/Upload.php | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 1f6aeeb6b58..e422edb6c46 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -347,26 +347,34 @@ public function do_upload($field = 'userfile') * Returns an associative array containing all of the information * related to the upload, allowing the developer easy access in one array. * + * @param string * @return array */ - public function data() + public function data($index = NULL) { - return array( - 'file_name' => $this->file_name, - 'file_type' => $this->file_type, - 'file_path' => $this->upload_path, - 'full_path' => $this->upload_path.$this->file_name, - 'raw_name' => str_replace($this->file_ext, '', $this->file_name), - 'orig_name' => $this->orig_name, + $data = array( + 'file_name' => $this->file_name, + 'file_type' => $this->file_type, + 'file_path' => $this->upload_path, + 'full_path' => $this->upload_path.$this->file_name, + 'raw_name' => str_replace($this->file_ext, '', $this->file_name), + 'orig_name' => $this->orig_name, 'client_name' => $this->client_name, - 'file_ext' => $this->file_ext, - 'file_size' => $this->file_size, - 'is_image' => $this->is_image(), + 'file_ext' => $this->file_ext, + 'file_size' => $this->file_size, + 'is_image' => $this->is_image(), 'image_width' => $this->image_width, 'image_height' => $this->image_height, 'image_type' => $this->image_type, 'image_size_str' => $this->image_size_str, ); + + if ($index === NULL OR ! isset($data[$index])) + { + return $data; + } + + return $data[$index]; } // -------------------------------------------------------------------- From 37ec30c6d89448cd11c24788c01ff06326de128b Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Mon, 11 Jun 2012 09:26:33 +0200 Subject: [PATCH 1227/5397] changelog --- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/libraries/file_uploading.rst | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 027163db779..984183a1380 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -146,6 +146,7 @@ Release Date: Not Released - Added a Redis driver to the :doc:`Caching Library `. - Added dsn (delivery status notification) option to the :doc:`Email Library `. - Renamed method _set_header() to set_header() and made it public to enable adding custom headers in the :doc:`Email Library `. + - Added a index parameter to the data() function in the Upload library. - Core diff --git a/user_guide_src/source/libraries/file_uploading.rst b/user_guide_src/source/libraries/file_uploading.rst index d573fc770b7..414d84f0b93 100644 --- a/user_guide_src/source/libraries/file_uploading.rst +++ b/user_guide_src/source/libraries/file_uploading.rst @@ -287,6 +287,10 @@ data related to the file you uploaded. Here is the array prototype:: [image_size_str] => width="800" height="200" ) +To return one element from the array:: + + $this->upload->data('file_name'); // Returns: mypic.jpg + Explanation *********** From 3a7fb04fec6d5a389b8ab40b32403c9db0c40389 Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Mon, 11 Jun 2012 09:29:16 +0200 Subject: [PATCH 1228/5397] tab fixes --- system/libraries/Upload.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index e422edb6c46..287e281068c 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -353,16 +353,16 @@ public function do_upload($field = 'userfile') public function data($index = NULL) { $data = array( - 'file_name' => $this->file_name, - 'file_type' => $this->file_type, - 'file_path' => $this->upload_path, - 'full_path' => $this->upload_path.$this->file_name, - 'raw_name' => str_replace($this->file_ext, '', $this->file_name), - 'orig_name' => $this->orig_name, + 'file_name' => $this->file_name, + 'file_type' => $this->file_type, + 'file_path' => $this->upload_path, + 'full_path' => $this->upload_path.$this->file_name, + 'raw_name' => str_replace($this->file_ext, '', $this->file_name), + 'orig_name' => $this->orig_name, 'client_name' => $this->client_name, - 'file_ext' => $this->file_ext, - 'file_size' => $this->file_size, - 'is_image' => $this->is_image(), + 'file_ext' => $this->file_ext, + 'file_size' => $this->file_size, + 'is_image' => $this->is_image(), 'image_width' => $this->image_width, 'image_height' => $this->image_height, 'image_type' => $this->image_type, From 46a0429a02bdf9dcf63c44c3f344417a1e9a5f0f Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Mon, 11 Jun 2012 10:37:52 +0200 Subject: [PATCH 1229/5397] fixes --- system/libraries/Upload.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 287e281068c..b1d6ad6cab3 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -369,12 +369,12 @@ public function data($index = NULL) 'image_size_str' => $this->image_size_str, ); - if ($index === NULL OR ! isset($data[$index])) + if ( ! empty($index)) { - return $data; + return isset($data[$index]) ? $data[$index] : NULL; } - return $data[$index]; + return $data; } // -------------------------------------------------------------------- From 0ee287ea08de5f3098a27230dcd8ca242b2eb793 Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Mon, 11 Jun 2012 10:38:14 +0200 Subject: [PATCH 1230/5397] fixes --- system/libraries/Upload.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index b1d6ad6cab3..c96daaf15f3 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -348,7 +348,7 @@ public function do_upload($field = 'userfile') * related to the upload, allowing the developer easy access in one array. * * @param string - * @return array + * @return mixed */ public function data($index = NULL) { From 650b4c000242ad90ed1ca1e56bdee7d42dbdedaa Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jun 2012 12:07:15 +0300 Subject: [PATCH 1231/5397] Remove unused qb_order property + other minor changes --- system/database/DB_query_builder.php | 46 ++++++++++------------------ user_guide_src/source/changelog.rst | 2 +- 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 65e2fa749f4..b9d77f1fb42 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -53,7 +53,6 @@ abstract class CI_DB_query_builder extends CI_DB_driver { protected $qb_keys = array(); protected $qb_limit = FALSE; protected $qb_offset = FALSE; - protected $qb_order = FALSE; protected $qb_orderby = array(); protected $qb_set = array(); protected $qb_wherein = array(); @@ -942,7 +941,7 @@ public function order_by($orderby, $direction = '', $escape = TRUE) } elseif (trim($direction) !== '') { - $direction = (in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE)) ? ' '.$direction : ' ASC'; + $direction = in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE) ? ' '.$direction : ' ASC'; } @@ -962,12 +961,9 @@ public function order_by($orderby, $direction = '', $escape = TRUE) $orderby = implode(', ', $temp); } - elseif ($direction !== $this->_random_keyword) + elseif ($direction !== $this->_random_keyword && $escape === TRUE) { - if ($escape === TRUE) - { - $orderby = $this->protect_identifiers($orderby); - } + $orderby = $this->protect_identifiers($orderby); } $this->qb_orderby[] = $orderby_statement = $orderby.$direction; @@ -994,7 +990,7 @@ public function limit($value, $offset = NULL) { $this->qb_limit = (int) $value; - if ( ! is_null($offset)) + if ( ! empty($offset)) { $this->qb_offset = (int) $offset; } @@ -1069,7 +1065,7 @@ public function get_compiled_select($table = '', $reset = TRUE) $this->from($table); } - $select = $this->_compile_select(); + $select = $this->_compile_select(); if ($reset === TRUE) { @@ -1092,7 +1088,7 @@ public function get_compiled_select($table = '', $reset = TRUE) * @param string the offset clause * @return object */ - public function get($table = '', $limit = null, $offset = null) + public function get($table = '', $limit = NULL, $offset = NULL) { if ($table !== '') { @@ -1100,7 +1096,7 @@ public function get($table = '', $limit = null, $offset = null) $this->from($table); } - if ( ! is_null($limit)) + if ( ! empty($limit)) { $this->limit($limit, $offset); } @@ -1165,7 +1161,7 @@ public function get_where($table = '', $where = null, $limit = null, $offset = n $this->where($where); } - if ( ! is_null($limit)) + if ( ! empty($limit)) { $this->limit($limit, $offset); } @@ -1274,11 +1270,7 @@ public function set_insert_batch($key, $value = '', $escape = TRUE) ksort($row); // puts $row in the same order as our keys - if ($escape === FALSE) - { - $this->qb_set[] = '('.implode(',', $row).')'; - } - else + if ($escape !== FALSE) { $clean = array(); foreach ($row as $value) @@ -1286,8 +1278,10 @@ public function set_insert_batch($key, $value = '', $escape = TRUE) $clean[] = $this->escape($value); } - $this->qb_set[] = '('.implode(',', $clean).')'; + $row = $clean; } + + $this->qb_set[] = '('.implode(',', $row).')'; } foreach ($keys as $k) @@ -1552,7 +1546,7 @@ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) $this->where($where); } - if ($limit != NULL) + if ( ! empty($limit)) { $this->limit($limit); } @@ -1873,7 +1867,7 @@ public function delete($table = '', $where = '', $limit = NULL, $reset_data = TR $this->where($where); } - if ($limit != NULL) + if ( ! empty($limit)) { $this->limit($limit); } @@ -1914,7 +1908,7 @@ protected function _delete($table, $where = array(), $like = array(), $limit = F return 'DELETE FROM '.$table .(count($conditions) > 0 ? ' WHERE '.implode(' AND ', $conditions) : '') - .($limit ? ' LIMIT '.$limit : ''); + .($limit ? ' LIMIT '.(int) $limit : ''); } // -------------------------------------------------------------------- @@ -2087,10 +2081,6 @@ protected function _compile_select($select_override = FALSE) if (count($this->qb_orderby) > 0) { $sql .= "\nORDER BY ".implode(', ', $this->qb_orderby); - if ($this->qb_order !== FALSE) - { - $sql .= ($this->qb_order === 'desc') ? ' DESC' : ' ASC'; - } } // Write the "LIMIT" portion of the query @@ -2320,8 +2310,7 @@ protected function _reset_select() 'qb_no_escape' => array(), 'qb_distinct' => FALSE, 'qb_limit' => FALSE, - 'qb_offset' => FALSE, - 'qb_order' => FALSE + 'qb_offset' => FALSE ) ); } @@ -2344,8 +2333,7 @@ protected function _reset_write() 'qb_like' => array(), 'qb_orderby' => array(), 'qb_keys' => array(), - 'qb_limit' => FALSE, - 'qb_order' => FALSE + 'qb_limit' => FALSE ) ); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 984183a1380..259f4e7320b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -146,7 +146,7 @@ Release Date: Not Released - Added a Redis driver to the :doc:`Caching Library `. - Added dsn (delivery status notification) option to the :doc:`Email Library `. - Renamed method _set_header() to set_header() and made it public to enable adding custom headers in the :doc:`Email Library `. - - Added a index parameter to the data() function in the Upload library. + - Added an "index" parameter to the data() method in the :doc:`Upload library `. - Core From ba2617646eb072be0ecfec8818e332345010fc03 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jun 2012 14:11:35 +0300 Subject: [PATCH 1232/5397] Fix issue #1455 (introduct in d261b1e89c3d4d5191036d5a5660ef6764e593a0) --- system/libraries/Email.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index c70144f7cf8..09f2175305d 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1599,7 +1599,7 @@ protected function _send_command($cmd, $data = '') $this->_debug_msg[] = '
    '.$cmd.': '.$reply.'
    '; - if (substr($reply, 0, 3) !== $resp) + if ( (int) substr($reply, 0, 3) !== $resp) { $this->_set_error_message('lang:email_smtp_error', $reply); return FALSE; From c88daba688d309150a7dce43817ab76ec7834bda Mon Sep 17 00:00:00 2001 From: Iban Eguia Date: Mon, 11 Jun 2012 13:58:30 +0200 Subject: [PATCH 1233/5397] Optimized now() function. Thanks to @narfbg --- system/helpers/date_helper.php | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index d5acec23fa2..b818da9d88d 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -50,25 +50,20 @@ */ function now($timezone = NULL) { - $CI =& get_instance(); - - if (is_null($timezone)) + if (empty($timezone)) { - $timezone = $CI->config->item('timezone'); + $timezone = config_item('timezone'); } - $time = time(); - if(strtolower($timezone) != 'local') + if ($timezone === 'local' OR $timezone === date_default_timezone_get()) { - $local = new DateTime(NULL, new DateTimeZone(date_default_timezone_get())); - $now = new DateTime(NULL, new DateTimeZone($timezone)); - $lcl_offset = $local->getOffset(); - $tz_offset = $now->getOffset(); - $offset = $tz_offset - $lcl_offset; - $time = $time + $offset; + return time(); } - return $time; + $datetime = new DateTime('now', new DateTimeZone($timezone)); + sscanf($datetime->format('j-n-Y G:i:s'), '%d-%d-%d %d:%d:%d', $day, $month, $year, $hour, $minute, $second); + + return mktime($hour, $minute, $second, $month, $day, $year); } } From 71379ca89226fe8af0314a8b70e5dc0f57367255 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jun 2012 16:12:43 +0300 Subject: [PATCH 1234/5397] Add OFFSET support for SQL Server 2005+ in MSSQL/SQLSRV --- .../database/drivers/mssql/mssql_driver.php | 25 ++++++++++++++++++- .../database/drivers/sqlsrv/sqlsrv_driver.php | 25 ++++++++++++++++--- user_guide_src/source/changelog.rst | 2 +- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 87094e76e07..47dc5584479 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -504,7 +504,30 @@ protected function _delete($table, $where = array(), $like = array(), $limit = F */ protected function _limit($sql, $limit, $offset) { - return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.($limit + $offset).' ', $sql); + // As of SQL Server 2012 (11.0.*) OFFSET is supported + if (version_compare($this->version(), '11', '>=')) + { + return $sql.' OFFSET '.(int) $offset.' ROWS FETCH NEXT '.(int) $limit.' ROWS ONLY'; + } + + $limit = $offset + $limit; + + // As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported, + // however an ORDER BY clause is required for it to work + if (version_compare($this->version(), '9', '>=') && $offset && ! empty($this->qb_orderby)) + { + $orderby = 'ORDER BY '.implode(', ', $this->qb_orderby); + + // We have to strip the ORDER BY clause + $sql = trim(substr($sql, 0, strrpos($sql, 'ORDER BY '.$orderby))); + + return 'SELECT '.(count($this->qb_select) === 0 ? '*' : implode(', ', $this->qb_select))." FROM (\n" + .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.$orderby.') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) + ."\n) ".$this->escape_identifiers('CI_subquery') + ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.((int) $offset + 1).' AND '.$limit; + } + + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index eebd6bff8e3..825c0245270 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -463,9 +463,28 @@ protected function _delete($table, $where = array(), $like = array(), $limit = F protected function _limit($sql, $limit, $offset) { // As of SQL Server 2012 (11.0.*) OFFSET is supported - return version_compare($this->version(), '11', '>=') - ? $sql.' OFFSET '.(int) $offset.' ROWS FETCH NEXT '.(int) $limit.' ROWS ONLY' - : preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.($limit + $offset).' ', $sql); + if (version_compare($this->version(), '11', '>=')) + { + return $sql.' OFFSET '.(int) $offset.' ROWS FETCH NEXT '.(int) $limit.' ROWS ONLY'; + } + + $limit = $offset + $limit; + + // An ORDER BY clause is required for ROW_NUMBER() to work + if ($offset && ! empty($this->qb_orderby)) + { + $orderby = 'ORDER BY '.implode(', ', $this->qb_orderby); + + // We have to strip the ORDER BY clause + $sql = trim(substr($sql, 0, strrpos($sql, 'ORDER BY '.$orderby))); + + return 'SELECT '.(count($this->qb_select) === 0 ? '*' : implode(', ', $this->qb_select))." FROM (\n" + .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.$orderby.') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) + ."\n) ".$this->escape_identifiers('CI_subquery') + ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.((int) $offset + 1).' AND '.$limit; + } + + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 259f4e7320b..03b541e3d6e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -98,7 +98,7 @@ Release Date: Not Released - Added support for optimize_table() in :doc:`Database Utility `. - Added escaping with QUOTE_IDENTIFIER setting detection. - Added port handling support for UNIX-based systems (MSSQL driver). - - Added OFFSET support for SQL Server 2012 and above. + - Added OFFSET support for SQL Server 2005 and above. - Improved support of the Oracle (OCI8) driver, including: - Added DSN string support (Easy Connect and TNS). - Added support for dropping tables to :doc:`Database Forge `. From df242193f3e785f4c9b802be3432f373fbc34a14 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jun 2012 16:16:49 +0300 Subject: [PATCH 1235/5397] Alter documentation on requirements for the SQLSRV driver --- user_guide_src/source/general/requirements.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/general/requirements.rst b/user_guide_src/source/general/requirements.rst index d97b7b4b20d..d9edfba6d19 100644 --- a/user_guide_src/source/general/requirements.rst +++ b/user_guide_src/source/general/requirements.rst @@ -4,5 +4,6 @@ Server Requirements - `PHP `_ version 5.2.4 or newer. - A Database is required for most web application programming. Current - supported databases are MySQL (5.1+), MySQLi, MS SQL, SQLSRV, Oracle, - PostgreSQL, SQLite, SQLite3, CUBRID, Interbase, ODBC and PDO. + supported databases are MySQL (5.1+), MySQLi, Oracle, PostgreSQL, + MS SQL, SQLSRV (SQL Server 2005+), SQLite, SQLite3, CUBRID, Interbase, + ODBC and PDO. From 88cb278a1e52dd7db5b0ebe2037c12f0dd69c0c1 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jun 2012 20:40:50 +0300 Subject: [PATCH 1236/5397] Fix issue #1456 --- system/database/DB_query_builder.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index b9d77f1fb42..7490639ddd4 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -953,7 +953,9 @@ public function order_by($orderby, $direction = '', $escape = TRUE) $part = trim($part); if ( ! in_array($part, $this->qb_aliased_tables)) { - $part = $this->protect_identifiers(trim($part)); + $part = preg_match('/^(.+)\s+(ASC|DESC)$/i', $part, $matches) + ? $this->protect_identifiers(rtrim($matches[1])).' '.$matches[2] + : $this->protect_identifiers($part); } $temp[] = $part; @@ -963,7 +965,9 @@ public function order_by($orderby, $direction = '', $escape = TRUE) } elseif ($direction !== $this->_random_keyword && $escape === TRUE) { - $orderby = $this->protect_identifiers($orderby); + $part = preg_match('/^(.+)\s+(ASC|DESC)$/i', $orderby, $matches) + ? $this->protect_identifiers(rtrim($matches[1])).' '.$matches[2] + : $this->protect_identifiers($orderby); } $this->qb_orderby[] = $orderby_statement = $orderby.$direction; From e6302791d229e42c8fc42a3982a10eb63508197f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jun 2012 21:28:22 +0300 Subject: [PATCH 1237/5397] Fix a join() issue --- system/database/DB_query_builder.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 7490639ddd4..b99d4c60763 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -343,7 +343,7 @@ public function join($table, $cond, $type = '') $this->_track_aliases($table); // Strip apart the condition and protect the identifiers - if (preg_match('/([\[\w\.]+)([\W\s]+)(.+)/', $cond, $match)) + if (preg_match('/([\[\w\.-]+)([\W\s]+)(.+)/', $cond, $match)) { $cond = $this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3]); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 03b541e3d6e..5627f022181 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -248,6 +248,7 @@ Bug fixes for 3.0 - Fixed a bug (#1452) - protect_identifiers() didn't properly detect identifiers with spaces in their names. - Fixed a bug where protect_identifiers() ignored it's extra arguments when the value passed to it is an array. - Fixed a bug where _has_operator() didn't detect BETWEEN. +- Fixed a bug where :doc:`Query Builder `'s join failed with identifiers containing dashes. Version 2.1.1 ============= From 5d28176a76355b230f1c4e1858475def4e34fa4c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jun 2012 22:05:40 +0300 Subject: [PATCH 1238/5397] Fix issue #1264 --- system/database/DB_forge.php | 54 +++++++++++++++++-- system/database/DB_utility.php | 13 +++-- .../drivers/cubrid/cubrid_utility.php | 6 +-- .../drivers/interbase/interbase_forge.php | 8 +++ .../database/drivers/sqlite/sqlite_forge.php | 8 +++ .../drivers/sqlite3/sqlite3_forge.php | 8 +++ user_guide_src/source/changelog.rst | 1 + 7 files changed, 85 insertions(+), 13 deletions(-) diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index ff5eb3fe638..9b7639289c0 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -72,6 +72,11 @@ public function create_database($db_name) return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; } + if ( ! empty($this->db->data_cache['db_names'])) + { + $this->db->data_cache['db_names'][] = $db_name; + } + return TRUE; } @@ -99,6 +104,15 @@ public function drop_database($db_name) return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; } + if ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($db_name), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + return TRUE; } @@ -209,7 +223,18 @@ public function create_table($table = '', $if_not_exists = FALSE) $sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists); $this->_reset(); - return is_bool($sql) ? $sql : $this->db->query($sql); + + if (is_bool($sql)) + { + return $sql; + } + + if (($result = $this->db->query($sql)) !== FALSE && ! empty($this->db->data_cache['table_names'])) + { + $this->db->data_cache['table_names'][] = $$this->db->dbprefix.$table; + } + + return $result; } // -------------------------------------------------------------------- @@ -231,7 +256,19 @@ public function drop_table($table_name) return ($this->db->db_debug) ? $this->db->display_error('db_unsuported_feature') : FALSE; } - return $this->db->query(sprintf($this->_drop_table, $this->db->escape_identifiers($this->db->dbprefix.$table_name))); + $result = $this->db->query(sprintf($this->_drop_table, $this->db->escape_identifiers($this->db->dbprefix.$table_name))); + + // Update table list cache + if ($result && ! empty($this->db->data_cache['table_names'])) + { + $key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['table_names'][$key]); + } + } + + return $result; } // -------------------------------------------------------------------- @@ -255,10 +292,21 @@ public function rename_table($table_name, $new_table_name) return ($this->db->db_debug) ? $this->db->display_error('db_unsuported_feature') : FALSE; } - return $this->db->query(sprintf($this->_rename_table, + $result = $this->db->query(sprintf($this->_rename_table, $this->db->escape_identifiers($this->db->dbprefix.$table_name), $this->db->escape_identifiers($this->db->dbprefix.$new_table_name)) ); + + if ($result && ! empty($this->db->data_cache['table_names'])) + { + $key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE); + if ($key !== FALSE) + { + $this->db->data_cache['table_names'][$key] = $this->db->dbprefix.$new_table_name; + } + } + + return $result; } // -------------------------------------------------------------------- diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index 02c9218347b..6a3b40779b5 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -35,7 +35,6 @@ abstract class CI_DB_utility extends CI_DB_forge { public $db; - public $data_cache = array(); // Platform specific SQL strings // Just setting those defaults to FALSE as they are mostly MySQL-specific @@ -60,29 +59,29 @@ public function __construct() public function list_databases() { // Is there a cached result? - if (isset($this->data_cache['db_names'])) + if (isset($this->db->data_cache['db_names'])) { - return $this->data_cache['db_names']; + return $this->db->data_cache['db_names']; } elseif ($this->_list_databases === FALSE) { return ($this->db->db_debug) ? $this->db->display_error('db_unsuported_feature') : FALSE; } - $this->data_cache['db_names'] = array(); + $this->db->data_cache['db_names'] = array(); $query = $this->db->query($this->_list_databases); if ($query === FALSE) { - return $this->data_cache['db_names']; + return $this->db->data_cache['db_names']; } for ($i = 0, $c = count($query); $i < $c; $i++) { - $this->data_cache['db_names'] = current($query[$i]); + $this->db->data_cache['db_names'] = current($query[$i]); } - return $this->data_cache['db_names']; + return $this->db->data_cache['db_names']; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/cubrid/cubrid_utility.php b/system/database/drivers/cubrid/cubrid_utility.php index c8cee99b66b..ea8feb4e2fa 100644 --- a/system/database/drivers/cubrid/cubrid_utility.php +++ b/system/database/drivers/cubrid/cubrid_utility.php @@ -41,12 +41,12 @@ class CI_DB_cubrid_utility extends CI_DB_utility { */ public function list_databases() { - if (isset($this->data_cache['db_names'])) + if (isset($this->db->data_cache['db_names'])) { - return $this->data_cache['db_names']; + return $this->db->data_cache['db_names']; } - return $this->data_cache['db_names'] = cubrid_list_dbs($this->db->conn_id); + return $this->db->data_cache['db_names'] = cubrid_list_dbs($this->db->conn_id); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/interbase/interbase_forge.php b/system/database/drivers/interbase/interbase_forge.php index 3f9967f1f18..d1b006e80fd 100644 --- a/system/database/drivers/interbase/interbase_forge.php +++ b/system/database/drivers/interbase/interbase_forge.php @@ -67,6 +67,14 @@ public function drop_database($db_name = '') { return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } return TRUE; } diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php index 71eed7df481..e02e327f3c9 100644 --- a/system/database/drivers/sqlite/sqlite_forge.php +++ b/system/database/drivers/sqlite/sqlite_forge.php @@ -61,6 +61,14 @@ public function drop_database($db_name = '') { return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } return TRUE; } diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php index f8bd116565e..6a76ba929a2 100644 --- a/system/database/drivers/sqlite3/sqlite3_forge.php +++ b/system/database/drivers/sqlite3/sqlite3_forge.php @@ -66,6 +66,14 @@ public function drop_database($db_name = '') { return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } return TRUE; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 5627f022181..fb137e460da 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -249,6 +249,7 @@ Bug fixes for 3.0 - Fixed a bug where protect_identifiers() ignored it's extra arguments when the value passed to it is an array. - Fixed a bug where _has_operator() didn't detect BETWEEN. - Fixed a bug where :doc:`Query Builder `'s join failed with identifiers containing dashes. +- Fixed a bug (#1264) - :doc:`Database Forge ` and :doc:`Database Utilities ` didn't update/reset the databases and tables list cache when a table or a database is created, dropped or renamed. Version 2.1.1 ============= From 1d1d7ffc3868fd76b46fdce093fab0ce89320e94 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jun 2012 22:35:35 +0300 Subject: [PATCH 1239/5397] Fix an issue introduced in 88cb278a1e52dd7db5b0ebe2037c12f0dd69c0c1 --- system/database/DB_query_builder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index b99d4c60763..645ac39691a 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -965,7 +965,7 @@ public function order_by($orderby, $direction = '', $escape = TRUE) } elseif ($direction !== $this->_random_keyword && $escape === TRUE) { - $part = preg_match('/^(.+)\s+(ASC|DESC)$/i', $orderby, $matches) + $orderby = preg_match('/^(.+)\s+(ASC|DESC)$/i', $orderby, $matches) ? $this->protect_identifiers(rtrim($matches[1])).' '.$matches[2] : $this->protect_identifiers($orderby); } From 428702387ca071db4686ec6d6c60bd35b01c33e4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 01:30:20 +0300 Subject: [PATCH 1240/5397] join() with multiple conditions and optional escape parameter --- system/database/DB_query_builder.php | 52 +++++++++++++++++++++++----- user_guide_src/source/changelog.rst | 50 ++++++++++++++------------ 2 files changed, 71 insertions(+), 31 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 645ac39691a..488b294e4c2 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -83,6 +83,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver { * Generates the SELECT portion of the query * * @param string + * @param mixed * @return object */ public function select($select = '*', $escape = NULL) @@ -92,6 +93,9 @@ public function select($select = '*', $escape = NULL) $select = explode(',', $select); } + // If the escape value was not set will will base it on the global setting + is_bool($escape) OR $escape = $this->_protect_identifiers; + foreach ($select as $val) { $val = trim($val); @@ -320,15 +324,16 @@ public function from($from) * @param string * @param string the join condition * @param string the type of join + * @param string wether not to try to escape identifiers * @return object */ - public function join($table, $cond, $type = '') + public function join($table, $cond, $type = '', $escape = TRUE) { if ($type !== '') { $type = strtoupper(trim($type)); - if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER'))) + if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER'), TRUE)) { $type = ''; } @@ -342,12 +347,39 @@ public function join($table, $cond, $type = '') // in the protect_identifiers to know whether to add a table prefix $this->_track_aliases($table); - // Strip apart the condition and protect the identifiers - if (preg_match('/([\[\w\.-]+)([\W\s]+)(.+)/', $cond, $match)) + // Split multiple conditions + if ($escape === TRUE && preg_match_all('/\sAND\s|\sOR\s/i', $cond, $m, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) + { + $newcond = ''; + $m[0][] = array('', strlen($cond)); + + for ($i = 0, $c = count($m[0]), $s = 0; + $i < $c; + $s += $m[0][$i][1] + strlen($m[0][$i][0]), $i++) + { + $temp = substr($cond, $s, $m[0][$i][1]); + + $newcond .= preg_match('/([\[\w\.-]+)([\W\s]+)(.+)/i', $temp, $match) + ? $this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3]) + : $temp; + + $newcond .= $m[0][$i][0]; + } + + $cond = $newcond; + } + // Split apart the condition and protect the identifiers + elseif ($escape === TRUE && preg_match('/([\[\w\.-]+)([\W\s]+)(.+)/i', $cond, $match)) { $cond = $this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3]); } + // Do we want to escape the table name? + if ($escape === TRUE) + { + $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); + } + // Assemble the JOIN statement $this->qb_join[] = $join = $type.'JOIN '.$this->protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond; @@ -370,6 +402,7 @@ public function join($table, $cond, $type = '') * * @param mixed * @param mixed + * @param bool * @return object */ public function where($key, $value = NULL, $escape = TRUE) @@ -387,6 +420,7 @@ public function where($key, $value = NULL, $escape = TRUE) * * @param mixed * @param mixed + * @param bool * @return object */ public function or_where($key, $value = NULL, $escape = TRUE) @@ -404,6 +438,7 @@ public function or_where($key, $value = NULL, $escape = TRUE) * @param mixed * @param mixed * @param string + * @param mixed * @return object */ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) @@ -416,10 +451,7 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) } // If the escape value was not set will will base it on the global setting - if ( ! is_bool($escape)) - { - $escape = $this->_protect_identifiers; - } + $escape = $this->_protect_identifiers; foreach ($key as $k => $v) { @@ -851,6 +883,7 @@ public function group_by($by) * * @param string * @param string + * @param bool * @return object */ public function having($key, $value = '', $escape = TRUE) @@ -867,6 +900,7 @@ public function having($key, $value = '', $escape = TRUE) * * @param string * @param string + * @param bool * @return object */ public function or_having($key, $value = '', $escape = TRUE) @@ -883,6 +917,8 @@ public function or_having($key, $value = '', $escape = TRUE) * * @param string * @param string + * @param string + * @param bool * @return object */ protected function _having($key, $value = '', $type = 'AND ', $escape = TRUE) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index fb137e460da..2c76ea43fd8 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -63,14 +63,17 @@ Release Date: Not Released - Database - - Renamed the Active Record class to Query Builder to remove confusion with the Active Record design pattern. - - Added the ability to insert objects with insert_batch() in :doc:`Query Builder `. - - Added new :doc:`Query Builder ` methods that return the SQL string of queries without executing them: get_compiled_select(), get_compiled_insert(), get_compiled_update(), get_compiled_delete(). - - Adding $escape parameter to the order_by() method, this enables ordering by custom fields. + - :doc:`Query Builder ` changes include: + - Renamed the Active Record class to Query Builder to remove confusion with the Active Record design pattern. + - Added the ability to insert objects with insert_batch(). + - Added new methods that return the SQL string of queries without executing them: get_compiled_select(), get_compiled_insert(), get_compiled_update(), get_compiled_delete(). + - Added an optional order_by() parameter that allows to disable escaping (useful for custom fields). + - Added an optional join() parameter that allows to disable escaping. + - Added support for join() with multiple conditions. - Improved support for the MySQLi driver, including: - - OOP style of the PHP extension is now used, instead of the procedural aliases. - - Server version checking is now done via ``mysqli::$server_info`` instead of running an SQL query. - - Added persistent connections support for PHP >= 5.3. + - OOP style of the PHP extension is now used, instead of the procedural aliases. + - Server version checking is now done via ``mysqli::$server_info`` instead of running an SQL query. + - Added persistent connections support for PHP >= 5.3. - Added 'dsn' configuration setting for drivers that support DSN strings (PDO, PostgreSQL, Oracle, ODBC, CUBRID). - Improved PDO database support. - Added Interbase/Firebird database support via the "interbase" driver. @@ -78,14 +81,16 @@ Release Date: Not Released - Replaced the _error_message() and _error_number() methods with error(), that returns an array containing the last database error code and message. - Improved version() implementation so that drivers that have a native function to get the version number don't have to be defined in the core DB_driver class. - Improved support of the PostgreSQL driver, including: - - pg_version() is now used to get the database version number, when possible. - - Added db_set_charset() support. - - Added _optimize_table() support for the :doc:`Database Utility Class ` (rebuilds table indexes). - - Added boolean data type support in escape(). - - Added update_batch() support. - - Removed limit() and order_by() support for UPDATE and DELETE queries in as PostgreSQL does not support those features. + - pg_version() is now used to get the database version number, when possible. + - Added db_set_charset() support. + - Added _optimize_table() support for the :doc:`Database Utility Class ` (rebuilds table indexes). + - Added boolean data type support in escape(). + - Added update_batch() support. + - Removed limit() and order_by() support for UPDATE and DELETE queries in as PostgreSQL does not support those features. - Added a constructor to the DB_result class and moved all driver-specific properties and logic out of the base DB_driver class to allow better abstraction. - Removed protect_identifiers() and renamed internal method _protect_identifiers() to it instead - it was just an alias. + - Renamed internal method _escape_identifiers() to escape_identifiers(). + - Updated escape_identifiers() to accept an array of fields as well as strings. - MySQL and MySQLi drivers now require at least MySQL version 5.1. - db_set_charset() now only requires one parameter (collation was only needed due to legacy support for MySQL versions prior to 5.1). - Added support for SQLite3 database driver. @@ -100,16 +105,15 @@ Release Date: Not Released - Added port handling support for UNIX-based systems (MSSQL driver). - Added OFFSET support for SQL Server 2005 and above. - Improved support of the Oracle (OCI8) driver, including: - - Added DSN string support (Easy Connect and TNS). - - Added support for dropping tables to :doc:`Database Forge `. - - Added support for listing database schemas to :doc:`Database Utilities `. - - Generally improved for speed and cleaned up all of its components. - - *Row* result methods now really only fetch only the needed number of rows, instead of depending entirely on result(). - - num_rows() is now only called explicitly by the developer and no longer re-executes statements. - - Added replace() support for SQLite. - - Renamed internal method _escape_identifiers() to escape_identifiers(). - - Updated escape_identifiers() to accept an array of fields as well as strings. - - Added SQLite support for drop_table() in :doc:`Database Forge `. + - Added DSN string support (Easy Connect and TNS). + - Added support for drop_table() in :doc:`Database Forge `. + - Added support for list_databases() in :doc:`Database Utilities `. + - Generally improved for speed and cleaned up all of its components. + - *Row* result methods now really only fetch only the needed number of rows, instead of depending entirely on result(). + - num_rows() is now only called explicitly by the developer and no longer re-executes statements. + - Improved support of the Sqlite driver, including: + - Added support for replace() in :doc:`Query Builder `. + - Added support for drop_table() in :doc:`Database Forge `. - Added ODBC support for create_database(), drop_database() and drop_table() in :doc:`Database Forge `. - Added PDO support for create_database(), drop_database and drop_table() in :doc:`Database Forge `. - Added unbuffered_row() method for getting a row without prefetching whole result (consume less memory). From c73df1de471d4dc849942e718e17d97a04c6fd20 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 01:43:03 +0300 Subject: [PATCH 1241/5397] Add changelog entry for issue #7 --- user_guide_src/source/changelog.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2c76ea43fd8..6d29711036b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -252,8 +252,9 @@ Bug fixes for 3.0 - Fixed a bug (#1452) - protect_identifiers() didn't properly detect identifiers with spaces in their names. - Fixed a bug where protect_identifiers() ignored it's extra arguments when the value passed to it is an array. - Fixed a bug where _has_operator() didn't detect BETWEEN. -- Fixed a bug where :doc:`Query Builder `'s join failed with identifiers containing dashes. +- Fixed a bug where :doc:`Query Builder `'s join() method failed with identifiers containing dashes. - Fixed a bug (#1264) - :doc:`Database Forge ` and :doc:`Database Utilities ` didn't update/reset the databases and tables list cache when a table or a database is created, dropped or renamed. +- Fixed a bug (#7) - :doc:`Query Builder `'s join() method only escaped one set of conditions. Version 2.1.1 ============= From 079fbfcde095230f304e889217f897031a948f61 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 02:26:58 +0300 Subject: [PATCH 1242/5397] Changed APPPATH, BASEPATH and VIEWPATH to be absolute paths (fixes issue #1321) and removed EXT constant --- index.php | 46 +++++++++++++++++++---------- user_guide_src/source/changelog.rst | 8 +++-- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/index.php b/index.php index 3b00dd36084..680dccfea89 100644 --- a/index.php +++ b/index.php @@ -178,9 +178,11 @@ { $system_path = realpath($system_path).'/'; } - - // ensure there's a trailing slash - $system_path = rtrim($system_path, '/').'/'; + else + { + // Ensure there's a trailing slash + $system_path = rtrim($system_path, '/').'/'; + } // Is the system path correct? if ( ! is_dir($system_path)) @@ -196,10 +198,6 @@ // The name of THIS file define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME)); - // The PHP file extension - // this global constant is deprecated. - define('EXT', '.php'); - // Path to the system folder define('BASEPATH', str_replace('\\', '/', $system_path)); @@ -212,6 +210,11 @@ // The path to the "application" folder if (is_dir($application_folder)) { + if (realpath($system_path) !== FALSE) + { + $application_folder = realpath($application_folder); + } + define('APPPATH', $application_folder.'/'); } else @@ -226,20 +229,33 @@ } // The path to the "views" folder - if (is_dir($view_folder)) - { - define ('VIEWPATH', $view_folder .'/'); - } - else + if ( ! is_dir($view_folder)) { - if ( ! is_dir(APPPATH.'views/')) + if ( ! empty($view_folder) && is_dir(APPPATH.$view_folder.'/')) + { + $view_folder = APPPATH.$view_folder; + } + elseif ( ! is_dir(APPPATH.'views/')) { header('HTTP/1.1 503 Service Unavailable.', TRUE, '503'); exit('Your view folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF); } + else + { + $view_folder = APPPATH.'views'; + } + } - define ('VIEWPATH', APPPATH.'views/' ); + if (realpath($view_folder) !== FALSE) + { + $view_folder = realpath($view_folder).'/'; } + else + { + $view_folder = rtrim($view_folder, '/').'/'; + } + + define ('VIEWPATH', $view_folder); /* * -------------------------------------------------------------------- @@ -251,4 +267,4 @@ require_once BASEPATH.'core/CodeIgniter.php'; /* End of file index.php */ -/* Location: ./index.php */ +/* Location: ./index.php */ \ No newline at end of file diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 6d29711036b..ebf29791bbf 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -33,15 +33,18 @@ Release Date: Not Released - Added support for ics Calendar files to mimes.php - Updated support for xml ('application/xml') and xsl ('application/xml', 'text/xsl') files in mimes.php. - Updated support for doc files in mimes.php. + - Added some more doctypes. - Added Romanian and Greek characters in foreign_characters.php. - Changed logger to only chmod when file is first created. - Removed previously deprecated SHA1 Library. - Removed previously deprecated use of ``$autoload['core']`` in application/config/autoload.php. Only entries in ``$autoload['libraries']`` are auto-loaded now. - - Added some more doctypes. + - Removed previously deprecated EXT constant. - Updated all classes to be written in PHP 5 style, with visibility declarations and no ``var`` usage for properties. - Moved error templates to "application/views/errors" - - Global config files are loaded first, then environment ones. Environment config keys overwrite base ones, allowing to only set the keys we want changed per Env. + - Global config files are loaded first, then environment ones. Environment config keys overwrite base ones, allowing to only set the keys we want changed per environment. + - Changed detection of ``$view_folder`` so that if it's not found in the current path, it will now also be searched for under the application folder. + - Path constants BASEPATH, APPPATH and VIEWPATH are now (internally) defined as absolute paths. - Helpers @@ -255,6 +258,7 @@ Bug fixes for 3.0 - Fixed a bug where :doc:`Query Builder `'s join() method failed with identifiers containing dashes. - Fixed a bug (#1264) - :doc:`Database Forge ` and :doc:`Database Utilities ` didn't update/reset the databases and tables list cache when a table or a database is created, dropped or renamed. - Fixed a bug (#7) - :doc:`Query Builder `'s join() method only escaped one set of conditions. +- Fixed a bug (#1321) - Core Exceptions class couldn't find the errors/ folder in some cases. Version 2.1.1 ============= From 0d2c06ea1d96ea3f35dd1e7856977a24cec43233 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 02:33:45 +0300 Subject: [PATCH 1243/5397] Change file permissions for system/core/*.php and system/database/DB.php so that they don't differ from the rest --- system/core/Benchmark.php | 0 system/core/CodeIgniter.php | 0 system/core/Config.php | 0 system/core/Exceptions.php | 0 system/core/Hooks.php | 0 system/core/Input.php | 0 system/core/Lang.php | 0 system/core/Model.php | 0 system/core/Output.php | 0 system/core/Router.php | 0 system/core/Security.php | 0 system/core/URI.php | 0 system/database/DB.php | 0 13 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 system/core/Benchmark.php mode change 100755 => 100644 system/core/CodeIgniter.php mode change 100755 => 100644 system/core/Config.php mode change 100755 => 100644 system/core/Exceptions.php mode change 100755 => 100644 system/core/Hooks.php mode change 100755 => 100644 system/core/Input.php mode change 100755 => 100644 system/core/Lang.php mode change 100755 => 100644 system/core/Model.php mode change 100755 => 100644 system/core/Output.php mode change 100755 => 100644 system/core/Router.php mode change 100755 => 100644 system/core/Security.php mode change 100755 => 100644 system/core/URI.php mode change 100755 => 100644 system/database/DB.php diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php old mode 100755 new mode 100644 diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php old mode 100755 new mode 100644 diff --git a/system/core/Config.php b/system/core/Config.php old mode 100755 new mode 100644 diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php old mode 100755 new mode 100644 diff --git a/system/core/Hooks.php b/system/core/Hooks.php old mode 100755 new mode 100644 diff --git a/system/core/Input.php b/system/core/Input.php old mode 100755 new mode 100644 diff --git a/system/core/Lang.php b/system/core/Lang.php old mode 100755 new mode 100644 diff --git a/system/core/Model.php b/system/core/Model.php old mode 100755 new mode 100644 diff --git a/system/core/Output.php b/system/core/Output.php old mode 100755 new mode 100644 diff --git a/system/core/Router.php b/system/core/Router.php old mode 100755 new mode 100644 diff --git a/system/core/Security.php b/system/core/Security.php old mode 100755 new mode 100644 diff --git a/system/core/URI.php b/system/core/URI.php old mode 100755 new mode 100644 diff --git a/system/database/DB.php b/system/database/DB.php old mode 100755 new mode 100644 From 782de1101f37b21ff2183fde5b2ed8569d8c287d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 03:04:50 +0300 Subject: [PATCH 1244/5397] Added MySQLi backup() support --- .../drivers/mysqli/mysqli_utility.php | 119 +++++++++++++++++- user_guide_src/source/changelog.rst | 5 +- 2 files changed, 120 insertions(+), 4 deletions(-) diff --git a/system/database/drivers/mysqli/mysqli_utility.php b/system/database/drivers/mysqli/mysqli_utility.php index 27d4ef81771..5d2bdbce02c 100644 --- a/system/database/drivers/mysqli/mysqli_utility.php +++ b/system/database/drivers/mysqli/mysqli_utility.php @@ -46,9 +46,124 @@ class CI_DB_mysqli_utility extends CI_DB_utility { */ protected function _backup($params = array()) { - // Currently unsupported - return $this->db->display_error('db_unsuported_feature'); + 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->escape_identifiers($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 '.$this->db->protect_identifiers($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 '.$this->db->protect_identifiers($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 = $query->result_id->fetch_field()) + { + // Most versions of MySQL store timestamp as a string + $is_int[$i] = in_array(strtolower($field->type), + array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), + TRUE); + + // Create a string of field names + $field_str .= $this->db->escape_identifiers($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 + $val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $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 '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline; + } + + $output .= $newline.$newline; + } + + return $output; } + } /* End of file mysqli_utility.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ebf29791bbf..f91a1dc9901 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -77,6 +77,7 @@ Release Date: Not Released - OOP style of the PHP extension is now used, instead of the procedural aliases. - Server version checking is now done via ``mysqli::$server_info`` instead of running an SQL query. - Added persistent connections support for PHP >= 5.3. + - Added support for backup() in :doc:`Database Utilities `. - Added 'dsn' configuration setting for drivers that support DSN strings (PDO, PostgreSQL, Oracle, ODBC, CUBRID). - Improved PDO database support. - Added Interbase/Firebird database support via the "interbase" driver. @@ -86,7 +87,7 @@ Release Date: Not Released - Improved support of the PostgreSQL driver, including: - pg_version() is now used to get the database version number, when possible. - Added db_set_charset() support. - - Added _optimize_table() support for the :doc:`Database Utility Class ` (rebuilds table indexes). + - Added support for optimize_table() in :doc:`Database Utilities ` (rebuilds table indexes). - Added boolean data type support in escape(). - Added update_batch() support. - Removed limit() and order_by() support for UPDATE and DELETE queries in as PostgreSQL does not support those features. @@ -114,7 +115,7 @@ Release Date: Not Released - Generally improved for speed and cleaned up all of its components. - *Row* result methods now really only fetch only the needed number of rows, instead of depending entirely on result(). - num_rows() is now only called explicitly by the developer and no longer re-executes statements. - - Improved support of the Sqlite driver, including: + - Improved support of the SQLite driver, including: - Added support for replace() in :doc:`Query Builder `. - Added support for drop_table() in :doc:`Database Forge `. - Added ODBC support for create_database(), drop_database() and drop_table() in :doc:`Database Forge `. From c9195a75e7d3d06524c9a5ce97f4f4c30c69019b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 03:49:03 +0300 Subject: [PATCH 1245/5397] Add changelog for pull #1017 --- system/libraries/Cache/drivers/Cache_file.php | 4 ++-- user_guide_src/source/changelog.rst | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index 1b57c8929ab..08231963ef0 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -26,7 +26,7 @@ */ /** - * CodeIgniter Memcached Caching Class + * CodeIgniter File Caching Class * * @package CodeIgniter * @subpackage Libraries @@ -202,4 +202,4 @@ public function is_supported() } /* End of file Cache_file.php */ -/* Location: ./system/libraries/Cache/drivers/Cache_file.php */ +/* Location: ./system/libraries/Cache/drivers/Cache_file.php */ \ No newline at end of file diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f91a1dc9901..f342abf155e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -256,10 +256,11 @@ Bug fixes for 3.0 - Fixed a bug (#1452) - protect_identifiers() didn't properly detect identifiers with spaces in their names. - Fixed a bug where protect_identifiers() ignored it's extra arguments when the value passed to it is an array. - Fixed a bug where _has_operator() didn't detect BETWEEN. -- Fixed a bug where :doc:`Query Builder `'s join() method failed with identifiers containing dashes. +- Fixed a bug in :doc:`Query Builder `'s join() method where it failed with identifiers containing dashes. - Fixed a bug (#1264) - :doc:`Database Forge ` and :doc:`Database Utilities ` didn't update/reset the databases and tables list cache when a table or a database is created, dropped or renamed. - Fixed a bug (#7) - :doc:`Query Builder `'s join() method only escaped one set of conditions. - Fixed a bug (#1321) - Core Exceptions class couldn't find the errors/ folder in some cases. +- Fixed a bug in the File-based :doc:`Cache Library ` driver's get_metadata() method where a non-existent array key was accessed for the TTL value. Version 2.1.1 ============= From 7eb7ebfaa05b99c12746a7042116afa51d55260e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 10:26:27 +0300 Subject: [PATCH 1246/5397] Switch protected properties in Pagination class to public and fix 2 issues from d261b1e89c3d4d5191036d5a5660ef6764e593a0 --- system/libraries/Pagination.php | 68 ++++++++++++++++----------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index a91159c9887..ed86b89bc1f 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -36,38 +36,38 @@ */ class CI_Pagination { - protected $base_url = ''; // The page we are linking to - protected $prefix = ''; // A custom prefix added to the path. - protected $suffix = ''; // A custom suffix added to the path. - protected $total_rows = 0; // Total number of items (database results) - protected $per_page = 10; // Max number of items you want shown per page - protected $num_links = 2; // Number of "digit" links to show before/after the currently viewed page - protected $cur_page = 0; // The current page being viewed - protected $use_page_numbers = FALSE; // Use page number for segment instead of offset - protected $first_link = '‹ First'; - protected $next_link = '>'; - protected $prev_link = '<'; - protected $last_link = 'Last ›'; - protected $uri_segment = 3; - protected $full_tag_open = ''; - protected $full_tag_close = ''; - protected $first_tag_open = ''; - protected $first_tag_close = ' '; - protected $last_tag_open = ' '; - protected $last_tag_close = ''; - protected $first_url = ''; // Alternative URL for the First Page. - protected $cur_tag_open = ' '; - protected $cur_tag_close = ''; - protected $next_tag_open = ' '; - protected $next_tag_close = ' '; - protected $prev_tag_open = ' '; - protected $prev_tag_close = ''; - protected $num_tag_open = ' '; - protected $num_tag_close = ''; - protected $page_query_string = FALSE; - protected $query_string_segment = 'per_page'; - protected $display_pages = TRUE; - protected $anchor_class = ''; + public $base_url = ''; // The page we are linking to + public $prefix = ''; // A custom prefix added to the path. + public $suffix = ''; // A custom suffix added to the path. + public $total_rows = 0; // Total number of items (database results) + public $per_page = 10; // Max number of items you want shown per page + public $num_links = 2; // Number of "digit" links to show before/after the currently viewed page + public $cur_page = 0; // The current page being viewed + public $use_page_numbers = FALSE; // Use page number for segment instead of offset + public $first_link = '‹ First'; + public $next_link = '>'; + public $prev_link = '<'; + public $last_link = 'Last ›'; + public $uri_segment = 3; + public $full_tag_open = ''; + public $full_tag_close = ''; + public $first_tag_open = ''; + public $first_tag_close = ' '; + public $last_tag_open = ' '; + public $last_tag_close = ''; + public $first_url = ''; // Alternative URL for the First Page. + public $cur_tag_open = ' '; + public $cur_tag_close = ''; + public $next_tag_open = ' '; + public $next_tag_close = ' '; + public $prev_tag_open = ' '; + public $prev_tag_close = ''; + public $num_tag_open = ' '; + public $num_tag_close = ''; + public $page_query_string = FALSE; + public $query_string_segment = 'per_page'; + public $display_pages = TRUE; + public $anchor_class = ''; /** * Constructor @@ -97,7 +97,7 @@ public function initialize($params = array()) { if ($key === 'anchor_class') { - $this->anchor_class = ($val !== '') ? 'class="'.$val.'" ' : ''; + $this->anchor_class = ($val) ? 'class="'.$val.'" ' : ''; } elseif (isset($this->$key)) { @@ -145,7 +145,7 @@ public function create_links() if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) { - if ($CI->input->get($this->query_string_segment) !== $base_page) + if ($CI->input->get($this->query_string_segment) != $base_page) { $this->cur_page = (int) $CI->input->get($this->query_string_segment); } From 5a1e5e34207b9b30ff42200158074953ca1cabab Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 11:28:26 +0300 Subject: [PATCH 1247/5397] Add support for the anchor 'rel' attribute in the Pagination library --- system/libraries/Pagination.php | 44 ++++++++++++++++--- user_guide_src/source/changelog.rst | 5 ++- .../source/libraries/pagination.rst | 24 ++++++++++ 3 files changed, 64 insertions(+), 9 deletions(-) diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index ed86b89bc1f..cdec736ff9a 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -68,6 +68,7 @@ class CI_Pagination { public $query_string_segment = 'per_page'; public $display_pages = TRUE; public $anchor_class = ''; + public $attr_rel = TRUE; /** * Constructor @@ -212,7 +213,8 @@ public function create_links() if ($this->first_link !== FALSE && $this->cur_page > ($this->num_links + 1)) { $first_url = ($this->first_url === '') ? $this->base_url : $this->first_url; - $output .= $this->first_tag_open.'anchor_class.'href="'.$first_url.'">'.$this->first_link.''.$this->first_tag_close; + $output .= $this->first_tag_open.'anchor_class.'href="'.$first_url.'"'.$this->_attr_rel('start').'>' + .$this->first_link.''.$this->first_tag_close; } // Render the "previous" link @@ -222,12 +224,14 @@ public function create_links() if ($i === $base_page && $this->first_url !== '') { - $output .= $this->prev_tag_open.'anchor_class.'href="'.$this->first_url.'">'.$this->prev_link.''.$this->prev_tag_close; + $output .= $this->prev_tag_open.'anchor_class.'href="'.$this->first_url.'"'.$this->_attr_rel('prev').'>' + .$this->prev_link.''.$this->prev_tag_close; } else { $i = ($i === $base_page) ? '' : $this->prefix.$i.$this->suffix; - $output .= $this->prev_tag_open.'anchor_class.'href="'.$this->base_url.$i.'">'.$this->prev_link.''.$this->prev_tag_close; + $output .= $this->prev_tag_open.'anchor_class.'href="'.$this->base_url.$i.'"'.$this->_attr_rel('prev').'>' + .$this->prev_link.''.$this->prev_tag_close; } } @@ -252,13 +256,15 @@ public function create_links() if ($n === '' && $this->first_url !== '') { - $output .= $this->num_tag_open.'anchor_class.'href="'.$this->first_url.'">'.$loop.''.$this->num_tag_close; + $output .= $this->num_tag_open.'anchor_class.'href="'.$this->first_url.'"'.$this->_attr_rel('start').'>' + .$loop.''.$this->num_tag_close; } else { $n = ($n === '') ? '' : $this->prefix.$n.$this->suffix; - $output .= $this->num_tag_open.'anchor_class.'href="'.$this->base_url.$n.'">'.$loop.''.$this->num_tag_close; + $output .= $this->num_tag_open.'anchor_class.'href="'.$this->base_url.$n.'"'.$this->_attr_rel().'>' + .$loop.''.$this->num_tag_close; } } } @@ -270,7 +276,8 @@ public function create_links() { $i = ($this->use_page_numbers) ? $this->cur_page + 1 : $this->cur_page * $this->per_page; - $output .= $this->next_tag_open.'anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'">'.$this->next_link.''.$this->next_tag_close; + $output .= $this->next_tag_open.'anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'"'.$this->_attr_rel('next').'>' + .$this->next_link.''.$this->next_tag_close; } // Render the "Last" link @@ -278,7 +285,8 @@ public function create_links() { $i = ($this->use_page_numbers) ? $num_pages : ($num_pages * $this->per_page) - $this->per_page; - $output .= $this->last_tag_open.'anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'">'.$this->last_link.''.$this->last_tag_close; + $output .= $this->last_tag_open.'anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'"'.$this->_attr_rel().'>' + .$this->last_link.''.$this->last_tag_close; } // Kill double slashes. Note: Sometimes we can end up with a double slash @@ -289,6 +297,28 @@ public function create_links() return $this->full_tag_open.$output.$this->full_tag_close; } + // -------------------------------------------------------------------- + + /** + * Add "rel" attribute + * + * @param string + * @return string + */ + protected function _attr_rel($value = '') + { + if (empty($this->attr_rel) OR ($this->attr_rel === TRUE && empty($value))) + { + return ''; + } + elseif ( ! is_bool($this->attr_rel)) + { + $value = $this->attr_rel; + } + + return ' rel="'.$value.'"'; + } + } /* End of file Pagination.php */ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f342abf155e..82116c9b110 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -154,7 +154,8 @@ Release Date: Not Released - Added a Redis driver to the :doc:`Caching Library `. - Added dsn (delivery status notification) option to the :doc:`Email Library `. - Renamed method _set_header() to set_header() and made it public to enable adding custom headers in the :doc:`Email Library `. - - Added an "index" parameter to the data() method in the :doc:`Upload library `. + - Added an "index" parameter to the data() method in the :doc:`Upload Library `. + - Added support for the anchor "rel" attribute in the :doc:`Pagination Library `. - Core @@ -177,7 +178,7 @@ Bug fixes for 3.0 - Fixed a bug where ``unlink()`` raised an error if cache file did not exist when you try to delete it. - Fixed a bug (#181) where a mis-spelling was in the form validation language file. - Fixed a bug (#159, #163) that mishandled Query Builder nested transactions because _trans_depth was not getting incremented. -- Fixed a bug (#737, #75) where pagination anchor class was not set properly when using initialize method. +- Fixed a bug (#737, #75) - :doc:`Pagination ` anchor class was not set properly when using initialize method. - Fixed a bug (#419) - auto_link() now recognizes URLs that come after a word boundary. - Fixed a bug (#724) - is_unique in form validation now checks that you are connected to a database. - Fixed a bug (#647) - _get_mod_time() in Zip library no longer generates stat failed errors. diff --git a/user_guide_src/source/libraries/pagination.rst b/user_guide_src/source/libraries/pagination.rst index f1653c913ad..560755fb650 100644 --- a/user_guide_src/source/libraries/pagination.rst +++ b/user_guide_src/source/libraries/pagination.rst @@ -254,3 +254,27 @@ Adding a class to every anchor If you want to add a class attribute to every link rendered by the pagination class, you can set the config "anchor_class" equal to the classname you want. + +:: + + $config['anchor_class'] = 'myclass'; // class="myclass" + +********************************** +Changing the "rel" attribute value +********************************** + +By default, the rel attribute will be automatically put under the +following conditions: + +- rel="start" for the "first" link +- rel="prev" for the "previous" link +- rel="next" for the "next" link + +If you want to disable the rel attribute, or change its value, you +can set the 'attr_rel' config option:: + + // Disable + $config['attr_rel'] = FALSE; + + // Use a custom value on all anchors + $config['attr_rel'] = 'custom_value'; // produces: rel="custom_value" \ No newline at end of file From f696c1fe8df29d54a933804a6f4d182a5a59c7a2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 12:14:51 +0300 Subject: [PATCH 1248/5397] Fix issue #1202 --- system/libraries/Encrypt.php | 1 + user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+) diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php index ce5e030b074..8ffd93aea66 100644 --- a/system/libraries/Encrypt.php +++ b/system/libraries/Encrypt.php @@ -213,6 +213,7 @@ public function encode_from_legacy($string, $legacy_mode = MCRYPT_MODE_ECB, $key $dec = base64_decode($string); if (($dec = $this->mcrypt_decode($dec, $key)) === FALSE) { + $this->set_mode($current_mode); return FALSE; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 82116c9b110..4962caa7d9a 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -262,6 +262,7 @@ Bug fixes for 3.0 - Fixed a bug (#7) - :doc:`Query Builder `'s join() method only escaped one set of conditions. - Fixed a bug (#1321) - Core Exceptions class couldn't find the errors/ folder in some cases. - Fixed a bug in the File-based :doc:`Cache Library ` driver's get_metadata() method where a non-existent array key was accessed for the TTL value. +- Fixed a bug (#1202) - :doc:`Encryption Library ` encode_from_legacy() didn't set back the encrypt mode on failure. Version 2.1.1 ============= From 806ca600d3669343ee7ae90a9b5d65be9dfdbefe Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 12:51:27 +0300 Subject: [PATCH 1249/5397] Some more index.php improvements --- index.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/index.php b/index.php index 680dccfea89..380d1017b9c 100644 --- a/index.php +++ b/index.php @@ -174,9 +174,9 @@ chdir(dirname(__FILE__)); } - if (realpath($system_path) !== FALSE) + if (($_temp = realpath($system_path)) !== FALSE) { - $system_path = realpath($system_path).'/'; + $system_path = $_temp.'/'; } else { @@ -187,6 +187,7 @@ // Is the system path correct? if ( ! is_dir($system_path)) { + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); exit('Your system folder path does not appear to be set correctly. Please open the following file and correct this: '.pathinfo(__FILE__, PATHINFO_BASENAME)); } @@ -210,9 +211,9 @@ // The path to the "application" folder if (is_dir($application_folder)) { - if (realpath($system_path) !== FALSE) + if (($_temp = realpath($system_path)) !== FALSE) { - $application_folder = realpath($application_folder); + $application_folder = $_temp; } define('APPPATH', $application_folder.'/'); @@ -221,7 +222,7 @@ { if ( ! is_dir(BASEPATH.$application_folder.'/')) { - header('HTTP/1.1 503 Service Unavailable.', TRUE, '503'); + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); exit('Your application folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF); } @@ -237,7 +238,7 @@ } elseif ( ! is_dir(APPPATH.'views/')) { - header('HTTP/1.1 503 Service Unavailable.', TRUE, '503'); + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); exit('Your view folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF); } else @@ -246,7 +247,7 @@ } } - if (realpath($view_folder) !== FALSE) + if (($_temp = realpath($view_folder)) !== FALSE) { $view_folder = realpath($view_folder).'/'; } From cce918033a99186cd76019d022571a8d9321d899 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 13:25:31 +0300 Subject: [PATCH 1250/5397] Fix APPPATH --- index.php | 4 ++-- system/core/Loader.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/index.php b/index.php index 380d1017b9c..ad98013caf8 100644 --- a/index.php +++ b/index.php @@ -211,7 +211,7 @@ // The path to the "application" folder if (is_dir($application_folder)) { - if (($_temp = realpath($system_path)) !== FALSE) + if (($_temp = realpath($application_folder)) !== FALSE) { $application_folder = $_temp; } @@ -256,7 +256,7 @@ $view_folder = rtrim($view_folder, '/').'/'; } - define ('VIEWPATH', $view_folder); + define('VIEWPATH', $view_folder); /* * -------------------------------------------------------------------- diff --git a/system/core/Loader.php b/system/core/Loader.php index 09e948714c5..94739c74ae2 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -668,7 +668,7 @@ public function driver($library = '', $params = NULL, $object_name = NULL) * @param bool * @return void */ - public function add_package_path($path, $view_cascade=TRUE) + public function add_package_path($path, $view_cascade = TRUE) { $path = rtrim($path, '/').'/'; From 4e9538fe19b09c0dc588542cfb7f793348b83bf7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 14:16:53 +0300 Subject: [PATCH 1251/5397] Fix issue #145 --- system/database/DB_driver.php | 26 +++++++++----------------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 079ee8d052b..88a3b388ff8 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -596,35 +596,27 @@ public function trans_status() */ public function compile_binds($sql, $binds) { - if (strpos($sql, $this->bind_marker) === FALSE) + if (preg_match_all('/(>|<|=|!)\s*('.preg_quote($this->bind_marker).')/i', $sql, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE) !== count($binds)) { return $sql; } - - if ( ! is_array($binds)) + elseif ( ! is_array($binds)) { $binds = array($binds); } - - // Get the sql segments around the bind markers - $segments = explode($this->bind_marker, $sql); - - // The count of bind should be 1 less then the count of segments - // If there are more bind arguments trim it down - if (count($binds) >= count($segments)) + else { - $binds = array_slice($binds, 0, count($segments)-1); + // Make sure we're using numeric keys + $binds = array_values($binds); } - // Construct the binded query - $result = $segments[0]; - $i = 0; - foreach ($binds as $bind) + + for ($i = count($matches) - 1; $i >= 0; $i--) { - $result .= $this->escape($bind).$segments[++$i]; + $sql = substr_replace($sql, $this->escape($binds[$i]), $matches[$i][2][1], 1); } - return $result; + return $sql; } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4962caa7d9a..ab3e01394ed 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -263,6 +263,7 @@ Bug fixes for 3.0 - Fixed a bug (#1321) - Core Exceptions class couldn't find the errors/ folder in some cases. - Fixed a bug in the File-based :doc:`Cache Library ` driver's get_metadata() method where a non-existent array key was accessed for the TTL value. - Fixed a bug (#1202) - :doc:`Encryption Library ` encode_from_legacy() didn't set back the encrypt mode on failure. +- Fixed a bug (#145) - compile_binds() failed when the bind marker was present in a literal string within the query. Version 2.1.1 ============= From 6a56d50cc03ec74a905718e711b48253cc267f00 Mon Sep 17 00:00:00 2001 From: Kevin Wood-Friend Date: Tue, 12 Jun 2012 09:54:01 -0400 Subject: [PATCH 1252/5397] Modified Form Validation class's set_rules() so it can now handle an array of rules, instead of just a string --- system/libraries/Form_validation.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 77c968e7c31..6cbe032c756 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -187,6 +187,12 @@ public function set_rules($field, $label = '', $rules = '') return $this; } + // Convert an array of rules to a string + if (is_array($rules)) + { + $rules = implode('|', $rules); + } + // No fields? Nothing to do... if ( ! is_string($field) OR ! is_string($rules) OR $field === '') { From fe8f5e25c8127c0ff7ebb77dd5f9b982e9eb9270 Mon Sep 17 00:00:00 2001 From: Kevin Wood-Friend Date: Tue, 12 Jun 2012 09:56:00 -0400 Subject: [PATCH 1253/5397] Updated changelog for set_rules() accepting an array of rules, as well as a string. --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ab3e01394ed..33b41316354 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -147,6 +147,7 @@ Release Date: Not Released - _execute() now considers input data to be invalid if a specified rule is not found. - Removed method is_numeric() as it exists as a native PHP function and _execute() will find and use that (the 'is_numeric' rule itself is deprecated since 1.6.1). - Native PHP functions used as rules can now accept an additional parameter, other than the data itself. + - Updated set_rules() to accept an array of rules as well as a string. - Changed the :doc:`Session Library ` to select only one row when using database sessions. - Added all_flashdata() method to session class. Returns an associative array of only flashdata. - Allowed for setting table class defaults in a config file. From feb14dac4e7a417a48344a5188a8ad8074871df4 Mon Sep 17 00:00:00 2001 From: Iban Eguia Date: Tue, 12 Jun 2012 16:09:36 +0200 Subject: [PATCH 1254/5397] Changed the config parameter. The session's _get_time() function has also changed. --- application/config/config.php | 4 ++-- system/helpers/date_helper.php | 2 +- system/libraries/Session.php | 14 +++++++++++--- user_guide_src/source/helpers/date_helper.rst | 6 ++---- user_guide_src/source/installation/upgrade_300.rst | 5 ++--- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/application/config/config.php b/application/config/config.php index 12ef77c76a7..fd6a1aeb0f5 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -359,7 +359,7 @@ /* |-------------------------------------------------------------------------- -| Master Timezone +| Master Time Reference |-------------------------------------------------------------------------- | | You can set any PHP supported timezones to be the master timezone when @@ -367,7 +367,7 @@ | time. | */ -$config['timezone'] = 'local'; +$config['time_reference'] = 'local'; /* diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index b818da9d88d..131508f69ed 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -52,7 +52,7 @@ function now($timezone = NULL) { if (empty($timezone)) { - $timezone = config_item('timezone'); + $timezone = config_item('time_reference'); } if ($timezone === 'local' OR $timezone === date_default_timezone_get()) diff --git a/system/libraries/Session.php b/system/libraries/Session.php index 7beedd96b2b..9fdf744c383 100644 --- a/system/libraries/Session.php +++ b/system/libraries/Session.php @@ -786,9 +786,17 @@ protected function _flashdata_sweep() */ protected function _get_time() { - return (strtolower($this->time_reference) === 'gmt') - ? mktime(gmdate('H'), gmdate('i'), gmdate('s'), gmdate('m'), gmdate('d'), gmdate('Y')) - : time(); + $timezone = config_item('time_reference'); + + if ($timezone === 'local' OR $timezone === date_default_timezone_get()) + { + return time(); + } + + $datetime = new DateTime('now', new DateTimeZone($timezone)); + sscanf($datetime->format('j-n-Y G:i:s'), '%d-%d-%d %d:%d:%d', $day, $month, $year, $hour, $minute, $second); + + return mktime($hour, $minute, $second, $month, $day, $year); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/helpers/date_helper.rst b/user_guide_src/source/helpers/date_helper.rst index 33b39bd5b3a..7bbfd4f15c4 100644 --- a/user_guide_src/source/helpers/date_helper.rst +++ b/user_guide_src/source/helpers/date_helper.rst @@ -30,11 +30,9 @@ it will return time(). :returns: integer :: + echo now("Australia/Victoria"); - $tz = "Australia/Victoria"; - echo now($tz); - -If a timezone is not provided, it will return time() based on "timezone" setting. +If a timezone is not provided, it will return time() based on "time_reference" setting. mdate() ======= diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index c2c3899ee39..debf9662ce5 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -45,9 +45,8 @@ need to rename the `$active_record` variable to `$query_builder`. Step 5: Change your use of the Date helper's now() function =========================================================== -Function now() has been modified. You can see the changes in :doc:`Date Helper <../helpers/date_helper>` -You must replace $config['time_reference'] with $config['timezone'] in your config.php file. You can select all -PHP supported timezones, listed here: `Supported timezones `_. You can also +Function now() has been modified. You can see the changes in :doc:`Date Helper <../helpers/date_helper>`. +You can now select all PHP supported timezones in the `time_reference` setting, listed here: `Supported timezones `_. You can also use 'local' if you want to get time(). Step 6: Move your errors folder From f9311136d9f821b7b0b1f2fa7c933f51803d4f96 Mon Sep 17 00:00:00 2001 From: Kevin Wood-Friend Date: Tue, 12 Jun 2012 10:57:57 -0400 Subject: [PATCH 1255/5397] Updated Form Validation's documentation for set_rules() now accepting an array of rules --- user_guide_src/source/libraries/form_validation.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 3c0e6eda45f..3bcad7ba694 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -304,6 +304,10 @@ Give it a try! Submit your form without the proper data and you'll see new error messages that correspond to your new rules. There are numerous rules available which you can read about in the validation reference. +.. note:: You can also pass an array of rules to set_rules(), instead of a string. Example:: + + $this->form_validation->set_rules('username', 'Username', array('required', 'min_length[5]')); + Prepping Data ============= @@ -935,7 +939,7 @@ $this->form_validation->set_rules(); :param string $field: The field name :param string $label: The field label - :param string $rules: The rules, seperated by a pipe "|" + :param mixed $rules: The rules, as a string with rules separated by a pipe "|", or an array or rules. :rtype: Object Permits you to set validation rules, as described in the tutorial From 97827bc9ddad61f51ceb595e8b8b5441d4d991c2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 21:20:05 +0300 Subject: [PATCH 1256/5397] Fix issue #1460 --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 88a3b388ff8..63d3372cf93 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -596,7 +596,7 @@ public function trans_status() */ public function compile_binds($sql, $binds) { - if (preg_match_all('/(>|<|=|!)\s*('.preg_quote($this->bind_marker).')/i', $sql, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE) !== count($binds)) + if (preg_match_all('/(>|<|=|!|BETWEEN\s|AND\s)\s*('.preg_quote($this->bind_marker).')/i', $sql, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE) !== count($binds)) { return $sql; } From 29953ddc989e2ae26afedefd99e347f2d692d0ec Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jun 2012 21:48:13 +0300 Subject: [PATCH 1257/5397] Additional improvements to compile_binds() --- system/database/DB_driver.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 63d3372cf93..e0266b2b600 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -596,7 +596,12 @@ public function trans_status() */ public function compile_binds($sql, $binds) { - if (preg_match_all('/(>|<|=|!|BETWEEN\s|AND\s)\s*('.preg_quote($this->bind_marker).')/i', $sql, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE) !== count($binds)) + if (empty($binds)) OR empty($this->bind_marker)) + { + return $sql; + } + elseif (preg_match_all('/(>|<|=|!|BETWEEN\s|AND\s)\s*('.preg_quote($this->bind_marker).')/i', + $sql, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE) !== count($binds)) { return $sql; } @@ -610,10 +615,9 @@ public function compile_binds($sql, $binds) $binds = array_values($binds); } - - for ($i = count($matches) - 1; $i >= 0; $i--) + for ($i = count($matches) - 1, $l = strlen($this->bind_marker); $i >= 0; $i--) { - $sql = substr_replace($sql, $this->escape($binds[$i]), $matches[$i][2][1], 1); + $sql = substr_replace($sql, $this->escape($binds[$i]), $matches[$i][2][1], $l); } return $sql; From 63779194b6788edfa8899ed3c86c653d0933ce3b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 13 Jun 2012 10:04:49 +0300 Subject: [PATCH 1258/5397] Fix a syntax error --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index e0266b2b600..e044634292b 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -596,7 +596,7 @@ public function trans_status() */ public function compile_binds($sql, $binds) { - if (empty($binds)) OR empty($this->bind_marker)) + if (empty($binds) OR empty($this->bind_marker)) { return $sql; } From 6984d153f68f1f89fa6800143498cc4914441d66 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 13 Jun 2012 10:10:17 +0300 Subject: [PATCH 1259/5397] Add a changelog entry --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 33b41316354..e955209b103 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -265,6 +265,7 @@ Bug fixes for 3.0 - Fixed a bug in the File-based :doc:`Cache Library ` driver's get_metadata() method where a non-existent array key was accessed for the TTL value. - Fixed a bug (#1202) - :doc:`Encryption Library ` encode_from_legacy() didn't set back the encrypt mode on failure. - Fixed a bug (#145) - compile_binds() failed when the bind marker was present in a literal string within the query. +- Fixed a bug in protect_identifiers() where if passed along with the field names, operators got escaped as well. Version 2.1.1 ============= From 9cf12d1de76c2696233a437e0cdc7266bb846ae6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 13 Jun 2012 10:19:59 +0300 Subject: [PATCH 1260/5397] Fix docs for Input library (issue #1465) --- user_guide_src/source/libraries/input.rst | 37 ++++++----------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/user_guide_src/source/libraries/input.rst b/user_guide_src/source/libraries/input.rst index 7f995f0507b..8c6f7c84979 100644 --- a/user_guide_src/source/libraries/input.rst +++ b/user_guide_src/source/libraries/input.rst @@ -42,14 +42,14 @@ this:: Please refer to the :doc:`Security class ` documentation for information on using XSS Filtering in your application. -Using POST, COOKIE, or SERVER Data -================================== +Using POST, GET, COOKIE, or SERVER Data +======================================= -CodeIgniter comes with three helper functions that let you fetch POST, +CodeIgniter comes with four helper methods that let you fetch POST, GET, COOKIE or SERVER items. The main advantage of using the provided functions rather than fetching an item directly ($_POST['something']) -is that the functions will check to see if the item is set and return -false (boolean) if not. This lets you conveniently use data without +is that the methods will check to see if the item is set and return +NULL if not. This lets you conveniently use data without having to test whether an item exists first. In other words, normally you might do something like this:: @@ -73,8 +73,8 @@ looking for:: $this->input->post('some_data'); -The function returns FALSE (boolean) if the item you are attempting to -retrieve does not exist. +The function returns NULL if the item you are attempting to retrieve +does not exist. The second optional parameter lets you run the data through the XSS filter. It's enabled by setting the second parameter to boolean TRUE; @@ -130,7 +130,9 @@ $this->input->cookie() This function is identical to the post function, only it fetches cookie data:: - $this->input->cookie('some_data', TRUE); + $this->input->cookie('some_cookie'); + $this->input->cookie('some_cookie, TRUE); // with XSS filter + $this->input->server() ====================== @@ -195,25 +197,6 @@ parameters:: $this->input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure); -$this->input->cookie() -====================== - -Lets you fetch a cookie. The first parameter will contain the name of -the cookie you are looking for (including any prefixes):: - - cookie('some_cookie'); - -The function returns NULL if the item you are attempting to -retrieve does not exist. - -The second optional parameter lets you run the data through the XSS -filter. It's enabled by setting the second parameter to boolean TRUE; - -:: - - cookie('some_cookie', TRUE); - - $this->input->ip_address() =========================== From 22c3e73573d2828cec6183866b162359f873a949 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 13 Jun 2012 10:21:36 +0300 Subject: [PATCH 1261/5397] Another input library docs fix --- user_guide_src/source/libraries/input.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/input.rst b/user_guide_src/source/libraries/input.rst index 8c6f7c84979..c0b9c65897e 100644 --- a/user_guide_src/source/libraries/input.rst +++ b/user_guide_src/source/libraries/input.rst @@ -59,9 +59,10 @@ With CodeIgniter's built in functions you can simply do this:: $something = $this->input->post('something'); -The three functions are: +The four methods are: - $this->input->post() +- $this->input->get() - $this->input->cookie() - $this->input->server() From 10cbdf091b3cdbc72847dad28a1dce03a92119b6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 13 Jun 2012 13:32:30 +0300 Subject: [PATCH 1262/5397] Really fix compile_binds() --- system/database/DB_driver.php | 44 ++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index e044634292b..1fece5cf7a9 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -596,28 +596,54 @@ public function trans_status() */ public function compile_binds($sql, $binds) { - if (empty($binds) OR empty($this->bind_marker)) - { - return $sql; - } - elseif (preg_match_all('/(>|<|=|!|BETWEEN\s|AND\s)\s*('.preg_quote($this->bind_marker).')/i', - $sql, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE) !== count($binds)) + if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) { return $sql; } elseif ( ! is_array($binds)) { - $binds = array($binds); + $binds = array($this->escape($binds)); + $bind_count = 1; } else { // Make sure we're using numeric keys $binds = array_values($binds); + $bind_count = count($binds); + + // Escape the bind values + for ($i = 0; $i < $bind_count; $i++) + { + $binds[$i] = $this->escape($binds[$i]); + } } - for ($i = count($matches) - 1, $l = strlen($this->bind_marker); $i >= 0; $i--) + // Make sure not to replace a chunk inside a string that happens to match the bind marker + if ($c = preg_match_all("/'[^']*'/i", $sql, $matches)) + { + $ml = strlen($this->bind_marker); + $c = preg_match_all('/'.preg_quote($this->bind_marker).'/i', + str_replace($matches[0], + str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]), + $sql, $c), + $matches, PREG_OFFSET_CAPTURE); + + // Bind values' count must match the count of markers in the query + if ($bind_count !== $c) + { + return $sql; + } + + do + { + $c--; + $sql = substr_replace($sql, $binds[$c], $matches[0][$c][1], $ml); + } + while ($c !== 0); + } + elseif (substr_count($sql, $this->bind_marker) === count($binds)) { - $sql = substr_replace($sql, $this->escape($binds[$i]), $matches[$i][2][1], $l); + return str_replace($this->bind_marker, $binds, $sql, $bind_count); } return $sql; From af915ce01e4e5424a7a4ea67e4e3018a40752a89 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 13 Jun 2012 19:03:06 +0300 Subject: [PATCH 1263/5397] Switch compile_binds() to use substr_replace() instead of str_replace() --- system/database/DB_driver.php | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 1fece5cf7a9..d056bdb9010 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -602,7 +602,7 @@ public function compile_binds($sql, $binds) } elseif ( ! is_array($binds)) { - $binds = array($this->escape($binds)); + $binds = array($binds); $bind_count = 1; } else @@ -610,18 +610,14 @@ public function compile_binds($sql, $binds) // Make sure we're using numeric keys $binds = array_values($binds); $bind_count = count($binds); - - // Escape the bind values - for ($i = 0; $i < $bind_count; $i++) - { - $binds[$i] = $this->escape($binds[$i]); - } } + // We'll need the marker length later + $ml = strlen($this->bind_marker); + // Make sure not to replace a chunk inside a string that happens to match the bind marker if ($c = preg_match_all("/'[^']*'/i", $sql, $matches)) { - $ml = strlen($this->bind_marker); $c = preg_match_all('/'.preg_quote($this->bind_marker).'/i', str_replace($matches[0], str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]), @@ -633,18 +629,18 @@ public function compile_binds($sql, $binds) { return $sql; } - - do - { - $c--; - $sql = substr_replace($sql, $binds[$c], $matches[0][$c][1], $ml); - } - while ($c !== 0); } - elseif (substr_count($sql, $this->bind_marker) === count($binds)) + elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker).'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count) + { + return $sql; + } + + do { - return str_replace($this->bind_marker, $binds, $sql, $bind_count); + $c--; + $sql = substr_replace($sql, $this->escape($binds[$c]), $matches[0][$c][1], $ml); } + while ($c !== 0); return $sql; } From 7400965017f87c3aba18bf75ed7d732359fd577d Mon Sep 17 00:00:00 2001 From: Iban Eguia Date: Wed, 13 Jun 2012 22:57:50 +0200 Subject: [PATCH 1264/5397] Fixed some stuff in documentation. --- application/config/config.php | 7 ++++--- system/helpers/date_helper.php | 4 ++-- user_guide_src/source/helpers/date_helper.rst | 9 ++++++--- user_guide_src/source/installation/upgrade_300.rst | 4 ++-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/application/config/config.php b/application/config/config.php index fd6a1aeb0f5..31ff2024d54 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -362,9 +362,10 @@ | Master Time Reference |-------------------------------------------------------------------------- | -| You can set any PHP supported timezones to be the master timezone when -| you call the now() function. 'local' string can be used to get the local -| time. +| Options are 'local' or any PHP supported timezone. This pref tells the +| system whether to use your server's local time as the master 'now' +| reference, or convert it to any PHP supported timezone. See the 'date +| helper' page of the user guide for information regarding date handling. | */ $config['time_reference'] = 'local'; diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 131508f69ed..a5c46e47b0a 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -42,8 +42,8 @@ /** * Get "now" time * - * Returns time() based on the timezone parameter or on the "timezone" - * setting + * Returns time() based on the timezone parameter or on the + * "time_reference" setting * * @param string * @return int diff --git a/user_guide_src/source/helpers/date_helper.rst b/user_guide_src/source/helpers/date_helper.rst index 7bbfd4f15c4..1b7177fc260 100644 --- a/user_guide_src/source/helpers/date_helper.rst +++ b/user_guide_src/source/helpers/date_helper.rst @@ -20,9 +20,12 @@ The following functions are available: now() ===== -Returns the current time as a Unix timestamp, based on the "timezone" parameter. -All PHP available timezones are supported. You can also use 'local' timezone, and -it will return time(). +Returns the current time as a Unix timestamp, referenced either to your +server's local time or any PHP suported timezone, based on the "time reference" +setting in your config file. If you do not intend to set your master time reference +to any other PHP suported timezone (which you'll typically do if you run a site that +lets each user set their own timezone settings) there is no benefit to using this +function over PHP's time() function. .. php:method:: now($timezone = NULL) diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index debf9662ce5..d8a3d5bc1ae 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -46,8 +46,8 @@ Step 5: Change your use of the Date helper's now() function =========================================================== Function now() has been modified. You can see the changes in :doc:`Date Helper <../helpers/date_helper>`. -You can now select all PHP supported timezones in the `time_reference` setting, listed here: `Supported timezones `_. You can also -use 'local' if you want to get time(). +You can now select all PHP supported timezones in the `time_reference` setting, listed here: +`Supported timezones `_. You can also use 'local' if you want to get time(). Step 6: Move your errors folder =============================== From d461934184d95b0cfb2feec93f27b621ef72a5c2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 02:27:25 +0300 Subject: [PATCH 1265/5397] Fix issue #10 + URI class speed improvements --- system/core/URI.php | 20 ++++++++++++-------- user_guide_src/source/changelog.rst | 4 ++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/system/core/URI.php b/system/core/URI.php index a575bc36ed5..2e661ed4cb6 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -119,7 +119,7 @@ public function _fetch_uri_string() } // No PATH_INFO?... What about QUERY_STRING? - $path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); + $path = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); if (trim($path, '/') !== '') { $this->_set_uri_string($path); @@ -163,7 +163,7 @@ public function _fetch_uri_string() * @param string * @return void */ - public function _set_uri_string($str) + protected function _set_uri_string($str) { // Filter out control characters $str = remove_invisible_characters($str, FALSE); @@ -177,8 +177,8 @@ public function _set_uri_string($str) /** * Detects the URI * - * This function will detect the URI automatically and fix the query string - * if necessary. + * This function will detect the URI automatically + * and fix the query string if necessary. * * @return string */ @@ -189,7 +189,6 @@ protected function _detect_uri() return ''; } - $uri = $_SERVER['REQUEST_URI']; if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) { $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); @@ -198,14 +197,19 @@ protected function _detect_uri() { $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); } + else + { + $uri = $_SERVER['REQUEST_URI']; + } // 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) + if (strpos($uri, '?/') === 0) { $uri = substr($uri, 2); } - $parts = preg_split('#\?#i', $uri, 2); + + $parts = explode('?', $uri, 2); $uri = $parts[0]; if (isset($parts[1])) { @@ -223,7 +227,7 @@ protected function _detect_uri() return '/'; } - $uri = parse_url($uri, PHP_URL_PATH); + $uri = parse_url('pseudo://hostname/'.$uri, PHP_URL_PATH); // Do some final cleaning of the URI and return it return str_replace(array('//', '../'), '/', trim($uri, '/')); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e955209b103..039e8acf3c9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -266,11 +266,12 @@ Bug fixes for 3.0 - Fixed a bug (#1202) - :doc:`Encryption Library ` encode_from_legacy() didn't set back the encrypt mode on failure. - Fixed a bug (#145) - compile_binds() failed when the bind marker was present in a literal string within the query. - Fixed a bug in protect_identifiers() where if passed along with the field names, operators got escaped as well. +- Fixed a bug (#10) - :doc:`URI Library ` internal method _detect_uri() failed with paths containing a colon. Version 2.1.1 ============= -Release Date: Not Released +Release Date: June 13, 2012 - General Changes - Fixed support for docx, xlsx files in mimes.php. @@ -295,7 +296,6 @@ Bug fixes for 2.1.1 - Fixed a bug (#726) - PDO put a 'dbname' argument in it's connection string regardless of the database platform in use, which made it impossible to use SQLite. - Fixed a bug - CI_DB_pdo_driver::num_rows() was not returning properly value with SELECT queries, cause it was relying on PDOStatement::rowCount(). - Fixed a bug (#1059) - CI_Image_lib::clear() was not correctly clearing all necessary object properties, namely width and height. -- Fixed a bud (#1387) - Active Record's ``from()`` method didn't escape table aliases. Version 2.1.0 ============= From d163e0b219b8afacea3cd0d1d7c2ce5bb6f8a933 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 03:09:53 +0300 Subject: [PATCH 1266/5397] Polish changes from pull #1233 - Session class already has the time_reference setting - 'GMT' is a valid timezone, so nothing needs to be changed in order to work properly (upgrade notes) - Altered some description text --- application/config/config.php | 6 +++--- system/libraries/Session.php | 12 +++++------- user_guide_src/source/changelog.rst | 3 ++- user_guide_src/source/installation/upgrade_300.rst | 11 ++--------- 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/application/config/config.php b/application/config/config.php index 31ff2024d54..7da889f81cc 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -362,9 +362,9 @@ | Master Time Reference |-------------------------------------------------------------------------- | -| Options are 'local' or any PHP supported timezone. This pref tells the -| system whether to use your server's local time as the master 'now' -| reference, or convert it to any PHP supported timezone. See the 'date +| Options are 'local' or any PHP supported timezone. This preference tells +| the system whether to use your server's local time as the master 'now' +| reference, or convert it to the configured one timezone. See the 'date | helper' page of the user guide for information regarding date handling. | */ diff --git a/system/libraries/Session.php b/system/libraries/Session.php index 9fdf744c383..72a942b8af6 100644 --- a/system/libraries/Session.php +++ b/system/libraries/Session.php @@ -149,11 +149,11 @@ class CI_Session { public $flashdata_key = 'flash'; /** - * Function to use to get the current time + * Timezone to use for the current time * * @var string */ - public $time_reference = 'time'; + public $time_reference = 'local'; /** * Probablity level of garbage collection of old sessions @@ -203,7 +203,7 @@ public function __construct($params = array()) // manually via the $params array above or via the config file foreach (array('sess_encrypt_cookie', 'sess_use_database', 'sess_table_name', 'sess_expiration', 'sess_expire_on_close', 'sess_match_ip', 'sess_match_useragent', 'sess_cookie_name', 'cookie_path', 'cookie_domain', 'cookie_secure', 'cookie_httponly', 'sess_time_to_update', 'time_reference', 'cookie_prefix', 'encryption_key') as $key) { - $this->$key = (isset($params[$key])) ? $params[$key] : $this->CI->config->item($key); + $this->$key = isset($params[$key]) ? $params[$key] : $this->CI->config->item($key); } if ($this->encryption_key === '') @@ -786,14 +786,12 @@ protected function _flashdata_sweep() */ protected function _get_time() { - $timezone = config_item('time_reference'); - - if ($timezone === 'local' OR $timezone === date_default_timezone_get()) + if ($this->time_reference === 'local' OR $this->time_reference === date_default_timezone_get()) { return time(); } - $datetime = new DateTime('now', new DateTimeZone($timezone)); + $datetime = new DateTime('now', new DateTimeZone($this->time_reference)); sscanf($datetime->format('j-n-Y G:i:s'), '%d-%d-%d %d:%d:%d', $day, $month, $year, $hour, $minute, $second); return mktime($hour, $minute, $second, $month, $day, $year); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1f5bcb6484f..06bfba887fe 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -48,7 +48,7 @@ Release Date: Not Released - Helpers - - Date helper will now return now() based on the timezone you specify. + - :doc:`Date Helper ` function now() now works with all timezone strings supported by PHP. - ``create_captcha()`` accepts additional colors parameter, allowing for color customization. - ``url_title()`` will now trim extra dashes from beginning and end. - Added XHTML Basic 1.1 doctype to :doc:`HTML Helper `. @@ -173,6 +173,7 @@ Release Date: Not Released - Added get_content_type() method to the :doc:`Output Library `. - Added get_mimes() function to system/core/Commons.php to return the config/mimes.php array. - Added a second argument to set_content_type() in the :doc:`Output Library ` that allows setting the document charset as well. + - $config['time_reference'] now supports all timezone strings supported by PHP. Bug fixes for 3.0 ------------------ diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index d8a3d5bc1ae..c70737cff27 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -42,14 +42,7 @@ need to rename the `$active_record` variable to `$query_builder`. // $active_record = TRUE; $query_builder = TRUE; -Step 5: Change your use of the Date helper's now() function -=========================================================== - -Function now() has been modified. You can see the changes in :doc:`Date Helper <../helpers/date_helper>`. -You can now select all PHP supported timezones in the `time_reference` setting, listed here: -`Supported timezones `_. You can also use 'local' if you want to get time(). - -Step 6: Move your errors folder +Step 5: Move your errors folder =============================== -In version 3.0.0, the errors folder has been moved from "application/errors" to "application/views/errors". \ No newline at end of file +In version 3.0.0, the errors folder has been moved from _application/errors_ to _application/views/errors_. \ No newline at end of file From a8262ba2fe0e11302b8d81e1afba71d4f96cd6d7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 03:16:44 +0300 Subject: [PATCH 1267/5397] Fix an issue from d461934184d95b0cfb2feec93f27b621ef72a5c2 --- system/core/URI.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/core/URI.php b/system/core/URI.php index 2e661ed4cb6..ef1a1265078 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -189,11 +189,11 @@ protected function _detect_uri() return ''; } - if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) + if (strpos($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']) === 0) { - $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); + $uri = substr($_SERVER['REQUEST_URI'], strlen($_SERVER['SCRIPT_NAME'])); } - elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) + elseif (strpos($_SERVER['REQUEST_URI'], dirname($_SERVER['SCRIPT_NAME'])) === 0) { $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); } From fb859791182edd2f46479cd69ea4615daebed655 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 03:32:19 +0300 Subject: [PATCH 1268/5397] And yet another missed line from the last one --- system/core/URI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/URI.php b/system/core/URI.php index ef1a1265078..a997525eea5 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -195,7 +195,7 @@ protected function _detect_uri() } elseif (strpos($_SERVER['REQUEST_URI'], dirname($_SERVER['SCRIPT_NAME'])) === 0) { - $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); + $uri = substr($_SERVER['REQUEST_URI'], strlen(dirname($_SERVER['SCRIPT_NAME']))); } else { From 43cfd0c37ca241618f33eae87fec720a5bcf13d6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 11:18:26 +0300 Subject: [PATCH 1269/5397] Comment out _set_uri_string() test as it is no longer callable from outside the class --- tests/codeigniter/core/URI_test.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/codeigniter/core/URI_test.php b/tests/codeigniter/core/URI_test.php index 0ba694b46e5..60ed1a4e936 100644 --- a/tests/codeigniter/core/URI_test.php +++ b/tests/codeigniter/core/URI_test.php @@ -9,6 +9,10 @@ public function set_up() // -------------------------------------------------------------------- + /* As of the following commit, _set_uri_string() is a protected method: + + https://github.com/EllisLab/CodeIgniter/commit/d461934184d95b0cfb2feec93f27b621ef72a5c2 + public function test_set_uri_string() { // Slashes get killed @@ -18,6 +22,7 @@ public function test_set_uri_string() $this->uri->_set_uri_string('nice/uri'); $this->assertEquals('nice/uri', $this->uri->uri_string); } + */ // -------------------------------------------------------------------- From e1c8ee76f4756442094106320d9577c2c7595959 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 11:35:11 +0300 Subject: [PATCH 1270/5397] Alter now() tests --- tests/codeigniter/helpers/date_helper_test.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/codeigniter/helpers/date_helper_test.php b/tests/codeigniter/helpers/date_helper_test.php index 4b747b86488..bcb1477bcac 100644 --- a/tests/codeigniter/helpers/date_helper_test.php +++ b/tests/codeigniter/helpers/date_helper_test.php @@ -13,6 +13,8 @@ public function set_up() public function test_now_local() { + /* + // This stub job, is simply to cater $config['time_reference'] $config = $this->getMock('CI_Config'); $config->expects($this->any()) @@ -22,6 +24,10 @@ public function test_now_local() // Add the stub to our test instance $this->ci_instance_var('config', $config); + */ + + $this->ci_set_config('time_reference', 'local'); + $this->assertEquals(time(), now()); } @@ -29,6 +35,8 @@ public function test_now_local() public function test_now_gmt() { + /* + // This stub job, is simply to cater $config['time_reference'] $config = $this->getMock('CI_Config'); $config->expects($this->any()) @@ -38,6 +46,10 @@ public function test_now_gmt() // Add the stub to our stdClass $this->ci_instance_var('config', $config); + */ + + $this->ci_set_config('time_reference', 'gmt'); + $t = time(); $this->assertEquals( mktime(gmdate('H', $t), gmdate('i', $t), gmdate('s', $t), gmdate('m', $t), gmdate('d', $t), gmdate('Y', $t)), From 0ddff314d619e5d24bdf07f3da33c779f5b6e2c0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 13:18:07 +0300 Subject: [PATCH 1271/5397] test_now_gmt() -> test_now_utc() --- tests/codeigniter/helpers/date_helper_test.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/codeigniter/helpers/date_helper_test.php b/tests/codeigniter/helpers/date_helper_test.php index bcb1477bcac..24293511632 100644 --- a/tests/codeigniter/helpers/date_helper_test.php +++ b/tests/codeigniter/helpers/date_helper_test.php @@ -33,7 +33,7 @@ public function test_now_local() // ------------------------------------------------------------------------ - public function test_now_gmt() + public function test_now_utc() { /* @@ -41,18 +41,17 @@ public function test_now_gmt() $config = $this->getMock('CI_Config'); $config->expects($this->any()) ->method('item') - ->will($this->returnValue('gmt')); + ->will($this->returnValue('UTC')); // Add the stub to our stdClass $this->ci_instance_var('config', $config); */ - $this->ci_set_config('time_reference', 'gmt'); + $this->ci_set_config('time_reference', 'UTC'); - $t = time(); $this->assertEquals( - mktime(gmdate('H', $t), gmdate('i', $t), gmdate('s', $t), gmdate('m', $t), gmdate('d', $t), gmdate('Y', $t)), + gmmktime(date('H'), date('i'), date('s'), date('m'), date('d'), date('Y')), now() ); } From 3ed533109309326a858c778dfea5cb9186f965b4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 13:21:07 +0300 Subject: [PATCH 1272/5397] Some optimizations to the date helper tests --- tests/codeigniter/helpers/date_helper_test.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/codeigniter/helpers/date_helper_test.php b/tests/codeigniter/helpers/date_helper_test.php index 24293511632..1d397ac8153 100644 --- a/tests/codeigniter/helpers/date_helper_test.php +++ b/tests/codeigniter/helpers/date_helper_test.php @@ -51,7 +51,7 @@ public function test_now_utc() $this->ci_set_config('time_reference', 'UTC'); $this->assertEquals( - gmmktime(date('H'), date('i'), date('s'), date('m'), date('d'), date('Y')), + gmmktime(date('G'), date('i'), date('s'), date('n'), date('j'), date('Y')), now() ); } @@ -196,9 +196,9 @@ public function test_days_in_month() public function test_local_to_gmt() { $this->assertEquals( - mktime( - gmdate('H', $this->time), gmdate('i', $this->time), gmdate('s', $this->time), - gmdate('m', $this->time), gmdate('d', $this->time), gmdate('Y', $this->time) + gmmktime( + date('G', $this->time), date('i', $this->time), date('s', $this->time), + date('n', $this->time), date('j', $this->time), date('Y', $this->time) ), local_to_gmt($this->time) ); From 3bbbd26ecb60966b07c597310ae241c432bce198 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 13:35:32 +0300 Subject: [PATCH 1273/5397] Some optimizations to the date helper --- system/helpers/date_helper.php | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index a5c46e47b0a..d5036f64559 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -314,13 +314,13 @@ function local_to_gmt($time = '') $time = time(); } - return mktime( - gmdate('H', $time), - gmdate('i', $time), - gmdate('s', $time), - gmdate('m', $time), - gmdate('d', $time), - gmdate('Y', $time) + return gmmktime( + date('H', $time), + date('i', $time), + date('s', $time), + date('m', $time), + date('d', $time), + date('Y', $time) ); } } @@ -375,9 +375,7 @@ function mysql_to_unix($time = '') // 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); + $time = str_replace(array('-', ':', ' '), '', $time); // YYYYMMDDHHMMSS return mktime( From 19c83f6ec6dd29b2ecbeba87801d275f4e247678 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 14:33:33 +0300 Subject: [PATCH 1274/5397] Add changelog entry for issue #1387 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 06bfba887fe..7748f9b37cb 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -269,6 +269,7 @@ Bug fixes for 3.0 - Fixed a bug (#145) - compile_binds() failed when the bind marker was present in a literal string within the query. - Fixed a bug in protect_identifiers() where if passed along with the field names, operators got escaped as well. - Fixed a bug (#10) - :doc:`URI Library ` internal method _detect_uri() failed with paths containing a colon. +- Fixed a bug (#1387) - :doc:`Query Builder `'s from() method didn't escape table aliases. Version 2.1.1 ============= From 3dad2e714189b992248261c78d780b322b3c73da Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 15:10:56 +0300 Subject: [PATCH 1275/5397] Replace strncmp() usage with strpos() --- system/libraries/Email.php | 14 +++++++------- system/libraries/Javascript.php | 2 +- system/libraries/Xmlrpc.php | 2 +- system/libraries/Xmlrpcs.php | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 09f2175305d..dd5477e05ba 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -247,7 +247,7 @@ public function reply_to($replyto, $name = '') $name = $replyto; } - if (strncmp($name, '"', 1) !== 0) + if (strpos($name, '"') !== 0) { $name = '"'.$name.'"'; } @@ -606,7 +606,7 @@ protected function _get_encoding($return = TRUE) foreach ($this->_base_charsets as $charset) { - if (strncmp($charset, $this->charset, strlen($charset)) === 0) + if (strpos($charset, $this->charset) === 0) { $this->_encoding = '7bit'; } @@ -651,7 +651,7 @@ protected function _get_content_type() protected function _set_date() { $timezone = date('Z'); - $operator = (strncmp($timezone, '-', 1) === 0) ? '-' : '+'; + $operator = ($timezone[0] === '-') ? '-' : '+'; $timezone = abs($timezone); $timezone = floor($timezone/3600) * 100 + ($timezone % 3600) / 60; @@ -1481,7 +1481,7 @@ protected function _send_with_smtp() $this->_set_error_message($reply); - if (strncmp($reply, '250', 3) !== 0) + if (strpos($reply, '250') !== 0) { $this->_set_error_message('lang:email_smtp_error', $reply); return FALSE; @@ -1637,7 +1637,7 @@ protected function _smtp_authenticate() $reply = $this->_get_smtp_data(); - if (strncmp($reply, '334', 3) !== 0) + if (strpos($reply, '334') !== 0) { $this->_set_error_message('lang:email_failed_smtp_login', $reply); return FALSE; @@ -1647,7 +1647,7 @@ protected function _smtp_authenticate() $reply = $this->_get_smtp_data(); - if (strncmp($reply, '334', 3) !== 0) + if (strpos($reply, '334') !== 0) { $this->_set_error_message('lang:email_smtp_auth_un', $reply); return FALSE; @@ -1657,7 +1657,7 @@ protected function _smtp_authenticate() $reply = $this->_get_smtp_data(); - if (strncmp($reply, '235', 3) !== 0) + if (strpos($reply, '235') !== 0) { $this->_set_error_message('lang:email_smtp_auth_pw', $reply); return FALSE; diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php index 98fec61d33f..5c8b09217c4 100644 --- a/system/libraries/Javascript.php +++ b/system/libraries/Javascript.php @@ -620,7 +620,7 @@ public function external($external_file = '', $relative = FALSE) $this->_javascript_location = $this->CI->config->item('javascript_location'); } - if ($relative === TRUE OR strncmp($external_file, 'http://', 7) === 0 OR strncmp($external_file, 'https://', 8) === 0) + if ($relative === TRUE OR strpos($external_file, 'http://') === 0 OR strpos($external_file, 'https://') === 0) { $str = $this->_open_script($external_file); } diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index 6f354233339..eac4ac118f8 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -778,7 +778,7 @@ public function parseResponse($fp) } // Check for HTTP 200 Response - if (strncmp($data, 'HTTP', 4) === 0 && ! preg_match('/^HTTP\/[0-9\.]+ 200 /', $data)) + if (strpos($data, 'HTTP') === 0 && ! preg_match('/^HTTP\/[0-9\.]+ 200 /', $data)) { $errstr = substr($data, 0, strpos($data, "\n")-1); return new XML_RPC_Response(0, $this->xmlrpcerr['http_error'], $this->xmlrpcstr['http_error'].' ('.$errstr.')'); diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php index be930b0f94f..e81f2ca9a93 100644 --- a/system/libraries/Xmlrpcs.php +++ b/system/libraries/Xmlrpcs.php @@ -303,7 +303,7 @@ protected function _execute($m) $methName = $m->method_name; // Check to see if it is a system call - $system_call = (strncmp($methName, 'system', 5) === 0); + $system_call = (strpos($methName, 'system') === 0); if ($this->xss_clean === FALSE) { From eef240622a9966fb2c97975e3c651c40fd8590a4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 16:17:48 +0300 Subject: [PATCH 1276/5397] Some date helper improvements --- system/helpers/date_helper.php | 103 ++++++++++++++------------------- 1 file changed, 43 insertions(+), 60 deletions(-) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index d5036f64559..ae0b7a2b7a1 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -93,8 +93,10 @@ function mdate($datestr = '', $time = '') { return ''; } - - $time = ($time === '') ? now() : $time; + elseif (empty($time)) + { + $time = now(); + } $datestr = str_replace( '%\\', @@ -122,24 +124,19 @@ function mdate($datestr = '', $time = '') function standard_date($fmt = 'DATE_RFC822', $time = '') { $formats = array( - 'DATE_ATOM' => '%Y-%m-%dT%H:%i:%s%O', - 'DATE_COOKIE' => '%l, %d-%M-%y %H:%i:%s UTC', - 'DATE_ISO8601' => '%Y-%m-%dT%H:%i:%s%O', - '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_RFC2822' => '%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%O' - ); - - if ( ! isset($formats[$fmt])) - { - return FALSE; - } - - return mdate($formats[$fmt], $time); + 'DATE_ATOM' => '%Y-%m-%dT%H:%i:%s%O', + 'DATE_COOKIE' => '%l, %d-%M-%y %H:%i:%s UTC', + 'DATE_ISO8601' => '%Y-%m-%dT%H:%i:%s%O', + '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_RFC2822' => '%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%O' + ); + + return isset($formats[$fmt]) ? mdate($formats[$fmt], $time) : FALSE; } } @@ -163,20 +160,9 @@ function timespan($seconds = 1, $time = '', $units = 7) $CI =& get_instance(); $CI->lang->load('date'); - if ( ! is_numeric($seconds)) - { - $seconds = 1; - } - - if ( ! is_numeric($time)) - { - $time = time(); - } - - if ( ! is_numeric($units)) - { - $units = 7; - } + is_numeric($seconds) OR $seconds = 1; + is_numeric($time) OR $time = time(); + is_numeric($units) OR $units = 7; $seconds = ($time <= $seconds) ? 1 : $time - $seconds; @@ -185,7 +171,7 @@ function timespan($seconds = 1, $time = '', $units = 7) if ($years > 0) { - $str[] = $years.' '.$CI->lang->line((($years > 1) ? 'date_years' : 'date_year')); + $str[] = $years.' '.$CI->lang->line($years > 1 ? 'date_years' : 'date_year'); } $seconds -= $years * 31557600; @@ -195,7 +181,7 @@ function timespan($seconds = 1, $time = '', $units = 7) { if ($months > 0) { - $str[] = $months.' '.$CI->lang->line((($months > 1) ? 'date_months' : 'date_month')); + $str[] = $months.' '.$CI->lang->line($months > 1 ? 'date_months' : 'date_month'); } $seconds -= $months * 2629743; @@ -207,7 +193,7 @@ function timespan($seconds = 1, $time = '', $units = 7) { if ($weeks > 0) { - $str[] = $weeks.' '.$CI->lang->line((($weeks > 1) ? 'date_weeks' : 'date_week')); + $str[] = $weeks.' '.$CI->lang->line($weeks > 1 ? 'date_weeks' : 'date_week'); } $seconds -= $weeks * 604800; @@ -219,7 +205,7 @@ function timespan($seconds = 1, $time = '', $units = 7) { if ($days > 0) { - $str[] = $days.' '.$CI->lang->line((($days > 1) ? 'date_days' : 'date_day')); + $str[] = $days.' '.$CI->lang->line($days > 1 ? 'date_days' : 'date_day'); } $seconds -= $days * 86400; @@ -231,7 +217,7 @@ function timespan($seconds = 1, $time = '', $units = 7) { if ($hours > 0) { - $str[] = $hours.' '.$CI->lang->line((($hours > 1) ? 'date_hours' : 'date_hour')); + $str[] = $hours.' '.$CI->lang->line($hours > 1 ? 'date_hours' : 'date_hour'); } $seconds -= $hours * 3600; @@ -243,7 +229,7 @@ function timespan($seconds = 1, $time = '', $units = 7) { if ($minutes > 0) { - $str[] = $minutes.' '.$CI->lang->line((($minutes > 1) ? 'date_minutes' : 'date_minute')); + $str[] = $minutes.' '.$CI->lang->line($minutes > 1 ? 'date_minutes' : 'date_minute'); } $seconds -= $minutes * 60; @@ -251,7 +237,7 @@ function timespan($seconds = 1, $time = '', $units = 7) if (count($str) === 0) { - $str[] = $seconds.' '.$CI->lang->line((($seconds > 1) ? 'date_seconds' : 'date_second')); + $str[] = $seconds.' '.$CI->lang->line($seconds > 1 ? 'date_seconds' : 'date_second'); } return implode(', ', $str); @@ -278,12 +264,16 @@ function days_in_month($month = 0, $year = '') { return 0; } - - if ( ! is_numeric($year) OR strlen($year) !== 4) + elseif ( ! is_numeric($year) OR strlen($year) !== 4) { $year = date('Y'); } + if ($year >= 1970) + { + return (int) date('t', mktime(12, 0, 0, $month, 1, $year)); + } + if ($month == 2) { if ($year % 400 === 0 OR ($year % 4 === 0 && $year % 100 !== 0)) @@ -315,11 +305,11 @@ function local_to_gmt($time = '') } return gmmktime( - date('H', $time), + date('G', $time), date('i', $time), date('s', $time), - date('m', $time), - date('d', $time), + date('n', $time), + date('j', $time), date('Y', $time) ); } @@ -350,12 +340,7 @@ function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE) $time += timezones($timezone) * 3600; - if ($dst === TRUE) - { - $time += 3600; - } - - return $time; + return ($dst === TRUE) ? $time + 3600 : $time; } } @@ -405,7 +390,7 @@ function mysql_to_unix($time = '') */ function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') { - $r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' '; + $r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' '; if ($fmt === 'us') { @@ -423,7 +408,7 @@ function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') if ($fmt === 'us') { - $r .= ' '.date('A', $time); + return $r.' '.date('A', $time); } return $r; @@ -542,15 +527,15 @@ function nice_date($bad_date = '', $format = FALSE) // Date Like: YYYYMMDD if (preg_match('/^\d{8}$/', $bad_date)) { - $month = substr($bad_date, 0, 2); - $day = substr($bad_date, 2, 2); - $year = substr($bad_date, 4, 4); + $month = substr($bad_date, 0, 2); + $day = substr($bad_date, 2, 2); + $year = substr($bad_date, 4, 4); return date($format, strtotime($month.'/01/'.$year)); } // Date Like: MM-DD-YYYY __or__ M-D-YYYY (or anything in between) - if (preg_match('/^\d{1,2}-\d{1,2}-\d{4}$/', $bad_date)) + if (preg_match('/^\d{1,2}-\d{1,2}-\d{4}$/', $bad_date, $matches)) { list($m, $d, $y) = explode('-', $bad_date); return date($format, strtotime($y.'-'.$m.'-'.$d)); @@ -675,8 +660,6 @@ function timezones($tz = '') return $zones; } - $tz = ($tz === 'GMT') ? 'UTC' : $tz; - return isset($zones[$tz]) ? $zones[$tz] : 0; } } From f11a1939c25de1e327c7c02001c8fbd1ec1fc7b4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 14 Jun 2012 16:35:09 +0300 Subject: [PATCH 1277/5397] Improve date helper functions human_to_unix() and nice_date() --- system/helpers/date_helper.php | 51 ++++++++++------------------------ 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index ae0b7a2b7a1..077a6712c9c 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -436,51 +436,33 @@ function human_to_unix($datestr = '') $datestr = preg_replace('/\040+/', ' ', trim($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)) + if ( ! preg_match('/^(\d{2}|\d{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]; + list($year, $month, $day) = explode('-', $split[0]); $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'; - } + $hour = (int) $ex[0]; + $min = (int) $ex[1]; + $sec = ( ! empty($ex[2]) && preg_match('/[0-9]{1,2}/', $ex[2])) + ? (int) $ex[2] : 0; if (isset($split[2])) { $ampm = strtolower($split[2]); - if (substr($ampm, 0, 1) === 'p' && $hour < 12) + if ($ampm[0] === 'p' && $hour < 12) { $hour += 12; } - - if (substr($ampm, 0, 1) === 'a' && $hour == 12) - { - $hour = '00'; - } - - if (strlen($hour) === 1) + elseif ($ampm[0] === 'a' && $hour === 12) { - $hour = '0'.$hour; + $hour = 0; } } @@ -508,7 +490,7 @@ function nice_date($bad_date = '', $format = FALSE) } // Date like: YYYYMM - if (preg_match('/^\d{6}$/', $bad_date)) + if (preg_match('/^\d{6}$/i', $bad_date)) { if (in_array(substr($bad_date, 0, 2), array('19', '20'))) { @@ -525,20 +507,15 @@ function nice_date($bad_date = '', $format = FALSE) } // Date Like: YYYYMMDD - if (preg_match('/^\d{8}$/', $bad_date)) + if (preg_match('/^(\d{2})\d{2}(\d{4})$/i', $bad_date, $matches)) { - $month = substr($bad_date, 0, 2); - $day = substr($bad_date, 2, 2); - $year = substr($bad_date, 4, 4); - - return date($format, strtotime($month.'/01/'.$year)); + return date($format, strtotime($matches[1].'/01/'.$matches[2])); } // Date Like: MM-DD-YYYY __or__ M-D-YYYY (or anything in between) - if (preg_match('/^\d{1,2}-\d{1,2}-\d{4}$/', $bad_date, $matches)) + if (preg_match('/^(\d{1,2})-(\d{1,2})-(\d{4})$/i', $bad_date, $matches)) { - list($m, $d, $y) = explode('-', $bad_date); - return date($format, strtotime($y.'-'.$m.'-'.$d)); + return date($format, strtotime($matches[3].'-'.$matches[1].'-'.$matches[2])); } // Any other kind of string, when converted into UNIX time, From ee112692c0e893dbe1d03b7ee62da6860db7310c Mon Sep 17 00:00:00 2001 From: Sean Fisher Date: Thu, 14 Jun 2012 15:32:17 -0300 Subject: [PATCH 1278/5397] A TTL of 0 will keep the cache persistant. --- system/libraries/Cache/drivers/Cache_file.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index 08231963ef0..028875b7d10 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -73,7 +73,7 @@ public function get($id) $data = unserialize(file_get_contents($this->_cache_path.$id)); - if (time() > $data['time'] + $data['ttl']) + if ($data['ttl'] > 0 AND time() > $data['time'] + $data['ttl']) { unlink($this->_cache_path.$id); return FALSE; From eccde13b8ae8be69645cf1abedcdbdc3c278b615 Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Thu, 14 Jun 2012 23:22:26 +0200 Subject: [PATCH 1279/5397] exact length passed as string needs to be casted to int --- system/libraries/Form_validation.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 6cbe032c756..069751b4539 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1035,7 +1035,7 @@ public function max_length($str, $val) * Exact Length * * @param string - * @param int + * @param string * @return bool */ public function exact_length($str, $val) @@ -1045,6 +1045,8 @@ public function exact_length($str, $val) return FALSE; } + $val = (int) $val; + return (MB_ENABLED === TRUE) ? (mb_strlen($str) === $val) : (strlen($str) === $val); From a8221ade975111eb55da06b553789ad541bf2bff Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Thu, 14 Jun 2012 23:26:34 +0200 Subject: [PATCH 1280/5397] fix --- system/libraries/Form_validation.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 069751b4539..37eb7a9cd6f 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -993,7 +993,7 @@ public function is_unique($str, $field) * Minimum Length * * @param string - * @param int + * @param string * @return bool */ public function min_length($str, $val) @@ -1014,7 +1014,7 @@ public function min_length($str, $val) * Max Length * * @param string - * @param int + * @param string * @return bool */ public function max_length($str, $val) @@ -1045,11 +1045,9 @@ public function exact_length($str, $val) return FALSE; } - $val = (int) $val; - return (MB_ENABLED === TRUE) - ? (mb_strlen($str) === $val) - : (strlen($str) === $val); + ? (mb_strlen($str) === intval($val)) + : (strlen($str) === intval($val)); } // -------------------------------------------------------------------- From 64cfef0fb8cf6254cb08a0c2e3aef04cd5721942 Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Thu, 14 Jun 2012 23:30:44 +0200 Subject: [PATCH 1281/5397] fixed other functions --- system/libraries/Form_validation.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 37eb7a9cd6f..621316c4ac2 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1004,8 +1004,8 @@ public function min_length($str, $val) } return (MB_ENABLED === TRUE) - ? ($val <= mb_strlen($str)) - : ($val <= strlen($str)); + ? (intval($val) <= mb_strlen($str)) + : (intval($val) <= strlen($str)); } // -------------------------------------------------------------------- @@ -1025,8 +1025,8 @@ public function max_length($str, $val) } return (MB_ENABLED === TRUE) - ? ($val >= mb_strlen($str)) - : ($val >= strlen($str)); + ? (intval($val) >= mb_strlen($str)) + : (intval($val) >= strlen($str)); } // -------------------------------------------------------------------- From f68db392ea3861de9d80c41e3cd5b857468c53f9 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Thu, 14 Jun 2012 17:14:11 -0500 Subject: [PATCH 1282/5397] Somebody double `$$`ed, causing error Severity: 4096 Message: Object of class CI_DB_mysql_forge could not be converted to string Filename: database/DB_forge.php Line Number: 234 --- system/database/DB_forge.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index 9b7639289c0..91f9d560c0a 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -231,7 +231,7 @@ public function create_table($table = '', $if_not_exists = FALSE) if (($result = $this->db->query($sql)) !== FALSE && ! empty($this->db->data_cache['table_names'])) { - $this->db->data_cache['table_names'][] = $$this->db->dbprefix.$table; + $this->db->data_cache['table_names'][] = $this->db->dbprefix.$table; } return $result; From e389b0eb2f107ee16e5f6ca47833809dffdfc02f Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Thu, 14 Jun 2012 17:37:18 -0500 Subject: [PATCH 1283/5397] Fixed ANOTHER DB_Forge bug in the mysql driver. I'm watching you @narfbg. --- system/database/drivers/mysql/mysql_forge.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php index d22454d8488..2ac75bad2db 100644 --- a/system/database/drivers/mysql/mysql_forge.php +++ b/system/database/drivers/mysql/mysql_forge.php @@ -62,7 +62,7 @@ protected function _process_fields($fields) $sql .= "\n\t".$this->db->escape_identifiers($field); - empty($attributes['NAME']) OR ' '.$this->db->escape_identifiers($attributes['NAME']).' '; + empty($attributes['NAME']) OR $sql .= ' '.$this->db->escape_identifiers($attributes['NAME']).' '; if ( ! empty($attributes['TYPE'])) { From 8295c845a447b973ef27aec6ed41d4325af06a76 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Jun 2012 03:42:25 +0300 Subject: [PATCH 1284/5397] Fix issue #1482 --- system/database/DB_query_builder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 488b294e4c2..f3e75cbeb84 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -381,7 +381,7 @@ public function join($table, $cond, $type = '', $escape = TRUE) } // Assemble the JOIN statement - $this->qb_join[] = $join = $type.'JOIN '.$this->protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond; + $this->qb_join[] = $join = $type.'JOIN '.$table.' ON '.$cond; if ($this->qb_caching === TRUE) { From e10fb79a95e2b0594ae68560df8963f92fea86d7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Jun 2012 12:07:04 +0300 Subject: [PATCH 1285/5397] Fix issue #1483 --- system/database/DB_query_builder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index f3e75cbeb84..4c70ccc7805 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -451,7 +451,7 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) } // If the escape value was not set will will base it on the global setting - $escape = $this->_protect_identifiers; + is_bool($escape) OR $escape = $this->_protect_identifiers; foreach ($key as $k => $v) { From 974c75bc030b4eb0521b66bf85e81a5ab61d14a6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Jun 2012 12:30:02 +0300 Subject: [PATCH 1286/5397] Fix having() --- system/database/DB_query_builder.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 4c70ccc7805..486fda9633e 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -932,10 +932,9 @@ protected function _having($key, $value = '', $type = 'AND ', $escape = TRUE) { $prefix = (count($this->qb_having) === 0) ? '' : $type; - if ($escape === TRUE) - { - $k = $this->protect_identifiers($k); - } + $k = $this->_has_operator($k) + ? $this->protect_identifiers(substr($k, 0, strpos(rtrim($k), ' ')), FALSE, $escape).strchr(rtrim($k), ' ') + : $this->protect_identifiers($k, FALSE, $escape); if ( ! $this->_has_operator($k)) { From ceaf887a7a849eab95b1bed1a837e2e3a1720c99 Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Fri, 15 Jun 2012 11:56:24 +0200 Subject: [PATCH 1287/5397] some optimizations --- system/libraries/Form_validation.php | 30 +++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 621316c4ac2..6d4446d0c1e 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -998,14 +998,18 @@ public function is_unique($str, $field) */ public function min_length($str, $val) { - if (preg_match('/[^0-9]/', $val)) + if ( ! is_numeric($val)) { return FALSE; } + else + { + $val = (int) $val; + } return (MB_ENABLED === TRUE) - ? (intval($val) <= mb_strlen($str)) - : (intval($val) <= strlen($str)); + ? ($val <= mb_strlen($str)) + : ($val <= strlen($str)); } // -------------------------------------------------------------------- @@ -1019,14 +1023,18 @@ public function min_length($str, $val) */ public function max_length($str, $val) { - if (preg_match('/[^0-9]/', $val)) + if ( ! is_numeric($val)) { return FALSE; } + else + { + $val = (int) $val; + } return (MB_ENABLED === TRUE) - ? (intval($val) >= mb_strlen($str)) - : (intval($val) >= strlen($str)); + ? ($val >= mb_strlen($str)) + : ($val >= strlen($str)); } // -------------------------------------------------------------------- @@ -1040,14 +1048,18 @@ public function max_length($str, $val) */ public function exact_length($str, $val) { - if (preg_match('/[^0-9]/', $val)) + if ( ! is_numeric($val)) { return FALSE; } + else + { + $val = (int) $val; + } return (MB_ENABLED === TRUE) - ? (mb_strlen($str) === intval($val)) - : (strlen($str) === intval($val)); + ? (mb_strlen($str) === $val) + : (strlen($str) === $val); } // -------------------------------------------------------------------- From 1922a885b40ef63cf0a5141eb8377d04e3bee172 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Jun 2012 15:16:51 +0300 Subject: [PATCH 1288/5397] Update simple_query() documentation (issue #1484) --- user_guide_src/source/database/queries.rst | 30 ++++++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/user_guide_src/source/database/queries.rst b/user_guide_src/source/database/queries.rst index d23efecb366..11dd78392d0 100644 --- a/user_guide_src/source/database/queries.rst +++ b/user_guide_src/source/database/queries.rst @@ -21,11 +21,31 @@ this:: $this->db->simple_query(); =========================== -This is a simplified version of the $this->db->query() function. It ONLY -returns TRUE/FALSE on success or failure. It DOES NOT return a database -result set, nor does it set the query timer, or compile bind data, or -store your query for debugging. It simply lets you submit a query. Most -users will rarely use this function. +This is a simplified version of the $this->db->query() method. It DOES +NOT return a database result set, nor does it set the query timer, or +compile bind data, or store your query for debugging. It simply lets you +submit a query. Most users will rarely use this function. + +It returns whatever the database drivers' "execute" function returns. +That typically is TRUE/FALSE on success or failure for write type queries +such as INSERT, DELETE or UPDATE statements (which is what it really +should be used for) and a resource/object on success for queries with +fetchable results. + +:: + + if ($this->db->simple_query('YOUR QUERY')) + { + echo "Success!"; + } + else + { + echo "Query failed!"; + } + +.. note:: PostgreSQL's pg_exec() function always returns a resource on + success, even for write type queries. So take that in mind if + you're looking for a boolean value. *************************************** Working with Database prefixes manually From e446ad337945b7839b73f13531b21ed16ece241e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Jun 2012 15:23:41 +0300 Subject: [PATCH 1289/5397] Optimize encode_php_tags() --- system/helpers/security_helper.php | 2 +- system/libraries/Form_validation.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/helpers/security_helper.php b/system/helpers/security_helper.php index 3e6e914353f..7fcb18437bc 100644 --- a/system/helpers/security_helper.php +++ b/system/helpers/security_helper.php @@ -123,7 +123,7 @@ function strip_image_tags($str) */ function encode_php_tags($str) { - return str_replace(array(''), array('<?php', '<?PHP', '<?', '?>'), $str); + return str_replace(array(''), array('<?', '?>'), $str); } } diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 6d4446d0c1e..fb1c69caf07 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1382,7 +1382,7 @@ public function xss_clean($str) */ public function encode_php_tags($str) { - return str_replace(array(''), array('<?php', '<?PHP', '<?', '?>'), $str); + return str_replace(array(''), array('<?', '?>'), $str); } // -------------------------------------------------------------------- From d9b44bef948928739b2b96b43d78b7629c0ccc15 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Jun 2012 16:07:08 +0300 Subject: [PATCH 1290/5397] Fix issue #520 --- system/helpers/date_helper.php | 4 ++++ user_guide_src/source/changelog.rst | 1 + 2 files changed, 5 insertions(+) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 077a6712c9c..065a223effe 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -488,6 +488,10 @@ function nice_date($bad_date = '', $format = FALSE) { return 'Unknown'; } + elseif (empty($format)) + { + $format = 'U'; + } // Date like: YYYYMM if (preg_match('/^\d{6}$/i', $bad_date)) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 7748f9b37cb..ec33414c2bb 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -270,6 +270,7 @@ Bug fixes for 3.0 - Fixed a bug in protect_identifiers() where if passed along with the field names, operators got escaped as well. - Fixed a bug (#10) - :doc:`URI Library ` internal method _detect_uri() failed with paths containing a colon. - Fixed a bug (#1387) - :doc:`Query Builder `'s from() method didn't escape table aliases. +- Fixed a bug (#520) - :doc:`Date Helper ` function nice_date() failed when the optional second parameter is not passed. Version 2.1.1 ============= From c275b23b06195e4ea6424d96a0c76b825c71443a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Jun 2012 16:13:17 +0300 Subject: [PATCH 1291/5397] Fix nice_date() documentation --- user_guide_src/source/helpers/date_helper.rst | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/user_guide_src/source/helpers/date_helper.rst b/user_guide_src/source/helpers/date_helper.rst index 1b7177fc260..b6dc2e934df 100644 --- a/user_guide_src/source/helpers/date_helper.rst +++ b/user_guide_src/source/helpers/date_helper.rst @@ -247,16 +247,18 @@ Example :: - $bad_time = 199605 // Should Produce: 1996-05-01 - $better_time = nice_date($bad_time,'Y-m-d'); - $bad_time = 9-11-2001 // Should Produce: 2001-09-11 - $better_time = nice_date($human,'Y-m-d'); + $bad_date = '199605'; + // Should Produce: 1996-05-01 + $better_date = nice_date($bad_date, 'Y-m-d'); + + $bad_date = '9-11-2001'; + // Should Produce: 2001-09-11 + $better_date = nice_date($bad_date, 'Y-m-d'); timespan() ========== Formats a unix timestamp so that is appears similar to this - :: 1 Year, 10 Months, 2 Weeks, 5 Days, 10 Hours, 16 Minutes From 857b00f4026f149350a6a3447d0c2b0149c1b534 Mon Sep 17 00:00:00 2001 From: Michiel Vugteveen Date: Fri, 15 Jun 2012 15:26:01 +0200 Subject: [PATCH 1292/5397] more logging --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index d056bdb9010..28d665fdf95 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -352,7 +352,7 @@ public function query($sql, $binds = FALSE, $return_object = TRUE) $error = $this->error(); // Log errors - log_message('error', 'Query error: '.$error['message']); + log_message('error', 'Query error: '.$error['message'] . ' - Invalid query: ' . $sql); if ($this->db_debug) { From 51d6d8406d6493d7e3f8783c5d17a4a1970e9fba Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Jun 2012 16:41:09 +0300 Subject: [PATCH 1293/5397] Add support for HTTP code 303 in set_status_header(), as suggested in pull #341 --- system/core/Common.php | 20 +++++++++++++------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 1708653e78a..c309d4192fd 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -431,6 +431,7 @@ function set_status_header($code = 200, $text = '') 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', + 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', @@ -462,18 +463,23 @@ function set_status_header($code = 200, $text = '') 505 => 'HTTP Version Not Supported' ); - if ($code == '' OR ! is_numeric($code)) + if (empty($code) OR ! is_numeric($code)) { show_error('Status codes must be numeric', 500); } - elseif (isset($stati[$code]) && $text === '') - { - $text = $stati[$code]; - } - if ($text === '') + is_int($code) OR $code = (int) $code; + + if (empty($text)) { - show_error('No status text available. Please check your status code number or supply your own message text.', 500); + if (isset($stati[$code])) + { + $text = $stati[$code]; + } + else + { + 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; diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ec33414c2bb..aeccea28165 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -174,6 +174,7 @@ Release Date: Not Released - Added get_mimes() function to system/core/Commons.php to return the config/mimes.php array. - Added a second argument to set_content_type() in the :doc:`Output Library ` that allows setting the document charset as well. - $config['time_reference'] now supports all timezone strings supported by PHP. + - Added support for HTTP code 303 ("See Other") in set_status_header(). Bug fixes for 3.0 ------------------ From ac35e5a3fc0987872933131988a99bd21f86a70c Mon Sep 17 00:00:00 2001 From: vlakoff Date: Fri, 15 Jun 2012 22:59:26 +0300 Subject: [PATCH 1294/5397] Fix error in Encryption Class documentation One ANSI character is 8 bits, so 32 characters are not 128 bits but 256 bits. --- user_guide_src/source/libraries/encryption.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/encryption.rst b/user_guide_src/source/libraries/encryption.rst index 28bdca203e5..a38122203a8 100644 --- a/user_guide_src/source/libraries/encryption.rst +++ b/user_guide_src/source/libraries/encryption.rst @@ -26,7 +26,7 @@ key security so you may want to think carefully before using it for anything that requires high security, like storing credit card numbers. To take maximum advantage of the encryption algorithm, your key should -be 32 characters in length (128 bits). The key should be as random a +be 32 characters in length (256 bits). The key should be as random a string as you can concoct, with numbers and uppercase and lowercase letters. Your key should **not** be a simple text string. In order to be cryptographically secure it needs to be as random as possible. From d1a075d7807ad8177ecb4235dfe16ffe2041f860 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Jun 2012 23:28:52 +0300 Subject: [PATCH 1295/5397] mimes.php: zip, rar, php from pull #1472 --- application/config/mimes.php | 5 +++-- user_guide_src/source/changelog.rst | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index 15493af434b..4b1d6a85db1 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -68,7 +68,7 @@ 'gtar' => 'application/x-gtar', 'gz' => 'application/x-gzip', 'gzip' => 'application/x-gzip', - 'php' => 'application/x-httpd-php', + 'php' => array('application/x-httpd-php', 'application/php', 'application/x-php', 'text/php', 'text/x-php', 'application/x-httpd-php-source'), 'php4' => 'application/x-httpd-php', 'php3' => 'application/x-httpd-php', 'phtml' => 'application/x-httpd-php', @@ -80,7 +80,8 @@ 'tgz' => array('application/x-tar', 'application/x-gzip-compressed'), 'xhtml' => 'application/xhtml+xml', 'xht' => 'application/xhtml+xml', - 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed'), + 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'), + 'rar' => array('application/x-rar', 'application/rar', 'application/x-rar-compressed'), 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mpga' => 'audio/mpeg', diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index aeccea28165..589cd004688 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -30,9 +30,12 @@ Release Date: Not Released - Added support for 3gp, 3g2, mp4, wmv, f4v, vlc Video files to mimes.php. - Added support for m4a, aac, m4u, xspf, au, ac3, flac, ogg Audio files to mimes.php. - Added support for kmz and kml (Google Earth) files to mimes.php. - - Added support for ics Calendar files to mimes.php + - Added support for ics Calendar files to mimes.php. + - Added support for rar archives to mimes.php. - Updated support for xml ('application/xml') and xsl ('application/xml', 'text/xsl') files in mimes.php. - Updated support for doc files in mimes.php. + - Updated support for php files in mimes.php. + - Updated support for zip files in mimes.php. - Added some more doctypes. - Added Romanian and Greek characters in foreign_characters.php. - Changed logger to only chmod when file is first created. From 58ae971ba248cf3e32a139088c3833c9735028de Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Jun 2012 23:44:48 +0300 Subject: [PATCH 1296/5397] Fix issue #167 --- system/core/URI.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/core/URI.php b/system/core/URI.php index a997525eea5..208d311a536 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -278,7 +278,7 @@ public function _filter_uri($str) { // 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)) + if ( ! preg_match('|^['.str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-')).']+$|i', urldecode($str))) { show_error('The URI you submitted has disallowed characters.', 400); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 589cd004688..3e5bc8fcbbf 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -275,6 +275,7 @@ Bug fixes for 3.0 - Fixed a bug (#10) - :doc:`URI Library ` internal method _detect_uri() failed with paths containing a colon. - Fixed a bug (#1387) - :doc:`Query Builder `'s from() method didn't escape table aliases. - Fixed a bug (#520) - :doc:`Date Helper ` function nice_date() failed when the optional second parameter is not passed. +- Fixed a bug (#167) - ``$config['permitted_uri_chars']`` didn't affect URL-encoded characters. Version 2.1.1 ============= From 0140ddd510edffb901b98de6b80676ece183760c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 16 Jun 2012 01:12:56 +0300 Subject: [PATCH 1297/5397] Fix issue #318 + added a default to the switch() in CI_Output::minify() --- system/core/Output.php | 82 +++++++++++++++-------------- system/libraries/Profiler.php | 6 +++ user_guide_src/source/changelog.rst | 1 + 3 files changed, 50 insertions(+), 39 deletions(-) diff --git a/system/core/Output.php b/system/core/Output.php index 8a0f14e02db..570d4ebc96c 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -72,6 +72,7 @@ class CI_Output { * @var string */ protected $mime_type = 'text/html'; + /** * Determines wether profiler is enabled * @@ -84,7 +85,7 @@ class CI_Output { * * @var bool */ - protected $_zlib_oc = FALSE; + protected $_zlib_oc = FALSE; /** * List of profiler sections @@ -180,7 +181,7 @@ public function append_output($output) * how to permit header data to be saved with the cache data... * * @param string - * @param bool + * @param bool * @return void */ public function set_header($header, $replace = TRUE) @@ -223,7 +224,7 @@ public function set_content_type($mime_type, $charset = NULL) } } } - + $this->mime_type = $mime_type; if (empty($charset)) @@ -300,6 +301,12 @@ public function enable_profiler($val = TRUE) */ public function set_profiler_sections($sections) { + if (isset($sections['query_toggle_count'])) + { + $this->_profiler_sections['query_toggle_count'] = (int) $sections['query_toggle_count']; + unset($sections['query_toggle_count']); + } + foreach ($sections as $section => $enable) { $this->_profiler_sections[$section] = ($enable !== FALSE); @@ -335,7 +342,7 @@ public function cache($time) * with any server headers and profile data. It also stops the * benchmark timer so the page rendering speed and memory usage can be shown. * - * @param string + * @param string * @return mixed */ public function _display($output = '') @@ -358,7 +365,7 @@ public function _display($output = '') { $output =& $this->final_output; } - + // -------------------------------------------------------------------- // Is minify requested? @@ -467,7 +474,7 @@ public function _display($output = '') /** * Write a Cache File * - * @param string + * @param string * @return void */ public function _write_cache($output) @@ -510,7 +517,7 @@ public function _write_cache($output) @chmod($cache_path, FILE_WRITE_MODE); log_message('debug', 'Cache file written: '.$cache_path); - + // Send HTTP cache-control headers to browser to match file cache settings. $this->set_cache_header($_SERVER['REQUEST_TIME'], $expire); } @@ -520,8 +527,8 @@ public function _write_cache($output) /** * Update/serve a cached file * - * @param object config class - * @param object uri class + * @param object config class + * @param object uri class * @return bool */ public function _display_cache(&$CFG, &$URI) @@ -562,7 +569,7 @@ public function _display_cache(&$CFG, &$URI) return FALSE; } else - { + { // Or else send the HTTP cache control headers. $this->set_cache_header($last_modified, $expire); } @@ -573,46 +580,44 @@ public function _display_cache(&$CFG, &$URI) return TRUE; } - // -------------------------------------------------------------------- + /** * Set the HTTP headers to match the server-side file cache settings * in order to reduce bandwidth. * - * @param int timestamp of when the page was last modified - * @param int timestamp of when should the requested page expire from cache + * @param int timestamp of when the page was last modified + * @param int timestamp of when should the requested page expire from cache * @return void */ public function set_cache_header($last_modified, $expiration) - { - $max_age = $expiration - $_SERVER['REQUEST_TIME']; + { + $max_age = $expiration - $_SERVER['REQUEST_TIME']; - if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && ($last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))) + if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { $this->set_status_header(304); exit; } else { - header('Pragma: public'); + header('Pragma: public'); header('Cache-Control: max-age=' . $max_age . ', public'); header('Expires: '.gmdate('D, d M Y H:i:s', $expiration).' GMT'); header('Last-modified: '.gmdate('D, d M Y H:i:s', $last_modified).' GMT'); } } - - - // -------------------------------------------------------------------- + /** * Reduce excessive size of HTML content. * - * @param string - * @param string + * @param string + * @param string * @return string */ - public function minify($output, $type='text/html') + public function minify($output, $type = 'text/html') { switch ($type) { @@ -633,7 +638,7 @@ public function minify($output, $type='text/html') { $output = str_replace($s, $this->minify($s, 'text/css'), $output); } - + // Minify the javascript in }msU', $output, $javascript_messed); $output = str_replace($javascript_messed[0], $javascript_mini, $output); } - + $size_removed = $size_before - strlen($output); $savings_percent = round(($size_removed / $size_before * 100)); log_message('debug', 'Minifier shaved '.($size_removed / 1000).'KB ('.$savings_percent.'%) off final HTML output.'); break; - - + case 'text/css': - + //Remove CSS comments $output = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $output); - + // Remove spaces around curly brackets, colons, // semi-colons, parenthesis, commas $output = preg_replace('!\s*(:|;|,|}|{|\(|\))\s*!', '$1', $output); break; - - + case 'text/javascript': // Currently leaves JavaScript untouched. break; + + default: break; } - + return $output; } - } /* End of file Output.php */ -/* Location: ./system/core/Output.php */ +/* Location: ./system/core/Output.php */ \ No newline at end of file diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index d96088c1445..1e961f6dfec 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -116,6 +116,12 @@ public function __construct($config = array()) */ public function set_sections($config) { + if (isset($config['query_toggle_count'])) + { + $this->_query_toggle_count = (int) $config['query_toggle_count']; + unset($config['query_toggle_count']); + } + foreach ($config as $method => $enable) { if (in_array($method, $this->_available_sections)) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 3e5bc8fcbbf..8e0ac10f00d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -276,6 +276,7 @@ Bug fixes for 3.0 - Fixed a bug (#1387) - :doc:`Query Builder `'s from() method didn't escape table aliases. - Fixed a bug (#520) - :doc:`Date Helper ` function nice_date() failed when the optional second parameter is not passed. - Fixed a bug (#167) - ``$config['permitted_uri_chars']`` didn't affect URL-encoded characters. +- Fixed a bug (#318) - :doc:`Profiling ` setting *query_toggle_count* was not settable as described in the manual. Version 2.1.1 ============= From d24160cc4348c32c0c1ec7350e2e2dada2c9291a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 16 Jun 2012 03:21:20 +0300 Subject: [PATCH 1298/5397] Changed order_by() default escaping to _protect_identifiers --- system/database/DB_query_builder.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 486fda9633e..5eb6bbb4e0e 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -967,7 +967,7 @@ protected function _having($key, $value = '', $type = 'AND ', $escape = TRUE) * @param bool enable field name escaping * @return object */ - public function order_by($orderby, $direction = '', $escape = TRUE) + public function order_by($orderby, $direction = '', $escape = NULL) { if (strtolower($direction) === 'random') { @@ -979,8 +979,9 @@ public function order_by($orderby, $direction = '', $escape = TRUE) $direction = in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE) ? ' '.$direction : ' ASC'; } + is_bool($escape) OR $escape = $this->_protect_identifiers; - if ((strpos($orderby, ',') !== FALSE) && $escape === TRUE) + if ($escape === TRUE && strpos($orderby, ',') !== FALSE) { $temp = array(); foreach (explode(',', $orderby) as $part) From 498c1e027e67dfd8108e0e255ff18fb914742b63 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 16 Jun 2012 03:34:10 +0300 Subject: [PATCH 1299/5397] Added an escape parameter to where_in(), or_where_in(), where_not_in(), or_where_not_in() and made where(), or_where() to default the escape setting to the value of _protect_identifiers --- system/database/DB_query_builder.php | 26 ++++++++++--------- .../drivers/postgre/postgre_driver.php | 5 +--- user_guide_src/source/changelog.rst | 3 +-- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 5eb6bbb4e0e..85dd77da9f3 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -405,7 +405,7 @@ public function join($table, $cond, $type = '', $escape = TRUE) * @param bool * @return object */ - public function where($key, $value = NULL, $escape = TRUE) + public function where($key, $value = NULL, $escape = NULL) { return $this->_where($key, $value, 'AND ', $escape); } @@ -423,7 +423,7 @@ public function where($key, $value = NULL, $escape = TRUE) * @param bool * @return object */ - public function or_where($key, $value = NULL, $escape = TRUE) + public function or_where($key, $value = NULL, $escape = NULL) { return $this->_where($key, $value, 'OR ', $escape); } @@ -504,9 +504,9 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) * @param array The values searched on * @return object */ - public function where_in($key = NULL, $values = NULL) + public function where_in($key = NULL, $values = NULL, $escape = NULL) { - return $this->_where_in($key, $values); + return $this->_where_in($key, $values, FALSE, 'AND ', $escape); } // -------------------------------------------------------------------- @@ -521,9 +521,9 @@ public function where_in($key = NULL, $values = NULL) * @param array The values searched on * @return object */ - public function or_where_in($key = NULL, $values = NULL) + public function or_where_in($key = NULL, $values = NULL, $escape = NULL) { - return $this->_where_in($key, $values, FALSE, 'OR '); + return $this->_where_in($key, $values, FALSE, 'OR ', $escape); } // -------------------------------------------------------------------- @@ -538,9 +538,9 @@ public function or_where_in($key = NULL, $values = NULL) * @param array The values searched on * @return object */ - public function where_not_in($key = NULL, $values = NULL) + public function where_not_in($key = NULL, $values = NULL, $escape = NULL) { - return $this->_where_in($key, $values, TRUE); + return $this->_where_in($key, $values, TRUE, 'AND ', $escape); } // -------------------------------------------------------------------- @@ -555,9 +555,9 @@ public function where_not_in($key = NULL, $values = NULL) * @param array The values searched on * @return object */ - public function or_where_not_in($key = NULL, $values = NULL) + public function or_where_not_in($key = NULL, $values = NULL, $escape = NULL) { - return $this->_where_in($key, $values, TRUE, 'OR '); + return $this->_where_in($key, $values, TRUE, 'OR ', $escape); } // -------------------------------------------------------------------- @@ -573,7 +573,7 @@ public function or_where_not_in($key = NULL, $values = NULL) * @param string * @return object */ - protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ') + protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ', $escape = NULL) { if ($key === NULL OR $values === NULL) { @@ -587,6 +587,8 @@ protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = $values = array($values); } + is_bool($escape) OR $escape = $this->_protect_identifiers; + $not = ($not) ? ' NOT' : ''; foreach ($values as $value) @@ -595,7 +597,7 @@ protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = } $prefix = (count($this->qb_where) === 0) ? '' : $type; - $this->qb_where[] = $where_in = $prefix.$this->protect_identifiers($key).$not.' IN ('.implode(', ', $this->qb_wherein).') '; + $this->qb_where[] = $where_in = $prefix.$this->protect_identifiers($key, FALSE, $escape).$not.' IN ('.implode(', ', $this->qb_wherein).') '; if ($this->qb_caching === TRUE) { diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index ad9ac900040..3d25b25ee4f 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -606,10 +606,7 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) } // If the escape value was not set will will base it on the global setting - if ( ! is_bool($escape)) - { - $escape = $this->_protect_identifiers; - } + is_bool($escape) OR $escape = $this->_protect_identifiers; foreach ($key as $k => $v) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8e0ac10f00d..b3c2e7086db 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -74,8 +74,7 @@ Release Date: Not Released - Renamed the Active Record class to Query Builder to remove confusion with the Active Record design pattern. - Added the ability to insert objects with insert_batch(). - Added new methods that return the SQL string of queries without executing them: get_compiled_select(), get_compiled_insert(), get_compiled_update(), get_compiled_delete(). - - Added an optional order_by() parameter that allows to disable escaping (useful for custom fields). - - Added an optional join() parameter that allows to disable escaping. + - Added an optional parameter that allows to disable escaping (useful for custom fields) for methods join(), order_by(), where_in(), or_where_in(), where_not_in(), or_where_not_in(). - Added support for join() with multiple conditions. - Improved support for the MySQLi driver, including: - OOP style of the PHP extension is now used, instead of the procedural aliases. From fe642dadd6ba62d597ccf1c7cb91e28059caeebf Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 16 Jun 2012 03:47:33 +0300 Subject: [PATCH 1300/5397] All Query Builder methods to respect _protect_identifiers by default --- system/database/DB_query_builder.php | 42 ++++++++++++++++------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 85dd77da9f3..1ac9af901ac 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -327,7 +327,7 @@ public function from($from) * @param string wether not to try to escape identifiers * @return object */ - public function join($table, $cond, $type = '', $escape = TRUE) + public function join($table, $cond, $type = '', $escape = NULL) { if ($type !== '') { @@ -347,6 +347,8 @@ public function join($table, $cond, $type = '', $escape = TRUE) // in the protect_identifiers to know whether to add a table prefix $this->_track_aliases($table); + is_bool($escape) OR $escape = $this->_protect_identifiers; + // Split multiple conditions if ($escape === TRUE && preg_match_all('/\sAND\s|\sOR\s/i', $cond, $m, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) { @@ -888,7 +890,7 @@ public function group_by($by) * @param bool * @return object */ - public function having($key, $value = '', $escape = TRUE) + public function having($key, $value = '', $escape = NULL) { return $this->_having($key, $value, 'AND ', $escape); } @@ -905,7 +907,7 @@ public function having($key, $value = '', $escape = TRUE) * @param bool * @return object */ - public function or_having($key, $value = '', $escape = TRUE) + public function or_having($key, $value = '', $escape = NULL) { return $this->_having($key, $value, 'OR ', $escape); } @@ -923,13 +925,15 @@ public function or_having($key, $value = '', $escape = TRUE) * @param bool * @return object */ - protected function _having($key, $value = '', $type = 'AND ', $escape = TRUE) + protected function _having($key, $value = '', $type = 'AND ', $escape = NULL) { if ( ! is_array($key)) { $key = array($key => $value); } + is_bool($escape) OR $escape = $this->_protect_identifiers; + foreach ($key as $k => $v) { $prefix = (count($this->qb_having) === 0) ? '' : $type; @@ -1057,14 +1061,16 @@ public function offset($offset) // -------------------------------------------------------------------- /** - * The "set" function. Allows key/value pairs to be set for inserting or updating + * The "set" function. + * + * Allows key/value pairs to be set for inserting or updating * * @param mixed * @param string * @param bool * @return object */ - public function set($key, $value = '', $escape = TRUE) + public function set($key, $value = '', $escape = NULL) { $key = $this->_object_to_array($key); @@ -1073,16 +1079,12 @@ public function set($key, $value = '', $escape = TRUE) $key = array($key => $value); } + is_bool($escape) OR $escape = $this->_protect_identifiers; + foreach ($key as $k => $v) { - if ($escape === FALSE) - { - $this->qb_set[$this->protect_identifiers($k)] = $v; - } - else - { - $this->qb_set[$this->protect_identifiers($k, FALSE, TRUE)] = $this->escape($v); - } + $this->qb_set[$this->protect_identifiers($k, FALSE, $escape)] = ($escape) + ? $this->escape($v) : $v; } return $this; @@ -1288,7 +1290,7 @@ protected function _insert_batch($table, $keys, $values) * @param bool * @return object */ - public function set_insert_batch($key, $value = '', $escape = TRUE) + public function set_insert_batch($key, $value = '', $escape = NULL) { $key = $this->_object_to_array_batch($key); @@ -1297,6 +1299,8 @@ public function set_insert_batch($key, $value = '', $escape = TRUE) $key = array($key => $value); } + is_bool($escape) OR $escape = $this->_protect_identifiers; + $keys = array_keys($this->_object_to_array(current($key))); sort($keys); @@ -1328,7 +1332,7 @@ public function set_insert_batch($key, $value = '', $escape = TRUE) foreach ($keys as $k) { - $this->qb_keys[] = $this->protect_identifiers($k); + $this->qb_keys[] = $this->protect_identifiers($k, FALSE, $escape); } return $this; @@ -1727,7 +1731,7 @@ public function update_batch($table = '', $set = NULL, $index = NULL) * @param bool * @return object */ - public function set_update_batch($key, $index = '', $escape = TRUE) + public function set_update_batch($key, $index = '', $escape = NULL) { $key = $this->_object_to_array_batch($key); @@ -1736,6 +1740,8 @@ public function set_update_batch($key, $index = '', $escape = TRUE) // @todo error } + is_bool($escape) OR $escape = $this->_protect_identifiers; + foreach ($key as $k => $v) { $index_set = FALSE; @@ -1747,7 +1753,7 @@ public function set_update_batch($key, $index = '', $escape = TRUE) $index_set = TRUE; } - $clean[$this->protect_identifiers($k2)] = ($escape === FALSE) ? $v2 : $this->escape($v2); + $clean[$this->protect_identifiers($k2, FALSE, $escape)] = ($escape === FALSE) ? $v2 : $this->escape($v2); } if ($index_set === FALSE) From f512b73bc78760198a5409f2c4da71fe749b1301 Mon Sep 17 00:00:00 2001 From: Alex Bilbie Date: Sat, 16 Jun 2012 11:15:19 +0100 Subject: [PATCH 1301/5397] Spelling fixes - `wether` to `whether` Interestingly `wether` means a castrated ram in old English --- system/core/Hooks.php | 4 ++-- system/core/Output.php | 2 +- system/database/DB_query_builder.php | 2 +- system/helpers/download_helper.php | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/system/core/Hooks.php b/system/core/Hooks.php index 29fd88201da..afbf4b45372 100644 --- a/system/core/Hooks.php +++ b/system/core/Hooks.php @@ -39,7 +39,7 @@ class CI_Hooks { /** - * Determines wether hooks are enabled + * Determines whether hooks are enabled * * @var bool */ @@ -53,7 +53,7 @@ class CI_Hooks { public $hooks = array(); /** - * Determines wether hook is in progress, used to prevent infinte loops + * Determines whether hook is in progress, used to prevent infinte loops * * @var bool */ diff --git a/system/core/Output.php b/system/core/Output.php index 570d4ebc96c..ed294f116d8 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -74,7 +74,7 @@ class CI_Output { protected $mime_type = 'text/html'; /** - * Determines wether profiler is enabled + * Determines whether profiler is enabled * * @var book */ diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 1ac9af901ac..531ca9eb7fd 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -324,7 +324,7 @@ public function from($from) * @param string * @param string the join condition * @param string the type of join - * @param string wether not to try to escape identifiers + * @param string whether not to try to escape identifiers * @return object */ public function join($table, $cond, $type = '', $escape = NULL) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 5efbc493027..09c4de578f2 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -46,7 +46,7 @@ * * @param string filename * @param mixed the data to be downloaded - * @param bool wether to try and send the actual file MIME type + * @param bool whether to try and send the actual file MIME type * @return void */ function force_download($filename = '', $data = '', $set_mime = FALSE) From ff3f7dea40e8fae81dd586b340d30d24154cf5ab Mon Sep 17 00:00:00 2001 From: vlakoff Date: Sat, 16 Jun 2012 14:21:32 +0200 Subject: [PATCH 1302/5397] Documentation: remaining PHP "var" declarations changed to "public" Since PHP 4 isn't supported anymore, let's clean up these few PHP "var" declarations which were remaining in the documentation. According to my checks, there is no more PHP "var" left. --- .../source/database/query_builder.rst | 18 +++++++++--------- user_guide_src/source/general/models.rst | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/user_guide_src/source/database/query_builder.rst b/user_guide_src/source/database/query_builder.rst index 54e8df6b5c3..b86a0c8db9c 100644 --- a/user_guide_src/source/database/query_builder.rst +++ b/user_guide_src/source/database/query_builder.rst @@ -603,9 +603,9 @@ Here is an example using an object:: /* class Myclass { - var $title = 'My Title'; - var $content = 'My Content'; - var $date = 'My Date'; + public $title = 'My Title'; + public $content = 'My Content'; + public $date = 'My Date'; } */ @@ -730,9 +730,9 @@ Or an object:: /* class Myclass { - var $title = 'My Title'; - var $content = 'My Content'; - var $date = 'My Date'; + public $title = 'My Title'; + public $content = 'My Content'; + public $date = 'My Date'; } */ @@ -766,9 +766,9 @@ Or you can supply an object:: /* class Myclass { - var $title = 'My Title'; - var $content = 'My Content'; - var $date = 'My Date'; + public $title = 'My Title'; + public $content = 'My Content'; + public $date = 'My Date'; } */ diff --git a/user_guide_src/source/general/models.rst b/user_guide_src/source/general/models.rst index 87f63e416eb..2e1e025eea2 100644 --- a/user_guide_src/source/general/models.rst +++ b/user_guide_src/source/general/models.rst @@ -18,9 +18,9 @@ model class might look like:: class Blog_model extends CI_Model { - var $title = ''; - var $content = ''; - var $date = ''; + public $title = ''; + public $content = ''; + public $date = ''; function __construct() { From 3c32a11549d31cac470b92f995add25d7fdeff50 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 16 Jun 2012 18:05:34 +0300 Subject: [PATCH 1303/5397] Small improvements to form_open() --- system/helpers/form_helper.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 9846343158f..0c5d5503750 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -62,9 +62,11 @@ function form_open($action = '', $attributes = '', $hidden = array()) { $action = $CI->config->site_url($action); } - - // If no action is provided then set to the current url - $action OR $action = $CI->config->site_url($CI->uri->uri_string()); + elseif ( ! $action) + { + // If no action is provided then set to the current url + $action = $CI->config->site_url($CI->uri->uri_string()); + } $form = '
    \n"; @@ -76,7 +78,7 @@ function form_open($action = '', $attributes = '', $hidden = array()) if (is_array($hidden) && count($hidden) > 0) { - $form .= sprintf('
    %s
    ', form_hidden($hidden)); + $form .= '
    '.form_hidden($hidden).'
    '; } return $form; From 1764dd7d4ab6e6e5c799eaa9ce007fce48fa0b63 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 16 Jun 2012 18:48:19 +0300 Subject: [PATCH 1304/5397] Fix issue #938 + some related improvements --- system/core/Config.php | 20 +++++++------------- user_guide_src/source/changelog.rst | 8 +++++--- user_guide_src/source/libraries/config.rst | 2 +- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/system/core/Config.php b/system/core/Config.php index 3de1bcb967d..65638271626 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -225,12 +225,12 @@ public function slash_item($item) * Site URL * Returns base_url . index_page [. uri_string] * - * @param string the URI string + * @param mixed the URI string or an array of segments * @return string */ public function site_url($uri = '') { - if ($uri === '') + if (empty($uri)) { return $this->slash_item('base_url').$this->item('index_page'); } @@ -240,10 +240,12 @@ public function site_url($uri = '') $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 + elseif (is_array($uri) OR strpos($uri, '?') === FALSE) { - return $this->slash_item('base_url').$this->item('index_page').'?'.$this->_uri_string($uri); + $uri = '?'.$this->_uri_string($uri); } + + return $this->slash_item('base_url').$this->item('index_page').$uri; } // ------------------------------------------------------------- @@ -280,15 +282,7 @@ protected function _uri_string($uri) } elseif (is_array($uri)) { - $i = 0; - $str = ''; - foreach ($uri as $key => $val) - { - $prefix = ($i === 0) ? '' : '&'; - $str .= $prefix.$key.'='.$val; - $i++; - } - return $str; + return http_build_query($uri); } return $uri; diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b3c2e7086db..b9d72642a81 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -163,12 +163,12 @@ Release Date: Not Released - Core - - Changed private functions in CI_URI to protected so MY_URI can override them. + - Changed private methods in the :doc:`URI Library ` to protected so MY_URI can override them. - Removed CI_CORE boolean constant from CodeIgniter.php (no longer Reactor and Core versions). - - Added method get_vars() to CI_Loader to retrieve all variables loaded with $this->load->vars(). + - Added method get_vars() to the :doc:`Loader Library ` to retrieve all variables loaded with $this->load->vars(). - is_loaded() function from system/core/Commons.php now returns a reference. - $config['rewrite_short_tags'] now has no effect when using PHP 5.4 as *` to retrieve $_SERVER['REQUEST_METHOD']. - Modified valid_ip() to use PHP's filter_var() in the :doc:`Input Library `. - Added support for HTTP-Only cookies with new config option ``cookie_httponly`` (default FALSE). - Renamed method _call_hook() to call_hook() in the :doc:`Hooks Library `. @@ -177,6 +177,7 @@ Release Date: Not Released - Added a second argument to set_content_type() in the :doc:`Output Library ` that allows setting the document charset as well. - $config['time_reference'] now supports all timezone strings supported by PHP. - Added support for HTTP code 303 ("See Other") in set_status_header(). + - Changed :doc:`Config Library ` method site_url() to accept an array as well. Bug fixes for 3.0 ------------------ @@ -276,6 +277,7 @@ Bug fixes for 3.0 - Fixed a bug (#520) - :doc:`Date Helper ` function nice_date() failed when the optional second parameter is not passed. - Fixed a bug (#167) - ``$config['permitted_uri_chars']`` didn't affect URL-encoded characters. - Fixed a bug (#318) - :doc:`Profiling ` setting *query_toggle_count* was not settable as described in the manual. +- Fixed a bug (#938) - :doc:`Config Library ` method site_url() added a question mark to the URL string when query strings are enabled even if it already existed. Version 2.1.1 ============= diff --git a/user_guide_src/source/libraries/config.rst b/user_guide_src/source/libraries/config.rst index 08d9c290582..694896353b7 100644 --- a/user_guide_src/source/libraries/config.rst +++ b/user_guide_src/source/libraries/config.rst @@ -175,7 +175,7 @@ This function retrieves the URL to your site, plus an optional path such as to a stylesheet or image. The two functions above are normally accessed via the corresponding -functions in the :doc:`URL Helper `. +functions in the :doc:`URL Helper `. $this->config->system_url(); ***************************** From b089e15b1510de6b6a034631c80d3d5e830ff9f3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 16 Jun 2012 19:11:40 +0300 Subject: [PATCH 1305/5397] Fix local_to_gmt() --- system/helpers/date_helper.php | 14 +++++++------- tests/codeigniter/helpers/date_helper_test.php | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 065a223effe..cafb6ba955f 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -304,13 +304,13 @@ function local_to_gmt($time = '') $time = time(); } - return gmmktime( - date('G', $time), - date('i', $time), - date('s', $time), - date('n', $time), - date('j', $time), - date('Y', $time) + return mktime( + gmdate('G', $time), + gmdate('i', $time), + gmdate('s', $time), + gmdate('n', $time), + gmdate('j', $time), + gmdate('Y', $time) ); } } diff --git a/tests/codeigniter/helpers/date_helper_test.php b/tests/codeigniter/helpers/date_helper_test.php index 1d397ac8153..8258c92488e 100644 --- a/tests/codeigniter/helpers/date_helper_test.php +++ b/tests/codeigniter/helpers/date_helper_test.php @@ -196,9 +196,9 @@ public function test_days_in_month() public function test_local_to_gmt() { $this->assertEquals( - gmmktime( - date('G', $this->time), date('i', $this->time), date('s', $this->time), - date('n', $this->time), date('j', $this->time), date('Y', $this->time) + mktime( + gmdate('G', $this->time), gmdate('i', $this->time), gmdate('s', $this->time), + gmdate('n', $this->time), gmdate('j', $this->time), gmdate('Y', $this->time) ), local_to_gmt($this->time) ); From 95d78cf4f78c0fb685a789c280d106ab242318ef Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 16 Jun 2012 19:54:33 +0300 Subject: [PATCH 1306/5397] Fix issue #999 --- system/core/Config.php | 18 +++++++++++++++--- system/core/URI.php | 6 ++++-- user_guide_src/source/changelog.rst | 1 + 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/system/core/Config.php b/system/core/Config.php index 65638271626..4b4e5a7ba54 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -235,14 +235,26 @@ public function site_url($uri = '') return $this->slash_item('base_url').$this->item('index_page'); } + $uri = $this->_uri_string($uri); + 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; + + if ($suffix !== '' && ($offset = strpos($uri, '?')) !== FALSE) + { + $uri = substr($uri, 0, $offset).$suffix.substr($uri, $offset); + } + else + { + $uri .= $suffix; + } + + return $this->slash_item('base_url').$this->slash_item('index_page').$uri; } - elseif (is_array($uri) OR strpos($uri, '?') === FALSE) + elseif (strpos($uri, '?') === FALSE) { - $uri = '?'.$this->_uri_string($uri); + $uri = '?'.$uri; } return $this->slash_item('base_url').$this->item('index_page').$uri; diff --git a/system/core/URI.php b/system/core/URI.php index 208d311a536..6a8b1a5acb3 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -302,9 +302,11 @@ public function _filter_uri($str) */ public function _remove_url_suffix() { - if ($this->config->item('url_suffix') !== '') + $suffix = (string) $this->config->item('url_suffix'); + + if ($suffix !== '' && ($offset = strrpos($this->uri_string, $suffix)) !== FALSE) { - $this->uri_string = preg_replace('|'.preg_quote($this->config->item('url_suffix')).'$|', '', $this->uri_string); + $this->uri_string = substr_replace($this->uri_string, '', $offset, strlen($suffix)); } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b9d72642a81..9ef0ce991ec 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -278,6 +278,7 @@ Bug fixes for 3.0 - Fixed a bug (#167) - ``$config['permitted_uri_chars']`` didn't affect URL-encoded characters. - Fixed a bug (#318) - :doc:`Profiling ` setting *query_toggle_count* was not settable as described in the manual. - Fixed a bug (#938) - :doc:`Config Library ` method site_url() added a question mark to the URL string when query strings are enabled even if it already existed. +- Fixed a bug (#999) - :doc:`Config Library ` method site_url() always appended ``$config['url_suffix']`` to the end of the URL string, regardless of wether a query string exists in it. Version 2.1.1 ============= From f51b1fbafcf280d69633a37f4fc87c0ffcef78ad Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 16 Jun 2012 20:02:23 +0300 Subject: [PATCH 1307/5397] Fix CI_Calendar::generate() not accepting NULLs (introduced in d261b1e89c3d4d5191036d5a5660ef6764e593a0) --- system/libraries/Calendar.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php index 969a7610ac4..a49f171b975 100644 --- a/system/libraries/Calendar.php +++ b/system/libraries/Calendar.php @@ -155,7 +155,7 @@ public function initialize($config = array()) public function generate($year = '', $month = '', $data = array()) { // Set and validate the supplied month/year - if ($year === '') + if (empty($year)) { $year = date('Y', $this->local_time); } @@ -168,7 +168,7 @@ public function generate($year = '', $month = '', $data = array()) $year = '20'.$year; } - if ($month === '') + if (empty($month)) { $month = date('m', $this->local_time); } From 95b2f4fa070f34084c78ccc68e67ecca51f40adf Mon Sep 17 00:00:00 2001 From: vkeranov Date: Sat, 16 Jun 2012 20:37:11 +0300 Subject: [PATCH 1308/5397] Really important space fix :) --- system/libraries/Zip.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index e0dc637adbd..5c4c257f8b4 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -40,7 +40,7 @@ * @author EllisLab Dev Team * @link http://codeigniter.com/user_guide/libraries/zip.html */ -class CI_Zip { +class CI_Zip { /** * Zip data in string form From f0a8410a5cbe080b377ec352320872d27ce7d91f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 16 Jun 2012 20:52:20 +0300 Subject: [PATCH 1309/5397] Fix two anchor_popup() issues --- system/helpers/url_helper.php | 7 ++----- user_guide_src/source/changelog.rst | 1 + 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index 2bd41b04d58..58bde17b453 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -204,7 +204,7 @@ function anchor_popup($uri = '', $title = '', $attributes = FALSE) if ( ! is_array($attributes)) { - $attributes = array(); + $attributes = array($attributes); } foreach (array('width' => '800', 'height' => '600', 'scrollbars' => 'yes', 'status' => 'yes', 'resizable' => 'yes', 'screenx' => '0', 'screeny' => '0', ) as $key => $val) @@ -213,10 +213,7 @@ function anchor_popup($uri = '', $title = '', $attributes = FALSE) unset($attributes[$key]); } - if ($attributes !== '') - { - $attributes = _parse_attributes($attributes); - } + $attributes = empty($attributes) ? '' : _parse_attributes($attributes); return ''.$title.''; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 9ef0ce991ec..542c473965c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -279,6 +279,7 @@ Bug fixes for 3.0 - Fixed a bug (#318) - :doc:`Profiling ` setting *query_toggle_count* was not settable as described in the manual. - Fixed a bug (#938) - :doc:`Config Library ` method site_url() added a question mark to the URL string when query strings are enabled even if it already existed. - Fixed a bug (#999) - :doc:`Config Library ` method site_url() always appended ``$config['url_suffix']`` to the end of the URL string, regardless of wether a query string exists in it. +- Fixed a bug where :doc:`URL Helper ` function anchor_popup() ignored the attributes argument if it is not an array. Version 2.1.1 ============= From 81c3208b79cca353b27ecd4bdf00d4b6e7c91b2c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 16 Jun 2012 21:21:46 +0300 Subject: [PATCH 1310/5397] anchor_popup() improvements --- system/helpers/url_helper.php | 16 +++++++++--- user_guide_src/source/changelog.rst | 5 +++- user_guide_src/source/helpers/url_helper.rst | 26 +++++++++++++------- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index 58bde17b453..40ce807df30 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -199,15 +199,23 @@ function anchor_popup($uri = '', $title = '', $attributes = FALSE) if ($attributes === FALSE) { - return '".$title.''; + return '".$title.''; } if ( ! is_array($attributes)) { $attributes = array($attributes); + + // Ref: http://www.w3schools.com/jsref/met_win_open.asp + $window_name = '_blank'; + } + elseif ( ! empty($attributes['window_name'])) + { + $window_name = $attributes['window_name']; + unset($attributes['window_name']); } - foreach (array('width' => '800', 'height' => '600', 'scrollbars' => 'yes', 'status' => 'yes', 'resizable' => 'yes', 'screenx' => '0', 'screeny' => '0', ) as $key => $val) + foreach (array('width' => '800', 'height' => '600', 'scrollbars' => 'yes', 'status' => 'yes', 'resizable' => 'yes', 'screenx' => '0', 'screeny' => '0') as $key => $val) { $atts[$key] = isset($attributes[$key]) ? $attributes[$key] : $val; unset($attributes[$key]); @@ -215,7 +223,9 @@ function anchor_popup($uri = '', $title = '', $attributes = FALSE) $attributes = empty($attributes) ? '' : _parse_attributes($attributes); - return ''.$title.''; + return ''.$title.''; } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 542c473965c..dd6fa46030a 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -53,7 +53,10 @@ Release Date: Not Released - :doc:`Date Helper ` function now() now works with all timezone strings supported by PHP. - ``create_captcha()`` accepts additional colors parameter, allowing for color customization. - - ``url_title()`` will now trim extra dashes from beginning and end. + - :doc:`URL Helper ` changes include: + - ``url_title()`` will now trim extra dashes from beginning and end. + - ``anchor_popup()`` will now fill the "href" attribute with the URL and its JS code will return false instead. + - Added JS window name support to ``anchor_popup()`` function. - Added XHTML Basic 1.1 doctype to :doc:`HTML Helper `. - Changed ``humanize()`` to include a second param for the separator. - Refactored ``plural()`` and ``singular()`` to avoid double pluralization and support more words. diff --git a/user_guide_src/source/helpers/url_helper.rst b/user_guide_src/source/helpers/url_helper.rst index e6d51b22b21..3c91fd5ddb2 100644 --- a/user_guide_src/source/helpers/url_helper.rst +++ b/user_guide_src/source/helpers/url_helper.rst @@ -168,19 +168,20 @@ browser settings. Here is an example with attributes :: - $atts = array(                - 'width'      => '800',                - 'height'     => '600',                - 'scrollbars' => 'yes',                - 'status'     => 'yes',                - 'resizable'  => 'yes',                - 'screenx'    => '0',                - 'screeny'    => '0'              + $atts = array( + 'width' => '800', + 'height' => '600', + 'scrollbars' => 'yes', + 'status'      => 'yes', + 'resizable'   => 'yes', + 'screenx'     => '0', + 'screeny'     => '0', + 'window_name' => '_blank' ); echo anchor_popup('news/local/123', 'Click Me!', $atts); -Note: The above attributes are the function defaults so you only need to +.. note:: The above attributes are the function defaults so you only need to set the ones that are different from what you need. If you want the function to use all of its defaults simply pass an empty array in the third parameter @@ -189,6 +190,13 @@ third parameter echo anchor_popup('news/local/123', 'Click Me!', array()); +.. note:: The 'window_name' is not really an attribute, but an argument to + the JavaScript `window.open() ` + method, which accepts either a window name or a window target. + +.. note:: Any other attribute than the listed above will be parsed as an + HTML attribute to the anchor tag. + mailto() ======== From d60e700640c2a67f74acff090b94d06117bfc203 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 17 Jun 2012 00:03:03 +0300 Subject: [PATCH 1311/5397] Add an option to disable MIME detection in the Upload library (issue #1494) --- system/libraries/Upload.php | 16 +++++++++++++--- .../source/libraries/file_uploading.rst | 3 +++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index c96daaf15f3..d381440cd64 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -59,6 +59,7 @@ class CI_Upload { public $error_msg = array(); public $mimes = array(); public $remove_spaces = TRUE; + public $detect_mime = TRUE; public $xss_clean = FALSE; public $temp_prefix = 'temp_file_'; public $client_name = ''; @@ -116,6 +117,7 @@ public function initialize($config = array()) 'image_size_str' => '', 'error_msg' => array(), 'remove_spaces' => TRUE, + 'detect_mime' => TRUE, 'xss_clean' => FALSE, 'temp_prefix' => 'temp_file_', 'client_name' => '' @@ -209,7 +211,13 @@ public function do_upload($field = 'userfile') // Set the uploaded data as class variables $this->file_temp = $_FILES[$field]['tmp_name']; $this->file_size = $_FILES[$field]['size']; - $this->_file_mime_type($_FILES[$field]); + + // Skip MIME type detection? + if ($this->detect_mime !== FALSE) + { + $this->_file_mime_type($_FILES[$field]); + } + $this->file_type = preg_replace('/^(.+?);.*$/', '\\1', $this->file_type); $this->file_type = strtolower(trim(stripslashes($this->file_type), '"')); $this->file_name = $this->_prep_filename($_FILES[$field]['name']); @@ -990,7 +998,7 @@ protected function _file_mime_type($file) */ if (function_exists('finfo_file')) { - $finfo = finfo_open(FILEINFO_MIME); + $finfo = @finfo_open(FILEINFO_MIME); if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system { $mime = @finfo_file($finfo, $file['tmp_name']); @@ -1021,7 +1029,9 @@ protected function _file_mime_type($file) */ if (DIRECTORY_SEPARATOR !== '\\') { - $cmd = 'file --brief --mime '.escapeshellarg($file['tmp_name']).' 2>&1'; + $cmd = function_exists('escapeshellarg') + ? 'file --brief --mime '.escapeshellarg($file['tmp_name']).' 2>&1' + : 'file --brief --mime '.$file['tmp_name'].' 2>&1'; if (function_exists('exec')) { diff --git a/user_guide_src/source/libraries/file_uploading.rst b/user_guide_src/source/libraries/file_uploading.rst index 414d84f0b93..65cd5c722c5 100644 --- a/user_guide_src/source/libraries/file_uploading.rst +++ b/user_guide_src/source/libraries/file_uploading.rst @@ -215,6 +215,9 @@ Preference Default Value Options Descripti that can not be discerned by the person uploading it. **remove_spaces** TRUE TRUE/FALSE (boolean) If set to TRUE, any spaces in the file name will be converted to underscores. This is recommended. +**detect_mime** TRUE TRUE/FALSE (boolean) If set to TRUE, a server side detection of the file type will be + performed to avoid code injection attacks. DO NOT disable this option + unless you have no other option as that would cause a security risk. ============================ ================= ======================= ====================================================================== Setting preferences in a config file From 88c47278f775413b5a408f48d30bd279e34e601a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 17 Jun 2012 02:32:31 +0300 Subject: [PATCH 1312/5397] Pagination: fixed 'rel' attribute handling, added custom attributes support, deprecated 'anchor_class' setting --- system/libraries/Pagination.php | 86 +++++++++++++------ user_guide_src/source/changelog.rst | 5 +- .../source/libraries/pagination.rst | 40 ++++----- 3 files changed, 81 insertions(+), 50 deletions(-) diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index cdec736ff9a..9a5a0bf6276 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -67,8 +67,8 @@ class CI_Pagination { public $page_query_string = FALSE; public $query_string_segment = 'per_page'; public $display_pages = TRUE; - public $anchor_class = ''; - public $attr_rel = TRUE; + protected $_attributes = ''; + protected $_link_types = array(); /** * Constructor @@ -92,15 +92,29 @@ public function __construct($params = array()) */ public function initialize($params = array()) { + $attributes = array(); + + if (isset($params['attributes']) && is_array($params['attributes'])) + { + $attributes = $params['attributes']; + unset($params['attributes']); + } + + // Deprecated legacy support for the anchor_class option + // Should be removed in CI 3.1+ + if (isset($params['anchor_class'])) + { + empty($params['anchor_class']) OR $attributes['class'] = $params['anchor_class']; + unset($params['anchor_class']); + } + + $this->_parse_attributes($attributes); + if (count($params) > 0) { foreach ($params as $key => $val) { - if ($key === 'anchor_class') - { - $this->anchor_class = ($val) ? 'class="'.$val.'" ' : ''; - } - elseif (isset($this->$key)) + if (isset($this->$key)) { $this->$key = $val; } @@ -213,7 +227,7 @@ public function create_links() if ($this->first_link !== FALSE && $this->cur_page > ($this->num_links + 1)) { $first_url = ($this->first_url === '') ? $this->base_url : $this->first_url; - $output .= $this->first_tag_open.'anchor_class.'href="'.$first_url.'"'.$this->_attr_rel('start').'>' + $output .= $this->first_tag_open.'_attributes.$this->_attr_rel('start').'>' .$this->first_link.''.$this->first_tag_close; } @@ -224,13 +238,13 @@ public function create_links() if ($i === $base_page && $this->first_url !== '') { - $output .= $this->prev_tag_open.'anchor_class.'href="'.$this->first_url.'"'.$this->_attr_rel('prev').'>' + $output .= $this->prev_tag_open.'_attributes.$this->_attr_rel('prev').'>' .$this->prev_link.''.$this->prev_tag_close; } else { $i = ($i === $base_page) ? '' : $this->prefix.$i.$this->suffix; - $output .= $this->prev_tag_open.'anchor_class.'href="'.$this->base_url.$i.'"'.$this->_attr_rel('prev').'>' + $output .= $this->prev_tag_open.'_attributes.$this->_attr_rel('prev').'>' .$this->prev_link.''.$this->prev_tag_close; } @@ -243,7 +257,6 @@ public function create_links() for ($loop = $start -1; $loop <= $end; $loop++) { $i = ($this->use_page_numbers) ? $loop : ($loop * $this->per_page) - $this->per_page; - if ($i >= $base_page) { if ($this->cur_page === $loop) @@ -253,17 +266,15 @@ public function create_links() else { $n = ($i === $base_page) ? '' : $i; - - if ($n === '' && $this->first_url !== '') + if ($n === '' && ! empty($this->first_url)) { - $output .= $this->num_tag_open.'anchor_class.'href="'.$this->first_url.'"'.$this->_attr_rel('start').'>' + $output .= $this->num_tag_open.'_attributes.$this->_attr_rel('start').'>' .$loop.''.$this->num_tag_close; } else { $n = ($n === '') ? '' : $this->prefix.$n.$this->suffix; - - $output .= $this->num_tag_open.'anchor_class.'href="'.$this->base_url.$n.'"'.$this->_attr_rel().'>' + $output .= $this->num_tag_open.'_attributes.$this->_attr_rel('start').'>' .$loop.''.$this->num_tag_close; } } @@ -276,8 +287,8 @@ public function create_links() { $i = ($this->use_page_numbers) ? $this->cur_page + 1 : $this->cur_page * $this->per_page; - $output .= $this->next_tag_open.'anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'"'.$this->_attr_rel('next').'>' - .$this->next_link.''.$this->next_tag_close; + $output .= $this->next_tag_open.'_attributes + .$this->_attr_rel('next').'>'.$this->next_link.''.$this->next_tag_close; } // Render the "Last" link @@ -285,7 +296,7 @@ public function create_links() { $i = ($this->use_page_numbers) ? $num_pages : ($num_pages * $this->per_page) - $this->per_page; - $output .= $this->last_tag_open.'anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'"'.$this->_attr_rel().'>' + $output .= $this->last_tag_open.'_attributes.'>' .$this->last_link.''.$this->last_tag_close; } @@ -299,24 +310,45 @@ public function create_links() // -------------------------------------------------------------------- + /** + * Parse attributes + * + * @param array + * @return void + */ + protected function _parse_attributes($attributes) + { + isset($attributes['rel']) OR $attributes['rel'] = TRUE; + $this->_link_types = ($attributes['rel']) + ? array('start' => 'start', 'prev' => 'prev', 'next' => 'next') + : array(); + unset($attributes['rel']); + + $this->_attributes = ''; + foreach ($attributes as $key => $value) + { + $this->_attributes .= ' '.$key.'="'.$value.'"'; + } + } + + // -------------------------------------------------------------------- + /** * Add "rel" attribute * + * @link http://www.w3.org/TR/html5/links.html#linkTypes * @param string * @return string */ - protected function _attr_rel($value = '') + protected function _attr_rel($type) { - if (empty($this->attr_rel) OR ($this->attr_rel === TRUE && empty($value))) - { - return ''; - } - elseif ( ! is_bool($this->attr_rel)) + if (isset($this->_link_types[$type])) { - $value = $this->attr_rel; + unset($this->_link_types[$type]); + return ' rel="'.$type.'"'; } - return ' rel="'.$value.'"'; + return ''; } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index dd6fa46030a..4054a04ff8a 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -162,7 +162,10 @@ Release Date: Not Released - Added dsn (delivery status notification) option to the :doc:`Email Library `. - Renamed method _set_header() to set_header() and made it public to enable adding custom headers in the :doc:`Email Library `. - Added an "index" parameter to the data() method in the :doc:`Upload Library `. - - Added support for the anchor "rel" attribute in the :doc:`Pagination Library `. + - :doc:`Pagination Library ` changes include: + - Added support for the anchor "rel" attribute. + - Added support for setting custom attributes. + - Deprecated usage of the "anchor_class" setting (use the new "attributes" setting instead). - Core diff --git a/user_guide_src/source/libraries/pagination.rst b/user_guide_src/source/libraries/pagination.rst index 560755fb650..c4398d739b5 100644 --- a/user_guide_src/source/libraries/pagination.rst +++ b/user_guide_src/source/libraries/pagination.rst @@ -247,34 +247,30 @@ adding:: $config['display_pages'] = FALSE; -****************************** -Adding a class to every anchor -****************************** +**************************** +Adding attributes to anchors +**************************** -If you want to add a class attribute to every link rendered by the -pagination class, you can set the config "anchor_class" equal to the -classname you want. +If you want to add an extra attribute to be added to every link rendered +by the pagination class, you can set them as key/value pairs in the +"attributes" config :: - $config['anchor_class'] = 'myclass'; // class="myclass" + // Produces: class="myclass" + $config['attributes'] = array('class' => 'myclass'); -********************************** -Changing the "rel" attribute value -********************************** +.. note:: Usage of the old method of setting classes via "anchor_class" + is deprecated. -By default, the rel attribute will be automatically put under the -following conditions: +***************************** +Disabling the "rel" attribute +***************************** -- rel="start" for the "first" link -- rel="prev" for the "previous" link -- rel="next" for the "next" link +By default the rel attribute is dynamically generated and appended to +the appropriate anchors. If for some reason you want to turn it off, +you can pass boolean FALSE as a regular attribute -If you want to disable the rel attribute, or change its value, you -can set the 'attr_rel' config option:: - - // Disable - $config['attr_rel'] = FALSE; +:: - // Use a custom value on all anchors - $config['attr_rel'] = 'custom_value'; // produces: rel="custom_value" \ No newline at end of file + $config['attributes']['rel'] = FALSE; \ No newline at end of file From 0159ae7d492cccca7a30a2f5b5c2b107d399e7ea Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 17 Jun 2012 02:33:43 +0300 Subject: [PATCH 1313/5397] AND -> && --- system/libraries/Cache/drivers/Cache_file.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index 028875b7d10..37d77c26872 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -73,7 +73,7 @@ public function get($id) $data = unserialize(file_get_contents($this->_cache_path.$id)); - if ($data['ttl'] > 0 AND time() > $data['time'] + $data['ttl']) + if ($data['ttl'] > 0 && time() > $data['time'] + $data['ttl']) { unlink($this->_cache_path.$id); return FALSE; From d1cace76965f71107aca63df1057b98df8d3b85a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 17 Jun 2012 03:01:00 +0300 Subject: [PATCH 1314/5397] Add deprecated docblock tags for do_hash() and read_file() --- system/helpers/file_helper.php | 1 + system/helpers/security_helper.php | 1 + 2 files changed, 2 insertions(+) diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php index be616f62d94..7270ee32c05 100644 --- a/system/helpers/file_helper.php +++ b/system/helpers/file_helper.php @@ -47,6 +47,7 @@ * This function is DEPRECATED and should be removed in * CodeIgniter 3.1+. Use file_get_contents() instead. * + * @deprecated * @param string path to file * @return string */ diff --git a/system/helpers/security_helper.php b/system/helpers/security_helper.php index 7fcb18437bc..7968f9e9f97 100644 --- a/system/helpers/security_helper.php +++ b/system/helpers/security_helper.php @@ -80,6 +80,7 @@ function sanitize_filename($filename) * This function is DEPRECATED and should be removed in * CodeIgniter 3.1+. Use hash() instead. * + * @deprecated * @param string * @param string * @return string From 929fd2d52beb779e46681d35f8ff138aa65cb8df Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 17 Jun 2012 17:29:57 +0300 Subject: [PATCH 1315/5397] Improve escaping, support for table names with spaces and fix where() for strings with no spaces around operators --- system/database/DB_driver.php | 56 +++++++++---------- system/database/DB_query_builder.php | 4 +- .../drivers/postgre/postgre_driver.php | 4 +- 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 28d665fdf95..4ec20f45d47 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1085,6 +1085,20 @@ protected function _has_operator($str) // -------------------------------------------------------------------- + /** + * Returns the SQL string operator + * + * @param string + * @return string + */ + protected function _get_operator($str) + { + return preg_match('/(=|!|<|>| IS NULL| IS NOT NULL| BETWEEN)/i', $str, $match) + ? $match[1] : FALSE; + } + + // -------------------------------------------------------------------- + /** * Enables a native PHP function to be run, using a platform agnostic wrapper. * @@ -1336,39 +1350,21 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden // Convert tabs or multiple spaces into single spaces $item = preg_replace('/\s+/', ' ', $item); - static $preg_ec = array(); - - if (empty($preg_ec)) + // If the item has an alias declaration we remove it and set it aside. + // Note: strripos() is used in order to support spaces in table names + if ($offset = strripos($item, ' AS ')) { - if (is_array($this->_escape_char)) - { - $preg_ec = array(preg_quote($this->_escape_char[0]), preg_quote($this->_escape_char[1])); - } - else - { - $preg_ec[0] = $preg_ec[1] = preg_quote($this->_escape_char); - } + $alias = ($protect_identifiers) + ? substr($item, $offset, 4).$this->escape_identifiers(substr($item, $offset + 4)) + : substr($item, $offset); + $item = substr($item, 0, $offset); } - - // If the item has an alias declaration we remove it and set it aside. - // Basically we remove everything to the right of the first space - preg_match('/^(('.$preg_ec[0].'[^'.$preg_ec[1].']+'.$preg_ec[1].')|([^'.$preg_ec[0].'][^\s]+))( AS)*(.+)*$/i', $item, $matches); - - if (isset($matches[4])) + elseif ($offset = strrpos($item, ' ')) { - $item = $matches[1]; - - // Escape the alias, if needed - if ($protect_identifiers === TRUE) - { - $alias = empty($matches[5]) - ? ' '.$this->escape_identifiers(ltrim($matches[4])) - : $matches[4].' '.$this->escape_identifiers(ltrim($matches[5])); - } - else - { - $alias = $matches[4].$matches[5]; - } + $alias = ($protect_identifiers) + ? ' '.$this->escape_identifiers(substr($item, $offset + 1)) + : substr($item, $offset); + $item = substr($item, 0, $offset); } else { diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 531ca9eb7fd..27f9f363bef 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -459,8 +459,8 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) { $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type; - $k = $this->_has_operator($k) - ? $this->protect_identifiers(substr($k, 0, strpos(rtrim($k), ' ')), FALSE, $escape).strchr(rtrim($k), ' ') + $k = (($op = $this->_get_operator($k)) !== FALSE) + ? $this->protect_identifiers(substr($k, 0, strpos($k, $op)), FALSE, $escape).strstr($k, $op) : $this->protect_identifiers($k, FALSE, $escape); if (is_null($v) && ! $this->_has_operator($k)) diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 3d25b25ee4f..23826a0ae3c 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -612,8 +612,8 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) { $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type; - $k = $this->_has_operator($k) - ? $this->protect_identifiers(substr($k, 0, strpos(rtrim($k), ' ')), FALSE, $escape).strchr(rtrim($k), ' ') + $k = (($op = $this->_get_operator($k)) !== FALSE) + ? $this->protect_identifiers(substr($k, 0, strpos($k, $op)), FALSE, $escape).strstr($k, $op) : $this->protect_identifiers($k, FALSE, $escape); if (is_null($v) && ! $this->_has_operator($k)) From 3751f9362b731f5f3d2e63176c364d6281fdf415 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 17 Jun 2012 18:07:48 +0300 Subject: [PATCH 1316/5397] Add join() USING support --- system/database/DB_query_builder.php | 14 +++++++++++--- user_guide_src/source/changelog.rst | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 27f9f363bef..4c54b1c0a40 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -368,12 +368,20 @@ public function join($table, $cond, $type = '', $escape = NULL) $newcond .= $m[0][$i][0]; } - $cond = $newcond; + $cond = ' ON '.$newcond; } // Split apart the condition and protect the identifiers elseif ($escape === TRUE && preg_match('/([\[\w\.-]+)([\W\s]+)(.+)/i', $cond, $match)) { - $cond = $this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3]); + $cond = ' ON '.$this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3]); + } + elseif ( ! $this->_has_operator($cond)) + { + $cond = ' USING ('.($escape ? $this->escape_identifiers($cond) : $cond).')'; + } + else + { + $cond = ' ON '.$cond; } // Do we want to escape the table name? @@ -383,7 +391,7 @@ public function join($table, $cond, $type = '', $escape = NULL) } // Assemble the JOIN statement - $this->qb_join[] = $join = $type.'JOIN '.$table.' ON '.$cond; + $this->qb_join[] = $join = $type.'JOIN '.$table.$cond; if ($this->qb_caching === TRUE) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4054a04ff8a..b39d43b1aca 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -79,6 +79,7 @@ Release Date: Not Released - Added new methods that return the SQL string of queries without executing them: get_compiled_select(), get_compiled_insert(), get_compiled_update(), get_compiled_delete(). - Added an optional parameter that allows to disable escaping (useful for custom fields) for methods join(), order_by(), where_in(), or_where_in(), where_not_in(), or_where_not_in(). - Added support for join() with multiple conditions. + - Added support for USING in join(). - Improved support for the MySQLi driver, including: - OOP style of the PHP extension is now used, instead of the procedural aliases. - Server version checking is now done via ``mysqli::$server_info`` instead of running an SQL query. From 6ac514484fffd9700c6ecc57cfa1b1fd105e37f6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 18 Jun 2012 13:05:17 +0300 Subject: [PATCH 1317/5397] Fix issue #1328 --- system/libraries/Form_validation.php | 7 ++++++- user_guide_src/source/changelog.rst | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index fb1c69caf07..db773e2520d 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -649,7 +649,12 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) } else { - $postdata = $this->_field_data[$row['field']]['postdata']; + // If we get an array field, but it's not expected - then it is most likely + // somebody messing with the form on the client side, so we'll just consider + // it an empty field + $postdata = is_array($this->_field_data[$row['field']]['postdata']) + ? NULL + : $this->_field_data[$row['field']]['postdata']; } // Is the rule a callback? diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b39d43b1aca..67b78bf8bc1 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -287,6 +287,7 @@ Bug fixes for 3.0 - Fixed a bug (#938) - :doc:`Config Library ` method site_url() added a question mark to the URL string when query strings are enabled even if it already existed. - Fixed a bug (#999) - :doc:`Config Library ` method site_url() always appended ``$config['url_suffix']`` to the end of the URL string, regardless of wether a query string exists in it. - Fixed a bug where :doc:`URL Helper ` function anchor_popup() ignored the attributes argument if it is not an array. +- Fixed a bug (#1328) - :doc:`Form Validation Library ` didn't properly check the type of the form fields before processing them. Version 2.1.1 ============= From fad14b25148ca7202a036dc2b764feb0c8518838 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 18 Jun 2012 13:23:24 +0300 Subject: [PATCH 1318/5397] Fix ODBC _limit() --- system/database/drivers/odbc/odbc_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 222c311c099..5ebba7aebe5 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -342,7 +342,7 @@ protected function _truncate($table) */ protected function _limit($sql, $limit, $offset) { - return $sql.($offset == 0 ? '' : $offset.', ').$limit; + return $sql.' LIMIT '.($offset == 0 ? '' : $offset.', ').$limit; } // -------------------------------------------------------------------- From 777153d8362ed884fc3d47ea4a5e1fa0f1ce8ca9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 18 Jun 2012 13:30:45 +0300 Subject: [PATCH 1319/5397] Changed limit() and offset() to ignore NULL values --- system/database/DB_query_builder.php | 10 +++------- user_guide_src/source/changelog.rst | 2 ++ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 4c54b1c0a40..d21f15066d3 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1042,12 +1042,8 @@ public function order_by($orderby, $direction = '', $escape = NULL) */ public function limit($value, $offset = NULL) { - $this->qb_limit = (int) $value; - - if ( ! empty($offset)) - { - $this->qb_offset = (int) $offset; - } + is_null($value) OR $this->qb_limit = (int) $value; + empty($offset) OR $this->qb_offset = (int) $offset; return $this; } @@ -1062,7 +1058,7 @@ public function limit($value, $offset = NULL) */ public function offset($offset) { - $this->qb_offset = (int) $offset; + empty($offset) OR $this->qb_offset = (int) $offset; return $this; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 67b78bf8bc1..da608b162f8 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -80,6 +80,8 @@ Release Date: Not Released - Added an optional parameter that allows to disable escaping (useful for custom fields) for methods join(), order_by(), where_in(), or_where_in(), where_not_in(), or_where_not_in(). - Added support for join() with multiple conditions. - Added support for USING in join(). + - Changed limit() to ignore NULL values instead of always casting to integer. + - Changed offset() to ignore empty values instead of always casting to integer. - Improved support for the MySQLi driver, including: - OOP style of the PHP extension is now used, instead of the procedural aliases. - Server version checking is now done via ``mysqli::$server_info`` instead of running an SQL query. From a465fc406010ca3648a7f55a63996569a5f86efb Mon Sep 17 00:00:00 2001 From: Robert Doucette Date: Tue, 19 Jun 2012 01:49:01 +0300 Subject: [PATCH 1320/5397] fixing a typo in the comments of the migration config file --- application/config/migration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/config/migration.php b/application/config/migration.php index 88e39824302..7645ade7c9c 100644 --- a/application/config/migration.php +++ b/application/config/migration.php @@ -44,7 +44,7 @@ | | This is the name of the table that will store the current migrations state. | When migrations runs it will store in a database table which migration -| level the system is at. It then compares the migration level in the this +| level the system is at. It then compares the migration level in this | table to the $config['migration_version'] if they are not the same it | will migrate up. This must be set. | From 9e5a9b55d6bd3588a35f42d62f76934b4a7582f4 Mon Sep 17 00:00:00 2001 From: Dumk0 Date: Tue, 19 Jun 2012 12:02:27 +0300 Subject: [PATCH 1321/5397] Property values aligned into one vertical line --- system/libraries/Pagination.php | 34 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index 9a5a0bf6276..5a4ca8f10a9 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -36,36 +36,36 @@ */ class CI_Pagination { - public $base_url = ''; // The page we are linking to - public $prefix = ''; // A custom prefix added to the path. - public $suffix = ''; // A custom suffix added to the path. - public $total_rows = 0; // Total number of items (database results) - public $per_page = 10; // Max number of items you want shown per page - public $num_links = 2; // Number of "digit" links to show before/after the currently viewed page - public $cur_page = 0; // The current page being viewed - public $use_page_numbers = FALSE; // Use page number for segment instead of offset - public $first_link = '‹ First'; - public $next_link = '>'; - public $prev_link = '<'; - public $last_link = 'Last ›'; - public $uri_segment = 3; + public $base_url = ''; // The page we are linking to + public $prefix = ''; // A custom prefix added to the path. + public $suffix = ''; // A custom suffix added to the path. + public $total_rows = 0; // Total number of items (database results) + public $per_page = 10; // Max number of items you want shown per page + public $num_links = 2; // Number of "digit" links to show before/after the currently viewed page + public $cur_page = 0; // The current page being viewed + public $use_page_numbers = FALSE; // Use page number for segment instead of offset + public $first_link = '‹ First'; + public $next_link = '>'; + public $prev_link = '<'; + public $last_link = 'Last ›'; + public $uri_segment = 3; public $full_tag_open = ''; public $full_tag_close = ''; public $first_tag_open = ''; public $first_tag_close = ' '; public $last_tag_open = ' '; public $last_tag_close = ''; - public $first_url = ''; // Alternative URL for the First Page. - public $cur_tag_open = ' '; + public $first_url = ''; // Alternative URL for the First Page. + public $cur_tag_open = ' '; public $cur_tag_close = ''; public $next_tag_open = ' '; public $next_tag_close = ' '; public $prev_tag_open = ' '; public $prev_tag_close = ''; - public $num_tag_open = ' '; + public $num_tag_open = ' '; public $num_tag_close = ''; public $page_query_string = FALSE; - public $query_string_segment = 'per_page'; + public $query_string_segment = 'per_page'; public $display_pages = TRUE; protected $_attributes = ''; protected $_link_types = array(); From af6d85088d54ed35f7c36ed010384ff7592f8959 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Tue, 19 Jun 2012 15:30:47 -0500 Subject: [PATCH 1322/5397] Fixed Migrations and an incorrect strict comparison. --- system/language/english/migration_lang.php | 2 +- system/libraries/Migration.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/language/english/migration_lang.php b/system/language/english/migration_lang.php index 9e3e188071f..af920660c13 100644 --- a/system/language/english/migration_lang.php +++ b/system/language/english/migration_lang.php @@ -26,7 +26,7 @@ */ $lang['migration_none_found'] = "No migrations were found."; -$lang['migration_not_found'] = "This migration could not be found."; +$lang['migration_not_found'] = "No migration could be found with the version number: %d."; $lang['migration_multiple_version'] = "This are multiple migrations with the same version number: %d."; $lang['migration_class_doesnt_exist'] = "The migration class \"%s\" could not be found."; $lang['migration_missing_up_method'] = "The migration class \"%s\" is missing an 'up' method."; diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index 4391b235d73..3a1e7a0adc0 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -179,7 +179,7 @@ public function version($target_version) // We now prepare to actually DO the migrations // But first let's make sure that everything is the way it should be - for ($i = $start; $i !== $stop; $i += $step) + for ($i = $start; $i != $stop; $i += $step) { $f = glob(sprintf($this->_migration_path.'%03d_*.php', $i)); From 2f0dce0fa788c442c85318afc30122afb20a880b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 20 Jun 2012 11:05:01 +0300 Subject: [PATCH 1323/5397] Small adjustment due to 079fbfcde095230f304e889217f897031a948f61 --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 4ec20f45d47..a9944416742 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1281,7 +1281,7 @@ public function display_error($error = '', $swap = '', $native = FALSE) if (isset($call['file']) && strpos($call['file'], BASEPATH.'database') === FALSE) { // Found it - use a relative path for safety - $message[] = 'Filename: '.str_replace(array(BASEPATH, APPPATH), '', $call['file']); + $message[] = 'Filename: '.str_replace(array(APPPATH, BASEPATH), '', $call['file']); $message[] = 'Line Number: '.$call['line']; break; } From a84055b49539da1faa2893618b2475d1888a9fea Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 20 Jun 2012 14:37:59 +0300 Subject: [PATCH 1324/5397] Fix issue #1510 --- tests/codeigniter/helpers/date_helper_test.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/codeigniter/helpers/date_helper_test.php b/tests/codeigniter/helpers/date_helper_test.php index 8258c92488e..4e01b1aa317 100644 --- a/tests/codeigniter/helpers/date_helper_test.php +++ b/tests/codeigniter/helpers/date_helper_test.php @@ -48,11 +48,9 @@ public function test_now_utc() */ - $this->ci_set_config('time_reference', 'UTC'); - $this->assertEquals( - gmmktime(date('G'), date('i'), date('s'), date('n'), date('j'), date('Y')), - now() + mktime(gmdate('G'), gmdate('i'), gmdate('s'), gmdate('n'), gmdate('j'), gmdate('Y')), + now('UTC') ); } From 8d3099d4e5261e0f044c7fcd8b3ab7724645aa8d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 21 Jun 2012 16:00:20 +0300 Subject: [PATCH 1325/5397] Fix issue #79 --- system/libraries/Form_validation.php | 3 +-- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index db773e2520d..4bb29e41b78 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -571,8 +571,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) { foreach ($postdata as $key => $val) { - $this->_execute($row, $rules, $val, $cycles); - $cycles++; + $this->_execute($row, $rules, $val, $key); } return; diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index da608b162f8..8a6c922a46d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -290,6 +290,7 @@ Bug fixes for 3.0 - Fixed a bug (#999) - :doc:`Config Library ` method site_url() always appended ``$config['url_suffix']`` to the end of the URL string, regardless of wether a query string exists in it. - Fixed a bug where :doc:`URL Helper ` function anchor_popup() ignored the attributes argument if it is not an array. - Fixed a bug (#1328) - :doc:`Form Validation Library ` didn't properly check the type of the form fields before processing them. +- Fixed a bug (#79) - :doc:`Form Validation Library ` didn't properly validate array fields that use associative keys or have custom indexes. Version 2.1.1 ============= From 3b6af434b13168828429d06aae7699f6f9537a87 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Thu, 21 Jun 2012 09:21:17 -0500 Subject: [PATCH 1326/5397] Replaced block tag minification regex with a less greedy solution. --- system/core/Output.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Output.php b/system/core/Output.php index ed294f116d8..4fdf18f1482 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -652,7 +652,7 @@ public function minify($output, $type = 'text/html') $output = preg_replace('{\s*\s*}msU', '', $output); // Remove spaces around block-level elements. - $output = preg_replace('{\s*()\s+}msU', '$1', $output); + $output = preg_replace('/\s*(<\/?(html|head|title|meta|script|link|style|body|h[1-6]|div|p|br)[^>]*>)\s*/is', '$1', $output); // Replace mangled
     etc. tags with unprocessed ones.
     
    
    From bc69f369eba2f1188be6d89ebd1df8c48e96db5d Mon Sep 17 00:00:00 2001
    From: WanWizard 
    Date: Fri, 22 Jun 2012 00:10:11 +0200
    Subject: [PATCH 1327/5397] fixed query grouping when using where($array)
     syntax
    
    on request of Phil
    ---
     system/database/DB_query_builder.php | 14 ++++----------
     1 file changed, 4 insertions(+), 10 deletions(-)
    
    diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php
    index d21f15066d3..62e02129b06 100644
    --- a/system/database/DB_query_builder.php
    +++ b/system/database/DB_query_builder.php
    @@ -453,8 +453,6 @@ public function or_where($key, $value = NULL, $escape = NULL)
     	 */
     	protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL)
     	{
    -		$type = $this->_group_get_type($type);
    -
     		if ( ! is_array($key))
     		{
     			$key = array($key => $value);
    @@ -465,7 +463,7 @@ protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL)
     
     		foreach ($key as $k => $v)
     		{
    -			$prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type;
    +			$prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? $this->_group_get_type('') : $this->_group_get_type($type);
     
     			$k = (($op = $this->_get_operator($k)) !== FALSE)
     				? $this->protect_identifiers(substr($k, 0, strpos($k, $op)), FALSE, $escape).strstr($k, $op)
    @@ -590,8 +588,6 @@ protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type =
     			return $this;
     		}
     
    -		$type = $this->_group_get_type($type);
    -
     		if ( ! is_array($values))
     		{
     			$values = array($values);
    @@ -606,7 +602,7 @@ protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type =
     			$this->qb_wherein[] = $this->escape($value);
     		}
     
    -		$prefix = (count($this->qb_where) === 0) ? '' : $type;
    +		$prefix = (count($this->qb_where) === 0) ? $this->_group_get_type('') : $this->_group_get_type($type);
     		$this->qb_where[] = $where_in = $prefix.$this->protect_identifiers($key, FALSE, $escape).$not.' IN ('.implode(', ', $this->qb_wherein).') ';
     
     		if ($this->qb_caching === TRUE)
    @@ -702,8 +698,6 @@ public function or_not_like($field, $match = '', $side = 'both')
     	 */
     	protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '')
     	{
    -		$type = $this->_group_get_type($type);
    -
     		if ( ! is_array($field))
     		{
     			$field = array($field => $match);
    @@ -712,7 +706,7 @@ protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $n
     		foreach ($field as $k => $v)
     		{
     			$k = $this->protect_identifiers($k);
    -			$prefix = (count($this->qb_like) === 0) ? '' : $type;
    +			$prefix = (count($this->qb_like) === 0) ? $this->_group_get_type('') : $this->_group_get_type($type);
     			$v = $this->escape_like_str($v);
     
     			if ($side === 'none')
    @@ -2393,4 +2387,4 @@ protected function _reset_write()
     }
     
     /* End of file DB_query_builder.php */
    -/* Location: ./system/database/DB_query_builder.php */
    \ No newline at end of file
    +/* Location: ./system/database/DB_query_builder.php */
    
    From 7540dede0f01acd7aa1ffd224defc5189305a815 Mon Sep 17 00:00:00 2001
    From: Mat Whitney 
    Date: Fri, 22 Jun 2012 12:02:10 -0700
    Subject: [PATCH 1328/5397] Added optional fourth parameter to timezone_menu
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    allows setting one or more attributes on the generated select tag.
    This allows passing attributes needed for Section 508 compliance §
    1194.22(n), such as an id.
    http://access-board.gov/sec508/guide/1194.22.htm#(n)
    http://www.w3.org/TR/WCAG10-HTML-TECHS/#forms-labels
    ---
     system/helpers/date_helper.php                | 20 ++++++++++++--
     user_guide_src/source/changelog.rst           |  1 +
     user_guide_src/source/helpers/date_helper.rst | 27 ++++++++++---------
     3 files changed, 34 insertions(+), 14 deletions(-)
    
    diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php
    index cafb6ba955f..fc790c58588 100644
    --- a/system/helpers/date_helper.php
    +++ b/system/helpers/date_helper.php
    @@ -547,9 +547,10 @@ function nice_date($bad_date = '', $format = FALSE)
     	 * @param	string	timezone
     	 * @param	string	classname
     	 * @param	string	menu name
    +	 * @param	mixed	attributes
     	 * @return	string
     	 */
    -	function timezone_menu($default = 'UTC', $class = '', $name = 'timezones')
    +	function timezone_menu($default = 'UTC', $class = '', $name = 'timezones', $attributes = '')
     	{
     		$CI =& get_instance();
     		$CI->lang->load('date');
    @@ -563,7 +564,22 @@ function timezone_menu($default = 'UTC', $class = '', $name = 'timezones')
     			$menu .= ' class="'.$class.'"';
     		}
     
    -		$menu .= ">\n";
    +		// Generate a string from the attributes submitted, if any
    +		if (is_array($attributes))
    +		{
    +			$atts = '';
    +			foreach ($attributes as $key => $val)
    +			{
    +				$atts .= ' '.$key.'="'.$val.'"';
    +			}
    +			$attributes = $atts;
    +		}
    +		elseif (is_string($attributes) && strlen($attributes) > 0)
    +		{
    +			$attributes = ' '.$attributes;
    +		}
    +
    +		$menu .= $attributes.">\n";
     
     		foreach (timezones() as $key => $val)
     		{
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 8a6c922a46d..c861a1e8d5c 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -70,6 +70,7 @@ Release Date: Not Released
     	 - ``set_realpath()`` can now also handle file paths as opposed to just directories.
     	 - Added an optional paramater to ``delete_files()`` to enable it to skip deleting files such as .htaccess and index.html.
     	 - ``read_file()`` is now a deprecated alias of ``file_get_contents()``.
    +   -  :doc:`Date Helper ` Added optional fourth parameter to ``timezone_menu()`` that allows more attributes to be added to the generated select tag
     
     -  Database
     
    diff --git a/user_guide_src/source/helpers/date_helper.rst b/user_guide_src/source/helpers/date_helper.rst
    index b6dc2e934df..ba079394d94 100644
    --- a/user_guide_src/source/helpers/date_helper.rst
    +++ b/user_guide_src/source/helpers/date_helper.rst
    @@ -115,7 +115,7 @@ Supported formats:
     local_to_gmt()
     ==============
     
    -Takes a Unix timestamp as input and returns it as GMT. 
    +Takes a Unix timestamp as input and returns it as GMT.
     
     .. php:method:: local_to_gmt($time = '')
     
    @@ -159,7 +159,7 @@ Example
     mysql_to_unix()
     ===============
     
    -Takes a MySQL Timestamp as input and returns it as Unix. 
    +Takes a MySQL Timestamp as input and returns it as Unix.
     
     .. php:method:: mysql_to_unix($time = '')
     
    @@ -212,7 +212,7 @@ human_to_unix()
     The opposite of the above function. Takes a "human" time as input and
     returns it as Unix. This function is useful if you accept "human"
     formatted dates submitted via a form. Returns FALSE (boolean) if the
    -date string passed to it is not formatted as indicated above. 
    +date string passed to it is not formatted as indicated above.
     
     .. php:method:: human_to_unix($datestr = '')
     
    @@ -235,9 +235,9 @@ them into something useful. It also accepts well-formed dates.
     
     The function will return a Unix timestamp by default. You can,
     optionally, pass a format string (the same type as the PHP date function
    -accepts) as the second parameter. 
    +accepts) as the second parameter.
     
    -.. php:method:: nice_date($bad_date = '', $format = FALSE) 
    +.. php:method:: nice_date($bad_date = '', $format = FALSE)
     
     	:param integer 	$bad_date: The terribly formatted date-like string
     	:param string 	$format: Date format to return (same as php date function)
    @@ -265,10 +265,10 @@ Formats a unix timestamp so that is appears similar to this
     
     The first parameter must contain a Unix timestamp. The second parameter
     must contain a timestamp that is greater that the first timestamp. If
    -the second parameter empty, the current time will be used. The third 
    -parameter is optional and limits the number of time units to display. 
    -The most common purpose for this function is to show how much time has 
    -elapsed from some point in time in the past to now. 
    +the second parameter empty, the current time will be used. The third
    +parameter is optional and limits the number of time units to display.
    +The most common purpose for this function is to show how much time has
    +elapsed from some point in time in the past to now.
     
     .. php:method:: timespan($seconds = 1, $time = '', $units = '')
     
    @@ -293,7 +293,7 @@ days_in_month()
     ===============
     
     Returns the number of days in a given month/year. Takes leap years into
    -account. 
    +account.
     
     .. php:method:: days_in_month($month = 0, $year = '')
     
    @@ -390,14 +390,15 @@ allowed to set their local timezone value.
     The first parameter lets you set the "selected" state of the menu. For
     example, to set Pacific time as the default you will do this
     
    -.. php:method:: timezone_menu($default = 'UTC', $class = "", $name = 'timezones')
    +.. php:method:: timezone_menu($default = 'UTC', $class = '', $name = 'timezones', $attributes = '')
     
     	:param string 	$default: timezone
     	:param string	$class: classname
     	:param string	$name: menu name
    +	:param mixed	$attributes: attributes
     	:returns: string
     
    -Example: 
    +Example:
     
     ::
     
    @@ -407,6 +408,8 @@ Please see the timezone reference below to see the values of this menu.
     
     The second parameter lets you set a CSS class name for the menu.
     
    +The fourth parameter lets you set one or more attributes on the generated select tag.
    +
     .. note:: The text contained in the menu is found in the following
     	language file: `language//date_lang.php`
     
    
    From 282e02c7d66085d3c6d4c85eed4a1581389b5e63 Mon Sep 17 00:00:00 2001
    From: Alex Bilbie 
    Date: Sat, 23 Jun 2012 14:11:58 +0100
    Subject: [PATCH 1329/5397] Clarified support of $config['csrf_exclude_uris']
     support in v3.0 (#236)
    
    ---
     user_guide_src/source/changelog.rst | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 8a6c922a46d..f8eb596444b 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -148,6 +148,7 @@ Release Date: Not Released
     	 -  If property maintain_ratio is set to TRUE, image_reproportion() now doesn't need both width and height to be specified.
        -  Removed SHA1 function in the :doc:`Encryption Library `.
        -  Added $config['csrf_regeneration'] to the CSRF protection in the :doc:`Security library `, which makes token regeneration optional.
    +   -  Added $config['csrf_exclude_uris'] to the CSRF protection in the :doc:`Security library `, which allows you list URIs which will not have the CSRF validation functions run.
        -  :doc:`Form Validation library ` changes include:
     	 -  Added method error_array() to return all error messages as an array.
     	 -  Added method set_data() to set an alternative data array to be validated instead of the default $_POST.
    @@ -453,7 +454,6 @@ Release Date: August 20, 2011
        -  Added insert_batch() function to the PostgreSQL database driver.
           Thanks to epallerols for the patch.
        -  Added "application/x-csv" to mimes.php.
    -   -  Added CSRF protection URI whitelisting.
        -  Fixed a bug where :doc:`Email library `
           attachments with a "." in the name would using invalid MIME-types.
     
    
    From f82b92999e8309155df3e665e25a261c26b0e93d Mon Sep 17 00:00:00 2001
    From: Phil Sturgeon 
    Date: Sat, 23 Jun 2012 15:49:23 +0100
    Subject: [PATCH 1330/5397] Added ['reuse_query_string'] to Pagination. This
     allows automatic repopulation of query string arguments, combined with normal
     URI segments.
    
    ---
     system/libraries/Pagination.php               | 98 +++++++++++--------
     user_guide_src/source/changelog.rst           |  1 +
     .../source/libraries/pagination.rst           | 15 +++
     3 files changed, 74 insertions(+), 40 deletions(-)
    
    diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php
    index 5a4ca8f10a9..75745dd48a2 100644
    --- a/system/libraries/Pagination.php
    +++ b/system/libraries/Pagination.php
    @@ -36,39 +36,40 @@
      */
     class CI_Pagination {
     
    -	public $base_url		= ''; // The page we are linking to
    -	public $prefix			= ''; // A custom prefix added to the path.
    -	public $suffix			= ''; // A custom suffix added to the path.
    -	public $total_rows		= 0; // Total number of items (database results)
    -	public $per_page		= 10; // Max number of items you want shown per page
    -	public $num_links		= 2; // Number of "digit" links to show before/after the currently viewed page
    -	public $cur_page		= 0; // The current page being viewed
    -	public $use_page_numbers	= FALSE; // Use page number for segment instead of offset
    -	public $first_link		= '‹ First';
    -	public $next_link		= '>';
    -	public $prev_link		= '<';
    -	public $last_link		= 'Last ›';
    -	public $uri_segment		= 3;
    -	public $full_tag_open		= '';
    -	public $full_tag_close		= '';
    -	public $first_tag_open		= '';
    -	public $first_tag_close		= ' ';
    -	public $last_tag_open		= ' ';
    -	public $last_tag_close		= '';
    -	public $first_url		= ''; // Alternative URL for the First Page.
    -	public $cur_tag_open		= ' ';
    -	public $cur_tag_close		= '';
    -	public $next_tag_open		= ' ';
    -	public $next_tag_close		= ' ';
    -	public $prev_tag_open		= ' ';
    -	public $prev_tag_close		= '';
    -	public $num_tag_open		= ' ';
    -	public $num_tag_close		= '';
    -	public $page_query_string	= FALSE;
    -	public $query_string_segment 	= 'per_page';
    -	public $display_pages		= TRUE;
    -	protected $_attributes		= '';
    -	protected $_link_types		= array();
    +	protected $base_url				= ''; // The page we are linking to
    +	protected $prefix				= ''; // A custom prefix added to the path.
    +	protected $suffix				= ''; // A custom suffix added to the path.
    +	protected $total_rows			= 0; // Total number of items (database results)
    +	protected $per_page				= 10; // Max number of items you want shown per page
    +	protected $num_links			= 2; // Number of "digit" links to show before/after the currently viewed page
    +	protected $cur_page				= 0; // The current page being viewed
    +	protected $use_page_numbers		= FALSE; // Use page number for segment instead of offset
    +	protected $first_link			= '‹ First';
    +	protected $next_link			= '>';
    +	protected $prev_link			= '<';
    +	protected $last_link			= 'Last ›';
    +	protected $uri_segment			= 3;
    +	protected $full_tag_open		= '';
    +	protected $full_tag_close		= '';
    +	protected $first_tag_open		= '';
    +	protected $first_tag_close		= ' ';
    +	protected $last_tag_open		= ' ';
    +	protected $last_tag_close		= '';
    +	protected $first_url			= ''; // Alternative URL for the First Page.
    +	protected $cur_tag_open			= ' ';
    +	protected $cur_tag_close		= '';
    +	protected $next_tag_open		= ' ';
    +	protected $next_tag_close		= ' ';
    +	protected $prev_tag_open		= ' ';
    +	protected $prev_tag_close		= '';
    +	protected $num_tag_open			= ' ';
    +	protected $num_tag_close		= '';
    +	protected $page_query_string	= FALSE;
    +	protected $query_string_segment 	= 'per_page';
    +	protected $display_pages		= TRUE;
    +	protected $_attributes			= '';
    +	protected $_link_types			= array();
    +	protected $reuse_query_string   = FALSE;
     
     	/**
     	 * Constructor
    @@ -222,6 +223,23 @@ public function create_links()
     
     		// And here we go...
     		$output = '';
    +		$query_string = '';
    +
    +		// Add anything in the query string back to the links
    +		// Note: Nothing to do with query_string_segment or any other query string options
    +		if ($this->reuse_query_string === TRUE)
    +		{
    +			$get = $CI->input->get();
    +			
    +			// Unset the controll, method, old-school routing options
    +			unset($get['c'], $get['m'], $get[$this->query_string_segment]);
    +
    +			// Put everything else onto the end
    +			$query_string = (strpos($this->base_url, '&') !== FALSE ? '&' : '?') . http_build_query($get, '', '&');
    +
    +			// Add this after the suffix to put it into more links easily
    +			$this->suffix .= $query_string;
    +		}
     
     		// Render the "First" link
     		if ($this->first_link !== FALSE && $this->cur_page > ($this->num_links + 1))
    @@ -232,19 +250,19 @@ public function create_links()
     		}
     
     		// Render the "previous" link
    -		if  ($this->prev_link !== FALSE && $this->cur_page !== 1)
    +		if ($this->prev_link !== FALSE && $this->cur_page !== 1)
     		{
     			$i = ($this->use_page_numbers) ? $uri_page_number - 1 : $uri_page_number - $this->per_page;
     
     			if ($i === $base_page && $this->first_url !== '')
     			{
    -				$output .= $this->prev_tag_open.'_attributes.$this->_attr_rel('prev').'>'
    +				$output .= $this->prev_tag_open.'_attributes.$this->_attr_rel('prev').'>'
     					.$this->prev_link.''.$this->prev_tag_close;
     			}
     			else
     			{
    -				$i = ($i === $base_page) ? '' : $this->prefix.$i.$this->suffix;
    -				$output .= $this->prev_tag_open.'_attributes.$this->_attr_rel('prev').'>'
    +				$append = ($i === $base_page) ? $query_string : $this->prefix.$i.$this->suffix;
    +				$output .= $this->prev_tag_open.'_attributes.$this->_attr_rel('prev').'>'
     					.$this->prev_link.''.$this->prev_tag_close;
     			}
     
    @@ -268,13 +286,13 @@ public function create_links()
     						$n = ($i === $base_page) ? '' : $i;
     						if ($n === '' && ! empty($this->first_url))
     						{
    -							$output .= $this->num_tag_open.'_attributes.$this->_attr_rel('start').'>'
    +							$output .= $this->num_tag_open.'_attributes.$this->_attr_rel('start').'>'
     								.$loop.''.$this->num_tag_close;
     						}
     						else
     						{
    -							$n = ($n === '') ? '' : $this->prefix.$n.$this->suffix;
    -							$output .= $this->num_tag_open.'_attributes.$this->_attr_rel('start').'>'
    +							$append = ($n === '') ? $query_string : $this->prefix.$n.$this->suffix;
    +							$output .= $this->num_tag_open.'_attributes.$this->_attr_rel('start').'>'
     								.$loop.''.$this->num_tag_close;
     						}
     					}
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index f8eb596444b..29084ed9ba0 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -170,6 +170,7 @@ Release Date: Not Released
     	 -  Added support for the anchor "rel" attribute.
     	 -  Added support for setting custom attributes.
     	 -  Deprecated usage of the "anchor_class" setting (use the new "attributes" setting instead).
    +	 -  Added $config['reuse_query_string'] to allow automatic repopulation of query string arguments, combined with normal URI segments.
     
     -  Core
     
    diff --git a/user_guide_src/source/libraries/pagination.rst b/user_guide_src/source/libraries/pagination.rst
    index c4398d739b5..15b3675dfbe 100644
    --- a/user_guide_src/source/libraries/pagination.rst
    +++ b/user_guide_src/source/libraries/pagination.rst
    @@ -112,6 +112,21 @@ the pagination link will become.
     Note that "per_page" is the default query string passed, however can be
     configured using $config['query_string_segment'] = 'your_string'
     
    +$config['reuse_query_string'] = FALSE;
    +====================================
    +
    +By default your Query String arguments (nothing to do with other 
    +query string options) will be ignored. Setting this config to 
    +TRUE will add existing query string arguments back into the 
    +URL after the URI segment and before the suffix
    +
    +::
    +
    +	http://example.com/index.php/test/page/20?query=search%term
    +
    +This helps you mix together normal :doc:`URI Segments <../general/urls>`
    +as well as query string arguments, which until 3.0 was not possible.
    +
     ***********************
     Adding Enclosing Markup
     ***********************
    
    From 7a744a8ba8f07ba1ec3a48f1d5de641b4025ce20 Mon Sep 17 00:00:00 2001
    From: Phil Sturgeon 
    Date: Sat, 23 Jun 2012 17:21:00 +0100
    Subject: [PATCH 1331/5397] If there is no output then no need to try minifying
     it
    
    ---
     system/core/Output.php | 5 +++++
     1 file changed, 5 insertions(+)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index 4fdf18f1482..5ec8c4bc03b 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -625,6 +625,11 @@ public function minify($output, $type = 'text/html')
     
     				$size_before = strlen($output);
     
    +				if ($size_before === 0)
    +				{
    +					return '';
    +				}
    +
     				// Find all the 
    ,,\n";
    +		return '\n";
     	}
     }
     
    @@ -600,44 +600,15 @@ function form_close($extra = '')
     	 *
     	 * Formats text so that it can be safely placed in a form field in the event it has HTML tags.
     	 *
    -	 * @param	string
    -	 * @param	string
    +	 * @deprecated	3.0.0	This function has been broken for a long time
    +	 *			and is now just an alias for html_escape(). It's
    +	 *			second argument is ignored.
    +	 * @param	string	$str = ''
    +	 * @param	string	$field_name = ''
     	 * @return	string
     	 */
     	function form_prep($str = '', $field_name = '')
     	{
    -		static $prepped_fields = array();
    -
    -		// if the field name is an array we do this recursively
    -		if (is_array($str))
    -		{
    -			foreach ($str as $key => $val)
    -			{
    -				$str[$key] = form_prep($val);
    -			}
    -
    -			return $str;
    -		}
    -
    -		if ($str === '')
    -		{
    -			return '';
    -		}
    -
    -		// we've already prepped a field with this name
    -		// @todo need to figure out a way to namespace this so
    -		// that we know the *exact* field and not just one with
    -		// the same name
    -		if (isset($prepped_fields[$field_name]))
    -		{
    -			return $str;
    -		}
    -
    -		if ($field_name !== '')
    -		{
    -			$prepped_fields[$field_name] = $field_name;
    -		}
    -
     		return html_escape($str);
     	}
     }
    @@ -663,13 +634,13 @@ function set_value($field = '', $default = '')
     		{
     			if ( ! isset($_POST[$field]))
     			{
    -				return $default;
    +				return html_escape($default);
     			}
     
    -			return form_prep($_POST[$field], $field);
    +			return html_escape($_POST[$field]);
     		}
     
    -		return form_prep($OBJ->set_value($field, $default), $field);
    +		return html_escape($OBJ->set_value($field, $default));
     	}
     }
     
    @@ -919,7 +890,7 @@ function _parse_form_attributes($attributes, $default)
     		{
     			if ($key === 'value')
     			{
    -				$val = form_prep($val, $default['name']);
    +				$val = html_escape($val);
     			}
     			elseif ($key === 'name' && ! strlen($default['name']))
     			{
    diff --git a/tests/codeigniter/core/Common_test.php b/tests/codeigniter/core/Common_test.php
    index 27d48efc296..999b49cb36b 100644
    --- a/tests/codeigniter/core/Common_test.php
    +++ b/tests/codeigniter/core/Common_test.php
    @@ -2,8 +2,6 @@
     
     class Common_test extends CI_TestCase {
     
    -	// ------------------------------------------------------------------------
    -
     	public function test_is_php()
     	{
     		$this->assertEquals(TRUE, is_php('1.2.0'));
    @@ -16,12 +14,12 @@ public function test_stringify_attributes()
     	{
     		$this->assertEquals(' class="foo" id="bar"', _stringify_attributes(array('class' => 'foo', 'id' => 'bar')));
     
    -		$atts = new Stdclass;
    +		$atts = new stdClass;
     		$atts->class = 'foo';
     		$atts->id = 'bar';
     		$this->assertEquals(' class="foo" id="bar"', _stringify_attributes($atts));
     
    -		$atts = new Stdclass;
    +		$atts = new stdClass;
     		$this->assertEquals('', _stringify_attributes($atts));
     
     		$this->assertEquals(' class="foo" id="bar"', _stringify_attributes('class="foo" id="bar"'));
    @@ -35,10 +33,20 @@ public function test_stringify_js_attributes()
     	{
     		$this->assertEquals('width=800,height=600', _stringify_attributes(array('width' => '800', 'height' => '600'), TRUE));
     
    -		$atts = new Stdclass;
    +		$atts = new stdClass;
     		$atts->width = 800;
     		$atts->height = 600;
     		$this->assertEquals('width=800,height=600', _stringify_attributes($atts, TRUE));
     	}
     
    +	// ------------------------------------------------------------------------
    +
    +	public function test_html_escape()
    +	{
    +		$this->assertEquals(
    +			html_escape('Here is a string containing "quoted" text.'),
    +			'Here is a string containing "quoted" text.'
    +		);
    +	}
    +
     }
    \ No newline at end of file
    diff --git a/tests/codeigniter/helpers/form_helper_test.php b/tests/codeigniter/helpers/form_helper_test.php
    index 48628d2e5ce..03278581d68 100644
    --- a/tests/codeigniter/helpers/form_helper_test.php
    +++ b/tests/codeigniter/helpers/form_helper_test.php
    @@ -7,6 +7,8 @@ public function set_up()
     		$this->helper('form');
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_hidden()
     	{
     		$expected = <<assertEquals($expected, form_hidden('username', 'johndoe'));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_input()
     	{
     		$expected = <<assertEquals($expected, form_input($data));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_password()
     	{
     		$expected = <<assertEquals($expected, form_password('password'));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_upload()
     	{
     		$expected = <<assertEquals($expected, form_upload('attachment'));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_textarea()
     	{
     		$expected = <<assertEquals($expected, form_textarea('notes', 'Notes'));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_dropdown()
     	{
     		$expected = <<assertEquals($expected, form_dropdown('cars', $options, array('volvo', 'audi')));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_multiselect()
     	{
     		$expected = <<assertEquals($expected, form_multiselect('shirts[]', $options, array('med', 'large')));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_fieldset()
     	{
     		$expected = <<assertEquals($expected, form_fieldset('Address Information'));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_fieldset_close()
     	{
     		$expected = <<assertEquals($expected, form_fieldset_close(''));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_checkbox()
     	{
     		$expected = <<assertEquals($expected, form_checkbox('newsletter', 'accept', TRUE));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_radio()
     	{
     		$expected = <<assertEquals($expected, form_radio('newsletter', 'accept', TRUE));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_submit()
     	{
     		$expected = <<assertEquals($expected, form_submit('mysubmit', 'Submit Post!'));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_label()
     	{
     		$expected = <<assertEquals($expected, form_label('What is your Name', 'username'));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_reset()
     	{
     		$expected = <<assertEquals($expected, form_reset('myreset', 'Reset'));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_button()
     	{
     		$expected = <<assertEquals($expected, form_button('name', 'content'));
     	}
     
    +	// ------------------------------------------------------------------------
    +
     	public function test_form_close()
     	{
     		$expected = <<assertEquals($expected, form_close(''));
     	}
     
    -	public function test_form_prep()
    -	{
    -		$expected = 'Here is a string containing "quoted" text.';
    -
    -		$this->assertEquals($expected, form_prep('Here is a string containing "quoted" text.'));
    -	}
    -
     }
     
     /* End of file form_helper_test.php */
    \ No newline at end of file
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 0d832425cbc..54338f3ee7c 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -75,7 +75,9 @@ Release Date: Not Released
        -  Refactored ``plural()`` and ``singular()`` to avoid double pluralization and support more words.
        -  Added an optional third parameter to ``force_download()`` that enables/disables sending the actual file MIME type in the Content-Type header (disabled by default).
        -  Added a work-around in ``force_download()`` for a bug Android <= 2.1, where the filename extension needs to be in uppercase.
    -   -  ``form_dropdown()`` will now also take an array for unity with other form helpers.
    +   -  :doc:`Form Helper ` changes include:
    +	 - ``form_dropdown()`` will now also take an array for unity with other form helpers.
    +	 - ``form_prep()`` is now **DEPRECATED** and only acts as an alias for :doc:`common function ` ``html_escape()``.
        -  ``do_hash()`` now uses PHP's native ``hash()`` function (supporting more algorithms) and is deprecated.
        -  Removed previously deprecated helper function ``js_insert_smiley()`` from :doc:`Smiley Helper `.
        -  :doc:`File Helper ` changes include:
    @@ -387,6 +389,7 @@ Bug fixes for 3.0
     -  Fixed a bug (#1506) - :doc:`Form Helpers ` set empty *name* attributes.
     -  Fixed a bug (#59) - :doc:`Query Builder ` method ``count_all_results()`` ignored the DISTINCT clause.
     -  Fixed a bug (#1624) - :doc:`Form Validation Library ` rule **matches** didn't property handle array field names.
    +-  Fixed a bug (#1630) - :doc:`Form Helper ` function ``set_value()`` didn't escape HTML entities.
     
     Version 2.1.3
     =============
    diff --git a/user_guide_src/source/helpers/form_helper.rst b/user_guide_src/source/helpers/form_helper.rst
    index fa7b3dbf915..015bf11626a 100644
    --- a/user_guide_src/source/helpers/form_helper.rst
    +++ b/user_guide_src/source/helpers/form_helper.rst
    @@ -463,29 +463,6 @@ the tag. For example
     	echo form_close($string);
     	// Would produce:   
     
    -form_prep()
    -===========
    -
    -Allows you to safely use HTML and characters such as quotes within form
    -elements without breaking out of the form. Consider this example
    -
    -::
    -
    -	$string = 'Here is a string containing "quoted" text.';
    -	
    -
    -Since the above string contains a set of quotes it will cause the form
    -to break. The `form_prep()` function converts HTML so that it can be used
    -safely
    -
    -::
    -
    -	
    -
    -.. note:: If you use any of the form helper functions listed in this page the form
    -	values will be prepped automatically, so there is no need to call this
    -	function. Use it only if you are creating your own form elements.
    -
     set_value()
     ===========
     
    @@ -546,4 +523,26 @@ This function is identical to the **set_checkbox()** function above.
     .. note:: If you are using the Form Validation class, you must always specify a rule for your field,
     	even if empty, in order for the set_*() functions to work. This is because if a Form Validation object
     	is defined, the control for set_*() is handed over to a method of the class instead of the generic helper
    -	function.
    \ No newline at end of file
    +	function.
    +
    +Escaping field values
    +=====================
    +
    +You may need to use HTML and characters such as quotes within form
    +elements. In order to do that safely, you'll need to use
    +:doc:`common function <../general/common_functions>` ``html_escape()``.
    +
    +Consider the following example::
    +
    +	$string = 'Here is a string containing "quoted" text.';
    +	
    +
    +Since the above string contains a set of quotes it will cause the form
    +to break. The ``html_escape()`` function converts HTML so that it can be
    +used safely::
    +
    +	
    +
    +.. note:: If you use any of the form helper functions listed in this page, the form
    +	values will be prepped automatically, so there is no need to call this
    +	function. Use it only if you are creating your own form elements.
    \ No newline at end of file
    diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst
    index 31a5c0761f6..952108356cc 100644
    --- a/user_guide_src/source/installation/upgrade_300.rst
    +++ b/user_guide_src/source/installation/upgrade_300.rst
    @@ -71,8 +71,24 @@ Step 7: Check the calls to Array Helper's element() and elements() functions
     The default return value of these functions, when the required elements
     don't exist, has been changed from FALSE to NULL.
     
    +**********************************************************
    +Step 8: Change usage of Email library with multiple emails
    +**********************************************************
    +
    +The :doc:`Email library <../libraries/email>` will automatically clear the
    +set parameters after successfully sending emails. To override this behaviour,
    +pass FALSE as the first parameter in the ``send()`` method:
    +
    +::
    +
    +	if ($this->email->send(FALSE))
    + 	{
    + 		// Parameters won't be cleared
    + 	}
    +
    +
     ***************************************************************
    -Step 8: Remove usage of (previously) deprecated functionalities
    +Step 9: Remove usage of (previously) deprecated functionalities
     ***************************************************************
     
     In addition to the ``$autoload['core']`` configuration setting, there's a number of other functionalities
    @@ -115,6 +131,16 @@ File helper read_file()
     PHP's native ``file_get_contents()`` function. It is deprecated and scheduled for removal in
     CodeIgniter 3.1+.
     
    +.. note:: This function is still available, but you're strongly encouraged to remove it's usage sooner
    +	rather than later.
    +
    +Form helper form_prep()
    +=======================
    +
    +:doc:`Form Helper <../helpers/form_helper>` function ``form_prep()`` is now just an alias for
    +:doc:`common function <../general/common_functions>` ``html_escape()`` and it's second argument
    +is ignored. It is deprecated and scheduled for removal in CodeIgniter 3.1+.
    +
     .. note:: This function is still available, but you're strongly encouraged to remove it's usage sooner
     	rather than later.
     
    @@ -154,17 +180,4 @@ As a result of that, the 'anchor_class' setting is now deprecated and scheduled
     CodeIgniter 3.1+.
     
     .. note:: This setting is still available, but you're strongly encouraged to remove its' usage sooner
    -	rather than later.
    -
    -Email library
    -=============
    -
    -The :doc:`Email library <../libraries/email>` will automatically clear the set parameters after successfully sending
    -emails. To override this behaviour, pass FALSE as the first parameter in the ``send()`` function:
    -
    -::
    -
    -	if ($this->email->send(FALSE))
    - 	{
    - 		// Parameters won't be cleared
    - 	}
    +	rather than later.
    \ No newline at end of file
    
    From 582ebcb3b7eebd12605804577710cf73f0362001 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 27 Oct 2012 00:52:15 +0300
    Subject: [PATCH 1771/5397] Fix #142
    
    ---
     system/helpers/form_helper.php      | 20 ++++++++++----------
     user_guide_src/source/changelog.rst |  1 +
     2 files changed, 11 insertions(+), 10 deletions(-)
    
    diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php
    index d81bb7c08e2..a09cb36ddb1 100644
    --- a/system/helpers/form_helper.php
    +++ b/system/helpers/form_helper.php
    @@ -298,10 +298,10 @@ function form_multiselect($name = '', $options = array(), $selected = array(), $
     	/**
     	 * Drop-down Menu
     	 *
    -	 * @param	string
    -	 * @param	array
    -	 * @param	string
    -	 * @param	string
    +	 * @param	mixed	$name = ''
    +	 * @param	mixed	$options = array()
    +	 * @param	mixed	$selected = array()
    +	 * @param	mixed	$extra = array()
     	 * @return	string
     	 */
     	function form_dropdown($name = '', $options = array(), $selected = array(), $extra = '')
    @@ -316,10 +316,7 @@ function form_dropdown($name = '', $options = array(), $selected = array(), $ext
     			return form_dropdown($name['name'], $name['options'], $name['selected'], $name['extra']);
     		}
     
    -		if ( ! is_array($selected))
    -		{
    -			$selected = array($selected);
    -		}
    +		is_array($selected) OR $selected = array($selected);
     
     		// If no selected state was submitted we will attempt to set it automatically
     		if (count($selected) === 0 && isset($_POST[$name]))
    @@ -352,14 +349,17 @@ function form_dropdown($name = '', $options = array(), $selected = array(), $ext
     				foreach ($val as $optgroup_key => $optgroup_val)
     				{
     					$sel = in_array($optgroup_key, $selected) ? ' selected="selected"' : '';
    -					$form .= '\n";
    +					$form .= '\n";
     				}
     
     				$form .= "\n";
     			}
     			else
     			{
    -				$form .= '\n";
    +				$form .= '\n";
     			}
     		}
     
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 54338f3ee7c..5b24dc2768a 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -390,6 +390,7 @@ Bug fixes for 3.0
     -  Fixed a bug (#59) - :doc:`Query Builder ` method ``count_all_results()`` ignored the DISTINCT clause.
     -  Fixed a bug (#1624) - :doc:`Form Validation Library ` rule **matches** didn't property handle array field names.
     -  Fixed a bug (#1630) - :doc:`Form Helper ` function ``set_value()`` didn't escape HTML entities.
    +-  Fixed a bug (#142) - :doc:`Form Helper ` function ``form_dropdown()`` didn't escape HTML entities in option values.
     
     Version 2.1.3
     =============
    
    From 29d909d5d1a14efc2e316650946bf43ddf03f1fd Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 27 Oct 2012 01:05:09 +0300
    Subject: [PATCH 1772/5397] [ci skip] Update docblocks for deprecated functions
    
    ---
     system/helpers/date_helper.php     | 17 +++++++----------
     system/helpers/file_helper.php     | 10 ++++------
     system/helpers/form_helper.php     |  1 +
     system/helpers/security_helper.php | 10 ++++------
     4 files changed, 16 insertions(+), 22 deletions(-)
    
    diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php
    index 51b2b76db3e..5d9251526a5 100644
    --- a/system/helpers/date_helper.php
    +++ b/system/helpers/date_helper.php
    @@ -119,19 +119,16 @@ function mdate($datestr = '', $time = '')
     	 *
     	 * As of PHP 5.2, the DateTime extension provides constants that
     	 * serve for the exact same purpose and are used with date().
    -	 * Due to that, this function is DEPRECATED and should be removed
    -	 * in CodeIgniter 3.1+.
     	 *
    -	 * Here are two examples of how you should replace it:
    +	 * @todo	Remove in version 3.1+.
    +	 * @deprecated	3.0.0	Use PHP's native date() instead.
    +	 * @link	http://www.php.net/manual/en/class.datetime.php#datetime.constants.types
     	 *
    -	 *	date(DATE_RFC822, now()); // default
    -	 *	date(DATE_W3C, $time); // a different format and time
    +	 * @example	date(DATE_RFC822, now()); // default
    +	 * @example	date(DATE_W3C, $time); // a different format and time
     	 *
    -	 * Reference: http://www.php.net/manual/en/class.datetime.php#datetime.constants.types
    -	 *
    -	 * @deprecated
    -	 * @param	string	the chosen format
    -	 * @param	int	Unix timestamp
    +	 * @param	string	$fmt = 'DATE_RFC822'	the chosen format
    +	 * @param	int	$time = NULL		Unix timestamp
     	 * @return	string
     	 */
     	function standard_date($fmt = 'DATE_RFC822', $time = NULL)
    diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php
    index 441345b0597..8f23a3d548f 100644
    --- a/system/helpers/file_helper.php
    +++ b/system/helpers/file_helper.php
    @@ -44,12 +44,10 @@
     	 *
     	 * Opens the file specfied in the path and returns it as a string.
     	 *
    -	 * This function is DEPRECATED and should be removed in
    -	 * CodeIgniter 3.1+. Use file_get_contents() instead.
    -	 *
    -	 * @deprecated
    -	 * @param	string	path to file
    -	 * @return	string
    +	 * @todo	Remove in version 3.1+.
    +	 * @deprecated	3.0.0	It is now just an alias for PHP's native file_get_contents().
    +	 * @param	string	$file	Path to file
    +	 * @return	string	File contents
     	 */
     	function read_file($file)
     	{
    diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php
    index a09cb36ddb1..622622c0ee8 100644
    --- a/system/helpers/form_helper.php
    +++ b/system/helpers/form_helper.php
    @@ -600,6 +600,7 @@ function form_close($extra = '')
     	 *
     	 * Formats text so that it can be safely placed in a form field in the event it has HTML tags.
     	 *
    +	 * @todo	Remove in version 3.1+.
     	 * @deprecated	3.0.0	This function has been broken for a long time
     	 *			and is now just an alias for html_escape(). It's
     	 *			second argument is ignored.
    diff --git a/system/helpers/security_helper.php b/system/helpers/security_helper.php
    index 5ecc960bcef..8bbd06684e7 100644
    --- a/system/helpers/security_helper.php
    +++ b/system/helpers/security_helper.php
    @@ -77,12 +77,10 @@ function sanitize_filename($filename)
     	/**
     	 * Hash encode a string
     	 *
    -	 * This function is DEPRECATED and should be removed in
    -	 * CodeIgniter 3.1+. Use hash() instead.
    -	 *
    -	 * @deprecated
    -	 * @param	string
    -	 * @param	string
    +	 * @todo	Remove in version 3.1+.
    +	 * @deprecated	3.0.0	Use PHP's native hash() instead.
    +	 * @param	string	$str
    +	 * @param	string	$type = 'sha1'
     	 * @return	string
     	 */
     	function do_hash($str, $type = 'sha1')
    
    From b8f9a15a156a74f788c04b463304cf310ce8ba80 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 27 Oct 2012 01:36:51 +0300
    Subject: [PATCH 1773/5397] Unify Email attachment values into a single array
     and fix a bug in the new buffer attachment feature
    
    ---
     system/libraries/Email.php | 36 ++++++++++++++++++------------------
     1 file changed, 18 insertions(+), 18 deletions(-)
    
    diff --git a/system/libraries/Email.php b/system/libraries/Email.php
    index 83b442f5809..9207fc9f0b2 100644
    --- a/system/libraries/Email.php
    +++ b/system/libraries/Email.php
    @@ -81,9 +81,7 @@ class CI_Email {
     	protected $_cc_array		= array();
     	protected $_bcc_array		= array();
     	protected $_headers		= array();
    -	protected $_attach_name		= array();
    -	protected $_attach_type		= array();
    -	protected $_attach_disp		= array();
    +	protected $_attachments		= array();
     	protected $_protocols		= array('mail', 'sendmail', 'smtp');
     	protected $_base_charsets	= array('us-ascii', 'iso-2022-');	// 7-bit charsets (excluding language suffix)
     	protected $_bit_depths		= array('7bit', '8bit');
    @@ -176,9 +174,7 @@ public function clear($clear_attachments = FALSE)
     
     		if ($clear_attachments !== FALSE)
     		{
    -			$this->_attach_name = array();
    -			$this->_attach_type = array();
    -			$this->_attach_disp = array();
    +			$this->_attachments = array();
     		}
     
     		return $this;
    @@ -415,9 +411,12 @@ public function message($body)
     	 */
     	public function attach($filename, $disposition = '', $newname = NULL, $mime = '')
     	{
    -		$this->_attach_name[] = array($filename, $newname);
    -		$this->_attach_disp[] = empty($disposition) ? 'attachment' : $disposition; // Can also be 'inline'  Not sure if it matters
    -		$this->_attach_type[] = $mime;
    +		$this->_attachments[] = array(
    +			'name'		=> array($filename, $newname),
    +			'disposition'	=> empty($disposition) ? 'attachment' : $disposition,  // Can also be 'inline'  Not sure if it matters
    +			'type' 		=> $mime
    +		);
    +
     		return $this;
     	}
     
    @@ -635,9 +634,9 @@ protected function _get_content_type()
     	{
     		if ($this->mailtype === 'html')
     		{
    -			return (count($this->_attach_name) === 0) ? 'html' : 'html-attach';
    +			return (count($this->_attachments) === 0) ? 'html' : 'html-attach';
     		}
    -		elseif	($this->mailtype === 'text' && count($this->_attach_name) > 0)
    +		elseif	($this->mailtype === 'text' && count($this->_attachments) > 0)
     		{
     			return 'plain-attach';
     		}
    @@ -1045,14 +1044,15 @@ protected function _build_message()
     		}
     
     		$attachment = array();
    -		for ($i = 0, $c = count($this->_attach_name), $z = 0; $i < $c; $i++)
    +		for ($i = 0, $c = count($this->_attachments), $z = 0; $i < $c; $i++)
     		{
    -			$filename = $this->_attach_name[$i][0];
    -			$basename = is_null($this->_attach_name[$i][1]) ? basename($filename) : $this->_attach_name[$i][1];
    -			$ctype = $this->_attach_type[$i];
    +			$filename = $this->_attachments[$i]['name'][0];
    +			$basename = is_null($this->_attachments[$i]['name'][1])
    +				? basename($filename) : $this->_attachments[$i]['name'][1];
    +			$ctype = $this->_attachments[$i]['type'];
     			$file_content = '';
     
    -			if ($this->_attach_type[$i] === '')
    +			if ($ctype === '')
     			{
     				if ( ! file_exists($filename))
     				{
    @@ -1074,13 +1074,13 @@ protected function _build_message()
     			}
     			else
     			{
    -				$file_content =& $this->_attach_content[$i];
    +				$file_content =& $this->_attachments[$i]['name'][0];
     			}
     
     			$attachment[$z++] = '--'.$this->_atc_boundary.$this->newline
     				.'Content-type: '.$ctype.'; '
     				.'name="'.$basename.'"'.$this->newline
    -				.'Content-Disposition: '.$this->_attach_disp[$i].';'.$this->newline
    +				.'Content-Disposition: '.$this->_attachments[$i]['disposition'].';'.$this->newline
     				.'Content-Transfer-Encoding: base64'.$this->newline;
     
     			$attachment[$z++] = chunk_split(base64_encode($file_content));
    
    From ca20d8445312e49e1e974c5ed8cf04400929e615 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 27 Oct 2012 03:02:38 +0300
    Subject: [PATCH 1774/5397] Fix #50
    
    ---
     system/libraries/Session/drivers/Session_cookie.php | 5 +----
     user_guide_src/source/changelog.rst                 | 1 +
     2 files changed, 2 insertions(+), 4 deletions(-)
    
    diff --git a/system/libraries/Session/drivers/Session_cookie.php b/system/libraries/Session/drivers/Session_cookie.php
    index 8617aec2dbf..2f1bf353148 100755
    --- a/system/libraries/Session/drivers/Session_cookie.php
    +++ b/system/libraries/Session/drivers/Session_cookie.php
    @@ -223,9 +223,6 @@ protected function initialize()
     			show_error('In order to use the Cookie Session driver you are required to set an encryption key in your config file.');
     		}
     
    -		// Load the string helper so we can use the strip_slashes() function
    -		$this->CI->load->helper('string');
    -
     		// Do we need encryption? If so, load the encryption class
     		if ($this->sess_encrypt_cookie === TRUE)
     		{
    @@ -755,7 +752,7 @@ protected function _escape_slashes(&$val, $key)
     	 */
     	protected function _unserialize($data)
     	{
    -		$data = @unserialize(strip_slashes(trim($data)));
    +		$data = @unserialize(trim($data));
     
     		if (is_array($data))
     		{
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 5b24dc2768a..59a3a1ff333 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -391,6 +391,7 @@ Bug fixes for 3.0
     -  Fixed a bug (#1624) - :doc:`Form Validation Library ` rule **matches** didn't property handle array field names.
     -  Fixed a bug (#1630) - :doc:`Form Helper ` function ``set_value()`` didn't escape HTML entities.
     -  Fixed a bug (#142) - :doc:`Form Helper ` function ``form_dropdown()`` didn't escape HTML entities in option values.
    +-  Fixed a bug (#50) - :doc:`Session Library ` unnecessarily stripped slashed from serialized data, making it impossible to read objects in a namespace.
     
     Version 2.1.3
     =============
    
    From 485a348a7a633d38f69a963e9f77e23077f75d11 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 27 Oct 2012 03:22:43 +0300
    Subject: [PATCH 1775/5397] Add database schema configuration support (used by
     PostgreSQL, fix #158)
    
    ---
     system/database/drivers/odbc/odbc_driver.php        | 13 +++++++++----
     .../drivers/pdo/subdrivers/pdo_odbc_driver.php      |  9 +++++++--
     .../drivers/pdo/subdrivers/pdo_pgsql_driver.php     |  9 +++++++--
     system/database/drivers/postgre/postgre_driver.php  |  9 +++++++--
     user_guide_src/source/changelog.rst                 |  3 ++-
     user_guide_src/source/database/configuration.rst    |  1 +
     6 files changed, 33 insertions(+), 11 deletions(-)
    
    diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php
    index 063a04b98b1..37f7a28d3d7 100644
    --- a/system/database/drivers/odbc/odbc_driver.php
    +++ b/system/database/drivers/odbc/odbc_driver.php
    @@ -49,6 +49,11 @@ class CI_DB_odbc_driver extends CI_DB {
     
     	protected $_random_keyword;
     
    +	/**
    +	 * @var	string Database schema
    +	 */
    +	public $schema = 'public';
    +
     	/**
     	 * Constructor
     	 *
    @@ -234,17 +239,17 @@ public function insert_id()
     	 *
     	 * Generates a platform-specific query string so that the table names can be fetched
     	 *
    -	 * @param	bool
    +	 * @param	bool	$prefix_limit = FALSE
     	 * @return	string
     	 */
     	protected function _list_tables($prefix_limit = FALSE)
     	{
    -		$sql = 'SHOW TABLES FROM '.$this->database;
    +		$sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'";
     
     		if ($prefix_limit !== FALSE && $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." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' "
    +				.sprintf($this->_like_escape_str, $this->_like_escape_chr);
     		}
     
     		return $sql;
    diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php
    index 5944d55f494..3be7e3c7060 100644
    --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php
    +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php
    @@ -50,6 +50,11 @@ class CI_DB_pdo_odbc_driver extends CI_DB_pdo_driver {
     
     	protected $_random_keyword = ' RAND()';
     
    +	/**
    +	 * @var	string Database schema
    +	 */
    +	public $schema = 'public';
    +
     	/**
     	 * Constructor
     	 *
    @@ -122,12 +127,12 @@ public function __construct($params)
     	 *
     	 * Generates a platform-specific query string so that the table names can be fetched
     	 *
    -	 * @param	bool
    +	 * @param	bool	$prefix_limit = FALSE
     	 * @return	string
     	 */
     	protected function _list_tables($prefix_limit = FALSE)
     	{
    -		$sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'";
    +		$sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'";
     
     		if ($prefix_limit !== FALSE && $this->dbprefix !== '')
     		{
    diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php
    index 74d56e6b8e8..3efc45a2d8b 100644
    --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php
    +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php
    @@ -44,6 +44,11 @@ class CI_DB_pdo_pgsql_driver extends CI_DB_pdo_driver {
     
     	protected $_random_keyword = ' RANDOM()';
     
    +	/**
    +	 * @var	string Database schema
    +	 */
    +	public $schema = 'public';
    +
     	/**
     	 * Constructor
     	 *
    @@ -92,12 +97,12 @@ public function insert_id($name = NULL)
     	 *
     	 * Generates a platform-specific query string so that the table names can be fetched
     	 *
    -	 * @param	bool
    +	 * @param	bool	$prefix_limit = FALSE
     	 * @return	string
     	 */
     	protected function _list_tables($prefix_limit = FALSE)
     	{
    -		$sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \'public\'';
    +		$sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'";
     
     		if ($prefix_limit === TRUE && $this->dbprefix !== '')
     		{
    diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php
    index 1b947492097..91d9a238592 100644
    --- a/system/database/drivers/postgre/postgre_driver.php
    +++ b/system/database/drivers/postgre/postgre_driver.php
    @@ -46,6 +46,11 @@ class CI_DB_postgre_driver extends CI_DB {
     
     	protected $_random_keyword = ' RANDOM()'; // database specific random keyword
     
    +	/**
    +	 * @var	string Database schema
    +	 */
    +	public $schema = 'public';
    +
     	/**
     	 * Constructor
     	 *
    @@ -393,12 +398,12 @@ public function insert_id()
     	 *
     	 * Generates a platform-specific query string so that the table names can be fetched
     	 *
    -	 * @param	bool
    +	 * @param	bool	$prefix_limit = FALSE
     	 * @return	string
     	 */
     	protected function _list_tables($prefix_limit = FALSE)
     	{
    -		$sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \'public\'';
    +		$sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'";
     
     		if ($prefix_limit !== FALSE && $this->dbprefix !== '')
     		{
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 59a3a1ff333..c373459337d 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -103,7 +103,8 @@ Release Date: Not Released
     	 - Server version checking is now done via ``mysqli::$server_info`` instead of running an SQL query.
     	 - Added persistent connections support for PHP >= 5.3.
     	 - Added support for ``backup()`` in :doc:`Database Utilities `.
    -   -  Added *dsn* configuration setting for drivers that support DSN strings (PDO, PostgreSQL, Oracle, ODBC, CUBRID).
    +   -  Added **dsn** configuration setting for drivers that support DSN strings (PDO, PostgreSQL, Oracle, ODBC, CUBRID).
    +   -  Added **schema** configuration setting (defaults to *public*) for drivers that might need it (currently used by PostgreSQL and ODBC).
        -  Improved PDO database support.
        -  Added Interbase/Firebird database support via the *ibase* driver.
        -  Added an optional database name parameter to ``db_select()``.
    diff --git a/user_guide_src/source/database/configuration.rst b/user_guide_src/source/database/configuration.rst
    index 66849632406..34cefffbdb6 100644
    --- a/user_guide_src/source/database/configuration.rst
    +++ b/user_guide_src/source/database/configuration.rst
    @@ -182,6 +182,7 @@ Explanation of Values:
     			customizable by the end user.
     **autoinit**		Whether or not to automatically connect to the database when the library loads. If set to false,
     			the connection will take place prior to executing the first query.
    +**schema**		The database schema, defaults to 'public'. Used by PostgreSQL and ODBC drivers.
     **encrypt**		Whether or not to use an encrypted connection.
     **compress**		Whether or not to use client compression (MySQL only).
     **stricton**		TRUE/FALSE (boolean) - Whether to force "Strict Mode" connections, good for ensuring strict SQL
    
    From 7d753464d13f3a3326a1679226127570cc0c498f Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 27 Oct 2012 03:37:40 +0300
    Subject: [PATCH 1776/5397] [ci skip] Optimize ascii_to_entities()
    
    ---
     system/helpers/text_helper.php | 11 ++++-------
     1 file changed, 4 insertions(+), 7 deletions(-)
    
    diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php
    index 016a36c57bd..89602fc2873 100644
    --- a/system/helpers/text_helper.php
    +++ b/system/helpers/text_helper.php
    @@ -118,18 +118,15 @@ function character_limiter($str, $n = 500, $end_char = '…')
     	/**
     	 * High ASCII to Entities
     	 *
    -	 * Converts High ascii text and MS Word special characters to character entities
    +	 * Converts high ASCII text and MS Word special characters to character entities
     	 *
    -	 * @param	string
    +	 * @param	string	$str
     	 * @return	string
     	 */
     	function ascii_to_entities($str)
     	{
    -		$count	= 1;
    -		$out	= '';
    -		$temp	= array();
    -
    -		for ($i = 0, $s = strlen($str); $i < $s; $i++)
    +		$out = '';
    +		for ($i = 0, $s = strlen($str), $count = 1, $temp = array(); $i < $s; $i++)
     		{
     			$ordinal = ord($str[$i]);
     
    
    From 3e9d2b8ae82948de3c83bd5a50151949f6e6ca90 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 27 Oct 2012 14:28:51 +0300
    Subject: [PATCH 1777/5397] Docblock improvements
    
    ---
     system/core/Benchmark.php                     | 32 +++++----
     system/core/Controller.php                    | 11 +--
     system/core/Exceptions.php                    | 48 ++++++-------
     system/core/Hooks.php                         | 68 +++++++------------
     system/core/Lang.php                          | 27 ++++----
     system/core/Model.php                         | 10 +--
     system/core/Utf8.php                          | 26 +++----
     system/database/drivers/odbc/odbc_driver.php  |  4 +-
     .../pdo/subdrivers/pdo_odbc_driver.php        |  4 +-
     .../pdo/subdrivers/pdo_pgsql_driver.php       |  4 +-
     .../drivers/postgre/postgre_driver.php        |  4 +-
     system/libraries/Calendar.php                 |  8 ++-
     12 files changed, 125 insertions(+), 121 deletions(-)
    
    diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php
    index 2fabdf46e98..f94db2721d5 100644
    --- a/system/core/Benchmark.php
    +++ b/system/core/Benchmark.php
    @@ -26,7 +26,7 @@
      */
     
     /**
    - * CodeIgniter Benchmark Class
    + * Benchmark Class
      *
      * This class enables you to mark points and calculate the time difference
      * between them. Memory consumption can also be displayed.
    @@ -40,21 +40,19 @@
     class CI_Benchmark {
     
     	/**
    -	 * List of all benchmark markers and when they were added
    +	 * List of all benchmark markers
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
    -	public $marker =	array();
    -
    -	// --------------------------------------------------------------------
    +	public $marker = array();
     
     	/**
     	 * Set a benchmark marker
     	 *
     	 * Multiple calls to this function can be made so that several
    -	 * execution points can be timed
    +	 * execution points can be timed.
     	 *
    -	 * @param	string	$name	name of the marker
    +	 * @param	string	$name	Marker name
     	 * @return	void
     	 */
     	public function mark($name)
    @@ -65,6 +63,8 @@ public function mark($name)
     	// --------------------------------------------------------------------
     
     	/**
    +	 * Elapsed time
    +	 *
     	 * Calculates the time difference between two marked points.
     	 *
     	 * If the first parameter is empty this function instead returns the
    @@ -72,10 +72,13 @@ public function mark($name)
     	 * execution time to be shown in a template. The output class will
     	 * swap the real value for this variable.
     	 *
    -	 * @param	string	a particular marked point
    -	 * @param	string	a particular marked point
    -	 * @param	integer	the number of decimal places
    -	 * @return	mixed
    +	 * @param	string	$point1		A particular marked point
    +	 * @param	string	$point2		A particular marked point
    +	 * @param	int	$decimals	Number of decimal places
    +	 *
    +	 * @return	string	Calculated elapsed time on success,
    +	 *			an '{elapsed_string}' if $point1 is empty
    +	 *			or an empty string if $point1 is not found.
     	 */
     	public function elapsed_time($point1 = '', $point2 = '', $decimals = 4)
     	{
    @@ -102,12 +105,13 @@ public function elapsed_time($point1 = '', $point2 = '', $decimals = 4)
     	/**
     	 * Memory Usage
     	 *
    -	 * This function returns the {memory_usage} pseudo-variable.
    +	 * Simply returns the {memory_usage} marker.
    +	 *
     	 * 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.
     	 *
    -	 * @return	string
    +	 * @return	string	'{memory_usage}'
     	 */
     	public function memory_usage()
     	{
    diff --git a/system/core/Controller.php b/system/core/Controller.php
    index 9196958aecf..8c2ba893e85 100644
    --- a/system/core/Controller.php
    +++ b/system/core/Controller.php
    @@ -26,7 +26,7 @@
      */
     
     /**
    - * CodeIgniter Application Controller Class
    + * Application Controller Class
      *
      * This class object is the super class that every library in
      * CodeIgniter will be assigned to.
    @@ -40,15 +40,14 @@
     class CI_Controller {
     
     	/**
    -	 * Reference to the global CI instance
    +	 * Reference to the CI singleton
     	 *
    -	 * @static
     	 * @var	object
     	 */
     	private static $instance;
     
     	/**
    -	 * Set up controller properties and methods
    +	 * Class constructor
     	 *
     	 * @return	void
     	 */
    @@ -69,8 +68,10 @@ public function __construct()
     		log_message('debug', 'Controller Class Initialized');
     	}
     
    +	// --------------------------------------------------------------------
    +
     	/**
    -	 * Return the CI object
    +	 * Get the CI singleton
     	 *
     	 * @static
     	 * @return	object
    diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php
    index bd9178dbd21..c0caf2e7dda 100644
    --- a/system/core/Exceptions.php
    +++ b/system/core/Exceptions.php
    @@ -64,7 +64,7 @@ class CI_Exceptions {
     	);
     
     	/**
    -	 * Initialize execption class
    +	 * Class constructor
     	 *
     	 * @return	void
     	 */
    @@ -79,12 +79,12 @@ public function __construct()
     	/**
     	 * Exception Logger
     	 *
    -	 * This function logs PHP generated error messages
    +	 * Logs PHP generated error messages
     	 *
    -	 * @param	string	the error severity
    -	 * @param	string	the error string
    -	 * @param	string	the error filepath
    -	 * @param	string	the error line number
    +	 * @param	int	$severity	Log level
    +	 * @param	string	$message	Error message
    +	 * @param	string	$filepath	File path
    +	 * @param	int	$line		Line number
     	 * @return	void
     	 */
     	public function log_exception($severity, $message, $filepath, $line)
    @@ -96,11 +96,13 @@ public function log_exception($severity, $message, $filepath, $line)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * 404 Page Not Found Handler
    +	 * 404 Error Handler
     	 *
    -	 * @param	string	the page
    -	 * @param 	bool	log error yes/no
    -	 * @return	string
    +	 * @uses	CI_Exceptions::show_error()
    +	 *
    +	 * @param	string	$page		Page URI
    +	 * @param 	bool	$log_error	Whether to log the error
    +	 * @return	void
     	 */
     	public function show_404($page = '', $log_error = TRUE)
     	{
    @@ -122,15 +124,15 @@ public function show_404($page = '', $log_error = TRUE)
     	/**
     	 * 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.
    +	 * Takes an error message as input (either as a string or an array)
    +	 * and displays it using the specified template.
    +	 *
    +	 * @param	string		$heading	Page heading
    +	 * @param	string|string[]	$message	Error message
    +	 * @param	string		$template	Template name
    +	 * @param 	int		$statis_code	(default: 500)
     	 *
    -	 * @param	string	the heading
    -	 * @param	string	the message
    -	 * @param	string	the template name
    -	 * @param 	int	the status code
    -	 * @return	string
    +	 * @return	string	Error page output
     	 */
     	public function show_error($heading, $message, $template = 'error_general', $status_code = 500)
     	{
    @@ -154,11 +156,11 @@ public function show_error($heading, $message, $template = 'error_general', $sta
     	/**
     	 * Native PHP error handler
     	 *
    -	 * @param	string	the error severity
    -	 * @param	string	the error string
    -	 * @param	string	the error filepath
    -	 * @param	string	the error line number
    -	 * @return	string
    +	 * @param	int	$severity	Error level
    +	 * @param	string	$message	Error message
    +	 * @param	string	$filepath	File path
    +	 * @param	int	$line		Line number
    +	 * @return	string	Error page output
     	 */
     	public function show_php_error($severity, $message, $filepath, $line)
     	{
    diff --git a/system/core/Hooks.php b/system/core/Hooks.php
    index afbf4b45372..d60e9ac5df6 100644
    --- a/system/core/Hooks.php
    +++ b/system/core/Hooks.php
    @@ -26,7 +26,7 @@
      */
     
     /**
    - * CodeIgniter Hooks Class
    + * Hooks Class
      *
      * Provides a mechanism to extend the base system without hacking.
      *
    @@ -41,26 +41,28 @@ class CI_Hooks {
     	/**
     	 * Determines whether hooks are enabled
     	 *
    -	 * @var bool
    +	 * @var	bool
     	 */
    -	public $enabled =	FALSE;
    +	public $enabled = FALSE;
     
     	/**
     	 * List of all hooks set in config/hooks.php
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	public $hooks =	array();
     
     	/**
    +	 * In progress flag
    +	 *
     	 * Determines whether hook is in progress, used to prevent infinte loops
     	 *
    -	 * @var bool
    +	 * @var	bool
     	 */
    -	public $in_progress	=	FALSE;
    +	protected $_in_progress = FALSE;
     
     	/**
    -	 * Initialize the Hooks Preferences
    +	 * Class constructor
     	 *
     	 * @return	void
     	 */
    @@ -104,8 +106,10 @@ public function __construct()
     	 *
     	 * Calls a particular hook. Called by CodeIgniter.php.
     	 *
    -	 * @param	string	the hook name
    -	 * @return	mixed
    +	 * @uses	CI_Hooks::_run_hook()
    +	 *
    +	 * @param	string	$which	Hook name
    +	 * @return	bool	TRUE on success or FALSE on failure
     	 */
     	public function call_hook($which = '')
     	{
    @@ -136,8 +140,8 @@ public function call_hook($which = '')
     	 *
     	 * Runs a particular hook
     	 *
    -	 * @param	array	the hook details
    -	 * @return	bool
    +	 * @param	array	$data	Hook details
    +	 * @return	bool	TRUE on success or FALSE on failure
     	 */
     	protected function _run_hook($data)
     	{
    @@ -152,7 +156,7 @@ protected function _run_hook($data)
     
     		// If the script being called happens to have the same
     		// hook call within it a loop can happen
    -		if ($this->in_progress === TRUE)
    +		if ($this->_in_progress === TRUE)
     		{
     			return;
     		}
    @@ -173,44 +177,20 @@ protected function _run_hook($data)
     			return FALSE;
     		}
     
    -		// -----------------------------------
    -		// Set class/function name
    -		// -----------------------------------
    -
    -		$class		= FALSE;
    -		$function	= FALSE;
    -		$params		= '';
    -
    -		if ( ! empty($data['class']))
    -		{
    -			$class = $data['class'];
    -		}
    -
    -		if ( ! empty($data['function']))
    -		{
    -			$function = $data['function'];
    -		}
    -
    -		if (isset($data['params']))
    -		{
    -			$params = $data['params'];
    -		}
    +		// Determine and class and/or function names
    +		$class		= empty($data['class']) ? FALSE : $data['class'];
    +		$function	= empty($data['function']) ? FALSE : $data['function'];
    +		$params		= isset($data['params']) ? $data['params'] : '';
     
     		if ($class === FALSE && $function === FALSE)
     		{
     			return FALSE;
     		}
     
    -		// -----------------------------------
    -		// Set the in_progress flag
    -		// -----------------------------------
    -
    -		$this->in_progress = TRUE;
    +		// Set the _in_progress flag
    +		$this->_in_progress = TRUE;
     
    -		// -----------------------------------
     		// Call the requested class and/or function
    -		// -----------------------------------
    -
     		if ($class !== FALSE)
     		{
     			if ( ! class_exists($class))
    @@ -218,7 +198,7 @@ protected function _run_hook($data)
     				require($filepath);
     			}
     
    -			$HOOK = new $class;
    +			$HOOK = new $class();
     			$HOOK->$function($params);
     		}
     		else
    @@ -231,7 +211,7 @@ protected function _run_hook($data)
     			$function($params);
     		}
     
    -		$this->in_progress = FALSE;
    +		$this->_in_progress = FALSE;
     		return TRUE;
     	}
     
    diff --git a/system/core/Lang.php b/system/core/Lang.php
    index 601348aa4bc..e74304dd917 100644
    --- a/system/core/Lang.php
    +++ b/system/core/Lang.php
    @@ -39,19 +39,19 @@ class CI_Lang {
     	/**
     	 * List of translations
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	public $language =	array();
     
     	/**
     	 * List of loaded language files
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	public $is_loaded =	array();
     
     	/**
    -	 * Initialize language class
    +	 * Class constructor
     	 *
     	 * @return	void
     	 */
    @@ -65,12 +65,13 @@ public function __construct()
     	/**
     	 * Load a language file
     	 *
    -	 * @param	mixed	$langile		the name of the language file to be loaded
    -	 * @param	string	$idiom = ''		the language (english, etc.)
    -	 * @param	bool	$return = FALSE		return loaded array of translations
    -	 * @param 	bool	$add_suffix = TRUE	add suffix to $langfile
    -	 * @param 	string	$alt_path = ''		alternative path to look for language file
    -	 * @return	mixed
    +	 * @param	mixed	$langfile	Language file name
    +	 * @param	string	$idiom		Language name (english, etc.)
    +	 * @param	bool	$return		Whether to return the loaded array of translations
    +	 * @param 	bool	$add_suffix	Whether to add suffix to $langfile
    +	 * @param 	string	$alt_path	Alternative path to look for the language file
    +	 *
    +	 * @return	void|string[]	Array containing translations, if $return is set to TRUE
     	 */
     	public function load($langfile, $idiom = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '')
     	{
    @@ -146,10 +147,12 @@ public function load($langfile, $idiom = '', $return = FALSE, $add_suffix = TRUE
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Fetch a single line of text from the language array
    +	 * Language line
    +	 *
    +	 * Fetches a single line of text from the language array
     	 *
    -	 * @param	string	$line	the language line
    -	 * @return	string
    +	 * @param	string	$line	Language line key
    +	 * @return	string	Translation
     	 */
     	public function line($line = '')
     	{
    diff --git a/system/core/Model.php b/system/core/Model.php
    index 9bc9f879f46..5a87ab1530b 100644
    --- a/system/core/Model.php
    +++ b/system/core/Model.php
    @@ -26,7 +26,7 @@
      */
     
     /**
    - * CodeIgniter Model Class
    + * Model Class
      *
      * @package		CodeIgniter
      * @subpackage	Libraries
    @@ -37,7 +37,7 @@
     class CI_Model {
     
     	/**
    -	 * Initialize CI_Model Class
    +	 * Class constructor
     	 *
     	 * @return	void
     	 */
    @@ -46,13 +46,15 @@ public function __construct()
     		log_message('debug', 'Model Class Initialized');
     	}
     
    +	// --------------------------------------------------------------------
    +
     	/**
    -	 * __get
    +	 * __get magic
     	 *
     	 * Allows models to access CI's loaded classes using the same
     	 * syntax as controllers.
     	 *
    -	 * @param	string
    +	 * @param	string	$key
     	 */
     	public function __get($key)
     	{
    diff --git a/system/core/Utf8.php b/system/core/Utf8.php
    index 1ff02981bb2..bc7afed910b 100644
    --- a/system/core/Utf8.php
    +++ b/system/core/Utf8.php
    @@ -39,9 +39,9 @@
     class CI_Utf8 {
     
     	/**
    -	 * Constructor
    +	 * Class constructor
     	 *
    -	 * Determines if UTF-8 support is to be enabled
    +	 * Determines if UTF-8 support is to be enabled.
     	 *
     	 * @return	void
     	 */
    @@ -87,9 +87,11 @@ public function __construct()
     	/**
     	 * Clean UTF-8 strings
     	 *
    -	 * Ensures strings are UTF-8
    +	 * Ensures strings contain only valid UTF-8 characters.
     	 *
    -	 * @param	string
    +	 * @uses	CI_Utf8::_is_ascii()	Decide whether a conversion is needed
    +	 *
    +	 * @param	string	$str	String to clean
     	 * @return	string
     	 */
     	public function clean_string($str)
    @@ -109,9 +111,9 @@ public function clean_string($str)
     	 *
     	 * Removes all ASCII control characters except horizontal tabs,
     	 * line feeds, and carriage returns, as all others can cause
    -	 * problems in XML
    +	 * problems in XML.
     	 *
    -	 * @param	string
    +	 * @param	string	$str	String to clean
     	 * @return	string
     	 */
     	public function safe_ascii_for_xml($str)
    @@ -124,11 +126,11 @@ public function safe_ascii_for_xml($str)
     	/**
     	 * Convert to UTF-8
     	 *
    -	 * Attempts to convert a string to UTF-8
    +	 * Attempts to convert a string to UTF-8.
     	 *
    -	 * @param	string
    -	 * @param	string	input encoding
    -	 * @return	string
    +	 * @param	string	$str		Input string
    +	 * @param	string	$encoding	Input encoding
    +	 * @return	string	$str encoded in UTF-8 or FALSE on failure
     	 */
     	public function convert_to_utf8($str, $encoding)
     	{
    @@ -149,9 +151,9 @@ public function convert_to_utf8($str, $encoding)
     	/**
     	 * Is ASCII?
     	 *
    -	 * Tests if a string is standard 7-bit ASCII or not
    +	 * Tests if a string is standard 7-bit ASCII or not.
     	 *
    -	 * @param	string
    +	 * @param	string	$str	String to check
     	 * @return	bool
     	 */
     	protected function _is_ascii($str)
    diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php
    index 37f7a28d3d7..f6ea412ad68 100644
    --- a/system/database/drivers/odbc/odbc_driver.php
    +++ b/system/database/drivers/odbc/odbc_driver.php
    @@ -50,7 +50,9 @@ class CI_DB_odbc_driver extends CI_DB {
     	protected $_random_keyword;
     
     	/**
    -	 * @var	string Database schema
    +	 * Database schema
    +	 *
    +	 * @var	string
     	 */
     	public $schema = 'public';
     
    diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php
    index 3be7e3c7060..d64e9fb36cf 100644
    --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php
    +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php
    @@ -51,7 +51,9 @@ class CI_DB_pdo_odbc_driver extends CI_DB_pdo_driver {
     	protected $_random_keyword = ' RAND()';
     
     	/**
    -	 * @var	string Database schema
    +	 * Database schema
    +	 *
    +	 * @var	string
     	 */
     	public $schema = 'public';
     
    diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php
    index 3efc45a2d8b..93674b576c2 100644
    --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php
    +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php
    @@ -45,7 +45,9 @@ class CI_DB_pdo_pgsql_driver extends CI_DB_pdo_driver {
     	protected $_random_keyword = ' RANDOM()';
     
     	/**
    -	 * @var	string Database schema
    +	 * Database schema
    +	 *
    +	 * @var	string
     	 */
     	public $schema = 'public';
     
    diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php
    index 91d9a238592..ca231f6f765 100644
    --- a/system/database/drivers/postgre/postgre_driver.php
    +++ b/system/database/drivers/postgre/postgre_driver.php
    @@ -47,7 +47,9 @@ class CI_DB_postgre_driver extends CI_DB {
     	protected $_random_keyword = ' RANDOM()'; // database specific random keyword
     
     	/**
    -	 * @var	string Database schema
    +	 * Database schema
    +	 *
    +	 * @var	string
     	 */
     	public $schema = 'public';
     
    diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php
    index a49f171b975..95f537e42d0 100644
    --- a/system/libraries/Calendar.php
    +++ b/system/libraries/Calendar.php
    @@ -95,11 +95,13 @@ class CI_Calendar {
     	public $next_prev_url		= '';
     
     	/**
    -	 * Constructor
    +	 * Class constructor
     	 *
    -	 * Loads the calendar language file and sets the default time reference
    +	 * Loads the calendar language file and sets the default time reference.
     	 *
    -	 * @param	array
    +	 * @uses	CI_Lang::$is_loaded
    +	 *
    +	 * @param	array	$config	Calendar options
     	 * @return	void
     	 */
     	public function __construct($config = array())
    
    From 60826db46d3f9ceabcc280c494a975007423e64a Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 27 Oct 2012 14:45:23 +0300
    Subject: [PATCH 1778/5397] Deprecate string helper repeater() (an alias for
     str_repeat())
    
    ---
     system/helpers/string_helper.php                   |  7 +++++--
     user_guide_src/source/changelog.rst                |  1 +
     user_guide_src/source/helpers/string_helper.rst    |  3 +++
     user_guide_src/source/installation/upgrade_300.rst | 10 ++++++++++
     4 files changed, 19 insertions(+), 2 deletions(-)
    
    diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php
    index 4eee2a26248..c5c4934528b 100644
    --- a/system/helpers/string_helper.php
    +++ b/system/helpers/string_helper.php
    @@ -276,8 +276,11 @@ function alternator($args)
     	/**
     	 * Repeater function
     	 *
    -	 * @param	string
    -	 * @param	int	number of repeats
    +	 * @todo	Remove in version 3.1+.
    +	 * @deprecated	3.0.0	This is just an alias for PHP's native str_repeat()
    +	 *
    +	 * @param	string	$data	String to repeat
    +	 * @param	int	$num	Number of repeats
     	 * @return	string
     	 */
     	function repeater($data, $num = 1)
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index c373459337d..e91fafccc73 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -85,6 +85,7 @@ Release Date: Not Released
     	 - Added an optional paramater to ``delete_files()`` to enable it to skip deleting files such as .htaccess and index.html.
     	 - ``read_file()`` is now a deprecated alias of ``file_get_contents()``.
        -  :doc:`Security Helper ` function ``strip_image_tags()`` is now an alias for the same method in the :doc:`Security Library `.
    +   -  Deprecated :doc:`String Helper ` function ``repeater()`` - it's just an alias for PHP's native ``str_repeat()``.
     
     -  Database
     
    diff --git a/user_guide_src/source/helpers/string_helper.rst b/user_guide_src/source/helpers/string_helper.rst
    index 19500aa0dd9..530af2f897f 100644
    --- a/user_guide_src/source/helpers/string_helper.rst
    +++ b/user_guide_src/source/helpers/string_helper.rst
    @@ -96,6 +96,9 @@ Generates repeating copies of the data you submit. Example
     
     The above would generate 30 newlines.
     
    +.. note:: This function is DEPRECATED. Use the native ``str_repeat()``
    +	instead.
    +
     reduce_double_slashes()
     =======================
     
    diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst
    index 952108356cc..dcdd6e3519d 100644
    --- a/user_guide_src/source/installation/upgrade_300.rst
    +++ b/user_guide_src/source/installation/upgrade_300.rst
    @@ -131,6 +131,16 @@ File helper read_file()
     PHP's native ``file_get_contents()`` function. It is deprecated and scheduled for removal in
     CodeIgniter 3.1+.
     
    +.. note:: This function is still available, but you're strongly encouraged to remove it's usage sooner
    +	rather than later.
    +
    +String helper repeater()
    +========================
    +
    +:doc:`String Helper <../helpers/string_helper>` function ``repeater()`` is now just an alias for
    +PHP's native ``str_repeat()`` function. It is deprecated and scheduled for removal in
    +CodeIgniter 3.1+.
    +
     .. note:: This function is still available, but you're strongly encouraged to remove it's usage sooner
     	rather than later.
     
    
    From 5232ba07752ffa783d03754c3a869d9f73ccae69 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 27 Oct 2012 15:25:05 +0300
    Subject: [PATCH 1779/5397] Docblock improvements to the Config library and
     remove CI_Config::_assign_to_config()
    
    Existance of _assign_to_config() is pointless as this method
    consists just of a foreach calling CI_Config::set_item() and
    is only called by CodeIgniter.php - moved that foreach() in
    there instead.
    ---
     system/core/CodeIgniter.php            |  7 ++-
     system/core/Config.php                 | 80 +++++++++++---------------
     system/core/Exceptions.php             |  2 +-
     tests/codeigniter/core/Config_test.php | 25 +-------
     user_guide_src/source/changelog.rst    |  8 ++-
     5 files changed, 47 insertions(+), 75 deletions(-)
    
    diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php
    index f3592eaf9c8..324b4d84912 100644
    --- a/system/core/CodeIgniter.php
    +++ b/system/core/CodeIgniter.php
    @@ -130,9 +130,12 @@
     	$CFG =& load_class('Config', 'core');
     
     	// Do we have any manually set config items in the index.php file?
    -	if (isset($assign_to_config))
    +	if (isset($assign_to_config) && is_array($assign_to_config))
     	{
    -		$CFG->_assign_to_config($assign_to_config);
    +		foreach ($assign_to_config as $key => $value)
    +		{
    +			$CFG->set_item($key, $value);
    +		}
     	}
     
     /*
    diff --git a/system/core/Config.php b/system/core/Config.php
    index e78128c76c6..152e9af68ff 100644
    --- a/system/core/Config.php
    +++ b/system/core/Config.php
    @@ -26,7 +26,7 @@
      */
     
     /**
    - * CodeIgniter Config Class
    + * Config Class
      *
      * This class contains functions that enable config files to be managed
      *
    @@ -41,29 +41,31 @@ class CI_Config {
     	/**
     	 * List of all loaded config values
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	public $config = array();
     
     	/**
     	 * List of all loaded config files
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	public $is_loaded =	array();
     
     	/**
     	 * List of paths to search when trying to load a config file.
    -	 * This must be public as it's used by the Loader class.
     	 *
    -	 * @var array
    +	 * @used-by	CI_Loader	Must be public
    +	 * @var		array
     	 */
     	public $_config_paths =	array(APPPATH);
     
     	/**
    -	 * Constructor
    +	 * Class constructor
     	 *
    -	 * Sets the $config data from the primary config.php file as a class variable
    +	 * Sets the $config data from the primary config.php file as a class variable.
    +	 *
    +	 * @return	void
     	 */
     	public function __construct()
     	{
    @@ -93,10 +95,10 @@ public function __construct()
     	/**
     	 * Load Config File
     	 *
    -	 * @param	string	the config file name
    -	 * @param	bool	if configuration values should be loaded into their own section
    -	 * @param	bool	true if errors should just return false, false if an error message should be displayed
    -	 * @return	bool	if the file was loaded correctly
    +	 * @param	string	$file			Configuration file name
    +	 * @param	bool	$use_sections		Whether configuration values should be loaded into their own section
    +	 * @param	bool	$fail_gracefully	Whether to just return FALSE or display an error message
    +	 * @return	bool	TRUE if the file was loaded correctly or FALSE on failure
     	 */
     	public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
     	{
    @@ -183,9 +185,9 @@ public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE
     	/**
     	 * Fetch a config file item
     	 *
    -	 * @param	string	the config item name
    -	 * @param	string	the index name
    -	 * @return	string
    +	 * @param	string	$item	Config item name
    +	 * @param	string	$index	Index name
    +	 * @return	string|bool	The configuration item or FALSE on failure
     	 */
     	public function item($item, $index = '')
     	{
    @@ -200,10 +202,10 @@ public function item($item, $index = '')
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Fetch a config file item - adds slash after item (if item is not empty)
    +	 * Fetch a config file item with slash appended (if not empty)
     	 *
    -	 * @param	string	the config item name
    -	 * @return	string
    +	 * @param	string		$item	Config item name
    +	 * @return	string|bool	The configuration item or FALSE on failure
     	 */
     	public function slash_item($item)
     	{
    @@ -223,9 +225,12 @@ public function slash_item($item)
     
     	/**
     	 * Site URL
    +	 *
     	 * Returns base_url . index_page [. uri_string]
     	 *
    -	 * @param	mixed	the URI string or an array of segments
    +	 * @uses	CI_Config::_uri_string()
    +	 *
    +	 * @param	string|string[]	$uri	URI string or an array of segments
     	 * @return	string
     	 */
     	public function site_url($uri = '')
    @@ -264,9 +269,12 @@ public function site_url($uri = '')
     
     	/**
     	 * Base URL
    +	 *
     	 * Returns base_url [. uri_string]
     	 *
    -	 * @param	string	$uri
    +	 * @uses	CI_Config::_uri_string()
    +	 *
    +	 * @param	string|string[]	$uri	URI string or an array of segments
     	 * @return	string
     	 */
     	public function base_url($uri = '')
    @@ -277,9 +285,12 @@ public function base_url($uri = '')
     	// -------------------------------------------------------------
     
     	/**
    -	 * Build URI string for use in Config::site_url() and Config::base_url()
    +	 * Build URI string
    +	 *
    +	 * @used-by	CI_Config::site_url()
    +	 * @used-by	CI_Config::base_url()
     	 *
    -	 * @param	mixed	$uri
    +	 * @param	string|string[]	$uri	URI string or an array of segments
     	 * @return	string
     	 */
     	protected function _uri_string($uri)
    @@ -318,8 +329,8 @@ public function system_url()
     	/**
     	 * Set a config file item
     	 *
    -	 * @param	string	the config item key
    -	 * @param	string	the config item value
    +	 * @param	string	$item	Config item key
    +	 * @param	string	$value	Config item value
     	 * @return	void
     	 */
     	public function set_item($item, $value)
    @@ -327,29 +338,6 @@ public 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
    -	 *
    -	 * @param	array
    -	 * @return	void
    -	 */
    -	public function _assign_to_config($items = array())
    -	{
    -		if (is_array($items))
    -		{
    -			foreach ($items as $key => $val)
    -			{
    -				$this->set_item($key, $val);
    -			}
    -		}
    -	}
    -
     }
     
     /* End of file Config.php */
    diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php
    index c0caf2e7dda..556257729be 100644
    --- a/system/core/Exceptions.php
    +++ b/system/core/Exceptions.php
    @@ -130,7 +130,7 @@ public function show_404($page = '', $log_error = TRUE)
     	 * @param	string		$heading	Page heading
     	 * @param	string|string[]	$message	Error message
     	 * @param	string		$template	Template name
    -	 * @param 	int		$statis_code	(default: 500)
    +	 * @param 	int		$status_code	(default: 500)
     	 *
     	 * @return	string	Error page output
     	 */
    diff --git a/tests/codeigniter/core/Config_test.php b/tests/codeigniter/core/Config_test.php
    index d652a625edf..be426d070a0 100644
    --- a/tests/codeigniter/core/Config_test.php
    +++ b/tests/codeigniter/core/Config_test.php
    @@ -9,7 +9,7 @@ public function set_up()
     		// set predictable config values
     		$this->cfg = array(
     			'index_page'		=> 'index.php',
    -			'base_url'			=> 'http://example.com/',
    +			'base_url'		=> 'http://example.com/',
     			'subclass_prefix'	=> 'MY_'
     		);
     		$this->ci_set_config($this->cfg);
    @@ -38,7 +38,6 @@ public function test_set_item()
     		$this->assertFalse($this->config->item('not_yet_set'));
     
     		$this->config->set_item('not_yet_set', 'is set');
    -
     		$this->assertEquals('is set', $this->config->item('not_yet_set'));
     	}
     
    @@ -50,7 +49,6 @@ public function test_slash_item()
     		$this->assertFalse($this->config->slash_item('no_good_item'));
     
     		$this->assertEquals($this->cfg['base_url'], $this->config->slash_item('base_url'));
    -
     		$this->assertEquals($this->cfg['subclass_prefix'].'/', $this->config->slash_item('subclass_prefix'));
     	}
     
    @@ -124,7 +122,7 @@ public function test_site_url()
     		$q_string = $this->config->item('enable_query_strings');
     		$this->config->set_item('enable_query_strings', FALSE);
     
    -		$uri= 'test';
    +		$uri = 'test';
     		$uri2 = '1';
     		$this->assertEquals($index_page.'/'.$uri, $this->config->site_url($uri));
     		$this->assertEquals($index_page.'/'.$uri.'/'.$uri2, $this->config->site_url(array($uri, $uri2)));
    @@ -137,7 +135,6 @@ public function test_site_url()
     		$this->assertEquals($index_page.'/'.$uri.$suffix.'?'.$arg, $this->config->site_url($uri.'?'.$arg));
     
     		$this->config->set_item('url_suffix', FALSE);
    -
     		$this->config->set_item('enable_query_strings', TRUE);
     
     		$this->assertEquals($index_page.'?'.$uri, $this->config->site_url($uri));
    @@ -233,22 +230,4 @@ public function test_load_nonexistent()
     		$this->assertNull($this->config->load($file));
     	}
     
    -	// --------------------------------------------------------------------
    -
    -	public function test_assign_to_config()
    -	{
    -		$key1 = 'test';
    -		$key2 = '1';
    -		$val1 = 'foo';
    -		$val2 = 'bar';
    -		$cfg = array(
    -			$key1 => $val1,
    -			$key2 => $val2
    -		);
    -
    -		$this->assertNull($this->config->_assign_to_config($cfg));
    -		$this->assertEquals($val1, $this->config->item($key1));
    -		$this->assertEquals($val2, $this->config->item($key2));
    -	}
    -
     }
    \ No newline at end of file
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index e91fafccc73..a1cdcd47525 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -236,8 +236,8 @@ Release Date: Not Released
     	 -  Added method ``get_vars()`` to the Loader to retrieve all variables loaded with ``$this->load->vars()``.
     	 -  ``CI_Loader::_ci_autoloader()`` is now a protected method.
     	 -  Added autoloading of drivers with ``$autoload['drivers']``.
    -	 -  ``CI_Loader::library()`` will now load drivers as well, for backward compatibility of converted libraries (like Session).
    -   -  ``$config['rewrite_short_tags']`` now has no effect when using PHP 5.4 as *`).
    +	 -  ``$config['rewrite_short_tags']`` now has no effect when using PHP 5.4 as ``` changes include:
     	 -  Added ``method()`` to retrieve ``$_SERVER['REQUEST_METHOD']``.
     	 -  Modified ``valid_ip()`` to use PHP's ``filter_var()``.
    @@ -254,7 +254,9 @@ Release Date: Not Released
     	 -  Added method ``get_content_type()``.
     	 -  Added a second argument to method ``set_content_type()`` that allows setting the document charset as well.
        -  ``$config['time_reference']`` now supports all timezone strings supported by PHP.
    -   -  Changed :doc:`Config Library ` method ``site_url()`` to accept an array as well.
    +   -  :doc:`Config Library ` changes include:
    +	 -  Changed ``site_url()`` method  to accept an array as well.
    +	 -  Removed internal method ``_assign_to_config()`` and moved it's implementation in *CodeIgniter.php* instead.
        -  :doc:`Security Library ` changes include:
     	 -  Added method ``strip_image_tags()``.
     	 -  Added ``$config['csrf_regeneration']``, which makes token regeneration optional.
    
    From 1887ec69c9230ff3fbde63f209b50ce69b28fc62 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 27 Oct 2012 16:22:07 +0300
    Subject: [PATCH 1780/5397] Input class improvements
    
    - Disable register_globals replication on PHP 5.4+ (no longer exists).
    - DocBlock improvements.
    - Add missing changelog entry.
    - Change user_agent() to return NULL when no value is found (for consistency with other fetcher methods).
    ---
     system/core/Config.php              |   2 +-
     system/core/Input.php               | 228 +++++++++++++++-------------
     user_guide_src/source/changelog.rst |   4 +-
     3 files changed, 125 insertions(+), 109 deletions(-)
    
    diff --git a/system/core/Config.php b/system/core/Config.php
    index 152e9af68ff..642cee79844 100644
    --- a/system/core/Config.php
    +++ b/system/core/Config.php
    @@ -55,7 +55,7 @@ class CI_Config {
     	/**
     	 * List of paths to search when trying to load a config file.
     	 *
    -	 * @used-by	CI_Loader	Must be public
    +	 * @used-by	CI_Loader
     	 * @var		array
     	 */
     	public $_config_paths =	array(APPPATH);
    diff --git a/system/core/Input.php b/system/core/Input.php
    index ec935d5310a..18406fe4382 100644
    --- a/system/core/Input.php
    +++ b/system/core/Input.php
    @@ -41,59 +41,68 @@ class CI_Input {
     	/**
     	 * IP address of the current user
     	 *
    -	 * @var string
    +	 * @var	string
     	 */
    -	public $ip_address =	FALSE;
    +	public $ip_address = FALSE;
     
     	/**
    -	 * user agent (web browser) being used by the current user
    +	 * User agent strin
     	 *
    -	 * @var string
    +	 * @var	string
     	 */
    -	public $user_agent =	FALSE;
    +	public $user_agent = FALSE;
     
     	/**
    -	 * If FALSE, then $_GET will be set to an empty array
    +	 * Allow GET array flag
     	 *
    -	 * @var bool
    +	 * If set to FALSE, then $_GET will be set to an empty array.
    +	 *
    +	 * @var	bool
     	 */
    -	protected $_allow_get_array =	TRUE;
    +	protected $_allow_get_array = TRUE;
     
     	/**
    -	 * If TRUE, then newlines are standardized
    +	 * Standartize new lines flag
    +	 *
    +	 * If set to TRUE, then newlines are standardized.
     	 *
    -	 * @var bool
    +	 * @var	bool
     	 */
    -	protected $_standardize_newlines =	TRUE;
    +	protected $_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
    +	 * Enable XSS flag
    +	 *
    +	 * 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	bool
     	 */
    -	protected $_enable_xss =	FALSE;
    +	protected $_enable_xss = FALSE;
     
     	/**
    +	 * Enable CSRF flag
    +	 *
     	 * Enables a CSRF cookie token to be set.
    -	 * Set automatically based on config setting
    +	 * Set automatically based on config setting.
     	 *
    -	 * @var bool
    +	 * @var	bool
     	 */
    -	protected $_enable_csrf =	FALSE;
    +	protected $_enable_csrf = FALSE;
     
     	/**
     	 * List of all HTTP request headers
     	 *
     	 * @var array
     	 */
    -	protected $headers =	array();
    +	protected $headers = array();
     
     	/**
    -	 * Constructor
    +	 * Class constructor
     	 *
    -	 * Sets whether to globally enable the XSS processing
    -	 * and whether to allow the $_GET array
    +	 * Determines whether to globally enable the XSS processing
    +	 * and whether to allow the $_GET array.
     	 *
     	 * @return	void
     	 */
    @@ -124,12 +133,12 @@ public function __construct()
     	/**
     	 * Fetch from array
     	 *
    -	 * This is a helper function to retrieve values from global arrays
    +	 * Internal method used to retrieve values from global arrays.
     	 *
    -	 * @param	array
    -	 * @param	string
    -	 * @param	bool
    -	 * @return	string
    +	 * @param	array	&$array		$_GET, $_POST, $_COOKIE, $_SERVER, etc.
    +	 * @param	string	$index		Index for item to be fetched from $array
    +	 * @param	bool	$xss_clean	Whether to apply XSS filtering
    +	 * @return	mixed
     	 */
     	protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)
     	{
    @@ -151,9 +160,9 @@ protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)
     	/**
     	 * Fetch an item from the GET array
     	 *
    -	 * @param	string
    -	 * @param	bool
    -	 * @return	string
    +	 * @param	string	$index		Index for item to be fetched from $_GET
    +	 * @param	bool	$xss_clean	Whether to apply XSS filtering
    +	 * @return	mixed
     	 */
     	public function get($index = NULL, $xss_clean = FALSE)
     	{
    @@ -178,9 +187,9 @@ public function get($index = NULL, $xss_clean = FALSE)
     	/**
     	 * Fetch an item from the POST array
     	 *
    -	 * @param	string
    -	 * @param	bool
    -	 * @return	string
    +	 * @param	string	$index		Index for item to be fetched from $_POST
    +	 * @param	bool	$xss_clean	Whether to apply XSS filtering
    +	 * @return	mixed
     	 */
     	public function post($index = NULL, $xss_clean = FALSE)
     	{
    @@ -204,11 +213,11 @@ public function post($index = NULL, $xss_clean = FALSE)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Fetch an item from either the GET array or the POST
    +	 * Fetch an item from POST data with fallback to GET
     	 *
    -	 * @param	string	The index key
    -	 * @param	bool	XSS cleaning
    -	 * @return	string
    +	 * @param	string	$index		Index for item to be fetched from $_POST or $_GET
    +	 * @param	bool	$xss_clean	Whether to apply XSS filtering
    +	 * @return	mixed
     	 */
     	public function get_post($index = '', $xss_clean = FALSE)
     	{
    @@ -222,31 +231,45 @@ public function get_post($index = '', $xss_clean = FALSE)
     	/**
     	 * Fetch an item from the COOKIE array
     	 *
    -	 * @param	string
    -	 * @param	bool
    -	 * @return	string
    +	 * @param	string	$index		Index for item to be fetched from $_COOKIE
    +	 * @param	bool	$xss_clean	Whether to apply XSS filtering
    +	 * @return	mixed
     	 */
     	public function cookie($index = '', $xss_clean = FALSE)
     	{
     		return $this->_fetch_from_array($_COOKIE, $index, $xss_clean);
     	}
     
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Fetch an item from the SERVER array
    +	 *
    +	 * @param	string	$index		Index for item to be fetched from $_SERVER
    +	 * @param	bool	$xss_clean	Whether to apply XSS filtering
    +	 * @return	mixed
    +	 */
    +	public function server($index = '', $xss_clean = FALSE)
    +	{
    +		return $this->_fetch_from_array($_SERVER, $index, $xss_clean);
    +	}
    +
     	// ------------------------------------------------------------------------
     
     	/**
     	 * Set cookie
     	 *
    -	 * Accepts seven parameters, or you can submit an associative
    +	 * Accepts an arbitrary number of parameters (up to 7) or an associative
     	 * array in the first parameter containing all the values.
     	 *
    -	 * @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
    -	 * @param	bool	true makes the cookie accessible via http(s) only (no javascript)
    +	 * @param	string|mixed[]	$name		Cookie name or an array containing parameters
    +	 * @param	string		$value		Cookie value
    +	 * @param	int		$expire		Cookie expiration time in seconds
    +	 * @param	string		$domain		Cookie domain (e.g.: '.yourdomain.com')
    +	 * @param	string		$path		Cookie path (default: '/')
    +	 * @param	string		$prefix		Cookie name prefix
    +	 * @param	bool		$secure		Whether to only transfer cookies via SSL
    +	 * @param	bool		$httponly	Whether to only makes the cookie accessible via HTTP (no javascript)
     	 * @return	void
     	 */
     	public function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE, $httponly = FALSE)
    @@ -302,24 +325,12 @@ public function set_cookie($name = '', $value = '', $expire = '', $domain = '',
     
     	// --------------------------------------------------------------------
     
    -	/**
    -	 * Fetch an item from the SERVER array
    -	 *
    -	 * @param	string
    -	 * @param	bool
    -	 * @return	string
    -	 */
    -	public function server($index = '', $xss_clean = FALSE)
    -	{
    -		return $this->_fetch_from_array($_SERVER, $index, $xss_clean);
    -	}
    -
    -	// --------------------------------------------------------------------
    -
     	/**
     	 * Fetch the IP Address
     	 *
    -	 * @return	string
    +	 * Determines and validates the visitor's IP address.
    +	 *
    +	 * @return	string	IP address
     	 */
     	public function ip_address()
     	{
    @@ -458,8 +469,8 @@ public function ip_address()
     	/**
     	 * Validate IP Address
     	 *
    -	 * @param	string
    -	 * @param	string	'ipv4' or 'ipv6'
    +	 * @param	string	$ip	IP address
    +	 * @param	string	$which	IP protocol: 'ipv4' or 'ipv6'
     	 * @return	bool
     	 */
     	public function valid_ip($ip, $which = '')
    @@ -483,9 +494,9 @@ public function valid_ip($ip, $which = '')
     	// --------------------------------------------------------------------
     
     	/**
    -	 * User Agent
    +	 * Fetch User Agent string
     	 *
    -	 * @return	string
    +	 * @return	string|null	User Agent string or NULL if it doesn't exist
     	 */
     	public function user_agent()
     	{
    @@ -494,7 +505,7 @@ public function user_agent()
     			return $this->user_agent;
     		}
     
    -		return $this->user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : FALSE;
    +		return $this->user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : NULL;
     	}
     
     	// --------------------------------------------------------------------
    @@ -502,11 +513,12 @@ public function user_agent()
     	/**
     	 * Sanitize Globals
     	 *
    -	 * This function does the following:
    +	 * Internal method serving for the following purposes:
     	 *
    -	 * - Unsets $_GET data (if query strings are not enabled)
    -	 * - Unsets all globals if register_globals is enabled
    -	 * - Standardizes newline characters to \n
    +	 *	- Unsets $_GET data (if query strings are not enabled)
    +	 *	- Unsets all globals if register_globals is enabled
    +	 *	- Cleans POST, COOKIE and SERVER data
    +	 * 	- Standardizes newline characters to PHP_EOL
     	 *
     	 * @return	void
     	 */
    @@ -534,25 +546,29 @@ protected function _sanitize_globals()
     			'IN'
     		);
     
    -		// Unset globals for securiy.
    +		// Unset globals for security.
     		// This is effectively the same as register_globals = off
    -		foreach (array($_GET, $_POST, $_COOKIE) as $global)
    +		// PHP 5.4 no longer has the register_globals functionality.
    +		if ( ! is_php('5.4'))
     		{
    -			if (is_array($global))
    +			foreach (array($_GET, $_POST, $_COOKIE) as $global)
     			{
    -				foreach ($global as $key => $val)
    +				if (is_array($global))
     				{
    -					if ( ! in_array($key, $protected))
    +					foreach ($global as $key => $val)
     					{
    -						global $$key;
    -						$$key = NULL;
    +						if ( ! in_array($key, $protected))
    +						{
    +							global $$key;
    +							$$key = NULL;
    +						}
     					}
     				}
    -			}
    -			elseif ( ! in_array($global, $protected))
    -			{
    -				global $$global;
    -				$$global = NULL;
    +				elseif ( ! in_array($global, $protected))
    +				{
    +					global $$global;
    +					$$global = NULL;
    +				}
     			}
     		}
     
    @@ -613,10 +629,10 @@ protected function _sanitize_globals()
     	/**
     	 * Clean Input Data
     	 *
    -	 * This is a helper function. It escapes data and
    -	 * standardizes newline characters to \n
    +	 * Internal method that aids in escaping data and
    +	 * standardizing newline characters to PHP_EOL.
     	 *
    -	 * @param	string
    +	 * @param	string|string[]	$str	Input string(s)
     	 * @return	string
     	 */
     	protected function _clean_input_data($str)
    @@ -624,9 +640,9 @@ protected function _clean_input_data($str)
     		if (is_array($str))
     		{
     			$new_array = array();
    -			foreach ($str as $key => $val)
    +			foreach (array_keys($str) as $key)
     			{
    -				$new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
    +				$new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($str[$key]);
     			}
     			return $new_array;
     		}
    @@ -670,11 +686,11 @@ protected function _clean_input_data($str)
     	/**
     	 * Clean Keys
     	 *
    -	 * This is a helper function. To prevent malicious users
    +	 * Internal method that helps 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.
     	 *
    -	 * @param	string
    +	 * @param	string	$str	Input string
     	 * @return	string
     	 */
     	protected function _clean_input_keys($str)
    @@ -699,15 +715,12 @@ protected function _clean_input_keys($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
    +	 * @param	bool	$xss_clean	Whether to apply XSS filtering
     	 * @return	array
     	 */
     	public function request_headers($xss_clean = FALSE)
     	{
    -		// Look at Apache go!
    +		// In Apache, you can simply call apache_request_headers()
     		if (function_exists('apache_request_headers'))
     		{
     			$headers = apache_request_headers();
    @@ -744,9 +757,9 @@ public function request_headers($xss_clean = FALSE)
     	 *
     	 * Returns the value of a single member of the headers class member
     	 *
    -	 * @param	string	array key for $this->headers
    -	 * @param	bool	XSS Clean or not
    -	 * @return	mixed	FALSE on failure, string on success
    +	 * @param	string		$index		Header name
    +	 * @param	bool		$xss_clean	Whether to apply XSS filtering
    +	 * @return	string|bool	The requested header on success or FALSE on failure
     	 */
     	public function get_request_header($index, $xss_clean = FALSE)
     	{
    @@ -768,9 +781,9 @@ public function get_request_header($index, $xss_clean = FALSE)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Is ajax Request?
    +	 * Is AJAX request?
     	 *
    -	 * Test to see if a request contains the HTTP_X_REQUESTED_WITH header
    +	 * Test to see if a request contains the HTTP_X_REQUESTED_WITH header.
     	 *
     	 * @return 	bool
     	 */
    @@ -782,9 +795,9 @@ public function is_ajax_request()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Is cli Request?
    +	 * Is CLI request?
     	 *
    -	 * Test to see if a request was made from the command line
    +	 * Test to see if a request was made from the command line.
     	 *
     	 * @return 	bool
     	 */
    @@ -798,10 +811,11 @@ public function is_cli_request()
     	/**
     	 * Get Request Method
     	 *
    -	 * Return the Request Method
    +	 * Return the request method
     	 *
    -	 * @param	bool	uppercase or lowercase
    -	 * @return 	bool
    +	 * @param	bool	$upper	Whether to return in upper or lower case
    +	 *				(default: FALSE)
    +	 * @return 	string
     	 */
     	public function method($upper = FALSE)
     	{
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index a1cdcd47525..c98ac729517 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -240,8 +240,10 @@ Release Date: Not Released
     	 -  ``$config['rewrite_short_tags']`` now has no effect when using PHP 5.4 as ``` changes include:
     	 -  Added ``method()`` to retrieve ``$_SERVER['REQUEST_METHOD']``.
    -	 -  Modified ``valid_ip()`` to use PHP's ``filter_var()``.
     	 -  Added support for arrays and network addresses (e.g. 192.168.1.1/24) for use with the *proxy_ips* setting.
    +	 -  Changed method ``valid_ip()`` to use PHP's native ``filter_var()`` function.
    +	 -  Changed internal method ``_sanitize_globals()`` to skip enforcing reversal of *register_globals* in PHP 5.4+, where this functionality no longer exists.
    +	 -  Changed methods ``get()``, ``post()``, ``get_post()``, ``cookie()``, ``server()``, ``user_agent()`` to return NULL instead of FALSE when no value is found.
        -  :doc:`Common functions ` changes include:
     	 -  Added function ``get_mimes()`` to return the *config/mimes.php* array.
     	 -  Added support for HTTP code 303 ("See Other") in ``set_status_header()``.
    
    From ed4b258a204319c5a3a7c242c1cc7dfbfe14ad4e Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 27 Oct 2012 17:46:52 +0300
    Subject: [PATCH 1781/5397] Make CI_Loader::config() a proper alias for
     CI_Config::load() and improve the Loader class DocBlocks
    
    ---
     system/core/Loader.php              | 286 +++++++++++++++-------------
     user_guide_src/source/changelog.rst |   5 +-
     2 files changed, 155 insertions(+), 136 deletions(-)
    
    diff --git a/system/core/Loader.php b/system/core/Loader.php
    index b316c8e1bfc..db56ab3ae57 100644
    --- a/system/core/Loader.php
    +++ b/system/core/Loader.php
    @@ -28,7 +28,7 @@
     /**
      * Loader Class
      *
    - * Loads views and files
    + * Loads framework components.
      *
      * @package		CodeIgniter
      * @subpackage	Libraries
    @@ -42,84 +42,84 @@ class CI_Loader {
     	/**
     	 * Nesting level of the output buffering mechanism
     	 *
    -	 * @var int
    +	 * @var	int
     	 */
     	protected $_ci_ob_level;
     
     	/**
     	 * List of paths to load views from
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_ci_view_paths =	array();
     
     	/**
     	 * List of paths to load libraries from
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_ci_library_paths =	array();
     
     	/**
     	 * List of paths to load models from
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_ci_model_paths =	array();
     
     	/**
     	 * List of paths to load helpers from
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_ci_helper_paths =	array();
     
     	/**
     	 * List of loaded base classes
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_base_classes =	array(); // Set by the controller class
     
     	/**
     	 * List of cached variables
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_ci_cached_vars =	array();
     
     	/**
     	 * List of loaded classes
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_ci_classes =	array();
     
     	/**
     	 * List of loaded files
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_ci_loaded_files =	array();
     
     	/**
     	 * List of loaded models
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_ci_models =	array();
     
     	/**
     	 * List of loaded helpers
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_ci_helpers =	array();
     
     	/**
     	 * List of class name mappings
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_ci_varmap =	array(
     		'unit_test' => 'unit',
    @@ -127,9 +127,9 @@ class CI_Loader {
     	);
     
     	/**
    -	 * Constructor
    +	 * Class constructor
     	 *
    -	 * Sets the path to the view files and gets the initial output buffering level
    +	 * Sets component load paths gets the initial output buffering level.
     	 *
     	 * @return	void
     	 */
    @@ -149,9 +149,9 @@ public function __construct()
     	/**
     	 * Initialize the Loader
     	 *
    -	 * This method is called once in CI_Controller.
    -	 *
    -	 * @return 	object
    +	 * @used-by	CI_Controller
    +	 * @uses	CI_Loader::_ci_autoloader()
    +	 * @return 	object	$this
     	 */
     	public function initialize()
     	{
    @@ -169,14 +169,12 @@ public function initialize()
     	/**
     	 * Is Loaded
     	 *
    -	 * A utility function to test if a class is in the self::$_ci_classes array.
    -	 * This function returns the object name if the class tested for is loaded,
    -	 * and returns FALSE if it isn't.
    +	 * A utility method to test if a class is in the self::$_ci_classes array.
     	 *
    -	 * It is mainly used in the form_helper -> _get_validation_object()
    +	 * @used-by	Mainly used by Form Helper function _get_validation_object().
     	 *
    -	 * @param 	string	class being checked for
    -	 * @return 	mixed	class object name on the CI SuperObject or FALSE
    +	 * @param 	string		$class	Class name to check for
    +	 * @return 	string|bool	Class object name if loaded or FALSE
     	 */
     	public function is_loaded($class)
     	{
    @@ -186,14 +184,14 @@ public function is_loaded($class)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Class Loader
    +	 * Library Loader
     	 *
    -	 * This function lets users load and instantiate classes.
    -	 * It is designed to be called from a user's app controllers.
    +	 * Loads and instantiates libraries.
    +	 * Designed to be called from application controllers.
     	 *
    -	 * @param	string	the name of the class
    -	 * @param	mixed	the optional parameters
    -	 * @param	string	an optional object name
    +	 * @param	string	$library	Library name
    +	 * @param	array	$params		Optional parameters to pass to the library class constructor
    +	 * @param	string	$object_name	An optional object name to assign to
     	 * @return	void
     	 */
     	public function library($library = '', $params = NULL, $object_name = NULL)
    @@ -210,7 +208,7 @@ public function library($library = '', $params = NULL, $object_name = NULL)
     
     		if ($library === '' OR isset($this->_base_classes[$library]))
     		{
    -			return FALSE;
    +			return;
     		}
     
     		if ( ! is_null($params) && ! is_array($params))
    @@ -226,16 +224,20 @@ public function library($library = '', $params = NULL, $object_name = NULL)
     	/**
     	 * Model Loader
     	 *
    -	 * This function lets users load and instantiate models.
    +	 * Loads and instantiates libraries.
     	 *
    -	 * @param	string	the name of the class
    -	 * @param	string	name for the model
    -	 * @param	bool	database connection
    +	 * @param	string	$model		Model name
    +	 * @param	string	$name		An optional object name to assign to
    +	 * @param	bool	$db_conn	An optional database connection configuration to initialize
     	 * @return	void
     	 */
     	public function model($model, $name = '', $db_conn = FALSE)
     	{
    -		if (is_array($model))
    +		if (empty($model))
    +		{
    +			return;
    +		}
    +		elseif (is_array($model))
     		{
     			foreach ($model as $class)
     			{
    @@ -244,11 +246,6 @@ public function model($model, $name = '', $db_conn = FALSE)
     			return;
     		}
     
    -		if ($model === '')
    -		{
    -			return;
    -		}
    -
     		$path = '';
     
     		// Is the model in a sub-folder? If so, parse out the filename and path.
    @@ -318,10 +315,13 @@ public function model($model, $name = '', $db_conn = FALSE)
     	/**
     	 * Database Loader
     	 *
    -	 * @param	mixed	$params = ''		the DB settings
    -	 * @param	bool	$return = FALSE		whether to return the DB object
    -	 * @param	bool	$query_builder = NULL	whether to enable query builder (overrides the config setting)
    -	 * @return	object
    +	 * @param	mixed	$params		Database configuration options
    +	 * @param	bool	$return 	Whether to return the database object
    +	 * @param	bool	$query_builder	Whether to enable Query Builder
    +	 *					(overrides the configuration setting)
    +	 *
    +	 * @return	void|object|bool	Database object if $return is set to TRUE,
    +	 *					FALSE on failure, void in any other case
     	 */
     	public function database($params = '', $return = FALSE, $query_builder = NULL)
     	{
    @@ -352,9 +352,9 @@ public function database($params = '', $return = FALSE, $query_builder = NULL)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Load the Utilities Class
    +	 * Load the Database Utilities Class
     	 *
    -	 * @return	string
    +	 * @return	void
     	 */
     	public function dbutil()
     	{
    @@ -381,7 +381,7 @@ public function dbutil()
     	/**
     	 * Load the Database Forge Class
     	 *
    -	 * @return	string
    +	 * @return	void
     	 */
     	public function dbforge()
     	{
    @@ -402,19 +402,15 @@ public function dbforge()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Load View
    -	 *
    -	 * This function is used to load a "view" file. It has three parameters:
    +	 * View Loader
     	 *
    -	 * 1. The name of the "view" file to be included.
    -	 * 2. An associative array of data to be extracted for use in the view.
    -	 * 3. TRUE/FALSE - whether to return the data or load it. In
    -	 *	some cases it's advantageous to be able to return data so that
    -	 *	a developer can process it in some way.
    +	 * Loads "view" files.
     	 *
    -	 * @param	string
    -	 * @param	array
    -	 * @param	bool
    +	 * @param	string	$view	View name
    +	 * @param	array	$vars	An associative array of data
    +	 *				to be extracted for use in the view
    +	 * @param	bool	$return	Whether to return the view output
    +	 *				or leave it to the Output class
     	 * @return	void
     	 */
     	public function view($view, $vars = array(), $return = FALSE)
    @@ -425,13 +421,11 @@ public function view($view, $vars = array(), $return = FALSE)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Load File
    -	 *
    -	 * This is a generic file loader
    +	 * Generic File Loader
     	 *
    -	 * @param	string
    -	 * @param	bool
    -	 * @return	string
    +	 * @param	string	$path	File path
    +	 * @param	bool	$return	Whether to return the file output
    +	 * @return	void|string
     	 */
     	public function file($path, $return = FALSE)
     	{
    @@ -446,8 +440,10 @@ public function file($path, $return = FALSE)
     	 * Once variables are set they become available within
     	 * the controller class and its "view" files.
     	 *
    -	 * @param	array
    -	 * @param 	string
    +	 * @param	array|object|string	$vars
    +	 *					An associative array or object containing values
    +	 *					to be set, or a value's name if string
    +	 * @param 	string	$val	Value to set, only used if $vars is a string
     	 * @return	void
     	 */
     	public function vars($vars = array(), $val = '')
    @@ -475,8 +471,8 @@ public function vars($vars = array(), $val = '')
     	 *
     	 * Check if a variable is set and retrieve it.
     	 *
    -	 * @param	array
    -	 * @return	void
    +	 * @param	string	$key	Variable name
    +	 * @return	mixed	The variable or NULL if not found
     	 */
     	public function get_var($key)
     	{
    @@ -488,7 +484,7 @@ public function get_var($key)
     	/**
     	 * Get Variables
     	 *
    -	 * Retrieve all loaded variables
    +	 * Retrieves all loaded variables.
     	 *
     	 * @return	array
     	 */
    @@ -500,11 +496,9 @@ public function get_vars()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Load Helper
    -	 *
    -	 * This function loads the specified helper file.
    +	 * Helper Loader
     	 *
    -	 * @param	mixed
    +	 * @param	string|string[]	$helpers	Helper name(s)
     	 * @return	void
     	 */
     	public function helper($helpers = array())
    @@ -562,10 +556,11 @@ public function helper($helpers = array())
     	/**
     	 * Load Helpers
     	 *
    -	 * This is simply an alias to the above function in case the
    -	 * user has written the plural form of this function.
    +	 * An alias for the helper() method in case the developer has
    +	 * written the plural form of it.
     	 *
    -	 * @param	array
    +	 * @uses	CI_Loader::helper()
    +	 * @param	string|string[]	$helpers	Helper name(s)
     	 * @return	void
     	 */
     	public function helpers($helpers = array())
    @@ -576,22 +571,21 @@ public function helpers($helpers = array())
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Loads a language file
    +	 * Language Loader
     	 *
    -	 * @param	array
    -	 * @param	string
    +	 * Loads language files.
    +	 *
    +	 * @param	string|string[]	$files	List of language file names to load
    +	 * @param	string		Language name
     	 * @return	void
     	 */
    -	public function language($file = array(), $lang = '')
    +	public function language($files = array(), $lang = '')
     	{
     		$CI =& get_instance();
     
    -		if ( ! is_array($file))
    -		{
    -			$file = array($file);
    -		}
    +		is_array($files) OR $files = array($files);
     
    -		foreach ($file as $langfile)
    +		foreach ($files as $langfile)
     		{
     			$CI->lang->load($langfile, $lang);
     		}
    @@ -600,30 +594,35 @@ public function language($file = array(), $lang = '')
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Loads a config file
    +	 * Config Loader
     	 *
    -	 * @param	string
    -	 * @param	bool
    -	 * @param 	bool
    -	 * @return	void
    +	 * Loads a config file (an alias for CI_Config::load()).
    +	 *
    +	 * @uses	CI_Config::load()
    +	 * @param	string	$file			Configuration file name
    +	 * @param	bool	$use_sections		Whether configuration values should be loaded into their own section
    +	 * @param	bool	$fail_gracefully	Whether to just return FALSE or display an error message
    +	 * @return	bool	TRUE if the file was loaded correctly or FALSE on failure
     	 */
     	public function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
     	{
     		$CI =& get_instance();
    -		$CI->config->load($file, $use_sections, $fail_gracefully);
    +		return $CI->config->load($file, $use_sections, $fail_gracefully);
     	}
     
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Driver
    +	 * Driver Loader
     	 *
    -	 * Loads a driver library
    +	 * Loads a driver library.
     	 *
    -	 * @param	mixed	the name of the class or array of classes
    -	 * @param	mixed	the optional parameters
    -	 * @param	string	an optional object name
    -	 * @return	void
    +	 * @param	string|string[]	$library	Driver name(s)
    +	 * @param	array		$params		Optional parameters to pass to the driver
    +	 * @param	string		$object_name	An optional object name to assign to
    +	 *
    +	 * @return	void|object|bool	Object or FALSE on failure if $library is a string
    +	 *					and $object_name is set. void otherwise.
     	 */
     	public function driver($library = '', $params = NULL, $object_name = NULL)
     	{
    @@ -656,10 +655,16 @@ public function driver($library = '', $params = NULL, $object_name = NULL)
     	/**
     	 * Add Package Path
     	 *
    -	 * Prepends a parent path to the library, model, helper, and config path arrays
    +	 * Prepends a parent path to the library, model, helper and config
    +	 * path arrays.
    +	 *
    +	 * @see	CI_Loader::$_ci_library_paths
    +	 * @see	CI_Loader::$_ci_model_paths
    +	 * @see CI_Loader::$_ci_helper_paths
    +	 * @see CI_Config::$_config_paths
     	 *
    -	 * @param	string
    -	 * @param 	bool
    +	 * @param	string	$path		Path to add
    +	 * @param 	bool	$view_cascade	(default: TRUE)
     	 * @return	void
     	 */
     	public function add_package_path($path, $view_cascade = TRUE)
    @@ -682,10 +687,10 @@ public function add_package_path($path, $view_cascade = TRUE)
     	/**
     	 * Get Package Paths
     	 *
    -	 * Return a list of all package paths, by default it will ignore BASEPATH.
    +	 * Return a list of all package paths.
     	 *
    -	 * @param	string
    -	 * @return	void
    +	 * @param	bool	$include_base	Whether to include BASEPATH (default: TRUE)
    +	 * @return	array
     	 */
     	public function get_package_paths($include_base = FALSE)
     	{
    @@ -697,14 +702,14 @@ public function get_package_paths($include_base = FALSE)
     	/**
     	 * Remove Package Path
     	 *
    -	 * Remove a path from the library, model, and helper path arrays if it exists
    -	 * If no path is provided, the most recently added path is removed.
    +	 * Remove a path from the library, model, helper and/or config
    +	 * path arrays if it exists. If no path is provided, the most recently
    +	 * added path will be removed removed.
     	 *
    -	 * @param	string
    -	 * @param 	bool
    +	 * @param	string	$path	Path to remove
     	 * @return	void
     	 */
    -	public function remove_package_path($path = '', $remove_config_path = TRUE)
    +	public function remove_package_path($path = '')
     	{
     		$config =& $this->_ci_get_component('config');
     
    @@ -749,13 +754,16 @@ public function remove_package_path($path = '', $remove_config_path = TRUE)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Loader
    +	 * Internal CI Data Loader
    +	 *
    +	 * Used to load views and files.
     	 *
    -	 * This function is used to load views and files.
     	 * Variables are prefixed with _ci_ to avoid symbol collision with
    -	 * variables made available to view files
    +	 * variables made available to view files.
     	 *
    -	 * @param	array
    +	 * @used-by	CI_Loader::view()
    +	 * @used-by	CI_Loader::file()
    +	 * @param	array	$_ci_data	Data to load
     	 * @return	void
     	 */
     	protected function _ci_load($_ci_data)
    @@ -883,13 +891,14 @@ protected function _ci_load($_ci_data)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Load class
    +	 * Internal CI Class Loader
     	 *
    -	 * This function loads the requested class.
    +	 * @used-by	CI_Loader::library()
    +	 * @uses	CI_Loader::_ci_init_class()
     	 *
    -	 * @param	string	the item that is being loaded
    -	 * @param	mixed	any additional parameters
    -	 * @param	string	an optional object name
    +	 * @param	string	$class		Class name to load
    +	 * @param	mixed	$params		Optional parameters to pass to the class constructor
    +	 * @param	string	$object_name	Optional object name to assign to
     	 * @return	void
     	 */
     	protected function _ci_load_class($class, $params = NULL, $object_name = NULL)
    @@ -1024,12 +1033,17 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Instantiates a class
    +	 * Internal CI Class Instantiator
    +	 *
    +	 * @used-by	CI_Loader::_ci_load_class()
     	 *
    -	 * @param	string
    -	 * @param	string
    -	 * @param	bool
    -	 * @param	string	an optional object name
    +	 * @param	string		$class		Class name
    +	 * @param	string		$prefix		Class name prefix
    +	 * @param	array|null|bool	$config		Optional configuration to pass to the class constructor:
    +	 *						FALSE to skip;
    +	 *						NULL to search in config paths;
    +	 *						array containing configuration data
    +	 * @param	string		$object_name	Optional object name to assign to
     	 * @return	void
     	 */
     	protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)
    @@ -1131,11 +1145,11 @@ protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Autoloader
    +	 * CI Autoloader
     	 *
    -	 * The config/autoload.php file contains an array that permits sub-systems,
    -	 * libraries, and helpers to be loaded automatically.
    +	 * Loads component listed in the config/autoload.php file.
     	 *
    +	 * @used-by	CI_Loader::initialize()
     	 * @return	void
     	 */
     	protected function _ci_autoloader()
    @@ -1218,11 +1232,12 @@ protected function _ci_autoloader()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Object to Array
    +	 * CI Object to Array translator
     	 *
    -	 * Takes an object as input and converts the class variables to array key/vals
    +	 * Takes an object as input and converts the class variables to
    +	 * an associative array with key/value pairs.
     	 *
    -	 * @param	object
    +	 * @param	object	$object	Object data to translate
     	 * @return	array
     	 */
     	protected function _ci_object_to_array($object)
    @@ -1233,9 +1248,11 @@ protected function _ci_object_to_array($object)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Get a reference to a specific library or model
    +	 * CI Component getter
    +	 *
    +	 * Get a reference to a specific library or model.
     	 *
    -	 * @param 	string
    +	 * @param 	string	$component	Component name
     	 * @return	bool
     	 */
     	protected function &_ci_get_component($component)
    @@ -1249,10 +1266,11 @@ protected function &_ci_get_component($component)
     	/**
     	 * Prep filename
     	 *
    -	 * This function preps the name of various items to make loading them more reliable.
    +	 * This function prepares filenames of various items to
    +	 * make their loading more reliable.
     	 *
    -	 * @param	mixed
    -	 * @param 	string
    +	 * @param	string|string[]	$filename	Filename(s)
    +	 * @param 	string		$extension	Filename extension
     	 * @return	array
     	 */
     	protected function _ci_prep_filename($filename, $extension)
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index c98ac729517..4b161dc2d8b 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -234,10 +234,11 @@ Release Date: Not Released
        -  Removed ``CI_CORE`` boolean constant from *CodeIgniter.php* (no longer Reactor and Core versions).
        -  :doc:`Loader Library ` changes include:
     	 -  Added method ``get_vars()`` to the Loader to retrieve all variables loaded with ``$this->load->vars()``.
    -	 -  ``CI_Loader::_ci_autoloader()`` is now a protected method.
    +	 -  ``_ci_autoloader()`` is now a protected method.
     	 -  Added autoloading of drivers with ``$autoload['drivers']``.
    -	 -  ``CI_Loader::library()`` will now load drivers as well, for backward compatibility of converted libraries (like :doc:`Session `).
    +	 -  ``library()`` method will now load drivers as well, for backward compatibility of converted libraries (like :doc:`Session `).
     	 -  ``$config['rewrite_short_tags']`` now has no effect when using PHP 5.4 as ``` changes include:
     	 -  Added ``method()`` to retrieve ``$_SERVER['REQUEST_METHOD']``.
     	 -  Added support for arrays and network addresses (e.g. 192.168.1.1/24) for use with the *proxy_ips* setting.
    
    From bb82969e52ca3fe67dfbb88deccf636d08e8d693 Mon Sep 17 00:00:00 2001
    From: vkeranov 
    Date: Sat, 27 Oct 2012 18:00:35 +0300
    Subject: [PATCH 1782/5397] Remove extra new lines
    
    ---
     system/core/Lang.php | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/system/core/Lang.php b/system/core/Lang.php
    index e74304dd917..251cf6ef17c 100644
    --- a/system/core/Lang.php
    +++ b/system/core/Lang.php
    @@ -120,7 +120,6 @@ public function load($langfile, $idiom = '', $return = FALSE, $add_suffix = TRUE
     			}
     		}
     
    -
     		if ( ! isset($lang) OR ! is_array($lang))
     		{
     			log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile);
    
    From 2b5b92e6535fb328bf4fbe75396c80e352b7c3a2 Mon Sep 17 00:00:00 2001
    From: vkeranov 
    Date: Sat, 27 Oct 2012 18:01:47 +0300
    Subject: [PATCH 1783/5397] Remove extra space...
    
    ---
     system/libraries/Session/drivers/Session_native.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/libraries/Session/drivers/Session_native.php b/system/libraries/Session/drivers/Session_native.php
    index da744f39b64..a837b89f6ac 100755
    --- a/system/libraries/Session/drivers/Session_native.php
    +++ b/system/libraries/Session/drivers/Session_native.php
    @@ -1,4 +1,4 @@
    -
    Date: Sat, 27 Oct 2012 18:04:40 +0300
    Subject: [PATCH 1784/5397] Fix Loader tests
    
    ---
     tests/codeigniter/core/Loader_test.php | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php
    index f7c338a209c..816587a49bb 100644
    --- a/tests/codeigniter/core/Loader_test.php
    +++ b/tests/codeigniter/core/Loader_test.php
    @@ -36,7 +36,7 @@ public function test_library()
     		$this->assertAttributeInstanceOf($class, $lib, $this->ci_obj);
     
     		// Test no lib given
    -		$this->assertFalse($this->load->library());
    +		$this->assertNull($this->load->library());
     
     		// Test a string given to params
     		$this->assertNull($this->load->library($lib, ' '));
    @@ -450,7 +450,7 @@ public function test_packages()
     	public function test_load_config()
     	{
     		$cfg = 'someconfig';
    -		$this->assertNull($this->load->config($cfg, FALSE));
    +		$this->assertTrue($this->load->config($cfg, FALSE));
     		$this->assertContains($cfg, $this->ci_obj->config->loaded);
     	}
     
    
    From a5779d0a9ad598da8647e033ef8d88c3ac81fa02 Mon Sep 17 00:00:00 2001
    From: vkeranov 
    Date: Sat, 27 Oct 2012 18:04:54 +0300
    Subject: [PATCH 1785/5397] Remove extra new lines
    
    ---
     system/core/CodeIgniter.php | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php
    index 324b4d84912..f2708638612 100644
    --- a/system/core/CodeIgniter.php
    +++ b/system/core/CodeIgniter.php
    @@ -232,7 +232,6 @@ 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';
    
    From 8b9aa179047643668446ca454461a3ef34b3d228 Mon Sep 17 00:00:00 2001
    From: vkeranov 
    Date: Sat, 27 Oct 2012 18:06:09 +0300
    Subject: [PATCH 1786/5397] Remove extra new lines
    
    ---
     system/core/Input.php | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/system/core/Input.php b/system/core/Input.php
    index 18406fe4382..f6213c34e2a 100644
    --- a/system/core/Input.php
    +++ b/system/core/Input.php
    @@ -209,7 +209,6 @@ public function post($index = NULL, $xss_clean = FALSE)
     		return $this->_fetch_from_array($_POST, $index, $xss_clean);
     	}
     
    -
     	// --------------------------------------------------------------------
     
     	/**
    
    From a8349bc4809e5a5a6bbc2c1a6566a01f4f8f16c7 Mon Sep 17 00:00:00 2001
    From: vkeranov 
    Date: Sat, 27 Oct 2012 18:07:59 +0300
    Subject: [PATCH 1787/5397] Remove extra new lines
    
    ---
     system/core/Output.php | 3 +--
     1 file changed, 1 insertion(+), 2 deletions(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index aa0e05dc4ae..2da1b3e25f6 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -375,10 +375,9 @@ public function _display($output = '')
     			$output = $this->minify($output, $this->mime_type);
     		}
     
    -
     		// --------------------------------------------------------------------
     
    -		// Do we need to write a cache file?  Only if the controller does not have its
    +		// 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'))
    
    From 31b7c339a1ffda23d9ad288e294fbde5e7e22f70 Mon Sep 17 00:00:00 2001
    From: vkeranov 
    Date: Sat, 27 Oct 2012 18:09:46 +0300
    Subject: [PATCH 1788/5397] Remove extra new lines
    
    ---
     system/core/Utf8.php | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/system/core/Utf8.php b/system/core/Utf8.php
    index bc7afed910b..efe3c10dcdf 100644
    --- a/system/core/Utf8.php
    +++ b/system/core/Utf8.php
    @@ -64,7 +64,6 @@ public function __construct()
     			define('MB_ENABLED', FALSE);
     		}
     
    -
     		if (
     			@preg_match('/./u', 'é') === 1	// PCRE must support UTF-8
     			&& function_exists('iconv')	// iconv must be installed
    
    From 2b6b4300b36365bc060b1697e3f3c7088e6856e6 Mon Sep 17 00:00:00 2001
    From: vkeranov 
    Date: Sat, 27 Oct 2012 18:12:24 +0300
    Subject: [PATCH 1789/5397] Update system/core/URI.php
    
    ---
     system/core/URI.php | 3 +--
     1 file changed, 1 insertion(+), 2 deletions(-)
    
    diff --git a/system/core/URI.php b/system/core/URI.php
    index 13530bd63a2..33f7d21faea 100644
    --- a/system/core/URI.php
    +++ b/system/core/URI.php
    @@ -473,7 +473,7 @@ protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment')
     		$segments = array_slice($this->$segment_array(), ($n - 1));
     		$i = 0;
     		$lastval = '';
    -		$retval  = array();
    +		$retval = array();
     		foreach ($segments as $seg)
     		{
     			if ($i % 2)
    @@ -640,7 +640,6 @@ public function uri_string()
     		return $this->uri_string;
     	}
     
    -
     	// --------------------------------------------------------------------
     
     	/**
    
    From 94b1f76780e4dbc67ff4b43a98f2cb4e23c01a29 Mon Sep 17 00:00:00 2001
    From: vkeranov 
    Date: Sat, 27 Oct 2012 18:19:59 +0300
    Subject: [PATCH 1790/5397] Style guide...
    
    ---
     system/libraries/Cache/Cache.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php
    index ce71445dff5..7ec2380a524 100644
    --- a/system/libraries/Cache/Cache.php
    +++ b/system/libraries/Cache/Cache.php
    @@ -103,7 +103,7 @@ public function __construct($config = array())
     			}
     		}
     
    -		isset($config['key_prefix']) AND $this->key_prefix = $config['key_prefix'];
    +		isset($config['key_prefix']) && $this->key_prefix = $config['key_prefix'];
     
     		if (isset($config['backup']) && in_array('cache_'.$config['backup'], $this->valid_drivers))
     		{
    
    From bfbe8b2ca47a854686d0ca498686ef1e68124fd8 Mon Sep 17 00:00:00 2001
    From: vkeranov 
    Date: Sat, 27 Oct 2012 18:25:08 +0300
    Subject: [PATCH 1791/5397] Remove extra new lines
    
    ---
     system/libraries/javascript/Jquery.php | 3 +--
     1 file changed, 1 insertion(+), 2 deletions(-)
    
    diff --git a/system/libraries/javascript/Jquery.php b/system/libraries/javascript/Jquery.php
    index 8739d141f4c..ed02fadb778 100644
    --- a/system/libraries/javascript/Jquery.php
    +++ b/system/libraries/javascript/Jquery.php
    @@ -700,7 +700,6 @@ protected function _updater($container = 'this', $controller, $options = '')
     		return $updater."\t\t$($container).load('$controller'$request_options);";
     	}
     
    -
     	// --------------------------------------------------------------------
     	// Pre-written handy stuff
     	// --------------------------------------------------------------------
    @@ -716,7 +715,7 @@ protected function _updater($container = 'this', $controller, $options = '')
     	protected function _zebraTables($class = '', $odd = 'odd', $hover = '')
     	{
     		$class = ($class !== '') ? '.'.$class : '';
    -		$zebra  = "\t\$(\"table{$class} tbody tr:nth-child(even)\").addClass(\"{$odd}\");";
    +		$zebra = "\t\$(\"table{$class} tbody tr:nth-child(even)\").addClass(\"{$odd}\");";
     
     		$this->jquery_code_for_compile[] = $zebra;
     
    
    From 7e4356b399c2ada34879c6d27edf87e1375029cf Mon Sep 17 00:00:00 2001
    From: vkeranov 
    Date: Sat, 27 Oct 2012 18:41:00 +0300
    Subject: [PATCH 1792/5397] Remove extra new lines
    
    ---
     system/libraries/Email.php | 13 ++++++-------
     1 file changed, 6 insertions(+), 7 deletions(-)
    
    diff --git a/system/libraries/Email.php b/system/libraries/Email.php
    index 9207fc9f0b2..edca303ff6b 100644
    --- a/system/libraries/Email.php
    +++ b/system/libraries/Email.php
    @@ -47,20 +47,20 @@ class CI_Email {
     	public $smtp_port	= 25;			// SMTP Port
     	public $smtp_timeout	= 5;			// SMTP Timeout in seconds
     	public $smtp_crypto	= '';			// SMTP Encryption. Can be null, tls or ssl.
    -	public $wordwrap	= TRUE;			// TRUE/FALSE  Turns word-wrap on/off
    +	public $wordwrap	= TRUE;			// TRUE/FALSE - Turns word-wrap on/off
     	public $wrapchars	= 76;			// Number of characters to wrap at.
    -	public $mailtype	= 'text';		// text/html  Defines email formatting
    +	public $mailtype	= 'text';		// text/html - Defines email formatting
     	public $charset		= 'utf-8';		// Default char set: iso-8859-1 or us-ascii
     	public $multipart	= 'mixed';		// "mixed" (in the body) or "related" (separate)
     	public $alt_message	= '';			// Alternative message for HTML emails
    -	public $validate	= FALSE;		// TRUE/FALSE.  Enables email validation
    +	public $validate	= FALSE;		// TRUE/FALSE - Enables email validation
     	public $priority	= 3;			// Default priority (1 - 5)
     	public $newline		= "\n";			// Default newline. "\r\n" or "\n" (Use "\r\n" to comply with RFC 822)
    -	public $crlf		= "\n";			// The RFC 2045 compliant CRLF for quoted-printable is "\r\n".  Apparently some servers,
    +	public $crlf		= "\n";			// The RFC 2045 compliant CRLF for quoted-printable is "\r\n". Apparently some servers,
     									// even on the receiving end think they need to muck with CRLFs, so using "\n", while
     									// distasteful, is the only thing that seems to work for all environments.
     	public $dsn		= FALSE;		// Delivery Status Notification
    -	public $send_multipart	= TRUE;		// TRUE/FALSE - Yahoo does not like multipart alternative, so this is an override.  Set to FALSE for Yahoo.
    +	public $send_multipart	= TRUE;		// TRUE/FALSE - Yahoo does not like multipart alternative, so this is an override. Set to FALSE for Yahoo.
     	public $bcc_batch_mode	= FALSE;	// TRUE/FALSE - Turns on/off Bcc batch feature
     	public $bcc_batch_size	= 200;		// If bcc_batch_mode = TRUE, sets max number of Bccs in each batch
     
    @@ -989,7 +989,6 @@ protected function _build_message()
     					$this->_finalbody = $hdr.$this->_finalbody;
     				}
     
    -
     				if ($this->send_multipart !== FALSE)
     				{
     					$this->_finalbody .= '--'.$this->_alt_boundary.'--';
    @@ -1661,7 +1660,7 @@ protected function _send_command($cmd, $data = '')
     	// --------------------------------------------------------------------
     
     	/**
    -	 *  SMTP Authenticate
    +	 * SMTP Authenticate
     	 *
     	 * @return	bool
     	 */
    
    From b9fe7e9be099f450747de6ed28d400764ffc58b3 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 27 Oct 2012 18:45:59 +0300
    Subject: [PATCH 1793/5397] [ci skip] Router class DocBlock improvements
    
    ---
     system/core/Output.php | 156 ++++++++++++++++++++++-------------------
     system/core/Router.php |  67 +++++++++---------
     2 files changed, 120 insertions(+), 103 deletions(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index aa0e05dc4ae..3f2f84fa189 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -28,7 +28,7 @@
     /**
      * Output Class
      *
    - * Responsible for sending final output to browser
    + * Responsible for sending final output to the browser.
      *
      * @package		CodeIgniter
      * @subpackage	Libraries
    @@ -39,70 +39,74 @@
     class CI_Output {
     
     	/**
    -	 * Current output string
    +	 * Final output string
     	 *
    -	 * @var string
    +	 * @var	string
     	 */
     	public $final_output;
     
     	/**
     	 * Cache expiration time
     	 *
    -	 * @var int
    +	 * @var	int
     	 */
    -	public $cache_expiration =	0;
    +	public $cache_expiration = 0;
     
     	/**
     	 * List of server headers
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	public $headers =	array();
     
     	/**
     	 * List of mime types
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	public $mimes =		array();
     
     	/**
     	 * Mime-type for the current page
     	 *
    -	 * @var string
    +	 * @var	string
     	 */
    -	protected $mime_type		= 'text/html';
    +	protected $mime_type	= 'text/html';
     
     	/**
    -	 * Determines whether profiler is enabled
    +	 * Enable Profiler flag
     	 *
    -	 * @var book
    +	 * @var	bool
     	 */
    -	public $enable_profiler =	FALSE;
    +	public $enable_profiler = FALSE;
     
     	/**
    -	 * Determines if output compression is enabled
    +	 * zLib output compression flag
     	 *
    -	 * @var bool
    +	 * @var	bool
     	 */
     	protected $_zlib_oc =		FALSE;
     
     	/**
     	 * List of profiler sections
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_profiler_sections =	array();
     
     	/**
    -	 * Whether or not to parse variables like {elapsed_time} and {memory_usage}
    +	 * Parse markers flag
     	 *
    -	 * @var bool
    +	 * Whether or not to parse variables like {elapsed_time} and {memory_usage}.
    +	 *
    +	 * @var	bool
     	 */
     	public $parse_exec_vars =	TRUE;
     
     	/**
    -	 * Set up Output class
    +	 * Class constructor
    +	 *
    +	 * Determines whether zLib output compression will be used.
     	 *
     	 * @return	void
     	 */
    @@ -121,7 +125,7 @@ public function __construct()
     	/**
     	 * Get Output
     	 *
    -	 * Returns the current output string
    +	 * Returns the current output string.
     	 *
     	 * @return	string
     	 */
    @@ -135,10 +139,10 @@ public function get_output()
     	/**
     	 * Set Output
     	 *
    -	 * Sets the output string
    +	 * Sets the output string.
     	 *
    -	 * @param	string
    -	 * @return	void
    +	 * @param	string	$output	Output data
    +	 * @return	object	$this
     	 */
     	public function set_output($output)
     	{
    @@ -151,14 +155,14 @@ public function set_output($output)
     	/**
     	 * Append Output
     	 *
    -	 * Appends data onto the output string
    +	 * Appends data onto the output string.
     	 *
    -	 * @param	string
    -	 * @return	void
    +	 * @param	string	$output	Data to append
    +	 * @return	object	$this
     	 */
     	public function append_output($output)
     	{
    -		if ($this->final_output == '')
    +		if (empty($this->final_output))
     		{
     			$this->final_output = $output;
     		}
    @@ -175,16 +179,16 @@ public function append_output($output)
     	/**
     	 * Set Header
     	 *
    -	 * Lets you set a server header which will be outputted with the final display.
    +	 * Lets you set a server header which will be sent with the final output.
     	 *
    -	 * 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...
    +	 * Note: If a file is cached, headers will not be sent.
    +	 * @todo	We need to figure out how to permit headers to be cached.
     	 *
    -	 * @param	string
    -	 * @param	bool
    -	 * @return	void
    +	 * @param	string	$header		Header
    +	 * @param	bool	$replace	Whether to replace the old header value, if already set
    +	 * @return	object	$this
     	 */
    -	public function set_header($header, $replace = TRUE)
    +	public function set_header($header, $replace)
     	{
     		// If zlib.output_compression is enabled it will compress the output,
     		// but it will not modify the content-length header to compensate for
    @@ -192,7 +196,7 @@ public function set_header($header, $replace = TRUE)
     		// We'll just skip content-length in those cases.
     		if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) === 0)
     		{
    -			return;
    +			return $this;
     		}
     
     		$this->headers[] = array($header, $replace);
    @@ -202,11 +206,11 @@ public function set_header($header, $replace = TRUE)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Set Content Type Header
    +	 * Set Content-Type Header
     	 *
    -	 * @param	string	$mime_type	extension of the file we're outputting
    -	 * @param	string	$charset = NULL
    -	 * @return	void
    +	 * @param	string	$mime_type	Extension of the file we're outputting
    +	 * @param	string	$charset	Character set (default: NULL)
    +	 * @return	object	$this
     	 */
     	public function set_content_type($mime_type, $charset = NULL)
     	{
    @@ -243,7 +247,7 @@ public function set_content_type($mime_type, $charset = NULL)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Get Current Content Type Header
    +	 * Get Current Content-Type Header
     	 *
     	 * @return	string	'text/html', if not already set
     	 */
    @@ -264,11 +268,13 @@ public function get_content_type()
     
     	/**
     	 * Set HTTP Status Header
    -	 * moved to Common procedural functions in 1.7.2
     	 *
    -	 * @param	int	the status code
    -	 * @param	string
    -	 * @return	void
    +	 * As of version 1.7.2, this is an alias for common function
    +	 * set_status_header().
    +	 *
    +	 * @param	int	$code	Status code (default: 200)
    +	 * @param	string	$text	Optional message
    +	 * @return	object	$this
     	 */
     	public function set_status_header($code = 200, $text = '')
     	{
    @@ -281,8 +287,8 @@ public function set_status_header($code = 200, $text = '')
     	/**
     	 * Enable/disable Profiler
     	 *
    -	 * @param	bool
    -	 * @return	void
    +	 * @param	bool	$val	TRUE to enable or FALSE to disable
    +	 * @return	object	$this
     	 */
     	public function enable_profiler($val = TRUE)
     	{
    @@ -295,10 +301,11 @@ public function enable_profiler($val = TRUE)
     	/**
     	 * Set Profiler Sections
     	 *
    -	 * Allows override of default / config settings for Profiler section display
    +	 * Allows override of default/config settings for
    +	 * Profiler section display.
     	 *
    -	 * @param	array
    -	 * @return	void
    +	 * @param	array	$sections	Profiler sections
    +	 * @return	object	$this
     	 */
     	public function set_profiler_sections($sections)
     	{
    @@ -321,8 +328,8 @@ public function set_profiler_sections($sections)
     	/**
     	 * Set Cache
     	 *
    -	 * @param	int
    -	 * @return	void
    +	 * @param	int	$time	Cache expiration time in seconds
    +	 * @return	object	$this
     	 */
     	public function cache($time)
     	{
    @@ -335,16 +342,16 @@ public function cache($time)
     	/**
     	 * Display Output
     	 *
    -	 * All "view" data is automatically put into this variable by the controller class:
    -	 *
    -	 * $this->final_output
    +	 * Processes sends the sends finalized output data to the browser along
    +	 * with any server headers and profile data. It also stops benchmark
    +	 * timers so the page rendering speed and memory usage can be shown.
     	 *
    -	 * 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.
    +	 * Note: All "view" data is automatically put into $this->final_output
    +	 *	 by controller class.
     	 *
    -	 * @param	string
    -	 * @return	mixed
    +	 * @uses	CI_Output::$final_output
    +	 * @param	string	$output	Output data override
    +	 * @return	void
     	 */
     	public function _display($output = '')
     	{
    @@ -431,7 +438,7 @@ public function _display($output = '')
     			echo $output;
     			log_message('debug', 'Final output sent to browser');
     			log_message('debug', 'Total execution time: '.$elapsed);
    -			return TRUE;
    +			return;
     		}
     
     		// --------------------------------------------------------------------
    @@ -473,9 +480,9 @@ public function _display($output = '')
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Write a Cache File
    +	 * Write Cache
     	 *
    -	 * @param	string
    +	 * @param	string	$output	Output data to cache
     	 * @return	void
     	 */
     	public function _write_cache($output)
    @@ -526,11 +533,14 @@ public function _write_cache($output)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Update/serve a cached file
    +	 * Update/serve cached output
     	 *
    -	 * @param	object	config class
    -	 * @param	object	uri class
    -	 * @return	bool
    +	 * @uses	CI_Config
    +	 * @uses	CI_URI
    +	 *
    +	 * @param	object	&$CFG	CI_Config class instance
    +	 * @param	object	&$URI	CI_URI class instance
    +	 * @return	bool	TRUE on success or FALSE on failure
     	 */
     	public function _display_cache(&$CFG, &$URI)
     	{
    @@ -584,11 +594,13 @@ public function _display_cache(&$CFG, &$URI)
     	// --------------------------------------------------------------------
     
     	/**
    +	 * Set Cache Header
    +	 *
     	 * Set the HTTP headers to match the server-side file cache settings
     	 * in order to reduce bandwidth.
     	 *
    -	 * @param	int	timestamp of when the page was last modified
    -	 * @param	int	timestamp of when should the requested page expire from cache
    +	 * @param	int	$last_modified	Timestamp of when the page was last modified
    +	 * @param	int	$expiration	Timestamp of when should the requested page expire from cache
     	 * @return	void
     	 */
     	public function set_cache_header($last_modified, $expiration)
    @@ -612,11 +624,13 @@ public function set_cache_header($last_modified, $expiration)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Reduce excessive size of HTML content.
    +	 * Minify
     	 *
    -	 * @param	string
    -	 * @param	string
    -	 * @return	string
    +	 * Reduce excessive size of HTML/CSS/JavaScript content.
    +	 *
    +	 * @param	string	$output	Output to minify
    +	 * @param	string	$type	Output content MIME type
    +	 * @return	string	Minified output
     	 */
     	public function minify($output, $type = 'text/html')
     	{
    diff --git a/system/core/Router.php b/system/core/Router.php
    index 5bc05304578..efee2439f01 100644
    --- a/system/core/Router.php
    +++ b/system/core/Router.php
    @@ -39,56 +39,56 @@
     class CI_Router {
     
     	/**
    -	 * Config class
    +	 * CI_Config class object
     	 *
    -	 * @var object
    +	 * @var	object
     	 */
     	public $config;
     
     	/**
     	 * List of routes
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	public $routes =	array();
     
     	/**
     	 * List of error routes
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	public $error_routes =	array();
     
     	/**
     	 * Current class name
     	 *
    -	 * @var string
    +	 * @var	string
     	 */
     	public $class =		'';
     
     	/**
     	 * Current method name
     	 *
    -	 * @var string
    +	 * @var	string
     	 */
     	public $method =	'index';
     
     	/**
     	 * Sub-directory that contains the requested controller class
     	 *
    -	 * @var string
    +	 * @var	string
     	 */
     	public $directory =	'';
     
     	/**
     	 * Default controller (and method if specific)
     	 *
    -	 * @var string
    +	 * @var	string
     	 */
     	public $default_controller;
     
     	/**
    -	 * Constructor
    +	 * Class constructor
     	 *
     	 * Runs the route mapping function.
     	 *
    @@ -104,9 +104,9 @@ public function __construct()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Set the route mapping
    +	 * Set route mapping
     	 *
    -	 * This function determines what should be served based on the URI request,
    +	 * Determines what should be served based on the URI request,
     	 * as well as any "routes" that have been set in the routing config file.
     	 *
     	 * @return	void
    @@ -179,7 +179,7 @@ public function _set_routing()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Set the default controller
    +	 * Set default controller
     	 *
     	 * @return	void
     	 */
    @@ -213,12 +213,12 @@ protected function _set_default_controller()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Set the Route
    +	 * Set request route
     	 *
    -	 * This function takes an array of URI segments as
    -	 * input, and sets the current class/method
    +	 * Takes an array of URI segments as input and sets the class/method
    +	 * to be called.
     	 *
    -	 * @param	array
    +	 * @param	array	$segments	URI segments
     	 * @return	void
     	 */
     	protected function _set_request($segments = array())
    @@ -253,11 +253,12 @@ protected function _set_request($segments = array())
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Validates the supplied segments.
    -	 * Attempts to determine the path to the controller.
    +	 * Validate request
     	 *
    -	 * @param	array
    -	 * @return	array
    +	 * Attempts validate the URI request and determine the controller path.
    +	 *
    +	 * @param	array	$segments	URI segments
    +	 * @return	array	URI segments
     	 */
     	protected function _validate_request($segments)
     	{
    @@ -347,9 +348,8 @@ protected function _validate_request($segments)
     	/**
     	 * 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.
    +	 * 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.
     	 *
     	 * @return	void
     	 */
    @@ -391,9 +391,9 @@ protected function _parse_routes()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Set the class name
    +	 * Set class name
     	 *
    -	 * @param	string
    +	 * @param	string	$class	Class name
     	 * @return	void
     	 */
     	public function set_class($class)
    @@ -416,9 +416,9 @@ public function fetch_class()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Set the method name
    +	 * Set method name
     	 *
    -	 * @param	string
    +	 * @param	string	$method	Method name
     	 * @return	void
     	 */
     	public function set_method($method)
    @@ -441,9 +441,9 @@ public function fetch_method()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Set the directory name
    +	 * Set directory name
     	 *
    -	 * @param	string
    +	 * @param	string	$dir	Directory name
     	 * @return	void
     	 */
     	public function set_directory($dir)
    @@ -454,7 +454,10 @@ public function set_directory($dir)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Fetch the sub-directory (if any) that contains the requested controller class
    +	 * Fetch directory
    +	 *
    +	 * Feches the sub-directory (if any) that contains the requested
    +	 * controller class.
     	 *
     	 * @return	string
     	 */
    @@ -466,9 +469,9 @@ public function fetch_directory()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Set the controller overrides
    +	 * Set controller overrides
     	 *
    -	 * @param	array
    +	 * @param	array	$routing	Route overrides
     	 * @return	void
     	 */
     	public function _set_overrides($routing)
    
    From 3bb4029bbe0db9625be21e2dad82ef18286560ca Mon Sep 17 00:00:00 2001
    From: vkeranov 
    Date: Sat, 27 Oct 2012 18:47:26 +0300
    Subject: [PATCH 1794/5397] Remove extra spaces...
    
    ---
     system/libraries/Session/Session.php | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php
    index 978506062e9..fec9b5b3144 100755
    --- a/system/libraries/Session/Session.php
    +++ b/system/libraries/Session/Session.php
    @@ -1,4 +1,4 @@
    -valid_drivers = array(
     			'Session_native',
    -		   	'Session_cookie'
    +			'Session_cookie'
     		);
     		$key = 'sess_valid_drivers';
     		$drivers = isset($params[$key]) ? $params[$key] : $CI->config->item($key);
    @@ -243,7 +243,7 @@ public function all_userdata()
     	/**
     	 * Fetch all flashdata
     	 *
    -	 * @return	array   Flash data array
    +	 * @return	array	Flash data array
     	 */
     	public function all_flashdata()
     	{
    
    From 44dc50e41b9eab2ad62f5abe09641247733c836d Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sun, 28 Oct 2012 13:30:21 +0200
    Subject: [PATCH 1795/5397] Fix #1937
    
    ---
     system/core/Output.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index e969ba8999a..3bb8f8dc015 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -188,7 +188,7 @@ public function append_output($output)
     	 * @param	bool	$replace	Whether to replace the old header value, if already set
     	 * @return	object	$this
     	 */
    -	public function set_header($header, $replace)
    +	public 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
    
    From 64354104d69425848e477b322ebf0604e2593326 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sun, 28 Oct 2012 14:16:02 +0200
    Subject: [PATCH 1796/5397] [ci skip] DocBlock improvements for Security
     library
    
    ---
     system/core/Security.php | 177 ++++++++++++++++++++++-----------------
     1 file changed, 100 insertions(+), 77 deletions(-)
    
    diff --git a/system/core/Security.php b/system/core/Security.php
    index d7c82712dda..50d0ce05205 100644
    --- a/system/core/Security.php
    +++ b/system/core/Security.php
    @@ -37,45 +37,55 @@
     class CI_Security {
     
     	/**
    -	 * Random Hash for protecting URLs
    +	 * XSS Hash
     	 *
    -	 * @var string
    +	 * Random Hash for protecting URLs.
    +	 *
    +	 * @var	string
     	 */
     	protected $_xss_hash =	'';
     
     	/**
    -	 * Random Hash for Cross Site Request Forgery Protection Cookie
    +	 * CSRF Hash
    +	 *
    +	 * Random hash for Cross Site Request Forgery protection cookie
     	 *
    -	 * @var string
    +	 * @var	string
     	 */
     	protected $_csrf_hash =	'';
     
     	/**
    -	 * Expiration time for Cross Site Request Forgery Protection Cookie
    -	 * Defaults to two hours (in seconds)
    +	 * CSRF Expire time
    +	 *
    +	 * Expiration time for Cross Site Request Forgery protection cookie.
    +	 * Defaults to two hours (in seconds).
     	 *
    -	 * @var int
    +	 * @var	int
     	 */
     	protected $_csrf_expire =	7200;
     
     	/**
    -	 * Token name for Cross Site Request Forgery Protection Cookie
    +	 * CSRF Token name
     	 *
    -	 * @var string
    +	 * Token name for Cross Site Request Forgery protection cookie.
    +	 *
    +	 * @var	string
     	 */
     	protected $_csrf_token_name =	'ci_csrf_token';
     
     	/**
    -	 * Cookie name for Cross Site Request Forgery Protection Cookie
    +	 * CSRF Cookie name
    +	 *
    +	 * Cookie name for Cross Site Request Forgery protection cookie.
     	 *
    -	 * @var string
    +	 * @var	string
     	 */
     	protected $_csrf_cookie_name =	'ci_csrf_token';
     
     	/**
     	 * List of never allowed strings
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_never_allowed_str =	array(
     		'document.cookie'	=> '[removed]',
    @@ -91,9 +101,9 @@ class CI_Security {
     	);
     
     	/**
    -	 * List of never allowed regex replacement
    +	 * List of never allowed regex replacements
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	protected $_never_allowed_regex = array(
     		'javascript\s*:',
    @@ -104,7 +114,7 @@ class CI_Security {
     	);
     
     	/**
    -	 * Initialize security class
    +	 * Class constructor
     	 *
     	 * @return	void
     	 */
    @@ -138,7 +148,7 @@ public function __construct()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Verify Cross Site Request Forgery Protection
    +	 * CSRF Verify
     	 *
     	 * @return	object
     	 */
    @@ -188,10 +198,10 @@ public function csrf_verify()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Set Cross Site Request Forgery Protection Cookie
    +	 * CSRF Set Cookie
     	 *
    -	 * @return	object
     	 * @codeCoverageIgnore
    +	 * @return	object
     	 */
     	public function csrf_set_cookie()
     	{
    @@ -234,9 +244,8 @@ public function csrf_show_error()
     	/**
     	 * Get CSRF Hash
     	 *
    -	 * Getter Method
    -	 *
    -	 * @return 	string 	self::_csrf_hash
    +	 * @see		CI_Security::$_csrf_hash
    +	 * @return 	string	CSRF hash
     	 */
     	public function get_csrf_hash()
     	{
    @@ -248,9 +257,8 @@ public function get_csrf_hash()
     	/**
     	 * Get CSRF Token Name
     	 *
    -	 * Getter Method
    -	 *
    -	 * @return 	string 	self::_csrf_token_name
    +	 * @see		CI_Security::$_csrf_token_name
    +	 * @return	string	CSRF token name
     	 */
     	public function get_csrf_token_name()
     	{
    @@ -263,26 +271,26 @@ public function get_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
    +	 * prevented.  This method 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.
    +	 * Note: 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
    +	 * @link	http://channel.bitflux.ch/wiki/XSS_Prevention
    +	 * 		Based in part on some code and ideas from Bitflux.
     	 *
    -	 * 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
    +	 * @link	http://ha.ckers.org/xss.html
    +	 * 		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.
     	 *
    -	 * @param	mixed	string or array
    -	 * @param 	bool
    +	 * @param	string|string[]	$str		Input data
    +	 * @param 	bool		$is_image	Whether the input is an image
     	 * @return	string
     	 */
     	public function xss_clean($str, $is_image = FALSE)
    @@ -469,9 +477,12 @@ public function xss_clean($str, $is_image = FALSE)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Random Hash for protecting URLs
    +	 * XSS Hash
     	 *
    -	 * @return	string
    +	 * Generates the XSS hash if needed and returns it.
    +	 *
    +	 * @see		CI_Security::$_xss_hash
    +	 * @return	string	XSS hash
     	 */
     	public function xss_hash()
     	{
    @@ -489,7 +500,7 @@ public function xss_hash()
     	/**
     	 * HTML Entities Decode
     	 *
    -	 * This function is a replacement for html_entity_decode()
    +	 * 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
    @@ -497,8 +508,10 @@ public function xss_hash()
     	 * 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
    +	 * @link	http://php.net/html-entity-decode
    +	 *
    +	 * @param	string	$str		Input
    +	 * @param	string	$charset	Character set
     	 * @return	string
     	 */
     	public function entity_decode($str, $charset = NULL)
    @@ -521,10 +534,10 @@ public function entity_decode($str, $charset = NULL)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Filename Security
    +	 * Sanitize Filename
     	 *
    -	 * @param	string
    -	 * @param 	bool
    +	 * @param	string	$str		Input file name
    +	 * @param 	bool	$relative_path	Whether to preserve paths
     	 * @return	string
     	 */
     	public function sanitize_filename($str, $relative_path = FALSE)
    @@ -563,7 +576,7 @@ public function sanitize_filename($str, $relative_path = FALSE)
     	/**
     	 * Strip Image Tags
     	 *
    -	 * @param	string
    +	 * @param	string	$str
     	 * @return	string
     	 */
     	public function strip_image_tags($str)
    @@ -576,10 +589,11 @@ public function strip_image_tags($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
    +	 * Callback method for xss_clean() to remove whitespace from
    +	 * things like 'j a v a s c r i p t'.
     	 *
    -	 * @param	array
    +	 * @used-by	CI_Security::xss_clean()
    +	 * @param	array	$matches
     	 * @return	string
     	 */
     	protected function _compact_exploded_words($matches)
    @@ -593,16 +607,22 @@ protected function _compact_exploded_words($matches)
     	 * Remove Evil HTML Attributes (like event handlers and style)
     	 *
     	 * It removes the evil attribute and either:
    -	 * 	- Everything up until a space
    -	 *		For example, everything between the pipes:
    +	 *
    +	 *  - Everything up until a space. For example, everything between the pipes:
    +	 *
    +	 *	
     	 *		
    -	 * 	- Everything inside the quotes
    -	 *		For example, everything between the pipes:
    +	 *	
    +	 *
    +	 *  - Everything inside the quotes. For example, everything between the pipes:
    +	 *
    +	 *	
     	 *		
    +	 *	
     	 *
    -	 * @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
    +	 * @param	string	$str		The string to check
    +	 * @param	bool	$is_image	Whether the input is an image
    +	 * @return	string	The string with the evil attributes removed
     	 */
     	protected function _remove_evil_attributes($str, $is_image)
     	{
    @@ -655,9 +675,10 @@ protected function _remove_evil_attributes($str, $is_image)
     	/**
     	 * Sanitize Naughty HTML
     	 *
    -	 * Callback function for xss_clean() to remove naughty HTML elements
    +	 * Callback method for xss_clean() to remove naughty HTML elements.
     	 *
    -	 * @param	array
    +	 * @used-by	CI_Security::xss_clean()
    +	 * @param	array	$matches
     	 * @return	string
     	 */
     	protected function _sanitize_naughty_html($matches)
    @@ -672,12 +693,14 @@ protected function _sanitize_naughty_html($matches)
     	/**
     	 * JS Link Removal
     	 *
    -	 * Callback function for xss_clean() to sanitize links
    +	 * Callback method 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
    +	 * PHP 5.2+ on link-heavy strings.
     	 *
    -	 * @param	array
    +	 * @used-by	CI_Security::xss_clean()
    +	 * @param	array	$match
     	 * @return	string
     	 */
     	protected function _js_link_removal($match)
    @@ -695,12 +718,14 @@ protected function _js_link_removal($match)
     	/**
     	 * JS Image Removal
     	 *
    -	 * Callback function for xss_clean() to sanitize image tags
    +	 * Callback method 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
    +	 * PHP 5.2+ on image tag heavy strings.
     	 *
    -	 * @param	array
    +	 * @used-by	CI_Security::xss_clean()
    +	 * @param	array	$match
     	 * @return	string
     	 */
     	protected function _js_img_removal($match)
    @@ -718,9 +743,8 @@ protected function _js_img_removal($match)
     	/**
     	 * Attribute Conversion
     	 *
    -	 * Used as a callback for XSS Clean
    -	 *
    -	 * @param	array
    +	 * @used-by	CI_Security::xss_clean()
    +	 * @param	array	$match
     	 * @return	string
     	 */
     	protected function _convert_attribute($match)
    @@ -733,9 +757,11 @@ protected function _convert_attribute($match)
     	/**
     	 * Filter Attributes
     	 *
    -	 * Filters tag attributes for consistency and safety
    +	 * Filters tag attributes for consistency and safety.
     	 *
    -	 * @param	string
    +	 * @used-by	CI_Security::_js_img_removal()
    +	 * @used-by	CI_Security::_js_link_removal()
    +	 * @param	string	$str
     	 * @return	string
     	 */
     	protected function _filter_attributes($str)
    @@ -757,9 +783,8 @@ protected function _filter_attributes($str)
     	/**
     	 * HTML Entity Decode Callback
     	 *
    -	 * Used as a callback for XSS Clean
    -	 *
    -	 * @param	array
    +	 * @used-by	CI_Security::xss_clean()
    +	 * @param	array	$match
     	 * @return	string
     	 */
     	protected function _decode_entity($match)
    @@ -772,9 +797,8 @@ protected function _decode_entity($match)
     	/**
     	 * Validate URL entities
     	 *
    -	 * Called by xss_clean()
    -	 *
    -	 * @param 	string
    +	 * @used-by	CI_Security::xss_clean()
    +	 * @param 	string	$str
     	 * @return 	string
     	 */
     	protected function _validate_entities($str)
    @@ -812,8 +836,7 @@ protected function _validate_entities($str)
     	/**
     	 * Do Never Allowed
     	 *
    -	 * A utility function for xss_clean()
    -	 *
    +	 * @used-by	CI_Security::xss_clean()
     	 * @param 	string
     	 * @return 	string
     	 */
    @@ -832,7 +855,7 @@ protected function _do_never_allowed($str)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Set Cross Site Request Forgery Protection Cookie
    +	 * Set CSRF Hash and Cookie
     	 *
     	 * @return	string
     	 */
    
    From cca742750745de665d8071b38d6e368bf54cd985 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sun, 28 Oct 2012 14:43:36 +0200
    Subject: [PATCH 1797/5397] [ci skip] URI Library DocBlock improvements
    
    ---
     system/core/URI.php | 192 +++++++++++++++++++++++++-------------------
     1 file changed, 108 insertions(+), 84 deletions(-)
    
    diff --git a/system/core/URI.php b/system/core/URI.php
    index 33f7d21faea..d67a35d4b44 100644
    --- a/system/core/URI.php
    +++ b/system/core/URI.php
    @@ -39,36 +39,37 @@
     class CI_URI {
     
     	/**
    -	 * List of cached uri segments
    +	 * List of cached URI segments
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	public $keyval =	array();
     
     	/**
    -	 * Current uri string
    +	 * Current URI string
     	 *
    -	 * @var string
    +	 * @var	string
     	 */
     	public $uri_string;
     
     	/**
    -	 * List of uri segments
    +	 * List of URI segments
     	 *
    -	 * @var array
    +	 * @var	array
     	 */
     	public $segments =	array();
     
     	/**
    -	 * Re-indexed list of uri segments
    -	 * Starts at 1 instead of 0
    +	 * Re-indexed list of URI segments
     	 *
    -	 * @var array
    +	 * Starts at 1 instead of 0.
    +	 *
    +	 * @var	array
     	 */
     	public $rsegments =	array();
     
     	/**
    -	 * Constructor
    +	 * Class constructor
     	 *
     	 * Simply globalizes the $RTR object. The front
     	 * loads the Router class early on so it's not available
    @@ -85,10 +86,9 @@ public function __construct()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Get the URI String
    -	 *
    -	 * Called by CI_Router
    +	 * Fetch URI String
     	 *
    +	 * @used-by	CI_Router
     	 * @return	void
     	 */
     	public function _fetch_uri_string()
    @@ -158,9 +158,9 @@ public function _fetch_uri_string()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Set the URI String
    +	 * Set URI String
     	 *
    -	 * @param 	string
    +	 * @param 	string	$str
     	 * @return	void
     	 */
     	protected function _set_uri_string($str)
    @@ -172,10 +172,9 @@ protected function _set_uri_string($str)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Detects the URI
    +	 * Detects URI
     	 *
    -	 * This function will detect the URI automatically
    -	 * and fix the query string if necessary.
    +	 * Will detect the URI automatically and fix the query string if necessary.
     	 *
     	 * @return	string
     	 */
    @@ -233,10 +232,13 @@ protected function _detect_uri()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Is cli Request?
    +	 * Is CLI Request?
     	 *
    -	 * Duplicate of function from the Input class to test to see if a request was made from the command line
    +	 * Duplicate of method from the Input class to test to see if
    +	 * a request was made from the command line.
     	 *
    +	 * @see		CI_Input::is_cli_request()
    +	 * @used-by	CI_URI::_fetch_uri_string()
     	 * @return 	bool
     	 */
     	protected function _is_cli_request()
    @@ -247,7 +249,7 @@ protected function _is_cli_request()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Parse cli arguments
    +	 * Parse CLI arguments
     	 *
     	 * Take each command line argument and assume it is a URI segment.
     	 *
    @@ -262,11 +264,12 @@ protected function _parse_cli_args()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Filter segments for malicious characters
    +	 * Filter URI
     	 *
    -	 * Called by CI_Router
    +	 * Filters segments for malicious characters.
     	 *
    -	 * @param	string
    +	 * @used-by	CI_Router
    +	 * @param	string	$str
     	 * @return	string
     	 */
     	public function _filter_uri($str)
    @@ -291,10 +294,11 @@ public function _filter_uri($str)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Remove the suffix from the URL if needed
    +	 * Remove URL suffix
     	 *
    -	 * Called by CI_Router
    +	 * Removes the suffix from the URL if needed.
     	 *
    +	 * @used-by	CI_Router
     	 * @return	void
     	 */
     	public function _remove_url_suffix()
    @@ -310,11 +314,12 @@ public function _remove_url_suffix()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Explode the URI Segments. The individual segments will
    -	 * be stored in the $this->segments array.
    +	 * Explode URI segments
     	 *
    -	 * Called by CI_Router
    +	 * The individual segments will be stored in the $this->segments array.
     	 *
    +	 * @see		CI_URI::$segments
    +	 * @used-by	CI_Router
     	 * @return	void
     	 */
     	public function _explode_segments()
    @@ -336,13 +341,12 @@ public function _explode_segments()
     	/**
     	 * 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.
    -	 *
    -	 * Called by CI_Router
    +	 * Re-indexes the CI_URI::$segment array so that it starts at 1 rather
    +	 * than 0. Doing so makes it simpler to use methods like
    +	 * CI_URI::segment(n) since there is a 1:1 relationship between the
    +	 * segment array and the actual segments.
     	 *
    +	 * @used-by	CI_Router
     	 * @return	void
     	 */
     	public function _reindex_segments()
    @@ -356,13 +360,12 @@ public function _reindex_segments()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Fetch a URI Segment
    +	 * Fetch URI Segment
     	 *
    -	 * This function returns the URI segment based on the number provided.
    -	 *
    -	 * @param	int
    -	 * @param	mixed
    -	 * @return	string
    +	 * @see		CI_URI::$segments
    +	 * @param	int		$n		Index
    +	 * @param	mixed		$no_result	What to return if the segment index is not found
    +	 * @return	mixed
     	 */
     	public function segment($n, $no_result = NULL)
     	{
    @@ -372,15 +375,17 @@ public function segment($n, $no_result = NULL)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Fetch a URI "routed" Segment
    +	 * Fetch 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()
    +	 * Returns the re-routed URI segment (assuming routing rules are used)
    +	 * based on the index provided. If there is no routing, will return
    +	 * the same result as CI_URI::segment().
     	 *
    -	 * @param	int
    -	 * @param	mixed
    -	 * @return	string
    +	 * @see		CI_URI::$rsegments
    +	 * @see		CI_URI::segment()
    +	 * @param	int		$n		Index
    +	 * @param	mixed		$no_result	What to return if the segment index is not found
    +	 * @return	mixed
     	 */
     	public function rsegment($n, $no_result = NULL)
     	{
    @@ -390,23 +395,23 @@ public function rsegment($n, $no_result = NULL)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Generate a key value pair from the URI string
    +	 * URI to assoc
     	 *
    -	 * This function generates and associative array of URI data starting
    -	 * at the supplied segment. For example, if this is your URI:
    +	 * Generates an associative array of URI data starting at the supplied
    +	 * segment index. 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:
    +	 * You can use this method to generate an array with this prototype:
     	 *
    -	 * array (
    -	 *			name => joe
    -	 *			location => UK
    -	 *			gender => male
    -	 *		 )
    +	 *	array (
    +	 *		name => joe
    +	 *		location => UK
    +	 *		gender => male
    +	 *	 )
     	 *
    -	 * @param	int	the starting segment number
    -	 * @param	array	an array of default values
    +	 * @param	int	$n		Index (default: 3)
    +	 * @param	array	$default	Default values
     	 * @return	array
     	 */
     	public function uri_to_assoc($n = 3, $default = array())
    @@ -417,10 +422,14 @@ public function uri_to_assoc($n = 3, $default = array())
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Identical to above only it uses the re-routed segment array
    +	 * Routed URI to assoc
    +	 *
    +	 * Identical to CI_URI::uri_to_assoc(), only it uses the re-routed
    +	 * segment array.
     	 *
    -	 * @param 	int	the starting segment number
    -	 * @param 	array	an array of default values
    +	 * @see		CI_URI::uri_to_assoc()
    +	 * @param 	int	$n		Index (default: 3)
    +	 * @param 	array	$default	Default values
     	 * @return 	array
     	 */
     	public function ruri_to_assoc($n = 3, $default = array())
    @@ -431,11 +440,15 @@ public function ruri_to_assoc($n = 3, $default = array())
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Generate a key value pair from the URI string or Re-routed URI string
    +	 * Internal URI-to-assoc
     	 *
    -	 * @param	int	$n = 3			the starting segment number
    -	 * @param	array	$default = array()	an array of default values
    -	 * @param	string	$which = 'segment'	which array we should use
    +	 * Generates a key/value pair from the URI string or re-routed URI string.
    +	 *
    +	 * @used-by	CI_URI::uri_to_assoc()
    +	 * @used-by	CI_URI::ruri_to_assoc()
    +	 * @param	int	$n		Index (default: 3)
    +	 * @param	array	$default	Default values
    +	 * @param	string	$which		Array name ('segment' or 'rsegment')
     	 * @return	array
     	 */
     	protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment')
    @@ -509,10 +522,12 @@ protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment')
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Generate a URI string from an associative array
    +	 * Assoc to URI
     	 *
    -	 * @param	array	an associative array of key/values
    -	 * @return	array
    +	 * Generates a URI string from an associative array.
    +	 *
    +	 * @param	array	$array	Input array of key/value pairs
    +	 * @return	string	URI string
     	 */
     	public function assoc_to_uri($array)
     	{
    @@ -529,10 +544,12 @@ public function assoc_to_uri($array)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Fetch a URI Segment and add a trailing slash
    +	 * Slash segment
    +	 *
    +	 * Fetches an URI segment with a slash.
     	 *
    -	 * @param	int
    -	 * @param	string
    +	 * @param	int	$n	Index
    +	 * @param	string	$where	Where to add the slash ('trailing' or 'leading')
     	 * @return	string
     	 */
     	public function slash_segment($n, $where = 'trailing')
    @@ -543,10 +560,12 @@ public function slash_segment($n, $where = 'trailing')
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Fetch a URI Segment and add a trailing slash
    +	 * Slash routed segment
     	 *
    -	 * @param	int
    -	 * @param	string
    +	 * Fetches an URI routed segment with a slash.
    +	 *
    +	 * @param	int	$n	Index
    +	 * @param	string	$where	Where to add the slash ('trailing' or 'leading')
     	 * @return	string
     	 */
     	public function slash_rsegment($n, $where = 'trailing')
    @@ -557,11 +576,16 @@ public function slash_rsegment($n, $where = 'trailing')
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Fetch a URI Segment and add a trailing slash - helper function
    +	 * Internal Slash segment
    +	 *
    +	 * Fetches an URI Segment and adds a slash to it.
     	 *
    -	 * @param	int
    -	 * @param	string
    -	 * @param	string
    +	 * @used-by	CI_URI::slash_segment()
    +	 * @used-by	CI_URI::slash_rsegment()
    +	 *
    +	 * @param	int	$n	Index
    +	 * @param	string	$where	Where to add the slash ('trailing' or 'leading')
    +	 * @param	string	$which	Array name ('segment' or 'rsegment')
     	 * @return	string
     	 */
     	protected function _slash_segment($n, $where = 'trailing', $which = 'segment')
    @@ -585,7 +609,7 @@ protected function _slash_segment($n, $where = 'trailing', $which = 'segment')
     	/**
     	 * Segment Array
     	 *
    -	 * @return	array
    +	 * @return	array	CI_URI::$segments
     	 */
     	public function segment_array()
     	{
    @@ -597,7 +621,7 @@ public function segment_array()
     	/**
     	 * Routed Segment Array
     	 *
    -	 * @return	array
    +	 * @return	array	CI_URI::$rsegments
     	 */
     	public function rsegment_array()
     	{
    @@ -631,9 +655,9 @@ public function total_rsegments()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Fetch the entire URI string
    +	 * Fetch URI string
     	 *
    -	 * @return	string
    +	 * @return	string	CI_URI::$uri_string
     	 */
     	public function uri_string()
     	{
    @@ -643,7 +667,7 @@ public function uri_string()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Fetch the entire Re-routed URI string
    +	 * Fetch Re-routed URI string
     	 *
     	 * @return	string
     	 */
    
    From 51b7acda68a144d4e6d917f467a53d0299b326dd Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Mon, 29 Oct 2012 16:23:13 +0200
    Subject: [PATCH 1798/5397] [ci skip] Clarify explanation of the 404_override
     setting in application/config/routes.php
    
    ---
     application/config/routes.php | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/application/config/routes.php b/application/config/routes.php
    index 0011986158e..d1a4419b746 100644
    --- a/application/config/routes.php
    +++ b/application/config/routes.php
    @@ -59,8 +59,8 @@
     |
     |	$route['404_override'] = 'errors/page_missing';
     |
    -| This route will tell the Router what URI segments to use if those provided
    -| in the URL cannot be matched to a valid route.
    +| This route will tell the Router which controller/method to use if those
    +| provided in the URL cannot be matched to a valid route.
     |
     */
     
    
    From 9bea4be2efa74b963d3cd0bbaa4635deffc2f109 Mon Sep 17 00:00:00 2001
    From: GDmac 
    Date: Tue, 30 Oct 2012 06:14:19 +0100
    Subject: [PATCH 1799/5397] Fix #1938
    
    Where the email library removed multiple spaces inside a plain text message.
    
    Signed-off-by: GDmac 
    ---
     system/libraries/Email.php | 9 ++++++---
     1 file changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/system/libraries/Email.php b/system/libraries/Email.php
    index edca303ff6b..7280466a536 100644
    --- a/system/libraries/Email.php
    +++ b/system/libraries/Email.php
    @@ -770,6 +770,9 @@ protected function _get_alt_message()
     			$body = str_replace(str_repeat("\n", $i), "\n\n", $body);
     		}
     
    +		// Reduce multiple spaces
    +		$str = preg_replace('| +|', ' ', $str);
    +
     		return ($this->wordwrap)
     			? $this->word_wrap($body, 76)
     			: $body;
    @@ -792,15 +795,15 @@ public function word_wrap($str, $charlim = NULL)
     			$charlim = empty($this->wrapchars) ? 76 : $this->wrapchars;
     		}
     
    -		// Reduce multiple spaces
    -		$str = preg_replace('| +|', ' ', $str);
    -
     		// Standardize newlines
     		if (strpos($str, "\r") !== FALSE)
     		{
     			$str = str_replace(array("\r\n", "\r"), "\n", $str);
     		}
     
    +		// Reduce multiple spaces at end of line
    +		$str = preg_replace('| +\n|', "\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();
    
    From 9d82e8212d9b63a6d4de0b7858257c50a96f6b8a Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Tue, 30 Oct 2012 11:30:47 +0200
    Subject: [PATCH 1800/5397] [ci skip] Alter a changelog entry for 2.1.3
    
    ---
     user_guide_src/source/changelog.rst | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 4b161dc2d8b..c7f72f60944 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -413,7 +413,7 @@ Bug fixes for 2.1.3
     
     -  Fixed a bug (#1543) - File-based :doc:`Caching ` method ``get_metadata()`` used a non-existent array key to look for the TTL value.
     -  Fixed a bug (#1314) - :doc:`Session Library ` method ``sess_destroy()`` didn't destroy the userdata array.
    --  Fixed a bug (#804) - Profiler library was trying to handle objects as strings in some cases, resulting in *E_WARNING* messages being issued by ``htmlspecialchars()``.
    +-  Fixed a bug (#804) - :doc:`Profiler library ` was trying to handle objects as strings in some cases, resulting in *E_WARNING* messages being issued by ``htmlspecialchars()``.
     -  Fixed a bug (#1699) - :doc:`Migration Library ` ignored the ``$config['migration_path']`` setting.
     -  Fixed a bug (#227) - :doc:`Input Library ` allowed unconditional spoofing of HTTP clients' IP addresses through the *HTTP_CLIENT_IP* header.
     -  Fixed a bug (#907) - :doc:`Input Library ` ignored *HTTP_X_CLUSTER_CLIENT_IP* and *HTTP_X_CLIENT_IP* headers when checking for proxies.
    
    From 0dfb62ff0ab1d184e20819a066139fea28d68da4 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Tue, 30 Oct 2012 11:37:15 +0200
    Subject: [PATCH 1801/5397] [ci skip] Fix a note in the QB documentation
    
    ---
     user_guide_src/source/database/query_builder.rst | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/user_guide_src/source/database/query_builder.rst b/user_guide_src/source/database/query_builder.rst
    index 5380d09981d..61cd7dfed28 100644
    --- a/user_guide_src/source/database/query_builder.rst
    +++ b/user_guide_src/source/database/query_builder.rst
    @@ -492,8 +492,8 @@ Or multiple function calls can be made if you need multiple fields.
     .. note:: order_by() was formerly known as orderby(), which has been
     	removed.
     
    -.. note:: random ordering is not currently supported in Oracle or MSSQL
    -	drivers. These will default to 'ASC'.
    +.. note:: Random ordering is not currently supported in Oracle and
    +	will default to ASC instead.
     
     $this->db->limit()
     ==================
    
    From 7676c2d6761cb3cdeccf005c2a30140f0ba3ced5 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Tue, 30 Oct 2012 13:42:01 +0200
    Subject: [PATCH 1802/5397] Fix issue #658 (:any wildcard matching slashes)
    
    ---
     system/core/Router.php                        |  2 +-
     user_guide_src/source/changelog.rst           |  1 +
     user_guide_src/source/general/routing.rst     | 30 +++++++++++---
     .../source/installation/upgrade_300.rst       | 40 ++++++++++++++-----
     4 files changed, 58 insertions(+), 15 deletions(-)
    
    diff --git a/system/core/Router.php b/system/core/Router.php
    index efee2439f01..a5e29f1a31e 100644
    --- a/system/core/Router.php
    +++ b/system/core/Router.php
    @@ -368,7 +368,7 @@ protected function _parse_routes()
     		foreach ($this->routes as $key => $val)
     		{
     			// Convert wild-cards to RegEx
    -			$key = str_replace(array(':any', ':num'), array('.+', '[0-9]+'), $key);
    +			$key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key);
     
     			// Does the RegEx match?
     			if (preg_match('#^'.$key.'$#', $uri))
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index c7f72f60944..5b3ca3e9f3d 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -399,6 +399,7 @@ Bug fixes for 3.0
     -  Fixed a bug (#1630) - :doc:`Form Helper ` function ``set_value()`` didn't escape HTML entities.
     -  Fixed a bug (#142) - :doc:`Form Helper ` function ``form_dropdown()`` didn't escape HTML entities in option values.
     -  Fixed a bug (#50) - :doc:`Session Library ` unnecessarily stripped slashed from serialized data, making it impossible to read objects in a namespace.
    +-  Fixed a bug (#658) - :doc:`Routing ` wildcard **:any** didn't work as advertised and matched multiple URI segments instead of all characters within a single segment.
     
     Version 2.1.3
     =============
    diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst
    index c039370706a..a6332c90c05 100644
    --- a/user_guide_src/source/general/routing.rst
    +++ b/user_guide_src/source/general/routing.rst
    @@ -29,7 +29,7 @@ Setting your own routing rules
     Routing rules are defined in your application/config/routes.php file. In
     it you'll see an array called $route that permits you to specify your
     own routing criteria. Routes can either be specified using wildcards or
    -Regular Expressions
    +Regular Expressions.
     
     Wildcards
     =========
    @@ -47,7 +47,11 @@ segment of the URL, and a number is found in the second segment, the
     You can match literal values or you can use two wildcard types:
     
     **(:num)** will match a segment containing only numbers.
    -**(:any)** will match a segment containing any character.
    +**(:any)** will match a segment containing any character (except for '/', which is the segment delimiter).
    +
    +.. note:: Wildcards are actually aliases for regular expressions, with
    +	**:any** being translated to **[^/]+** and **:num** to **[0-9]+**,
    +	respectively.
     
     .. note:: Routes will run in the order they are defined. Higher routes
     	will always take precedence over lower ones.
    @@ -104,12 +108,28 @@ rules. Any valid regular expression is allowed, as are back-references.
     
     A typical RegEx route might look something like this::
     
    -	$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";
    +	$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';
     
     In the above example, a URI similar to products/shirts/123 would instead
    -call the shirts controller class and the id_123 function.
    +call the shirts controller class and the id_123 method.
    +
    +With regular expressions, you can also catch a segment containing a
    +forward slash ('/'), which would usually represent the delimiter between
    +multiple segments.
    +For example, if a user accesses a password protected area of your web
    +application and you wish to be able to redirect them back to the same
    +page after they log in, you may find this example useful::
    +
    +	$route['login/(.+)'] = 'auth/login/$1';
    +
    +That will call the auth controller class and its ``login()`` method,
    +passing everything contained in the URI after *login/* as a parameter.
    +
    +For those of you who don't know regular expressions and want to learn
    +more about them, `regular-expressions.info `
    +might be a good starting point.
     
    -You can also mix and match wildcards with regular expressions.
    +..note:: You can also mix and match wildcards with regular expressions.
     
     Reserved Routes
     ===============
    diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst
    index dcdd6e3519d..6d99f465521 100644
    --- a/user_guide_src/source/installation/upgrade_300.rst
    +++ b/user_guide_src/source/installation/upgrade_300.rst
    @@ -52,11 +52,12 @@ Step 5: Update your config/database.php
     ***************************************
     
     Due to 3.0.0's renaming of Active Record to Query Builder, inside your `config/database.php`, you will
    -need to rename the `$active_record` variable to `$query_builder`.
    +need to rename the `$active_record` variable to `$query_builder`
    +::
     
    -    $active_group = 'default';
    -    // $active_record = TRUE;
    -    $query_builder = TRUE;
    +	$active_group = 'default';
    +	// $active_record = TRUE;
    +	$query_builder = TRUE;
     
     *******************************
     Step 6: Move your errors folder
    @@ -64,15 +65,36 @@ Step 6: Move your errors folder
     
     In version 3.0.0, the errors folder has been moved from _application/errors* to _application/views/errors*.
     
    +*******************************************************
    +Step 7: Update your config/routes.php containing (:any)
    +*******************************************************
    +
    +Historically, CodeIgniter has always provided the **:any** wildcard in routing,
    +with the intention of providing a way to match any character **within** an URI segment.
    +
    +However, the **:any** wildcard is actually just an alias for a regular expression
    +and used to be executed in that manner as **.+**. This is considered a bug, as it
    +also matches the / (forward slash) character, which is the URI segment delimiter
    +and that was never the intention. In CodeIgniter 3, the **:any** wildcard will now
    +represent **[^/]+**, so that it will not match a forward slash.
    +
    +There are certainly many developers that have utilized this bug as an actual feature.
    +If you're one of them and want to match a forward slash, please use the **.+**
    +regular expression::
    +
    +	(.+)	// matches ANYTHING
    +	(:any)	// matches any character, except for '/'
    +
    +
     ****************************************************************************
    -Step 7: Check the calls to Array Helper's element() and elements() functions
    +Step 8: Check the calls to Array Helper's element() and elements() functions
     ****************************************************************************
     
     The default return value of these functions, when the required elements
     don't exist, has been changed from FALSE to NULL.
     
     **********************************************************
    -Step 8: Change usage of Email library with multiple emails
    +Step 9: Change usage of Email library with multiple emails
     **********************************************************
     
     The :doc:`Email library <../libraries/email>` will automatically clear the
    @@ -87,9 +109,9 @@ pass FALSE as the first parameter in the ``send()`` method:
      	}
     
     
    -***************************************************************
    -Step 9: Remove usage of (previously) deprecated functionalities
    -***************************************************************
    +****************************************************************
    +Step 10: Remove usage of (previously) deprecated functionalities
    +****************************************************************
     
     In addition to the ``$autoload['core']`` configuration setting, there's a number of other functionalities
     that have been removed in CodeIgniter 3.0.0:
    
    From 759d322a2e7d16278dede0eeafb86f5e5ea1ddc0 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Tue, 30 Oct 2012 11:30:47 +0200
    Subject: [PATCH 1803/5397] [ci skip] Alter a changelog entry for 2.1.3
    
    ---
     user_guide_src/source/changelog.rst | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 4b161dc2d8b..c7f72f60944 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -413,7 +413,7 @@ Bug fixes for 2.1.3
     
     -  Fixed a bug (#1543) - File-based :doc:`Caching ` method ``get_metadata()`` used a non-existent array key to look for the TTL value.
     -  Fixed a bug (#1314) - :doc:`Session Library ` method ``sess_destroy()`` didn't destroy the userdata array.
    --  Fixed a bug (#804) - Profiler library was trying to handle objects as strings in some cases, resulting in *E_WARNING* messages being issued by ``htmlspecialchars()``.
    +-  Fixed a bug (#804) - :doc:`Profiler library ` was trying to handle objects as strings in some cases, resulting in *E_WARNING* messages being issued by ``htmlspecialchars()``.
     -  Fixed a bug (#1699) - :doc:`Migration Library ` ignored the ``$config['migration_path']`` setting.
     -  Fixed a bug (#227) - :doc:`Input Library ` allowed unconditional spoofing of HTTP clients' IP addresses through the *HTTP_CLIENT_IP* header.
     -  Fixed a bug (#907) - :doc:`Input Library ` ignored *HTTP_X_CLUSTER_CLIENT_IP* and *HTTP_X_CLIENT_IP* headers when checking for proxies.
    
    From afca803c1a9212575c9a6454d5a648d1170da91d Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Tue, 30 Oct 2012 11:37:15 +0200
    Subject: [PATCH 1804/5397] [ci skip] Fix a note in the QB documentation
    
    ---
     user_guide_src/source/database/query_builder.rst | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/user_guide_src/source/database/query_builder.rst b/user_guide_src/source/database/query_builder.rst
    index 5380d09981d..61cd7dfed28 100644
    --- a/user_guide_src/source/database/query_builder.rst
    +++ b/user_guide_src/source/database/query_builder.rst
    @@ -492,8 +492,8 @@ Or multiple function calls can be made if you need multiple fields.
     .. note:: order_by() was formerly known as orderby(), which has been
     	removed.
     
    -.. note:: random ordering is not currently supported in Oracle or MSSQL
    -	drivers. These will default to 'ASC'.
    +.. note:: Random ordering is not currently supported in Oracle and
    +	will default to ASC instead.
     
     $this->db->limit()
     ==================
    
    From ed1741125d638cfaa1bb2918b7f140f282a107de Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Tue, 30 Oct 2012 13:42:01 +0200
    Subject: [PATCH 1805/5397] Fix issue #658 (:any wildcard matching slashes)
    
    ---
     system/core/Router.php                        |  2 +-
     user_guide_src/source/changelog.rst           |  1 +
     user_guide_src/source/general/routing.rst     | 30 +++++++++++---
     .../source/installation/upgrade_300.rst       | 40 ++++++++++++++-----
     4 files changed, 58 insertions(+), 15 deletions(-)
    
    diff --git a/system/core/Router.php b/system/core/Router.php
    index efee2439f01..a5e29f1a31e 100644
    --- a/system/core/Router.php
    +++ b/system/core/Router.php
    @@ -368,7 +368,7 @@ protected function _parse_routes()
     		foreach ($this->routes as $key => $val)
     		{
     			// Convert wild-cards to RegEx
    -			$key = str_replace(array(':any', ':num'), array('.+', '[0-9]+'), $key);
    +			$key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key);
     
     			// Does the RegEx match?
     			if (preg_match('#^'.$key.'$#', $uri))
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index c7f72f60944..5b3ca3e9f3d 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -399,6 +399,7 @@ Bug fixes for 3.0
     -  Fixed a bug (#1630) - :doc:`Form Helper ` function ``set_value()`` didn't escape HTML entities.
     -  Fixed a bug (#142) - :doc:`Form Helper ` function ``form_dropdown()`` didn't escape HTML entities in option values.
     -  Fixed a bug (#50) - :doc:`Session Library ` unnecessarily stripped slashed from serialized data, making it impossible to read objects in a namespace.
    +-  Fixed a bug (#658) - :doc:`Routing ` wildcard **:any** didn't work as advertised and matched multiple URI segments instead of all characters within a single segment.
     
     Version 2.1.3
     =============
    diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst
    index c039370706a..a6332c90c05 100644
    --- a/user_guide_src/source/general/routing.rst
    +++ b/user_guide_src/source/general/routing.rst
    @@ -29,7 +29,7 @@ Setting your own routing rules
     Routing rules are defined in your application/config/routes.php file. In
     it you'll see an array called $route that permits you to specify your
     own routing criteria. Routes can either be specified using wildcards or
    -Regular Expressions
    +Regular Expressions.
     
     Wildcards
     =========
    @@ -47,7 +47,11 @@ segment of the URL, and a number is found in the second segment, the
     You can match literal values or you can use two wildcard types:
     
     **(:num)** will match a segment containing only numbers.
    -**(:any)** will match a segment containing any character.
    +**(:any)** will match a segment containing any character (except for '/', which is the segment delimiter).
    +
    +.. note:: Wildcards are actually aliases for regular expressions, with
    +	**:any** being translated to **[^/]+** and **:num** to **[0-9]+**,
    +	respectively.
     
     .. note:: Routes will run in the order they are defined. Higher routes
     	will always take precedence over lower ones.
    @@ -104,12 +108,28 @@ rules. Any valid regular expression is allowed, as are back-references.
     
     A typical RegEx route might look something like this::
     
    -	$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";
    +	$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';
     
     In the above example, a URI similar to products/shirts/123 would instead
    -call the shirts controller class and the id_123 function.
    +call the shirts controller class and the id_123 method.
    +
    +With regular expressions, you can also catch a segment containing a
    +forward slash ('/'), which would usually represent the delimiter between
    +multiple segments.
    +For example, if a user accesses a password protected area of your web
    +application and you wish to be able to redirect them back to the same
    +page after they log in, you may find this example useful::
    +
    +	$route['login/(.+)'] = 'auth/login/$1';
    +
    +That will call the auth controller class and its ``login()`` method,
    +passing everything contained in the URI after *login/* as a parameter.
    +
    +For those of you who don't know regular expressions and want to learn
    +more about them, `regular-expressions.info `
    +might be a good starting point.
     
    -You can also mix and match wildcards with regular expressions.
    +..note:: You can also mix and match wildcards with regular expressions.
     
     Reserved Routes
     ===============
    diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst
    index dcdd6e3519d..6d99f465521 100644
    --- a/user_guide_src/source/installation/upgrade_300.rst
    +++ b/user_guide_src/source/installation/upgrade_300.rst
    @@ -52,11 +52,12 @@ Step 5: Update your config/database.php
     ***************************************
     
     Due to 3.0.0's renaming of Active Record to Query Builder, inside your `config/database.php`, you will
    -need to rename the `$active_record` variable to `$query_builder`.
    +need to rename the `$active_record` variable to `$query_builder`
    +::
     
    -    $active_group = 'default';
    -    // $active_record = TRUE;
    -    $query_builder = TRUE;
    +	$active_group = 'default';
    +	// $active_record = TRUE;
    +	$query_builder = TRUE;
     
     *******************************
     Step 6: Move your errors folder
    @@ -64,15 +65,36 @@ Step 6: Move your errors folder
     
     In version 3.0.0, the errors folder has been moved from _application/errors* to _application/views/errors*.
     
    +*******************************************************
    +Step 7: Update your config/routes.php containing (:any)
    +*******************************************************
    +
    +Historically, CodeIgniter has always provided the **:any** wildcard in routing,
    +with the intention of providing a way to match any character **within** an URI segment.
    +
    +However, the **:any** wildcard is actually just an alias for a regular expression
    +and used to be executed in that manner as **.+**. This is considered a bug, as it
    +also matches the / (forward slash) character, which is the URI segment delimiter
    +and that was never the intention. In CodeIgniter 3, the **:any** wildcard will now
    +represent **[^/]+**, so that it will not match a forward slash.
    +
    +There are certainly many developers that have utilized this bug as an actual feature.
    +If you're one of them and want to match a forward slash, please use the **.+**
    +regular expression::
    +
    +	(.+)	// matches ANYTHING
    +	(:any)	// matches any character, except for '/'
    +
    +
     ****************************************************************************
    -Step 7: Check the calls to Array Helper's element() and elements() functions
    +Step 8: Check the calls to Array Helper's element() and elements() functions
     ****************************************************************************
     
     The default return value of these functions, when the required elements
     don't exist, has been changed from FALSE to NULL.
     
     **********************************************************
    -Step 8: Change usage of Email library with multiple emails
    +Step 9: Change usage of Email library with multiple emails
     **********************************************************
     
     The :doc:`Email library <../libraries/email>` will automatically clear the
    @@ -87,9 +109,9 @@ pass FALSE as the first parameter in the ``send()`` method:
      	}
     
     
    -***************************************************************
    -Step 9: Remove usage of (previously) deprecated functionalities
    -***************************************************************
    +****************************************************************
    +Step 10: Remove usage of (previously) deprecated functionalities
    +****************************************************************
     
     In addition to the ``$autoload['core']`` configuration setting, there's a number of other functionalities
     that have been removed in CodeIgniter 3.0.0:
    
    From 7330384763d39d4b6066e036def51996a82103b4 Mon Sep 17 00:00:00 2001
    From: GDmac 
    Date: Tue, 30 Oct 2012 13:05:05 +0100
    Subject: [PATCH 1806/5397] Description for Fix #1938 added to changelog
    
    Signed-off-by: GDmac 
    ---
     user_guide_src/source/changelog.rst | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 5b3ca3e9f3d..065daf54b67 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -400,6 +400,7 @@ Bug fixes for 3.0
     -  Fixed a bug (#142) - :doc:`Form Helper ` function ``form_dropdown()`` didn't escape HTML entities in option values.
     -  Fixed a bug (#50) - :doc:`Session Library ` unnecessarily stripped slashed from serialized data, making it impossible to read objects in a namespace.
     -  Fixed a bug (#658) - :doc:`Routing ` wildcard **:any** didn't work as advertised and matched multiple URI segments instead of all characters within a single segment.
    +-  Fixed a bug (#1938) - :doc:`Email ` where the email library removed multiple spaces inside a pre-formatted plain text message.
     
     Version 2.1.3
     =============
    
    From d4516e3562b1c412d7c3edea874eaa6e6922ad0e Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Wed, 31 Oct 2012 14:44:38 +0200
    Subject: [PATCH 1807/5397] CI_URI::_detect_uri() to accept absolute URIs
    
    (thanks to @sourcejedi, PR #1326)
    
    For HTTP/1.1 compliance, RFC2616 specifies that both relative
    and absolute URI formats must be accepted:
    
    - http://localhost/path/ (absolute)
    - /path/ (relative)
    ---
     system/core/URI.php                 | 40 ++++++++++++++---------------
     user_guide_src/source/changelog.rst |  4 ++-
     2 files changed, 23 insertions(+), 21 deletions(-)
    
    diff --git a/system/core/URI.php b/system/core/URI.php
    index d67a35d4b44..3d942eda70f 100644
    --- a/system/core/URI.php
    +++ b/system/core/URI.php
    @@ -185,37 +185,39 @@ protected function _detect_uri()
     			return '';
     		}
     
    -		if (strpos($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']) === 0)
    -		{
    -			$uri = substr($_SERVER['REQUEST_URI'], strlen($_SERVER['SCRIPT_NAME']));
    -		}
    -		elseif (strpos($_SERVER['REQUEST_URI'], dirname($_SERVER['SCRIPT_NAME'])) === 0)
    +		$uri = parse_url($_SERVER['REQUEST_URI']);
    +		$query = isset($uri['query']) ? $uri['query'] : '';
    +		$uri = isset($uri['path']) ? $uri['path'] : '';
    +
    +		if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0)
     		{
    -			$uri = substr($_SERVER['REQUEST_URI'], strlen(dirname($_SERVER['SCRIPT_NAME'])));
    +			$uri = (string) substr($uri, strlen($_SERVER['SCRIPT_NAME']));
     		}
    -		else
    +		elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0)
     		{
    -			$uri = $_SERVER['REQUEST_URI'];
    +			$uri = (string) 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 (strpos($uri, '?/') === 0)
    +
    +		if ($uri === '' && strncmp($query, '/', 1) === 0)
    +		{
    +			$query = explode('?', $query, 2);
    +			$uri = $query[0];
    +			$_SERVER['QUERY_STRING'] = isset($query[1]) ? $query[1] : '';
    +		}
    +		else
     		{
    -			$uri = substr($uri, 2);
    +			$_SERVER['QUERY_STRING'] = $query;
     		}
     
    -		$parts = explode('?', $uri, 2);
    -		$uri = $parts[0];
    -		if (isset($parts[1]))
    +		if ($_SERVER['QUERY_STRING'] === '')
     		{
    -			$_SERVER['QUERY_STRING'] = $parts[1];
    -			parse_str($_SERVER['QUERY_STRING'], $_GET);
    +			$_GET = array();
     		}
     		else
     		{
    -			$_SERVER['QUERY_STRING'] = '';
    -			$_GET = array();
    +			parse_str($_SERVER['QUERY_STRING'], $_GET);
     		}
     
     		if ($uri === '/' OR $uri === '')
    @@ -223,8 +225,6 @@ protected function _detect_uri()
     			return '/';
     		}
     
    -		$uri = parse_url('pseudo://hostname/'.$uri, PHP_URL_PATH);
    -
     		// Do some final cleaning of the URI and return it
     		return str_replace(array('//', '../'), '/', trim($uri, '/'));
     	}
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 065daf54b67..8e823d08d89 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -230,7 +230,9 @@ Release Date: Not Released
     
     -  Core
     
    -   -  Changed private methods in the :doc:`URI Library ` to protected so MY_URI can override them.
    +   -  :doc:`URI Library ` changes include:
    +	 -  Changed private methods to protected so that MY_URI can override them.
    +	 -  Changed ``_detect_uri()`` to accept absolute URIs for compatibility with HTTP/1.1 as per `RFC2616 `.
        -  Removed ``CI_CORE`` boolean constant from *CodeIgniter.php* (no longer Reactor and Core versions).
        -  :doc:`Loader Library ` changes include:
     	 -  Added method ``get_vars()`` to the Loader to retrieve all variables loaded with ``$this->load->vars()``.
    
    From f2b19fee7876708c7a7bb5cba6b7df682a9d2a53 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Wed, 31 Oct 2012 16:16:24 +0200
    Subject: [PATCH 1808/5397] Multiple improvements to the URI class
    
    (thanks to @sourcejedi, PR #1326 for most of the ideas)
    
     - Renamed _detect_uri() and _parse_cli_args() to _parse_request_uri() and _parse_argv() respectively.
     - Added _parse_query_string() which allows us to detect the URI path from QUERY_STRING much like it is done in _parse_request_uri().
    
    (the above changes also allow for a simpler logic in the case where the *uri_protocol* setting is not set to 'AUTO')
    
     - Updated application/config/config.php with a better list of the *uri_protocol* options.
     - Added _reset_query_string() to aid in re-processing  from the QUERY_STRING (utilized in _parse_request_uri() and _parse_query_string()).
    ---
     application/config/config.php       |  11 +--
     system/core/URI.php                 | 103 ++++++++++++++++++++--------
     user_guide_src/source/changelog.rst |   5 +-
     3 files changed, 85 insertions(+), 34 deletions(-)
    
    diff --git a/application/config/config.php b/application/config/config.php
    index ab1508e7b99..6867cee8877 100644
    --- a/application/config/config.php
    +++ b/application/config/config.php
    @@ -62,11 +62,12 @@
     | URI string.  The default setting of 'AUTO' works for most servers.
     | If your links do not seem to work, try one of the other delicious flavors:
     |
    -| 'AUTO'			Default - auto detects
    -| 'PATH_INFO'		Uses the PATH_INFO
    -| 'QUERY_STRING'	Uses the QUERY_STRING
    -| 'REQUEST_URI'		Uses the REQUEST_URI
    -| 'ORIG_PATH_INFO'	Uses the ORIG_PATH_INFO
    +| 'AUTO'		Default - auto detects
    +| 'CLI' or 'argv'	Uses $_SERVER['argv'] (for php-cli only)
    +| 'REQUEST_URI'		Uses $_SERVER['REQUEST_URI']
    +| 'PATH_INFO'		Uses $_SERVER['PATH_INFO']
    +| 'QUERY_STRING'	Uses $_SERVER['QUERY_STRING']
    +| 'ORIG_PATH_INFO'	Uses $_SERVER['ORIG_PATH_INFO']
     |
     */
     $config['uri_protocol']	= 'AUTO';
    diff --git a/system/core/URI.php b/system/core/URI.php
    index 3d942eda70f..6692d07a678 100644
    --- a/system/core/URI.php
    +++ b/system/core/URI.php
    @@ -98,12 +98,12 @@ public function _fetch_uri_string()
     			// Is the request coming from the command line?
     			if ($this->_is_cli_request())
     			{
    -				$this->_set_uri_string($this->_parse_cli_args());
    +				$this->_set_uri_string($this->_parse_argv());
     				return;
     			}
     
     			// Let's try the REQUEST_URI first, this will work in most situations
    -			if ($uri = $this->_detect_uri())
    +			if (($uri = $this->_parse_request_uri()) !== '')
     			{
     				$this->_set_uri_string($uri);
     				return;
    @@ -111,18 +111,17 @@ public function _fetch_uri_string()
     
     			// 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)
    +			$uri = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
    +			if (trim($uri, '/') !== '' && $uri !== '/'.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, '/') !== '')
    +			if (($uri = $this->_parse_query_string()) !== '')
     			{
    -				$this->_set_uri_string($path);
    +				$this->_set_uri_string($uri);
     				return;
     			}
     
    @@ -140,19 +139,19 @@ public function _fetch_uri_string()
     
     		$uri = strtoupper($this->config->item('uri_protocol'));
     
    -		if ($uri === 'REQUEST_URI')
    +		if ($uri === 'CLI')
     		{
    -			$this->_set_uri_string($this->_detect_uri());
    +			$this->_set_uri_string($this->_parse_argv());
     			return;
     		}
    -		elseif ($uri === 'CLI')
    +		elseif (method_exists($this, ($method = '_parse_'.strtolower($uri))))
     		{
    -			$this->_set_uri_string($this->_parse_cli_args());
    +			$this->_set_uri_string($this->$method());
     			return;
     		}
     
    -		$path = isset($_SERVER[$uri]) ? $_SERVER[$uri] : @getenv($uri);
    -		$this->_set_uri_string($path);
    +		$uri = isset($_SERVER[$uri]) ? $_SERVER[$uri] : @getenv($uri);
    +		$this->_set_uri_string($uri);
     	}
     
     	// --------------------------------------------------------------------
    @@ -172,13 +171,15 @@ protected function _set_uri_string($str)
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Detects URI
    +	 * Parse REQUEST_URI
     	 *
    -	 * Will detect the URI automatically and fix the query string if necessary.
    +	 * Will parse REQUEST_URI and automatically detect the URI from it,
    +	 * while fixing the query string if necessary.
     	 *
    +	 * @used-by	CI_URI::_fetch_uri_string()
     	 * @return	string
     	 */
    -	protected function _detect_uri()
    +	protected function _parse_request_uri()
     	{
     		if ( ! isset($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']))
     		{
    @@ -197,10 +198,10 @@ protected function _detect_uri()
     		{
     			$uri = (string) 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 ($uri === '' && strncmp($query, '/', 1) === 0)
    +		if (trim($uri, '/') === '' && strncmp($query, '/', 1) === 0)
     		{
     			$query = explode('?', $query, 2);
     			$uri = $query[0];
    @@ -211,14 +212,7 @@ protected function _detect_uri()
     			$_SERVER['QUERY_STRING'] = $query;
     		}
     
    -		if ($_SERVER['QUERY_STRING'] === '')
    -		{
    -			$_GET = array();
    -		}
    -		else
    -		{
    -			parse_str($_SERVER['QUERY_STRING'], $_GET);
    -		}
    +		$this->_reset_query_string();
     
     		if ($uri === '/' OR $uri === '')
     		{
    @@ -231,6 +225,59 @@ protected function _detect_uri()
     
     	// --------------------------------------------------------------------
     
    +	/**
    +	 * Parse QUERY_STRING
    +	 *
    +	 * Will parse QUERY_STRING and automatically detect the URI from it.
    +	 *
    +	 * @used-by	CI_URI::_fetch_uri_string()
    +	 * @return	string
    +	 */
    +	protected function _parse_query_string()
    +	{
    +		$uri = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
    +
    +		if (trim($uri, '/') === '')
    +		{
    +			return '';
    +		}
    +		elseif (strncmp($uri, '/', 1) === 0)
    +		{
    +			$uri = explode('?', $uri, 2);
    +			$_SERVER['QUERY_STRING'] = isset($uri[1]) ? $uri[1] : '';
    +			$uri = $uri[0];
    +		}
    +		$this->_reset_query_string();
    +
    +		return str_replace(array('//', '../'), '/', trim($uri, '/'));
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Reset QUERY_STRING
    +	 *
    +	 * Re-processes QUERY_STRING to and fetches the real GET values from it.
    +	 * Useful for cases where we got the URI path from it's query string.
    +	 *
    +	 * @used-by	CI_URI::_parse_request_uri()
    +	 * @used-by	CI_URI::_parse_query_string()
    +	 * @return	void
    +	 */
    +	protected function _reset_query_string()
    +	{
    +		if ($_SERVER['QUERY_STRING'] === '')
    +		{
    +			$_GET = array();
    +		}
    +		else
    +		{
    +			parse_str($_SERVER['QUERY_STRING']);
    +		}
    +	}
    +
    +	// --------------------------------------------------------------------
    +
     	/**
     	 * Is CLI Request?
     	 *
    @@ -255,10 +302,10 @@ protected function _is_cli_request()
     	 *
     	 * @return	string
     	 */
    -	protected function _parse_cli_args()
    +	protected function _parse_argv()
     	{
     		$args = array_slice($_SERVER['argv'], 1);
    -		return $args ? '/'.implode('/', $args) : '';
    +		return $args ? implode('/', $args) : '';
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 8e823d08d89..4fda2903ad4 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -232,7 +232,10 @@ Release Date: Not Released
     
        -  :doc:`URI Library ` changes include:
     	 -  Changed private methods to protected so that MY_URI can override them.
    -	 -  Changed ``_detect_uri()`` to accept absolute URIs for compatibility with HTTP/1.1 as per `RFC2616 `.
    +	 -  Renamed internal method ``_parse_cli_args()`` to ``_parse_argv()``.
    +	 -  Renamed internal method ``_detect_uri()`` to ``_parse_request_uri()``.
    +	 -  Changed ``_parse_request_uri()`` to accept absolute URIs for compatibility with HTTP/1.1 as per `RFC2616 `.
    +	 -  Added protected method ``_parse_query_string()`` to URI paths in the the **QUERY_STRING** value, like ``_parse_request_uri()`` does.
        -  Removed ``CI_CORE`` boolean constant from *CodeIgniter.php* (no longer Reactor and Core versions).
        -  :doc:`Loader Library ` changes include:
     	 -  Added method ``get_vars()`` to the Loader to retrieve all variables loaded with ``$this->load->vars()``.
    
    From a9a1d2520493211ca35f7ab56866d0e154afc1c3 Mon Sep 17 00:00:00 2001
    From: Jonatas Miguel 
    Date: Wed, 31 Oct 2012 14:26:26 +0000
    Subject: [PATCH 1809/5397] removed conflict markers
    
    ---
     user_guide_src/source/changelog.rst | 24 ------------------------
     1 file changed, 24 deletions(-)
    
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index c87aebd570b..990ba13862d 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -145,11 +145,7 @@ Release Date: Not Released
        -  Added PDO support for ``create_database()``, ``drop_database()`` and ``drop_table()`` in :doc:`Database Forge `.
        -  Added ``unbuffered_row()`` method for getting a row without prefetching whole result (consume less memory).
        -  Added PDO support for ``list_fields()`` in :doc:`Database Results `.
    -<<<<<<< HEAD
    -   -  Added capability for packages to hold database.php config files
    -=======
        -  Added capability for packages to hold *database.php* config files
    ->>>>>>> a7001e968a4791312391eb245ad84888893cda8f
        -  Added subdrivers support (currently only used by PDO).
        -  Added MySQL client compression support.
        -  Added encrypted connections support (for *mysql*, *sqlsrv* and PDO with *sqlsrv*).
    @@ -228,25 +224,6 @@ Release Date: Not Released
     -  Core
     
        -  Changed private methods in the :doc:`URI Library ` to protected so MY_URI can override them.
    -<<<<<<< HEAD
    -   -  Removed CI_CORE boolean constant from CodeIgniter.php (no longer Reactor and Core versions).
    -   -  Added method get_vars() to the :doc:`Loader Library ` to retrieve all variables loaded with $this->load->vars().
    -   -  is_loaded() function from system/core/Commons.php now returns a reference.
    -   -  $config['rewrite_short_tags'] now has no effect when using PHP 5.4 as *` to retrieve $_SERVER['REQUEST_METHOD'].
    -   -  Modified valid_ip() to use PHP's filter_var() in the :doc:`Input Library `.
    -   -  Added support for HTTP-Only cookies with new config option ``cookie_httponly`` (default FALSE).
    -   -  Renamed method _call_hook() to call_hook() in the :doc:`Hooks Library `.
    -   -  Added get_content_type() method to the :doc:`Output Library `.
    -   -  Added get_mimes() function to system/core/Commons.php to return the config/mimes.php array.
    -   -  Added a second argument to set_content_type() in the :doc:`Output Library ` that allows setting the document charset as well.
    -   -  $config['time_reference'] now supports all timezone strings supported by PHP.
    -   -  Added support for HTTP code 303 ("See Other") in set_status_header().
    -   -  Changed :doc:`Config Library ` method site_url() to accept an array as well.
    -   -  Added method ``strip_image_tags()`` to the :doc:`Security Library `.
    -   -  Changed ``_exception_handler()`` to respect php.ini 'display_errors' setting.
    -   -  Added possibility to route requests using callback methods.
    -=======
        -  Removed ``CI_CORE`` boolean constant from *CodeIgniter.php* (no longer Reactor and Core versions).
        -  :doc:`Loader Library ` changes include:
     	 -  Added method ``get_vars()`` to the Loader to retrieve all variables loaded with ``$this->load->vars()``.
    @@ -275,7 +252,6 @@ Release Date: Not Released
     	 -  Added method ``strip_image_tags()``.
     	 -  Added ``$config['csrf_regeneration']``, which makes token regeneration optional.
     	 -  Added ``$config['csrf_exclude_uris']``, which allows you list URIs which will not have the CSRF validation methods run.
    ->>>>>>> a7001e968a4791312391eb245ad84888893cda8f
        -  Added possibility to route requests using callbacks.
     
     Bug fixes for 3.0
    
    From 704f3f5223637dd6008106b1d04a68668458590e Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Wed, 31 Oct 2012 16:50:13 +0200
    Subject: [PATCH 1810/5397] Fix an erroneous variable name
    
    ---
     system/core/URI.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/core/URI.php b/system/core/URI.php
    index 6692d07a678..407a6ce88a0 100644
    --- a/system/core/URI.php
    +++ b/system/core/URI.php
    @@ -114,7 +114,7 @@ public function _fetch_uri_string()
     			$uri = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
     			if (trim($uri, '/') !== '' && $uri !== '/'.SELF)
     			{
    -				$this->_set_uri_string($path);
    +				$this->_set_uri_string($uri);
     				return;
     			}
     
    
    From 9dd2dbb8b9a3edecddcb3907b65a402fd1ae71b4 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Wed, 31 Oct 2012 17:54:56 +0200
    Subject: [PATCH 1811/5397] Fix issues #388 & #705
    
    (thanks to @sourcejedi, PR #1326 for pointing inconsistencies with RFC2616
    ---
     system/core/URI.php                 | 9 +++++----
     user_guide_src/source/changelog.rst | 3 ++-
     2 files changed, 7 insertions(+), 5 deletions(-)
    
    diff --git a/system/core/URI.php b/system/core/URI.php
    index 407a6ce88a0..4a8d33e88ce 100644
    --- a/system/core/URI.php
    +++ b/system/core/URI.php
    @@ -188,7 +188,7 @@ protected function _parse_request_uri()
     
     		$uri = parse_url($_SERVER['REQUEST_URI']);
     		$query = isset($uri['query']) ? $uri['query'] : '';
    -		$uri = isset($uri['path']) ? $uri['path'] : '';
    +		$uri = isset($uri['path']) ? rawurldecode($uri['path']) : '';
     
     		if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0)
     		{
    @@ -204,7 +204,7 @@ protected function _parse_request_uri()
     		if (trim($uri, '/') === '' && strncmp($query, '/', 1) === 0)
     		{
     			$query = explode('?', $query, 2);
    -			$uri = $query[0];
    +			$uri = rawurldecode($query[0]);
     			$_SERVER['QUERY_STRING'] = isset($query[1]) ? $query[1] : '';
     		}
     		else
    @@ -245,8 +245,9 @@ protected function _parse_query_string()
     		{
     			$uri = explode('?', $uri, 2);
     			$_SERVER['QUERY_STRING'] = isset($uri[1]) ? $uri[1] : '';
    -			$uri = $uri[0];
    +			$uri = rawurldecode($uri[0]);
     		}
    +
     		$this->_reset_query_string();
     
     		return str_replace(array('//', '../'), '/', trim($uri, '/'));
    @@ -325,7 +326,7 @@ public function _filter_uri($str)
     		{
     			// 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', urldecode($str)))
    +			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);
     			}
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 2df8ca7c1a6..e0b8c75e023 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -406,7 +406,8 @@ Bug fixes for 3.0
     -  Fixed a bug (#142) - :doc:`Form Helper ` function ``form_dropdown()`` didn't escape HTML entities in option values.
     -  Fixed a bug (#50) - :doc:`Session Library ` unnecessarily stripped slashed from serialized data, making it impossible to read objects in a namespace.
     -  Fixed a bug (#658) - :doc:`Routing ` wildcard **:any** didn't work as advertised and matched multiple URI segments instead of all characters within a single segment.
    --  Fixed a bug (#1938) - :doc:`Email ` where the email library removed multiple spaces inside a pre-formatted plain text message.
    +-  Fixed a bug (#1938) - :doc:`Email Library ` removed multiple spaces inside a pre-formatted plain text message.
    +-  Fixed a bug (#388, #705) - :doc:`URI Library ` didn't apply URL-decoding to URI segments that it got from **REQUEST_URI** and/or **QUERY_STRING**.
     
     Version 2.1.3
     =============
    
    From 34c8b9c45fdcd2eb0eee5e2275a52e4c2faed5dc Mon Sep 17 00:00:00 2001
    From: Jonathon Hill 
    Date: Wed, 31 Oct 2012 14:02:35 -0400
    Subject: [PATCH 1812/5397] Added support for timestamp-based migrations
    
    Signed-off-by: Jonathon Hill 
    ---
     application/config/migration.php              |  18 ++
     system/language/english/migration_lang.php    |   1 +
     system/libraries/Migration.php                | 230 ++++++++++--------
     user_guide_src/source/changelog.rst           |   3 +
     user_guide_src/source/libraries/migration.rst |  84 ++++---
     5 files changed, 207 insertions(+), 129 deletions(-)
    
    diff --git a/application/config/migration.php b/application/config/migration.php
    index 7645ade7c9c..476da1b8ea2 100644
    --- a/application/config/migration.php
    +++ b/application/config/migration.php
    @@ -37,6 +37,24 @@
     */
     $config['migration_enabled'] = FALSE;
     
    +/*
    +|--------------------------------------------------------------------------
    +| Migration Style
    +|--------------------------------------------------------------------------
    +|
    +| Migration file names may be based on a sequential identifier or on
    +| a timestamp. Options are:
    +|
    +|   'sequential' = Default migration naming (001_add_blog.php)
    +|   'timestamp'  = Timestamp migration naming (20121031104401_add_blog.php)
    +|                  Use timestamp format YYYYMMDDHHIISS.
    +|
    +| If this configuration value is missing the Migration library defaults
    +| to 'sequential' for backward compatibility.
    +|
    +*/
    +$config['migration_style'] = 'timestamp';
    +
     /*
     |--------------------------------------------------------------------------
     | Migrations table
    diff --git a/system/language/english/migration_lang.php b/system/language/english/migration_lang.php
    index 5753c00bf6c..a262d301839 100644
    --- a/system/language/english/migration_lang.php
    +++ b/system/language/english/migration_lang.php
    @@ -27,6 +27,7 @@
     
     $lang['migration_none_found']			= 'No migrations were found.';
     $lang['migration_not_found']			= 'No migration could be found with the version number: %d.';
    +$lang['migration_sequence_gap']         = 'There is a gap in the migration sequence near version number: %d.';
     $lang['migration_multiple_version']		= 'There are multiple migrations with the same version number: %d.';
     $lang['migration_class_doesnt_exist']	= 'The migration class "%s" could not be found.';
     $lang['migration_missing_up_method']	= 'The migration class "%s" is missing an "up" method.';
    diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php
    index 5d637d44ab9..2a06aa01112 100644
    --- a/system/libraries/Migration.php
    +++ b/system/libraries/Migration.php
    @@ -45,6 +45,13 @@ class CI_Migration {
     	 * @var bool
     	 */
     	protected $_migration_enabled = FALSE;
    +	
    +	/**
    +	 * Migration numbering style
    +	 *
    +	 * @var bool
    +	 */
    +	protected $_migration_style = 'sequential';
     
     	/**
     	 * Path to migration classes
    @@ -73,6 +80,13 @@ class CI_Migration {
     	 * @var bool
     	 */
     	protected $_migration_auto_latest = FALSE;
    +	
    +	/**
    +	 * Migration basename regex
    +	 *
    +	 * @var bool
    +	 */
    +	protected $_migration_regex = NULL;
     
     	/**
     	 * Error message
    @@ -125,12 +139,21 @@ public function __construct($config = array())
     		{
     			show_error('Migrations configuration file (migration.php) must have "migration_table" set.');
     		}
    +		
    +		// Migration basename regex
    +		$this->_migration_regex = $this->_migration_style === 'timestamp' ? '/^\d{14}_(\w+)$/' : '/^\d{3}_(\w+)$/';
    +		
    +		// Make sure a valid migration numbering style was set.
    +		if ( ! in_array($this->_migration_style, array('sequential', 'timestamp')))
    +		{
    +			show_error('An invalid migration numbering style was specified: '.$this->_migration_style);
    +		}
     
     		// If the migrations table is missing, make it
     		if ( ! $this->db->table_exists($this->_migration_table))
     		{
     			$this->dbforge->add_field(array(
    -				'version' => array('type' => 'INT', 'constraint' => 3),
    +				'version' => array('type' => 'BIGINT', 'constraint' => 3),
     			));
     
     			$this->dbforge->create_table($this->_migration_table, TRUE);
    @@ -158,113 +181,80 @@ public function __construct($config = array())
     	 */
     	public function version($target_version)
     	{
    -		$start = $current_version = $this->_get_version();
    -		$stop = $target_version;
    -
    +		$current_version = (int) $this->_get_version();
    +		$target_version = (int) $target_version;
    +		
    +		$migrations = $this->find_migrations();
    +		
    +		if ($target_version > 0 AND ! isset($migrations[$target_version]))
    +		{
    +			$this->_error_string = sprintf($this->lang->line('migration_not_found'), $target_version);
    +			return FALSE;
    +		}
    +		
     		if ($target_version > $current_version)
     		{
     			// Moving Up
    -			++$start;
    -			++$stop;
    -			$step = 1;
    +			$method = 'up';
     		}
     		else
     		{
    -			// Moving Down
    -			$step = -1;
    +			// Moving Down, apply in reverse order
    +			$method = 'down';
    +			krsort($migrations);
     		}
     
    -		$method = $step === 1 ? 'up' : 'down';
    -		$migrations = array();
    -
    -		// We now prepare to actually DO the migrations
    -		// But first let's make sure that everything is the way it should be
    -		for ($i = $start; $i != $stop; $i += $step)
    +		if (empty($migrations))
     		{
    -			$f = glob(sprintf($this->_migration_path.'%03d_*.php', $i));
    +			return TRUE;
    +		}
    +		
    +		$previous = FALSE;
     
    -			// Only one migration per step is permitted
    -			if (count($f) > 1)
    +		// Validate all available migrations, and run the ones within our target range
    +		foreach ($migrations as $number => $file)
    +		{
    +			// Check for sequence gaps
    +			if ($this->_migration_style === 'sequential' AND $previous !== FALSE AND abs($number - $previous) > 1)
     			{
    -				$this->_error_string = sprintf($this->lang->line('migration_multiple_version'), $i);
    +				$this->_error_string = sprintf($this->lang->line('migration_sequence_gap'), $number);
     				return FALSE;
     			}
    +		
    +			include $file;
    +			$class = 'Migration_'.ucfirst(strtolower($this->_get_migration_name(basename($file, '.php'))));
     
    -			// Migration step not found
    -			if (count($f) === 0)
    +			// Validate the migration file structure
    +			if ( ! class_exists($class))
     			{
    -				// If trying to migrate up to a version greater than the last
    -				// existing one, migrate to the last one.
    -				if ($step === 1)
    -				{
    -					break;
    -				}
    -
    -				// If trying to migrate down but we're missing a step,
    -				// something must definitely be wrong.
    -				$this->_error_string = sprintf($this->lang->line('migration_not_found'), $i);
    +				$this->_error_string = sprintf($this->lang->line('migration_class_doesnt_exist'), $class);
     				return FALSE;
     			}
    -
    -			$file = basename($f[0]);
    -			$name = basename($f[0], '.php');
    -
    -			// Filename validations
    -			if (preg_match('/^\d{3}_(\w+)$/', $name, $match))
    -			{
    -				$match[1] = strtolower($match[1]);
    -
    -				// Cannot repeat a migration at different steps
    -				if (in_array($match[1], $migrations))
    -				{
    -					$this->_error_string = sprintf($this->lang->line('migration_multiple_version'), $match[1]);
    -					return FALSE;
    -				}
    -
    -				include $f[0];
    -				$class = 'Migration_'.ucfirst($match[1]);
    -
    -				if ( ! class_exists($class))
    -				{
    -					$this->_error_string = sprintf($this->lang->line('migration_class_doesnt_exist'), $class);
    -					return FALSE;
    -				}
    -
    -				if ( ! is_callable(array($class, $method)))
    -				{
    -					$this->_error_string = sprintf($this->lang->line('migration_missing_'.$method.'_method'), $class);
    -					return FALSE;
    -				}
    -
    -				$migrations[] = $match[1];
    -			}
    -			else
    +			elseif ( ! is_callable(array($class, $method)))
     			{
    -				$this->_error_string = sprintf($this->lang->line('migration_invalid_filename'), $file);
    +				$this->_error_string = sprintf($this->lang->line('migration_missing_'.$method.'_method'), $class);
     				return FALSE;
     			}
    +			
    +			$previous = $number;
    +
    +			// Run migrations that are inside the target range
    +			if (
    +				($method === 'up'   AND $number > $current_version AND $number <= $target_version) OR
    +				($method === 'down' AND $number <= $current_version AND $number > $target_version)
    +			) {
    +				log_message('debug', 'Migrating '.$method.' from version '.$current_version.' to version '.$number);
    +				call_user_func(array(new $class, $method));
    +				$current_version = $number;
    +				$this->_update_version($current_version);
    +			}
     		}
    -
    -		log_message('debug', 'Current migration: '.$current_version);
    -
    -		$version = $i + ($step === 1 ? -1 : 0);
    -
    -		// If there is nothing to do so quit
    -		if ($migrations === array())
    -		{
    -			return TRUE;
    -		}
    -
    -		log_message('debug', 'Migrating from '.$method.' to version '.$version);
    -
    -		// Loop through the migrations
    -		foreach ($migrations AS $migration)
    +		
    +		// This is necessary when moving down, since the the last migration applied
    +		// will be the down() method for the next migration up from the target
    +		if ($current_version <> $target_version)
     		{
    -			// Run the migration class
    -			$class = 'Migration_'.ucfirst(strtolower($migration));
    -			call_user_func(array(new $class, $method));
    -
    -			$current_version += $step;
    +			$current_version = $target_version;
     			$this->_update_version($current_version);
     		}
     
    @@ -282,17 +272,19 @@ public function version($target_version)
     	 */
     	public function latest()
     	{
    -		if ( ! $migrations = $this->find_migrations())
    +		$migrations = $this->find_migrations();
    +		
    +		if (empty($migrations))
     		{
     			$this->_error_string = $this->lang->line('migration_none_found');
     			return FALSE;
     		}
     
     		$last_migration = basename(end($migrations));
    -
    +		
     		// Calculate the last migration step from existing migration
     		// filenames and procceed to the standard version migration
    -		return $this->version((int) $last_migration);
    +		return $this->version($this->_get_migration_number($last_migration));
     	}
     
     	// --------------------------------------------------------------------
    @@ -326,22 +318,60 @@ public function error_string()
     	 *
     	 * @return	array	list of migration file paths sorted by version
     	 */
    -	protected function find_migrations()
    +	public function find_migrations()
     	{
    +		$migrations = array();
    +	
     		// Load all *_*.php files in the migrations path
    -		$files = glob($this->_migration_path.'*_*.php');
    -
    -		for ($i = 0, $c = count($files); $i < $c; $i++)
    +		foreach (glob($this->_migration_path.'*_*.php') as $file)
     		{
    -			// Mark wrongly formatted files as false for later filtering
    -			if ( ! preg_match('/^\d{3}_(\w+)$/', basename($files[$i], '.php')))
    +			$name = basename($file, '.php');
    +		
    +			// Filter out non-migration files
    +			if (preg_match($this->_migration_regex, $name))
     			{
    -				$files[$i] = FALSE;
    +				$number = $this->_get_migration_number($name);
    +				
    +				// There cannot be duplicate migration numbers
    +				if (isset($migrations[$number]))
    +				{
    +					$this->_error_string = sprintf($this->lang->line('migration_multiple_version'), $number);
    +					show_error($this->_error_string);
    +				}
    +				
    +				$migrations[$number] = $file;
     			}
     		}
     
    -		sort($files);
    -		return $files;
    +		ksort($migrations);
    +		return $migrations;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Extracts the migration number from a filename
    +	 *
    +	 * @return	int Numeric portion of a migration filename
    +	 */
    +	protected function _get_migration_number($migration)
    +	{
    +		$parts = explode('_', $migration);
    +		return (int) $parts[0];
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Extracts the migration class name from a filename
    +	 *
    +	 * @return	string text portion of a migration filename
    +	 */
    +	protected function _get_migration_name($migration)
    +	{
    +		$parts = explode('_', $migration);
    +		array_shift($parts);
    +		return implode('_', $parts);
     	}
     
     	// --------------------------------------------------------------------
    @@ -365,10 +395,10 @@ protected function _get_version()
     	 * @param	int	Migration reached
     	 * @return	void	Outputs a report of the migration
     	 */
    -	protected function _update_version($migrations)
    +	protected function _update_version($migration)
     	{
     		return $this->db->update($this->_migration_table, array(
    -			'version' => $migrations
    +			'version' => $migration
     		));
     	}
     
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 065daf54b67..f45cc5cd780 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -227,6 +227,9 @@ Release Date: Not Released
     	 -  Added support for hashing algorithms other than SHA1 and MD5.
     	 -  Removed previously deprecated ``sha1()`` method.
        -  Changed :doc:`Language Library ` method ``load()`` to filter the language name with ``ctype_digit()``.
    +   -  :doc:`Migration Library ` changes include:
    +     -  Added support for timestamp-based migrations (enabled by default)
    +     -  Added ``$config['migration_style']`` to allow switching between sequential migrations and timestamp migrations
     
     -  Core
     
    diff --git a/user_guide_src/source/libraries/migration.rst b/user_guide_src/source/libraries/migration.rst
    index cb7d96a6d22..2463961716e 100644
    --- a/user_guide_src/source/libraries/migration.rst
    +++ b/user_guide_src/source/libraries/migration.rst
    @@ -13,17 +13,40 @@ run so all you have to do is update your application files and
     call **$this->migrate->current()** to work out which migrations should be run. 
     The current version is found in **config/migration.php**.
     
    +********************
    +Migration file names
    +********************
    +
    +Each Migration is run in numeric order forward or backwards depending on the
    +method taken. Two numbering styles are available:
    +
    +* **Sequential:** each migration is numbered in sequence, starting with **001**.
    +  Each number must be three digits, and there must not be any gaps in the
    +  sequence. (This was the numbering scheme prior to CodeIgniter 3.0.)
    +* **Timestamp:** each migration is numbered using the timestamp when the migration
    +  was created, in **YYYYMMDDHHIISS** format (e.g. **20121031100537**). This
    +  helps prevent numbering conflicts when working in a team environment, and is
    +  the preferred scheme in CodeIgniter 3.0 and later.
    +
    +The desired style may be selected using the **$config['migration_style']**
    +setting in your **migration.php** config file.
    +
    +Regardless of which numbering style you choose to use, prefix your migration
    +files with the migration number followed by an underscore and a descriptive
    +name for the migration. For example:
    +
    +* **001_add_blog.php** (sequential numbering)
    +* **20121031100537_add_blog.php** (timestamp numbering)
    +
     ******************
     Create a Migration
     ******************
    -
    -.. note:: Each Migration is run in numerical order forward or backwards 
    -	depending on the method taken. Use a prefix of 3 numbers followed by an 
    -	underscore for the filename of your migration.
     	
     This will be the first migration for a new site which has a blog. All 
     migrations go in the folder **application/migrations/** and have names such 
    -as: **001_add_blog.php**.::
    +as **20121031100537_add_blog.php**.::
    +
    +	 TRUE,
     				),
     			));
    -			
    +			$this->dbforge->add_key('blog_id', TRUE);
     			$this->dbforge->create_table('blog');
     		}
     
    @@ -55,6 +78,7 @@ as: **001_add_blog.php**.::
     		{
     			$this->dbforge->drop_table('blog');
     		}
    +	}
     
     Then in **application/config/migration.php** set **$config['migration_version'] = 1;**.
     
    @@ -65,25 +89,25 @@ Usage Example
     In this example some simple code is placed in **application/controllers/migrate.php** 
     to update the schema.::
     
    -	$this->load->library('migration');
    -
    -	if ( ! $this->migration->current())
    +	migration->error_string());
    +	    public function index()
    +	    {
    +	    	$this->load->library('migration');
    +	    	
    +	    	if ($this->migration->current() === FALSE)
    +	    	{
    +	    		show_error($this->migration->error_string());
    +	    	}
    +	    }
     	}
     
     ******************
     Function Reference
     ******************
     
    -There are five available methods for the Migration class:
    -
    --  $this->migration->current();
    --  $this->migration->error_string();
    --  $this->migration->find_migrations();
    --  $this->migration->latest();
    --  $this->migration->version();
    -
     $this->migration->current()
     ============================
     
    @@ -124,14 +148,16 @@ Migration Preferences
     
     The following is a table of all the config options for migrations.
     
    -========================== ====================== ============= =============================================
    -Preference                 Default                Options       Description
    -========================== ====================== ============= =============================================
    -**migration_enabled**      FALSE                  TRUE / FALSE  Enable or disable migrations.
    -**migration_path**         APPPATH.'migrations/'  None          The path to your migrations folder.
    -**migration_version**      0                      None          The current version your database should use.
    -**migration_table**        migrations             None          The table name for storing the shema
    -                                                                version number.
    -**migration_auto_latest**  FALSE                  TRUE / FALSE  Enable or disable automatically 
    -                                                                running migrations.
    -========================== ====================== ============= =============================================
    +========================== ====================== ========================== =============================================
    +Preference                 Default                Options                    Description
    +========================== ====================== ========================== =============================================
    +**migration_enabled**      FALSE                  TRUE / FALSE               Enable or disable migrations.
    +**migration_path**         APPPATH.'migrations/'  None                       The path to your migrations folder.
    +**migration_version**      0                      None                       The current version your database should use.
    +**migration_table**        migrations             None                       The table name for storing the schema
    +                                                                             version number.
    +**migration_auto_latest**  FALSE                  TRUE / FALSE               Enable or disable automatically 
    +                                                                             running migrations.
    +**migration_style**        'timestamp'            'timestamp' / 'sequential' The type of numeric identifier used to name
    +                                                                             migration files.
    +========================== ====================== ========================== =============================================
    
    From ea6688b3b9a7a208d1c44439c4f01801fd3b8c65 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Wed, 31 Oct 2012 21:52:11 +0200
    Subject: [PATCH 1813/5397] Fix issue in resetting QUERY_STRING, GET vars
     introduced in f2b19fee7876708c7a7bb5cba6b7df682a9d2a53
    
    ---
     system/core/URI.php | 28 ++--------------------------
     1 file changed, 2 insertions(+), 26 deletions(-)
    
    diff --git a/system/core/URI.php b/system/core/URI.php
    index 4a8d33e88ce..3b7718fff09 100644
    --- a/system/core/URI.php
    +++ b/system/core/URI.php
    @@ -212,7 +212,7 @@ protected function _parse_request_uri()
     			$_SERVER['QUERY_STRING'] = $query;
     		}
     
    -		$this->_reset_query_string();
    +		parse_str($_SERVER['QUERY_STRING'], $_GET);
     
     		if ($uri === '/' OR $uri === '')
     		{
    @@ -248,37 +248,13 @@ protected function _parse_query_string()
     			$uri = rawurldecode($uri[0]);
     		}
     
    -		$this->_reset_query_string();
    +		parse_str($_SERVER['QUERY_STRING'], $_GET);
     
     		return str_replace(array('//', '../'), '/', trim($uri, '/'));
     	}
     
     	// --------------------------------------------------------------------
     
    -	/**
    -	 * Reset QUERY_STRING
    -	 *
    -	 * Re-processes QUERY_STRING to and fetches the real GET values from it.
    -	 * Useful for cases where we got the URI path from it's query string.
    -	 *
    -	 * @used-by	CI_URI::_parse_request_uri()
    -	 * @used-by	CI_URI::_parse_query_string()
    -	 * @return	void
    -	 */
    -	protected function _reset_query_string()
    -	{
    -		if ($_SERVER['QUERY_STRING'] === '')
    -		{
    -			$_GET = array();
    -		}
    -		else
    -		{
    -			parse_str($_SERVER['QUERY_STRING']);
    -		}
    -	}
    -
    -	// --------------------------------------------------------------------
    -
     	/**
     	 * Is CLI Request?
     	 *
    
    From 30563ff7fd210f86103a5691f001441e76cfb646 Mon Sep 17 00:00:00 2001
    From: Andrey 
    Date: Thu, 1 Nov 2012 01:49:39 +0400
    Subject: [PATCH 1814/5397] add russian in foreign_chars.php
    
    ---
     application/config/foreign_chars.php | 80 +++++++++++++++++++---------
     1 file changed, 54 insertions(+), 26 deletions(-)
    
    diff --git a/application/config/foreign_chars.php b/application/config/foreign_chars.php
    index 6614caa3184..1127c7cc8b1 100644
    --- a/application/config/foreign_chars.php
    +++ b/application/config/foreign_chars.php
    @@ -40,44 +40,56 @@
     	'/Ä/' => 'Ae',
     	'/Ü/' => 'Ue',
     	'/Ö/' => 'Oe',
    -	'/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ/' => 'A',
    -	'/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ/' => 'a',
    +	'/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ|А/' => 'A',
    +	'/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ|а/' => 'a',
    +	'/Б/' => 'B',
    +	'/б/' => 'b',
     	'/Ç|Ć|Ĉ|Ċ|Č/' => 'C',
     	'/ç|ć|ĉ|ċ|č/' => 'c',
    +	'/Д/' => 'D',
    +	'/д/' => 'd',
     	'/Ð|Ď|Đ|Δ/' => 'Dj',
     	'/ð|ď|đ|δ/' => 'dj',
    -	'/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ/' => 'E',
    -	'/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ/' => 'e',
    -	'/Ĝ|Ğ|Ġ|Ģ|Γ/' => 'G',
    -	'/ĝ|ğ|ġ|ģ|γ/' => 'g',
    +	'/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ|Е|Ё|Э/' => 'E',
    +	'/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ|е|ё|э/' => 'e',
    +	'/Ф/' => 'F',
    +	'/ф/' => 'f',
    +	'/Ĝ|Ğ|Ġ|Ģ|Γ|Г/' => 'G',
    +	'/ĝ|ğ|ġ|ģ|γ|г/' => 'g',
     	'/Ĥ|Ħ/' => 'H',
     	'/ĥ|ħ/' => 'h',
    -	'/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị/' => 'I',
    -	'/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị/' => 'i',
    +	'/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị|И|Й/' => 'I',
    +	'/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị|и|й/' => 'i',
     	'/Ĵ/' => 'J',
     	'/ĵ/' => 'j',
    -	'/Ķ|Κ/' => 'K',
    -	'/ķ|κ/' => 'k',
    -	'/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ/' => 'L',
    -	'/ĺ|ļ|ľ|ŀ|ł|λ/' => 'l',
    -	'/Ñ|Ń|Ņ|Ň|Ν/' => 'N',
    -	'/ñ|ń|ņ|ň|ʼn|ν/' => 'n',
    -	'/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ/' => 'O',
    -	'/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ/' => 'o',
    -	'/Ŕ|Ŗ|Ř|Ρ/' => 'R',
    -	'/ŕ|ŗ|ř|ρ/' => 'r',
    -	'/Ś|Ŝ|Ş|Ș|Š|Σ/' => 'S',
    -	'/ś|ŝ|ş|ș|š|ſ|σ|ς/' => 's',
    -	'/Ț|Ţ|Ť|Ŧ|τ/' => 'T',
    -	'/ț|ţ|ť|ŧ/' => 't',
    -	'/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự/' => 'U',
    -	'/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự/' => 'u',
    +	'/Ķ|Κ|К/' => 'K',
    +	'/ķ|κ|к/' => 'k',
    +	'/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ|Л/' => 'L',
    +	'/ĺ|ļ|ľ|ŀ|ł|λ|л/' => 'l',
    +	'/М/' => 'M',
    +	'/м/' => 'm',
    +	'/Ñ|Ń|Ņ|Ň|Ν|Н/' => 'N',
    +	'/ñ|ń|ņ|ň|ʼn|ν|н/' => 'n',
    +	'/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ|О/' => 'O',
    +	'/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ|о/' => 'o',
    +	'/П/' => 'P',
    +	'/п/' => 'p',
    +	'/Ŕ|Ŗ|Ř|Ρ|Р/' => 'R',
    +	'/ŕ|ŗ|ř|ρ|р/' => 'r',
    +	'/Ś|Ŝ|Ş|Ș|Š|Σ|С/' => 'S',
    +	'/ś|ŝ|ş|ș|š|ſ|σ|ς|с/' => 's',
    +	'/Ț|Ţ|Ť|Ŧ|τ|Т/' => 'T',
    +	'/ț|ţ|ť|ŧ|т/' => 't',
    +	'/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự|У/' => 'U',
    +	'/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự|у/' => 'u',
     	'/Ý|Ÿ|Ŷ|Υ|Ύ|Ϋ|Ỳ|Ỹ|Ỷ|Ỵ/' => 'Y',
     	'/ý|ÿ|ŷ|ỳ|ỹ|ỷ|ỵ/' => 'y',
    +	'/В/' => 'V',
    +	'/в/' => 'v',
     	'/Ŵ/' => 'W',
     	'/ŵ/' => 'w',
    -	'/Ź|Ż|Ž|Ζ/' => 'Z',
    -	'/ź|ż|ž|ζ/' => 'z',
    +	'/Ź|Ż|Ž|Ζ|З/' => 'Z',
    +	'/ź|ż|ž|ζ|з/' => 'z',
     	'/Æ|Ǽ/' => 'AE',
     	'/ß/'=> 'ss',
     	'/IJ/' => 'IJ',
    @@ -89,6 +101,22 @@
     	'/β/' => 'v',
     	'/μ/' => 'm',
     	'/ψ/' => 'ps',
    +	'/Ж/'=>'ZH',
    +	'/ж/'=>'zh',
    +	'/Х/'=>'KH',
    +	'/х/'=>'kh',
    +	'/Ц/'=>'TC',
    +	'/ц/'=>'tc',
    +	'/Ч/'=>'CH',
    +	'/ч/'=>'ch',
    +	'/Ш/'=>'SH',
    +	'/ш/'=>'sh',
    +	'/Щ/'=>'SHCH',
    +	'/щ/'=>'shch',
    +	'/Ю/'=>'IU',
    +	'/ю/'=>'iu',
    +	'/Я/'=>'IA',
    +	'/я/'=>'ia'
     );
     
     /* End of file foreign_chars.php */
    
    From dc6fba5492a215b40c254ed6f704c580427cdfea Mon Sep 17 00:00:00 2001
    From: GDmac 
    Date: Wed, 31 Oct 2012 16:53:15 +0100
    Subject: [PATCH 1815/5397] Fix #1946 dbforge add_key
    
    add_key not setting multiple-column keys when given array
    
    Signed-off-by: GDmac 
    ---
     system/database/DB_forge.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php
    index 119d78d3821..2be2790dd8d 100644
    --- a/system/database/DB_forge.php
    +++ b/system/database/DB_forge.php
    @@ -132,7 +132,7 @@ public function drop_database($db_name)
     	 */
     	public function add_key($key = '', $primary = FALSE)
     	{
    -		if (is_array($key))
    +		if ($primary && is_array($key))
     		{
     			foreach ($key as $one)
     			{
    
    From 3b72eb58e61581b7e92012a322be48e216491d7c Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 1 Nov 2012 00:45:26 +0200
    Subject: [PATCH 1816/5397] Changed URI auto-detection to try PATH_INFO first
    
    (thanks to @sourcejedi, PR #1326)
    
    Up until PHP 5.2.4 (which is our new lowest requirement),
    there was a bug related to PATH_INFO which made REQUEST_URI
    a more reliable choice. This is now no longer the case,
    see https://bugs.php.net/bug.php?id=31892 for more details.
    
    Also removed ORIG_PATH_INFO from the suggested alternatives
    for uri_protocol in application/config/config.php as it will
    not exist in most of PHP's recent versions and is pointless
    when you can use PATH_INFO anyway.
    ---
     application/config/config.php       |  3 +--
     system/core/URI.php                 | 14 ++++++--------
     user_guide_src/source/changelog.rst |  1 +
     3 files changed, 8 insertions(+), 10 deletions(-)
    
    diff --git a/application/config/config.php b/application/config/config.php
    index 6867cee8877..0562953b038 100644
    --- a/application/config/config.php
    +++ b/application/config/config.php
    @@ -64,10 +64,9 @@
     |
     | 'AUTO'		Default - auto detects
     | 'CLI' or 'argv'	Uses $_SERVER['argv'] (for php-cli only)
    -| 'REQUEST_URI'		Uses $_SERVER['REQUEST_URI']
     | 'PATH_INFO'		Uses $_SERVER['PATH_INFO']
    +| 'REQUEST_URI'		Uses $_SERVER['REQUEST_URI']
     | 'QUERY_STRING'	Uses $_SERVER['QUERY_STRING']
    -| 'ORIG_PATH_INFO'	Uses $_SERVER['ORIG_PATH_INFO']
     |
     */
     $config['uri_protocol']	= 'AUTO';
    diff --git a/system/core/URI.php b/system/core/URI.php
    index 3b7718fff09..309c77630d3 100644
    --- a/system/core/URI.php
    +++ b/system/core/URI.php
    @@ -102,23 +102,21 @@ public function _fetch_uri_string()
     				return;
     			}
     
    -			// Let's try the REQUEST_URI first, this will work in most situations
    -			if (($uri = $this->_parse_request_uri()) !== '')
    +			// Is there a PATH_INFO variable? This should be the easiest solution.
    +			if (isset($_SERVER['PATH_INFO']))
     			{
    -				$this->_set_uri_string($uri);
    +				$this->_set_uri_string($_SERVER['PATH_INFO']);
     				return;
     			}
     
    -			// Is there a PATH_INFO variable?
    -			// Note: some servers seem to have trouble with getenv() so we'll test it two ways
    -			$uri = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
    -			if (trim($uri, '/') !== '' && $uri !== '/'.SELF)
    +			// Let's try REQUEST_URI then, this will work in most situations
    +			if (($uri = $this->_parse_request_uri()) !== '')
     			{
     				$this->_set_uri_string($uri);
     				return;
     			}
     
    -			// No PATH_INFO?... What about QUERY_STRING?
    +			// No REQUEST_URI either?... What about QUERY_STRING?
     			if (($uri = $this->_parse_query_string()) !== '')
     			{
     				$this->_set_uri_string($uri);
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index e0b8c75e023..a6494e36133 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -236,6 +236,7 @@ Release Date: Not Released
     	 -  Renamed internal method ``_detect_uri()`` to ``_parse_request_uri()``.
     	 -  Changed ``_parse_request_uri()`` to accept absolute URIs for compatibility with HTTP/1.1 as per `RFC2616 `.
     	 -  Added protected method ``_parse_query_string()`` to URI paths in the the **QUERY_STRING** value, like ``_parse_request_uri()`` does.
    +	 -  Changed ``_fetch_uri_string()`` to try the **PATH_INFO** variable first when auto-detecting.
        -  Removed ``CI_CORE`` boolean constant from *CodeIgniter.php* (no longer Reactor and Core versions).
        -  :doc:`Loader Library ` changes include:
     	 -  Added method ``get_vars()`` to the Loader to retrieve all variables loaded with ``$this->load->vars()``.
    
    From 87f4dc27230debc0af281c9780f2ba939fe07608 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 1 Nov 2012 01:11:22 +0200
    Subject: [PATCH 1817/5397] Fix an update_string() bug
    
    ---
     system/database/DB_driver.php        | 30 +++-------------------------
     system/database/DB_query_builder.php |  2 +-
     2 files changed, 4 insertions(+), 28 deletions(-)
    
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index e8286aaa137..795ed6711c3 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -1080,43 +1080,19 @@ protected function _insert($table, $keys, $values)
     	 */
     	public function update_string($table, $data, $where)
     	{
    -		if ($where === '')
    +		if (empty($where))
     		{
     			return FALSE;
     		}
     
    +		$this->where($where);
    +
     		$fields = array();
     		foreach ($data as $key => $val)
     		{
     			$fields[$this->protect_identifiers($key)] = $this->escape($val);
     		}
     
    -		if ( ! is_array($where))
    -		{
    -			$dest = array($where);
    -		}
    -		else
    -		{
    -			$dest = array();
    -			foreach ($where as $key => $val)
    -			{
    -				$prefix = (count($dest) === 0) ? '' : ' AND ';
    -				$key = $this->protect_identifiers($key);
    -
    -				if ($val !== '')
    -				{
    -					if ( ! $this->_has_operator($key))
    -					{
    -						$key .= ' =';
    -					}
    -
    -					$val = ' '.$this->escape($val);
    -				}
    -
    -				$dest[] = $prefix.$key.$val;
    -			}
    -		}
    -
     		return $this->_update($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields, $dest);
     	}
     
    diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php
    index a3585586e06..cc43d834c14 100644
    --- a/system/database/DB_query_builder.php
    +++ b/system/database/DB_query_builder.php
    @@ -1575,7 +1575,7 @@ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL)
     		}
     
     		$sql = $this->_update($this->protect_identifiers($this->qb_from[0], TRUE, NULL, FALSE), $this->qb_set);
    -
    +var_dump($sql);
     		$this->_reset_write();
     		return $this->query($sql);
     	}
    
    From e2afc886d5e7fe1d55a467c9bc46fe40c1a2bbf6 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 1 Nov 2012 01:35:34 +0200
    Subject: [PATCH 1818/5397] Session cookie driver changes
    
     - Changed docs CREATE TABLE ci_sessions example to have the PRIMARY KEY of session_id, ip_address and user_agent combined.
     - Changed DB updates to add WHERE clauses for the ip_address and/or user_agent strings if sess_match_ip and/or sess_match_useragent are set to TRUE.
    ---
     .../Session/drivers/Session_cookie.php        | 36 ++++++++++++++++---
     user_guide_src/source/libraries/sessions.rst  |  2 +-
     2 files changed, 32 insertions(+), 6 deletions(-)
    
    diff --git a/system/libraries/Session/drivers/Session_cookie.php b/system/libraries/Session/drivers/Session_cookie.php
    index 2f1bf353148..8f527ace739 100755
    --- a/system/libraries/Session/drivers/Session_cookie.php
    +++ b/system/libraries/Session/drivers/Session_cookie.php
    @@ -540,11 +540,25 @@ protected function _sess_update($force = FALSE)
     		// Check for database
     		if ($this->sess_use_database === TRUE)
     		{
    +			$this->CI->db->where('session_id', $old_sessid);
    +
    +			if ($this->sess_match_ip === TRUE)
    +			{
    +				$this->CI->db->where('ip_address', $this->CI->input->ip_address());
    +			}
    +
    +			if ($this->sess_match_useragent === TRUE)
    +			{
    +				$this->CI->db->where('user_agent', trim(substr($this->CI->input->user_agent(), 0, 120)));
    +			}
    +
     			// Update the session ID and last_activity field in the DB
    -			$this->CI->db->update($this->sess_table_name, array(
    -					 'last_activity' => $this->now,
    -					 'session_id' => $this->userdata['session_id']
    -			), array('session_id' => $old_sessid));
    +			$this->CI->db->update($this->sess_table_name,
    +				array(
    +					'last_activity' => $this->now,
    +					'session_id' => $this->userdata['session_id']
    +				)
    +			);
     		}
     
     		// Write the cookie
    @@ -590,7 +604,19 @@ public function _update_db()
     			// Run the update query
     			// Any time we change the session id, it gets updated immediately,
     			// so our where clause below is always safe
    -			$this->CI->db->update($this->sess_table_name, $set, array('session_id' => $this->userdata['session_id']));
    +			$this->CI->db->where('session_id', $this->userdata['session_id']);
    +
    +			if ($this->sess_match_ip === TRUE)
    +			{
    +				$this->CI->db->where('ip_address', $this->CI->input->ip_address());
    +			}
    +
    +			if ($this->sess_match_useragent === TRUE)
    +			{
    +				$this->CI->db->where('user_agent', trim(substr($this->CI->input->user_agent(), 0, 120)));
    +			}
    +
    +			$this->CI->db->update($this->sess_table_name, $set);
     
     			// Clear dirty flag to prevent double updates
     			$this->data_dirty = FALSE;
    diff --git a/user_guide_src/source/libraries/sessions.rst b/user_guide_src/source/libraries/sessions.rst
    index dd9e8cbb427..ee7fb0b1c79 100644
    --- a/user_guide_src/source/libraries/sessions.rst
    +++ b/user_guide_src/source/libraries/sessions.rst
    @@ -388,7 +388,7 @@ session class::
     		user_agent varchar(120) NOT NULL,
     		last_activity int(10) unsigned DEFAULT 0 NOT NULL,
     		user_data text NOT NULL,
    -		PRIMARY KEY (session_id),
    +		PRIMARY KEY (session_id, ip_address, user_agent),
     		KEY `last_activity_idx` (`last_activity`)
     	);
     
    
    From b107e5728ad867e860d2d4469c1ec523bd3ffac1 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 1 Nov 2012 11:50:21 +0200
    Subject: [PATCH 1819/5397] Remove var_dump() missed in a previous commit
    
    ---
     system/database/DB_query_builder.php | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php
    index cc43d834c14..8a3d3b198f9 100644
    --- a/system/database/DB_query_builder.php
    +++ b/system/database/DB_query_builder.php
    @@ -1575,7 +1575,6 @@ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL)
     		}
     
     		$sql = $this->_update($this->protect_identifiers($this->qb_from[0], TRUE, NULL, FALSE), $this->qb_set);
    -var_dump($sql);
     		$this->_reset_write();
     		return $this->query($sql);
     	}
    
    From 948f0218b845e68ea162322dae3a2f5fe7e4a913 Mon Sep 17 00:00:00 2001
    From: sa 
    Date: Thu, 1 Nov 2012 16:27:02 +0400
    Subject: [PATCH 1820/5397] russian second letter in lowercase,
     foreign_chars.php
    
    ---
     application/config/foreign_chars.php | 16 ++++++++--------
     1 file changed, 8 insertions(+), 8 deletions(-)
    
    diff --git a/application/config/foreign_chars.php b/application/config/foreign_chars.php
    index 1127c7cc8b1..5a2bb0cf7e7 100644
    --- a/application/config/foreign_chars.php
    +++ b/application/config/foreign_chars.php
    @@ -101,21 +101,21 @@
     	'/β/' => 'v',
     	'/μ/' => 'm',
     	'/ψ/' => 'ps',
    -	'/Ж/'=>'ZH',
    +	'/Ж/'=>'Zh',
     	'/ж/'=>'zh',
    -	'/Х/'=>'KH',
    +	'/Х/'=>'Kh',
     	'/х/'=>'kh',
    -	'/Ц/'=>'TC',
    +	'/Ц/'=>'Tc',
     	'/ц/'=>'tc',
    -	'/Ч/'=>'CH',
    +	'/Ч/'=>'Ch',
     	'/ч/'=>'ch',
    -	'/Ш/'=>'SH',
    +	'/Ш/'=>'Sh',
     	'/ш/'=>'sh',
    -	'/Щ/'=>'SHCH',
    +	'/Щ/'=>'Shch',
     	'/щ/'=>'shch',
    -	'/Ю/'=>'IU',
    +	'/Ю/'=>'Iu',
     	'/ю/'=>'iu',
    -	'/Я/'=>'IA',
    +	'/Я/'=>'Ia',
     	'/я/'=>'ia'
     );
     
    
    From ce1b02a0fa8e07f769c41634e19c15482244e687 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 1 Nov 2012 14:40:52 +0200
    Subject: [PATCH 1821/5397] [ci skip] Add changelog entry for PR #1951
    
    ---
     user_guide_src/source/changelog.rst | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index a6494e36133..4aef2a174dd 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -39,10 +39,10 @@ Release Date: Not Released
        -  Updated support for zip files in mimes.php.
        -  Updated support for csv files in mimes.php.
        -  Added some more doctypes.
    -   -  Added Romanian, Greek and Vietnamese characters in *foreign_characters.php*.
    +   -  Added Romanian, Greek, Vietnamese and Cyrilic characters in *application/config/foreign_characters.php*.
        -  Changed logger to only chmod when file is first created.
        -  Removed previously deprecated SHA1 Library.
    -   -  Removed previously deprecated use of ``$autoload['core']`` in application/config/autoload.php.
    +   -  Removed previously deprecated use of ``$autoload['core']`` in *application/config/autoload.php*.
           Only entries in ``$autoload['libraries']`` are auto-loaded now.
        -  Removed previously deprecated EXT constant.
        -  Updated all classes to be written in PHP 5 style, with visibility declarations and no ``var`` usage for properties.
    
    From 7c4d10660a0a47446474bf97e3cb65f80693f1ee Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 1 Nov 2012 15:14:34 +0200
    Subject: [PATCH 1822/5397] Fix issue #1953 (form values being escaped twice)
    
    Re-instaing an improved form_prep() function, reverting most of the changes from 74ffd17ab06327ca62ddfe28a186cae7ba6bd459.
    ---
     system/helpers/form_helper.php                | 83 ++++++++++---------
     system/libraries/Form_validation.php          | 10 +--
     .../codeigniter/helpers/form_helper_test.php  | 15 ++++
     user_guide_src/source/changelog.rst           |  2 +-
     user_guide_src/source/helpers/form_helper.rst | 44 +++++-----
     .../source/installation/upgrade_300.rst       | 10 ---
     6 files changed, 88 insertions(+), 76 deletions(-)
    
    diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php
    index 622622c0ee8..9c4c4dae684 100644
    --- a/system/helpers/form_helper.php
    +++ b/system/helpers/form_helper.php
    @@ -124,9 +124,9 @@ function form_open_multipart($action = '', $attributes = array(), $hidden = arra
     	 * Generates hidden fields. You can pass a simple key/value string or
     	 * an associative array with multiple values.
     	 *
    -	 * @param	mixed
    -	 * @param	string
    -	 * @param	bool
    +	 * @param	mixed	$name		Field name
    +	 * @param	string	$value		Field value
    +	 * @param	bool	$recursing
     	 * @return	string
     	 */
     	function form_hidden($name, $value = '', $recursing = FALSE)
    @@ -149,7 +149,7 @@ function form_hidden($name, $value = '', $recursing = FALSE)
     
     		if ( ! is_array($value))
     		{
    -			$form .= '\n";
    +			$form .= '\n";
     		}
     		else
     		{
    @@ -243,9 +243,9 @@ function form_upload($data = '', $value = '', $extra = '')
     	/**
     	 * Textarea field
     	 *
    -	 * @param	mixed
    -	 * @param	string
    -	 * @param	string
    +	 * @param	mixed	$data
    +	 * @param	string	$value
    +	 * @param	string	$extra
     	 * @return	string
     	 */
     	function form_textarea($data = '', $value = '', $extra = '')
    @@ -263,7 +263,7 @@ function form_textarea($data = '', $value = '', $extra = '')
     		}
     
     		$name = is_array($data) ? $data['name'] : $data;
    -		return '\n";
    +		return '\n";
     	}
     }
     
    @@ -298,10 +298,10 @@ function form_multiselect($name = '', $options = array(), $selected = array(), $
     	/**
     	 * Drop-down Menu
     	 *
    -	 * @param	mixed	$name = ''
    -	 * @param	mixed	$options = array()
    -	 * @param	mixed	$selected = array()
    -	 * @param	mixed	$extra = array()
    +	 * @param	mixed	$name
    +	 * @param	mixed	$options
    +	 * @param	mixed	$selected
    +	 * @param	mixed	$extra
     	 * @return	string
     	 */
     	function form_dropdown($name = '', $options = array(), $selected = array(), $extra = '')
    @@ -349,7 +349,7 @@ function form_dropdown($name = '', $options = array(), $selected = array(), $ext
     				foreach ($val as $optgroup_key => $optgroup_val)
     				{
     					$sel = in_array($optgroup_key, $selected) ? ' selected="selected"' : '';
    -					$form .= '\n";
     				}
     
    @@ -357,7 +357,7 @@ function form_dropdown($name = '', $options = array(), $selected = array(), $ext
     			}
     			else
     			{
    -				$form .= '\n";
     			}
    @@ -600,17 +600,28 @@ function form_close($extra = '')
     	 *
     	 * Formats text so that it can be safely placed in a form field in the event it has HTML tags.
     	 *
    -	 * @todo	Remove in version 3.1+.
    -	 * @deprecated	3.0.0	This function has been broken for a long time
    -	 *			and is now just an alias for html_escape(). It's
    -	 *			second argument is ignored.
    -	 * @param	string	$str = ''
    -	 * @param	string	$field_name = ''
    -	 * @return	string
    +	 * @param	string|string[]	$str		Value to escape
    +	 * @param	bool		$is_textarea	Whether we're escaping for a textarea element
    +	 * @return	string|string[]	Escaped values
     	 */
    -	function form_prep($str = '', $field_name = '')
    +	function form_prep($str = '', $is_textarea = FALSE)
     	{
    -		return html_escape($str);
    +		if (is_array($str))
    +		{
    +			foreach (array_keys($str) as $key)
    +			{
    +				$str[$key] = form_prep($str[$key], $is_textarea);
    +			}
    +
    +			return $str;
    +		}
    +
    +		if ($is_textarea === TRUE)
    +		{
    +			return str_replace(array('<', '>'), array('<', '>'), stripslashes($str));
    +		}
    +
    +		return str_replace(array("'", '"'), array(''', '"'), stripslashes($data));
     	}
     }
     
    @@ -625,23 +636,21 @@ function form_prep($str = '', $field_name = '')
     	 * re-populate an input field or textarea. If Form Validation
     	 * is active it retrieves the info from the validation class
     	 *
    -	 * @param	string
    -	 * @param	string
    -	 * @return	mixed
    +	 * @param	string	$field		Field name
    +	 * @param	string	$default	Default value
    +	 * @param	bool	$is_textarea	Whether the field is a textarea element
    +	 * @return	string
     	 */
    -	function set_value($field = '', $default = '')
    +	function set_value($field = '', $default = '', $is_textarea = FALSE)
     	{
     		if (FALSE === ($OBJ =& _get_validation_object()))
     		{
    -			if ( ! isset($_POST[$field]))
    -			{
    -				return html_escape($default);
    -			}
    -
    -			return html_escape($_POST[$field]);
    +			return isset($_POST[$field])
    +				? form_prep($_POST[$field], $is_textarea)
    +				: form_prep($default, $is_textarea);
     		}
     
    -		return html_escape($OBJ->set_value($field, $default));
    +		return form_prep($OBJ->set_value($field, $default), $is_textarea);
     	}
     }
     
    @@ -862,8 +871,8 @@ function validation_errors($prefix = '', $suffix = '')
     	 *
     	 * Helper function used by some of the form helpers
     	 *
    -	 * @param	array
    -	 * @param	array
    +	 * @param	array	$attributes	List of attributes
    +	 * @param	array	$default	Default values
     	 * @return	string
     	 */
     	function _parse_form_attributes($attributes, $default)
    @@ -891,7 +900,7 @@ function _parse_form_attributes($attributes, $default)
     		{
     			if ($key === 'value')
     			{
    -				$val = html_escape($val);
    +				$val = form_prep($val);
     			}
     			elseif ($key === 'name' && ! strlen($default['name']))
     			{
    diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php
    index c1bf51935de..74dac7d2900 100644
    --- a/system/libraries/Form_validation.php
    +++ b/system/libraries/Form_validation.php
    @@ -1323,6 +1323,11 @@ public function valid_base64($str)
     	 */
     	public function prep_for_form($data = '')
     	{
    +		if ($this->_safe_form_data === FALSE OR empty($data))
    +		{
    +			return $data;
    +		}
    +
     		if (is_array($data))
     		{
     			foreach ($data as $key => $val)
    @@ -1333,11 +1338,6 @@ public function prep_for_form($data = '')
     			return $data;
     		}
     
    -		if ($this->_safe_form_data === FALSE OR $data === '')
    -		{
    -			return $data;
    -		}
    -
     		return str_replace(array("'", '"', '<', '>'), array(''', '"', '<', '>'), stripslashes($data));
     	}
     
    diff --git a/tests/codeigniter/helpers/form_helper_test.php b/tests/codeigniter/helpers/form_helper_test.php
    index 03278581d68..89165271e7f 100644
    --- a/tests/codeigniter/helpers/form_helper_test.php
    +++ b/tests/codeigniter/helpers/form_helper_test.php
    @@ -272,6 +272,21 @@ public function test_form_close()
     		$this->assertEquals($expected, form_close(''));
     	}
     
    +	// ------------------------------------------------------------------------
    +
    +	public function test_form_prep()
    +	{
    +		$this->assertEquals(
    +			'Here is a string containing "quoted" text.',
    +			form_prep('Here is a string containing "quoted" text.')
    +		);
    +
    +		$this->assertEquals(
    +			'Here is a string containing a <tag>.',
    +			form_prep('Here is a string containing a .', TRUE)
    +		);
    +	}
    +
     }
     
     /* End of file form_helper_test.php */
    \ No newline at end of file
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 4aef2a174dd..511ee00f673 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -77,7 +77,7 @@ Release Date: Not Released
        -  Added a work-around in ``force_download()`` for a bug Android <= 2.1, where the filename extension needs to be in uppercase.
        -  :doc:`Form Helper ` changes include:
     	 - ``form_dropdown()`` will now also take an array for unity with other form helpers.
    -	 - ``form_prep()`` is now **DEPRECATED** and only acts as an alias for :doc:`common function ` ``html_escape()``.
    +	 - ``form_prep()``'s second argument now only accepts a boolean value, which determines whether the value is escaped for a *textarea* or a regular *input* element.
        -  ``do_hash()`` now uses PHP's native ``hash()`` function (supporting more algorithms) and is deprecated.
        -  Removed previously deprecated helper function ``js_insert_smiley()`` from :doc:`Smiley Helper `.
        -  :doc:`File Helper ` changes include:
    diff --git a/user_guide_src/source/helpers/form_helper.rst b/user_guide_src/source/helpers/form_helper.rst
    index 015bf11626a..02a75869416 100644
    --- a/user_guide_src/source/helpers/form_helper.rst
    +++ b/user_guide_src/source/helpers/form_helper.rst
    @@ -463,6 +463,26 @@ the tag. For example
     	echo form_close($string);
     	// Would produce:   
     
    +form_prep()
    +===========
    +
    +Allows you to safely use HTML and characters such as quotes within form
    +elements without breaking out of the form. Consider this example
    +::
    +
    +	$string = 'Here is a string containing "quoted" text.';
    +	
    +
    +Since the above string contains a set of quotes it will cause the form
    +to break. The ``form_prep()`` function converts HTML so that it can be used
    +safely::
    +
    +	
    +
    +.. note:: If you use any of the form helper functions listed in this page the form
    +	values will be prepped automatically, so there is no need to call this
    +	function. Use it only if you are creating your own form elements.
    +
     set_value()
     ===========
     
    @@ -523,26 +543,4 @@ This function is identical to the **set_checkbox()** function above.
     .. note:: If you are using the Form Validation class, you must always specify a rule for your field,
     	even if empty, in order for the set_*() functions to work. This is because if a Form Validation object
     	is defined, the control for set_*() is handed over to a method of the class instead of the generic helper
    -	function.
    -
    -Escaping field values
    -=====================
    -
    -You may need to use HTML and characters such as quotes within form
    -elements. In order to do that safely, you'll need to use
    -:doc:`common function <../general/common_functions>` ``html_escape()``.
    -
    -Consider the following example::
    -
    -	$string = 'Here is a string containing "quoted" text.';
    -	
    -
    -Since the above string contains a set of quotes it will cause the form
    -to break. The ``html_escape()`` function converts HTML so that it can be
    -used safely::
    -
    -	
    -
    -.. note:: If you use any of the form helper functions listed in this page, the form
    -	values will be prepped automatically, so there is no need to call this
    -	function. Use it only if you are creating your own form elements.
    \ No newline at end of file
    +	function.
    \ No newline at end of file
    diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst
    index 6d99f465521..fd5eea47887 100644
    --- a/user_guide_src/source/installation/upgrade_300.rst
    +++ b/user_guide_src/source/installation/upgrade_300.rst
    @@ -163,16 +163,6 @@ String helper repeater()
     PHP's native ``str_repeat()`` function. It is deprecated and scheduled for removal in
     CodeIgniter 3.1+.
     
    -.. note:: This function is still available, but you're strongly encouraged to remove it's usage sooner
    -	rather than later.
    -
    -Form helper form_prep()
    -=======================
    -
    -:doc:`Form Helper <../helpers/form_helper>` function ``form_prep()`` is now just an alias for
    -:doc:`common function <../general/common_functions>` ``html_escape()`` and it's second argument
    -is ignored. It is deprecated and scheduled for removal in CodeIgniter 3.1+.
    -
     .. note:: This function is still available, but you're strongly encouraged to remove it's usage sooner
     	rather than later.
     
    
    From 075f6fa31aab069aaa21a4d6f13e3ca850012d05 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 1 Nov 2012 15:18:44 +0200
    Subject: [PATCH 1823/5397] Fix an erroneous variable name
    
    ---
     system/helpers/form_helper.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php
    index 9c4c4dae684..2f451b402aa 100644
    --- a/system/helpers/form_helper.php
    +++ b/system/helpers/form_helper.php
    @@ -621,7 +621,7 @@ function form_prep($str = '', $is_textarea = FALSE)
     			return str_replace(array('<', '>'), array('<', '>'), stripslashes($str));
     		}
     
    -		return str_replace(array("'", '"'), array(''', '"'), stripslashes($data));
    +		return str_replace(array("'", '"'), array(''', '"'), stripslashes($str));
     	}
     }
     
    
    From 1a9b7e0d1f96b3cee5692f582d860dca4978dee5 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 1 Nov 2012 16:23:47 +0200
    Subject: [PATCH 1824/5397] Remove is_numeric() checks from Cart library
     (superseded by casts to float)
    
    ---
     system/libraries/Cart.php | 17 +----------------
     1 file changed, 1 insertion(+), 16 deletions(-)
    
    diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php
    index d4b17fa3625..6cc7ee230c8 100644
    --- a/system/libraries/Cart.php
    +++ b/system/libraries/Cart.php
    @@ -193,7 +193,7 @@ protected function _insert($items = array())
     		$items['qty'] = (float) $items['qty'];
     
     		// If the quantity is zero or blank there's nothing for us to do
    -		if ( ! is_numeric($items['qty']) OR $items['qty'] == 0)
    +		if ($items['qty'] == 0)
     		{
     			return FALSE;
     		}
    @@ -224,15 +224,6 @@ protected function _insert($items = array())
     		// Prep the price. Remove leading zeros and anything that isn't a number or decimal point.
     		$items['price'] = (float) $items['price'];
     
    -		// Is the price a valid number?
    -		if ( ! is_numeric($items['price']))
    -		{
    -			log_message('error', 'An invalid price was submitted for product ID: '.$items['id']);
    -			return FALSE;
    -		}
    -
    -		// --------------------------------------------------------------------
    -
     		// We now need to create a unique identifier for the item being inserted into the cart.
     		// Every time something is added to the cart it is stored in the master cart array.
     		// Each row in the cart array, however, must have a unique index that identifies not only
    @@ -350,12 +341,6 @@ protected function _update($items = array())
     		// Prep the quantity
     		$items['qty'] = (float) $items['qty'];
     
    -		// Is the quantity a number?
    -		if ( ! is_numeric($items['qty']))
    -		{
    -			return FALSE;
    -		}
    -
     		// Is the quantity zero?  If so we will remove the item from the cart.
     		// If the quantity is greater than zero we are updating
     		if ($items['qty'] == 0)
    
    From c5536aac5752054f7f76e448d58b86407d8f574e Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 1 Nov 2012 17:33:58 +0200
    Subject: [PATCH 1825/5397] Manually apply PR #1594 (fixing phpdoc page-level
     generation/warnings)
    
    Also partially fixes issue #1295, fixes inconsistencies in some page-level docblocks and adds include checks in language files.
    ---
     application/controllers/welcome.php                          | 3 ++-
     application/views/errors/error_404.php                       | 3 ++-
     application/views/errors/error_db.php                        | 3 ++-
     application/views/errors/error_general.php                   | 3 ++-
     application/views/errors/error_php.php                       | 3 ++-
     application/views/welcome_message.php                        | 3 ++-
     system/core/Benchmark.php                                    | 3 ++-
     system/core/CodeIgniter.php                                  | 3 ++-
     system/core/Common.php                                       | 3 ++-
     system/core/Config.php                                       | 3 ++-
     system/core/Controller.php                                   | 3 ++-
     system/core/Exceptions.php                                   | 3 ++-
     system/core/Hooks.php                                        | 3 ++-
     system/core/Input.php                                        | 3 ++-
     system/core/Lang.php                                         | 3 ++-
     system/core/Loader.php                                       | 3 ++-
     system/core/Model.php                                        | 3 ++-
     system/core/Output.php                                       | 3 ++-
     system/core/Router.php                                       | 3 ++-
     system/core/Security.php                                     | 3 ++-
     system/core/URI.php                                          | 3 ++-
     system/core/Utf8.php                                         | 3 ++-
     system/database/DB.php                                       | 3 ++-
     system/database/DB_cache.php                                 | 3 ++-
     system/database/DB_driver.php                                | 3 ++-
     system/database/DB_forge.php                                 | 3 ++-
     system/database/DB_query_builder.php                         | 3 ++-
     system/database/DB_result.php                                | 3 ++-
     system/database/DB_utility.php                               | 3 ++-
     system/database/drivers/cubrid/cubrid_driver.php             | 3 ++-
     system/database/drivers/cubrid/cubrid_forge.php              | 3 ++-
     system/database/drivers/cubrid/cubrid_result.php             | 3 ++-
     system/database/drivers/cubrid/cubrid_utility.php            | 3 ++-
     system/database/drivers/ibase/ibase_driver.php               | 3 ++-
     system/database/drivers/ibase/ibase_forge.php                | 3 ++-
     system/database/drivers/ibase/ibase_result.php               | 3 ++-
     system/database/drivers/ibase/ibase_utility.php              | 3 ++-
     system/database/drivers/mssql/mssql_driver.php               | 3 ++-
     system/database/drivers/mssql/mssql_forge.php                | 3 ++-
     system/database/drivers/mssql/mssql_result.php               | 3 ++-
     system/database/drivers/mssql/mssql_utility.php              | 3 ++-
     system/database/drivers/mysql/mysql_driver.php               | 3 ++-
     system/database/drivers/mysql/mysql_forge.php                | 3 ++-
     system/database/drivers/mysql/mysql_result.php               | 3 ++-
     system/database/drivers/mysql/mysql_utility.php              | 3 ++-
     system/database/drivers/mysqli/mysqli_driver.php             | 3 ++-
     system/database/drivers/mysqli/mysqli_forge.php              | 3 ++-
     system/database/drivers/mysqli/mysqli_result.php             | 3 ++-
     system/database/drivers/mysqli/mysqli_utility.php            | 3 ++-
     system/database/drivers/oci8/oci8_driver.php                 | 3 ++-
     system/database/drivers/oci8/oci8_forge.php                  | 3 ++-
     system/database/drivers/oci8/oci8_result.php                 | 3 ++-
     system/database/drivers/oci8/oci8_utility.php                | 3 ++-
     system/database/drivers/odbc/odbc_driver.php                 | 3 ++-
     system/database/drivers/odbc/odbc_forge.php                  | 3 ++-
     system/database/drivers/odbc/odbc_result.php                 | 3 ++-
     system/database/drivers/odbc/odbc_utility.php                | 3 ++-
     system/database/drivers/pdo/pdo_driver.php                   | 3 ++-
     system/database/drivers/pdo/pdo_forge.php                    | 3 ++-
     system/database/drivers/pdo/pdo_result.php                   | 3 ++-
     system/database/drivers/pdo/pdo_utility.php                  | 3 ++-
     system/database/drivers/pdo/subdrivers/pdo_4d_driver.php     | 3 ++-
     system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php | 3 ++-
     system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php  | 3 ++-
     .../database/drivers/pdo/subdrivers/pdo_firebird_driver.php  | 3 ++-
     system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php    | 3 ++-
     .../database/drivers/pdo/subdrivers/pdo_informix_driver.php  | 3 ++-
     system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php  | 3 ++-
     system/database/drivers/pdo/subdrivers/pdo_oci_driver.php    | 3 ++-
     system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php   | 3 ++-
     system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php  | 3 ++-
     system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php | 3 ++-
     system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php | 3 ++-
     system/database/drivers/postgre/postgre_driver.php           | 3 ++-
     system/database/drivers/postgre/postgre_forge.php            | 3 ++-
     system/database/drivers/postgre/postgre_result.php           | 3 ++-
     system/database/drivers/postgre/postgre_utility.php          | 3 ++-
     system/database/drivers/sqlite/sqlite_driver.php             | 3 ++-
     system/database/drivers/sqlite/sqlite_forge.php              | 3 ++-
     system/database/drivers/sqlite/sqlite_result.php             | 3 ++-
     system/database/drivers/sqlite/sqlite_utility.php            | 3 ++-
     system/database/drivers/sqlite3/sqlite3_driver.php           | 3 ++-
     system/database/drivers/sqlite3/sqlite3_forge.php            | 3 ++-
     system/database/drivers/sqlite3/sqlite3_result.php           | 3 ++-
     system/database/drivers/sqlite3/sqlite3_utility.php          | 3 ++-
     system/database/drivers/sqlsrv/sqlsrv_driver.php             | 3 ++-
     system/database/drivers/sqlsrv/sqlsrv_forge.php              | 3 ++-
     system/database/drivers/sqlsrv/sqlsrv_result.php             | 3 ++-
     system/database/drivers/sqlsrv/sqlsrv_utility.php            | 3 ++-
     system/helpers/array_helper.php                              | 3 ++-
     system/helpers/captcha_helper.php                            | 3 ++-
     system/helpers/cookie_helper.php                             | 3 ++-
     system/helpers/date_helper.php                               | 3 ++-
     system/helpers/directory_helper.php                          | 3 ++-
     system/helpers/download_helper.php                           | 3 ++-
     system/helpers/email_helper.php                              | 3 ++-
     system/helpers/file_helper.php                               | 3 ++-
     system/helpers/form_helper.php                               | 4 +++-
     system/helpers/html_helper.php                               | 3 ++-
     system/helpers/inflector_helper.php                          | 3 ++-
     system/helpers/language_helper.php                           | 3 ++-
     system/helpers/number_helper.php                             | 3 ++-
     system/helpers/path_helper.php                               | 3 ++-
     system/helpers/security_helper.php                           | 3 ++-
     system/helpers/smiley_helper.php                             | 3 ++-
     system/helpers/string_helper.php                             | 3 ++-
     system/helpers/text_helper.php                               | 3 ++-
     system/helpers/typography_helper.php                         | 3 ++-
     system/helpers/url_helper.php                                | 3 ++-
     system/helpers/xml_helper.php                                | 3 ++-
     system/language/english/calendar_lang.php                    | 1 +
     system/language/english/date_lang.php                        | 1 +
     system/language/english/db_lang.php                          | 1 +
     system/language/english/email_lang.php                       | 1 +
     system/language/english/form_validation_lang.php             | 1 +
     system/language/english/ftp_lang.php                         | 1 +
     system/language/english/imglib_lang.php                      | 1 +
     system/language/english/migration_lang.php                   | 2 +-
     system/language/english/number_lang.php                      | 1 +
     system/language/english/profiler_lang.php                    | 1 +
     system/language/english/unit_test_lang.php                   | 1 +
     system/language/english/upload_lang.php                      | 1 +
     system/libraries/Cache/Cache.php                             | 5 +++--
     system/libraries/Cache/drivers/Cache_apc.php                 | 5 +++--
     system/libraries/Cache/drivers/Cache_dummy.php               | 5 +++--
     system/libraries/Cache/drivers/Cache_file.php                | 5 +++--
     system/libraries/Cache/drivers/Cache_memcached.php           | 5 +++--
     system/libraries/Cache/drivers/Cache_redis.php               | 5 +++--
     system/libraries/Cache/drivers/Cache_wincache.php            | 5 +++--
     system/libraries/Calendar.php                                | 3 ++-
     system/libraries/Cart.php                                    | 3 ++-
     system/libraries/Driver.php                                  | 3 ++-
     system/libraries/Email.php                                   | 3 ++-
     system/libraries/Encrypt.php                                 | 3 ++-
     system/libraries/Form_validation.php                         | 3 ++-
     system/libraries/Ftp.php                                     | 3 ++-
     system/libraries/Image_lib.php                               | 3 ++-
     system/libraries/Javascript.php                              | 3 ++-
     system/libraries/Log.php                                     | 5 +++--
     system/libraries/Migration.php                               | 3 ++-
     system/libraries/Pagination.php                              | 3 ++-
     system/libraries/Parser.php                                  | 3 ++-
     system/libraries/Profiler.php                                | 3 ++-
     system/libraries/Session/Session.php                         | 5 +++--
     system/libraries/Session/drivers/Session_cookie.php          | 5 +++--
     system/libraries/Session/drivers/Session_native.php          | 5 +++--
     system/libraries/Table.php                                   | 3 ++-
     system/libraries/Trackback.php                               | 3 ++-
     system/libraries/Typography.php                              | 3 ++-
     system/libraries/Unit_test.php                               | 3 ++-
     system/libraries/Upload.php                                  | 3 ++-
     system/libraries/User_agent.php                              | 3 ++-
     system/libraries/Xmlrpc.php                                  | 3 ++-
     system/libraries/Xmlrpcs.php                                 | 3 ++-
     system/libraries/Zip.php                                     | 3 ++-
     system/libraries/javascript/Jquery.php                       | 3 ++-
     156 files changed, 312 insertions(+), 156 deletions(-)
    
    diff --git a/application/controllers/welcome.php b/application/controllers/welcome.php
    index 1ed82d2a716..f70dd78adb9 100644
    --- a/application/controllers/welcome.php
    +++ b/application/controllers/welcome.php
    @@ -1,4 +1,4 @@
    -
     
     
    diff --git a/application/views/errors/error_db.php b/application/views/errors/error_db.php
    index 76ca6df7a24..21d5d86ef19 100644
    --- a/application/views/errors/error_db.php
    +++ b/application/views/errors/error_db.php
    @@ -1,4 +1,4 @@
    -
     
     
    diff --git a/application/views/errors/error_general.php b/application/views/errors/error_general.php
    index e9baf166581..5bf36111336 100644
    --- a/application/views/errors/error_general.php
    +++ b/application/views/errors/error_general.php
    @@ -1,4 +1,4 @@
    -
     
     
    diff --git a/application/views/errors/error_php.php b/application/views/errors/error_php.php
    index b76dc8a9e9a..c0c4bd622d9 100644
    --- a/application/views/errors/error_php.php
    +++ b/application/views/errors/error_php.php
    @@ -1,4 +1,4 @@
    -
     
     
    diff --git a/application/views/welcome_message.php b/application/views/welcome_message.php index d227f82d18b..27332f4566a 100644 --- a/application/views/welcome_message.php +++ b/application/views/welcome_message.php @@ -1,4 +1,4 @@ - diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php index f94db2721d5..e80ee54ddde 100644 --- a/system/core/Benchmark.php +++ b/system/core/Benchmark.php @@ -1,4 +1,4 @@ -\n\n"; + $message .= '<'."?php if defined('BASEPATH') OR exit('No direct script access allowed'); ?".">\n\n"; } if ( ! $fp = @fopen($filepath, FOPEN_WRITE_CREATE)) diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index 5d637d44ab9..06f2f562c43 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -1,4 +1,4 @@ - Date: Thu, 1 Nov 2012 18:50:43 +0200 Subject: [PATCH 1826/5397] [ci skip] Alter form validation examples including the *matches* rule --- user_guide_src/source/libraries/form_validation.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 4d194021217..c010eb5780f 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -288,8 +288,8 @@ CodeIgniter lets you pipe multiple rules together. Let's try it. Change your rules in the third parameter of rule setting function, like this:: $this->form_validation->set_rules('username', 'Username', 'required|min_length[5]|max_length[12]|is_unique[users.username]'); - $this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]'); - $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required'); + $this->form_validation->set_rules('password', 'Password', 'required'); + $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required|matches[password]'); $this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[users.email]'); The above code sets the following rules: @@ -315,8 +315,8 @@ can also prep your data in various ways. For example, you can set up rules like this:: $this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[5]|max_length[12]|xss_clean'); - $this->form_validation->set_rules('password', 'Password', 'trim|required|matches[passconf]|md5'); - $this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required'); + $this->form_validation->set_rules('password', 'Password', 'trim|required|md5'); + $this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required|matches[password]'); $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email'); In the above example, we are "trimming" the fields, converting the From d1097a1dc30f40c68bc4a5c89d3fadb295c55e56 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Nov 2012 19:55:42 +0200 Subject: [PATCH 1827/5397] Allow use of dashes in controller/method URI segments Supersedes PR #642 --- system/core/Router.php | 10 ++++++++- user_guide_src/source/changelog.rst | 6 +++-- user_guide_src/source/general/routing.rst | 6 ++--- user_guide_src/source/general/urls.rst | 27 +++++++++++++++++++---- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/system/core/Router.php b/system/core/Router.php index 87f3e9e6387..89fb74f2f8b 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -190,6 +190,7 @@ protected function _set_default_controller() { 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) { @@ -268,9 +269,13 @@ protected function _validate_request($segments) return $segments; } + $temp = str_replace('-', '_', $segments[0]); + // Does the requested controller exist in the root folder? - if (file_exists(APPPATH.'controllers/'.$segments[0].'.php')) + if (file_exists(APPPATH.'controllers/'.$temp.'.php')) { + $segments[0] = $temp; + empty($segments[1]) OR $segments[1] = str_replace('-', '_', $segments[1]); return $segments; } @@ -283,6 +288,9 @@ protected function _validate_request($segments) if (count($segments) > 0) { + $segments[0] = str_replace('-', '_', $segments[0]); + empty($segments[1]) OR $segments[1] = str_replace('-', '_', $segments[1]); + // Does the requested controller exist in the sub-folder? if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].'.php')) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 511ee00f673..8363d279765 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -46,7 +46,7 @@ Release Date: Not Released Only entries in ``$autoload['libraries']`` are auto-loaded now. - Removed previously deprecated EXT constant. - Updated all classes to be written in PHP 5 style, with visibility declarations and no ``var`` usage for properties. - - Moved error templates to "application/views/errors" + - Moved error templates to *application/views/errors*. - Global config files are loaded first, then environment ones. Environment config keys overwrite base ones, allowing to only set the keys we want changed per environment. - Changed detection of ``$view_folder`` so that if it's not found in the current path, it will now also be searched for under the application folder. - Path constants BASEPATH, APPPATH and VIEWPATH are now (internally) defined as absolute paths. @@ -270,7 +270,9 @@ Release Date: Not Released - Added method ``strip_image_tags()``. - Added ``$config['csrf_regeneration']``, which makes token regeneration optional. - Added ``$config['csrf_exclude_uris']``, which allows you list URIs which will not have the CSRF validation methods run. - - Added possibility to route requests using callbacks. + - :doc:`URI Routing ` changes include: + - Added possibility to route requests using callbacks. + - Added possibility to use dashes in the controller and method URI segments (translated to underscores). Bug fixes for 3.0 ------------------ diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst index 43c181669ad..e6174cc0dee 100644 --- a/user_guide_src/source/general/routing.rst +++ b/user_guide_src/source/general/routing.rst @@ -162,8 +162,8 @@ appear by default. This route indicates which controller class should be loaded if the requested controller is not found. It will override the default 404 error page. It won't affect to the show_404() function, which will -continue loading the default error_404.php file at -application/errors/error_404.php. +continue loading the default *error_404.php* file at +*application/errors/error_404.php*. .. important:: The reserved routes must come before any wildcard or - regular expression routes. + regular expression routes. \ No newline at end of file diff --git a/user_guide_src/source/general/urls.rst b/user_guide_src/source/general/urls.rst index 6b390b559e6..20f80632a78 100644 --- a/user_guide_src/source/general/urls.rst +++ b/user_guide_src/source/general/urls.rst @@ -28,9 +28,28 @@ approach, usually represent:: #. The third, and any additional segments, represent the ID and any variables that will be passed to the controller. -The :doc:`URI Class <../libraries/uri>` and the :doc:`URL Helper <../helpers/url_helper>` contain functions that make it -easy to work with your URI data. In addition, your URLs can be remapped -using the :doc:`URI Routing ` feature for more flexibility. +The :doc:`URI Class <../libraries/uri>` and the :doc:`URL Helper <../helpers/url_helper>` +contain functions that make it easy to work with your URI data. In addition, +your URLs can be remapped using the :doc:`URI Routing ` feature for +more flexibility. + +Friendly URLs +============= + +As you might guess, since there's a straight relationship between +URI segments and the controller/method pair that's being called, +those two determining segments must represent a valid class and +method name. +You may however also use dashes in the class/method-representing +segments, and they will automatically be translated to underscores +in order to be valid routed segments. + +For example:: + + example.com/my-settings/change-password/ + +The above example will route to the ``My_settings`` controller and +its method ``change_password()``. Removing the index.php file =========================== @@ -94,4 +113,4 @@ active. Your controllers and functions will then be accessible using the .. note:: If you are using query strings you will have to build your own URLs, rather than utilizing the URL helpers (and other helpers that generate URLs, like some of the form helpers) as these are designed - to work with segment based URLs. + to work with segment based URLs. \ No newline at end of file From 254735ee011d99f5c7fe3825849d7ec0b54bd4e1 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Nov 2012 21:21:20 +0200 Subject: [PATCH 1828/5397] Fix issue #122 --- system/core/URI.php | 9 ++++++++- user_guide_src/source/changelog.rst | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/system/core/URI.php b/system/core/URI.php index 2f6cade3471..e2cac8d8973 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -696,7 +696,14 @@ public function uri_string() */ public function ruri_string() { - return implode('/', $this->rsegment_array()); + global $RTR; + + if (($dir = $RTR->fetch_directory()) === '/') + { + $dir = ''; + } + + return $dir.implode('/', $this->rsegment_array()); } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8363d279765..a4af27254f2 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -411,6 +411,7 @@ Bug fixes for 3.0 - Fixed a bug (#658) - :doc:`Routing ` wildcard **:any** didn't work as advertised and matched multiple URI segments instead of all characters within a single segment. - Fixed a bug (#1938) - :doc:`Email Library ` removed multiple spaces inside a pre-formatted plain text message. - Fixed a bug (#388, #705) - :doc:`URI Library ` didn't apply URL-decoding to URI segments that it got from **REQUEST_URI** and/or **QUERY_STRING**. +- Fixed a bug (#122) - :doc:`URI Library ` method ``ruri_string()`` didn't include a directory if one is used. Version 2.1.3 ============= From 597ea27a0660bdf72f84d74566cc842e4da37efd Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Nov 2012 22:56:26 +0200 Subject: [PATCH 1829/5397] [ci skip] DocBlocks for Email, Ftp, Unit_test and Javascript libraries Partially fixes issue #1295 --- system/libraries/Email.php | 327 ++++++++++++++++++++++++++++++-- system/libraries/Ftp.php | 103 +++++++--- system/libraries/Javascript.php | 17 +- system/libraries/Unit_test.php | 51 ++++- 4 files changed, 437 insertions(+), 61 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 0109e28901f..62f196c055e 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -39,55 +39,340 @@ */ class CI_Email { + /** + * Used as the User-Agent and X-Mailer headers' value. + * + * @var string + */ public $useragent = 'CodeIgniter'; + + /** + * Path to the Sendmail binary. + * + * @var string + */ public $mailpath = '/usr/sbin/sendmail'; // Sendmail path + + /** + * Which method to use for sending e-mails. + * + * @var string 'mail', 'sendmail' or 'smtp' + */ public $protocol = 'mail'; // mail/sendmail/smtp - public $smtp_host = ''; // SMTP Server. Example: mail.earthlink.net - public $smtp_user = ''; // SMTP Username - public $smtp_pass = ''; // SMTP Password - public $smtp_port = 25; // SMTP Port - public $smtp_timeout = 5; // SMTP Timeout in seconds - public $smtp_crypto = ''; // SMTP Encryption. Can be null, tls or ssl. - public $wordwrap = TRUE; // TRUE/FALSE - Turns word-wrap on/off - public $wrapchars = 76; // Number of characters to wrap at. - public $mailtype = 'text'; // text/html - Defines email formatting - public $charset = 'utf-8'; // Default char set: iso-8859-1 or us-ascii + + /** + * STMP Server host + * + * @var string + */ + public $smtp_host = ''; + + /** + * SMTP Username + * + * @var string + */ + public $smtp_user = ''; + + /** + * SMTP Password + * + * @var string + */ + public $smtp_pass = ''; + + /** + * SMTP Server port + * + * @var int + */ + public $smtp_port = 25; + + /** + * SMTP connection timeout in seconds + * + * @var int + */ + public $smtp_timeout = 5; + + /** + * SMTP Encryption + * + * @var string NULL, 'tls' or 'ssl' + */ + public $smtp_crypto = NULL; + + /** + * Whether to apply word-wrapping to the message body. + * + * @var bool + */ + public $wordwrap = TRUE; + + /** + * Number of characters to wrap at. + * + * @see CI_Email::$wordwrap + * @var int + */ + public $wrapchars = 76; + + /** + * Message format. + * + * @var string 'text' or 'html' + */ + public $mailtype = 'text'; + + /** + * Character set (default: utf-8) + * + * @var string + */ + public $charset = 'utf-8'; + + /** + * Multipart message + * + * @var string 'mixed' (in the body) or 'related' (separate) + */ public $multipart = 'mixed'; // "mixed" (in the body) or "related" (separate) - public $alt_message = ''; // Alternative message for HTML emails - public $validate = FALSE; // TRUE/FALSE - Enables email validation + + /** + * Alternative message (for HTML messages only) + * + * @var string + */ + public $alt_message = ''; + + /** + * Whether to validate e-mail addresses. + * + * @var bool + */ + public $validate = FALSE; + + /** + * X-Priority header value. + * + * @var int 1-5 + */ public $priority = 3; // Default priority (1 - 5) + + /** + * Newline character sequence. + * Use "\r\n" to comply with RFC 822. + * + * @link http://www.ietf.org/rfc/rfc822.txt + * @var string "\r\n" or "\n" + */ public $newline = "\n"; // Default newline. "\r\n" or "\n" (Use "\r\n" to comply with RFC 822) - public $crlf = "\n"; // The RFC 2045 compliant CRLF for quoted-printable is "\r\n". Apparently some servers, - // even on the receiving end think they need to muck with CRLFs, so using "\n", while - // distasteful, is the only thing that seems to work for all environments. - public $dsn = FALSE; // Delivery Status Notification - public $send_multipart = TRUE; // TRUE/FALSE - Yahoo does not like multipart alternative, so this is an override. Set to FALSE for Yahoo. - public $bcc_batch_mode = FALSE; // TRUE/FALSE - Turns on/off Bcc batch feature - public $bcc_batch_size = 200; // If bcc_batch_mode = TRUE, sets max number of Bccs in each batch + /** + * CRLF character sequence + * + * RFC 2045 specifies that for 'quoted-printable' encoding, + * "\r\n" must be used. However, it appears that some servers + * (even on the receiving end) don't handle it properly and + * switching to "\n", while improper, is the only solution + * that seems to work for all environments. + * + * @link http://www.ietf.org/rfc/rfc822.txt + * @var string + */ + public $crlf = "\n"; + + /** + * Whether to use Delivery Status Notification. + * + * @var bool + */ + public $dsn = FALSE; + + /** + * Whether to send multipart alternatives. + * Yahoo! doesn't seem to like these. + * + * @var bool + */ + public $send_multipart = TRUE; + + /** + * Whether to send messages to BCC recipients in batches. + * + * @var bool + */ + public $bcc_batch_mode = FALSE; + + /** + * BCC Batch max number size. + * + * @see CI_Email::$bcc_batch_mode + * @var int + */ + public $bcc_batch_size = 200; + + // -------------------------------------------------------------------- + + /** + * Whether PHP is running in safe mode. Initialized by the class constructor. + * + * @var bool + */ protected $_safe_mode = FALSE; + + /** + * Subject header + * + * @var string + */ protected $_subject = ''; + + /** + * Message body + * + * @var string + */ protected $_body = ''; + + /** + * Final message body to be sent. + * + * @var string + */ protected $_finalbody = ''; + + /** + * multipart/alternative boundary + * + * @var string + */ protected $_alt_boundary = ''; + + /** + * Attachment boundary + * + * @var string + */ protected $_atc_boundary = ''; + + /** + * Final headers to send + * + * @var string + */ protected $_header_str = ''; + + /** + * SMTP Connection socket placeholder + * + * @var resource + */ protected $_smtp_connect = ''; + + /** + * Mail encoding + * + * @var string '8bit' or '7bit' + */ protected $_encoding = '8bit'; - protected $_IP = FALSE; + + /** + * Whether to perform SMTP authentication + * + * @var bool + */ protected $_smtp_auth = FALSE; + + /** + * Whether to send a Reply-To header + * + * @var bool + */ protected $_replyto_flag = FALSE; + + /** + * Debug messages + * + * @see CI_Email::print_debugger() + * @var string + */ protected $_debug_msg = array(); + + /** + * Recipients + * + * @var string[] + */ protected $_recipients = array(); + + /** + * CC Recipients + * + * @var string[] + */ protected $_cc_array = array(); + + /** + * BCC Recipients + * + * @var string[] + */ protected $_bcc_array = array(); + + /** + * Message headers + * + * @var string[] + */ protected $_headers = array(); + + /** + * Attachment data + * + * @var array + */ protected $_attachments = array(); + + /** + * Valid $protocol values + * + * @see CI_Email::$protocol + * @var string[] + */ protected $_protocols = array('mail', 'sendmail', 'smtp'); - protected $_base_charsets = array('us-ascii', 'iso-2022-'); // 7-bit charsets (excluding language suffix) + + /** + * Base charsets + * + * Character sets valid for 7-bit encoding, + * excluding language suffix. + * + * @var string[] + */ + protected $_base_charsets = array('us-ascii', 'iso-2022-'); + + /** + * Bit depths + * + * Valid mail encodings + * + * @see CI_Email::$_encoding + * @var string[] + */ protected $_bit_depths = array('7bit', '8bit'); + + /** + * $priority translations + * + * Actual values to send with the X-Priority header + * + * @var string[] + */ protected $_priorities = array('1 (Highest)', '2 (High)', '3 (Normal)', '4 (Low)', '5 (Lowest)'); + // -------------------------------------------------------------------- + /** * Constructor - Sets Email Preferences * diff --git a/system/libraries/Ftp.php b/system/libraries/Ftp.php index b9954c7f285..60c03b5ada1 100644 --- a/system/libraries/Ftp.php +++ b/system/libraries/Ftp.php @@ -37,18 +37,63 @@ */ class CI_FTP { + /** + * FTP Server hostname + * + * @var string + */ public $hostname = ''; + + /** + * FTP Username + * + * @var string + */ public $username = ''; + + /** + * FTP Password + * + * @var string + */ public $password = ''; + + /** + * FTP Server port + * + * @var int + */ public $port = 21; + + /** + * Passive mode flag + * + * @var bool + */ public $passive = TRUE; + + /** + * Debug flag + * + * Specifies whether to display error messages. + * + * @var bool + */ public $debug = FALSE; + + /** + * Connection + * + * @var resource + */ public $conn_id = FALSE; + // -------------------------------------------------------------------- + /** * Constructor * - * @param array $config = array() + * @param array $config * @return void */ public function __construct($config = array()) @@ -66,7 +111,7 @@ public function __construct($config = array()) /** * Initialize preferences * - * @param array + * @param array $config * @return void */ public function initialize($config = array()) @@ -88,7 +133,7 @@ public function initialize($config = array()) /** * FTP Connect * - * @param array the connection values + * @param array $config Connection values * @return bool */ public function connect($config = array()) @@ -168,8 +213,8 @@ protected function _is_conn() * so we do it by trying to change to a particular directory. * Internally, this parameter is only used by the "mirror" function below. * - * @param string - * @param bool + * @param string $path + * @param bool $supress_debug * @return bool */ public function changedir($path = '', $supress_debug = FALSE) @@ -198,8 +243,8 @@ public function changedir($path = '', $supress_debug = FALSE) /** * Create a directory * - * @param string - * @param int + * @param string $path + * @param int $permissions * @return bool */ public function mkdir($path = '', $permissions = NULL) @@ -234,10 +279,10 @@ public function mkdir($path = '', $permissions = NULL) /** * Upload a file to the server * - * @param string - * @param string - * @param string - * @param int + * @param string $locpath + * @param string $rempath + * @param string $mode + * @param int $permissions * @return bool */ public function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL) @@ -288,9 +333,9 @@ public function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL) /** * Download a file from a remote server to the local server * - * @param string - * @param string - * @param string + * @param string $rempath + * @param string $locpath + * @param string $mode * @return bool */ public function download($rempath, $locpath, $mode = 'auto') @@ -329,9 +374,9 @@ public function download($rempath, $locpath, $mode = 'auto') /** * Rename (or move) a file * - * @param string - * @param string - * @param bool + * @param string $old_file + * @param string $new_file + * @param bool $move * @return bool */ public function rename($old_file, $new_file, $move = FALSE) @@ -360,8 +405,8 @@ public function rename($old_file, $new_file, $move = FALSE) /** * Move a file * - * @param string - * @param string + * @param string $old_file + * @param string $new_file * @return bool */ public function move($old_file, $new_file) @@ -374,7 +419,7 @@ public function move($old_file, $new_file) /** * Rename (or move) a file * - * @param string + * @param string $filepath * @return bool */ public function delete_file($filepath) @@ -404,7 +449,7 @@ public function delete_file($filepath) * Delete a folder and recursively delete everything (including sub-folders) * containted within it. * - * @param string + * @param string $filepath * @return bool */ public function delete_dir($filepath) @@ -451,8 +496,8 @@ public function delete_dir($filepath) /** * Set file permissions * - * @param string the file path - * @param int the permissions + * @param string $path File path + * @param int $perm Permissions * @return bool */ public function chmod($path, $perm) @@ -481,7 +526,7 @@ public function chmod($path, $perm) /** * FTP List files in the specified directory * - * @param string $path = '.' + * @param string $path * @return array */ public function list_files($path = '.') @@ -504,8 +549,8 @@ public function list_files($path = '.') * Whatever the directory structure of the original file path will be * recreated on the server. * - * @param string path to source with trailing slash - * @param string path to destination - include the base folder with trailing slash + * @param string $locpath Path to source with trailing slash + * @param string $rempath Path to destination - include the base folder with trailing slash * @return bool */ public function mirror($locpath, $rempath) @@ -551,7 +596,7 @@ public function mirror($locpath, $rempath) /** * Extract the file extension * - * @param string + * @param string $filename * @return string */ protected function _getext($filename) @@ -570,7 +615,7 @@ protected function _getext($filename) /** * Set the upload type * - * @param string + * @param string $ext Filename extension * @return string */ protected function _settype($ext) @@ -617,7 +662,7 @@ public function close() /** * Display error message * - * @param string + * @param string $line * @return void */ protected function _error($line) diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php index c2f458de8a1..9a15cddaa0f 100644 --- a/system/libraries/Javascript.php +++ b/system/libraries/Javascript.php @@ -37,12 +37,19 @@ */ class CI_Javascript { + /** + * JavaScript location + * + * @var string + */ protected $_javascript_location = 'js'; + // -------------------------------------------------------------------- + /** * Constructor * - * @param array $params = array() + * @param array $params * @return void */ public function __construct($params = array()) @@ -587,8 +594,8 @@ public function show($element = 'this', $speed = '', $callback = '') * * gather together all script needing to be output * - * @param string $view_var = 'script_foot' - * @param bool $script_tags = TRUE + * @param string $view_var + * @param bool $script_tags * @return string */ public function compile($view_var = 'script_foot', $script_tags = TRUE) @@ -617,8 +624,8 @@ public function clear_compile() * * Outputs a }msU', $output, $javascript_clean); + // Find all the
    ,,}msU', $output, $textareas_clean);
    +                preg_match_all('{}msU', $output, $javascript_clean);
     
    -				// Minify the CSS in all the }msU', $output, $style_clean);
    -				foreach ($style_clean[0] as $s)
    -				{
    -					$output = str_replace($s, $this->minify($s, 'text/css'), $output);
    -				}
    +                // Minify the CSS in all the }msU', $output, $style_clean);
    +                foreach ($style_clean[0] as $s)
    +                {
    +                    $output = str_replace($s, $this->_minify_script_style($s, $type), $output);
    +                }
     
    -				// Minify the javascript in }msU', $output, $javascript_messed);
    -					$output = str_replace($javascript_messed[0], $javascript_mini, $output);
    -				}
    +                if (isset($javascript_mini))
    +                {
    +                    preg_match_all('{}msU', $output, $javascript_messed);
    +                    $output = str_replace($javascript_messed[0], $javascript_mini, $output);
    +                }
     
    -				$size_removed = $size_before - strlen($output);
    -				$savings_percent = round(($size_removed / $size_before * 100));
    +                $size_removed = $size_before - strlen($output);
    +                $savings_percent = round(($size_removed / $size_before * 100));
     
    -				log_message('debug', 'Minifier shaved '.($size_removed / 1000).'KB ('.$savings_percent.'%) off final HTML output.');
    +                log_message('debug', 'Minifier shaved '.($size_removed / 1000).'KB ('.$savings_percent.'%) off final HTML output.');
     
    -			break;
    +            break;
     
    -			case 'text/css':
    -			case 'text/javascript':
    +            case 'text/css':
    +            case 'text/javascript':
     
    -				//Remove CSS comments
    -				$output = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $output);
    +                $output = $this->_minify_scripts_css($output, $type);
     
    -				// Remove spaces around curly brackets, colons,
    -				// semi-colons, parenthesis, commas
    -				$output = preg_replace('!\s*(:|;|,|}|{|\(|\))\s*!', '$1', $output);
    +            break;
     
    -				// Remove spaces
    -			        $output =  preg_replace('/  /s', ' ', $output);
    +            default: break;
    +        }
     
    -			        // Remove breaklines and tabs
    -			        $output =  preg_replace('/[\r\n\t]/', '', $output);
    +        return $output;
    +    }
     
    -			break;
     
    -			default: break;
    -		}
    +    // --------------------------------------------------------------------
     
    -		return $output;
    -	}
    +	/**
    +	 * Minify Style and Script
    +	 *
    +	 * Reduce excessive size of CSS/JavaScript content.  To remove spaces this
    +     * script walks the string as an array and determines if the pointer is inside
    +     * a string created by single quotes or double quotes.  spaces inside those
    +     * strings are not stripped.  Opening and closing tags are severed from
    +     * the string initially and saved without stripping whitespace to preserve
    +     * the tags and any associated properties if tags are present
    +	 *
    +	 * @param	string	$output	Output to minify
    +     * @param   string  $type Output content MIME type
    +	 * @return	string	Minified output
    +	 */
    +    protected function _minify_script_style($output, $type = 'text/html')
    +    {
    +        // We only need this if there are tags in the file
    +        if ($type == 'text/html')
    +        {
    +            // Remove opening tag and save for later
    +            $pos = strpos($output, '>');
    +            $open_tag = substr($output, 0, $pos);
    +            $output = substr_replace($output, '', 0, $pos);
    +
    +            // Remove closing tag and save it for later
    +            $end_pos = strlen($output);
    +            $pos = strpos($output, ' $value)
    +        {
    +            if ($in_string === FALSE and $in_dstring === FALSE)
    +            {
    +                if ($value == ' ')
    +                {
    +                    unset($array_output[$key]);
    +                }
    +            }
    +
    +            if ($value == "'")
    +            {
    +                $in_string = !$in_string;
    +            }
    +
    +            if ($value == '"')
    +            {
    +                $in_dstring = !$in_dstring;
    +            }
    +        }
    +
    +        $output =  implode($array_output);
    +
    +        // Remove breaklines and tabs
    +        $output =  preg_replace('/[\r\n\t]/', '', $output);
    +
    +        // Put the opening and closing tags back if applicable
    +        if (isset($open_tag))
    +        {
    +            $output = $open_tag . $output . $closing_tag;
    +        }
    +
    +        return $output;
    +    }
     
     }
     
    
    From 638a9d243065733f862761eed0fa5829409b571a Mon Sep 17 00:00:00 2001
    From: brian978 
    Date: Tue, 18 Dec 2012 13:25:54 +0200
    Subject: [PATCH 2001/5397] Replaced spaces with tabs for indentation and ||
     with OR
    
    ---
     system/core/Security.php | 18 +++++++++---------
     1 file changed, 9 insertions(+), 9 deletions(-)
    
    diff --git a/system/core/Security.php b/system/core/Security.php
    index 8c70e85de41..5ae8e653cf1 100644
    --- a/system/core/Security.php
    +++ b/system/core/Security.php
    @@ -526,17 +526,17 @@ public function entity_decode($str, $charset = NULL)
     			$charset = config_item('charset');
     		}
     
    -                do
    -                {
    -                    $matches = $matches1 = 0;
    +		do
    +		{
    +			$matches = $matches1 = 0;
     
    -                    $str = html_entity_decode($str, ENT_COMPAT, $charset);
    -                    $str = preg_replace('~&#x(0*[0-9a-f]{2,5})~ei', 'chr(hexdec("\\1"))', $str, -1, $matches);
    -                    $str = preg_replace('~&#([0-9]{2,4})~e', 'chr(\\1)', $str, -1, $matches1);
    -                }
    -                while($matches || $matches1);
    +			$str = html_entity_decode($str, ENT_COMPAT, $charset);
    +			$str = preg_replace('~&#x(0*[0-9a-f]{2,5})~ei', 'chr(hexdec("\\1"))', $str, -1, $matches);
    +			$str = preg_replace('~&#([0-9]{2,4})~e', 'chr(\\1)', $str, -1, $matches1);
    +		}
    +		while($matches OR $matches1);
     
    -                return $str;
    +		return $str;
     	}
     
     	// --------------------------------------------------------------------
    
    From 79503c59f5c1b6dea906c62adde63e291347fac0 Mon Sep 17 00:00:00 2001
    From: Andrew Podner 
    Date: Tue, 18 Dec 2012 07:47:38 -0500
    Subject: [PATCH 2002/5397] fixes #2078: refinement of the minify function for
     CSS and scripts.
    
    ---
     system/core/Output.php | 268 ++++++++++++++++++++---------------------
     1 file changed, 134 insertions(+), 134 deletions(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index 1fafa848b53..e33f4b0b7b3 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -705,172 +705,172 @@ public function set_cache_header($last_modified, $expiration)
     	 * @return	string	Minified output
     	 */
     	public function minify($output, $type = 'text/html')
    -    {
    -        switch ($type)
    -        {
    -            case 'text/html':
    +	{
    +		switch ($type)
    +		{
    +			case 'text/html':
     
    -                $size_before = strlen($output);
    +				$size_before = strlen($output);
     
    -                if ($size_before === 0)
    -                {
    -                    return '';
    -                }
    +				if ($size_before === 0)
    +				{
    +					return '';
    +				}
     
    -                // Find all the 
    ,,}msU', $output, $textareas_clean);
    -                preg_match_all('{}msU', $output, $javascript_clean);
    +				// Find all the 
    ,,}msU', $output, $textareas_clean);
    +				preg_match_all('{}msU', $output, $javascript_clean);
     
    -                // Minify the CSS in all the }msU', $output, $style_clean);
    -                foreach ($style_clean[0] as $s)
    -                {
    -                    $output = str_replace($s, $this->_minify_script_style($s, $type), $output);
    -                }
    +				// Minify the CSS in all the }msU', $output, $style_clean);
    +				foreach ($style_clean[0] as $s)
    +				{
    +					$output = str_replace($s, $this->_minify_script_style($s, $type), $output);
    +				}
     
    -                // Minify the javascript in }msU', $output, $javascript_messed);
    -                    $output = str_replace($javascript_messed[0], $javascript_mini, $output);
    -                }
    +				if (isset($javascript_mini))
    +				{
    +					preg_match_all('{}msU', $output, $javascript_messed);
    +					$output = str_replace($javascript_messed[0], $javascript_mini, $output);
    +				}
     
    -                $size_removed = $size_before - strlen($output);
    -                $savings_percent = round(($size_removed / $size_before * 100));
    +				$size_removed = $size_before - strlen($output);
    +				$savings_percent = round(($size_removed / $size_before * 100));
     
    -                log_message('debug', 'Minifier shaved '.($size_removed / 1000).'KB ('.$savings_percent.'%) off final HTML output.');
    +				log_message('debug', 'Minifier shaved '.($size_removed / 1000).'KB ('.$savings_percent.'%) off final HTML output.');
     
    -            break;
    +			break;
     
    -            case 'text/css':
    -            case 'text/javascript':
    +			case 'text/css':
    +			case 'text/javascript':
     
    -                $output = $this->_minify_scripts_css($output, $type);
    +				$output = $this->_minify_scripts_css($output, $type);
     
    -            break;
    +			break;
     
    -            default: break;
    -        }
    +			default: break;
    +		}
     
    -        return $output;
    -    }
    +		return $output;
    +	}
     
     
    -    // --------------------------------------------------------------------
    +	// --------------------------------------------------------------------
     
     	/**
     	 * Minify Style and Script
     	 *
     	 * Reduce excessive size of CSS/JavaScript content.  To remove spaces this
    -     * script walks the string as an array and determines if the pointer is inside
    -     * a string created by single quotes or double quotes.  spaces inside those
    -     * strings are not stripped.  Opening and closing tags are severed from
    -     * the string initially and saved without stripping whitespace to preserve
    -     * the tags and any associated properties if tags are present
    +	 * script walks the string as an array and determines if the pointer is inside
    +	 * a string created by single quotes or double quotes.  spaces inside those
    +	 * strings are not stripped.  Opening and closing tags are severed from
    +	 * the string initially and saved without stripping whitespace to preserve
    +	 * the tags and any associated properties if tags are present
     	 *
     	 * @param	string	$output	Output to minify
    -     * @param   string  $type Output content MIME type
    +	 * @param	string  $type Output content MIME type
     	 * @return	string	Minified output
     	 */
    -    protected function _minify_script_style($output, $type = 'text/html')
    -    {
    -        // We only need this if there are tags in the file
    -        if ($type == 'text/html')
    -        {
    -            // Remove opening tag and save for later
    -            $pos = strpos($output, '>');
    -            $open_tag = substr($output, 0, $pos);
    -            $output = substr_replace($output, '', 0, $pos);
    -
    -            // Remove closing tag and save it for later
    -            $end_pos = strlen($output);
    -            $pos = strpos($output, ' $value)
    -        {
    -            if ($in_string === FALSE and $in_dstring === FALSE)
    -            {
    -                if ($value == ' ')
    -                {
    -                    unset($array_output[$key]);
    -                }
    -            }
    -
    -            if ($value == "'")
    -            {
    -                $in_string = !$in_string;
    -            }
    -
    -            if ($value == '"')
    -            {
    -                $in_dstring = !$in_dstring;
    -            }
    -        }
    -
    -        $output =  implode($array_output);
    -
    -        // Remove breaklines and tabs
    -        $output =  preg_replace('/[\r\n\t]/', '', $output);
    -
    -        // Put the opening and closing tags back if applicable
    -        if (isset($open_tag))
    -        {
    -            $output = $open_tag . $output . $closing_tag;
    -        }
    -
    -        return $output;
    -    }
    +	protected function _minify_script_style($output, $type = 'text/html')
    +	{
    +		// We only need this if there are tags in the file
    +		if ($type == 'text/html')
    +		{
    +			// Remove opening tag and save for later
    +			$pos = strpos($output, '>');
    +			$open_tag = substr($output, 0, $pos);
    +			$output = substr_replace($output, '', 0, $pos);
    +
    +			// Remove closing tag and save it for later
    +			$end_pos = strlen($output);
    +			$pos = strpos($output, ' $value)
    +		{
    +			if ($in_string === FALSE and $in_dstring === FALSE)
    +			{
    +				if ($value == ' ')
    +				{
    +					unset($array_output[$key]);
    +				}
    +			}
    +
    +			if ($value == "'")
    +			{
    +				$in_string = !$in_string;
    +			}
    +
    +			if ($value == '"')
    +			{
    +				$in_dstring = !$in_dstring;
    +			}
    +		}
    +
    +		$output = implode($array_output);
    +
    +		// Remove breaklines and tabs
    +		$output = preg_replace('/[\r\n\t]/', '', $output);
    +
    +		// Put the opening and closing tags back if applicable
    +		if (isset($open_tag))
    +		{
    +			$output = $open_tag . $output . $closing_tag;
    +		}
    +
    +		return $output;
    +	}
     
     }
     
    
    From 7747f0a2eecd85285a7f2acd223df6f54b543e0e Mon Sep 17 00:00:00 2001
    From: Andrew Podner 
    Date: Tue, 18 Dec 2012 13:13:15 -0500
    Subject: [PATCH 2003/5397] fixes #2078: formatting / styleguide cleanup
    
    ---
     system/core/Output.php | 14 +++++++-------
     1 file changed, 7 insertions(+), 7 deletions(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index e33f4b0b7b3..338c8b7e604 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -839,22 +839,22 @@ protected function _minify_script_style($output, $type = 'text/html')
     		$array_output = str_split($output);
     		foreach ($array_output as $key => $value)
     		{
    -			if ($in_string === FALSE and $in_dstring === FALSE)
    +			if ($in_string === FALSE && $in_dstring === FALSE)
     			{
    -				if ($value == ' ')
    +				if ($value === ' ')
     				{
     					unset($array_output[$key]);
     				}
     			}
     
    -			if ($value == "'")
    +			if ($value === "'")
     			{
    -				$in_string = !$in_string;
    +				$in_string = ! $in_string;
     			}
     
    -			if ($value == '"')
    +			if ($value === '"')
     			{
    -				$in_dstring = !$in_dstring;
    +				$in_dstring = ! $in_dstring;
     			}
     		}
     
    @@ -866,7 +866,7 @@ protected function _minify_script_style($output, $type = 'text/html')
     		// Put the opening and closing tags back if applicable
     		if (isset($open_tag))
     		{
    -			$output = $open_tag . $output . $closing_tag;
    +			$output = $open_tag.$output.$closing_tag;
     		}
     
     		return $output;
    
    From 9a171a0f7120e61e8bed44abda4930c5d8eeb256 Mon Sep 17 00:00:00 2001
    From: Andrew Podner 
    Date: Tue, 18 Dec 2012 13:18:25 -0500
    Subject: [PATCH 2004/5397] fixes #2078: formatting / styleguide cleanup
     (take2)
    
    ---
     system/core/Output.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index 338c8b7e604..3a94d97e146 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -782,7 +782,7 @@ public function minify($output, $type = 'text/html')
     			case 'text/css':
     			case 'text/javascript':
     
    -				$output = $this->_minify_scripts_css($output, $type);
    +				$output = $this->_minify_script_style($output, $type);
     
     			break;
     
    
    From 9dfceda245c7833edd3311ed0e5e5704db34e847 Mon Sep 17 00:00:00 2001
    From: Andrew Podner 
    Date: Tue, 18 Dec 2012 19:37:22 -0500
    Subject: [PATCH 2005/5397] fixes #2078: changing type variable to boolean in
     protected method
    
    ---
     system/core/Output.php | 12 ++++++------
     1 file changed, 6 insertions(+), 6 deletions(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index 3a94d97e146..2793d41325c 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -728,13 +728,13 @@ public function minify($output, $type = 'text/html')
     				preg_match_all('{}msU', $output, $style_clean);
     				foreach ($style_clean[0] as $s)
     				{
    -					$output = str_replace($s, $this->_minify_script_style($s, $type), $output);
    +					$output = str_replace($s, $this->_minify_script_style($s, TRUE), $output);
     				}
     
     				// Minify the javascript in }msU', $output, $javascript_clean);
    -
    -				// Minify the CSS in all the }msU', $output, $style_clean);
    -				foreach ($style_clean[0] as $s)
    -				{
    -					$output = str_replace($s, $this->_minify_script_style($s, TRUE), $output);
    -				}
    -
    -				// Minify the javascript in }msU', $output, $javascript_messed);
    -					$output = str_replace($javascript_messed[0], $javascript_mini, $output);
    -				}
    -
    -				$size_removed = $size_before - strlen($output);
    -				$savings_percent = round(($size_removed / $size_before * 100));
    -
    -				log_message('debug', 'Minifier shaved '.($size_removed / 1000).'KB ('.$savings_percent.'%) off final HTML output.');
    -
    -			break;
    -
    -			case 'text/css':
    -			case 'text/javascript':
    -
    -				$output = $this->_minify_script_style($output);
    -
    -			break;
    -
    -			default: break;
    -		}
    -
    -		return $output;
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Minify Style and Script
    -	 *
    -	 * Reduce excessive size of CSS/JavaScript content.  To remove spaces this
    -	 * script walks the string as an array and determines if the pointer is inside
    -	 * a string created by single quotes or double quotes.  spaces inside those
    -	 * strings are not stripped.  Opening and closing tags are severed from
    -	 * the string initially and saved without stripping whitespace to preserve
    -	 * the tags and any associated properties if tags are present
    -	 *
    -	 * Minification logic/workflow is similar to methods used by Douglas Crockford
    -	 * in JSMIN. http://www.crockford.com/javascript/jsmin.html
    -	 *
    -	 * KNOWN ISSUE: ending a line with a closing parenthesis ')' and no semicolon
    -	 * where there should be one will break the Javascript. New lines after a
    -	 * closing parenthesis are not recognized by the script. For best results
    -	 * be sure to terminate lines with a semicolon when appropriate.
    -	 *
    -	 * @param	string	$output		Output to minify
    -	 * @param	bool	$has_tags	Specify if the output has style or script tags
    -	 * @return	string	Minified output
    -	 */
    -	protected function _minify_script_style($output, $has_tags = FALSE)
    -	{
    -		// We only need this if there are tags in the file
    -		if ($has_tags === TRUE)
    -		{
    -			// Remove opening tag and save for later
    -			$pos = strpos($output, '>') + 1;
    -			$open_tag = substr($output, 0, $pos);
    -			$output = substr_replace($output, '', 0, $pos);
    -
    -			// Remove closing tag and save it for later
    -			$end_pos = strlen($output);
    -			$pos = strpos($output, ' $value)
    -		{
    -			if ($in_string === FALSE && $in_dstring === FALSE)
    -			{
    -				if ($value === ' ')
    -				{
    -					// Get the next element in the array for comparisons
    -					$next = $array_output[$key + 1];
    -
    -					// Strip spaces preceded/followed by a non-ASCII character
    -					// or not preceded/followed by an alphanumeric
    -					// or not preceded/followed \ $ and _
    -					if ((preg_match('/^[\x20-\x7f]*$/D', $next) OR preg_match('/^[\x20-\x7f]*$/D', $prev))
    -						&& ( ! ctype_alnum($next) OR ! ctype_alnum($prev))
    -						&& ! in_array($next, array('\\', '_', '$'), TRUE)
    -						&& ! in_array($prev, array('\\', '_', '$'), TRUE)
    -					)
    -					{
    -						unset($array_output[$key]);
    -					}
    -				}
    -				else
    -				{
    -					// Save this value as previous for the next iteration
    -					// if it is not a blank space
    -					$prev = $value;
    -				}
    -			}
    -
    -			if ($value === "'")
    -			{
    -				$in_string = ! $in_string;
    -			}
    -			elseif ($value === '"')
    -			{
    -				$in_dstring = ! $in_dstring;
    -			}
    -		}
    -
    -		// Put the string back together after spaces have been stripped
    -		$output = implode($array_output);
    -
    -		// Remove new line characters unless previous or next character is
    -		// printable or Non-ASCII
    -		preg_match_all('/[\n]/', $output, $lf, PREG_OFFSET_CAPTURE);
    -		$removed_lf = 0;
    -		foreach ($lf as $feed_position)
    -		{
    -			foreach ($feed_position as $position)
    -			{
    -				$position = $position[1] - $removed_lf;
    -				$next = $output[$position + 1];
    -				$prev = $output[$position - 1];
    -				if ( ! ctype_print($next) && ! ctype_print($prev)
    -					&& ! preg_match('/^[\x20-\x7f]*$/D', $next)
    -					&& ! preg_match('/^[\x20-\x7f]*$/D', $prev)
    -				)
    -				{
    -					$output = substr_replace($output, '', $position, 1);
    -					$removed_lf++;
    -				}
    -			}
    -		}
    -
    -		// Put the opening and closing tags back if applicable
    -		return isset($open_tag)
    -			? $open_tag.$output.$closing_tag
    -			: $output;
    -	}
    -
    -}
    -
    -/* End of file Output.php */
    +_zlib_oc = (bool) @ini_get('zlib.output_compression');
    +
    +		// Get mime types for later
    +		$this->mimes =& get_mimes();
    +
    +		log_message('debug', 'Output Class Initialized');
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Get Output
    +	 *
    +	 * Returns the current output string.
    +	 *
    +	 * @return	string
    +	 */
    +	public function get_output()
    +	{
    +		return $this->final_output;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Set Output
    +	 *
    +	 * Sets the output string.
    +	 *
    +	 * @param	string	$output	Output data
    +	 * @return	CI_Output
    +	 */
    +	public function set_output($output)
    +	{
    +		$this->final_output = $output;
    +		return $this;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Append Output
    +	 *
    +	 * Appends data onto the output string.
    +	 *
    +	 * @param	string	$output	Data to append
    +	 * @return	CI_Output
    +	 */
    +	public function append_output($output)
    +	{
    +		if (empty($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 sent with the final output.
    +	 *
    +	 * Note: If a file is cached, headers will not be sent.
    +	 * @todo	We need to figure out how to permit headers to be cached.
    +	 *
    +	 * @param	string	$header		Header
    +	 * @param	bool	$replace	Whether to replace the old header value, if already set
    +	 * @return	CI_Output
    +	 */
    +	public 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;
    +		}
    +
    +		$this->headers[] = array($header, $replace);
    +		return $this;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Set Content-Type Header
    +	 *
    +	 * @param	string	$mime_type	Extension of the file we're outputting
    +	 * @param	string	$charset	Character set (default: NULL)
    +	 * @return	CI_Output
    +	 */
    +	public function set_content_type($mime_type, $charset = NULL)
    +	{
    +		if (strpos($mime_type, '/') === FALSE)
    +		{
    +			$extension = ltrim($mime_type, '.');
    +
    +			// Is this extension supported?
    +			if (isset($this->mimes[$extension]))
    +			{
    +				$mime_type =& $this->mimes[$extension];
    +
    +				if (is_array($mime_type))
    +				{
    +					$mime_type = current($mime_type);
    +				}
    +			}
    +		}
    +
    +		$this->mime_type = $mime_type;
    +
    +		if (empty($charset))
    +		{
    +			$charset = config_item('charset');
    +		}
    +
    +		$header = 'Content-Type: '.$mime_type
    +			.(empty($charset) ? NULL : '; charset='.$charset);
    +
    +		$this->headers[] = array($header, TRUE);
    +		return $this;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Get Current Content-Type Header
    +	 *
    +	 * @return	string	'text/html', if not already set
    +	 */
    +	public function get_content_type()
    +	{
    +		for ($i = 0, $c = count($this->headers); $i < $c; $i++)
    +		{
    +			if (sscanf($this->headers[$i][0], 'Content-Type: %[^;]', $content_type) === 1)
    +			{
    +				return $content_type;
    +			}
    +		}
    +
    +		return 'text/html';
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Get Header
    +	 *
    +	 * @param	string	$header_name
    +	 * @return	string
    +	 */
    +	public function get_header($header)
    +	{
    +		// Combine headers already sent with our batched headers
    +		$headers = array_merge(
    +			// We only need [x][0] from our multi-dimensional array
    +			array_map('array_shift', $this->headers),
    +			headers_list()
    +		);
    +
    +		if (empty($headers) OR empty($header))
    +		{
    +			return NULL;
    +		}
    +
    +		for ($i = 0, $c = count($headers); $i < $c; $i++)
    +		{
    +			if (strncasecmp($header, $headers[$i], $l = strlen($header)) === 0)
    +			{
    +				return trim(substr($headers[$i], $l+1));
    +			}
    +		}
    +
    +		return NULL;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Set HTTP Status Header
    +	 *
    +	 * As of version 1.7.2, this is an alias for common function
    +	 * set_status_header().
    +	 *
    +	 * @param	int	$code	Status code (default: 200)
    +	 * @param	string	$text	Optional message
    +	 * @return	CI_Output
    +	 */
    +	public function set_status_header($code = 200, $text = '')
    +	{
    +		set_status_header($code, $text);
    +		return $this;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Enable/disable Profiler
    +	 *
    +	 * @param	bool	$val	TRUE to enable or FALSE to disable
    +	 * @return	CI_Output
    +	 */
    +	public 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.
    +	 *
    +	 * @param	array	$sections	Profiler sections
    +	 * @return	CI_Output
    +	 */
    +	public function set_profiler_sections($sections)
    +	{
    +		if (isset($sections['query_toggle_count']))
    +		{
    +			$this->_profiler_sections['query_toggle_count'] = (int) $sections['query_toggle_count'];
    +			unset($sections['query_toggle_count']);
    +		}
    +
    +		foreach ($sections as $section => $enable)
    +		{
    +			$this->_profiler_sections[$section] = ($enable !== FALSE);
    +		}
    +
    +		return $this;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Set Cache
    +	 *
    +	 * @param	int	$time	Cache expiration time in seconds
    +	 * @return	CI_Output
    +	 */
    +	public function cache($time)
    +	{
    +		$this->cache_expiration = is_numeric($time) ? $time : 0;
    +		return $this;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Display Output
    +	 *
    +	 * Processes sends the sends finalized output data to the browser along
    +	 * with any server headers and profile data. It also stops benchmark
    +	 * timers so the page rendering speed and memory usage can be shown.
    +	 *
    +	 * Note: All "view" data is automatically put into $this->final_output
    +	 *	 by controller class.
    +	 *
    +	 * @uses	CI_Output::$final_output
    +	 * @param	string	$output	Output data override
    +	 * @return	void
    +	 */
    +	public 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;
    +		}
    +
    +		// --------------------------------------------------------------------
    +
    +		// Is minify requested?
    +		if ($CFG->item('minify_output') === TRUE)
    +		{
    +			$output = $this->minify($output, $this->mime_type);
    +		}
    +
    +		// --------------------------------------------------------------------
    +
    +		// 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	= round(memory_get_usage() / 1024 / 1024, 2).'MB';
    +
    +			$output = str_replace(array('{elapsed_time}', '{memory_usage}'), array($elapsed, $memory), $output);
    +		}
    +
    +		// --------------------------------------------------------------------
    +
    +		// Is compression requested?
    +		if ($CFG->item('compress_output') === TRUE && $this->_zlib_oc === FALSE
    +			&& extension_loaded('zlib')
    +			&& isset($_SERVER['HTTP_ACCEPT_ENCODING']) && 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;
    +		}
    +
    +		// --------------------------------------------------------------------
    +
    +		// 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  and  tags
    +			// we will remove them and add them back after we insert the profile data
    +			$output = preg_replace('|.*?|is', '', $output, -1, $count).$CI->profiler->run();
    +			if ($count > 0)
    +			{
    +				$output .= '';
    +			}
    +		}
    +
    +		// 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 Cache
    +	 *
    +	 * @param	string	$output	Output data to cache
    +	 * @return	void
    +	 */
    +	public 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);
    +
    +		// Send HTTP cache-control headers to browser to match file cache settings.
    +		$this->set_cache_header($_SERVER['REQUEST_TIME'], $expire);
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Update/serve cached output
    +	 *
    +	 * @uses	CI_Config
    +	 * @uses	CI_URI
    +	 *
    +	 * @param	object	&$CFG	CI_Config class instance
    +	 * @param	object	&$URI	CI_URI class instance
    +	 * @return	bool	TRUE on success or FALSE on failure
    +	 */
    +	public 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) OR ! $fp = @fopen($filepath, FOPEN_READ))
    +		{
    +			return FALSE;
    +		}
    +
    +		flock($fp, LOCK_SH);
    +
    +		$cache = (filesize($filepath) > 0) ? fread($fp, filesize($filepath)) : '';
    +
    +		flock($fp, LOCK_UN);
    +		fclose($fp);
    +
    +		// Strip out the embedded timestamp
    +		if ( ! preg_match('/^(\d+)TS--->/', $cache, $match))
    +		{
    +			return FALSE;
    +		}
    +
    +		$last_modified = filemtime($cache_path);
    +		$expire = $match[1];
    +
    +		// Has the file expired?
    +		if ($_SERVER['REQUEST_TIME'] >= $expire && is_really_writable($cache_path))
    +		{
    +			// If so we'll delete it.
    +			@unlink($filepath);
    +			log_message('debug', 'Cache file has expired. File deleted.');
    +			return FALSE;
    +		}
    +		else
    +		{
    +			// Or else send the HTTP cache control headers.
    +			$this->set_cache_header($last_modified, $expire);
    +		}
    +
    +		// Display the cache
    +		$this->_display(substr($cache, strlen($match[0])));
    +		log_message('debug', 'Cache file is current. Sending it to browser.');
    +		return TRUE;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Delete cache
    +	 *
    +	 * @param	string	$uri	URI string
    +	 * @return	bool
    +	 */
    +	public function delete_cache($uri = '')
    +	{
    +		$CI =& get_instance();
    +		$cache_path = $CI->config->item('cache_path');
    +		if ($cache_path === '')
    +		{
    +			$cache_path = APPPATH.'cache/';
    +		}
    +
    +		if ( ! is_dir($cache_path))
    +		{
    +			log_message('error', 'Unable to find cache path: '.$cache_path);
    +			return FALSE;
    +		}
    +
    +		if (empty($uri))
    +		{
    +			$uri = $CI->uri->uri_string();
    +		}
    +
    +		$cache_path .= md5($CI->config->item('base_url').$CI->config->item('index_page').$uri);
    +
    +		if ( ! @unlink($cache_path))
    +		{
    +			log_message('error', 'Unable to delete cache file for '.$uri);
    +			return FALSE;
    +		}
    +
    +		return TRUE;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Set Cache Header
    +	 *
    +	 * Set the HTTP headers to match the server-side file cache settings
    +	 * in order to reduce bandwidth.
    +	 *
    +	 * @param	int	$last_modified	Timestamp of when the page was last modified
    +	 * @param	int	$expiration	Timestamp of when should the requested page expire from cache
    +	 * @return	void
    +	 */
    +	public function set_cache_header($last_modified, $expiration)
    +	{
    +		$max_age = $expiration - $_SERVER['REQUEST_TIME'];
    +
    +		if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))
    +		{
    +			$this->set_status_header(304);
    +			exit;
    +		}
    +		else
    +		{
    +			header('Pragma: public');
    +			header('Cache-Control: max-age=' . $max_age . ', public');
    +			header('Expires: '.gmdate('D, d M Y H:i:s', $expiration).' GMT');
    +			header('Last-modified: '.gmdate('D, d M Y H:i:s', $last_modified).' GMT');
    +		}
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Minify
    +	 *
    +	 * Reduce excessive size of HTML/CSS/JavaScript content.
    +	 *
    +	 * @param	string	$output	Output to minify
    +	 * @param	string	$type	Output content MIME type
    +	 * @return	string	Minified output
    +	 */
    +	public function minify($output, $type = 'text/html')
    +	{
    +		switch ($type)
    +		{
    +			case 'text/html':
    +
    +				if (($size_before = strlen($output)) === 0)
    +				{
    +					return '';
    +				}
    +
    +				// Find all the 
    ,,}msU', $output, $textareas_clean);
    +				preg_match_all('{}msU', $output, $javascript_clean);
    +
    +				// Minify the CSS in all the }msU', $output, $style_clean);
    +				foreach ($style_clean[0] as $s)
    +				{
    +					$output = str_replace($s, $this->_minify_script_style($s, TRUE), $output);
    +				}
    +
    +				// Minify the javascript in }msU', $output, $javascript_messed);
    +					$output = str_replace($javascript_messed[0], $javascript_mini, $output);
    +				}
    +
    +				$size_removed = $size_before - strlen($output);
    +				$savings_percent = round(($size_removed / $size_before * 100));
    +
    +				log_message('debug', 'Minifier shaved '.($size_removed / 1000).'KB ('.$savings_percent.'%) off final HTML output.');
    +
    +			break;
    +
    +			case 'text/css':
    +			case 'text/javascript':
    +
    +				$output = $this->_minify_script_style($output);
    +
    +			break;
    +
    +			default: break;
    +		}
    +
    +		return $output;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Minify Style and Script
    +	 *
    +	 * Reduce excessive size of CSS/JavaScript content.  To remove spaces this
    +	 * script walks the string as an array and determines if the pointer is inside
    +	 * a string created by single quotes or double quotes.  spaces inside those
    +	 * strings are not stripped.  Opening and closing tags are severed from
    +	 * the string initially and saved without stripping whitespace to preserve
    +	 * the tags and any associated properties if tags are present
    +	 *
    +	 * Minification logic/workflow is similar to methods used by Douglas Crockford
    +	 * in JSMIN. http://www.crockford.com/javascript/jsmin.html
    +	 *
    +	 * KNOWN ISSUE: ending a line with a closing parenthesis ')' and no semicolon
    +	 * where there should be one will break the Javascript. New lines after a
    +	 * closing parenthesis are not recognized by the script. For best results
    +	 * be sure to terminate lines with a semicolon when appropriate.
    +	 *
    +	 * @param	string	$output		Output to minify
    +	 * @param	bool	$has_tags	Specify if the output has style or script tags
    +	 * @return	string	Minified output
    +	 */
    +	protected function _minify_script_style($output, $has_tags = FALSE)
    +	{
    +		// We only need this if there are tags in the file
    +		if ($has_tags === TRUE)
    +		{
    +			// Remove opening tag and save for later
    +			$pos = strpos($output, '>') + 1;
    +			$open_tag = substr($output, 0, $pos);
    +			$output = substr_replace($output, '', 0, $pos);
    +
    +			// Remove closing tag and save it for later
    +			$end_pos = strlen($output);
    +			$pos = strpos($output, ' $value)
    +		{
    +			if ($in_string === FALSE && $in_dstring === FALSE)
    +			{
    +				if ($value === ' ')
    +				{
    +					// Get the next element in the array for comparisons
    +					$next = $array_output[$key + 1];
    +
    +					// Strip spaces preceded/followed by a non-ASCII character
    +					// or not preceded/followed by an alphanumeric
    +					// or not preceded/followed \ $ and _
    +					if ((preg_match('/^[\x20-\x7f]*$/D', $next) OR preg_match('/^[\x20-\x7f]*$/D', $prev))
    +						&& ( ! ctype_alnum($next) OR ! ctype_alnum($prev))
    +						&& ! in_array($next, array('\\', '_', '$'), TRUE)
    +						&& ! in_array($prev, array('\\', '_', '$'), TRUE)
    +					)
    +					{
    +						unset($array_output[$key]);
    +					}
    +				}
    +				else
    +				{
    +					// Save this value as previous for the next iteration
    +					// if it is not a blank space
    +					$prev = $value;
    +				}
    +			}
    +
    +			if ($value === "'")
    +			{
    +				$in_string = ! $in_string;
    +			}
    +			elseif ($value === '"')
    +			{
    +				$in_dstring = ! $in_dstring;
    +			}
    +		}
    +
    +		// Put the string back together after spaces have been stripped
    +		$output = implode($array_output);
    +
    +		// Remove new line characters unless previous or next character is
    +		// printable or Non-ASCII
    +		preg_match_all('/[\n]/', $output, $lf, PREG_OFFSET_CAPTURE);
    +		$removed_lf = 0;
    +		foreach ($lf as $feed_position)
    +		{
    +			foreach ($feed_position as $position)
    +			{
    +				$position = $position[1] - $removed_lf;
    +				$next = $output[$position + 1];
    +				$prev = $output[$position - 1];
    +				if ( ! ctype_print($next) && ! ctype_print($prev)
    +					&& ! preg_match('/^[\x20-\x7f]*$/D', $next)
    +					&& ! preg_match('/^[\x20-\x7f]*$/D', $prev)
    +				)
    +				{
    +					$output = substr_replace($output, '', $position, 1);
    +					$removed_lf++;
    +				}
    +			}
    +		}
    +
    +		// Put the opening and closing tags back if applicable
    +		return isset($open_tag)
    +			? $open_tag.$output.$closing_tag
    +			: $output;
    +	}
    +
    +}
    +
    +/* End of file Output.php */
     /* Location: ./system/core/Output.php */
    \ No newline at end of file
    
    From 362b80054ed80940064fd7891a9628279498504b Mon Sep 17 00:00:00 2001
    From: Michael Dodge 
    Date: Fri, 4 Jan 2013 23:18:39 -0700
    Subject: [PATCH 2027/5397] Revert "Fix MSIE conditionals regex in minify
     output func"
    
    This reverts commit 8e12c787042396e172a7448c65bd16c3015ffb0f.
    ---
     system/core/Output.php | 1842 ++++++++++++++++++++--------------------
     1 file changed, 921 insertions(+), 921 deletions(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index b452639425a..ce0500e7107 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -1,922 +1,922 @@
    -_zlib_oc = (bool) @ini_get('zlib.output_compression');
    -
    -		// Get mime types for later
    -		$this->mimes =& get_mimes();
    -
    -		log_message('debug', 'Output Class Initialized');
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Get Output
    -	 *
    -	 * Returns the current output string.
    -	 *
    -	 * @return	string
    -	 */
    -	public function get_output()
    -	{
    -		return $this->final_output;
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Set Output
    -	 *
    -	 * Sets the output string.
    -	 *
    -	 * @param	string	$output	Output data
    -	 * @return	CI_Output
    -	 */
    -	public function set_output($output)
    -	{
    -		$this->final_output = $output;
    -		return $this;
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Append Output
    -	 *
    -	 * Appends data onto the output string.
    -	 *
    -	 * @param	string	$output	Data to append
    -	 * @return	CI_Output
    -	 */
    -	public function append_output($output)
    -	{
    -		if (empty($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 sent with the final output.
    -	 *
    -	 * Note: If a file is cached, headers will not be sent.
    -	 * @todo	We need to figure out how to permit headers to be cached.
    -	 *
    -	 * @param	string	$header		Header
    -	 * @param	bool	$replace	Whether to replace the old header value, if already set
    -	 * @return	CI_Output
    -	 */
    -	public 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;
    -		}
    -
    -		$this->headers[] = array($header, $replace);
    -		return $this;
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Set Content-Type Header
    -	 *
    -	 * @param	string	$mime_type	Extension of the file we're outputting
    -	 * @param	string	$charset	Character set (default: NULL)
    -	 * @return	CI_Output
    -	 */
    -	public function set_content_type($mime_type, $charset = NULL)
    -	{
    -		if (strpos($mime_type, '/') === FALSE)
    -		{
    -			$extension = ltrim($mime_type, '.');
    -
    -			// Is this extension supported?
    -			if (isset($this->mimes[$extension]))
    -			{
    -				$mime_type =& $this->mimes[$extension];
    -
    -				if (is_array($mime_type))
    -				{
    -					$mime_type = current($mime_type);
    -				}
    -			}
    -		}
    -
    -		$this->mime_type = $mime_type;
    -
    -		if (empty($charset))
    -		{
    -			$charset = config_item('charset');
    -		}
    -
    -		$header = 'Content-Type: '.$mime_type
    -			.(empty($charset) ? NULL : '; charset='.$charset);
    -
    -		$this->headers[] = array($header, TRUE);
    -		return $this;
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Get Current Content-Type Header
    -	 *
    -	 * @return	string	'text/html', if not already set
    -	 */
    -	public function get_content_type()
    -	{
    -		for ($i = 0, $c = count($this->headers); $i < $c; $i++)
    -		{
    -			if (sscanf($this->headers[$i][0], 'Content-Type: %[^;]', $content_type) === 1)
    -			{
    -				return $content_type;
    -			}
    -		}
    -
    -		return 'text/html';
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Get Header
    -	 *
    -	 * @param	string	$header_name
    -	 * @return	string
    -	 */
    -	public function get_header($header)
    -	{
    -		// Combine headers already sent with our batched headers
    -		$headers = array_merge(
    -			// We only need [x][0] from our multi-dimensional array
    -			array_map('array_shift', $this->headers),
    -			headers_list()
    -		);
    -
    -		if (empty($headers) OR empty($header))
    -		{
    -			return NULL;
    -		}
    -
    -		for ($i = 0, $c = count($headers); $i < $c; $i++)
    -		{
    -			if (strncasecmp($header, $headers[$i], $l = strlen($header)) === 0)
    -			{
    -				return trim(substr($headers[$i], $l+1));
    -			}
    -		}
    -
    -		return NULL;
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Set HTTP Status Header
    -	 *
    -	 * As of version 1.7.2, this is an alias for common function
    -	 * set_status_header().
    -	 *
    -	 * @param	int	$code	Status code (default: 200)
    -	 * @param	string	$text	Optional message
    -	 * @return	CI_Output
    -	 */
    -	public function set_status_header($code = 200, $text = '')
    -	{
    -		set_status_header($code, $text);
    -		return $this;
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Enable/disable Profiler
    -	 *
    -	 * @param	bool	$val	TRUE to enable or FALSE to disable
    -	 * @return	CI_Output
    -	 */
    -	public 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.
    -	 *
    -	 * @param	array	$sections	Profiler sections
    -	 * @return	CI_Output
    -	 */
    -	public function set_profiler_sections($sections)
    -	{
    -		if (isset($sections['query_toggle_count']))
    -		{
    -			$this->_profiler_sections['query_toggle_count'] = (int) $sections['query_toggle_count'];
    -			unset($sections['query_toggle_count']);
    -		}
    -
    -		foreach ($sections as $section => $enable)
    -		{
    -			$this->_profiler_sections[$section] = ($enable !== FALSE);
    -		}
    -
    -		return $this;
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Set Cache
    -	 *
    -	 * @param	int	$time	Cache expiration time in seconds
    -	 * @return	CI_Output
    -	 */
    -	public function cache($time)
    -	{
    -		$this->cache_expiration = is_numeric($time) ? $time : 0;
    -		return $this;
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Display Output
    -	 *
    -	 * Processes sends the sends finalized output data to the browser along
    -	 * with any server headers and profile data. It also stops benchmark
    -	 * timers so the page rendering speed and memory usage can be shown.
    -	 *
    -	 * Note: All "view" data is automatically put into $this->final_output
    -	 *	 by controller class.
    -	 *
    -	 * @uses	CI_Output::$final_output
    -	 * @param	string	$output	Output data override
    -	 * @return	void
    -	 */
    -	public 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;
    -		}
    -
    -		// --------------------------------------------------------------------
    -
    -		// Is minify requested?
    -		if ($CFG->item('minify_output') === TRUE)
    -		{
    -			$output = $this->minify($output, $this->mime_type);
    -		}
    -
    -		// --------------------------------------------------------------------
    -
    -		// 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	= round(memory_get_usage() / 1024 / 1024, 2).'MB';
    -
    -			$output = str_replace(array('{elapsed_time}', '{memory_usage}'), array($elapsed, $memory), $output);
    -		}
    -
    -		// --------------------------------------------------------------------
    -
    -		// Is compression requested?
    -		if ($CFG->item('compress_output') === TRUE && $this->_zlib_oc === FALSE
    -			&& extension_loaded('zlib')
    -			&& isset($_SERVER['HTTP_ACCEPT_ENCODING']) && 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;
    -		}
    -
    -		// --------------------------------------------------------------------
    -
    -		// 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  and  tags
    -			// we will remove them and add them back after we insert the profile data
    -			$output = preg_replace('|.*?|is', '', $output, -1, $count).$CI->profiler->run();
    -			if ($count > 0)
    -			{
    -				$output .= '';
    -			}
    -		}
    -
    -		// 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 Cache
    -	 *
    -	 * @param	string	$output	Output data to cache
    -	 * @return	void
    -	 */
    -	public 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);
    -
    -		// Send HTTP cache-control headers to browser to match file cache settings.
    -		$this->set_cache_header($_SERVER['REQUEST_TIME'], $expire);
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Update/serve cached output
    -	 *
    -	 * @uses	CI_Config
    -	 * @uses	CI_URI
    -	 *
    -	 * @param	object	&$CFG	CI_Config class instance
    -	 * @param	object	&$URI	CI_URI class instance
    -	 * @return	bool	TRUE on success or FALSE on failure
    -	 */
    -	public 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) OR ! $fp = @fopen($filepath, FOPEN_READ))
    -		{
    -			return FALSE;
    -		}
    -
    -		flock($fp, LOCK_SH);
    -
    -		$cache = (filesize($filepath) > 0) ? fread($fp, filesize($filepath)) : '';
    -
    -		flock($fp, LOCK_UN);
    -		fclose($fp);
    -
    -		// Strip out the embedded timestamp
    -		if ( ! preg_match('/^(\d+)TS--->/', $cache, $match))
    -		{
    -			return FALSE;
    -		}
    -
    -		$last_modified = filemtime($cache_path);
    -		$expire = $match[1];
    -
    -		// Has the file expired?
    -		if ($_SERVER['REQUEST_TIME'] >= $expire && is_really_writable($cache_path))
    -		{
    -			// If so we'll delete it.
    -			@unlink($filepath);
    -			log_message('debug', 'Cache file has expired. File deleted.');
    -			return FALSE;
    -		}
    -		else
    -		{
    -			// Or else send the HTTP cache control headers.
    -			$this->set_cache_header($last_modified, $expire);
    -		}
    -
    -		// Display the cache
    -		$this->_display(substr($cache, strlen($match[0])));
    -		log_message('debug', 'Cache file is current. Sending it to browser.');
    -		return TRUE;
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Delete cache
    -	 *
    -	 * @param	string	$uri	URI string
    -	 * @return	bool
    -	 */
    -	public function delete_cache($uri = '')
    -	{
    -		$CI =& get_instance();
    -		$cache_path = $CI->config->item('cache_path');
    -		if ($cache_path === '')
    -		{
    -			$cache_path = APPPATH.'cache/';
    -		}
    -
    -		if ( ! is_dir($cache_path))
    -		{
    -			log_message('error', 'Unable to find cache path: '.$cache_path);
    -			return FALSE;
    -		}
    -
    -		if (empty($uri))
    -		{
    -			$uri = $CI->uri->uri_string();
    -		}
    -
    -		$cache_path .= md5($CI->config->item('base_url').$CI->config->item('index_page').$uri);
    -
    -		if ( ! @unlink($cache_path))
    -		{
    -			log_message('error', 'Unable to delete cache file for '.$uri);
    -			return FALSE;
    -		}
    -
    -		return TRUE;
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Set Cache Header
    -	 *
    -	 * Set the HTTP headers to match the server-side file cache settings
    -	 * in order to reduce bandwidth.
    -	 *
    -	 * @param	int	$last_modified	Timestamp of when the page was last modified
    -	 * @param	int	$expiration	Timestamp of when should the requested page expire from cache
    -	 * @return	void
    -	 */
    -	public function set_cache_header($last_modified, $expiration)
    -	{
    -		$max_age = $expiration - $_SERVER['REQUEST_TIME'];
    -
    -		if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))
    -		{
    -			$this->set_status_header(304);
    -			exit;
    -		}
    -		else
    -		{
    -			header('Pragma: public');
    -			header('Cache-Control: max-age=' . $max_age . ', public');
    -			header('Expires: '.gmdate('D, d M Y H:i:s', $expiration).' GMT');
    -			header('Last-modified: '.gmdate('D, d M Y H:i:s', $last_modified).' GMT');
    -		}
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Minify
    -	 *
    -	 * Reduce excessive size of HTML/CSS/JavaScript content.
    -	 *
    -	 * @param	string	$output	Output to minify
    -	 * @param	string	$type	Output content MIME type
    -	 * @return	string	Minified output
    -	 */
    -	public function minify($output, $type = 'text/html')
    -	{
    -		switch ($type)
    -		{
    -			case 'text/html':
    -
    -				if (($size_before = strlen($output)) === 0)
    -				{
    -					return '';
    -				}
    -
    -				// Find all the 
    ,,}msU', $output, $textareas_clean);
    -				preg_match_all('{}msU', $output, $javascript_clean);
    -
    -				// Minify the CSS in all the }msU', $output, $style_clean);
    -				foreach ($style_clean[0] as $s)
    -				{
    -					$output = str_replace($s, $this->_minify_script_style($s, TRUE), $output);
    -				}
    -
    -				// Minify the javascript in }msU', $output, $javascript_messed);
    -					$output = str_replace($javascript_messed[0], $javascript_mini, $output);
    -				}
    -
    -				$size_removed = $size_before - strlen($output);
    -				$savings_percent = round(($size_removed / $size_before * 100));
    -
    -				log_message('debug', 'Minifier shaved '.($size_removed / 1000).'KB ('.$savings_percent.'%) off final HTML output.');
    -
    -			break;
    -
    -			case 'text/css':
    -			case 'text/javascript':
    -
    -				$output = $this->_minify_script_style($output);
    -
    -			break;
    -
    -			default: break;
    -		}
    -
    -		return $output;
    -	}
    -
    -	// --------------------------------------------------------------------
    -
    -	/**
    -	 * Minify Style and Script
    -	 *
    -	 * Reduce excessive size of CSS/JavaScript content.  To remove spaces this
    -	 * script walks the string as an array and determines if the pointer is inside
    -	 * a string created by single quotes or double quotes.  spaces inside those
    -	 * strings are not stripped.  Opening and closing tags are severed from
    -	 * the string initially and saved without stripping whitespace to preserve
    -	 * the tags and any associated properties if tags are present
    -	 *
    -	 * Minification logic/workflow is similar to methods used by Douglas Crockford
    -	 * in JSMIN. http://www.crockford.com/javascript/jsmin.html
    -	 *
    -	 * KNOWN ISSUE: ending a line with a closing parenthesis ')' and no semicolon
    -	 * where there should be one will break the Javascript. New lines after a
    -	 * closing parenthesis are not recognized by the script. For best results
    -	 * be sure to terminate lines with a semicolon when appropriate.
    -	 *
    -	 * @param	string	$output		Output to minify
    -	 * @param	bool	$has_tags	Specify if the output has style or script tags
    -	 * @return	string	Minified output
    -	 */
    -	protected function _minify_script_style($output, $has_tags = FALSE)
    -	{
    -		// We only need this if there are tags in the file
    -		if ($has_tags === TRUE)
    -		{
    -			// Remove opening tag and save for later
    -			$pos = strpos($output, '>') + 1;
    -			$open_tag = substr($output, 0, $pos);
    -			$output = substr_replace($output, '', 0, $pos);
    -
    -			// Remove closing tag and save it for later
    -			$end_pos = strlen($output);
    -			$pos = strpos($output, ' $value)
    -		{
    -			if ($in_string === FALSE && $in_dstring === FALSE)
    -			{
    -				if ($value === ' ')
    -				{
    -					// Get the next element in the array for comparisons
    -					$next = $array_output[$key + 1];
    -
    -					// Strip spaces preceded/followed by a non-ASCII character
    -					// or not preceded/followed by an alphanumeric
    -					// or not preceded/followed \ $ and _
    -					if ((preg_match('/^[\x20-\x7f]*$/D', $next) OR preg_match('/^[\x20-\x7f]*$/D', $prev))
    -						&& ( ! ctype_alnum($next) OR ! ctype_alnum($prev))
    -						&& ! in_array($next, array('\\', '_', '$'), TRUE)
    -						&& ! in_array($prev, array('\\', '_', '$'), TRUE)
    -					)
    -					{
    -						unset($array_output[$key]);
    -					}
    -				}
    -				else
    -				{
    -					// Save this value as previous for the next iteration
    -					// if it is not a blank space
    -					$prev = $value;
    -				}
    -			}
    -
    -			if ($value === "'")
    -			{
    -				$in_string = ! $in_string;
    -			}
    -			elseif ($value === '"')
    -			{
    -				$in_dstring = ! $in_dstring;
    -			}
    -		}
    -
    -		// Put the string back together after spaces have been stripped
    -		$output = implode($array_output);
    -
    -		// Remove new line characters unless previous or next character is
    -		// printable or Non-ASCII
    -		preg_match_all('/[\n]/', $output, $lf, PREG_OFFSET_CAPTURE);
    -		$removed_lf = 0;
    -		foreach ($lf as $feed_position)
    -		{
    -			foreach ($feed_position as $position)
    -			{
    -				$position = $position[1] - $removed_lf;
    -				$next = $output[$position + 1];
    -				$prev = $output[$position - 1];
    -				if ( ! ctype_print($next) && ! ctype_print($prev)
    -					&& ! preg_match('/^[\x20-\x7f]*$/D', $next)
    -					&& ! preg_match('/^[\x20-\x7f]*$/D', $prev)
    -				)
    -				{
    -					$output = substr_replace($output, '', $position, 1);
    -					$removed_lf++;
    -				}
    -			}
    -		}
    -
    -		// Put the opening and closing tags back if applicable
    -		return isset($open_tag)
    -			? $open_tag.$output.$closing_tag
    -			: $output;
    -	}
    -
    -}
    -
    -/* End of file Output.php */
    +_zlib_oc = (bool) @ini_get('zlib.output_compression');
    +
    +		// Get mime types for later
    +		$this->mimes =& get_mimes();
    +
    +		log_message('debug', 'Output Class Initialized');
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Get Output
    +	 *
    +	 * Returns the current output string.
    +	 *
    +	 * @return	string
    +	 */
    +	public function get_output()
    +	{
    +		return $this->final_output;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Set Output
    +	 *
    +	 * Sets the output string.
    +	 *
    +	 * @param	string	$output	Output data
    +	 * @return	CI_Output
    +	 */
    +	public function set_output($output)
    +	{
    +		$this->final_output = $output;
    +		return $this;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Append Output
    +	 *
    +	 * Appends data onto the output string.
    +	 *
    +	 * @param	string	$output	Data to append
    +	 * @return	CI_Output
    +	 */
    +	public function append_output($output)
    +	{
    +		if (empty($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 sent with the final output.
    +	 *
    +	 * Note: If a file is cached, headers will not be sent.
    +	 * @todo	We need to figure out how to permit headers to be cached.
    +	 *
    +	 * @param	string	$header		Header
    +	 * @param	bool	$replace	Whether to replace the old header value, if already set
    +	 * @return	CI_Output
    +	 */
    +	public 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;
    +		}
    +
    +		$this->headers[] = array($header, $replace);
    +		return $this;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Set Content-Type Header
    +	 *
    +	 * @param	string	$mime_type	Extension of the file we're outputting
    +	 * @param	string	$charset	Character set (default: NULL)
    +	 * @return	CI_Output
    +	 */
    +	public function set_content_type($mime_type, $charset = NULL)
    +	{
    +		if (strpos($mime_type, '/') === FALSE)
    +		{
    +			$extension = ltrim($mime_type, '.');
    +
    +			// Is this extension supported?
    +			if (isset($this->mimes[$extension]))
    +			{
    +				$mime_type =& $this->mimes[$extension];
    +
    +				if (is_array($mime_type))
    +				{
    +					$mime_type = current($mime_type);
    +				}
    +			}
    +		}
    +
    +		$this->mime_type = $mime_type;
    +
    +		if (empty($charset))
    +		{
    +			$charset = config_item('charset');
    +		}
    +
    +		$header = 'Content-Type: '.$mime_type
    +			.(empty($charset) ? NULL : '; charset='.$charset);
    +
    +		$this->headers[] = array($header, TRUE);
    +		return $this;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Get Current Content-Type Header
    +	 *
    +	 * @return	string	'text/html', if not already set
    +	 */
    +	public function get_content_type()
    +	{
    +		for ($i = 0, $c = count($this->headers); $i < $c; $i++)
    +		{
    +			if (sscanf($this->headers[$i][0], 'Content-Type: %[^;]', $content_type) === 1)
    +			{
    +				return $content_type;
    +			}
    +		}
    +
    +		return 'text/html';
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Get Header
    +	 *
    +	 * @param	string	$header_name
    +	 * @return	string
    +	 */
    +	public function get_header($header)
    +	{
    +		// Combine headers already sent with our batched headers
    +		$headers = array_merge(
    +			// We only need [x][0] from our multi-dimensional array
    +			array_map('array_shift', $this->headers),
    +			headers_list()
    +		);
    +
    +		if (empty($headers) OR empty($header))
    +		{
    +			return NULL;
    +		}
    +
    +		for ($i = 0, $c = count($headers); $i < $c; $i++)
    +		{
    +			if (strncasecmp($header, $headers[$i], $l = strlen($header)) === 0)
    +			{
    +				return trim(substr($headers[$i], $l+1));
    +			}
    +		}
    +
    +		return NULL;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Set HTTP Status Header
    +	 *
    +	 * As of version 1.7.2, this is an alias for common function
    +	 * set_status_header().
    +	 *
    +	 * @param	int	$code	Status code (default: 200)
    +	 * @param	string	$text	Optional message
    +	 * @return	CI_Output
    +	 */
    +	public function set_status_header($code = 200, $text = '')
    +	{
    +		set_status_header($code, $text);
    +		return $this;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Enable/disable Profiler
    +	 *
    +	 * @param	bool	$val	TRUE to enable or FALSE to disable
    +	 * @return	CI_Output
    +	 */
    +	public 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.
    +	 *
    +	 * @param	array	$sections	Profiler sections
    +	 * @return	CI_Output
    +	 */
    +	public function set_profiler_sections($sections)
    +	{
    +		if (isset($sections['query_toggle_count']))
    +		{
    +			$this->_profiler_sections['query_toggle_count'] = (int) $sections['query_toggle_count'];
    +			unset($sections['query_toggle_count']);
    +		}
    +
    +		foreach ($sections as $section => $enable)
    +		{
    +			$this->_profiler_sections[$section] = ($enable !== FALSE);
    +		}
    +
    +		return $this;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Set Cache
    +	 *
    +	 * @param	int	$time	Cache expiration time in seconds
    +	 * @return	CI_Output
    +	 */
    +	public function cache($time)
    +	{
    +		$this->cache_expiration = is_numeric($time) ? $time : 0;
    +		return $this;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Display Output
    +	 *
    +	 * Processes sends the sends finalized output data to the browser along
    +	 * with any server headers and profile data. It also stops benchmark
    +	 * timers so the page rendering speed and memory usage can be shown.
    +	 *
    +	 * Note: All "view" data is automatically put into $this->final_output
    +	 *	 by controller class.
    +	 *
    +	 * @uses	CI_Output::$final_output
    +	 * @param	string	$output	Output data override
    +	 * @return	void
    +	 */
    +	public 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;
    +		}
    +
    +		// --------------------------------------------------------------------
    +
    +		// Is minify requested?
    +		if ($CFG->item('minify_output') === TRUE)
    +		{
    +			$output = $this->minify($output, $this->mime_type);
    +		}
    +
    +		// --------------------------------------------------------------------
    +
    +		// 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	= round(memory_get_usage() / 1024 / 1024, 2).'MB';
    +
    +			$output = str_replace(array('{elapsed_time}', '{memory_usage}'), array($elapsed, $memory), $output);
    +		}
    +
    +		// --------------------------------------------------------------------
    +
    +		// Is compression requested?
    +		if ($CFG->item('compress_output') === TRUE && $this->_zlib_oc === FALSE
    +			&& extension_loaded('zlib')
    +			&& isset($_SERVER['HTTP_ACCEPT_ENCODING']) && 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;
    +		}
    +
    +		// --------------------------------------------------------------------
    +
    +		// 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  and  tags
    +			// we will remove them and add them back after we insert the profile data
    +			$output = preg_replace('|.*?|is', '', $output, -1, $count).$CI->profiler->run();
    +			if ($count > 0)
    +			{
    +				$output .= '';
    +			}
    +		}
    +
    +		// 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 Cache
    +	 *
    +	 * @param	string	$output	Output data to cache
    +	 * @return	void
    +	 */
    +	public 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);
    +
    +		// Send HTTP cache-control headers to browser to match file cache settings.
    +		$this->set_cache_header($_SERVER['REQUEST_TIME'], $expire);
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Update/serve cached output
    +	 *
    +	 * @uses	CI_Config
    +	 * @uses	CI_URI
    +	 *
    +	 * @param	object	&$CFG	CI_Config class instance
    +	 * @param	object	&$URI	CI_URI class instance
    +	 * @return	bool	TRUE on success or FALSE on failure
    +	 */
    +	public 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) OR ! $fp = @fopen($filepath, FOPEN_READ))
    +		{
    +			return FALSE;
    +		}
    +
    +		flock($fp, LOCK_SH);
    +
    +		$cache = (filesize($filepath) > 0) ? fread($fp, filesize($filepath)) : '';
    +
    +		flock($fp, LOCK_UN);
    +		fclose($fp);
    +
    +		// Strip out the embedded timestamp
    +		if ( ! preg_match('/^(\d+)TS--->/', $cache, $match))
    +		{
    +			return FALSE;
    +		}
    +
    +		$last_modified = filemtime($cache_path);
    +		$expire = $match[1];
    +
    +		// Has the file expired?
    +		if ($_SERVER['REQUEST_TIME'] >= $expire && is_really_writable($cache_path))
    +		{
    +			// If so we'll delete it.
    +			@unlink($filepath);
    +			log_message('debug', 'Cache file has expired. File deleted.');
    +			return FALSE;
    +		}
    +		else
    +		{
    +			// Or else send the HTTP cache control headers.
    +			$this->set_cache_header($last_modified, $expire);
    +		}
    +
    +		// Display the cache
    +		$this->_display(substr($cache, strlen($match[0])));
    +		log_message('debug', 'Cache file is current. Sending it to browser.');
    +		return TRUE;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Delete cache
    +	 *
    +	 * @param	string	$uri	URI string
    +	 * @return	bool
    +	 */
    +	public function delete_cache($uri = '')
    +	{
    +		$CI =& get_instance();
    +		$cache_path = $CI->config->item('cache_path');
    +		if ($cache_path === '')
    +		{
    +			$cache_path = APPPATH.'cache/';
    +		}
    +
    +		if ( ! is_dir($cache_path))
    +		{
    +			log_message('error', 'Unable to find cache path: '.$cache_path);
    +			return FALSE;
    +		}
    +
    +		if (empty($uri))
    +		{
    +			$uri = $CI->uri->uri_string();
    +		}
    +
    +		$cache_path .= md5($CI->config->item('base_url').$CI->config->item('index_page').$uri);
    +
    +		if ( ! @unlink($cache_path))
    +		{
    +			log_message('error', 'Unable to delete cache file for '.$uri);
    +			return FALSE;
    +		}
    +
    +		return TRUE;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Set Cache Header
    +	 *
    +	 * Set the HTTP headers to match the server-side file cache settings
    +	 * in order to reduce bandwidth.
    +	 *
    +	 * @param	int	$last_modified	Timestamp of when the page was last modified
    +	 * @param	int	$expiration	Timestamp of when should the requested page expire from cache
    +	 * @return	void
    +	 */
    +	public function set_cache_header($last_modified, $expiration)
    +	{
    +		$max_age = $expiration - $_SERVER['REQUEST_TIME'];
    +
    +		if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))
    +		{
    +			$this->set_status_header(304);
    +			exit;
    +		}
    +		else
    +		{
    +			header('Pragma: public');
    +			header('Cache-Control: max-age=' . $max_age . ', public');
    +			header('Expires: '.gmdate('D, d M Y H:i:s', $expiration).' GMT');
    +			header('Last-modified: '.gmdate('D, d M Y H:i:s', $last_modified).' GMT');
    +		}
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Minify
    +	 *
    +	 * Reduce excessive size of HTML/CSS/JavaScript content.
    +	 *
    +	 * @param	string	$output	Output to minify
    +	 * @param	string	$type	Output content MIME type
    +	 * @return	string	Minified output
    +	 */
    +	public function minify($output, $type = 'text/html')
    +	{
    +		switch ($type)
    +		{
    +			case 'text/html':
    +
    +				if (($size_before = strlen($output)) === 0)
    +				{
    +					return '';
    +				}
    +
    +				// Find all the 
    ,,}msU', $output, $textareas_clean);
    +				preg_match_all('{}msU', $output, $javascript_clean);
    +
    +				// Minify the CSS in all the }msU', $output, $style_clean);
    +				foreach ($style_clean[0] as $s)
    +				{
    +					$output = str_replace($s, $this->_minify_script_style($s, TRUE), $output);
    +				}
    +
    +				// Minify the javascript in }msU', $output, $javascript_messed);
    +					$output = str_replace($javascript_messed[0], $javascript_mini, $output);
    +				}
    +
    +				$size_removed = $size_before - strlen($output);
    +				$savings_percent = round(($size_removed / $size_before * 100));
    +
    +				log_message('debug', 'Minifier shaved '.($size_removed / 1000).'KB ('.$savings_percent.'%) off final HTML output.');
    +
    +			break;
    +
    +			case 'text/css':
    +			case 'text/javascript':
    +
    +				$output = $this->_minify_script_style($output);
    +
    +			break;
    +
    +			default: break;
    +		}
    +
    +		return $output;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
    +	/**
    +	 * Minify Style and Script
    +	 *
    +	 * Reduce excessive size of CSS/JavaScript content.  To remove spaces this
    +	 * script walks the string as an array and determines if the pointer is inside
    +	 * a string created by single quotes or double quotes.  spaces inside those
    +	 * strings are not stripped.  Opening and closing tags are severed from
    +	 * the string initially and saved without stripping whitespace to preserve
    +	 * the tags and any associated properties if tags are present
    +	 *
    +	 * Minification logic/workflow is similar to methods used by Douglas Crockford
    +	 * in JSMIN. http://www.crockford.com/javascript/jsmin.html
    +	 *
    +	 * KNOWN ISSUE: ending a line with a closing parenthesis ')' and no semicolon
    +	 * where there should be one will break the Javascript. New lines after a
    +	 * closing parenthesis are not recognized by the script. For best results
    +	 * be sure to terminate lines with a semicolon when appropriate.
    +	 *
    +	 * @param	string	$output		Output to minify
    +	 * @param	bool	$has_tags	Specify if the output has style or script tags
    +	 * @return	string	Minified output
    +	 */
    +	protected function _minify_script_style($output, $has_tags = FALSE)
    +	{
    +		// We only need this if there are tags in the file
    +		if ($has_tags === TRUE)
    +		{
    +			// Remove opening tag and save for later
    +			$pos = strpos($output, '>') + 1;
    +			$open_tag = substr($output, 0, $pos);
    +			$output = substr_replace($output, '', 0, $pos);
    +
    +			// Remove closing tag and save it for later
    +			$end_pos = strlen($output);
    +			$pos = strpos($output, ' $value)
    +		{
    +			if ($in_string === FALSE && $in_dstring === FALSE)
    +			{
    +				if ($value === ' ')
    +				{
    +					// Get the next element in the array for comparisons
    +					$next = $array_output[$key + 1];
    +
    +					// Strip spaces preceded/followed by a non-ASCII character
    +					// or not preceded/followed by an alphanumeric
    +					// or not preceded/followed \ $ and _
    +					if ((preg_match('/^[\x20-\x7f]*$/D', $next) OR preg_match('/^[\x20-\x7f]*$/D', $prev))
    +						&& ( ! ctype_alnum($next) OR ! ctype_alnum($prev))
    +						&& ! in_array($next, array('\\', '_', '$'), TRUE)
    +						&& ! in_array($prev, array('\\', '_', '$'), TRUE)
    +					)
    +					{
    +						unset($array_output[$key]);
    +					}
    +				}
    +				else
    +				{
    +					// Save this value as previous for the next iteration
    +					// if it is not a blank space
    +					$prev = $value;
    +				}
    +			}
    +
    +			if ($value === "'")
    +			{
    +				$in_string = ! $in_string;
    +			}
    +			elseif ($value === '"')
    +			{
    +				$in_dstring = ! $in_dstring;
    +			}
    +		}
    +
    +		// Put the string back together after spaces have been stripped
    +		$output = implode($array_output);
    +
    +		// Remove new line characters unless previous or next character is
    +		// printable or Non-ASCII
    +		preg_match_all('/[\n]/', $output, $lf, PREG_OFFSET_CAPTURE);
    +		$removed_lf = 0;
    +		foreach ($lf as $feed_position)
    +		{
    +			foreach ($feed_position as $position)
    +			{
    +				$position = $position[1] - $removed_lf;
    +				$next = $output[$position + 1];
    +				$prev = $output[$position - 1];
    +				if ( ! ctype_print($next) && ! ctype_print($prev)
    +					&& ! preg_match('/^[\x20-\x7f]*$/D', $next)
    +					&& ! preg_match('/^[\x20-\x7f]*$/D', $prev)
    +				)
    +				{
    +					$output = substr_replace($output, '', $position, 1);
    +					$removed_lf++;
    +				}
    +			}
    +		}
    +
    +		// Put the opening and closing tags back if applicable
    +		return isset($open_tag)
    +			? $open_tag.$output.$closing_tag
    +			: $output;
    +	}
    +
    +}
    +
    +/* End of file Output.php */
     /* Location: ./system/core/Output.php */
    \ No newline at end of file
    
    From 4d02e356cadd9af49c915c76b7cd27d01e67edb8 Mon Sep 17 00:00:00 2001
    From: Michael Dodge 
    Date: Fri, 4 Jan 2013 23:22:51 -0700
    Subject: [PATCH 2028/5397] Fix MSIE conditionals regex in minify output
    
    Allows IE conditionals like the following to remain unmodified.
    ```html
      
    ```
    Credit to joebert regex from
    
    http://www.sitepoint.com/forums/showthread.php?696559-Regex-pattern-to-strip-HTML-comments-but-leave-conditonals&s=3eef4ceb0a59b2fdb946fa56220fb6fd&p=4678083&viewfull=1#post4678083
    ---
     system/core/Output.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index ce0500e7107..27e711783c4 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -739,7 +739,7 @@ public function minify($output, $type = 'text/html')
     				$output = preg_replace('!\s{2,}!', ' ', $output);
     
     				// Remove comments (non-MSIE conditionals)
    -				$output = preg_replace('{\s*\s*}msU', '', $output);
    +				$output = preg_replace('{\s*\s*}msU', '', $output);
     
     				// Remove spaces around block-level elements.
     				$output = preg_replace('/\s*(<\/?(html|head|title|meta|script|link|style|body|h[1-6]|div|p|br)[^>]*>)\s*/is', '$1', $output);
    
    From b19a203595b69067b3665ee179fb4b58cf5a014c Mon Sep 17 00:00:00 2001
    From: Ted Wood 
    Date: Sat, 5 Jan 2013 16:02:43 -0800
    Subject: [PATCH 2029/5397] utilize static function variables in
     Common::log_message() to "cache" log threshold and Log library instance to
     reduce function calls
    
    ---
     system/core/Common.php | 15 ++++++++++++---
     1 file changed, 12 insertions(+), 3 deletions(-)
    
    diff --git a/system/core/Common.php b/system/core/Common.php
    index a4b4f2b3e92..d494caf80aa 100644
    --- a/system/core/Common.php
    +++ b/system/core/Common.php
    @@ -413,14 +413,23 @@ function show_404($page = '', $log_error = TRUE)
     	 */
     	function log_message($level = 'error', $message, $php_error = FALSE)
     	{
    -		static $_log;
    +		static $_log, $_log_threshold;
    +		
    +		if ($_log_threshold === NULL)
    +		{
    +			$_log_threshold = config_item('log_threshold');
    +		}
     
    -		if (config_item('log_threshold') === 0)
    +		if ($_log_threshold === 0)
     		{
     			return;
     		}
     
    -		$_log =& load_class('Log', 'core');
    +		if ($_log === NULL)
    +		{
    +			$_log =& load_class('Log', 'core');
    +		}
    +		
     		$_log->write_log($level, $message, $php_error);
     	}
     }
    
    From 4c22364e12268961aac3ba0f2a4b60a066a16bcd Mon Sep 17 00:00:00 2001
    From: Ted Wood 
    Date: Sat, 5 Jan 2013 16:50:31 -0800
    Subject: [PATCH 2030/5397] Slight performance improvement by moving some class
     property initialization to the class property declarations rather than
     setting them in the constructor. Subclasses can always override in their own
     constructor if they wish to. Is there a reason why it was done the way it was
     done? A policy that I am not aware of?
    
    ---
     system/core/Loader.php | 12 ++++--------
     1 file changed, 4 insertions(+), 8 deletions(-)
    
    diff --git a/system/core/Loader.php b/system/core/Loader.php
    index 5e6c4005001..9bfddc15a0d 100644
    --- a/system/core/Loader.php
    +++ b/system/core/Loader.php
    @@ -52,28 +52,28 @@ class CI_Loader {
     	 *
     	 * @var	array
     	 */
    -	protected $_ci_view_paths =	array();
    +	protected $_ci_view_paths =	array(VIEWPATH	=> TRUE);
     
     	/**
     	 * List of paths to load libraries from
     	 *
     	 * @var	array
     	 */
    -	protected $_ci_library_paths =	array();
    +	protected $_ci_library_paths =	array(APPPATH, BASEPATH);
     
     	/**
     	 * List of paths to load models from
     	 *
     	 * @var	array
     	 */
    -	protected $_ci_model_paths =	array();
    +	protected $_ci_model_paths =	array(APPPATH);
     
     	/**
     	 * List of paths to load helpers from
     	 *
     	 * @var	array
     	 */
    -	protected $_ci_helper_paths =	array();
    +	protected $_ci_helper_paths =	array(APPPATH, BASEPATH);
     
     	/**
     	 * List of loaded base classes
    @@ -137,10 +137,6 @@ class CI_Loader {
     	public function __construct()
     	{
     		$this->_ci_ob_level  = ob_get_level();
    -		$this->_ci_library_paths = array(APPPATH, BASEPATH);
    -		$this->_ci_helper_paths = array(APPPATH, BASEPATH);
    -		$this->_ci_model_paths = array(APPPATH);
    -		$this->_ci_view_paths = array(VIEWPATH	=> TRUE);
     
     		log_message('debug', 'Loader Class Initialized');
     	}
    
    From 325e91ab502b1062e99085d8729c833c24d18076 Mon Sep 17 00:00:00 2001
    From: Ted Wood 
    Date: Mon, 7 Jan 2013 10:52:21 -0800
    Subject: [PATCH 2031/5397] minor tweaks and optimizations: minimize function
     calls in _fetch_uri_string(); use constant PHP_SAPI instead of function
     php_sapi_name()
    
    ---
     system/core/URI.php | 14 +++++++-------
     1 file changed, 7 insertions(+), 7 deletions(-)
    
    diff --git a/system/core/URI.php b/system/core/URI.php
    index fb854011832..b3603bbb13d 100644
    --- a/system/core/URI.php
    +++ b/system/core/URI.php
    @@ -94,7 +94,9 @@ public function __construct()
     	 */
     	public function _fetch_uri_string()
     	{
    -		if (strtoupper($this->config->item('uri_protocol')) === 'AUTO')
    +		$protocol = strtoupper($this->config->item('uri_protocol'));
    +
    +		if ($protocol === 'AUTO')
     		{
     			// Is the request coming from the command line?
     			if ($this->_is_cli_request())
    @@ -136,20 +138,18 @@ public function _fetch_uri_string()
     			return;
     		}
     
    -		$uri = strtoupper($this->config->item('uri_protocol'));
    -
    -		if ($uri === 'CLI')
    +		if ($protocol === 'CLI')
     		{
     			$this->_set_uri_string($this->_parse_argv());
     			return;
     		}
    -		elseif (method_exists($this, ($method = '_parse_'.strtolower($uri))))
    +		elseif (method_exists($this, ($method = '_parse_'.strtolower($protocol))))
     		{
     			$this->_set_uri_string($this->$method());
     			return;
     		}
     
    -		$uri = isset($_SERVER[$uri]) ? $_SERVER[$uri] : @getenv($uri);
    +		$uri = isset($_SERVER[$protocol]) ? $_SERVER[$protocol] : @getenv($protocol);
     		$this->_set_uri_string($uri);
     	}
     
    @@ -291,7 +291,7 @@ protected function _parse_query_string()
     	 */
     	protected function _is_cli_request()
     	{
    -		return (php_sapi_name() === 'cli') OR defined('STDIN');
    +		return (PHP_SAPI === 'cli') OR defined('STDIN');
     	}
     
     	// --------------------------------------------------------------------
    
    From 9cc707b8a5c726b7f2aa21b026dbf491a75e06c4 Mon Sep 17 00:00:00 2001
    From: Ted Wood 
    Date: Tue, 8 Jan 2013 19:41:45 -0800
    Subject: [PATCH 2032/5397] fix imagejpeg() parameter, should be NULL instead
     of empty string
    
    ---
     system/libraries/Image_lib.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php
    index 54a134f5096..6d5493696e5 100644
    --- a/system/libraries/Image_lib.php
    +++ b/system/libraries/Image_lib.php
    @@ -1491,7 +1491,7 @@ public function image_display_gd($resource)
     		{
     			case 1	:	imagegif($resource);
     				break;
    -			case 2	:	imagejpeg($resource, '', $this->quality);
    +			case 2	:	imagejpeg($resource, NULL, $this->quality);
     				break;
     			case 3	:	imagepng($resource);
     				break;
    
    From 4673d421a91693751ed06c413c8b6d3faa800c14 Mon Sep 17 00:00:00 2001
    From: Nic 
    Date: Wed, 9 Jan 2013 09:53:41 +0200
    Subject: [PATCH 2033/5397] Small typo in autoload config.
    
    Fixed "Packges" to read "Packages".
    ---
     application/config/autoload.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/application/config/autoload.php b/application/config/autoload.php
    index 4a9d221bccb..40f0a652080 100644
    --- a/application/config/autoload.php
    +++ b/application/config/autoload.php
    @@ -56,7 +56,7 @@
     
     /*
     | -------------------------------------------------------------------
    -|  Auto-load Packges
    +|  Auto-load Packages
     | -------------------------------------------------------------------
     | Prototype:
     |
    
    From a541087a6fb44b24f8d7044277391f282a326220 Mon Sep 17 00:00:00 2001
    From: Timothy Warren 
    Date: Wed, 9 Jan 2013 10:44:14 -0500
    Subject: [PATCH 2034/5397] Fix interbase limit issue for subqueries
    
    ---
     system/database/drivers/ibase/ibase_driver.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php
    index 87faf3d0872..875f148a18f 100644
    --- a/system/database/drivers/ibase/ibase_driver.php
    +++ b/system/database/drivers/ibase/ibase_driver.php
    @@ -421,7 +421,7 @@ protected function _limit($sql)
     				.($this->qb_offset ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit);
     		}
     
    -		return preg_replace('`SELECT`i', 'SELECT '.$select, $sql);
    +		return preg_replace('`SELECT`i', 'SELECT '.$select, $sql, 1);
     	}
     
     	// --------------------------------------------------------------------
    
    From 024cfeceedc17fc8442b2bca9dfc73c361dfaac3 Mon Sep 17 00:00:00 2001
    From: vlakoff 
    Date: Wed, 9 Jan 2013 18:10:20 +0100
    Subject: [PATCH 2035/5397] Syntax fixes in documentation source
    
    ---
     user_guide_src/source/changelog.rst           |  2 +-
     .../source/general/ancillary_classes.rst      | 38 +++++++++----------
     .../source/general/core_classes.rst           | 12 +++---
     .../source/general/creating_libraries.rst     | 38 +++++++++----------
     .../source/installation/upgrade_300.rst       |  6 +--
     .../source/libraries/form_validation.rst      |  4 +-
     user_guide_src/source/libraries/migration.rst |  2 +-
     7 files changed, 51 insertions(+), 51 deletions(-)
    
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 5534a1ee747..744150bb442 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -231,7 +231,7 @@ Release Date: Not Released
     	 -  Native PHP functions used as rules can now accept an additional parameter, other than the data itself.
     	 -  Updated method ``set_rules()`` to accept an array of rules as well as a string.
     	 -  Fields that have empty rules set no longer run through validation (and therefore are not considered erroneous).
    -	 -  Added rule **differs* to check if the value of a field differs from the value of another field.
    +	 -  Added rule **differs** to check if the value of a field differs from the value of another field.
     	 -  Added rule **valid_url**.
     	 -  Added support for named parameters in error messages.
     	 -  :doc:`Language ` line keys must now be prefixed with **form_validation_**.
    diff --git a/user_guide_src/source/general/ancillary_classes.rst b/user_guide_src/source/general/ancillary_classes.rst
    index a4befc7b301..5dc058ad42d 100644
    --- a/user_guide_src/source/general/ancillary_classes.rst
    +++ b/user_guide_src/source/general/ancillary_classes.rst
    @@ -58,30 +58,30 @@ won't need to call ``get_instance()`` in every single method.
     
     Example::
     
    -class Example {
    +	class Example {
     
    -	protected $CI;
    +		protected $CI;
     
    -	// We'll use a constructor, as you can't directly call a function
    -	// from a property definition.
    -	public function __construct()
    -	{
    -		// Assign the CodeIgniter super-object
    -		$this->CI =& get_instance();
    -	}
    +		// We'll use a constructor, as you can't directly call a function
    +		// from a property definition.
    +		public function __construct()
    +		{
    +			// Assign the CodeIgniter super-object
    +			$this->CI =& get_instance();
    +		}
     
    -	public function foo()
    -	{
    -		$this->CI->load->helper('url');
    -		redirect();
    -	}
    +		public function foo()
    +		{
    +			$this->CI->load->helper('url');
    +			redirect();
    +		}
     
    -	public function bar()
    -	{
    -		$this->CI->config_item('base_url');
    -	}
    +		public function bar()
    +		{
    +			$this->CI->config_item('base_url');
    +		}
     
    -}
    +	}
     
     In the above example, both methods ``foo()`` and ``bar()`` will work
     after you instantiate the Example class, without the need to call
    diff --git a/user_guide_src/source/general/core_classes.rst b/user_guide_src/source/general/core_classes.rst
    index ce57aeef0d2..07c0b00bac0 100644
    --- a/user_guide_src/source/general/core_classes.rst
    +++ b/user_guide_src/source/general/core_classes.rst
    @@ -76,15 +76,15 @@ application/core/MY_Input.php, and declare your class with::
     	}
     
     .. note:: If you need to use a constructor in your class make sure you
    -extend the parent constructor::
    +	extend the parent constructor::
     
    -	class MY_Input extends CI_Input {
    +		class MY_Input extends CI_Input {
     
    -		public function __construct()
    -		{
    -			parent::__construct();
    +			public function __construct()
    +			{
    +				parent::__construct();
    +			}
     		}
    -	}
     
     **Tip:** Any functions in your class that are named identically to the
     methods in the parent class will be used instead of the native ones
    diff --git a/user_guide_src/source/general/creating_libraries.rst b/user_guide_src/source/general/creating_libraries.rst
    index 8bafd4532d1..4fc8ed72f34 100644
    --- a/user_guide_src/source/general/creating_libraries.rst
    +++ b/user_guide_src/source/general/creating_libraries.rst
    @@ -148,30 +148,30 @@ take full advantage of the OOP principles. So, in order to
     be able to use the CodeIgniter super-object in all of the class
     methods, you're encouraged to assign it to a property instead::
     
    -class Example_library {
    +	class Example_library {
     
    -	protected $CI;
    +		protected $CI;
     
    -	// We'll use a constructor, as you can't directly call a function
    -	// from a property definition.
    -	public function __construct()
    -	{
    -		// Assign the CodeIgniter super-object
    -		$this->CI =& get_instance();
    -	}
    +		// We'll use a constructor, as you can't directly call a function
    +		// from a property definition.
    +		public function __construct()
    +		{
    +			// Assign the CodeIgniter super-object
    +			$this->CI =& get_instance();
    +		}
     
    -	public function foo()
    -	{
    -		$this->CI->load->helper('url');
    -		redirect();
    -	}
    +		public function foo()
    +		{
    +			$this->CI->load->helper('url');
    +			redirect();
    +		}
     
    -	public function bar()
    -	{
    -		echo $this->CI->config_item('base_url');
    -	}
    +		public function bar()
    +		{
    +			echo $this->CI->config_item('base_url');
    +		}
     
    -}
    +	}
     
     Replacing Native Libraries with Your Versions
     =============================================
    diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst
    index ff601867e56..94f6321befd 100644
    --- a/user_guide_src/source/installation/upgrade_300.rst
    +++ b/user_guide_src/source/installation/upgrade_300.rst
    @@ -302,7 +302,7 @@ CodeIgniter 3.1+.
     String helper random_string() types 'unique' and 'encrypt'
     ==========================================================
     
    -When using the :doc:`String Helper ` function :php:func:`random_string()`,
    +When using the :doc:`String Helper <../helpers/string_helper>` function :php:func:`random_string()`,
     you should no longer pass the **unique** and **encrypt** randomization types. They are only
     aliases for **md5** and **sha1** respectively and are now deprecated and scheduled for removal
     in CodeIgniter 3.1+.
    @@ -313,7 +313,7 @@ in CodeIgniter 3.1+.
     URL helper url_title() separators 'dash' and 'underscore'
     =========================================================
     
    -When using the :doc:`URL Helper ` function :php:func:`url_title()`, you
    +When using the :doc:`URL Helper <../helpers/url_helper>` function :php:func:`url_title()`, you
     should no longer pass **dash** or **underscore** as the word separator. This function will
     now accept any character and you should just pass the chosen character directly, so you
     should write '-' instead of 'dash' and '_' instead of 'underscore'.
    @@ -327,7 +327,7 @@ in CodeIgniter 3.1+.
     Database Forge method add_column() with an AFTER clause
     =======================================================
     
    -If you have used the **third parameter** for :doc:`Database Forge ` method
    +If you have used the **third parameter** for :doc:`Database Forge <../database/forge>` method
     ``add_column()`` to add a field for an AFTER clause, then you should change its usage.
     
     That third parameter has been deprecated and scheduled for removal in CodeIgniter 3.1+.
    diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst
    index ce1695d6202..ae7859aa35b 100644
    --- a/user_guide_src/source/libraries/form_validation.rst
    +++ b/user_guide_src/source/libraries/form_validation.rst
    @@ -479,7 +479,7 @@ Message is the text you would like displayed.
     
     If you'd like to include a field's "human" name, or the optional 
     parameter some rules allow for (such as max_length), you can add the 
    -**{field}** and **{param}** tags to your message, respectively.
    +**{field}** and **{param}** tags to your message, respectively::
     
     	$this->form_validation->set_message('min_length', '{field} must have at least {param} characters.');
     
    @@ -491,7 +491,7 @@ error would display: "Username must have at least 5 characters."
     	use one or the other.
     
     In the callback rule example above, the error message was set by passing
    -the name of the method (without the "callback_" prefix)::
    +the name of the method (without the "callback\_" prefix)::
     
     	$this->form_validation->set_message('username_check')
     
    diff --git a/user_guide_src/source/libraries/migration.rst b/user_guide_src/source/libraries/migration.rst
    index 1a73fb78d7d..9a7b10d642b 100644
    --- a/user_guide_src/source/libraries/migration.rst
    +++ b/user_guide_src/source/libraries/migration.rst
    @@ -158,6 +158,6 @@ Preference                 Default                Options                    Des
                                                                                  version number.
     **migration_auto_latest**  FALSE                  TRUE / FALSE               Enable or disable automatically 
                                                                                  running migrations.
    -**migration_type**        'timestamp'            'timestamp' / 'sequential' The type of numeric identifier used to name
    +**migration_type**         'timestamp'            'timestamp' / 'sequential' The type of numeric identifier used to name
                                                                                  migration files.
     ========================== ====================== ========================== =============================================
    
    From be999666179d34a2282bd46271b74364f22f3144 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 10 Jan 2013 11:40:09 +0200
    Subject: [PATCH 2036/5397] Apply improvement proposed in #2142
    
    ---
     system/database/drivers/mysql/mysql_driver.php   | 2 +-
     system/database/drivers/mysqli/mysqli_driver.php | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php
    index 98d553b2cc7..c6b46f070cc 100644
    --- a/system/database/drivers/mysql/mysql_driver.php
    +++ b/system/database/drivers/mysql/mysql_driver.php
    @@ -237,7 +237,7 @@ protected function _prep_query($sql)
     		// modifies the query so that it a proper number of affected rows is returned.
     		if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
     		{
    -			return preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', 'DELETE FROM \\1 WHERE 1=1', $sql);
    +			return trim($sql).' WHERE 1=1';
     		}
     
     		return $sql;
    diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php
    index 966a7b1fde0..be9176e160c 100644
    --- a/system/database/drivers/mysqli/mysqli_driver.php
    +++ b/system/database/drivers/mysqli/mysqli_driver.php
    @@ -214,7 +214,7 @@ protected function _prep_query($sql)
     		// modifies the query so that it a proper number of affected rows is returned.
     		if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
     		{
    -			return preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', 'DELETE FROM \\1 WHERE 1=1', $sql);
    +			return trim($sql).' WHERE 1=1';
     		}
     
     		return $sql;
    
    From 7545ffd90647cd65aeaff2a21032a13140700c63 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 10 Jan 2013 16:23:48 +0200
    Subject: [PATCH 2037/5397] Fix SQLSRV escape_str()
    
    ---
     .../database/drivers/sqlsrv/sqlsrv_driver.php | 24 ++++++++++++++++++-
     user_guide_src/source/changelog.rst           |  1 +
     2 files changed, 24 insertions(+), 1 deletion(-)
    
    diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php
    index 0e04c5c67fe..a6f2d55372b 100644
    --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php
    +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php
    @@ -230,8 +230,30 @@ public function trans_rollback()
     	 */
     	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;
    +		}
    +
     		// Escape single quotes
    -		return str_replace("'", "''", $str);
    +		$str = str_replace("'", "''", remove_invisible_characters($str));
    +
    +		// escape LIKE condition wildcards
    +		if ($like === TRUE)
    +		{
    +			return 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;
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 744150bb442..2966f659f25 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -468,6 +468,7 @@ Bug fixes for 3.0
     -  Fixed a bug (#188) - :doc:`Unit Testing Library ` filled up logs with error messages for non-existing language keys.
     -  Fixed a bug (#113) - :doc:`Form Validation Library ` didn't properly handle empty fields that were specified as an array.
     -  Fixed a bug (#2061) - :doc:`Routing Class ` didn't properly sanitize directory, controller and function triggers with **enable_query_strings** set to TRUE.
    +-  Fixed a bug - SQLSRV didn't support ``escape_like_str()`` or escaping an array of values.
     
     Version 2.1.3
     =============
    
    From 0b6a492ce1092172b9e3445e674ff9a344d33650 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 10 Jan 2013 16:53:44 +0200
    Subject: [PATCH 2038/5397] Unify escape_str() array input and LIKE logic
    
    Added protected method _escape_str() to deal with quote escaping.
    ---
     system/database/DB_driver.php                 | 49 ++++++++++++++++++-
     .../database/drivers/cubrid/cubrid_driver.php | 31 ++----------
     .../database/drivers/ibase/ibase_driver.php   | 32 ------------
     .../database/drivers/mssql/mssql_driver.php   | 37 --------------
     .../database/drivers/mysql/mysql_driver.php   | 31 +++---------
     .../database/drivers/mysqli/mysqli_driver.php | 31 +++---------
     system/database/drivers/oci8/oci8_driver.php  | 34 -------------
     system/database/drivers/odbc/odbc_driver.php  | 29 ++---------
     system/database/drivers/pdo/pdo_driver.php    | 34 +++----------
     .../drivers/postgre/postgre_driver.php        | 29 ++---------
     .../database/drivers/sqlite/sqlite_driver.php | 29 ++---------
     .../drivers/sqlite3/sqlite3_driver.php        | 29 ++---------
     .../database/drivers/sqlsrv/sqlsrv_driver.php | 37 --------------
     13 files changed, 87 insertions(+), 345 deletions(-)
    
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index 8c98a876e48..1e5e8c6f72e 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -1003,13 +1003,47 @@ public function escape($str)
     
     	// --------------------------------------------------------------------
     
    +	/**
    +	 * Escape String
    +	 *
    +	 * @param	string	$str
    +	 * @param	bool	$like	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 = $this->_escape_str($str);
    +
    +		// escape LIKE condition wildcards
    +		if ($like === TRUE)
    +		{
    +			return 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;
    +	}
    +
    +	// --------------------------------------------------------------------
    +
     	/**
     	 * Escape LIKE String
     	 *
     	 * Calls the individual driver for platform
     	 * specific escaping for LIKE conditions
     	 *
    -	 * @param	string
    +	 * @param	string|string[]
     	 * @return	mixed
     	 */
     	public function escape_like_str($str)
    @@ -1019,6 +1053,19 @@ public function escape_like_str($str)
     
     	// --------------------------------------------------------------------
     
    +	/**
    +	 * Platform-dependant string escape
    +	 *
    +	 * @param	string
    +	 * @return	string
    +	 */
    +	protected function _escape_str($str)
    +	{
    +		return str_replace("'", "''", remove_invisible_characters($str));
    +	}
    +
    +	// --------------------------------------------------------------------
    +
     	/**
     	 * Primary
     	 *
    diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php
    index 06ece4bd94a..6663868bd9e 100644
    --- a/system/database/drivers/cubrid/cubrid_driver.php
    +++ b/system/database/drivers/cubrid/cubrid_driver.php
    @@ -295,42 +295,21 @@ public function trans_rollback()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Escape String
    +	 * Platform-dependant string escape
     	 *
    -	 * @param	string	$str
    -	 * @param	bool	$like	Whether or not the string will be used in a LIKE condition
    +	 * @param	string
     	 * @return	string
     	 */
    -	public function escape_str($str, $like = FALSE)
    +	protected function _escape_str($str)
     	{
    -		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') &&
     			(is_resource($this->conn_id)
     				OR (get_resource_type($this->conn_id) === 'Unknown' && preg_match('/Resource id #/', strval($this->conn_id)))))
     		{
    -			$str = cubrid_real_escape_string($str, $this->conn_id);
    -		}
    -		else
    -		{
    -			$str = addslashes($str);
    -		}
    -
    -		// escape LIKE condition wildcards
    -		if ($like === TRUE)
    -		{
    -			return str_replace(array('%', '_'), array('\\%', '\\_'), $str);
    +			return cubrid_real_escape_string($str, $this->conn_id);
     		}
     
    -		return $str;
    +		return addslashes($str);
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php
    index 875f148a18f..74501105643 100644
    --- a/system/database/drivers/ibase/ibase_driver.php
    +++ b/system/database/drivers/ibase/ibase_driver.php
    @@ -191,38 +191,6 @@ public function trans_rollback()
     
     	// --------------------------------------------------------------------
     
    -	/**
    -	 * Escape String
    -	 *
    -	 * @param	string	$str
    -	 * @param	bool	$like	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;
    -		}
    -
    -		// escape LIKE condition wildcards
    -		if ($like === TRUE)
    -		{
    -			return 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
     	 *
    diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php
    index 286135f197f..f60071ed9ff 100644
    --- a/system/database/drivers/mssql/mssql_driver.php
    +++ b/system/database/drivers/mssql/mssql_driver.php
    @@ -228,43 +228,6 @@ public function trans_rollback()
     
     	// --------------------------------------------------------------------
     
    -	/**
    -	 * Escape String
    -	 *
    -	 * @param	string	$str
    -	 * @param	bool	$like	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;
    -		}
    -
    -		// Escape single quotes
    -		$str = str_replace("'", "''", remove_invisible_characters($str));
    -
    -		// escape LIKE condition wildcards
    -		if ($like === TRUE)
    -		{
    -			return 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
     	 *
    diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php
    index c6b46f070cc..492b07861ca 100644
    --- a/system/database/drivers/mysql/mysql_driver.php
    +++ b/system/database/drivers/mysql/mysql_driver.php
    @@ -312,35 +312,16 @@ public function trans_rollback()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Escape String
    +	 * Platform-dependant string escape
     	 *
    -	 * @param	string	$str
    -	 * @param	bool	$like	Whether or not the string will be used in a LIKE condition
    +	 * @param	string
     	 * @return	string
     	 */
    -	public function escape_str($str, $like = FALSE)
    +	protected function _escape_str($str)
     	{
    -		if (is_array($str))
    -		{
    -			foreach ($str as $key => $val)
    -			{
    -				$str[$key] = $this->escape_str($val, $like);
    -			}
    -
    -			return $str;
    -		}
    -
    -		$str = is_resource($this->conn_id) ? mysql_real_escape_string($str, $this->conn_id) : addslashes($str);
    -
    -		// escape LIKE condition wildcards
    -		if ($like === TRUE)
    -		{
    -			return 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;
    +		return is_resource($this->conn_id)
    +			? mysql_real_escape_string($str, $this->conn_id)
    +			: addslashes($str);
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php
    index be9176e160c..b64a7a2e801 100644
    --- a/system/database/drivers/mysqli/mysqli_driver.php
    +++ b/system/database/drivers/mysqli/mysqli_driver.php
    @@ -289,35 +289,16 @@ public function trans_rollback()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Escape String
    +	 * Platform-dependant string escape
     	 *
    -	 * @param	string	$str
    -	 * @param	bool	$like	Whether or not the string will be used in a LIKE condition
    +	 * @param	string
     	 * @return	string
     	 */
    -	public function escape_str($str, $like = FALSE)
    +	protected function _escape_str($str)
     	{
    -		if (is_array($str))
    -		{
    -			foreach ($str as $key => $val)
    -			{
    -				$str[$key] = $this->escape_str($val, $like);
    -			}
    -
    -			return $str;
    -		}
    -
    -		$str = is_object($this->conn_id) ? $this->conn_id->real_escape_string($str) : addslashes($str);
    -
    -		// escape LIKE condition wildcards
    -		if ($like === TRUE)
    -		{
    -			return 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;
    +		return is_object($this->conn_id)
    +			? $this->conn_id->real_escape_string($str)
    +			: addslashes($str);
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php
    index 6a850b43e3f..0ec8b53b8bc 100644
    --- a/system/database/drivers/oci8/oci8_driver.php
    +++ b/system/database/drivers/oci8/oci8_driver.php
    @@ -460,40 +460,6 @@ public function trans_rollback()
     
     	// --------------------------------------------------------------------
     
    -	/**
    -	 * Escape String
    -	 *
    -	 * @param	string	$str
    -	 * @param	bool	$like	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 = str_replace("'", "''", remove_invisible_characters($str));
    -
    -		// escape LIKE condition wildcards
    -		if ($like === TRUE)
    -		{
    -			return 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
     	 *
    diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php
    index 8f247edd5f6..45e91cbc5b7 100644
    --- a/system/database/drivers/odbc/odbc_driver.php
    +++ b/system/database/drivers/odbc/odbc_driver.php
    @@ -203,35 +203,14 @@ public function trans_rollback()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Escape String
    +	 * Platform-dependant string escape
     	 *
    -	 * @param	string	$str
    -	 * @param	bool	$like	Whether or not the string will be used in a LIKE condition
    +	 * @param	string
     	 * @return	string
     	 */
    -	public function escape_str($str, $like = FALSE)
    +	protected function _escape_str($str)
     	{
    -		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)
    -		{
    -			return 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;
    +		return remove_invisible_characters($str);
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php
    index 37090cb5d4a..34adf0f861f 100644
    --- a/system/database/drivers/pdo/pdo_driver.php
    +++ b/system/database/drivers/pdo/pdo_driver.php
    @@ -257,42 +257,20 @@ public function trans_rollback()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Escape String
    +	 * Platform-dependant string escape
     	 *
    -	 * @param	string	$str
    -	 * @param	bool	$like	Whether or not the string will be used in a LIKE condition
    +	 * @param	string
     	 * @return	string
     	 */
    -	public function escape_str($str, $like = FALSE)
    +	protected function _escape_str($str)
     	{
    -		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 ($str[0] === "'")
    -		{
    -			$str = substr($str, 1, -1);
    -		}
    -
    -		// escape LIKE condition wildcards
    -		if ($like === TRUE)
    -		{
    -			return 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;
    +		return ($str[0] === "'")
    +			? substr($str, 1, -1)
    +			: $str;
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php
    index 643d6c8ef80..d35e351fc83 100644
    --- a/system/database/drivers/postgre/postgre_driver.php
    +++ b/system/database/drivers/postgre/postgre_driver.php
    @@ -311,35 +311,14 @@ public function trans_rollback()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Escape String
    +	 * Platform-dependant string escape
     	 *
    -	 * @param	string	$str
    -	 * @param	bool	$like Whether or not the string will be used in a LIKE condition
    +	 * @param	string
     	 * @return	string
     	 */
    -	public function escape_str($str, $like = FALSE)
    +	protected function _escape_str($str)
     	{
    -		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)
    -		{
    -			return 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;
    +		return pg_escape_string($str);
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php
    index da7d90bb29a..6a3397f6f00 100644
    --- a/system/database/drivers/sqlite/sqlite_driver.php
    +++ b/system/database/drivers/sqlite/sqlite_driver.php
    @@ -200,35 +200,14 @@ public function trans_rollback()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Escape String
    +	 * Platform-dependant string escape
     	 *
    -	 * @param	string	$str
    -	 * @param	bool	$like	Whether or not the string will be used in a LIKE condition
    +	 * @param	string
     	 * @return	string
     	 */
    -	public function escape_str($str, $like = FALSE)
    +	protected function _escape_str($str)
     	{
    -		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)
    -		{
    -			return 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;
    +		return sqlite_escape_string($str);
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php
    index 529191114aa..4d131c31adb 100644
    --- a/system/database/drivers/sqlite3/sqlite3_driver.php
    +++ b/system/database/drivers/sqlite3/sqlite3_driver.php
    @@ -189,35 +189,14 @@ public function trans_rollback()
     	// --------------------------------------------------------------------
     
     	/**
    -	 * Escape String
    +	 * Platform-dependant string escape
     	 *
    -	 * @param	string	$str
    -	 * @param	bool	$like	Whether or not the string will be used in a LIKE condition
    +	 * @param	string
     	 * @return	string
     	 */
    -	public function escape_str($str, $like = FALSE)
    +	protected function _escape_str($str)
     	{
    -		if (is_array($str))
    -		{
    -			foreach ($str as $key => $val)
    -			{
    -				$str[$key] = $this->escape_str($val, $like);
    -			}
    -
    -			return $str;
    -		}
    -
    -		$str = $this->conn_id->escapeString(remove_invisible_characters($str));
    -
    -		// escape LIKE condition wildcards
    -		if ($like === TRUE)
    -		{
    -			return 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;
    +		return $this->conn_id->escapeString(remove_invisible_characters($str));
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php
    index a6f2d55372b..09e6b8c9a30 100644
    --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php
    +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php
    @@ -221,43 +221,6 @@ public function trans_rollback()
     
     	// --------------------------------------------------------------------
     
    -	/**
    -	 * Escape String
    -	 *
    -	 * @param	string	$str
    -	 * @param	bool	$like	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;
    -		}
    -
    -		// Escape single quotes
    -		$str = str_replace("'", "''", remove_invisible_characters($str));
    -
    -		// escape LIKE condition wildcards
    -		if ($like === TRUE)
    -		{
    -			return 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
     	 *
    
    From 661f588a010fd9203d542398e04997902405c122 Mon Sep 17 00:00:00 2001
    From: vlakoff 
    Date: Thu, 10 Jan 2013 16:26:59 +0100
    Subject: [PATCH 2039/5397] URI->_remove_url_suffix() : suffix has to be at the
     end of uri_string
    
    related to #2135
    ---
     system/core/URI.php | 11 +++++++++--
     1 file changed, 9 insertions(+), 2 deletions(-)
    
    diff --git a/system/core/URI.php b/system/core/URI.php
    index b3603bbb13d..8d0d8fddc92 100644
    --- a/system/core/URI.php
    +++ b/system/core/URI.php
    @@ -353,9 +353,16 @@ public function _remove_url_suffix()
     	{
     		$suffix = (string) $this->config->item('url_suffix');
     
    -		if ($suffix !== '' && ($offset = strrpos($this->uri_string, $suffix)) !== FALSE)
    +		if ($suffix === '')
     		{
    -			$this->uri_string = substr_replace($this->uri_string, '', $offset, strlen($suffix));
    +			return;
    +		}
    +
    +		$offset = strrpos($this->uri_string, $suffix);
    +
    +		if ($offset !== FALSE && $offset === strlen($this->uri_string) - strlen($suffix))
    +		{
    +			$this->uri_string = substr($this->uri_string, 0, $offset);
     		}
     	}
     
    
    From 5b5401a78403fce9a32acd912686b5e6cdba15b7 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 10 Jan 2013 17:38:08 +0200
    Subject: [PATCH 2040/5397] A tiny improvement
    
    ---
     system/libraries/Trackback.php | 5 ++---
     1 file changed, 2 insertions(+), 3 deletions(-)
    
    diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php
    index 2fb737d6b75..ecc7129e3ff 100644
    --- a/system/libraries/Trackback.php
    +++ b/system/libraries/Trackback.php
    @@ -268,9 +268,8 @@ public function process($url, $data)
     		}
     
     		// Build the path
    -		$ppath = isset($target['path']) ? $target['path'] : $url;
    -
    -		$path = empty($target['query']) ? $ppath : $ppath.'?'.$target['query'];
    +		$path = isset($target['path']) ? $target['path'] : $url;
    +		empty($target['query']) OR $path .= '?'.$target['query'];
     
     		// Add the Trackback ID to the data string
     		if ($id = $this->get_id($url))
    
    From d1e50fa4ae25a8e60a13f06e6debbca1b2749fce Mon Sep 17 00:00:00 2001
    From: vlakoff 
    Date: Fri, 11 Jan 2013 15:22:17 +0100
    Subject: [PATCH 2041/5397] URI->_remove_url_suffix() : more efficient code
    
    related to #2135
    ---
     system/core/URI.php | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/system/core/URI.php b/system/core/URI.php
    index 8d0d8fddc92..9b31a646bc0 100644
    --- a/system/core/URI.php
    +++ b/system/core/URI.php
    @@ -358,11 +358,11 @@ public function _remove_url_suffix()
     			return;
     		}
     
    -		$offset = strrpos($this->uri_string, $suffix);
    +		$slen = strlen($suffix);
     
    -		if ($offset !== FALSE && $offset === strlen($this->uri_string) - strlen($suffix))
    +		if (substr($this->uri_string, -$slen) === $suffix)
     		{
    -			$this->uri_string = substr($this->uri_string, 0, $offset);
    +			$this->uri_string = substr($this->uri_string, 0, -$slen);
     		}
     	}
     
    
    From 5a519db2c4884a3972dd33e09d0b3a314aa222e2 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Sat, 12 Jan 2013 04:19:19 +0200
    Subject: [PATCH 2042/5397] Implement autoload model aliasing (#2117)
    
    ---
     application/config/autoload.php              | 8 ++++++--
     system/core/Loader.php                       | 4 ++--
     user_guide_src/source/changelog.rst          | 1 +
     user_guide_src/source/general/autoloader.rst | 2 +-
     4 files changed, 10 insertions(+), 5 deletions(-)
    
    diff --git a/application/config/autoload.php b/application/config/autoload.php
    index 40f0a652080..5a20c943a2d 100644
    --- a/application/config/autoload.php
    +++ b/application/config/autoload.php
    @@ -148,12 +148,16 @@
     | -------------------------------------------------------------------
     | Prototype:
     |
    -|	$autoload['model'] = array('model1', 'model2');
    +|	$autoload['model'] = array('first_model', 'second_model');
     |
    +| You can also supply an alternative model name to be assigned
    +| in the controller:
    +|
    +|	$autoload['model'] = array('first_model' => 'first');
     */
     
     $autoload['model'] = array();
     
     
     /* End of file autoload.php */
    -/* Location: ./application/config/autoload.php */
    +/* Location: ./application/config/autoload.php */
    \ No newline at end of file
    diff --git a/system/core/Loader.php b/system/core/Loader.php
    index 9bfddc15a0d..4d95d628876 100644
    --- a/system/core/Loader.php
    +++ b/system/core/Loader.php
    @@ -233,9 +233,9 @@ public function model($model, $name = '', $db_conn = FALSE)
     		}
     		elseif (is_array($model))
     		{
    -			foreach ($model as $class)
    +			foreach ($model as $key => $value)
     			{
    -				$this->model($class);
    +				$this->model(is_int($key) ? $value : $key, $value);
     			}
     			return;
     		}
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 2966f659f25..98999992903 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -285,6 +285,7 @@ Release Date: Not Released
     	 -  Added autoloading of drivers with ``$autoload['drivers']``.
     	 -  ``$config['rewrite_short_tags']`` now has no effect when using PHP 5.4 as ``` changes include:
     	 -  Added ``method()`` to retrieve ``$_SERVER['REQUEST_METHOD']``.
     	 -  Added support for arrays and network addresses (e.g. 192.168.1.1/24) for use with the *proxy_ips* setting.
    diff --git a/user_guide_src/source/general/autoloader.rst b/user_guide_src/source/general/autoloader.rst
    index e5cec723b80..bf2e3935a5c 100644
    --- a/user_guide_src/source/general/autoloader.rst
    +++ b/user_guide_src/source/general/autoloader.rst
    @@ -15,7 +15,7 @@ The following items can be loaded automatically:
     -  Language files found in the *system/language/* directory
     -  Models found in the *models/* folder
     
    -To autoload resources, open the *application/config/autoload.php*
    +To autoload resources, open the **application/config/autoload.php**
     file and add the item you want loaded to the autoload array. You'll
     find instructions in that file corresponding to each type of item.
     
    
    From c90e67ea553f1ff0fc22f280583fca22f95f9f42 Mon Sep 17 00:00:00 2001
    From: Eric Roberts 
    Date: Fri, 11 Jan 2013 21:20:54 -0600
    Subject: [PATCH 2043/5397] Improve output cache.
    
    ---
     system/core/Output.php | 34 ++++++++++++++++++++++++----------
     1 file changed, 24 insertions(+), 10 deletions(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index 27e711783c4..52a5518584c 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -58,21 +58,21 @@ class CI_Output {
     	 *
     	 * @var	array
     	 */
    -	public $headers =	array();
    +	public $headers = array();
     
     	/**
     	 * List of mime types
     	 *
     	 * @var	array
     	 */
    -	public $mimes =		array();
    +	public $mimes = array();
     
     	/**
     	 * Mime-type for the current page
     	 *
     	 * @var	string
     	 */
    -	protected $mime_type	= 'text/html';
    +	protected $mime_type = 'text/html';
     
     	/**
     	 * Enable Profiler flag
    @@ -86,14 +86,14 @@ class CI_Output {
     	 *
     	 * @var	bool
     	 */
    -	protected $_zlib_oc =		FALSE;
    +	protected $_zlib_oc = FALSE;
     
     	/**
     	 * List of profiler sections
     	 *
     	 * @var	array
     	 */
    -	protected $_profiler_sections =	array();
    +	protected $_profiler_sections = array();
     
     	/**
     	 * Parse markers flag
    @@ -102,7 +102,7 @@ class CI_Output {
     	 *
     	 * @var	bool
     	 */
    -	public $parse_exec_vars =	TRUE;
    +	public $parse_exec_vars = TRUE;
     
     	/**
     	 * Class constructor
    @@ -543,10 +543,16 @@ public function _write_cache($output)
     		}
     
     		$expire = time() + ($this->cache_expiration * 60);
    +		
    +		// Put together our serialized info.
    +		$cache_info = serialize(array(
    +			'expire'	=> $expire,
    +			'headers'	=> $this->headers
    +		));
     
     		if (flock($fp, LOCK_EX))
     		{
    -			fwrite($fp, $expire.'TS--->'.$output);
    +			fwrite($fp, $cache_info.'ENDCI--->'.$output);
     			flock($fp, LOCK_UN);
     		}
     		else
    @@ -595,14 +601,16 @@ public function _display_cache(&$CFG, &$URI)
     		flock($fp, LOCK_UN);
     		fclose($fp);
     
    -		// Strip out the embedded timestamp
    -		if ( ! preg_match('/^(\d+)TS--->/', $cache, $match))
    +		// Look for embedded serialized file info.
    +		if ( ! preg_match('/^(.*)ENDCI--->/', $cache, $match))
     		{
     			return FALSE;
     		}
    +		
    +		$cache_info = unserialize($match[1]);
    +		$expire = $cache_info['expire'];
     
     		$last_modified = filemtime($cache_path);
    -		$expire = $match[1];
     
     		// Has the file expired?
     		if ($_SERVER['REQUEST_TIME'] >= $expire && is_really_writable($cache_path))
    @@ -617,6 +625,12 @@ public function _display_cache(&$CFG, &$URI)
     			// Or else send the HTTP cache control headers.
     			$this->set_cache_header($last_modified, $expire);
     		}
    +		
    +		// Add headers from cache file.
    +		foreach ($cache_info['headers'] as $header)
    +		{
    +			$this->set_header($header[0], $header[1]);
    +		}
     
     		// Display the cache
     		$this->_display(substr($cache, strlen($match[0])));
    
    From 1228fe27bc1f22838cd80c5fe33c37274faf0e24 Mon Sep 17 00:00:00 2001
    From: vlakoff 
    Date: Mon, 14 Jan 2013 01:30:09 +0100
    Subject: [PATCH 2044/5397] Replace is_null() with === / !== NULL
    
    Exact same behavior, but faster. I also think it's more readable.
    ---
     system/core/Loader.php               |  8 ++++----
     system/database/DB_driver.php        |  2 +-
     system/database/DB_query_builder.php | 18 +++++++++---------
     system/database/DB_result.php        |  2 +-
     system/libraries/Email.php           |  2 +-
     system/libraries/Form_validation.php |  6 +++---
     system/libraries/Ftp.php             |  4 ++--
     system/libraries/Javascript.php      |  4 ++--
     system/libraries/Table.php           |  2 +-
     system/libraries/Unit_test.php       |  4 ++--
     system/libraries/User_agent.php      |  2 +-
     system/libraries/Xmlrpc.php          |  2 +-
     12 files changed, 28 insertions(+), 28 deletions(-)
    
    diff --git a/system/core/Loader.php b/system/core/Loader.php
    index 4d95d628876..1ad07f1fac5 100644
    --- a/system/core/Loader.php
    +++ b/system/core/Loader.php
    @@ -205,7 +205,7 @@ public function library($library = '', $params = NULL, $object_name = NULL)
     			return;
     		}
     
    -		if ( ! is_null($params) && ! is_array($params))
    +		if ($params !== NULL && ! is_array($params))
     		{
     			$params = NULL;
     		}
    @@ -975,7 +975,7 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL)
     					// Before we deem this to be a duplicate request, let's see
     					// if a custom object name is being supplied. If so, we'll
     					// return a new instance of the object
    -					if ( ! is_null($object_name))
    +					if ($object_name !== NULL)
     					{
     						$CI =& get_instance();
     						if ( ! isset($CI->$object_name))
    @@ -1014,7 +1014,7 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL)
     					// Before we deem this to be a duplicate request, let's see
     					// if a custom object name is being supplied. If so, we'll
     					// return a new instance of the object
    -					if ( ! is_null($object_name))
    +					if ($object_name !== NULL)
     					{
     						$CI =& get_instance();
     						if ( ! isset($CI->$object_name))
    @@ -1144,7 +1144,7 @@ protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object
     		// Was a custom class name supplied? If so we'll use it
     		$class = strtolower($class);
     
    -		if (is_null($object_name))
    +		if ($object_name === NULL)
     		{
     			$classvar = isset($this->_ci_varmap[$class]) ? $this->_ci_varmap[$class] : $class;
     		}
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index 1e5e8c6f72e..26791398a03 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -993,7 +993,7 @@ public function escape($str)
     		{
     			return ($str === FALSE) ? 0 : 1;
     		}
    -		elseif (is_null($str))
    +		elseif ($str === NULL)
     		{
     			return 'NULL';
     		}
    diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php
    index dc2c5e70285..978fc6af740 100644
    --- a/system/database/DB_query_builder.php
    +++ b/system/database/DB_query_builder.php
    @@ -644,7 +644,7 @@ protected function _wh($qb_key, $key, $value = NULL, $type = 'AND ', $escape = N
     				? $this->_group_get_type('')
     				: $this->_group_get_type($type);
     
    -			if ( ! is_null($v))
    +			if ($v !== NULL)
     			{
     				if ($escape === TRUE)
     				{
    @@ -1202,7 +1202,7 @@ public function order_by($orderby, $direction = '', $escape = NULL)
     	 */
     	public function limit($value, $offset = FALSE)
     	{
    -		is_null($value) OR $this->qb_limit = (int) $value;
    +		$value === NULL OR $this->qb_limit = (int) $value;
     		empty($offset) OR $this->qb_offset = (int) $offset;
     
     		return $this;
    @@ -1382,7 +1382,7 @@ public function get_where($table = '', $where = NULL, $limit = NULL, $offset = N
     			$this->from($table);
     		}
     
    -		if ( ! is_null($where))
    +		if ($where !== NULL)
     		{
     			$this->where($where);
     		}
    @@ -1411,7 +1411,7 @@ public function get_where($table = '', $where = NULL, $limit = NULL, $offset = N
     	 */
     	public function insert_batch($table = '', $set = NULL, $escape = NULL)
     	{
    -		if ( ! is_null($set))
    +		if ($set !== NULL)
     		{
     			$this->set_insert_batch($set, '', $escape);
     		}
    @@ -1567,7 +1567,7 @@ public function get_compiled_insert($table = '', $reset = TRUE)
     	 */
     	public function insert($table = '', $set = NULL, $escape = NULL)
     	{
    -		if ( ! is_null($set))
    +		if ($set !== NULL)
     		{
     			$this->set($set, '', $escape);
     		}
    @@ -1633,7 +1633,7 @@ protected function _validate_insert($table = '')
     	 */
     	public function replace($table = '', $set = NULL)
     	{
    -		if ( ! is_null($set))
    +		if ($set !== NULL)
     		{
     			$this->set($set);
     		}
    @@ -1742,7 +1742,7 @@ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL)
     		// Combine any cached components with the current statements
     		$this->_merge_cache();
     
    -		if ( ! is_null($set))
    +		if ($set !== NULL)
     		{
     			$this->set($set);
     		}
    @@ -1815,12 +1815,12 @@ public function update_batch($table = '', $set = NULL, $index = NULL)
     		// Combine any cached components with the current statements
     		$this->_merge_cache();
     
    -		if (is_null($index))
    +		if ($index === NULL)
     		{
     			return ($this->db_debug) ? $this->display_error('db_must_use_index') : FALSE;
     		}
     
    -		if ( ! is_null($set))
    +		if ($set !== NULL)
     		{
     			$this->set_update_batch($set, $index);
     		}
    diff --git a/system/database/DB_result.php b/system/database/DB_result.php
    index dfd8081fdb7..a044fd5dcda 100644
    --- a/system/database/DB_result.php
    +++ b/system/database/DB_result.php
    @@ -354,7 +354,7 @@ public function set_row($key, $value = NULL)
     			return;
     		}
     
    -		if ($key !== '' && ! is_null($value))
    +		if ($key !== '' && $value !== NULL)
     		{
     			$this->row_data[$key] = $value;
     		}
    diff --git a/system/libraries/Email.php b/system/libraries/Email.php
    index 1834be239be..3a386456d26 100644
    --- a/system/libraries/Email.php
    +++ b/system/libraries/Email.php
    @@ -1335,7 +1335,7 @@ protected function _build_message()
     		for ($i = 0, $c = count($this->_attachments), $z = 0; $i < $c; $i++)
     		{
     			$filename = $this->_attachments[$i]['name'][0];
    -			$basename = is_null($this->_attachments[$i]['name'][1])
    +			$basename = $this->_attachments[$i]['name'][1] === NULL
     				? basename($filename) : $this->_attachments[$i]['name'][1];
     			$ctype = $this->_attachments[$i]['type'];
     			$file_content = '';
    diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php
    index c405eb6b115..bbd0b523e1b 100644
    --- a/system/libraries/Form_validation.php
    +++ b/system/libraries/Form_validation.php
    @@ -511,7 +511,7 @@ protected function _reset_post_array()
     	{
     		foreach ($this->_field_data as $field => $row)
     		{
    -			if ( ! is_null($row['postdata']))
    +			if ($row['postdata'] !== NULL)
     			{
     				if ($row['is_array'] === FALSE)
     				{
    @@ -583,7 +583,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0)
     
     		// If the field is blank, but NOT required, no further tests are necessary
     		$callback = FALSE;
    -		if ( ! in_array('required', $rules) && is_null($postdata))
    +		if ( ! in_array('required', $rules) && $postdata === NULL)
     		{
     			// Before we bail out, does the rule contain a callback?
     			if (preg_match('/(callback_\w+(\[.*?\])?)/', implode(' ', $rules), $match))
    @@ -598,7 +598,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0)
     		}
     
     		// Isset Test. Typically this rule will only apply to checkboxes.
    -		if (is_null($postdata) && $callback === FALSE)
    +		if ($postdata === NULL && $callback === FALSE)
     		{
     			if (in_array('isset', $rules, TRUE) OR in_array('required', $rules))
     			{
    diff --git a/system/libraries/Ftp.php b/system/libraries/Ftp.php
    index b8729a9c7f4..dc6bbd22622 100644
    --- a/system/libraries/Ftp.php
    +++ b/system/libraries/Ftp.php
    @@ -266,7 +266,7 @@ public function mkdir($path = '', $permissions = NULL)
     		}
     
     		// Set file permissions if needed
    -		if ( ! is_null($permissions))
    +		if ($permissions !== NULL)
     		{
     			$this->chmod($path, (int) $permissions);
     		}
    @@ -320,7 +320,7 @@ public function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL)
     		}
     
     		// Set file permissions if needed
    -		if ( ! is_null($permissions))
    +		if ($permissions !== NULL)
     		{
     			$this->chmod($rempath, (int) $permissions);
     		}
    diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php
    index 542a0ecdeee..7f1d8551152 100644
    --- a/system/libraries/Javascript.php
    +++ b/system/libraries/Javascript.php
    @@ -737,7 +737,7 @@ public function generate_json($result = NULL, $match_array_type = FALSE)
     	{
     		// JSON data can optionally be passed to this function
     		// either as a database result object or an array, or a user supplied array
    -		if ( ! is_null($result))
    +		if ($result !== NULL)
     		{
     			if (is_object($result))
     			{
    @@ -823,7 +823,7 @@ protected function _is_associative_array($arr)
     	 */
     	protected function _prep_args($result, $is_key = FALSE)
     	{
    -		if (is_null($result))
    +		if ($result === NULL)
     		{
     			return 'null';
     		}
    diff --git a/system/libraries/Table.php b/system/libraries/Table.php
    index 86569905285..b77fcf19d3b 100644
    --- a/system/libraries/Table.php
    +++ b/system/libraries/Table.php
    @@ -291,7 +291,7 @@ public function generate($table_data = NULL)
     	{
     		// The table data can optionally be passed to this function
     		// either as a database result object or an array
    -		if ( ! is_null($table_data))
    +		if ($table_data !== NULL)
     		{
     			if (is_object($table_data))
     			{
    diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php
    index de8c9bb8084..7a67c7276c3 100644
    --- a/system/libraries/Unit_test.php
    +++ b/system/libraries/Unit_test.php
    @@ -356,12 +356,12 @@ protected function _default_template()
     	 */
     	protected function _parse_template()
     	{
    -		if ( ! is_null($this->_template_rows))
    +		if ($this->_template_rows !== NULL)
     		{
     			return;
     		}
     
    -		if (is_null($this->_template) OR ! preg_match('/\{rows\}(.*?)\{\/rows\}/si', $this->_template, $match))
    +		if ($this->_template === NULL OR ! preg_match('/\{rows\}(.*?)\{\/rows\}/si', $this->_template, $match))
     		{
     			$this->_default_template();
     			return;
    diff --git a/system/libraries/User_agent.php b/system/libraries/User_agent.php
    index 542deb7386a..1f4b2fa524b 100644
    --- a/system/libraries/User_agent.php
    +++ b/system/libraries/User_agent.php
    @@ -158,7 +158,7 @@ public function __construct()
     			$this->agent = trim($_SERVER['HTTP_USER_AGENT']);
     		}
     
    -		if ( ! is_null($this->agent) && $this->_load_agent_file())
    +		if ($this->agent !== NULL && $this->_load_agent_file())
     		{
     			$this->_compile_data();
     		}
    diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php
    index c3c7690f06a..9e60791ae60 100644
    --- a/system/libraries/Xmlrpc.php
    +++ b/system/libraries/Xmlrpc.php
    @@ -368,7 +368,7 @@ public function server($url, $port = 80, $proxy = FALSE, $proxy_port = 8080)
     	 */
     	public function timeout($seconds = 5)
     	{
    -		if ( ! is_null($this->client) && is_int($seconds))
    +		if ($this->client !== NULL && is_int($seconds))
     		{
     			$this->client->timeout = $seconds;
     		}
    
    From 5b60a3bb74d39b8718081cb62c21f9f48e7a4a87 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Tue, 15 Jan 2013 04:19:03 +0200
    Subject: [PATCH 2045/5397] [ci skip] Fix issue #2157 - docs on the email
     library
    
    ---
     user_guide_src/source/libraries/email.rst | 52 +++++++++++++----------
     1 file changed, 29 insertions(+), 23 deletions(-)
    
    diff --git a/user_guide_src/source/libraries/email.rst b/user_guide_src/source/libraries/email.rst
    index 8643444f80f..7d468251cf9 100644
    --- a/user_guide_src/source/libraries/email.rst
    +++ b/user_guide_src/source/libraries/email.rst
    @@ -40,8 +40,6 @@ This example assumes you are sending the email from one of your
     
     	$this->email->send();
     
    -	echo $this->email->print_debugger();
    -
     Setting Email Preferences
     =========================
     
    @@ -51,7 +49,7 @@ or automatically via preferences stored in your config file, described
     below:
     
     Preferences are set by passing an array of preference values to the
    -email initialize function. Here is an example of how you might set some
    +email initialize method. Here is an example of how you might set some
     preferences::
     
     	$config['protocol'] = 'sendmail';
    @@ -71,8 +69,8 @@ If you prefer not to set preferences using the above method, you can
     instead put them into a config file. Simply create a new file called the
     email.php, add the $config array in that file. Then save the file at
     config/email.php and it will be used automatically. You will NOT need to
    -use the $this->email->initialize() function if you save your preferences
    -in a config file.
    +use the ``$this->email->initialize()`` method if you save your
    +preferences in a config file.
     
     Email Preferences
     =================
    @@ -107,8 +105,8 @@ Preference          Default Value          Options                      Descript
     **dsn**             FALSE                  TRUE or FALSE (boolean)      Enable notify message from server
     =================== ====================== ============================ =======================================================================
     
    -Email Function Reference
    -========================
    +Email Methods Reference
    +=======================
     
     $this->email->from()
     --------------------
    @@ -125,10 +123,10 @@ You can also set a Return-Path, to help redirect undelivered mail::
     	'smtp' as your protocol.
     
     $this->email->reply_to()
    --------------------------
    +------------------------
     
     Sets the reply-to address. If the information is not provided the
    -information in the "from" function is used. Example::
    +information in the "from" method is used. Example::
     
     	$this->email->reply_to('you@example.com', 'Your Name');
     
    @@ -177,7 +175,7 @@ Sets the email message body::
     	$this->email->message('This is my message');
     
     $this->email->set_alt_message()
    ----------------------------------
    +-------------------------------
     
     Sets the alternative email message body::
     
    @@ -200,21 +198,21 @@ Appends additional headers to the e-mail::
     $this->email->clear()
     ---------------------
     
    -Initializes all the email variables to an empty state. This function is
    -intended for use if you run the email sending function in a loop,
    +Initializes all the email variables to an empty state. This method is
    +intended for use if you run the email sending method in a loop,
     permitting the data to be reset between cycles.
     
     ::
     
     	foreach ($list as $name => $address)
     	{
    -	    $this->email->clear();
    +		$this->email->clear();
     
    -	    $this->email->to($address);
    -	    $this->email->from('your@example.com');
    -	    $this->email->subject('Here is your info '.$name);
    -	    $this->email->message('Hi '.$name.' Here is the info you requested.');
    -	    $this->email->send();
    +		$this->email->to($address);
    +		$this->email->from('your@example.com');
    +		$this->email->subject('Here is your info '.$name);
    +		$this->email->message('Hi '.$name.' Here is the info you requested.');
    +		$this->email->send();
     	}
     
     If you set the parameter to TRUE any attachments will be cleared as
    @@ -225,15 +223,15 @@ well::
     $this->email->send()
     --------------------
     
    -The Email sending function. Returns boolean TRUE or FALSE based on
    +The Email sending method. Returns boolean TRUE or FALSE based on
     success or failure, enabling it to be used conditionally::
     
     	if ( ! $this->email->send())
     	{
    -	    // Generate error
    +		// Generate error
     	}
     
    -This function will automatically clear all parameters if the request was
    +This method will automatically clear all parameters if the request was
     successful. To stop this behaviour pass FALSE::
     
      	if ($this->email->send(FALSE))
    @@ -241,12 +239,15 @@ successful. To stop this behaviour pass FALSE::
      		// Parameters won't be cleared
      	}
     
    +.. note:: In order to use the ``print_debugger()`` method, you need
    +	to avoid clearing the email parameters.
    +
     $this->email->attach()
     ----------------------
     
     Enables you to send an attachment. Put the file path/name in the first
     parameter. Note: Use a file path, not a URL. For multiple attachments
    -use the function multiple times. For example::
    +use the method multiple times. For example::
     
     	$this->email->attach('/path/to/photo1.jpg');
     	$this->email->attach('/path/to/photo2.jpg');
    @@ -278,6 +279,11 @@ Valid options are: **headers**, **subject**, **body**.
     
     Example::
     
    +	// You need to pass FALSE while sending in order for the email data
    +	// to not be cleared - if that happens, print_debugger() would have
    +	// nothing to output.
    +	$this->email->send(FALSE);
    +
     	// Will only print the email headers, excluding the message subject and body
     	$this->email->print_debugger(array('headers'));
     
    @@ -301,4 +307,4 @@ message like this::
     	wrapped normally.
     	
     
    -Place the item you do not want word-wrapped between: {unwrap} {/unwrap}
    +Place the item you do not want word-wrapped between: {unwrap} {/unwrap}
    \ No newline at end of file
    
    From 912f1bcbc3d4f9b09695ab784d6985efbc4c9235 Mon Sep 17 00:00:00 2001
    From: vlakoff 
    Date: Tue, 15 Jan 2013 03:34:12 +0100
    Subject: [PATCH 2046/5397] A few adjustments to previous commit
    
    ---
     system/database/DB_query_builder.php | 2 +-
     system/libraries/Email.php           | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php
    index 978fc6af740..ac377d99675 100644
    --- a/system/database/DB_query_builder.php
    +++ b/system/database/DB_query_builder.php
    @@ -1202,7 +1202,7 @@ public function order_by($orderby, $direction = '', $escape = NULL)
     	 */
     	public function limit($value, $offset = FALSE)
     	{
    -		$value === NULL OR $this->qb_limit = (int) $value;
    +		is_null($value) OR $this->qb_limit = (int) $value;
     		empty($offset) OR $this->qb_offset = (int) $offset;
     
     		return $this;
    diff --git a/system/libraries/Email.php b/system/libraries/Email.php
    index 3a386456d26..997757b0a6f 100644
    --- a/system/libraries/Email.php
    +++ b/system/libraries/Email.php
    @@ -1335,7 +1335,7 @@ protected function _build_message()
     		for ($i = 0, $c = count($this->_attachments), $z = 0; $i < $c; $i++)
     		{
     			$filename = $this->_attachments[$i]['name'][0];
    -			$basename = $this->_attachments[$i]['name'][1] === NULL
    +			$basename = ($this->_attachments[$i]['name'][1] === NULL)
     				? basename($filename) : $this->_attachments[$i]['name'][1];
     			$ctype = $this->_attachments[$i]['type'];
     			$file_content = '';
    
    From e9eb64f863ffeacd2986eb75e0aaaeb95d12a122 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 17 Jan 2013 15:21:02 +0200
    Subject: [PATCH 2047/5397] Fix issues #2160, #2161
    
    ---
     system/helpers/url_helper.php | 17 ++++++-----------
     1 file changed, 6 insertions(+), 11 deletions(-)
    
    diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php
    index 0c0edf54e2b..130f6f96265 100644
    --- a/system/helpers/url_helper.php
    +++ b/system/helpers/url_helper.php
    @@ -408,23 +408,18 @@ function auto_link($str, $type = 'both', $popup = FALSE)
     			}
     		}
     
    -		if ($type !== 'url' && preg_match_all('/([a-zA-Z0-9_\.\-\+]+)@([a-zA-Z0-9\-]+)\.([a-zA-Z0-9\-\.]+)/i', $str, $matches))
    +		if ($type !== 'url' && preg_match_all('/([a-zA-Z0-9_\.\-\+]+)@([a-zA-Z0-9\-]+)\.([a-zA-Z0-9\-\.]+)/i', $str, $matches, PREG_OFFSET_CAPTURE))
     		{
    -			for ($i = 0, $c = count($matches); $i < $c; $i++)
    +			for ($i = count($matches[0]) - 1; $i > -1; $i--)
     			{
    -				if (preg_match('/(\.|\,)$/i', $matches[3][$i], $m))
    +				if (preg_match('/(\.|\,)$/i', $matches[3][$i][0], $m))
     				{
    -					$punct = $m[1];
    -					$matches[3][$i] = substr($matches[3][$i], 0, -1);
    -				}
    -				else
    -				{
    -					$punct = '';
    +					$matches[3][$i][0] = substr($matches[3][$i][0], 0, -1);
     				}
     
    -				if (filter_var(($m = $matches[1][$i].'@'.$matches[2][$i].'.'.$matches[3][$i]), FILTER_VALIDATE_EMAIL) !== FALSE)
    +				if (filter_var(($m = $matches[1][$i][0].'@'.$matches[2][$i][0].'.'.$matches[3][$i][0]), FILTER_VALIDATE_EMAIL) !== FALSE)
     				{
    -					$str = str_replace($matches[0][$i], safe_mailto($m).$punct, $str);
    +					$str = substr_replace($str, safe_mailto($m), $matches[0][$i][1], strlen($m));
     				}
     			}
     		}
    
    From 8093bd7a1ae63cacb87c16aad9910c053349739f Mon Sep 17 00:00:00 2001
    From: Eric Roberts 
    Date: Thu, 17 Jan 2013 18:12:47 -0600
    Subject: [PATCH 2048/5397] Fix and optimize auto_link() URL helper function.
    
    Signed-off-by: Eric Roberts 
    ---
     system/helpers/url_helper.php | 53 +++++++++++++++--------------------
     1 file changed, 22 insertions(+), 31 deletions(-)
    
    diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php
    index 130f6f96265..8be32727651 100644
    --- a/system/helpers/url_helper.php
    +++ b/system/helpers/url_helper.php
    @@ -383,47 +383,38 @@ function safe_mailto($email, $title = '', $attributes = '')
     	 */
     	function auto_link($str, $type = 'both', $popup = FALSE)
     	{
    -		if ($type !== 'email' && preg_match_all('#(^|\s|\(|\b)((http(s?)://)|(www\.))(\w+[^\s\)\<]+)#i', $str, $matches))
    +		// Find and replace any URLs.
    +		if ($type !== 'email' && preg_match_all('#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#', $str, $matches, PREG_OFFSET_CAPTURE))
     		{
    -			$pop = ($popup) ? ' target="_blank" ' : '';
    -
    -			for ($i = 0, $c = count($matches[0]); $i < $c; $i++)
    +			// Set our target HTML if using popup links.
    +			$target = ($popup) ? 'target="_blank"' : '';
    +			
    +			// We process the links in reverse order (last -> first) so that
    +			// the returned string offsets from preg_match_all() are not
    +			// moved as we add more HTML.
    +			foreach (array_reverse($matches[0]) as $match)
     			{
    -				if (preg_match('/(\.|\,)$/i', $matches[6][$i], $m))
    -				{
    -					$punct = $m[1];
    -					$matches[6][$i] = substr($matches[6][$i], 0, -1);
    -				}
    -				else
    -				{
    -					$punct = '';
    -				}
    -
    -				$str = str_replace($matches[0][$i],
    -							$matches[1][$i].'http'
    -								.$matches[4][$i].'://'.$matches[5][$i]
    -								.$matches[6][$i].''.$punct,
    -							$str);
    +				// $match is an array generated by the PREG_OFFSET_CAPTURE flag.
    +				// $match[0] is the matched string, $match[1] is the string offset.
    +				
    +				$anchor = anchor($match[0], '', $target);
    +				
    +				$str = substr_replace($str, $anchor, $match[1], strlen($match[0]));
     			}
     		}
    -
    -		if ($type !== 'url' && preg_match_all('/([a-zA-Z0-9_\.\-\+]+)@([a-zA-Z0-9\-]+)\.([a-zA-Z0-9\-\.]+)/i', $str, $matches, PREG_OFFSET_CAPTURE))
    +		
    +		// Find and replace any emails.
    +		if ($type !== 'url' && preg_match_all('#([\w\.\-\+]+@[a-z0-9\-]+\.[a-z0-9\-\.]+[^[:punct:]\s])#i', $str, $matches, PREG_OFFSET_CAPTURE))
     		{
    -			for ($i = count($matches[0]) - 1; $i > -1; $i--)
    +			foreach (array_reverse($matches[0]) as $match)
     			{
    -				if (preg_match('/(\.|\,)$/i', $matches[3][$i][0], $m))
    +				if (filter_var($match[0], FILTER_VALIDATE_EMAIL) !== FALSE)
     				{
    -					$matches[3][$i][0] = substr($matches[3][$i][0], 0, -1);
    -				}
    -
    -				if (filter_var(($m = $matches[1][$i][0].'@'.$matches[2][$i][0].'.'.$matches[3][$i][0]), FILTER_VALIDATE_EMAIL) !== FALSE)
    -				{
    -					$str = substr_replace($str, safe_mailto($m), $matches[0][$i][1], strlen($m));
    +					$str = substr_replace($str, safe_mailto($match[0]), $match[1], strlen($match[0]));
     				}
     			}
     		}
    -
    +		
     		return $str;
     	}
     }
    
    From 3e6b58215a78f63f43a62c584a1386bda2a1f3e1 Mon Sep 17 00:00:00 2001
    From: Eric Roberts 
    Date: Thu, 17 Jan 2013 18:30:25 -0600
    Subject: [PATCH 2049/5397] Return spacing on var definitions.
    
    Signed-off-by: Eric Roberts 
    ---
     system/core/Output.php | 12 ++++++------
     1 file changed, 6 insertions(+), 6 deletions(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index 52a5518584c..e6c48b5dd85 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -58,21 +58,21 @@ class CI_Output {
     	 *
     	 * @var	array
     	 */
    -	public $headers = array();
    +	public $headers =	array();
     
     	/**
     	 * List of mime types
     	 *
     	 * @var	array
     	 */
    -	public $mimes = array();
    +	public $mimes =		array();
     
     	/**
     	 * Mime-type for the current page
     	 *
     	 * @var	string
     	 */
    -	protected $mime_type = 'text/html';
    +	protected $mime_type	= 'text/html';
     
     	/**
     	 * Enable Profiler flag
    @@ -86,14 +86,14 @@ class CI_Output {
     	 *
     	 * @var	bool
     	 */
    -	protected $_zlib_oc = FALSE;
    +	protected $_zlib_oc =		FALSE;
     
     	/**
     	 * List of profiler sections
     	 *
     	 * @var	array
     	 */
    -	protected $_profiler_sections = array();
    +	protected $_profiler_sections =	array();
     
     	/**
     	 * Parse markers flag
    @@ -102,7 +102,7 @@ class CI_Output {
     	 *
     	 * @var	bool
     	 */
    -	public $parse_exec_vars = TRUE;
    +	public $parse_exec_vars =	TRUE;
     
     	/**
     	 * Class constructor
    
    From 32a28f59a08c9fd24f0d884ecfa71bf8df4bbe97 Mon Sep 17 00:00:00 2001
    From: Eric Roberts 
    Date: Sat, 19 Jan 2013 02:59:14 -0600
    Subject: [PATCH 2050/5397] Remove whitespace from empty lines.
    
    Signed-off-by: Eric Roberts 
    ---
     system/helpers/url_helper.php | 10 +++++-----
     1 file changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php
    index 8be32727651..e54969b22ab 100644
    --- a/system/helpers/url_helper.php
    +++ b/system/helpers/url_helper.php
    @@ -388,7 +388,7 @@ function auto_link($str, $type = 'both', $popup = FALSE)
     		{
     			// Set our target HTML if using popup links.
     			$target = ($popup) ? 'target="_blank"' : '';
    -			
    +
     			// We process the links in reverse order (last -> first) so that
     			// the returned string offsets from preg_match_all() are not
     			// moved as we add more HTML.
    @@ -396,13 +396,13 @@ function auto_link($str, $type = 'both', $popup = FALSE)
     			{
     				// $match is an array generated by the PREG_OFFSET_CAPTURE flag.
     				// $match[0] is the matched string, $match[1] is the string offset.
    -				
    +
     				$anchor = anchor($match[0], '', $target);
    -				
    +
     				$str = substr_replace($str, $anchor, $match[1], strlen($match[0]));
     			}
     		}
    -		
    +
     		// Find and replace any emails.
     		if ($type !== 'url' && preg_match_all('#([\w\.\-\+]+@[a-z0-9\-]+\.[a-z0-9\-\.]+[^[:punct:]\s])#i', $str, $matches, PREG_OFFSET_CAPTURE))
     		{
    @@ -414,7 +414,7 @@ function auto_link($str, $type = 'both', $popup = FALSE)
     				}
     			}
     		}
    -		
    +
     		return $str;
     	}
     }
    
    From 5dc6d51091b718d37d2c4b30da1e01b5b95333f8 Mon Sep 17 00:00:00 2001
    From: Purwandi 
    Date: Sat, 19 Jan 2013 17:43:08 +0700
    Subject: [PATCH 2051/5397] Support minify table block
    
    ---
     system/core/Output.php | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/system/core/Output.php b/system/core/Output.php
    index e6c48b5dd85..cf5178a0ccb 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -543,7 +543,7 @@ public function _write_cache($output)
     		}
     
     		$expire = time() + ($this->cache_expiration * 60);
    -		
    +
     		// Put together our serialized info.
     		$cache_info = serialize(array(
     			'expire'	=> $expire,
    @@ -606,7 +606,7 @@ public function _display_cache(&$CFG, &$URI)
     		{
     			return FALSE;
     		}
    -		
    +
     		$cache_info = unserialize($match[1]);
     		$expire = $cache_info['expire'];
     
    @@ -625,7 +625,7 @@ public function _display_cache(&$CFG, &$URI)
     			// Or else send the HTTP cache control headers.
     			$this->set_cache_header($last_modified, $expire);
     		}
    -		
    +
     		// Add headers from cache file.
     		foreach ($cache_info['headers'] as $header)
     		{
    @@ -756,7 +756,7 @@ public function minify($output, $type = 'text/html')
     				$output = preg_replace('{\s*\s*}msU', '', $output);
     
     				// Remove spaces around block-level elements.
    -				$output = preg_replace('/\s*(<\/?(html|head|title|meta|script|link|style|body|h[1-6]|div|p|br)[^>]*>)\s*/is', '$1', $output);
    +				$output = preg_replace('/\s*(<\/?(html|head|title|meta|script|link|style|body|table|thead|tbody|tfoot|tr|th|td|h[1-6]|div|p|br)[^>]*>)\s*/is', '$1', $output);
     
     				// Replace mangled 
     etc. tags with unprocessed ones.
     
    
    From 1106c528b213f9f58f4b2d9be60f78ca8067236e Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Mon, 21 Jan 2013 15:14:04 +0200
    Subject: [PATCH 2052/5397] [ci skip] Add text/plain as a valid MIME for
     js,css,*html,xml
    
    ---
     application/config/mimes.php | 12 ++++++------
     1 file changed, 6 insertions(+), 6 deletions(-)
    
    diff --git a/application/config/mimes.php b/application/config/mimes.php
    index cced3ee02e0..124e4a43631 100644
    --- a/application/config/mimes.php
    +++ b/application/config/mimes.php
    @@ -73,7 +73,7 @@
     	'php3'	=>	'application/x-httpd-php',
     	'phtml'	=>	'application/x-httpd-php',
     	'phps'	=>	'application/x-httpd-php-source',
    -	'js'	=>	'application/x-javascript',
    +	'js'	=>	array('application/x-javascript', 'text/plain'),
     	'swf'	=>	'application/x-shockwave-flash',
     	'sit'	=>	'application/x-stuffit',
     	'tar'	=>	'application/x-tar',
    @@ -104,16 +104,16 @@
     	'png'	=>	array('image/png',  'image/x-png'),
     	'tiff'	=>	'image/tiff',
     	'tif'	=>	'image/tiff',
    -	'css'	=>	'text/css',
    -	'html'	=>	'text/html',
    -	'htm'	=>	'text/html',
    -	'shtml'	=>	'text/html',
    +	'css'	=>	array('text/css', 'text/plain'),
    +	'html'	=>	array('text/html', 'text/plain'),
    +	'htm'	=>	array('text/html', 'text/plain'),
    +	'shtml'	=>	array('text/html', 'text/plain'),
     	'txt'	=>	'text/plain',
     	'text'	=>	'text/plain',
     	'log'	=>	array('text/plain', 'text/x-log'),
     	'rtx'	=>	'text/richtext',
     	'rtf'	=>	'text/rtf',
    -	'xml'	=>	array('application/xml', 'text/xml'),
    +	'xml'	=>	array('application/xml', 'text/xml', 'text/plain'),
     	'xsl'	=>	array('application/xml', 'text/xsl', 'text/xml'),
     	'mpeg'	=>	'video/mpeg',
     	'mpg'	=>	'video/mpeg',
    
    From 3ffce987e0d7efa68bbce2d83915b06e97bd3475 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Mon, 21 Jan 2013 15:24:09 +0200
    Subject: [PATCH 2053/5397] [ci skip] Manually apply #2162, #2163
    
    ---
     application/config/user_agents.php | 3 ++-
     system/core/Output.php             | 2 +-
     2 files changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/application/config/user_agents.php b/application/config/user_agents.php
    index 7f86d2dfcb0..35c36cb42b7 100644
    --- a/application/config/user_agents.php
    +++ b/application/config/user_agents.php
    @@ -101,7 +101,8 @@
     	'Links'			=> 'Links',
     	'hotjava'		=> 'HotJava',
     	'amaya'			=> 'Amaya',
    -	'IBrowse'		=> 'IBrowse'
    +	'IBrowse'		=> 'IBrowse',
    +	'Maxthon'		=> 'Maxthon'
     );
     
     $mobiles = array(
    diff --git a/system/core/Output.php b/system/core/Output.php
    index cf5178a0ccb..a2084146329 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -772,7 +772,7 @@ public function minify($output, $type = 'text/html')
     					$output = str_replace($codes_messed[0], $codes_clean[0], $output);
     				}
     
    -				if ( ! empty($codes_clean))
    +				if ( ! empty($textareas_clean))
     				{
     					preg_match_all('{}msU', $output, $textareas_messed);
     					$output = str_replace($textareas_messed[0], $textareas_clean[0], $output);
    
    From 9f690f190f1aa503dfc6270e3a97d96196ae3cff Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Mon, 21 Jan 2013 15:30:25 +0200
    Subject: [PATCH 2054/5397] Partially implement PR #2155
    
    ---
     system/core/Log.php                 | 2 ++
     user_guide_src/source/changelog.rst | 1 +
     2 files changed, 3 insertions(+)
    
    diff --git a/system/core/Log.php b/system/core/Log.php
    index 9dabfe6f255..cd3c17e1e62 100644
    --- a/system/core/Log.php
    +++ b/system/core/Log.php
    @@ -97,6 +97,8 @@ public function __construct()
     
     		$this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/';
     
    +		file_exists($this->_log_path) OR mkdir($this->_log_path, DIR_WRITE_MODE, TRUE);
    +
     		if ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path))
     		{
     			$this->_enabled = FALSE;
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index 98999992903..f6dad07b3e9 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -321,6 +321,7 @@ Release Date: Not Released
     	 -  Changed method ``load()`` to filter the language name with ``ctype_digit()``.
     	 -  Added an optional second parameter to method ``line()`` to disable error login for line keys that were not found.
     	 -  Language files are now loaded in a cascading style with the one in **system/** always loaded and overriden afterwards, if another one is found.
    +   -  Log Library will now try to create the **log_path** directory if it doesn't exist.
     
     Bug fixes for 3.0
     ------------------
    
    From 4de1198ccf88d4a448ff752f35630228b60c53a8 Mon Sep 17 00:00:00 2001
    From: Eric Roberts 
    Date: Mon, 21 Jan 2013 16:47:22 -0600
    Subject: [PATCH 2055/5397] Adjust regex.
    
    ---
     system/helpers/url_helper.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php
    index e54969b22ab..a6536cf81da 100644
    --- a/system/helpers/url_helper.php
    +++ b/system/helpers/url_helper.php
    @@ -384,7 +384,7 @@ function safe_mailto($email, $title = '', $attributes = '')
     	function auto_link($str, $type = 'both', $popup = FALSE)
     	{
     		// Find and replace any URLs.
    -		if ($type !== 'email' && preg_match_all('#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#', $str, $matches, PREG_OFFSET_CAPTURE))
    +		if ($type !== 'email' && preg_match_all('#\b(([\w-]+://?|www\.)[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#', $str, $matches, PREG_OFFSET_CAPTURE))
     		{
     			// Set our target HTML if using popup links.
     			$target = ($popup) ? 'target="_blank"' : '';
    
    From cdd80bf46bf2e75a127e4104ff3aa13fab59e3d5 Mon Sep 17 00:00:00 2001
    From: OsamaAbbas 
    Date: Wed, 23 Jan 2013 04:46:24 +0200
    Subject: [PATCH 2056/5397] Update application/config/config.php
    
    ---
     application/config/config.php | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/application/config/config.php b/application/config/config.php
    index a4ef1913723..bd4aad73d7d 100644
    --- a/application/config/config.php
    +++ b/application/config/config.php
    @@ -241,7 +241,7 @@
     |--------------------------------------------------------------------------
     |
     | Leave this BLANK unless you would like to set something other than the default
    -| system/cache/ folder.  Use a full server path with trailing slash.
    +| application/cache/ folder.  Use a full server path with trailing slash.
     |
     */
     $config['cache_path'] = '';
    @@ -421,4 +421,4 @@
     
     
     /* End of file config.php */
    -/* Location: ./application/config/config.php */
    \ No newline at end of file
    +/* Location: ./application/config/config.php */
    
    From 3b1e6e677a1c558f1ab99f8cfde9b766fffa648d Mon Sep 17 00:00:00 2001
    From: Melvin Lammerts 
    Date: Wed, 23 Jan 2013 22:46:16 +0100
    Subject: [PATCH 2057/5397] Removed slash from URI helper doc
    
    In my current projects I don't see '/controller/method' but 'controller/method' when calling uri_string().
    ---
     user_guide_src/source/helpers/url_helper.rst | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/user_guide_src/source/helpers/url_helper.rst b/user_guide_src/source/helpers/url_helper.rst
    index 5b8fa5f4440..0afa7efd874 100644
    --- a/user_guide_src/source/helpers/url_helper.rst
    +++ b/user_guide_src/source/helpers/url_helper.rst
    @@ -110,7 +110,7 @@ For example, if your URL was this::
     
     The function would return::
     
    -	/blog/comments/123
    +	blog/comments/123
     
     This function is an alias for ``CI_Config::uri_string()``. For more info,
     please see the :doc:`Config Library <../libraries/config>` documentation.
    @@ -380,4 +380,4 @@ engine purposes. The default Response Code is 302. The third parameter is
     	will *automatically* be selected when the page is currently accessed
     	via POST and HTTP/1.1 is used.
     
    -.. important:: This function will terminate script execution.
    \ No newline at end of file
    +.. important:: This function will terminate script execution.
    
    From 1a0014941dcf399e97d3586bd6d3382166b413dd Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Thu, 24 Jan 2013 11:32:29 +0200
    Subject: [PATCH 2058/5397] Move db_select() call from
     CI_DB_driver::initialize() to db_connect() so that it's only called by
     drivers that need it ('mysql', 'mssql').
    
    As proposed in issue #2187.
    ---
     application/config/config.php                  |  2 +-
     system/database/DB_driver.php                  | 14 --------------
     system/database/drivers/mssql/mssql_driver.php | 12 ++++++++++++
     system/database/drivers/mysql/mysql_driver.php | 16 +++++++++++++++-
     user_guide_src/source/changelog.rst            |  1 +
     user_guide_src/source/helpers/url_helper.rst   |  2 +-
     6 files changed, 30 insertions(+), 17 deletions(-)
    
    diff --git a/application/config/config.php b/application/config/config.php
    index bd4aad73d7d..415474e063d 100644
    --- a/application/config/config.php
    +++ b/application/config/config.php
    @@ -421,4 +421,4 @@
     
     
     /* End of file config.php */
    -/* Location: ./application/config/config.php */
    +/* Location: ./application/config/config.php */
    \ No newline at end of file
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index 26791398a03..35ac8e87049 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -428,20 +428,6 @@ public function initialize()
     			}
     		}
     
    -		// ----------------------------------------------------------------
    -
    -		// Select the DB... assuming a database name is specified in the config file
    -		if ($this->database !== '' && ! $this->db_select())
    -		{
    -			log_message('error', 'Unable to select database: '.$this->database);
    -
    -			if ($this->db_debug)
    -			{
    -				$this->display_error('db_unable_to_select', $this->database);
    -			}
    -			return FALSE;
    -		}
    -
     		// Now we set the character set and that's all
     		return $this->db_set_charset($this->char_set);
     	}
    diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php
    index f60071ed9ff..0836fa80243 100644
    --- a/system/database/drivers/mssql/mssql_driver.php
    +++ b/system/database/drivers/mssql/mssql_driver.php
    @@ -106,6 +106,18 @@ public function db_connect($persistent = FALSE)
     			return FALSE;
     		}
     
    +		// ----------------------------------------------------------------
    +
    +		// Select the DB... assuming a database name is specified in the config file
    +		if ($this->database !== '' && ! $this->db_select())
    +		{
    +			log_message('error', 'Unable to select database: '.$this->database);
    +
    +			return ($this->db_debug === TRUE)
    +				? $this->display_error('db_unable_to_select', $this->database)
    +				: FALSE;
    +		}
    +
     		// Determine how identifiers are escaped
     		$query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi');
     		$query = $query->row_array();
    diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php
    index 492b07861ca..95003f648fe 100644
    --- a/system/database/drivers/mysql/mysql_driver.php
    +++ b/system/database/drivers/mysql/mysql_driver.php
    @@ -110,9 +110,23 @@ public function db_connect($persistent = FALSE)
     			$client_flags = $client_flags | MYSQL_CLIENT_SSL;
     		}
     
    -		return ($persistent === TRUE)
    +		$this->conn_id = ($persistent === TRUE)
     			? @mysql_pconnect($this->hostname, $this->username, $this->password, $client_flags)
     			: @mysql_connect($this->hostname, $this->username, $this->password, TRUE, $client_flags);
    +
    +		// ----------------------------------------------------------------
    +
    +		// Select the DB... assuming a database name is specified in the config file
    +		if ($this->database !== '' && ! $this->db_select())
    +		{
    +			log_message('error', 'Unable to select database: '.$this->database);
    +
    +			return ($this->db_debug === TRUE)
    +				? $this->display_error('db_unable_to_select', $this->database)
    +				: FALSE;
    +		}
    +
    +		return $this->conn_id;
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
    index f6dad07b3e9..8b9ec2539ce 100644
    --- a/user_guide_src/source/changelog.rst
    +++ b/user_guide_src/source/changelog.rst
    @@ -112,6 +112,7 @@ Release Date: Not Released
        -  Updated ``escape_identifiers()`` to accept an array of fields as well as strings.
        -  MySQL and MySQLi drivers now require at least MySQL version 5.1.
        -  ``db_set_charset()`` now only requires one parameter (collation was only needed due to legacy support for MySQL versions prior to 5.1).
    +   -  ``db_select()`` will now always (if required by the driver) be called by ``db_connect()`` / ``db_pconnect()`` instead of only when initializing.
        -  Replaced the ``_error_message()`` and ``_error_number()`` methods with ``error()``, which returns an array containing the last database error code and message.
        -  Improved ``version()`` implementation so that drivers that have a native function to get the version number don't have to be defined in the core ``DB_driver`` class.
        -  Added capability for packages to hold *config/database.php* config files.
    diff --git a/user_guide_src/source/helpers/url_helper.rst b/user_guide_src/source/helpers/url_helper.rst
    index 0afa7efd874..8b5361f94de 100644
    --- a/user_guide_src/source/helpers/url_helper.rst
    +++ b/user_guide_src/source/helpers/url_helper.rst
    @@ -380,4 +380,4 @@ engine purposes. The default Response Code is 302. The third parameter is
     	will *automatically* be selected when the page is currently accessed
     	via POST and HTTP/1.1 is used.
     
    -.. important:: This function will terminate script execution.
    +.. important:: This function will terminate script execution.
    \ No newline at end of file
    
    From 353f9834adf3f44c6c7a0f924089bb2b43360404 Mon Sep 17 00:00:00 2001
    From: Daniel Hunsaker 
    Date: Thu, 24 Jan 2013 17:09:10 -0700
    Subject: [PATCH 2059/5397] Updated all cases of exit() to return a valid code
    
    Specific codes are as follows, but can easily be changed if a different order/breakdown makes more sense:
    
    - 0: Success; everything executed as planned
    - 1: Configuration Error; something is wrong with/in the configuration file(s)
    - 2: Class Not Found; what it says
    - 3: Driver Method Unsupported; the method you're trying to use on a Driver doesn't exist
    - 4: File Not Found; 404 error
    - 5: Database Error; something is broken in the database somewhere
    - 6: Invalid Input; the user attempted to submit a request with invlaid characters in 1+ key names
    7 through 26 are reserved for future use
    - 27: Generic Error; generated by show_error() when the status code is >= 100
    28 through 127 are errors generated by user applications, normally by using show_error() with a status code below 100
    128 through 254 should not be used by applications, as they are reserved by system-level functions
    - 255: PHP Fatal Error; automatically generated by PHP for fatal errors, and therefore not allowed for our use
    
    Status codes below 100 are shifted up by 28 to place them in the user error range.  It may make more sense to have these codes
    left alone and instead shift the CI errors into the 101 through 127 space, but that's not what I opted for here.
    
    It would probably also be a good idea to replace the hard-coded numbers with constants or some such, but I was in a bit of a
    hurry when I made these changes, so I didn't look around for the best place to do this.  With proper guidance, I could
    easily amend this commit with another that uses such constant values.
    
    Signed-off-by: Daniel Hunsaker 
    ---
     system/core/CodeIgniter.php        |  2 +-
     system/core/Common.php             | 29 ++++++++++++++++++++++-------
     system/core/Exceptions.php         |  2 +-
     system/core/Input.php              |  3 ++-
     system/core/Output.php             |  2 +-
     system/database/DB_driver.php      |  2 +-
     system/helpers/download_helper.php |  5 +++--
     system/helpers/url_helper.php      |  2 +-
     system/libraries/Driver.php        |  2 +-
     system/libraries/Trackback.php     |  4 ++--
     system/libraries/Xmlrpcs.php       |  3 ++-
     11 files changed, 37 insertions(+), 19 deletions(-)
    
    diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php
    index 8affde64da2..13826c328e8 100644
    --- a/system/core/CodeIgniter.php
    +++ b/system/core/CodeIgniter.php
    @@ -188,7 +188,7 @@
     	if ($EXT->call_hook('cache_override') === FALSE
     		&& $OUT->_display_cache($CFG, $URI) === TRUE)
     	{
    -		exit;
    +		exit(0);
     	}
     
     /*
    diff --git a/system/core/Common.php b/system/core/Common.php
    index d494caf80aa..d6387209bb0 100644
    --- a/system/core/Common.php
    +++ b/system/core/Common.php
    @@ -1,3 +1,4 @@
    +
     show_error($heading, $message, 'error_general', $status_code);
    -		exit;
    +		exit($exit_status);
     	}
     }
     
    @@ -392,7 +407,7 @@ function show_404($page = '', $log_error = TRUE)
     	{
     		$_error =& load_class('Exceptions', 'core');
     		$_error->show_404($page, $log_error);
    -		exit;
    +		exit(4);
     	}
     }
     
    @@ -514,11 +529,11 @@ function set_status_header($code = 200, $text = '')
     
     		if (strpos(php_sapi_name(), 'cgi') === 0)
     		{
    -			header('Status: '.$code.' '.$text, TRUE);
    +			if (!headers_sent()) header('Status: '.$code.' '.$text, TRUE);
     		}
     		else
     		{
    -			header(($server_protocol ? $server_protocol : 'HTTP/1.1').' '.$code.' '.$text, TRUE, $code);
    +			if (!headers_sent()) header(($server_protocol ? $server_protocol : 'HTTP/1.1').' '.$code.' '.$text, TRUE, $code);
     		}
     	}
     }
    diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php
    index e6023e73bbc..f799d6027ae 100644
    --- a/system/core/Exceptions.php
    +++ b/system/core/Exceptions.php
    @@ -117,7 +117,7 @@ public function show_404($page = '', $log_error = TRUE)
     		}
     
     		echo $this->show_error($heading, $message, 'error_404', 404);
    -		exit;
    +		exit(4);
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/core/Input.php b/system/core/Input.php
    index 82e22dd49d1..8f37e446428 100644
    --- a/system/core/Input.php
    +++ b/system/core/Input.php
    @@ -745,7 +745,8 @@ protected function _clean_input_keys($str)
     		if ( ! preg_match('/^[a-z0-9:_\/|-]+$/i', $str))
     		{
     			set_status_header(503);
    -			exit('Disallowed Key Characters.');
    +			echo 'Disallowed Key Characters.';
    +			exit(6);
     		}
     
     		// Clean UTF-8 if supported
    diff --git a/system/core/Output.php b/system/core/Output.php
    index a2084146329..7898d1972b7 100644
    --- a/system/core/Output.php
    +++ b/system/core/Output.php
    @@ -696,7 +696,7 @@ public function set_cache_header($last_modified, $expiration)
     		if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))
     		{
     			$this->set_status_header(304);
    -			exit;
    +			exit(0);
     		}
     		else
     		{
    diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
    index 35ac8e87049..cb2ef4ac8a2 100644
    --- a/system/database/DB_driver.php
    +++ b/system/database/DB_driver.php
    @@ -1658,7 +1658,7 @@ public function display_error($error = '', $swap = '', $native = FALSE)
     
     		$error =& load_class('Exceptions', 'core');
     		echo $error->show_error($heading, $message, 'error_db');
    -		exit;
    +		exit(5);
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php
    index 7294d50c5be..d7691cb61a3 100644
    --- a/system/helpers/download_helper.php
    +++ b/system/helpers/download_helper.php
    @@ -141,7 +141,8 @@ function force_download($filename = '', $data = '', $set_mime = FALSE)
     		// If we have raw data - just dump it
     		if ($data !== NULL)
     		{
    -			exit($data);
    +			echo $data;
    +			exit(0);
     		}
     
     		// Flush 1MB chunks of data
    @@ -151,7 +152,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE)
     		}
     
     		fclose($fp);
    -		exit;
    +		exit(0);
     	}
     }
     
    diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php
    index a6536cf81da..9a015354251 100644
    --- a/system/helpers/url_helper.php
    +++ b/system/helpers/url_helper.php
    @@ -549,7 +549,7 @@ function redirect($uri = '', $method = 'auto', $code = NULL)
     				header('Location: '.$uri, TRUE, $code);
     				break;
     		}
    -		exit;
    +		exit(0);
     	}
     }
     
    diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php
    index 4b35dce7313..bb731899157 100644
    --- a/system/libraries/Driver.php
    +++ b/system/libraries/Driver.php
    @@ -291,7 +291,7 @@ public function __call($method, $args = array())
     
     		$trace = debug_backtrace();
     		_exception_handler(E_ERROR, "No such method '{$method}'", $trace[1]['file'], $trace[1]['line']);
    -		exit;
    +		exit(3);
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php
    index ecc7129e3ff..cc93b2e301c 100644
    --- a/system/libraries/Trackback.php
    +++ b/system/libraries/Trackback.php
    @@ -212,7 +212,7 @@ public function receive()
     	public function send_error($message = 'Incomplete Information')
     	{
     		echo '\n\n1\n".$message."\n";
    -		exit;
    +		exit(0);
     	}
     
     	// --------------------------------------------------------------------
    @@ -228,7 +228,7 @@ public function send_error($message = 'Incomplete Information')
     	public function send_success()
     	{
     		echo '\n\n0\n";
    -		exit;
    +		exit(0);
     	}
     
     	// --------------------------------------------------------------------
    diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php
    index d4524d23002..465a1967bc2 100644
    --- a/system/libraries/Xmlrpcs.php
    +++ b/system/libraries/Xmlrpcs.php
    @@ -170,7 +170,8 @@ public function serve()
     
     		header('Content-Type: text/xml');
     		header('Content-Length: '.strlen($payload));
    -		exit($payload);
    +		echo $payload;
    +		exit(0);
     	}
     
     	// --------------------------------------------------------------------
    
    From edc9afa09b01f67089f121ed7054fe3a5a3b8ec2 Mon Sep 17 00:00:00 2001
    From: Edwin Aw 
    Date: Fri, 25 Jan 2013 16:12:20 +0800
    Subject: [PATCH 2060/5397] Fix issue #2191.
    
    Signed-off-by: Edwin Aw 
    ---
     system/libraries/Cart.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php
    index 8734d777496..d64f6f042d4 100644
    --- a/system/libraries/Cart.php
    +++ b/system/libraries/Cart.php
    @@ -95,7 +95,7 @@ public function __construct($params = array())
     		$config = is_array($params) ? $params : array();
     
     		// Load the Sessions class
    -		$this->CI->load->library('session', $config);
    +		$this->CI->load->driver('session', $config);
     
     		// Grab the shopping cart array from the session table
     		$this->_cart_contents = $this->CI->session->userdata('cart_contents');
    
    From 16c6d7e8ab6b161d11c0e8dbca7dbbef58b49138 Mon Sep 17 00:00:00 2001
    From: vlakoff 
    Date: Sat, 26 Jan 2013 17:21:29 +0100
    Subject: [PATCH 2061/5397] Fix a code comment in Image_lib
    
    constant FILE_WRITE_MODE contains octal 0666
    ---
     system/libraries/Image_lib.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php
    index 6d5493696e5..0cec43fc4c2 100644
    --- a/system/libraries/Image_lib.php
    +++ b/system/libraries/Image_lib.php
    @@ -810,7 +810,7 @@ public function image_process_gd($action = 'resize')
     		imagedestroy($dst_img);
     		imagedestroy($src_img);
     
    -		// Set the file to 777
    +		// Set the file to 666
     		@chmod($this->full_dst_path, FILE_WRITE_MODE);
     
     		return TRUE;
    
    From cabead10ac1e9d2aee0cc8bd5270061e75aec179 Mon Sep 17 00:00:00 2001
    From: rebornishard 
    Date: Sun, 27 Jan 2013 01:58:55 +0700
    Subject: [PATCH 2062/5397] Add webm mime type
    
    http://www.webmproject.org/about/faq/
    ---
     application/config/mimes.php | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/application/config/mimes.php b/application/config/mimes.php
    index 124e4a43631..d9e81bf778b 100644
    --- a/application/config/mimes.php
    +++ b/application/config/mimes.php
    @@ -154,6 +154,7 @@
     	'mp4'   =>	'video/mp4',
     	'm4a'   =>	'audio/x-m4a',
     	'f4v'   =>	'video/mp4',
    +	'webm'	=>	'video/webm'
     	'aac'   =>	'audio/x-acc',
     	'm4u'   =>	'application/vnd.mpegurl',
     	'm3u'   =>	'text/plain',
    @@ -175,4 +176,4 @@
     );
     
     /* End of file mimes.php */
    -/* Location: ./application/config/mimes.php */
    \ No newline at end of file
    +/* Location: ./application/config/mimes.php */
    
    From 14c8defb73fb29282ba55d3aa444e2ce6d59fd1c Mon Sep 17 00:00:00 2001
    From: dontforget 
    Date: Sun, 27 Jan 2013 10:42:56 -0800
    Subject: [PATCH 2063/5397] Fixing issue with comma
    
    ---
     application/config/mimes.php | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/application/config/mimes.php b/application/config/mimes.php
    index d9e81bf778b..ac7bfaf34e2 100644
    --- a/application/config/mimes.php
    +++ b/application/config/mimes.php
    @@ -154,7 +154,7 @@
     	'mp4'   =>	'video/mp4',
     	'm4a'   =>	'audio/x-m4a',
     	'f4v'   =>	'video/mp4',
    -	'webm'	=>	'video/webm'
    +	'webm'	=>	'video/webm',
     	'aac'   =>	'audio/x-acc',
     	'm4u'   =>	'application/vnd.mpegurl',
     	'm3u'   =>	'text/plain',
    
    From b75e13df03dcf898cc85e144b941e1b1f6c332be Mon Sep 17 00:00:00 2001
    From: Eric Roberts 
    Date: Sun, 27 Jan 2013 20:10:09 -0600
    Subject: [PATCH 2064/5397] Fix newline standardization.
    
    Signed-off-by: Eric Roberts 
    ---
     system/core/Input.php | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/system/core/Input.php b/system/core/Input.php
    index 82e22dd49d1..68a8fe03f2f 100644
    --- a/system/core/Input.php
    +++ b/system/core/Input.php
    @@ -720,9 +720,9 @@ protected function _clean_input_data($str)
     		}
     
     		// Standardize newlines if needed
    -		if ($this->_standardize_newlines === TRUE && strpos($str, "\r") !== FALSE)
    +		if ($this->_standardize_newlines === TRUE)
     		{
    -			return str_replace(array("\r\n", "\r", "\r\n\n"), PHP_EOL, $str);
    +			return preg_replace('/(?:\r\n|[\r\n])/', PHP_EOL, $str);
     		}
     
     		return $str;
    
    From db529ca1e13e9f9e1c73be20c3b92a7adc3c6aa2 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Mon, 28 Jan 2013 11:00:02 +0200
    Subject: [PATCH 2065/5397] Remove unnecessary defined('ENVIRONMENT') checks
    
    As suggested in issue #2134 & PR #2149
    ---
     application/config/mimes.php     | 2 +-
     system/core/CodeIgniter.php      | 2 +-
     system/core/Common.php           | 4 ++--
     system/core/Config.php           | 6 +-----
     system/core/Hooks.php            | 2 +-
     system/core/Loader.php           | 6 +++---
     system/core/Router.php           | 2 +-
     system/database/DB.php           | 2 +-
     system/helpers/html_helper.php   | 2 +-
     system/helpers/smiley_helper.php | 2 +-
     system/helpers/text_helper.php   | 2 +-
     system/libraries/User_agent.php  | 2 +-
     12 files changed, 15 insertions(+), 19 deletions(-)
    
    diff --git a/application/config/mimes.php b/application/config/mimes.php
    index ac7bfaf34e2..dfa9f24e4f9 100644
    --- a/application/config/mimes.php
    +++ b/application/config/mimes.php
    @@ -176,4 +176,4 @@
     );
     
     /* End of file mimes.php */
    -/* Location: ./application/config/mimes.php */
    +/* Location: ./application/config/mimes.php */
    \ No newline at end of file
    diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php
    index 8affde64da2..cb4b735d521 100644
    --- a/system/core/CodeIgniter.php
    +++ b/system/core/CodeIgniter.php
    @@ -58,7 +58,7 @@
      *  Load the framework constants
      * ------------------------------------------------------
      */
    -	if (defined('ENVIRONMENT') && file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php'))
    +	if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php'))
     	{
     		require(APPPATH.'config/'.ENVIRONMENT.'/constants.php');
     	}
    diff --git a/system/core/Common.php b/system/core/Common.php
    index d494caf80aa..90cc5b3a4e7 100644
    --- a/system/core/Common.php
    +++ b/system/core/Common.php
    @@ -241,7 +241,7 @@ function &get_config($replace = array())
     		}
     
     		// Is the config file in the environment folder?
    -		if (defined('ENVIRONMENT') && file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php'))
    +		if (file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php'))
     		{
     			require($file_path);
     		}
    @@ -316,7 +316,7 @@ function &get_mimes()
     	{
     		static $_mimes = array();
     
    -		if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'))
    +		if (is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'))
     		{
     			$_mimes = include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php');
     		}
    diff --git a/system/core/Config.php b/system/core/Config.php
    index 0160d1a15f0..7e64444bc4e 100644
    --- a/system/core/Config.php
    +++ b/system/core/Config.php
    @@ -106,13 +106,9 @@ public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE
     		$file = ($file === '') ? 'config' : str_replace('.php', '', $file);
     		$found = $loaded = FALSE;
     
    -		$check_locations = defined('ENVIRONMENT')
    -			? array(ENVIRONMENT.'/'.$file, $file)
    -			: array($file);
    -
     		foreach ($this->_config_paths as $path)
     		{
    -			foreach ($check_locations as $location)
    +			foreach (array(ENVIRONMENT.'/'.$file, $file) as $location)
     			{
     				$file_path = $path.'config/'.$location.'.php';
     
    diff --git a/system/core/Hooks.php b/system/core/Hooks.php
    index 2cb416c0cdd..59759e02e4e 100644
    --- a/system/core/Hooks.php
    +++ b/system/core/Hooks.php
    @@ -81,7 +81,7 @@ public function __construct()
     		}
     
     		// Grab the "hooks" definition file.
    -		if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'))
    +		if (is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'))
     		{
     			include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php');
     		}
    diff --git a/system/core/Loader.php b/system/core/Loader.php
    index 1ad07f1fac5..bbd7a84b605 100644
    --- a/system/core/Loader.php
    +++ b/system/core/Loader.php
    @@ -1089,12 +1089,12 @@ protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object
     					// We test for both uppercase and lowercase, for servers that
     					// are case-sensitive with regard to file names. Check for environment
     					// first, global next
    -					if (defined('ENVIRONMENT') && file_exists($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'))
    +					if (file_exists($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'))
     					{
     						include($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php');
     						break;
     					}
    -					elseif (defined('ENVIRONMENT') && file_exists($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'))
    +					elseif (file_exists($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'))
     					{
     						include($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php');
     						break;
    @@ -1180,7 +1180,7 @@ protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object
     	 */
     	protected function _ci_autoloader()
     	{
    -		if (defined('ENVIRONMENT') && file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))
    +		if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))
     		{
     			include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php');
     		}
    diff --git a/system/core/Router.php b/system/core/Router.php
    index f284e29cc2b..4755b3712e5 100644
    --- a/system/core/Router.php
    +++ b/system/core/Router.php
    @@ -133,7 +133,7 @@ public function _set_routing()
     		}
     
     		// Load the routes.php file.
    -		if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
    +		if (is_file(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
     		{
     			include(APPPATH.'config/'.ENVIRONMENT.'/routes.php');
     		}
    diff --git a/system/database/DB.php b/system/database/DB.php
    index f94685c51d0..d9104747f39 100644
    --- a/system/database/DB.php
    +++ b/system/database/DB.php
    @@ -43,7 +43,7 @@ function &DB($params = '', $query_builder_override = NULL)
     	if (is_string($params) && 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/'.ENVIRONMENT.'/database.php')
     			&& ! file_exists($file_path = APPPATH.'config/database.php'))
     		{
     			show_error('The configuration file database.php does not exist.');
    diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php
    index 2d474169bb3..7a71eb82b65 100644
    --- a/system/helpers/html_helper.php
    +++ b/system/helpers/html_helper.php
    @@ -242,7 +242,7 @@ function doctype($type = 'xhtml1-strict')
     
     		if ( ! is_array($_doctypes))
     		{
    -			if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php'))
    +			if (is_file(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php'))
     			{
     				include(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php');
     			}
    diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php
    index 186b24ce95f..c2f50ec7398 100644
    --- a/system/helpers/smiley_helper.php
    +++ b/system/helpers/smiley_helper.php
    @@ -213,7 +213,7 @@ function parse_smileys($str = '', $image_url = '', $smileys = NULL)
     	 */
     	function _get_smiley_array()
     	{
    -		if (defined('ENVIRONMENT') && file_exists(APPPATH.'config/'.ENVIRONMENT.'/smileys.php'))
    +		if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/smileys.php'))
     		{
     			include(APPPATH.'config/'.ENVIRONMENT.'/smileys.php');
     		}
    diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php
    index 1c7eeaf5fad..c255c15a8df 100644
    --- a/system/helpers/text_helper.php
    +++ b/system/helpers/text_helper.php
    @@ -367,7 +367,7 @@ function convert_accented_characters($str)
     
     		if ( ! isset($foreign_characters) OR ! is_array($foreign_characters))
     		{
    -			if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php'))
    +			if (is_file(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php'))
     			{
     				include(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php');
     			}
    diff --git a/system/libraries/User_agent.php b/system/libraries/User_agent.php
    index 1f4b2fa524b..3fe2e0519bf 100644
    --- a/system/libraries/User_agent.php
    +++ b/system/libraries/User_agent.php
    @@ -175,7 +175,7 @@ public function __construct()
     	 */
     	protected function _load_agent_file()
     	{
    -		if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php'))
    +		if (is_file(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php'))
     		{
     			include(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php');
     		}
    
    From 763847931d421753f503608018b0da2bbaa9bfd6 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Mon, 28 Jan 2013 11:22:05 +0200
    Subject: [PATCH 2066/5397] Add ENVIRONMENT constant to unit tests
    
    ---
     tests/Bootstrap.php | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php
    index 8ce80b3fdfb..c98d88531af 100644
    --- a/tests/Bootstrap.php
    +++ b/tests/Bootstrap.php
    @@ -32,6 +32,7 @@ class_alias('org\bovigo\vfs\vfsStreamWrapper', 'vfsStreamWrapper');
     defined('BASEPATH') OR define('BASEPATH', vfsStream::url('system/'));
     defined('APPPATH') OR define('APPPATH', vfsStream::url('application/'));
     defined('VIEWPATH') OR define('VIEWPATH', APPPATH.'views/');
    +defined('ENVIRONMENT') OR define('ENVIRONMENT', 'development');
     
     // Set localhost "remote" IP
     isset($_SERVER['REMOTE_ADDR']) OR $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
    
    From 9f3a590751da2003698546c205a93fcc9c3325f8 Mon Sep 17 00:00:00 2001
    From: Eric Roberts 
    Date: Mon, 28 Jan 2013 04:29:06 -0600
    Subject: [PATCH 2067/5397] Multiple pagination bug fixes & optimizations.
    
    Signed-off-by: Eric Roberts 
    ---
     system/libraries/Pagination.php | 190 ++++++++++++++++++--------------
     1 file changed, 107 insertions(+), 83 deletions(-)
    
    diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php
    index d139980d80b..3a513a7c12b 100644
    --- a/system/libraries/Pagination.php
    +++ b/system/libraries/Pagination.php
    @@ -133,7 +133,7 @@ class CI_Pagination {
     	 *
     	 * @var	int
     	 */
    -	protected $uri_segment		= 3;
    +	protected $uri_segment		= 0;
     
     	/**
     	 * Full tag open
    @@ -318,11 +318,9 @@ public function __construct($params = array())
     	 */
     	public function initialize($params = array())
     	{
    -		$attributes = array();
    -
     		if (isset($params['attributes']) && is_array($params['attributes']))
     		{
    -			$attributes = $params['attributes'];
    +			$this->_parse_attributes($params['attributes']);
     			unset($params['attributes']);
     		}
     
    @@ -334,8 +332,6 @@ public function initialize($params = array())
     			unset($params['anchor_class']);
     		}
     
    -		$this->_parse_attributes($attributes);
    -
     		if (count($params) > 0)
     		{
     			foreach ($params as $key => $val)
    @@ -372,45 +368,111 @@ public function create_links()
     			return '';
     		}
     
    -		// Set the base page index for starting page number
    -		$base_page = ($this->use_page_numbers) ? 1 : 0;
    +		// Check the user defined number of links.
    +		$this->num_links = (int) $this->num_links;
    +
    +		if ($this->num_links < 1)
    +		{
    +			show_error('Your number of links must be a positive number.');
    +		}
     
    -		// Determine the current page number.
     		$CI =& get_instance();
     
    -		// See if we are using a prefix or suffix on links
    -		if ($this->prefix !== '' OR $this->suffix !== '')
    +		// Keep any existing query string items.
    +		// Note: Has nothing to do with any other query string option.
    +		$get = array();
    +
    +		if ($this->reuse_query_string === TRUE)
     		{
    -			$this->cur_page = (int) str_replace(array($this->prefix, $this->suffix), '', $CI->uri->rsegment($this->uri_segment));
    +			$get = $CI->input->get();
    +
    +			// Unset the controll, method, old-school routing options
    +			unset($get['c'], $get['m'], $get[$this->query_string_segment]);
     		}
     
    +		// Put together our base and first URLs.
    +		$this->base_url = trim($this->base_url);
    +
    +		$query_string = '';
    +		$query_string_sep = (strpos($this->base_url, '?') === FALSE) ? '?' : '&';
    +
    +		// Are we using query strings?
     		if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
     		{
    -			if ($CI->input->get($this->query_string_segment) != $base_page)
    +			// If a custom first_url hasn't been specified, we'll create one from
    +			// the base_url, but without the page item.
    +			if ($this->first_url === '')
     			{
    -				$this->cur_page = (int) $CI->input->get($this->query_string_segment);
    +				$this->first_url = $this->base_url;
    +
    +				// If we saved any GET items earlier, make sure they're appended.
    +				if ( ! empty($get))
    +				{
    +					$this->first_url .= $query_string_sep . http_build_query($get);
    +				}
     			}
    +
    +			// Add the page segment to the end of the query string, where the
    +			// page number will be appended.
    +			$this->base_url .= $query_string_sep . http_build_query(array_merge($get, array($this->query_string_segment => '')));
     		}
    -		elseif ( ! $this->cur_page && $CI->uri->segment($this->uri_segment) !== $base_page)
    +		else
     		{
    -			$this->cur_page = (int) $CI->uri->rsegment($this->uri_segment);
    +			// Standard segment mode.
    +			// Generate our saved query string to append later after the page number.
    +			if ( ! empty($get))
    +			{
    +				$query_string = $query_string_sep . http_build_query($get);
    +				$this->suffix .= $query_string;
    +			}
    +
    +			// Does the base_url have the query string in it?
    +			// If we're supposed to save it, remove it so we can append it later.
    +			if ($this->reuse_query_string === TRUE && ($base_query_pos = strpos($this->base_url, '?')) !== FALSE)
    +			{
    +				$this->base_url = substr($this->base_url, 0, $base_query_pos);
    +			}
    +
    +			if ($this->first_url === '')
    +			{
    +				$this->first_url = $this->base_url . $query_string;
    +			}
    +
    +			$this->base_url = rtrim($this->base_url, '/') . '/';
     		}
     
    -		// Set current page to 1 if it's not valid or if using page numbers instead of offset
    -		if ( ! is_numeric($this->cur_page) OR ($this->use_page_numbers && $this->cur_page === 0))
    +		// Determine the current page number.
    +		$base_page = ($this->use_page_numbers) ? 1 : 0;
    +
    +		// Are we using query strings?
    +		if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
     		{
    -			$this->cur_page = $base_page;
    +			$this->cur_page = (int) $CI->input->get($this->query_string_segment);
     		}
    +		else
    +		{
    +			// Default to the last segment number if one hasn't been defined.
    +			if ($this->uri_segment === 0)
    +			{
    +				$this->uri_segment = count($CI->uri->segment_array());
    +			}
     
    -		$this->num_links = (int) $this->num_links;
    +			$this->cur_page = $CI->uri->segment($this->uri_segment);
     
    -		if ($this->num_links < 1)
    +			// Remove any specified prefix/suffix from the segment.
    +			$this->cur_page = ($this->prefix !== '' OR $this->suffix !== '')
    +				? (int) str_replace(array($this->prefix, $this->suffix), '', $this->cur_page)
    +				: (int) $this->cur_page;
    +		}
    +
    +		// If something isn't quite right, back to the default base page.
    +		if ( ! is_numeric($this->cur_page) OR ($this->use_page_numbers && $this->cur_page === 0))
     		{
    -			show_error('Your number of links must be a positive number.');
    +			$this->cur_page = $base_page;
     		}
     
     		// Is the page number beyond the result range?
    -		// If so we show the last page
    +		// If so, we show the last page.
     		if ($this->use_page_numbers)
     		{
     			if ($this->cur_page > $num_pages)
    @@ -425,80 +487,47 @@ public function create_links()
     
     		$uri_page_number = $this->cur_page;
     
    +		// If we're using offset instead of page numbers, convert it
    +		// to a page number, so we can generate the surrounding number links.
     		if ( ! $this->use_page_numbers)
     		{
     			$this->cur_page = (int) floor(($this->cur_page/$this->per_page) + 1);
     		}
     
     		// Calculate the start and end numbers. These determine
    -		// which number to start and end the digit links with
    +		// which number to start and end the digit links with.
     		$start	= (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1;
     		$end	= (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages;
     
    -		// Is pagination being used over GET or POST? If get, add a per_page query
    -		// string. If post, add a trailing slash to the base URL if needed
    -		if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
    -		{
    -			$segment = (strpos($this->base_url, '?')) ? '&' : '?';
    -			$this->base_url = rtrim($this->base_url).$segment.$this->query_string_segment.'=';
    -		}
    -		else
    -		{
    -			$this->base_url = rtrim($this->base_url, '/') .'/';
    -		}
    -
     		// And here we go...
     		$output = '';
    -		$query_string = '';
    -
    -		// Add anything in the query string back to the links
    -		// Note: Nothing to do with query_string_segment or any other query string options
    -		if ($this->reuse_query_string === TRUE)
    -		{
    -			$get = $CI->input->get();
     
    -			// Unset the controll, method, old-school routing options
    -			unset($get['c'], $get['m'], $get[$this->query_string_segment]);
    -
    -			if ( ! empty($get))
    -			{
    -				// Put everything else onto the end
    -				$query_string = (strpos($this->base_url, '?') !== FALSE ? '&' : '?')
    -						.http_build_query($get, '', '&');
    -
    -				// Add this after the suffix to put it into more links easily
    -				$this->suffix .= $query_string;
    -			}
    -		}
    -
    -		// Render the "First" link
    +		// Render the "First" link.
     		if ($this->first_link !== FALSE && $this->cur_page > ($this->num_links + 1))
     		{
    -			$first_url = ($this->first_url === '') ? $this->base_url : $this->first_url;
    -
    -			// Take the general parameters, and squeeze this pagination-page attr in there for JS fw's
    +			// Take the general parameters, and squeeze this pagination-page attr in for JS frameworks.
     			$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, 1);
     
    -			$output .= $this->first_tag_open.'_attr_rel('start').'>'
    +			$output .= $this->first_tag_open.'_attr_rel('start').'>'
     				.$this->first_link.''.$this->first_tag_close;
     		}
     
    -		// Render the "previous" link
    +		// Render the "Previous" link.
     		if ($this->prev_link !== FALSE && $this->cur_page !== 1)
     		{
     			$i = ($this->use_page_numbers) ? $uri_page_number - 1 : $uri_page_number - $this->per_page;
     
    -			// Take the general parameters, and squeeze this pagination-page attr in there for JS fw's
     			$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
     
    -			if ($i === $base_page && $this->first_url !== '')
    +			if ($i === $base_page)
     			{
    -				$output .= $this->prev_tag_open.'_attr_rel('prev').'>'
    +				// First page
    +				$output .= $this->prev_tag_open.'_attr_rel('prev').'>'
     					.$this->prev_link.''.$this->prev_tag_close;
     			}
     			else
     			{
    -				$append = ($i === $base_page) ? $query_string : $this->prefix.$i.$this->suffix;
    +				$append = $this->prefix.$i.$this->suffix;
     				$output .= $this->prev_tag_open.'_attr_rel('prev').'>'
     					.$this->prev_link.''.$this->prev_tag_close;
     			}
    @@ -513,29 +542,26 @@ public function create_links()
     			{
     				$i = ($this->use_page_numbers) ? $loop : ($loop * $this->per_page) - $this->per_page;
     
    -				// Take the general parameters, and squeeze this pagination-page attr in there for JS fw's
     				$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
     
     				if ($i >= $base_page)
     				{
     					if ($this->cur_page === $loop)
     					{
    -						$output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page
    +						// Current page
    +						$output .= $this->cur_tag_open.$loop.$this->cur_tag_close;
    +					}
    +					elseif ($i === $base_page)
    +					{
    +						// First page
    +						$output .= $this->num_tag_open.'_attr_rel('start').'>'
    +							.$loop.''.$this->num_tag_close;
     					}
     					else
     					{
    -						$n = ($i === $base_page) ? '' : $i;
    -						if ($n === '' && ! empty($this->first_url))
    -						{
    -							$output .= $this->num_tag_open.'_attr_rel('start').'>'
    -								.$loop.''.$this->num_tag_close;
    -						}
    -						else
    -						{
    -							$append = ($n === '') ? $query_string : $this->prefix.$n.$this->suffix;
    -							$output .= $this->num_tag_open.'_attr_rel('start').'>'
    -								.$loop.''.$this->num_tag_close;
    -						}
    +						$append = $this->prefix.$i.$this->suffix;
    +						$output .= $this->num_tag_open.'_attr_rel('start').'>'
    +							.$loop.''.$this->num_tag_close;
     					}
     				}
     			}
    @@ -546,7 +572,6 @@ public function create_links()
     		{
     			$i = ($this->use_page_numbers) ? $this->cur_page + 1 : $this->cur_page * $this->per_page;
     
    -			// Take the general parameters, and squeeze this pagination-page attr in there for JS fw's
     			$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
     
     			$output .= $this->next_tag_open.'use_page_numbers) ? $num_pages : ($num_pages * $this->per_page) - $this->per_page;
     
    -			// Take the general parameters, and squeeze this pagination-page attr in there for JS fw's
     			$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
     
     			$output .= $this->last_tag_open.''
    
    From 606fee0e2e0aa6a906db82e77090e91f133d7378 Mon Sep 17 00:00:00 2001
    From: Andrey Andreev 
    Date: Mon, 28 Jan 2013 12:57:13 +0200
    Subject: [PATCH 2068/5397] Fix auto_link() for the Nth time
    
     - anchor() is for local links and breaks ones that don't have a protocol prefix
     - Allow :// links (no actual protocol specified)
     - Further simplified the URL regular expression
    ---
     system/helpers/url_helper.php                 | 19 ++++++++++---------
     tests/codeigniter/helpers/url_helper_test.php | 11 ++++++-----
     2 files changed, 16 insertions(+), 14 deletions(-)
    
    diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php
    index a6536cf81da..d0fab3fe0f2 100644
    --- a/system/helpers/url_helper.php
    +++ b/system/helpers/url_helper.php
    @@ -384,22 +384,23 @@ function safe_mailto($email, $title = '', $attributes = '')
     	function auto_link($str, $type = 'both', $popup = FALSE)
     	{
     		// Find and replace any URLs.
    -		if ($type !== 'email' && preg_match_all('#\b(([\w-]+://?|www\.)[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#', $str, $matches, PREG_OFFSET_CAPTURE))
    +		if ($type !== 'email' && preg_match_all('#(\w*://|www\.)[^\s()<>;]+\w#i', $str, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER))
     		{
     			// Set our target HTML if using popup links.
    -			$target = ($popup) ? 'target="_blank"' : '';
    +			$target = ($popup) ? ' target="_blank"' : '';
     
     			// We process the links in reverse order (last -> first) so that
     			// the returned string offsets from preg_match_all() are not
     			// moved as we add more HTML.
    -			foreach (array_reverse($matches[0]) as $match)
    +			foreach (array_reverse($matches) as $match)
     			{
    -				// $match is an array generated by the PREG_OFFSET_CAPTURE flag.
    -				// $match[0] is the matched string, $match[1] is the string offset.
    -
    -				$anchor = anchor($match[0], '', $target);
    -
    -				$str = substr_replace($str, $anchor, $match[1], strlen($match[0]));
    +				// $match[0] is the matched string/link
    +				// $match[1] is either a protocol prefix or 'www.'
    +				//
    +				// With PREG_OFFSET_CAPTURE, both of the above is an array,
    +				// where the actual value is held in [0] and its offset at the [1] index.
    +				$a = ''.$match[0][0].'';
    +				$str = substr_replace($str, $a, $match[0][1], strlen($match[0][0]));
     			}
     		}
     
    diff --git a/tests/codeigniter/helpers/url_helper_test.php b/tests/codeigniter/helpers/url_helper_test.php
    index 5fc3642383e..24823a634e7 100644
    --- a/tests/codeigniter/helpers/url_helper_test.php
    +++ b/tests/codeigniter/helpers/url_helper_test.php
    @@ -48,11 +48,12 @@ public function test_prep_url()
     	public function test_auto_link_url()
     	{
     		$strings = array(
    -			'www.codeigniter.com test' => 'http://www.codeigniter.com test',
    +			'www.codeigniter.com test' => 'www.codeigniter.com test',
     			'This is my noreply@codeigniter.com test' => 'This is my noreply@codeigniter.com test',
    -			'
    www.google.com' => '
    http://www.google.com', - 'Download CodeIgniter at www.codeigniter.com. Period test.' => 'Download CodeIgniter at http://www.codeigniter.com. Period test.', - 'Download CodeIgniter at www.codeigniter.com, comma test' => 'Download CodeIgniter at http://www.codeigniter.com, comma test' + '
    www.google.com' => '
    www.google.com', + 'Download CodeIgniter at www.codeigniter.com. Period test.' => 'Download CodeIgniter at www.codeigniter.com. Period test.', + 'Download CodeIgniter at www.codeigniter.com, comma test' => 'Download CodeIgniter at www.codeigniter.com, comma test', + 'This one: ://codeigniter.com must not break this one: http://codeigniter.com' => 'This one: ://codeigniter.com must not break this one: http://codeigniter.com' ); foreach ($strings as $in => $out) @@ -66,7 +67,7 @@ public function test_auto_link_url() public function test_pull_675() { $strings = array( - '
    www.google.com' => '
    http://www.google.com', + '
    www.google.com' => '
    www.google.com', ); foreach ($strings as $in => $out) From 009c8f09fbe767b01453f32b28f8a8a8dd4ef7c5 Mon Sep 17 00:00:00 2001 From: gommarah Date: Mon, 28 Jan 2013 13:45:50 +0200 Subject: [PATCH 2069/5397] Upload library, clean_file_name function: Fix xss bug. For example: If you clear this string "%%3f3f" according to the $bad array will fail. The result will be "%3f" Because str_replace() replaces left to right. Signed-off-by: xeptor --- system/libraries/Upload.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 96bb17edc6f..86c93411e88 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1005,6 +1005,13 @@ public function clean_file_name($filename) '%3d' // = ); + do + { + $old_filename = $filename; + $filename = str_replace($bad, '', $filename); + } + while ($old_filename !== $filename); + return stripslashes(str_replace($bad, '', $filename)); } From 9be4cd74db158d805e0bc04c48c52a6453337c1d Mon Sep 17 00:00:00 2001 From: gommarah Date: Mon, 28 Jan 2013 13:58:35 +0200 Subject: [PATCH 2070/5397] Remove str_replace in return --- system/libraries/Upload.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 86c93411e88..1f0bd6a6ea8 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1012,7 +1012,7 @@ public function clean_file_name($filename) } while ($old_filename !== $filename); - return stripslashes(str_replace($bad, '', $filename)); + return stripslashes($filename); } // -------------------------------------------------------------------- From 3608e1a094945631c5b65e1f66460e4486c5b541 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 28 Jan 2013 16:27:30 +0200 Subject: [PATCH 2071/5397] Libraries' filenames must be named in a ucfirst-like manner --- system/core/Loader.php | 144 ++++++++---------- system/libraries/Javascript.php | 2 +- .../{javascript => Javascript}/Jquery.php | 0 .../{javascript => Javascript}/index.html | 0 .../source/installation/upgrade_300.rst | 34 ++++- 5 files changed, 90 insertions(+), 90 deletions(-) rename system/libraries/{javascript => Javascript}/Jquery.php (100%) rename system/libraries/{javascript => Javascript}/index.html (100%) diff --git a/system/core/Loader.php b/system/core/Loader.php index bbd7a84b605..3ecce167666 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -96,13 +96,6 @@ class CI_Loader { */ protected $_ci_classes = array(); - /** - * List of loaded files - * - * @var array - */ - protected $_ci_loaded_files = array(); - /** * List of loaded models * @@ -943,117 +936,100 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL) // Was the path included with the class name? // We look for a slash to determine this - $subdir = ''; if (($last_slash = strrpos($class, '/')) !== FALSE) { // Extract the path - $subdir = substr($class, 0, ++$last_slash); + $subdir = ucfirst(substr($class, 0, ++$last_slash)); // Get the filename from the path $class = substr($class, $last_slash); } + else + { + $subdir = ''; + } + + $class = ucfirst($class); + $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.'.php'; - // We'll test for both lowercase and capitalized versions of the file name - foreach (array(ucfirst($class), strtolower($class)) as $class) + // Is this a class extension request? + if (file_exists($subclass)) { - $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.'.php'; + $baseclass = BASEPATH.'libraries/'.$class.'.php'; - // Is this a class extension request? - if (file_exists($subclass)) + if ( ! file_exists($baseclass)) { - $baseclass = BASEPATH.'libraries/'.ucfirst($class).'.php'; - - if ( ! file_exists($baseclass)) - { - log_message('error', 'Unable to load the requested class: '.$class); - show_error('Unable to load the requested class: '.$class); - } + log_message('error', 'Unable to load the requested class: '.$class); + show_error('Unable to load the requested class: '.$class); + } - // Safety: Was the class already loaded by a previous call? - if (in_array($subclass, $this->_ci_loaded_files)) + // Safety: Was the class already loaded by a previous call? + if (class_exists(config_item('subclass_prefix').$class, FALSE)) + { + // Before we deem this to be a duplicate request, let's see + // if a custom object name is being supplied. If so, we'll + // return a new instance of the object + if ($object_name !== NULL) { - // Before we deem this to be a duplicate request, let's see - // if a custom object name is being supplied. If so, we'll - // return a new instance of the object - if ($object_name !== NULL) + $CI =& get_instance(); + if ( ! isset($CI->$object_name)) { - $CI =& get_instance(); - if ( ! isset($CI->$object_name)) - { - return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name); - } + return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name); } - - $is_duplicate = TRUE; - log_message('debug', $class.' class already loaded. Second attempt ignored.'); - return; } - include_once($baseclass); - include_once($subclass); - $this->_ci_loaded_files[] = $subclass; - - return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name); + log_message('debug', $class.' class already loaded. Second attempt ignored.'); + return; } - // Lets search for the requested library file and load it. - $is_duplicate = FALSE; - foreach ($this->_ci_library_paths as $path) - { - $filepath = $path.'libraries/'.$subdir.$class.'.php'; + include_once($baseclass); + include_once($subclass); - // Does the file exist? No? Bummer... - if ( ! file_exists($filepath)) - { - continue; - } + return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name); + } + + // Lets search for the requested library file and load it. + foreach ($this->_ci_library_paths as $path) + { + $filepath = $path.'libraries/'.$subdir.$class.'.php'; - // Safety: Was the class already loaded by a previous call? - if (in_array($filepath, $this->_ci_loaded_files)) + // Safety: Was the class already loaded by a previous call? + if (class_exists($class, FALSE)) + { + // Before we deem this to be a duplicate request, let's see + // if a custom object name is being supplied. If so, we'll + // return a new instance of the object + if ($object_name !== NULL) { - // Before we deem this to be a duplicate request, let's see - // if a custom object name is being supplied. If so, we'll - // return a new instance of the object - if ($object_name !== NULL) + $CI =& get_instance(); + if ( ! isset($CI->$object_name)) { - $CI =& get_instance(); - if ( ! isset($CI->$object_name)) - { - return $this->_ci_init_class($class, '', $params, $object_name); - } + return $this->_ci_init_class($class, '', $params, $object_name); } - - $is_duplicate = TRUE; - log_message('debug', $class.' class already loaded. Second attempt ignored.'); - return; } - include_once($filepath); - $this->_ci_loaded_files[] = $filepath; - return $this->_ci_init_class($class, '', $params, $object_name); + log_message('debug', $class.' class already loaded. Second attempt ignored.'); + return; + } + // Does the file exist? No? Bummer... + elseif ( ! file_exists($filepath)) + { + continue; } - } // END FOREACH + + include_once($filepath); + return $this->_ci_init_class($class, '', $params, $object_name); + } // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified? if ($subdir === '') { - $path = strtolower($class).'/'.$class; - return $this->_ci_load_class($path, $params, $object_name); - } - elseif (ucfirst($subdir) != $subdir) - { - // Lowercase subdir failed - retry capitalized - $path = ucfirst($subdir).$class; - return $this->_ci_load_class($path, $params, $object_name); + return $this->_ci_load_class($class.'/'.$class, $params, $object_name); } // If we got this far we were unable to find the requested class. - // We do not issue errors if the load call failed due to a duplicate request - if ($is_duplicate === FALSE) - { - log_message('error', 'Unable to load the requested class: '.$class); - show_error('Unable to load the requested class: '.$class); - } + log_message('error', 'Unable to load the requested class: '.$class); + show_error('Unable to load the requested class: '.$class); } // -------------------------------------------------------------------- diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php index 7f1d8551152..773a5838418 100644 --- a/system/libraries/Javascript.php +++ b/system/libraries/Javascript.php @@ -69,7 +69,7 @@ public function __construct($params = array()) $this->CI =& get_instance(); // load the requested js library - $this->CI->load->library('javascript/'.$js_library_driver, array('autoload' => $autoload)); + $this->CI->load->library('Javascript/'.$js_library_driver, array('autoload' => $autoload)); // make js to refer to current library $this->js =& $this->CI->$js_library_driver; diff --git a/system/libraries/javascript/Jquery.php b/system/libraries/Javascript/Jquery.php similarity index 100% rename from system/libraries/javascript/Jquery.php rename to system/libraries/Javascript/Jquery.php diff --git a/system/libraries/javascript/index.html b/system/libraries/Javascript/index.html similarity index 100% rename from system/libraries/javascript/index.html rename to system/libraries/Javascript/index.html diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 94f6321befd..2d125a71a6a 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -104,16 +104,40 @@ regular expression:: (.+) // matches ANYTHING (:any) // matches any character, except for '/' +******************************************* +Step 9: Update your librararies' file names +******************************************* + +CodeIgniter 3.0 only allows library file names to be named in a *ucfirst* manner +(meaning that the first letter of the class name must be a capital). For example, +if you have the following library file: + + application/libraries/mylibrary.php + +... then you'll have to rename it to: + + application/libraries/Mylibrary.php + +The same goes for driver libraries and extensions and/or overrides of CodeIgniter's +own libraries and core classes. + + application/libraries/MY_email.php + application/core/MY_log.php + +The above files should respectively be renamed to the following: + + application/libraries/MY_Email.php + application/core/MY_Log.php **************************************************************************** -Step 9: Check the calls to Array Helper's element() and elements() functions +Step 10: Check the calls to Array Helper's element() and elements() functions **************************************************************************** The default return value of these functions, when the required elements don't exist, has been changed from FALSE to NULL. ************************************************************* -Step 10: Update usage of Database Forge's drop_table() method +Step 11: Update usage of Database Forge's drop_table() method ************************************************************* Up until now, ``drop_table()`` added an IF EXISTS clause by default or it didn't work @@ -135,7 +159,7 @@ If your application relies on IF EXISTS, you'll have to change its usage. all drivers with the exception of ODBC. *********************************************************** -Step 11: Change usage of Email library with multiple emails +Step 12: Change usage of Email library with multiple emails *********************************************************** The :doc:`Email Library <../libraries/email>` will automatically clear the @@ -150,7 +174,7 @@ pass FALSE as the first parameter in the ``send()`` method: } *************************************************** -Step 12: Update your Form_validation language lines +Step 13: Update your Form_validation language lines *************************************************** Two improvements have been made to the :doc:`Form Validation Library @@ -181,7 +205,7 @@ files and error messages format: later. **************************************************************** -Step 13: Remove usage of (previously) deprecated functionalities +Step 14: Remove usage of (previously) deprecated functionalities **************************************************************** In addition to the ``$autoload['core']`` configuration setting, there's a From bc92262992b606847eb1e764a0ab1cdef0aa12e3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 28 Jan 2013 16:47:41 +0200 Subject: [PATCH 2072/5397] Update unit tests with the ucfirst-library-filename requirement --- tests/codeigniter/core/Loader_test.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index ecc5ca933ef..dea01a55552 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -25,7 +25,7 @@ public function test_library() // Create library in VFS $lib = 'unit_test_lib'; $class = 'CI_'.ucfirst($lib); - $this->ci_vfs_create($lib, 'ci_base_root, 'libraries'); + $this->ci_vfs_create(ucfirst($lib), 'ci_base_root, 'libraries'); // Test is_loaded fail $this->assertFalse($this->load->is_loaded($lib)); @@ -48,7 +48,7 @@ public function test_library() // Test non-existent class $this->setExpectedException( 'RuntimeException', - 'CI Error: Non-existent class: '.$lib + 'CI Error: Unable to load the requested class: '.ucfirst($lib) ); $this->assertNull($this->load->library($lib)); } @@ -105,7 +105,7 @@ public function test_library_config() $lib = 'unit_test_config_lib'; $class = 'CI_'.ucfirst($lib); $content = 'config = $params; } }'; - $this->ci_vfs_create($lib, $content, $this->ci_base_root, 'libraries'); + $this->ci_vfs_create(ucfirst($lib), $content, $this->ci_base_root, 'libraries'); // Create config file $cfg = array( @@ -133,7 +133,7 @@ public function test_load_library_in_application_dir() // Create library in VFS $lib = 'super_test_library'; $class = ucfirst($lib); - $this->ci_vfs_create($lib, 'ci_app_root, 'libraries'); + $this->ci_vfs_create(ucfirst($lib), 'ci_app_root, 'libraries'); // Load library $this->assertNull($this->load->library($lib)); @@ -152,7 +152,7 @@ public function test_driver() $dir = ucfirst($driver); $class = 'CI_'.$dir; $content = 'ci_vfs_create($driver, $content, $this->ci_base_root, 'libraries/'.$dir); + $this->ci_vfs_create(ucfirst($driver), $content, $this->ci_base_root, 'libraries/'.$dir); // Test loading as an array. $this->assertNull($this->load->driver(array($driver))); @@ -410,7 +410,7 @@ public function test_packages() $dir = 'third-party'; $lib = 'unit_test_package'; $class = 'CI_'.ucfirst($lib); - $this->ci_vfs_create($lib, 'ci_app_root, array($dir, 'libraries')); + $this->ci_vfs_create(ucfirst($lib), 'ci_app_root, array($dir, 'libraries')); // Get paths $paths = $this->load->get_package_paths(TRUE); @@ -440,7 +440,7 @@ public function test_packages() // Test failed load without path $this->setExpectedException( 'RuntimeException', - 'CI Error: Unable to load the requested class: '.$lib + 'CI Error: Unable to load the requested class: '.ucfirst($lib) ); $this->load->library($lib); } @@ -467,13 +467,13 @@ public function test_initialize() // Create library in VFS $lib = 'autolib'; $lib_class = 'CI_'.ucfirst($lib); - $this->ci_vfs_create($lib, 'ci_base_root, 'libraries'); + $this->ci_vfs_create(ucfirst($lib), 'ci_base_root, 'libraries'); // Create driver in VFS $drv = 'autodrv'; $subdir = ucfirst($drv); $drv_class = 'CI_'.$subdir; - $this->ci_vfs_create($drv, 'ci_base_root, array('libraries', $subdir)); + $this->ci_vfs_create(ucfirst($drv), 'ci_base_root, array('libraries', $subdir)); // Create model in VFS package path $dir = 'testdir'; From 55bbd7207d5276a7546e60f28c4c31325bab2b5e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 28 Jan 2013 19:02:13 +0200 Subject: [PATCH 2073/5397] Fix issue #2179 --- system/database/DB_query_builder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index ac377d99675..c7bc4a6993f 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -937,7 +937,7 @@ protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $n $this->qb_where[] = array('condition' => $like_statement, 'escape' => $escape); if ($this->qb_caching === TRUE) { - $this->qb_cache_where[] = $like_statement; + $this->qb_cache_where[] = array('condition' => $like_statement, 'escape' => $escape); $this->qb_cache_exists[] = 'where'; } } From 662e34291a2d5d8997ea9835701fb9a8a7ec244c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 28 Jan 2013 21:19:13 +0200 Subject: [PATCH 2074/5397] Some micro-optimization to the Driver library loader --- system/libraries/Driver.php | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index 4b35dce7313..382420db056 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -80,8 +80,7 @@ public function __get($child) public function load_driver($child) { // Get CodeIgniter instance and subclass prefix - $CI = get_instance(); - $prefix = (string) $CI->config->item('subclass_prefix'); + $prefix = config_item('subclass_prefix'); if ( ! isset($this->lib_name)) { @@ -102,11 +101,12 @@ public function load_driver($child) } // Get package paths and filename case variations to search + $CI = get_instance(); $paths = $CI->load->get_package_paths(TRUE); // Is there an extension? $class_name = $prefix.$child_name; - $found = class_exists($class_name); + $found = class_exists($class_name, FALSE); if ( ! $found) { // Check for subclass file @@ -126,8 +126,8 @@ public function load_driver($child) } // Include both sources and mark found - include($basepath); - include($file); + include_once($basepath); + include_once($file); $found = TRUE; break; } @@ -139,8 +139,7 @@ public function load_driver($child) { // Use standard class name $class_name = 'CI_'.$child_name; - $found = class_exists($class_name); - if ( ! $found) + if ( ! class_exists($class_name, FALSE)) { // Check package paths foreach ($paths as $path) @@ -150,7 +149,7 @@ public function load_driver($child) if (file_exists($file)) { // Include source - include($file); + include_once($file); break; } } @@ -158,9 +157,9 @@ public function load_driver($child) } // Did we finally find the class? - if ( ! class_exists($class_name)) + if ( ! class_exists($class_name, FALSE)) { - if (class_exists($child_name)) + if (class_exists($child_name, FALSE)) { $class_name = $child_name; } From c26d34ff12458760eb843454d3224e1dad1fb2e0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 28 Jan 2013 21:46:08 +0200 Subject: [PATCH 2075/5397] Fix issue #2202 and alter Loader Class docs --- system/core/Loader.php | 2 +- user_guide_src/source/libraries/loader.rst | 146 ++++++++++----------- 2 files changed, 73 insertions(+), 75 deletions(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index 3ecce167666..00ca3519952 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -939,7 +939,7 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL) if (($last_slash = strrpos($class, '/')) !== FALSE) { // Extract the path - $subdir = ucfirst(substr($class, 0, ++$last_slash)); + $subdir = substr($class, 0, ++$last_slash); // Get the filename from the path $class = substr($class, $last_slash); diff --git a/user_guide_src/source/libraries/loader.rst b/user_guide_src/source/libraries/loader.rst index 615aba1c22c..b048f488132 100644 --- a/user_guide_src/source/libraries/loader.rst +++ b/user_guide_src/source/libraries/loader.rst @@ -11,14 +11,15 @@ can be libraries (classes) :doc:`View files <../general/views>`, .. note:: This class is initialized automatically by the system so there is no need to do it manually. -The following functions are available in this class: +The following methods are available in this class: $this->load->library('class_name', $config, 'object name') -=========================================================== +========================================================== -This function is used to load core classes. Where class_name is the -name of the class you want to load. Note: We use the terms "class" and -"library" interchangeably. +This method is used to load core classes. Where class_name is the +name of the class you want to load. + +.. note:: We use the terms "class" and "library" interchangeably. For example, if you would like to send email with CodeIgniter, the first step is to load the email class within your controller:: @@ -26,15 +27,15 @@ step is to load the email class within your controller:: $this->load->library('email'); Once loaded, the library will be ready for use, using -$this->email->*some_function*(). +$this->email->*some_method*(). Library files can be stored in subdirectories within the main -"libraries" folder, or within your personal application/libraries -folder. To load a file located in a subdirectory, simply include the -path, relative to the "libraries" folder. For example, if you have file -located at:: +"libraries" directory, or within your personal application/libraries +directory. To load a file located in a subdirectory, simply include the +path, relative to the "libraries" directory. For example, if you have +file located at:: - libraries/flavors/chocolate.php + libraries/flavors/Chocolate.php You will load it using:: @@ -43,7 +44,7 @@ You will load it using:: You may nest the file in as many subdirectories as you want. Additionally, multiple libraries can be loaded at the same time by -passing an array of libraries to the load function. +passing an array of libraries to the load method. :: @@ -56,10 +57,10 @@ The second (optional) parameter allows you to optionally pass configuration setting. You will typically pass these as an array:: $config = array ( - 'mailtype' => 'html', - 'charset' => 'utf-8, - 'priority' => '1' - ); + 'mailtype' => 'html', + 'charset' => 'utf-8, + 'priority' => '1' + ); $this->load->library('email', $config); @@ -84,16 +85,15 @@ third parameter:: $this->load->library('calendar', '', 'my_calendar'); // Calendar class is now accessed using: - $this->my_calendar Please take note, when multiple libraries are supplied in an array for the first parameter, this parameter is discarded. $this->load->driver('parent_name', $config, 'object name') -=========================================================== +========================================================== -This function is used to load driver libraries. Where parent_name is the +This method is used to load driver libraries. Where parent_name is the name of the parent class you want to load. As an example, if you would like to use sessions with CodeIgniter, the first @@ -102,15 +102,15 @@ step is to load the session driver within your controller:: $this->load->driver('session'); Once loaded, the library will be ready for use, using -$this->session->*some_function*(). +$this->session->*some_method*(). Driver files must be stored in a subdirectory within the main -"libraries" folder, or within your personal application/libraries -folder. The subdirectory must match the parent class name. Read the +"libraries" directory, or within your personal application/libraries +directory. The subdirectory must match the parent class name. Read the :doc:`Drivers <../general/drivers>` description for details. Additionally, multiple driver libraries can be loaded at the same time by -passing an array of drivers to the load function. +passing an array of drivers to the load method. :: @@ -122,11 +122,11 @@ Setting options The second (optional) parameter allows you to optionally pass configuration settings. You will typically pass these as an array:: - $config = array ( - 'sess_driver' => 'cookie', - 'sess_encrypt_cookie' => true, - 'encryption_key' => 'mysecretkey' - ); + $config = array( + 'sess_driver' => 'cookie', + 'sess_encrypt_cookie' => true, + 'encryption_key' => 'mysecretkey' + ); $this->load->driver('session', $config); @@ -135,12 +135,12 @@ is explained in detail in its own page, so please read the information regarding each one you would like to use. Assigning a Driver to a different object name ----------------------------------------------- +--------------------------------------------- If the third (optional) parameter is blank, the library will be assigned to an object with the same name as the parent class. For example, if the library is named Session, it will be assigned to a variable named -$this->session. +``$this->session``. If you prefer to set your own class names you can pass its value to the third parameter:: @@ -148,32 +148,33 @@ third parameter:: $this->load->library('session', '', 'my_session'); // Session class is now accessed using: - $this->my_session -.. note:: Driver libraries may also be loaded with the library() method, - but it is faster to use driver() +.. note:: Driver libraries may also be loaded with the ``library()`` method, + but it is faster to use ``driver()``. -$this->load->view('file_name', $data, true/false) -================================================== +$this->load->view('file_name', $data, TRUE/FALSE) +================================================= -This function is used to load your View files. If you haven't read the +This method is used to load your View files. If you haven't read the :doc:`Views <../general/views>` section of the user guide it is -recommended that you do since it shows you how this function is +recommended that you do since it shows you how this method is typically used. The first parameter is required. It is the name of the view file you -would like to load. Note: The .php file extension does not need to be -specified unless you use something other than .php. +would like to load. + +.. note:: The .php file extension does not need to be specified unless + you use something other than .php. The second **optional** parameter can take an associative array or an object as input, which it runs through the PHP -`extract `_ function to convert to variables +`extract() `_ function to convert to variables that can be used in your view files. Again, read the :doc:`Views <../general/views>` page to learn how this might be useful. The third **optional** parameter lets you change the behavior of the -function so that it returns data as a string rather than sending it to +method so that it returns data as a string rather than sending it to your browser. This can be useful if you want to process the data in some way. If you set the parameter to true (boolean) it will return data. The default behavior is false, which sends it to your browser. Remember to @@ -189,79 +190,76 @@ $this->load->model('model_name'); $this->load->model('model_name'); -If your model is located in a sub-folder, include the relative path from -your models folder. For example, if you have a model located at +If your model is located in a subdirectory, include the relative path +from your models directory. For example, if you have a model located at application/models/blog/queries.php you'll load it using:: $this->load->model('blog/queries'); - If you would like your model assigned to a different object name you can -specify it via the second parameter of the loading function:: +specify it via the second parameter of the loading method:: $this->load->model('model_name', 'fubar'); + $this->fubar->method(); - $this->fubar->function(); - -$this->load->database('options', true/false) +$this->load->database('options', TRUE/FALSE) ============================================ -This function lets you load the database class. The two parameters are +This method lets you load the database class. The two parameters are **optional**. Please see the :doc:`database <../database/index>` section for more info. $this->load->vars($array) ========================= -This function takes an associative array as input and generates +This method takes an associative array as input and generates variables using the PHP `extract `_ -function. This function produces the same result as using the second -parameter of the $this->load->view() function above. The reason you -might want to use this function independently is if you would like to +method. This method produces the same result as using the second +parameter of the ``$this->load->view()`` method above. The reason you +might want to use this method independently is if you would like to set some global variables in the constructor of your controller and have -them become available in any view file loaded from any function. You can -have multiple calls to this function. The data get cached and merged +them become available in any view file loaded from any method. You can +have multiple calls to this method. The data get cached and merged into one array for conversion to variables. $this->load->get_var($key) -=========================== +========================== -This function checks the associative array of variables available to +This method checks the associative array of variables available to your views. This is useful if for any reason a var is set in a library -or another controller method using $this->load->vars(). +or another controller method using ``$this->load->vars()``. $this->load->get_vars() -=========================== +======================= -This function retrieves all variables available to -your views. +This method retrieves all variables available to your views. $this->load->helper('file_name') -================================= +================================ -This function loads helper files, where file_name is the name of the +This method loads helper files, where file_name is the name of the file, without the _helper.php extension. -$this->load->file('filepath/filename', true/false) +$this->load->file('filepath/filename', TRUE/FALSE) ================================================== -This is a generic file loading function. Supply the filepath and name in +This is a generic file loading method. Supply the filepath and name in the first parameter and it will open and read the file. By default the data is sent to your browser, just like a View file, but if you set the second parameter to true (boolean) it will instead return the data as a string. $this->load->language('file_name') -=================================== +================================== -This function is an alias of the :doc:`language loading -function `: $this->lang->load() +This method is an alias of the :doc:`language loading +method `: ``$this->lang->load()`` $this->load->config('file_name') -================================= +================================ -This function is an alias of the :doc:`config file loading -function `: $this->config->load() +This method is an alias of the :doc:`config file loading +method `: ``$this->config->load()`` Application "Packages" ====================== @@ -269,7 +267,7 @@ Application "Packages" An application package allows for the easy distribution of complete sets of resources in a single directory, complete with its own libraries, models, helpers, config, and language files. It is recommended that -these packages be placed in the application/third_party folder. Below +these packages be placed in the application/third_party directory. Below is a sample map of an package directory Sample Package "Foo Bar" Directory Map @@ -311,7 +309,7 @@ $this->load->remove_package_path() When your controller is finished using resources from an application package, and particularly if you have other application packages you want to work with, you may wish to remove the package path so the Loader -no longer looks in that folder for resources. To remove the last path +no longer looks in that directory for resources. To remove the last path added, simply call the method with no parameters. $this->load->remove_package_path() @@ -346,4 +344,4 @@ calling add_package_path(). // Again without the second parameter: $this->load->add_package_path(APPPATH.'my_app'); $this->load->view('my_app_index'); // Loads - $this->load->view('welcome_message'); // Loads + $this->load->view('welcome_message'); // Loads \ No newline at end of file From 0c1e163057308abb7324e44081b47dc9937dde17 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Mon, 28 Jan 2013 21:24:36 +0100 Subject: [PATCH 2076/5397] Adjustments in routing documentation * fixed syntax error for "note" banner * more useful example, in previous one there was no need for strtolower, nor for a callback --- user_guide_src/source/general/routing.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst index 2a03320885c..ed21a61095a 100644 --- a/user_guide_src/source/general/routing.rst +++ b/user_guide_src/source/general/routing.rst @@ -129,7 +129,7 @@ For those of you who don't know regular expressions and want to learn more about them, `regular-expressions.info ` might be a good starting point. -..note:: You can also mix and match wildcards with regular expressions. +.. note:: You can also mix and match wildcards with regular expressions. Callbacks ========= @@ -137,7 +137,7 @@ Callbacks If you are using PHP >= 5.3 you can use callbacks in place of the normal routing rules to process the back-references. Example:: - $route['products/([a-z]+)/edit/(\d+)'] = function ($product_type, $id) + $route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id) { return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id; }; From 9668d1d56d39187aa26f058495ca666e3544cbe2 Mon Sep 17 00:00:00 2001 From: Eric Roberts Date: Mon, 28 Jan 2013 17:45:34 -0600 Subject: [PATCH 2077/5397] Remove spaces from concats. Signed-off-by: Eric Roberts --- system/libraries/Pagination.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index 3a513a7c12b..76754046bf7 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -408,13 +408,13 @@ public function create_links() // If we saved any GET items earlier, make sure they're appended. if ( ! empty($get)) { - $this->first_url .= $query_string_sep . http_build_query($get); + $this->first_url .= $query_string_sep.http_build_query($get); } } // Add the page segment to the end of the query string, where the // page number will be appended. - $this->base_url .= $query_string_sep . http_build_query(array_merge($get, array($this->query_string_segment => ''))); + $this->base_url .= $query_string_sep.http_build_query(array_merge($get, array($this->query_string_segment => ''))); } else { @@ -422,7 +422,7 @@ public function create_links() // Generate our saved query string to append later after the page number. if ( ! empty($get)) { - $query_string = $query_string_sep . http_build_query($get); + $query_string = $query_string_sep.http_build_query($get); $this->suffix .= $query_string; } @@ -435,10 +435,10 @@ public function create_links() if ($this->first_url === '') { - $this->first_url = $this->base_url . $query_string; + $this->first_url = $this->base_url.$query_string; } - $this->base_url = rtrim($this->base_url, '/') . '/'; + $this->base_url = rtrim($this->base_url, '/').'/'; } // Determine the current page number. From b835a4f3b3f8fccd7ce457d4ab13344d3dcb91a9 Mon Sep 17 00:00:00 2001 From: Chris Buckley Date: Mon, 28 Jan 2013 23:35:13 +0000 Subject: [PATCH 2078/5397] Fix list_fields seek bug On the first list_fields call, the field pointer is moved to the end of the list of fields. This change ensures that the pointer is positioned at the start of the field list before grabbing the names. Signed-off-by: Chris Buckley --- system/database/drivers/mssql/mssql_result.php | 1 + system/database/drivers/mysql/mysql_result.php | 1 + system/database/drivers/mysqli/mysqli_result.php | 1 + 3 files changed, 3 insertions(+) diff --git a/system/database/drivers/mssql/mssql_result.php b/system/database/drivers/mssql/mssql_result.php index ea3f8e4d115..b6e5f2b17cf 100644 --- a/system/database/drivers/mssql/mssql_result.php +++ b/system/database/drivers/mssql/mssql_result.php @@ -74,6 +74,7 @@ public function num_fields() public function list_fields() { $field_names = array(); + mssql_field_seek($this->result_id, 0); while ($field = mssql_fetch_field($this->result_id)) { $field_names[] = $field->name; diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php index 1ed2759b680..a2affcb5831 100644 --- a/system/database/drivers/mysql/mysql_result.php +++ b/system/database/drivers/mysql/mysql_result.php @@ -89,6 +89,7 @@ public function num_fields() public function list_fields() { $field_names = array(); + mysql_field_seek($this->result_id, 0); while ($field = mysql_fetch_field($this->result_id)) { $field_names[] = $field->name; diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php index 4105f99f6e1..3fe05f9c50e 100644 --- a/system/database/drivers/mysqli/mysqli_result.php +++ b/system/database/drivers/mysqli/mysqli_result.php @@ -74,6 +74,7 @@ public function num_fields() public function list_fields() { $field_names = array(); + $this->result_id->field_seek(0); while ($field = $this->result_id->fetch_field()) { $field_names[] = $field->name; From ba67f3bb595817115a15f6c3249e41e7c85f2ce4 Mon Sep 17 00:00:00 2001 From: Eric Roberts Date: Mon, 28 Jan 2013 18:01:01 -0600 Subject: [PATCH 2079/5397] Move $get assignment to if/else. Signed-off-by: Eric Roberts --- system/libraries/Pagination.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index 76754046bf7..562a2d3eb63 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -380,8 +380,6 @@ public function create_links() // Keep any existing query string items. // Note: Has nothing to do with any other query string option. - $get = array(); - if ($this->reuse_query_string === TRUE) { $get = $CI->input->get(); @@ -389,6 +387,10 @@ public function create_links() // Unset the controll, method, old-school routing options unset($get['c'], $get['m'], $get[$this->query_string_segment]); } + else + { + $get = array(); + } // Put together our base and first URLs. $this->base_url = trim($this->base_url); From 032af98ab94482cc7c5b10013ec033acfdc34c74 Mon Sep 17 00:00:00 2001 From: Eric Roberts Date: Mon, 28 Jan 2013 23:25:52 -0600 Subject: [PATCH 2080/5397] Replace is_numeric() with ctype_digit() Signed-off-by: Eric Roberts --- system/libraries/Pagination.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index 562a2d3eb63..438d6c477f1 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -449,7 +449,8 @@ public function create_links() // Are we using query strings? if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) { - $this->cur_page = (int) $CI->input->get($this->query_string_segment); + // Cast as string for use in ctype_digit() later. + $this->cur_page = (string) $CI->input->get($this->query_string_segment); } else { @@ -459,19 +460,25 @@ public function create_links() $this->uri_segment = count($CI->uri->segment_array()); } - $this->cur_page = $CI->uri->segment($this->uri_segment); + $this->cur_page = (string) $CI->uri->segment($this->uri_segment); // Remove any specified prefix/suffix from the segment. - $this->cur_page = ($this->prefix !== '' OR $this->suffix !== '') - ? (int) str_replace(array($this->prefix, $this->suffix), '', $this->cur_page) - : (int) $this->cur_page; + if ($this->prefix !== '' OR $this->suffix !== '') + { + $this->cur_page = str_replace(array($this->prefix, $this->suffix), '', $this->cur_page); + } } // If something isn't quite right, back to the default base page. - if ( ! is_numeric($this->cur_page) OR ($this->use_page_numbers && $this->cur_page === 0)) + if ( ! ctype_digit($this->cur_page) OR ($this->use_page_numbers && (int) $this->cur_page === 0)) { $this->cur_page = $base_page; } + else + { + // Make sure we're using integers for comparisons later. + $this->cur_page = (int) $this->cur_page; + } // Is the page number beyond the result range? // If so, we show the last page. From 0687911229be13e100724dbf8b15b95146b591a9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 29 Jan 2013 15:05:02 +0200 Subject: [PATCH 2081/5397] Replace is_file() with the faster file_exists() (where it makes sense) Also: - Implemented caching of configuration arrays for smileys, foreign characters and doctypes. - Implemented cascading-style loading of configuration files (except for library configs, DB and constants.php). --- system/core/Common.php | 4 ++-- system/core/Hooks.php | 5 +++-- system/core/Router.php | 9 +++++---- system/helpers/download_helper.php | 2 +- system/helpers/html_helper.php | 20 ++++++++++++-------- system/helpers/smiley_helper.php | 28 +++++++++++++++++++++------- system/helpers/text_helper.php | 22 +++++++++++++--------- system/libraries/User_agent.php | 13 ++++++++----- 8 files changed, 65 insertions(+), 38 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 90cc5b3a4e7..258cd49678d 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -316,11 +316,11 @@ function &get_mimes() { static $_mimes = array(); - if (is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) { $_mimes = include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); } - elseif (is_file(APPPATH.'config/mimes.php')) + elseif (file_exists(APPPATH.'config/mimes.php')) { $_mimes = include(APPPATH.'config/mimes.php'); } diff --git a/system/core/Hooks.php b/system/core/Hooks.php index 59759e02e4e..17f6a027e89 100644 --- a/system/core/Hooks.php +++ b/system/core/Hooks.php @@ -81,11 +81,12 @@ public function __construct() } // Grab the "hooks" definition file. - if (is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'); } - elseif (is_file(APPPATH.'config/hooks.php')) + + if (file_exists(APPPATH.'config/hooks.php')) { include(APPPATH.'config/hooks.php'); } diff --git a/system/core/Router.php b/system/core/Router.php index 4755b3712e5..bb0ce16bd97 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -133,13 +133,14 @@ public function _set_routing() } // Load the routes.php file. - if (is_file(APPPATH.'config/'.ENVIRONMENT.'/routes.php')) + if (file_exists(APPPATH.'config/routes.php')) { - include(APPPATH.'config/'.ENVIRONMENT.'/routes.php'); + include(APPPATH.'config/routes.php'); } - elseif (is_file(APPPATH.'config/routes.php')) + + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php')) { - include(APPPATH.'config/routes.php'); + include(APPPATH.'config/'.ENVIRONMENT.'/routes.php'); } $this->routes = (empty($route) OR ! is_array($route)) ? array() : $route; diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 7294d50c5be..4fe6a0e8844 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -58,7 +58,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) } elseif ($data === NULL) { - if (@is_file($filename) && @file_exists($filename) && ($filesize = @filesize($filename)) !== FALSE) + if (@is_file($filename) && ($filesize = @filesize($filename)) !== FALSE) { $filepath = $filename; $filename = explode('/', str_replace(DIRECTORY_SEPARATOR, '/', $filename)); diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index 7a71eb82b65..80a27876f0e 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -238,26 +238,30 @@ function img($src = '', $index_page = FALSE, $attributes = '') */ function doctype($type = 'xhtml1-strict') { - global $_doctypes; + static $doctypes; - if ( ! is_array($_doctypes)) + if ( ! is_array($doctypes)) { - if (is_file(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php')) + if (file_exists(APPPATH.'config/doctypes.php')) { - include(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php'); + include(APPPATH.'config/doctypes.php'); } - elseif (is_file(APPPATH.'config/doctypes.php')) + + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php')) { - include(APPPATH.'config/doctypes.php'); + include(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php'); } - if ( ! is_array($_doctypes)) + if (empty($_doctypes) OR ! is_array($_doctypes)) { + $doctypes = array(); return FALSE; } + + $doctypes = $_doctypes; } - return isset($_doctypes[$type]) ? $_doctypes[$type] : FALSE; + return isset($doctypes[$type]) ? $doctypes[$type] : FALSE; } } diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php index c2f50ec7398..d9a693493df 100644 --- a/system/helpers/smiley_helper.php +++ b/system/helpers/smiley_helper.php @@ -213,16 +213,30 @@ function parse_smileys($str = '', $image_url = '', $smileys = NULL) */ function _get_smiley_array() { - if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/smileys.php')) - { - include(APPPATH.'config/'.ENVIRONMENT.'/smileys.php'); - } - elseif (file_exists(APPPATH.'config/smileys.php')) + static $_smileys; + + if ( ! is_array($smileys)) { - include(APPPATH.'config/smileys.php'); + if (file_exists(APPPATH.'config/smileys.php')) + { + include(APPPATH.'config/smileys.php'); + } + + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/smileys.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/smileys.php'); + } + + if (empty($smileys) OR ! is_array($smileys)) + { + $_smileys = array(); + return FALSE; + } + + $_smileys = $smileys; } - return (isset($smileys) && is_array($smileys)) ? $smileys : FALSE; + return $_smileys; } } diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index c255c15a8df..54db14f9468 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -358,31 +358,35 @@ function highlight_phrase($str, $phrase, $tag_open = '', $tag_close = '< /** * Convert Accented Foreign Characters to ASCII * - * @param string the text string + * @param string $str Input string * @return string */ function convert_accented_characters($str) { - global $foreign_characters; + static $_foreign_characters; - if ( ! isset($foreign_characters) OR ! is_array($foreign_characters)) + if ( ! is_array($_foreign_characters)) { - if (is_file(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php')) + if (file_exists(APPPATH.'config/foreign_chars.php')) { - include(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php'); + include(APPPATH.'config/foreign_chars.php'); } - elseif (is_file(APPPATH.'config/foreign_chars.php')) + + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php')) { - include(APPPATH.'config/foreign_chars.php'); + include(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php'); } - if ( ! isset($foreign_characters) OR ! is_array($foreign_characters)) + if (empty($foreign_characters) OR ! is_array($foreign_characters)) { + $_foreign_characters = array(); return $str; } + + $_foreign_characters = $foreign_characters; } - return preg_replace(array_keys($foreign_characters), array_values($foreign_characters), $str); + return preg_replace(array_keys($_foreign_characters), array_values($_foreign_characters), $str); } } diff --git a/system/libraries/User_agent.php b/system/libraries/User_agent.php index 3fe2e0519bf..2f6f81909b6 100644 --- a/system/libraries/User_agent.php +++ b/system/libraries/User_agent.php @@ -175,15 +175,18 @@ public function __construct() */ protected function _load_agent_file() { - if (is_file(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php')) + if (($found = file_exists(APPPATH.'config/user_agents.php'))) { - include(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php'); + include(APPPATH.'config/user_agents.php'); } - elseif (is_file(APPPATH.'config/user_agents.php')) + + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php')) { - include(APPPATH.'config/user_agents.php'); + include(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php'); + $found = TRUE; } - else + + if ($found !== TRUE) { return FALSE; } From d911fccb3198ffb0629d9956115ae08244ce3e66 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 29 Jan 2013 15:14:13 +0200 Subject: [PATCH 2082/5397] [ci skip] Add some changelog entries --- user_guide_src/source/changelog.rst | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8b9ec2539ce..982ae22f42e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -38,7 +38,6 @@ Release Date: Not Released - Updated support for php files in mimes.php. - Updated support for zip files in mimes.php. - Updated support for csv files in mimes.php. - - Added some more doctypes. - Added Romanian, Greek, Vietnamese and Cyrilic characters in *application/config/foreign_characters.php*. - Changed logger to only chmod when file is first created. - Removed previously deprecated SHA1 Library. @@ -74,7 +73,10 @@ Release Date: Not Released - Added support (auto-detection) for HTTP/1.1 response code 303 in :php:func:`redirect()`. - Changed :php:func:`redirect()` to only choose the **refresh** method only on IIS servers, instead of all servers on Windows (when **auto** is used). - Changed :php:func:`anchor()`, :php:func:`anchor_popup()`, and :php:func:`redirect()` to support protocol-relative URLs (e.g. *//ellislab.com/codeigniter*). - - Added XHTML Basic 1.1 doctype to :doc:`HTML Helper `. + - :doc:`HTML Helper ` changes include: + - Added more doctypes. + - Changed application and environment config files to be loaded in a cascade-like manner. + - The doctypes array is now cached and loaded only once. - :doc:`Inflector Helper ` changes include: - Changed :php:func:`humanize()` to allow passing an input separator as its second parameter. - Refactored :php:func:`plural()` and :php:func:`singular()` to avoid double pluralization and support more words. @@ -88,7 +90,10 @@ Release Date: Not Released - :doc:`Security Helper ` changes include: - :php:func:`do_hash()` now uses PHP's native ``hash()`` function (supporting more algorithms) and is deprecated. - :php:func:`strip_image_tags()` is now an alias for the same method in the :doc:`Security Library `. - - Removed previously deprecated helper function ``js_insert_smiley()`` from :doc:`Smiley Helper `. + - :doc:`Smiley Helper ` changes include: + - Removed previously deprecated function ``js_insert_smiley()``. + - Changed application and environment config files to be loaded in a cascade-like manner. + - The smileys array is now cached and loaded only once. - :doc:`File Helper ` changes include: - :php:func:`set_realpath()` can now also handle file paths as opposed to just directories. - Added an optional paramater to :php:func:`delete_files()` to enable it to skip deleting files such as *.htaccess* and *index.html*. @@ -472,6 +477,7 @@ Bug fixes for 3.0 - Fixed a bug (#113) - :doc:`Form Validation Library ` didn't properly handle empty fields that were specified as an array. - Fixed a bug (#2061) - :doc:`Routing Class ` didn't properly sanitize directory, controller and function triggers with **enable_query_strings** set to TRUE. - Fixed a bug - SQLSRV didn't support ``escape_like_str()`` or escaping an array of values. +- Fixed a bug - :doc:`DB result ` method ``list_fields()`` didn't reset its field pointer for the *mysql*, *mysqli* and *mssql* drivers. Version 2.1.3 ============= From 7e5597782a589e4171ca08abdd9ce1a185542ff4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 29 Jan 2013 15:38:33 +0200 Subject: [PATCH 2083/5397] Replace CI_Upload::clean_file_name() usage with CI_Security::sanitize_filename() Also applied @xeptor's fix (a big thanks) to the sanitize_filename() method and added a changelog entry for it - fixes issue #73. --- system/core/Security.php | 10 +++++- system/libraries/Upload.php | 50 ++--------------------------- user_guide_src/source/changelog.rst | 2 ++ 3 files changed, 13 insertions(+), 49 deletions(-) diff --git a/system/core/Security.php b/system/core/Security.php index a6cd14a5f22..7aae54efc87 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -576,7 +576,15 @@ public function sanitize_filename($str, $relative_path = FALSE) } $str = remove_invisible_characters($str, FALSE); - return stripslashes(str_replace($bad, '', $str)); + + do + { + $old = $str; + $str = str_replace($bad, '', $str); + } + while ($old !== $str); + + return stripslashes($str); } // ---------------------------------------------------------------- diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 1f0bd6a6ea8..814ea68a4df 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -463,7 +463,8 @@ public function do_upload($field = 'userfile') } // Sanitize the file name for security - $this->file_name = $this->clean_file_name($this->file_name); + $CI =& get_instance(); + $this->file_name = $CI->security->sanitize_filename($this->file_name); // Truncate the file name if it's too long if ($this->max_filename > 0) @@ -970,53 +971,6 @@ public function get_extension($filename) // -------------------------------------------------------------------- - /** - * Clean the file name for security - * - * @param string $filename - * @return string - */ - public function clean_file_name($filename) - { - $bad = array( - '', - "'", '"', - '<', '>', - '&', '$', - '=', - ';', - '?', - '/', - '!', - '#', - '%20', - '%22', - '%3c', // < - '%253c', // < - '%3e', // > - '%0e', // > - '%28', // ( - '%29', // ) - '%2528', // ( - '%26', // & - '%24', // $ - '%3f', // ? - '%3b', // ; - '%3d' // = - ); - - do - { - $old_filename = $filename; - $filename = str_replace($bad, '', $filename); - } - while ($old_filename !== $filename); - - return stripslashes($filename); - } - - // -------------------------------------------------------------------- - /** * Limit the File Name Length * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 982ae22f42e..daa1cfc7af3 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -215,6 +215,7 @@ Release Date: Not Released - Added **max_filename_increment** config setting. - Added an **index** parameter to the ``data()`` method. - Added the **min_width** and **min_height** options for images. + - Removed method ``clean_file_name()`` and its usage in favor of :doc:`Security Library `'s ``sanitize_filename()``. - :doc:`Cart library ` changes include: - ``insert()`` now auto-increments quantity for an item when inserted twice instead of resetting it, this is the default behaviour of large e-commerce sites. - *Product Name* strictness can be disabled by switching the ``$product_name_safe`` property to FALSE. @@ -478,6 +479,7 @@ Bug fixes for 3.0 - Fixed a bug (#2061) - :doc:`Routing Class ` didn't properly sanitize directory, controller and function triggers with **enable_query_strings** set to TRUE. - Fixed a bug - SQLSRV didn't support ``escape_like_str()`` or escaping an array of values. - Fixed a bug - :doc:`DB result ` method ``list_fields()`` didn't reset its field pointer for the *mysql*, *mysqli* and *mssql* drivers. +- Fixed a bug (#73) - :doc:`Security Library ` method ``sanitize_filename()`` could be tricked by an XSS attack. Version 2.1.3 ============= From 4421ad07d7abf3d1f7e3ccc79a0e7f694ba0d30c Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Tue, 29 Jan 2013 22:51:01 +0800 Subject: [PATCH 2084/5397] fixed #2207 user guide error Signed-off-by: Bo-Yi Wu --- user_guide_src/source/tutorial/news_section.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/tutorial/news_section.rst b/user_guide_src/source/tutorial/news_section.rst index b64ea2aaeee..833e34ead7f 100644 --- a/user_guide_src/source/tutorial/news_section.rst +++ b/user_guide_src/source/tutorial/news_section.rst @@ -68,7 +68,7 @@ following code to your model. $query = $this->db->get('news'); return $query->result_array(); } - + $query = $this->db->get_where('news', array('slug' => $slug)); return $query->row_array(); } @@ -146,7 +146,7 @@ and add the next piece of code.

    -
    +

    View article

    From 8151cbb586edf565a57e33287b01222d9c4a85b6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 30 Jan 2013 13:57:56 +0200 Subject: [PATCH 2085/5397] Fix/improve #2211 --- system/libraries/Migration.php | 4 ++-- user_guide_src/source/changelog.rst | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index fd915c382f9..b673e9cb7d5 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -104,8 +104,8 @@ class CI_Migration { */ public function __construct($config = array()) { - # Only run this constructor on main library load - if (get_parent_class($this) !== FALSE) + // Only run this constructor on main library load + if ( ! in_array(get_class($this), array('CI_Migration', config_item('subclass_prefix').'Migration'), TRUE)) { return; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index daa1cfc7af3..de88dcf28d9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -480,6 +480,7 @@ Bug fixes for 3.0 - Fixed a bug - SQLSRV didn't support ``escape_like_str()`` or escaping an array of values. - Fixed a bug - :doc:`DB result ` method ``list_fields()`` didn't reset its field pointer for the *mysql*, *mysqli* and *mssql* drivers. - Fixed a bug (#73) - :doc:`Security Library ` method ``sanitize_filename()`` could be tricked by an XSS attack. +- Fixed a bug (#2211) - :doc:`Migration Library ` extensions couldn't execute ``CI_Migration::__construct()``. Version 2.1.3 ============= From ed92580e028b17230723807c51503e42f07cdb8e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 30 Jan 2013 13:59:19 +0200 Subject: [PATCH 2086/5397] Remove tests for now non-existent method CI_Upload::clean_file_name() See 7e5597782a589e4171ca08abdd9ce1a185542ff4 --- tests/codeigniter/libraries/Upload_test.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/codeigniter/libraries/Upload_test.php b/tests/codeigniter/libraries/Upload_test.php index 1bd8f14301a..4d9e4a46e4e 100644 --- a/tests/codeigniter/libraries/Upload_test.php +++ b/tests/codeigniter/libraries/Upload_test.php @@ -208,12 +208,6 @@ function test_get_extension() $this->assertEquals('', $this->upload->get_extension('hello')); } - function test_clean_file_name() - { - $this->assertEquals('hello.txt', $this->upload->clean_file_name('hello.txt')); - $this->assertEquals('hello.txt', $this->upload->clean_file_name('%253chell>o.txt')); - } - function test_limit_filename_length() { $this->assertEquals('hello.txt', $this->upload->limit_filename_length('hello.txt', 10)); From 3683723212c1de682c4e026df28fe3b03b4ea404 Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Wed, 30 Jan 2013 23:18:50 +0800 Subject: [PATCH 2087/5397] core comment error. Signed-off-by: Bo-Yi Wu --- system/core/Log.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Log.php b/system/core/Log.php index cd3c17e1e62..f5d091e1400 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -179,4 +179,4 @@ public function write_log($level = 'error', $msg, $php_error = FALSE) } /* End of file Log.php */ -/* Location: ./system/libraries/Log.php */ \ No newline at end of file +/* Location: ./system/core/Log.php */ \ No newline at end of file From d5c711cce17bbe2b24785e91a5ecc829e1ad5bf6 Mon Sep 17 00:00:00 2001 From: kaoz70 Date: Thu, 31 Jan 2013 20:54:09 -0500 Subject: [PATCH 2088/5397] Added some mime types, for newer or older files. --- application/config/mimes.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index dfa9f24e4f9..ac1479c0a94 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -44,13 +44,13 @@ 'lzh' => 'application/octet-stream', 'exe' => array('application/octet-stream', 'application/x-msdownload'), 'class' => 'application/octet-stream', - 'psd' => 'application/x-photoshop', + 'psd' => array('application/x-photoshop', 'image/vnd.adobe.photoshop'), 'so' => 'application/octet-stream', 'sea' => 'application/octet-stream', 'dll' => 'application/octet-stream', 'oda' => 'application/oda', 'pdf' => array('application/pdf', 'application/x-download', 'binary/octet-stream'), - 'ai' => 'application/postscript', + 'ai' => array('application/pdf', 'application/postscript'), 'eps' => 'application/postscript', 'ps' => 'application/postscript', 'smi' => 'application/smil', @@ -160,7 +160,7 @@ 'm3u' => 'text/plain', 'xspf' => 'application/xspf+xml', 'vlc' => 'application/videolan', - 'wmv' => 'video/x-ms-wmv', + 'wmv' => array('video/x-ms-wmv', 'video/x-ms-asf'), 'au' => 'audio/x-au', 'ac3' => 'audio/ac3', 'flac' => 'audio/x-flac', From 2d1608a6325d55ab31c55c27c31052c2daa76e46 Mon Sep 17 00:00:00 2001 From: Sajan Parikh Date: Sat, 2 Feb 2013 08:00:39 -0600 Subject: [PATCH 2089/5397] Added Form Validation rule for alphanum + spaces. Signed-off-by: Sajan Parikh --- system/libraries/Form_validation.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index bbd0b523e1b..7b9215c04e5 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1229,6 +1229,21 @@ public function alpha_numeric($str) return ctype_alnum((string) $str); } + // -------------------------------------------------------------------- + + // -------------------------------------------------------------------- + + /** + * Alpha-numeric w/ spaces + * + * @param string + * @return bool + */ + public function alpha_numeric_spaces($str) + { + return (bool) preg_match('#^[A-Z0-9 ]+$#i', $str); + } + // -------------------------------------------------------------------- /** From 7c162887a8146622e8fe126f21d9b8b615f91753 Mon Sep 17 00:00:00 2001 From: Sajan Parikh Date: Sat, 2 Feb 2013 08:05:38 -0600 Subject: [PATCH 2090/5397] Fixed documentation. Signed-off-by: Sajan Parikh --- user_guide_src/source/libraries/form_validation.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index ae7859aa35b..51205afa447 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -877,8 +877,10 @@ Rule Parameter Description **less_than_equal_to** Yes Returns FALSE if the form element is greater than the parameter value, less_than_equal_to[8] or not numeric. **alpha** No Returns FALSE if the form element contains anything other than alphabetical characters. -**alpha_numeric** No Returns FALSE if the form element contains anything other than alpha-numeric characters. -**alpha_dash** No Returns FALSE if the form element contains anything other than alpha-numeric characters, +**alpha_numeric** No Returns FALSE if the form element contains anything other than alpha-numeric characters. +**alpha_numeric_spaces** No Returns FALSE if the form element contains anything other than alpha-numeric characters + or spaces. Should be used after trim to avoid spaces at the beginning or end. +**alpha_dash** No Returns FALSE if the form element contains anything other than alpha-numeric characters, underscores or dashes. **numeric** No Returns FALSE if the form element contains anything other than numeric characters. **integer** No Returns FALSE if the form element contains anything other than an integer. From 9c0b890bb15394d8d6d976df65a9aa7c19c1c33d Mon Sep 17 00:00:00 2001 From: Sajan Parikh Date: Sat, 2 Feb 2013 08:56:35 -0600 Subject: [PATCH 2091/5397] Added error message in lang file. Signed-off-by: Sajan Parikh --- system/language/english/form_validation_lang.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/system/language/english/form_validation_lang.php b/system/language/english/form_validation_lang.php index 3fb007dd2ee..476123b065d 100644 --- a/system/language/english/form_validation_lang.php +++ b/system/language/english/form_validation_lang.php @@ -28,20 +28,21 @@ $lang['form_validation_required'] = 'The {field} field is required.'; $lang['form_validation_isset'] = 'The {field} field must have a value.'; -$lang['form_validation_valid_email'] = 'The {field} field must contain a valid email address.'; -$lang['form_validation_valid_emails'] = 'The {field} field must contain all valid email addresses.'; +$lang['form_validation_valid_email'] = 'The {field} field must contain a valid email address.'; +$lang['form_validation_valid_emails'] = 'The {field} field must contain all valid email addresses.'; $lang['form_validation_valid_url'] = 'The {field} field must contain a valid URL.'; $lang['form_validation_valid_ip'] = 'The {field} field must contain a valid IP.'; $lang['form_validation_min_length'] = 'The {field} field must be at least {param} characters in length.'; $lang['form_validation_max_length'] = 'The {field} field cannot exceed {param} characters in length.'; -$lang['form_validation_exact_length'] = 'The {field} field must be exactly {param} characters in length.'; +$lang['form_validation_exact_length'] = 'The {field} field must be exactly {param} characters in length.'; $lang['form_validation_alpha'] = 'The {field} field may only contain alphabetical characters.'; -$lang['form_validation_alpha_numeric'] = 'The {field} field may only contain alpha-numeric characters.'; +$lang['form_validation_alpha_numeric'] = 'The {field} field may only contain alpha-numeric characters.'; +$lang['form_validation_alpha_numeric_spaces'] = 'The {field} field may only contain alpha-numeric characters and spaces.'; $lang['form_validation_alpha_dash'] = 'The {field} field may only contain alpha-numeric characters, underscores, and dashes.'; $lang['form_validation_numeric'] = 'The {field} field must contain only numbers.'; $lang['form_validation_is_numeric'] = 'The {field} field must contain only numeric characters.'; $lang['form_validation_integer'] = 'The {field} field must contain an integer.'; -$lang['form_validation_regex_match'] = 'The {field} field is not in the correct format.'; +$lang['form_validation_regex_match'] = 'The {field} field is not in the correct format.'; $lang['form_validation_matches'] = 'The {field} field does not match the {param} field.'; $lang['form_validation_differs'] = 'The {field} field must differ from the {param} field.'; $lang['form_validation_is_unique'] = 'The {field} field must contain a unique value.'; From df3bfed9c19fe22d6449e2ee78ca5bd2fe9c6476 Mon Sep 17 00:00:00 2001 From: Sajan Parikh Date: Mon, 4 Feb 2013 12:25:49 -0600 Subject: [PATCH 2092/5397] Cleaned up for pull request. Signed-off-by: Sajan Parikh --- system/language/english/form_validation_lang.php | 10 +++++----- system/libraries/Form_validation.php | 4 +--- user_guide_src/source/libraries/form_validation.rst | 4 ++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/system/language/english/form_validation_lang.php b/system/language/english/form_validation_lang.php index 476123b065d..7c0277c25f6 100644 --- a/system/language/english/form_validation_lang.php +++ b/system/language/english/form_validation_lang.php @@ -28,21 +28,21 @@ $lang['form_validation_required'] = 'The {field} field is required.'; $lang['form_validation_isset'] = 'The {field} field must have a value.'; -$lang['form_validation_valid_email'] = 'The {field} field must contain a valid email address.'; -$lang['form_validation_valid_emails'] = 'The {field} field must contain all valid email addresses.'; +$lang['form_validation_valid_email'] = 'The {field} field must contain a valid email address.'; +$lang['form_validation_valid_emails'] = 'The {field} field must contain all valid email addresses.'; $lang['form_validation_valid_url'] = 'The {field} field must contain a valid URL.'; $lang['form_validation_valid_ip'] = 'The {field} field must contain a valid IP.'; $lang['form_validation_min_length'] = 'The {field} field must be at least {param} characters in length.'; $lang['form_validation_max_length'] = 'The {field} field cannot exceed {param} characters in length.'; -$lang['form_validation_exact_length'] = 'The {field} field must be exactly {param} characters in length.'; +$lang['form_validation_exact_length'] = 'The {field} field must be exactly {param} characters in length.'; $lang['form_validation_alpha'] = 'The {field} field may only contain alphabetical characters.'; -$lang['form_validation_alpha_numeric'] = 'The {field} field may only contain alpha-numeric characters.'; +$lang['form_validation_alpha_numeric'] = 'The {field} field may only contain alpha-numeric characters.'; $lang['form_validation_alpha_numeric_spaces'] = 'The {field} field may only contain alpha-numeric characters and spaces.'; $lang['form_validation_alpha_dash'] = 'The {field} field may only contain alpha-numeric characters, underscores, and dashes.'; $lang['form_validation_numeric'] = 'The {field} field must contain only numbers.'; $lang['form_validation_is_numeric'] = 'The {field} field must contain only numeric characters.'; $lang['form_validation_integer'] = 'The {field} field must contain an integer.'; -$lang['form_validation_regex_match'] = 'The {field} field is not in the correct format.'; +$lang['form_validation_regex_match'] = 'The {field} field is not in the correct format.'; $lang['form_validation_matches'] = 'The {field} field does not match the {param} field.'; $lang['form_validation_differs'] = 'The {field} field must differ from the {param} field.'; $lang['form_validation_is_unique'] = 'The {field} field must contain a unique value.'; diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 7b9215c04e5..1511d9adddf 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1229,8 +1229,6 @@ public function alpha_numeric($str) return ctype_alnum((string) $str); } - // -------------------------------------------------------------------- - // -------------------------------------------------------------------- /** @@ -1241,7 +1239,7 @@ public function alpha_numeric($str) */ public function alpha_numeric_spaces($str) { - return (bool) preg_match('#^[A-Z0-9 ]+$#i', $str); + return (bool) preg_match('/^[A-Z0-9 ]+$/i', $str); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 51205afa447..8b35fdc758b 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -879,8 +879,8 @@ Rule Parameter Description **alpha** No Returns FALSE if the form element contains anything other than alphabetical characters. **alpha_numeric** No Returns FALSE if the form element contains anything other than alpha-numeric characters. **alpha_numeric_spaces** No Returns FALSE if the form element contains anything other than alpha-numeric characters - or spaces. Should be used after trim to avoid spaces at the beginning or end. -**alpha_dash** No Returns FALSE if the form element contains anything other than alpha-numeric characters, + or spaces. Should be used after trim to avoid spaces at the beginning or end. +**alpha_dash** No Returns FALSE if the form element contains anything other than alpha-numeric characters, underscores or dashes. **numeric** No Returns FALSE if the form element contains anything other than numeric characters. **integer** No Returns FALSE if the form element contains anything other than an integer. From f9866509fbe79186976a9e4b0ca1aaa7fe0bdc7b Mon Sep 17 00:00:00 2001 From: Sajan Parikh Date: Mon, 4 Feb 2013 12:31:19 -0600 Subject: [PATCH 2093/5397] Add entry in user guide changelog. Signed-off-by: Sajan Parikh --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index de88dcf28d9..893c3db61ae 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -242,6 +242,7 @@ Release Date: Not Released - Added rule **valid_url**. - Added support for named parameters in error messages. - :doc:`Language ` line keys must now be prefixed with **form_validation_**. + - Added rule **alpha_numeric_spaces**. - Added support for setting :doc:`Table ` class defaults in a config file. - :doc:`Caching Library ` changes include: - Added Wincache driver. From baad7617b432708ef438a3b421e8b61b0d509b9d Mon Sep 17 00:00:00 2001 From: Lasha Krikheli Date: Tue, 5 Feb 2013 02:48:21 -0500 Subject: [PATCH 2094/5397] Added 'application/x-zip' mimetype for docx --- application/config/mimes.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index ac1479c0a94..0129c3ca146 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -123,7 +123,7 @@ 'avi' => array('video/x-msvideo', 'video/msvideo', 'video/avi', 'application/x-troff-msvideo'), 'movie' => 'video/x-sgi-movie', 'doc' => array('application/msword', 'application/vnd.ms-office'), - 'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'), + 'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'), 'dot' => array('application/msword', 'application/vnd.ms-office'), 'dotx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'), 'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword'), @@ -176,4 +176,4 @@ ); /* End of file mimes.php */ -/* Location: ./application/config/mimes.php */ \ No newline at end of file +/* Location: ./application/config/mimes.php */ From 9708855b4c2e5f6c75403da5aa0c07247518ab64 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 8 Feb 2013 21:53:20 +0200 Subject: [PATCH 2095/5397] Allow non-string values to be used as captcha words (issue #2215) --- system/helpers/captcha_helper.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 83783324bb9..78e255a1512 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -93,7 +93,7 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = // Do we have a "word" yet? // ----------------------------------- - if ($word === '') + if (empty($word)) { $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $word = ''; @@ -102,6 +102,10 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = $word .= $pool[mt_rand(0, $mt_rand_max)]; } } + elseif ( ! is_string($word)) + { + $word = (string) $word; + } // ----------------------------------- // Determine angle and position From cc221dc434e0d31138e81a940d38b81e994d48fe Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 8 Feb 2013 21:57:42 +0200 Subject: [PATCH 2096/5397] [ci skip] Add a missing space --- system/libraries/Session/drivers/Session_cookie.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session/drivers/Session_cookie.php b/system/libraries/Session/drivers/Session_cookie.php index 47464164210..11bb32fe07c 100644 --- a/system/libraries/Session/drivers/Session_cookie.php +++ b/system/libraries/Session/drivers/Session_cookie.php @@ -805,7 +805,7 @@ protected function _unescape_slashes(&$val, $key) { if (is_string($val)) { - $val= str_replace('{{slash}}', '\\', $val); + $val = str_replace('{{slash}}', '\\', $val); } } From 870f11351b6e7a916bf30aa22b4a8c3dd49bf33f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 8 Feb 2013 22:06:00 +0200 Subject: [PATCH 2097/5397] [ci skip] Remove unnecessary string casts in Pagination --- application/config/mimes.php | 2 +- system/libraries/Pagination.php | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index 0129c3ca146..5b8ceff2e65 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -176,4 +176,4 @@ ); /* End of file mimes.php */ -/* Location: ./application/config/mimes.php */ +/* Location: ./application/config/mimes.php */ \ No newline at end of file diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index 438d6c477f1..10fb29dbd6e 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -449,8 +449,7 @@ public function create_links() // Are we using query strings? if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) { - // Cast as string for use in ctype_digit() later. - $this->cur_page = (string) $CI->input->get($this->query_string_segment); + $this->cur_page = $CI->input->get($this->query_string_segment); } else { @@ -460,7 +459,7 @@ public function create_links() $this->uri_segment = count($CI->uri->segment_array()); } - $this->cur_page = (string) $CI->uri->segment($this->uri_segment); + $this->cur_page = $CI->uri->segment($this->uri_segment); // Remove any specified prefix/suffix from the segment. if ($this->prefix !== '' OR $this->suffix !== '') From c2268711a27809575f82b21e64fde6cd953ef7f9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 8 Feb 2013 22:10:23 +0200 Subject: [PATCH 2098/5397] Fix issue #2230 --- system/libraries/Form_validation.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 1511d9adddf..4cf4ecae0a8 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -517,7 +517,7 @@ protected function _reset_post_array() { if (isset($_POST[$row['field']])) { - $_POST[$row['field']] = $this->prep_for_form($row['postdata']); + $_POST[$row['field']] = $row['postdata']; } } else @@ -543,14 +543,14 @@ protected function _reset_post_array() $array = array(); foreach ($row['postdata'] as $k => $v) { - $array[$k] = $this->prep_for_form($v); + $array[$k] = $v; } $post_ref = $array; } else { - $post_ref = $this->prep_for_form($row['postdata']); + $post_ref = $row['postdata']; } } } From 0b607252b1f3bcabfb8150120e683795ec3a0890 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 13 Feb 2013 10:34:16 +0200 Subject: [PATCH 2099/5397] Added small feature to profiler: total execution time count MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit adds additional information to profiler like: DATABASE:  test   QUERIES: 3 (0.0016s)  (Hide) --- system/libraries/Profiler.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index e9323990126..67922d51c71 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -238,6 +238,8 @@ protected function _compile_queries() foreach ($dbs as $name => $db) { $hide_queries = (count($db->queries) > $this->_query_toggle_count) ? ' display:none' : ''; + + $total_time = number_format(array_sum($db->query_times), 4) . 's'; $show_hide_js = '('.$this->CI->lang->line('profiler_section_hide').')'; @@ -250,7 +252,7 @@ protected function _compile_queries() ."\n" .'  '.$this->CI->lang->line('profiler_database') .':  '.$db->database.' ('.$name.')   '.$this->CI->lang->line('profiler_queries') - .': '.count($db->queries).'  '.$show_hide_js."\n\n\n" + .': '.count($db->queries).'('.$total_time.')'.'  '.$show_hide_js."\n\n\n" .'\n"; if (count($db->queries) === 0) @@ -553,4 +555,4 @@ public function run() } /* End of file Profiler.php */ -/* Location: ./system/libraries/Profiler.php */ \ No newline at end of file +/* Location: ./system/libraries/Profiler.php */ From aae91a45e27cb11e09b22bf9be04a7da9f6ff20b Mon Sep 17 00:00:00 2001 From: Chris Passas Date: Wed, 13 Feb 2013 11:51:30 -0500 Subject: [PATCH 2100/5397] Update system/core/Log.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated Log.php so that a developer can extend it and change the log file extension. It makes sense to default to .php when logs are in the public web folder.  It would be nice if a developer moves the log file path we have the option to use a standard extension like .log --- system/core/Log.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/system/core/Log.php b/system/core/Log.php index f5d091e1400..3b0a9213dc6 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -71,6 +71,13 @@ class CI_Log { * @var string */ protected $_date_fmt = 'Y-m-d H:i:s'; + + /** + * Log file extension + * + * @var string + */ + protected $_log_ext = 'php'; /** * Whether or not the logger can write to the log files @@ -147,7 +154,7 @@ public function write_log($level = 'error', $msg, $php_error = FALSE) return FALSE; } - $filepath = $this->_log_path.'log-'.date('Y-m-d').'.php'; + $filepath = $this->_log_path.'log-'.date('Y-m-d').'.'.$this->_log_ext; $message = ''; if ( ! file_exists($filepath)) @@ -179,4 +186,4 @@ public function write_log($level = 'error', $msg, $php_error = FALSE) } /* End of file Log.php */ -/* Location: ./system/core/Log.php */ \ No newline at end of file +/* Location: ./system/core/Log.php */ From 0bd6b28045c9b9a820e580b3f651f474b60348a3 Mon Sep 17 00:00:00 2001 From: Chris Passas Date: Wed, 13 Feb 2013 14:16:18 -0500 Subject: [PATCH 2101/5397] Added support for changing the default log file extension from .php to whatever is preferred. example (.log) This is a follow up to this pull request. https://github.com/EllisLab/CodeIgniter/pull/2243 --- application/config/config.php | 11 +++++++++++ system/core/Log.php | 2 ++ user_guide_src/source/changelog.rst | 1 + 3 files changed, 14 insertions(+) diff --git a/application/config/config.php b/application/config/config.php index 415474e063d..6f597b1e288 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -224,6 +224,17 @@ */ $config['log_path'] = ''; +/* +|-------------------------------------------------------------------------- +| Log File Extension +|-------------------------------------------------------------------------- +| +| Leave this BLANK unless you would like to set something other than the default +| 'php'. For example you could change it to 'log'. +| +*/ +$config['log_file_extension'] = ''; + /* |-------------------------------------------------------------------------- | Date Format for Logs diff --git a/system/core/Log.php b/system/core/Log.php index 3b0a9213dc6..7572d2ac60a 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -104,6 +104,8 @@ public function __construct() $this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/'; + $this->_log_ext = ($config['log_file_extension'] !== '') ? $config['log_file_extension'] : $this->_log_ext; + file_exists($this->_log_path) OR mkdir($this->_log_path, DIR_WRITE_MODE, TRUE); if ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path)) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 893c3db61ae..7f12ca8a1b3 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -55,6 +55,7 @@ Release Date: Not Released - Updated *ip_address* database field lengths from 16 to 45 for supporting IPv6 address on :doc:`Trackback Library ` and :doc:`Captcha Helper `. - Removed *cheatsheets* and *quick_reference* PDFs from the documentation. - Added availability checks where usage of dangerous functions like ``eval()`` and ``exec()`` is required. + - Added support for changing the file extension of CodeIgniter log files using $config['log_file_extension']. - Helpers From 554d5dc6c1b9c6880a2fba150018c21ded8675c6 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 13 Feb 2013 22:37:31 +0200 Subject: [PATCH 2102/5397] changes according to narfbg's request --- system/language/english/profiler_lang.php | 1 + system/libraries/Profiler.php | 6 +++--- user_guide_src/source/changelog.rst | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/system/language/english/profiler_lang.php b/system/language/english/profiler_lang.php index dfe034e79cb..68e794e791a 100644 --- a/system/language/english/profiler_lang.php +++ b/system/language/english/profiler_lang.php @@ -46,6 +46,7 @@ $lang['profiler_no_profiles'] = 'No Profile data - all Profiler sections have been disabled.'; $lang['profiler_section_hide'] = 'Hide'; $lang['profiler_section_show'] = 'Show'; +$lang['profiler_seconds'] = 'seconds'; /* End of file profiler_lang.php */ /* Location: ./system/language/english/profiler_lang.php */ \ No newline at end of file diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index 67922d51c71..a3fa61c7cab 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -238,8 +238,8 @@ protected function _compile_queries() foreach ($dbs as $name => $db) { $hide_queries = (count($db->queries) > $this->_query_toggle_count) ? ' display:none' : ''; - - $total_time = number_format(array_sum($db->query_times), 4) . 's'; + + $total_time = number_format(array_sum($db->query_times), 4).$this->CI->lang->line('profiler_seconds'); $show_hide_js = '('.$this->CI->lang->line('profiler_section_hide').')'; @@ -555,4 +555,4 @@ public function run() } /* End of file Profiler.php */ -/* Location: ./system/libraries/Profiler.php */ +/* Location: ./system/libraries/Profiler.php */ \ No newline at end of file diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 893c3db61ae..3969943f685 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -271,7 +271,9 @@ Release Date: Not Released - :doc:`Encryption Library ` changes include: - Added support for hashing algorithms other than SHA1 and MD5. - Removed previously deprecated ``sha1()`` method. - - :doc:`Profiler Library ` now also displays database object names. + - :doc:`Profiler Library ` changes include: + - Database object names displayed. + - The sum of all queries running times in seconds displayed. - :doc:`Migration Library ` changes include: - Added support for timestamp-based migrations (enabled by default). - Added ``$config['migration_type']`` to allow switching between *sequential* and *timestamp* migrations. From 3224f077c37a054ea1995c07fe54bbe8b00e058a Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 14 Feb 2013 09:26:24 +0200 Subject: [PATCH 2103/5397] changes according to narfbg's request --- system/language/english/profiler_lang.php | 2 +- system/libraries/Profiler.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/system/language/english/profiler_lang.php b/system/language/english/profiler_lang.php index 68e794e791a..0ed5f4cb079 100644 --- a/system/language/english/profiler_lang.php +++ b/system/language/english/profiler_lang.php @@ -46,7 +46,7 @@ $lang['profiler_no_profiles'] = 'No Profile data - all Profiler sections have been disabled.'; $lang['profiler_section_hide'] = 'Hide'; $lang['profiler_section_show'] = 'Show'; -$lang['profiler_seconds'] = 'seconds'; +$lang['profiler_seconds'] = 'seconds'; /* End of file profiler_lang.php */ /* Location: ./system/language/english/profiler_lang.php */ \ No newline at end of file diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index a3fa61c7cab..ac8f6ba7156 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -238,8 +238,8 @@ protected function _compile_queries() foreach ($dbs as $name => $db) { $hide_queries = (count($db->queries) > $this->_query_toggle_count) ? ' display:none' : ''; - - $total_time = number_format(array_sum($db->query_times), 4).$this->CI->lang->line('profiler_seconds'); + + $total_time = number_format(array_sum($db->query_times), 4).' '.$this->CI->lang->line('profiler_seconds'); $show_hide_js = '('.$this->CI->lang->line('profiler_section_hide').')'; From 7219232771ee28f6f18248cfffd4fdffa570dfb7 Mon Sep 17 00:00:00 2001 From: maltzurra Date: Thu, 14 Feb 2013 11:12:37 +0100 Subject: [PATCH 2104/5397] Update system/core/Common.php Updated is_https() to avoid "NULL" or "0" values to set HTTPS. --- system/core/Common.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 258cd49678d..136dd521c20 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -343,7 +343,7 @@ function &get_mimes() */ function is_https() { - return ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off'); + return (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on'); } } @@ -713,4 +713,4 @@ function function_usable($function_name) } /* End of file Common.php */ -/* Location: ./system/core/Common.php */ \ No newline at end of file +/* Location: ./system/core/Common.php */ From 2718f6c8a5bbae38b7a7f875c6eef40739ce8ee4 Mon Sep 17 00:00:00 2001 From: Chris Passas Date: Thu, 14 Feb 2013 08:57:49 -0500 Subject: [PATCH 2105/5397] Update system/core/Log.php Added ltrim() as requested to strip '.' incase it's added by mistake. --- system/core/Log.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Log.php b/system/core/Log.php index 7572d2ac60a..abc7b249436 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -104,7 +104,7 @@ public function __construct() $this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/'; - $this->_log_ext = ($config['log_file_extension'] !== '') ? $config['log_file_extension'] : $this->_log_ext; + $this->_log_ext = ($config['log_file_extension'] !== '') ? ltrim($config['log_file_extension'],'.') : $this->_log_ext; file_exists($this->_log_path) OR mkdir($this->_log_path, DIR_WRITE_MODE, TRUE); From fb8de247990189721bc7b2e48fe57ceb2db039f5 Mon Sep 17 00:00:00 2001 From: Chris Passas Date: Thu, 14 Feb 2013 09:01:24 -0500 Subject: [PATCH 2106/5397] Update system/core/Log.php Don't print no script access code into log file if log file is not .php anymore. --- system/core/Log.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/system/core/Log.php b/system/core/Log.php index abc7b249436..7b2082a6c26 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -162,7 +162,10 @@ public function write_log($level = 'error', $msg, $php_error = FALSE) if ( ! file_exists($filepath)) { $newfile = TRUE; - $message .= '<'."?php defined('BASEPATH') OR exit('No direct script access allowed'); ?".">\n\n"; + if($this->_log_ext === 'php') + { + $message .= '<'."?php defined('BASEPATH') OR exit('No direct script access allowed'); ?".">\n\n"; + } } if ( ! $fp = @fopen($filepath, FOPEN_WRITE_CREATE)) From de8766f0a538ef9c4d39dcd88efc9422b5170360 Mon Sep 17 00:00:00 2001 From: maltzurra Date: Thu, 14 Feb 2013 15:38:58 +0100 Subject: [PATCH 2107/5397] Update system/core/Common.php --- system/core/Common.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/core/Common.php b/system/core/Common.php index 136dd521c20..0386ff37ac4 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -713,4 +713,5 @@ function function_usable($function_name) } /* End of file Common.php */ -/* Location: ./system/core/Common.php */ +/* Location: ./system/core/Common.php +*/ From beafe2fffbe5407f735caf2c286540d896d113f3 Mon Sep 17 00:00:00 2001 From: maltzurra Date: Thu, 14 Feb 2013 15:39:17 +0100 Subject: [PATCH 2108/5397] Update system/core/Common.php --- system/core/Common.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 0386ff37ac4..136dd521c20 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -713,5 +713,4 @@ function function_usable($function_name) } /* End of file Common.php */ -/* Location: ./system/core/Common.php -*/ +/* Location: ./system/core/Common.php */ From 3567246091195e035ea4c8d3b2915eb6b45ad5e2 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Fri, 15 Feb 2013 01:36:04 +0100 Subject: [PATCH 2109/5397] Various cosmetic fixes --- system/core/Loader.php | 2 +- system/core/URI.php | 2 +- system/libraries/Cart.php | 2 +- system/libraries/Form_validation.php | 2 +- system/libraries/Profiler.php | 2 +- system/libraries/Upload.php | 4 ++-- tests/codeigniter/core/URI_test.php | 2 +- user_guide_src/source/database/call_function.rst | 2 +- user_guide_src/source/general/controllers.rst | 4 ++-- user_guide_src/source/general/routing.rst | 2 +- user_guide_src/source/installation/upgrade_300.rst | 4 ++-- 11 files changed, 14 insertions(+), 14 deletions(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index 00ca3519952..9306a09efcc 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -988,7 +988,7 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL) return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name); } - // Lets search for the requested library file and load it. + // Let's search for the requested library file and load it. foreach ($this->_ci_library_paths as $path) { $filepath = $path.'libraries/'.$subdir.$class.'.php'; diff --git a/system/core/URI.php b/system/core/URI.php index 9b31a646bc0..b2286f032fe 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -126,7 +126,7 @@ public function _fetch_uri_string() return; } - // As a last ditch effort lets try using the $_GET array + // As a last ditch effort let's try using the $_GET array if (is_array($_GET) && count($_GET) === 1 && trim(key($_GET), '/') !== '') { $this->_set_uri_string(key($_GET)); diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index d64f6f042d4..b7b0697fbd6 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -365,7 +365,7 @@ protected function _update($items = array()) */ protected function _save_cart() { - // Lets add up the individual prices and set the cart sub-total + // Let's add up the individual prices and set the cart sub-total $this->_cart_contents['total_items'] = $this->_cart_contents['cart_total'] = 0; foreach ($this->_cart_contents as $key => $val) { diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 4cf4ecae0a8..172e799f647 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -356,7 +356,7 @@ public function error_array() */ public function error_string($prefix = '', $suffix = '') { - // No errrors, validation passes! + // No errors, validation passes! if (count($this->_error_array) === 0) { return ''; diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index ac8f6ba7156..36e0431b2ac 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -238,7 +238,7 @@ protected function _compile_queries() foreach ($dbs as $name => $db) { $hide_queries = (count($db->queries) > $this->_query_toggle_count) ? ' display:none' : ''; - + $total_time = number_format(array_sum($db->query_times), 4).' '.$this->CI->lang->line('profiler_seconds'); $show_hide_js = '('.$this->CI->lang->line('profiler_section_hide').')'; diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 814ea68a4df..acd76b03bf1 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -430,7 +430,7 @@ public function do_upload($field = 'userfile') } else { - // An extension was provided, lets have it! + // An extension was provided, let's have it! $this->file_ext = $this->get_extension($this->_file_name_override); } @@ -1050,7 +1050,7 @@ public function do_xss_clean() // ]/i', $opening_bytes); } diff --git a/tests/codeigniter/core/URI_test.php b/tests/codeigniter/core/URI_test.php index e2deabe5118..7fa0e6265b8 100644 --- a/tests/codeigniter/core/URI_test.php +++ b/tests/codeigniter/core/URI_test.php @@ -91,7 +91,7 @@ public function test_fetch_uri_string() public function test_explode_segments() { - // Lets test the function's ability to clean up this mess + // Let's test the function's ability to clean up this mess $uris = array( 'test/uri' => array('test', 'uri'), '/test2/uri2' => array('test2', 'uri2'), diff --git a/user_guide_src/source/database/call_function.rst b/user_guide_src/source/database/call_function.rst index 9890fc45352..83fc870d0c3 100644 --- a/user_guide_src/source/database/call_function.rst +++ b/user_guide_src/source/database/call_function.rst @@ -7,7 +7,7 @@ $this->db->call_function(); This function enables you to call PHP database functions that are not natively included in CodeIgniter, in a platform independent manner. For -example, lets say you want to call the mysql_get_client_info() +example, let's say you want to call the mysql_get_client_info() function, which is **not** natively supported by CodeIgniter. You could do so like this:: diff --git a/user_guide_src/source/general/controllers.rst b/user_guide_src/source/general/controllers.rst index 729b08417f0..8cfb012a055 100644 --- a/user_guide_src/source/general/controllers.rst +++ b/user_guide_src/source/general/controllers.rst @@ -108,7 +108,7 @@ Passing URI Segments to your methods If your URI contains more then two segments they will be passed to your method as parameters. -For example, lets say you have a URI like this:: +For example, let's say you have a URI like this:: example.com/index.php/products/shoes/sandals/123 @@ -267,7 +267,7 @@ Simply create folders within your *application/controllers/* directory and place your controller classes within them. .. note:: When using this feature the first segment of your URI must - specify the folder. For example, lets say you have a controller located + specify the folder. For example, let's say you have a controller located here:: application/controllers/products/shoes.php diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst index ed21a61095a..0c6dfe8881f 100644 --- a/user_guide_src/source/general/routing.rst +++ b/user_guide_src/source/general/routing.rst @@ -12,7 +12,7 @@ In some instances, however, you may want to remap this relationship so that a different class/method can be called instead of the one corresponding to the URL. -For example, lets say you want your URLs to have this prototype:: +For example, let's say you want your URLs to have this prototype:: example.com/product/1/ example.com/product/2/ diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 2d125a71a6a..a3ea01d02ab 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -129,9 +129,9 @@ The above files should respectively be renamed to the following: application/libraries/MY_Email.php application/core/MY_Log.php -**************************************************************************** +***************************************************************************** Step 10: Check the calls to Array Helper's element() and elements() functions -**************************************************************************** +***************************************************************************** The default return value of these functions, when the required elements don't exist, has been changed from FALSE to NULL. From 8d8636778ac600176772c4d54321a1e0842e5b07 Mon Sep 17 00:00:00 2001 From: Chris Passas Date: Fri, 15 Feb 2013 09:06:11 -0500 Subject: [PATCH 2110/5397] Update system/core/Log.php Added a space after the comma on the ltrim(). --- system/core/Log.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Log.php b/system/core/Log.php index 7b2082a6c26..2a4728dc49b 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -104,7 +104,7 @@ public function __construct() $this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/'; - $this->_log_ext = ($config['log_file_extension'] !== '') ? ltrim($config['log_file_extension'],'.') : $this->_log_ext; + $this->_log_ext = ($config['log_file_extension'] !== '') ? ltrim($config['log_file_extension'], '.') : $this->_log_ext; file_exists($this->_log_path) OR mkdir($this->_log_path, DIR_WRITE_MODE, TRUE); From ce6f43b7120a184aa0cff0bdb90fa3d7f032e14b Mon Sep 17 00:00:00 2001 From: Chris Passas Date: Tue, 12 Feb 2013 16:58:38 -0500 Subject: [PATCH 2111/5397] Update system/core/Common.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If using nginx instead of apache by default nginx will not populate the $_SERVER['HTTPS'] value.  This change allows falling back to checking the port number of the request to determine if your on SSL or not. The other option is adding the following to your nginx config. fastcgi_param HTTPS on; #some php apps require this to detent https --- system/core/Common.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 258cd49678d..b9c8727485a 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -343,7 +343,7 @@ function &get_mimes() */ function is_https() { - return ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off'); + return ( ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ) || ($_SERVER["SERVER_PORT"] === '443') ); } } @@ -713,4 +713,4 @@ function function_usable($function_name) } /* End of file Common.php */ -/* Location: ./system/core/Common.php */ \ No newline at end of file +/* Location: ./system/core/Common.php */ From 614cc1c384b84801428f9823007586584af00653 Mon Sep 17 00:00:00 2001 From: Chris Passas Date: Wed, 13 Feb 2013 11:45:20 -0500 Subject: [PATCH 2112/5397] Revert "Update system/core/Common.php" This reverts commit 8af05ac97513764cc539919e179794df87352c30. --- system/core/Common.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index b9c8727485a..258cd49678d 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -343,7 +343,7 @@ function &get_mimes() */ function is_https() { - return ( ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ) || ($_SERVER["SERVER_PORT"] === '443') ); + return ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off'); } } @@ -713,4 +713,4 @@ function function_usable($function_name) } /* End of file Common.php */ -/* Location: ./system/core/Common.php */ +/* Location: ./system/core/Common.php */ \ No newline at end of file From b0607703b32ec790cc300e9f77a18ea17ab6d7dd Mon Sep 17 00:00:00 2001 From: Chris Passas Date: Wed, 13 Feb 2013 11:47:02 -0500 Subject: [PATCH 2113/5397] Revert "Revert "Update system/core/Common.php"" This reverts commit 3de57eaea8510ea9cfd70f063565c24904669c4c. --- system/core/Common.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 258cd49678d..b9c8727485a 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -343,7 +343,7 @@ function &get_mimes() */ function is_https() { - return ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off'); + return ( ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ) || ($_SERVER["SERVER_PORT"] === '443') ); } } @@ -713,4 +713,4 @@ function function_usable($function_name) } /* End of file Common.php */ -/* Location: ./system/core/Common.php */ \ No newline at end of file +/* Location: ./system/core/Common.php */ From 6f19fd770b67804797c55d47c1c5f5fcb3a37b2e Mon Sep 17 00:00:00 2001 From: Chris Passas Date: Wed, 13 Feb 2013 11:47:02 -0500 Subject: [PATCH 2114/5397] Revert "Update system/core/Log.php" This reverts commit bbc6ab4736a896be83e3e3d5f8856374ffa2984c. --- system/core/Log.php | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/system/core/Log.php b/system/core/Log.php index 2a4728dc49b..0749de8ba0f 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -71,13 +71,6 @@ class CI_Log { * @var string */ protected $_date_fmt = 'Y-m-d H:i:s'; - - /** - * Log file extension - * - * @var string - */ - protected $_log_ext = 'php'; /** * Whether or not the logger can write to the log files @@ -156,7 +149,7 @@ public function write_log($level = 'error', $msg, $php_error = FALSE) return FALSE; } - $filepath = $this->_log_path.'log-'.date('Y-m-d').'.'.$this->_log_ext; + $filepath = $this->_log_path.'log-'.date('Y-m-d').'.php'; $message = ''; if ( ! file_exists($filepath)) @@ -191,4 +184,4 @@ public function write_log($level = 'error', $msg, $php_error = FALSE) } /* End of file Log.php */ -/* Location: ./system/core/Log.php */ +/* Location: ./system/core/Log.php */ \ No newline at end of file From 62f7cdf3a6f5d701430267ef9ba9bfd92650deab Mon Sep 17 00:00:00 2001 From: Chris Passas Date: Wed, 13 Feb 2013 11:47:45 -0500 Subject: [PATCH 2115/5397] Revert "Update system/core/Common.php" This reverts commit 8af05ac97513764cc539919e179794df87352c30. --- system/core/Common.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index b9c8727485a..258cd49678d 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -343,7 +343,7 @@ function &get_mimes() */ function is_https() { - return ( ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ) || ($_SERVER["SERVER_PORT"] === '443') ); + return ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off'); } } @@ -713,4 +713,4 @@ function function_usable($function_name) } /* End of file Common.php */ -/* Location: ./system/core/Common.php */ +/* Location: ./system/core/Common.php */ \ No newline at end of file From a107a0fd79d0ee5f6292138a76398ed390041710 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Feb 2013 22:30:31 +0200 Subject: [PATCH 2116/5397] Fix some stuff from recent pull requests --- application/config/config.php | 7 +++++-- system/core/Common.php | 6 +++--- system/core/Log.php | 24 +++++++++++++++++------- system/libraries/Profiler.php | 3 +-- user_guide_src/source/changelog.rst | 6 +++--- 5 files changed, 29 insertions(+), 17 deletions(-) diff --git a/application/config/config.php b/application/config/config.php index 6f597b1e288..0608348c627 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -229,8 +229,11 @@ | Log File Extension |-------------------------------------------------------------------------- | -| Leave this BLANK unless you would like to set something other than the default -| 'php'. For example you could change it to 'log'. +| The default filename extension for log files. The default 'php' allows for +| protecting the log files via basic scripting, when they are to be stored +| under a publicly accessible directory. +| +| Note: Leaving it blank will default to 'php'. | */ $config['log_file_extension'] = ''; diff --git a/system/core/Common.php b/system/core/Common.php index 136dd521c20..f8c1290f5d9 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -414,7 +414,7 @@ function show_404($page = '', $log_error = TRUE) function log_message($level = 'error', $message, $php_error = FALSE) { static $_log, $_log_threshold; - + if ($_log_threshold === NULL) { $_log_threshold = config_item('log_threshold'); @@ -429,7 +429,7 @@ function log_message($level = 'error', $message, $php_error = FALSE) { $_log =& load_class('Log', 'core'); } - + $_log->write_log($level, $message, $php_error); } } @@ -713,4 +713,4 @@ function function_usable($function_name) } /* End of file Common.php */ -/* Location: ./system/core/Common.php */ +/* Location: ./system/core/Common.php */ \ No newline at end of file diff --git a/system/core/Log.php b/system/core/Log.php index 0749de8ba0f..a84d3dc2298 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -72,6 +72,13 @@ class CI_Log { */ protected $_date_fmt = 'Y-m-d H:i:s'; + /** + * Filename extension + * + * @var string + */ + protected $_file_ext; + /** * Whether or not the logger can write to the log files * @@ -86,8 +93,10 @@ class CI_Log { */ protected $_levels = array('ERROR' => 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4); + // -------------------------------------------------------------------- + /** - * Initialize Logging class + * Class constructor * * @return void */ @@ -96,8 +105,8 @@ public function __construct() $config =& get_config(); $this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/'; - - $this->_log_ext = ($config['log_file_extension'] !== '') ? ltrim($config['log_file_extension'], '.') : $this->_log_ext; + $this->_file_ext = (isset($config['log_file_extension']) && $config['log_file_extension'] !== '') + ? ltrim($config['log_file_extension'], '.') : 'php'; file_exists($this->_log_path) OR mkdir($this->_log_path, DIR_WRITE_MODE, TRUE); @@ -149,15 +158,16 @@ public function write_log($level = 'error', $msg, $php_error = FALSE) return FALSE; } - $filepath = $this->_log_path.'log-'.date('Y-m-d').'.php'; - $message = ''; + $filepath = $this->_log_path.'log-'.date('Y-m-d').'.'.$this->_file_ext; + $message = ''; if ( ! file_exists($filepath)) { $newfile = TRUE; - if($this->_log_ext === 'php') + // Only add protection to php files + if ($this->_file_ext === 'php') { - $message .= '<'."?php defined('BASEPATH') OR exit('No direct script access allowed'); ?".">\n\n"; + $message .= "\n\n"; } } diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index 36e0431b2ac..470688fdc6e 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -238,7 +238,6 @@ protected function _compile_queries() foreach ($dbs as $name => $db) { $hide_queries = (count($db->queries) > $this->_query_toggle_count) ? ' display:none' : ''; - $total_time = number_format(array_sum($db->query_times), 4).' '.$this->CI->lang->line('profiler_seconds'); $show_hide_js = '('.$this->CI->lang->line('profiler_section_hide').')'; @@ -252,7 +251,7 @@ protected function _compile_queries() ."\n" .'  '.$this->CI->lang->line('profiler_database') .':  '.$db->database.' ('.$name.')   '.$this->CI->lang->line('profiler_queries') - .': '.count($db->queries).'('.$total_time.')'.'  '.$show_hide_js."\n\n\n" + .': '.count($db->queries).' ('.$total_time.')  '.$show_hide_js."\n\n\n" .'
    \n"; if (count($db->queries) === 0) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 140fda8e7c6..8d3f3705d29 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -55,7 +55,7 @@ Release Date: Not Released - Updated *ip_address* database field lengths from 16 to 45 for supporting IPv6 address on :doc:`Trackback Library ` and :doc:`Captcha Helper `. - Removed *cheatsheets* and *quick_reference* PDFs from the documentation. - Added availability checks where usage of dangerous functions like ``eval()`` and ``exec()`` is required. - - Added support for changing the file extension of CodeIgniter log files using $config['log_file_extension']. + - Added support for changing the file extension of log files using ``$config['log_file_extension']``. - Helpers @@ -273,8 +273,8 @@ Release Date: Not Released - Added support for hashing algorithms other than SHA1 and MD5. - Removed previously deprecated ``sha1()`` method. - :doc:`Profiler Library ` changes include: - - Database object names displayed. - - The sum of all queries running times in seconds displayed. + - Database object names are now being displayed. + - The sum of all queries running times in seconds is now being displayed. - :doc:`Migration Library ` changes include: - Added support for timestamp-based migrations (enabled by default). - Added ``$config['migration_type']`` to allow switching between *sequential* and *timestamp* migrations. From 99ba3a26973848604719db08bbcafbfa82ca087f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Feb 2013 22:42:22 +0200 Subject: [PATCH 2117/5397] Fix #2247 --- system/helpers/form_helper.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index f343b6c7162..d6e3e85fa12 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -228,13 +228,10 @@ function form_password($data = '', $value = '', $extra = '') */ function form_upload($data = '', $value = '', $extra = '') { - if ( ! is_array($data)) - { - $data = array('name' => $data); - } - + $default = array('type' => 'file', 'name' => ''); + is_array($data) OR $data = array('name' => $data); $data['type'] = 'file'; - return form_input($data, $value, $extra); + return '\n"; } } From 687742109d5e8f06eadb1607501e5a94163aa902 Mon Sep 17 00:00:00 2001 From: David Barratt Date: Sat, 16 Feb 2013 02:01:47 -0500 Subject: [PATCH 2118/5397] Add the Project Name to the Composer File. --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 7d60020c3ac..141ce2bfbdb 100644 --- a/composer.json +++ b/composer.json @@ -1,4 +1,5 @@ { + "name" : "EllisLab/CodeIgniter", "require": { "mikey179/vfsStream": "*" }, From d20ed1dbc3b2e3f3b1dd60325f95fff745bfebbb Mon Sep 17 00:00:00 2001 From: David Barratt Date: Sat, 16 Feb 2013 02:03:20 -0500 Subject: [PATCH 2119/5397] Lowercase the project name as uppercase letters are not allowed. --- composer.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 141ce2bfbdb..b48f8c11862 100644 --- a/composer.json +++ b/composer.json @@ -1,9 +1,9 @@ { - "name" : "EllisLab/CodeIgniter", + "name" : "ellislab/codeigniter", "require": { "mikey179/vfsStream": "*" }, "require-dev": { - "phpunit/phpunit": "*" - } + "phpunit/phpunit": "*" + } } \ No newline at end of file From 0fc08356b982807750464a7695c8fba47599d32e Mon Sep 17 00:00:00 2001 From: David Barratt Date: Sat, 16 Feb 2013 02:52:00 -0500 Subject: [PATCH 2120/5397] Require at least PHP 5.1.6. --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index b48f8c11862..bcab60f23e9 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,7 @@ { "name" : "ellislab/codeigniter", "require": { + "php": ">=5.1.6", "mikey179/vfsStream": "*" }, "require-dev": { From 7a8db6506dfad2a8dbb7b9ba09133c8c0152d6e8 Mon Sep 17 00:00:00 2001 From: David Barratt Date: Sat, 16 Feb 2013 10:51:52 -0500 Subject: [PATCH 2121/5397] Update the required version of PHP to 5.2.4 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index bcab60f23e9..c13ac5aca78 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name" : "ellislab/codeigniter", "require": { - "php": ">=5.1.6", + "php": ">=5.2.4", "mikey179/vfsStream": "*" }, "require-dev": { From cf22557383fea89906633b8034ff9f08eb498621 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Mon, 18 Feb 2013 01:08:04 +0530 Subject: [PATCH 2122/5397] Added keep-alive connection to SMTP. Fixed socket read/write timeouts. Added PHP useragent --- system/libraries/Email.php | 524 ++++++++++++++++++++----------------- 1 file changed, 290 insertions(+), 234 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 997757b0a6f..36cebfab535 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -94,6 +94,13 @@ class CI_Email { * @var int */ public $smtp_timeout = 5; + + /** + * STMP Persistent connection + * + * @var bool + */ + public $smtp_keepalive = FALSE; /** * SMTP Encryption @@ -399,6 +406,19 @@ public function __construct($config = array()) log_message('debug', 'Email Class Initialized'); } + + // -------------------------------------------------------------------- + + /** + * Destructor - Releases Resources + * + * @return void + */ + function __destruct() + { + if(is_resource($this->_smtp_connect)) + $this->_send_command('quit'); + } // -------------------------------------------------------------------- @@ -770,6 +790,23 @@ public function set_mailtype($type = 'text') // -------------------------------------------------------------------- + /** + * Set Useragent + * + * @param string + * @return void + */ + public function set_useragent($type = '') + { + if( ! $type) + $this->useragent = isset($_SERVER['HTTP_USER_AGENT'])? $_SERVER['HTTP_USER_AGENT'] : 'PHP/'.phpversion(); + else + $this->useragent = $type; + return $this; + } + + // -------------------------------------------------------------------- + /** * Set Wordwrap * @@ -1766,241 +1803,260 @@ protected function _send_with_sendmail() * @return bool */ protected function _send_with_smtp() - { - if ($this->smtp_host === '') - { - $this->_set_error_message('lang:email_no_hostname'); - return FALSE; - } - - if ( ! $this->_smtp_connect() OR ! $this->_smtp_authenticate()) - { - return FALSE; - } - - $this->_send_command('from', $this->clean_email($this->_headers['From'])); - - foreach ($this->_recipients as $val) - { - $this->_send_command('to', $val); - } - - if (count($this->_cc_array) > 0) - { - foreach ($this->_cc_array as $val) - { - if ($val !== '') - { - $this->_send_command('to', $val); - } - } - } - - if (count($this->_bcc_array) > 0) - { - foreach ($this->_bcc_array as $val) - { - if ($val !== '') - { - $this->_send_command('to', $val); - } - } - } - - $this->_send_command('data'); - - // perform dot transformation on any lines that begin with a dot - $this->_send_data($this->_header_str.preg_replace('/^\./m', '..$1', $this->_finalbody)); - - $this->_send_data('.'); - - $reply = $this->_get_smtp_data(); - - $this->_set_error_message($reply); - - if (strpos($reply, '250') !== 0) - { - $this->_set_error_message('lang:email_smtp_error', $reply); - return FALSE; - } - - $this->_send_command('quit'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * SMTP Connect - * - * @return string - */ - protected function _smtp_connect() - { - $ssl = ($this->smtp_crypto === 'ssl') ? 'ssl://' : NULL; - - $this->_smtp_connect = fsockopen($ssl.$this->smtp_host, - $this->smtp_port, - $errno, - $errstr, - $this->smtp_timeout); - - if ( ! is_resource($this->_smtp_connect)) - { - $this->_set_error_message('lang:email_smtp_error', $errno.' '.$errstr); - return FALSE; - } - - $this->_set_error_message($this->_get_smtp_data()); - - if ($this->smtp_crypto === 'tls') - { - $this->_send_command('hello'); - $this->_send_command('starttls'); - - $crypto = stream_socket_enable_crypto($this->_smtp_connect, TRUE, STREAM_CRYPTO_METHOD_TLS_CLIENT); - - if ($crypto !== TRUE) - { - $this->_set_error_message('lang:email_smtp_error', $this->_get_smtp_data()); - return FALSE; - } - } - - return $this->_send_command('hello'); - } - - // -------------------------------------------------------------------- + { + if ($this->smtp_host === '') + { + $this->_set_error_message('lang:email_no_hostname'); + return FALSE; + } + + if ( ! $this->_smtp_connect() OR ! $this->_smtp_authenticate()) + { + return FALSE; + } + + $this->_send_command('from', $this->clean_email($this->_headers['From'])); + + foreach ($this->_recipients as $val) + { + $this->_send_command('to', $val); + } + + if (count($this->_cc_array) > 0) + { + foreach ($this->_cc_array as $val) + { + if ($val !== '') + { + $this->_send_command('to', $val); + } + } + } + + if (count($this->_bcc_array) > 0) + { + foreach ($this->_bcc_array as $val) + { + if ($val !== '') + { + $this->_send_command('to', $val); + } + } + } + + $this->_send_command('data'); + + // perform dot transformation on any lines that begin with a dot + $this->_send_data($this->_header_str.preg_replace('/^\./m', '..$1', $this->_finalbody)); + + $this->_send_data('.'); + + $reply = $this->_get_smtp_data(); + + $this->_set_error_message($reply); + + if (strpos($reply, '250') !== 0) + { + $this->_set_error_message('lang:email_smtp_error', $reply); + return FALSE; + } + + if($this->smtp_keepalive) + $this->_send_command('reset'); + else + $this->_send_command('quit'); + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * SMTP Connect + * + * @param bool + * @return string + */ + protected function _smtp_connect($force=FALSE) + { + if( ! is_resource($this->_smtp_connect) || $force) + { + $ssl = ($this->smtp_crypto === 'ssl') ? 'ssl://' : NULL; + + $this->_smtp_connect = fsockopen($ssl.$this->smtp_host, + $this->smtp_port, + $errno, + $errstr, + $this->smtp_timeout); + + if ( ! is_resource($this->_smtp_connect)) + { + $this->_set_error_message('lang:email_smtp_error', $errno.' '.$errstr); + return FALSE; + } + + stream_set_timeout($this->_smtp_connect, $this->smtp_timeout); + $this->_set_error_message($this->_get_smtp_data()); + + if ($this->smtp_crypto === 'tls') + { + $this->_send_command('hello'); + $this->_send_command('starttls'); + + $crypto = stream_socket_enable_crypto($this->_smtp_connect, TRUE, STREAM_CRYPTO_METHOD_TLS_CLIENT); + + if ($crypto !== TRUE) + { + $this->_set_error_message('lang:email_smtp_error', $this->_get_smtp_data()); + return FALSE; + } + } + + return $this->_send_command('hello'); + } + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Send SMTP command + * + * @param string + * @param string + * @return string + */ + protected function _send_command($cmd, $data = '') + { + switch ($cmd) + { + case 'hello' : + + if ($this->_smtp_auth OR $this->_get_encoding() === '8bit') + { + $this->_send_data('EHLO '.$this->_get_hostname()); + } + else + { + $this->_send_data('HELO '.$this->_get_hostname()); + } + + $resp = 250; + break; + case 'starttls' : + + $this->_send_data('STARTTLS'); + $resp = 220; + break; + case 'from' : + + $this->_send_data('MAIL FROM:<'.$data.'>'); + $resp = 250; + break; + case 'to' : + + if ($this->dsn) + { + $this->_send_data('RCPT TO:<'.$data.'> NOTIFY=SUCCESS,DELAY,FAILURE ORCPT=rfc822;'.$data); + } + else + { + $this->_send_data('RCPT TO:<'.$data.'>'); + } + + $resp = 250; + break; + case 'data' : + + $this->_send_data('DATA'); + $resp = 354; + break; + case 'reset': + + $this->_send_data('RSET'); + + $resp = 250; + break; + case 'quit' : + + $this->_send_data('QUIT'); + $resp = 221; + break; + } + + $reply = $this->_get_smtp_data(); + + $this->_debug_msg[] = '
    '.$cmd.': '.$reply.'
    '; + + if ((int) substr($reply, 0, 3) !== $resp) + { + $this->_set_error_message('lang:email_smtp_error', $reply); + return FALSE; + } + + if ($cmd === 'quit') + { + fclose($this->_smtp_connect); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * SMTP Authenticate + * + * @return bool + */ + protected function _smtp_authenticate() + { + if ( ! $this->_smtp_auth) + { + return TRUE; + } + + if ($this->smtp_user === '' && $this->smtp_pass === '') + { + $this->_set_error_message('lang:email_no_smtp_unpw'); + return FALSE; + } + + $this->_send_data('AUTH LOGIN'); + + $reply = $this->_get_smtp_data(); + + if (strpos($reply, '503') === 0) // Already authenticated + return TRUE; + + if (strpos($reply, '334') !== 0) + { + $this->_set_error_message('lang:email_failed_smtp_login', $reply); + return FALSE; + } + + $this->_send_data(base64_encode($this->smtp_user)); + + $reply = $this->_get_smtp_data(); + + if (strpos($reply, '334') !== 0) + { + $this->_set_error_message('lang:email_smtp_auth_un', $reply); + return FALSE; + } + + $this->_send_data(base64_encode($this->smtp_pass)); + + $reply = $this->_get_smtp_data(); + + if (strpos($reply, '235') !== 0) + { + $this->_set_error_message('lang:email_smtp_auth_pw', $reply); + return FALSE; + } - /** - * Send SMTP command - * - * @param string - * @param string - * @return string - */ - protected function _send_command($cmd, $data = '') - { - switch ($cmd) - { - case 'hello' : - - if ($this->_smtp_auth OR $this->_get_encoding() === '8bit') - { - $this->_send_data('EHLO '.$this->_get_hostname()); - } - else - { - $this->_send_data('HELO '.$this->_get_hostname()); - } - - $resp = 250; - break; - case 'starttls' : - - $this->_send_data('STARTTLS'); - $resp = 220; - break; - case 'from' : - - $this->_send_data('MAIL FROM:<'.$data.'>'); - $resp = 250; - break; - case 'to' : - - if ($this->dsn) - { - $this->_send_data('RCPT TO:<'.$data.'> NOTIFY=SUCCESS,DELAY,FAILURE ORCPT=rfc822;'.$data); - } - else - { - $this->_send_data('RCPT TO:<'.$data.'>'); - } - - $resp = 250; - break; - case 'data' : - - $this->_send_data('DATA'); - $resp = 354; - break; - case 'quit' : - - $this->_send_data('QUIT'); - $resp = 221; - break; - } - - $reply = $this->_get_smtp_data(); - - $this->_debug_msg[] = '
    '.$cmd.': '.$reply.'
    '; - - if ((int) substr($reply, 0, 3) !== $resp) - { - $this->_set_error_message('lang:email_smtp_error', $reply); - return FALSE; - } - - if ($cmd === 'quit') - { - fclose($this->_smtp_connect); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * SMTP Authenticate - * - * @return bool - */ - protected function _smtp_authenticate() - { - if ( ! $this->_smtp_auth) - { - return TRUE; - } - - if ($this->smtp_user === '' && $this->smtp_pass === '') - { - $this->_set_error_message('lang:email_no_smtp_unpw'); - return FALSE; - } - - $this->_send_data('AUTH LOGIN'); - - $reply = $this->_get_smtp_data(); - - if (strpos($reply, '334') !== 0) - { - $this->_set_error_message('lang:email_failed_smtp_login', $reply); - return FALSE; - } - - $this->_send_data(base64_encode($this->smtp_user)); - - $reply = $this->_get_smtp_data(); - - if (strpos($reply, '334') !== 0) - { - $this->_set_error_message('lang:email_smtp_auth_un', $reply); - return FALSE; - } - - $this->_send_data(base64_encode($this->smtp_pass)); - - $reply = $this->_get_smtp_data(); - - if (strpos($reply, '235') !== 0) - { - $this->_set_error_message('lang:email_smtp_auth_pw', $reply); - return FALSE; - } - - return TRUE; - } + return TRUE; + } // -------------------------------------------------------------------- From 06ddcf05c6861a908a0b3b57c6ba4a05bb82e10a Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Mon, 18 Feb 2013 08:52:05 +0800 Subject: [PATCH 2123/5397] Fixed form helper variable error Signed-off-by: Bo-Yi Wu --- system/helpers/form_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index d6e3e85fa12..692909c79d0 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -228,7 +228,7 @@ function form_password($data = '', $value = '', $extra = '') */ function form_upload($data = '', $value = '', $extra = '') { - $default = array('type' => 'file', 'name' => ''); + $defaults = array('type' => 'file', 'name' => ''); is_array($data) OR $data = array('name' => $data); $data['type'] = 'file'; return '\n"; From e8f15935a4f576d219708f495c19f234ac5a238a Mon Sep 17 00:00:00 2001 From: David Barratt Date: Sun, 17 Feb 2013 23:20:54 -0500 Subject: [PATCH 2124/5397] Move mikey179/vfsStream to only be required on dev --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index c13ac5aca78..bf3b3d22b9a 100644 --- a/composer.json +++ b/composer.json @@ -2,9 +2,9 @@ "name" : "ellislab/codeigniter", "require": { "php": ">=5.2.4", - "mikey179/vfsStream": "*" }, "require-dev": { + "mikey179/vfsStream": "*" "phpunit/phpunit": "*" } } \ No newline at end of file From cbe553072812de5cbfbdf4603d18d8b1cad4e453 Mon Sep 17 00:00:00 2001 From: David Barratt Date: Sun, 17 Feb 2013 23:27:16 -0500 Subject: [PATCH 2125/5397] Fix a JSON validation error --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index bf3b3d22b9a..54f305e89cd 100644 --- a/composer.json +++ b/composer.json @@ -1,10 +1,10 @@ { "name" : "ellislab/codeigniter", "require": { - "php": ">=5.2.4", + "php": ">=5.2.4" }, "require-dev": { - "mikey179/vfsStream": "*" + "mikey179/vfsStream": "*", "phpunit/phpunit": "*" } } \ No newline at end of file From 59209deaf2467372ba0deef5a4266758b366ca70 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Mon, 18 Feb 2013 17:02:13 +0530 Subject: [PATCH 2126/5397] Fixed tab-indentation. Made appropriate entries in changelog --- system/libraries/Email.php | 565 ++++++++++++++++++------------------- 1 file changed, 282 insertions(+), 283 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 36cebfab535..7ea49a95986 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -96,11 +96,11 @@ class CI_Email { public $smtp_timeout = 5; /** - * STMP Persistent connection - * - * @var bool - */ - public $smtp_keepalive = FALSE; + * SMTP persistent connection + * + * @var bool + */ + public $smtp_keepalive = FALSE; /** * SMTP Encryption @@ -406,19 +406,19 @@ public function __construct($config = array()) log_message('debug', 'Email Class Initialized'); } - + // -------------------------------------------------------------------- /** - * Destructor - Releases Resources - * - * @return void - */ - function __destruct() - { - if(is_resource($this->_smtp_connect)) - $this->_send_command('quit'); - } + * Destructor - Releases Resources + * + * @return void + */ + public function __destruct() + { + if(is_resource($this->_smtp_connect)) + $this->_send_command('quit'); + } // -------------------------------------------------------------------- @@ -789,22 +789,22 @@ public function set_mailtype($type = 'text') } // -------------------------------------------------------------------- - - /** - * Set Useragent - * - * @param string - * @return void - */ - public function set_useragent($type = '') - { - if( ! $type) - $this->useragent = isset($_SERVER['HTTP_USER_AGENT'])? $_SERVER['HTTP_USER_AGENT'] : 'PHP/'.phpversion(); - else - $this->useragent = $type; - return $this; - } + /** + * Set Useragent + * + * @param string + * @return void + */ + public function set_useragent($type = '') + { + if( ! $type) + $this->useragent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'PHP/'.phpversion(); + else + $this->useragent = $type; + return $this; + } + // -------------------------------------------------------------------- /** @@ -1803,260 +1803,259 @@ protected function _send_with_sendmail() * @return bool */ protected function _send_with_smtp() - { - if ($this->smtp_host === '') - { - $this->_set_error_message('lang:email_no_hostname'); - return FALSE; - } - - if ( ! $this->_smtp_connect() OR ! $this->_smtp_authenticate()) - { - return FALSE; - } - - $this->_send_command('from', $this->clean_email($this->_headers['From'])); - - foreach ($this->_recipients as $val) - { - $this->_send_command('to', $val); - } - - if (count($this->_cc_array) > 0) - { - foreach ($this->_cc_array as $val) - { - if ($val !== '') - { - $this->_send_command('to', $val); - } - } - } - - if (count($this->_bcc_array) > 0) - { - foreach ($this->_bcc_array as $val) - { - if ($val !== '') - { - $this->_send_command('to', $val); - } - } - } - - $this->_send_command('data'); - - // perform dot transformation on any lines that begin with a dot - $this->_send_data($this->_header_str.preg_replace('/^\./m', '..$1', $this->_finalbody)); - - $this->_send_data('.'); - - $reply = $this->_get_smtp_data(); - - $this->_set_error_message($reply); - - if (strpos($reply, '250') !== 0) - { - $this->_set_error_message('lang:email_smtp_error', $reply); - return FALSE; - } - - if($this->smtp_keepalive) - $this->_send_command('reset'); - else - $this->_send_command('quit'); - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * SMTP Connect - * - * @param bool - * @return string - */ - protected function _smtp_connect($force=FALSE) - { - if( ! is_resource($this->_smtp_connect) || $force) - { - $ssl = ($this->smtp_crypto === 'ssl') ? 'ssl://' : NULL; - - $this->_smtp_connect = fsockopen($ssl.$this->smtp_host, - $this->smtp_port, - $errno, - $errstr, - $this->smtp_timeout); - - if ( ! is_resource($this->_smtp_connect)) - { - $this->_set_error_message('lang:email_smtp_error', $errno.' '.$errstr); - return FALSE; - } - - stream_set_timeout($this->_smtp_connect, $this->smtp_timeout); - $this->_set_error_message($this->_get_smtp_data()); - - if ($this->smtp_crypto === 'tls') - { - $this->_send_command('hello'); - $this->_send_command('starttls'); - - $crypto = stream_socket_enable_crypto($this->_smtp_connect, TRUE, STREAM_CRYPTO_METHOD_TLS_CLIENT); - - if ($crypto !== TRUE) - { - $this->_set_error_message('lang:email_smtp_error', $this->_get_smtp_data()); - return FALSE; - } - } - - return $this->_send_command('hello'); - } - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Send SMTP command - * - * @param string - * @param string - * @return string - */ - protected function _send_command($cmd, $data = '') - { - switch ($cmd) - { - case 'hello' : - - if ($this->_smtp_auth OR $this->_get_encoding() === '8bit') - { - $this->_send_data('EHLO '.$this->_get_hostname()); - } - else - { - $this->_send_data('HELO '.$this->_get_hostname()); - } - - $resp = 250; - break; - case 'starttls' : - - $this->_send_data('STARTTLS'); - $resp = 220; - break; - case 'from' : - - $this->_send_data('MAIL FROM:<'.$data.'>'); - $resp = 250; - break; - case 'to' : - - if ($this->dsn) - { - $this->_send_data('RCPT TO:<'.$data.'> NOTIFY=SUCCESS,DELAY,FAILURE ORCPT=rfc822;'.$data); - } - else - { - $this->_send_data('RCPT TO:<'.$data.'>'); - } - - $resp = 250; - break; - case 'data' : - - $this->_send_data('DATA'); - $resp = 354; - break; - case 'reset': - - $this->_send_data('RSET'); - - $resp = 250; - break; - case 'quit' : - - $this->_send_data('QUIT'); - $resp = 221; - break; - } - - $reply = $this->_get_smtp_data(); - - $this->_debug_msg[] = '
    '.$cmd.': '.$reply.'
    '; - - if ((int) substr($reply, 0, 3) !== $resp) - { - $this->_set_error_message('lang:email_smtp_error', $reply); - return FALSE; - } - - if ($cmd === 'quit') - { - fclose($this->_smtp_connect); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * SMTP Authenticate - * - * @return bool - */ - protected function _smtp_authenticate() - { - if ( ! $this->_smtp_auth) - { - return TRUE; - } - - if ($this->smtp_user === '' && $this->smtp_pass === '') - { - $this->_set_error_message('lang:email_no_smtp_unpw'); - return FALSE; - } - - $this->_send_data('AUTH LOGIN'); - - $reply = $this->_get_smtp_data(); - - if (strpos($reply, '503') === 0) // Already authenticated - return TRUE; - - if (strpos($reply, '334') !== 0) - { - $this->_set_error_message('lang:email_failed_smtp_login', $reply); - return FALSE; - } - - $this->_send_data(base64_encode($this->smtp_user)); - - $reply = $this->_get_smtp_data(); - - if (strpos($reply, '334') !== 0) - { - $this->_set_error_message('lang:email_smtp_auth_un', $reply); - return FALSE; - } - - $this->_send_data(base64_encode($this->smtp_pass)); - - $reply = $this->_get_smtp_data(); - - if (strpos($reply, '235') !== 0) - { - $this->_set_error_message('lang:email_smtp_auth_pw', $reply); - return FALSE; - } + { + if ($this->smtp_host === '') + { + $this->_set_error_message('lang:email_no_hostname'); + return FALSE; + } + + if ( ! $this->_smtp_connect() OR ! $this->_smtp_authenticate()) + { + return FALSE; + } + + $this->_send_command('from', $this->clean_email($this->_headers['From'])); + + foreach ($this->_recipients as $val) + { + $this->_send_command('to', $val); + } + + if (count($this->_cc_array) > 0) + { + foreach ($this->_cc_array as $val) + { + if ($val !== '') + { + $this->_send_command('to', $val); + } + } + } - return TRUE; - } + if (count($this->_bcc_array) > 0) + { + foreach ($this->_bcc_array as $val) + { + if ($val !== '') + { + $this->_send_command('to', $val); + } + } + } + + $this->_send_command('data'); + + // perform dot transformation on any lines that begin with a dot + $this->_send_data($this->_header_str.preg_replace('/^\./m', '..$1', $this->_finalbody)); + + $this->_send_data('.'); + + $reply = $this->_get_smtp_data(); + + $this->_set_error_message($reply); + + if (strpos($reply, '250') !== 0) + { + $this->_set_error_message('lang:email_smtp_error', $reply); + return FALSE; + } + + if($this->smtp_keepalive) + $this->_send_command('reset'); + else + $this->_send_command('quit'); + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * SMTP Connect + * + * @param bool + * @return string + */ + protected function _smtp_connect($force=FALSE) + { + if( ! is_resource($this->_smtp_connect) || $force) + { + $ssl = ($this->smtp_crypto === 'ssl') ? 'ssl://' : NULL; + + $this->_smtp_connect = fsockopen($ssl.$this->smtp_host, + $this->smtp_port, + $errno, + $errstr, + $this->smtp_timeout); + + if ( ! is_resource($this->_smtp_connect)) + { + $this->_set_error_message('lang:email_smtp_error', $errno.' '.$errstr); + return FALSE; + } + + stream_set_timeout($this->_smtp_connect, $this->smtp_timeout); + $this->_set_error_message($this->_get_smtp_data()); + + if ($this->smtp_crypto === 'tls') + { + $this->_send_command('hello'); + $this->_send_command('starttls'); + + $crypto = stream_socket_enable_crypto($this->_smtp_connect, TRUE, STREAM_CRYPTO_METHOD_TLS_CLIENT); + + if ($crypto !== TRUE) + { + $this->_set_error_message('lang:email_smtp_error', $this->_get_smtp_data()); + return FALSE; + } + } + + return $this->_send_command('hello'); + } + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Send SMTP command + * + * @param string + * @param string + * @return string + */ + protected function _send_command($cmd, $data = '') + { + switch ($cmd) + { + case 'hello' : + + if ($this->_smtp_auth OR $this->_get_encoding() === '8bit') + { + $this->_send_data('EHLO '.$this->_get_hostname()); + } + else + { + $this->_send_data('HELO '.$this->_get_hostname()); + } + + $resp = 250; + break; + case 'starttls' : + + $this->_send_data('STARTTLS'); + $resp = 220; + break; + case 'from' : + + $this->_send_data('MAIL FROM:<'.$data.'>'); + $resp = 250; + break; + case 'to' : + + if ($this->dsn) + { + $this->_send_data('RCPT TO:<'.$data.'> NOTIFY=SUCCESS,DELAY,FAILURE ORCPT=rfc822;'.$data); + } + else + { + $this->_send_data('RCPT TO:<'.$data.'>'); + } + + $resp = 250; + break; + case 'data' : + + $this->_send_data('DATA'); + $resp = 354; + break; + case 'reset': + + $this->_send_data('RSET'); + $resp = 250; + break; + case 'quit' : + + $this->_send_data('QUIT'); + $resp = 221; + break; + } + + $reply = $this->_get_smtp_data(); + + $this->_debug_msg[] = '
    '.$cmd.': '.$reply.'
    '; + + if ((int) substr($reply, 0, 3) !== $resp) + { + $this->_set_error_message('lang:email_smtp_error', $reply); + return FALSE; + } + + if ($cmd === 'quit') + { + fclose($this->_smtp_connect); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * SMTP Authenticate + * + * @return bool + */ + protected function _smtp_authenticate() + { + if ( ! $this->_smtp_auth) + { + return TRUE; + } + + if ($this->smtp_user === '' && $this->smtp_pass === '') + { + $this->_set_error_message('lang:email_no_smtp_unpw'); + return FALSE; + } + + $this->_send_data('AUTH LOGIN'); + + $reply = $this->_get_smtp_data(); + + if (strpos($reply, '503') !== 0) // Already authenticated + return TRUE; + + if (strpos($reply, '334') !== 0) + { + $this->_set_error_message('lang:email_failed_smtp_login', $reply); + return FALSE; + } + + $this->_send_data(base64_encode($this->smtp_user)); + + $reply = $this->_get_smtp_data(); + + if (strpos($reply, '334') !== 0) + { + $this->_set_error_message('lang:email_smtp_auth_un', $reply); + return FALSE; + } + + $this->_send_data(base64_encode($this->smtp_pass)); + + $reply = $this->_get_smtp_data(); + + if (strpos($reply, '235') !== 0) + { + $this->_set_error_message('lang:email_smtp_auth_pw', $reply); + return FALSE; + } + + return TRUE; + } // -------------------------------------------------------------------- From 9ecde434cf660da53c8887f4e768f37fdf64dac1 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Mon, 18 Feb 2013 17:06:12 +0530 Subject: [PATCH 2127/5397] Clean up --- user_guide_src/source/changelog.rst | 3 +++ user_guide_src/source/libraries/email.rst | 1 + 2 files changed, 4 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8d3f3705d29..94f7f9e4a4c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -250,6 +250,8 @@ Release Date: Not Released - Added Redis driver. - Added a *key_prefix* option for cache IDs. - :doc:`Email library ` changes include: + - Added SMTP keepalive option to avoid opening the connection for each ``Email::send()``. Accessible as ``$smtp_keepalive``. + - Empty string passed into useragent will be set to the first valid value in ``$_SERVER['HTTP_USER_AGENT']`` or ``PHP/``. - Added custom filename to ``Email::attach()`` as ``$this->email->attach($filename, $disposition, $newname)``. - Added possibility to send attachment as buffer string in ``Email::attach()`` as ``$this->email->attach($buffer, $disposition, $newname, $mime)``. - Added dsn (delivery status notification) option. @@ -337,6 +339,7 @@ Release Date: Not Released Bug fixes for 3.0 ------------------ +- Fixed a bug (#2255, #2256) where ``smtp_timeout`` was not being applied to read and writes for the socket. - Fixed a bug where ``unlink()`` raised an error if cache file did not exist when you try to delete it. - Fixed a bug (#181) where a mis-spelling was in the form validation language file. - Fixed a bug (#159, #163) that mishandled Query Builder nested transactions because _trans_depth was not getting incremented. diff --git a/user_guide_src/source/libraries/email.rst b/user_guide_src/source/libraries/email.rst index 7d468251cf9..a55f1895dd5 100644 --- a/user_guide_src/source/libraries/email.rst +++ b/user_guide_src/source/libraries/email.rst @@ -89,6 +89,7 @@ Preference Default Value Options Descript **smtp_pass** No Default None SMTP Password. **smtp_port** 25 None SMTP Port. **smtp_timeout** 5 None SMTP Timeout (in seconds). +**smtp_keepalive** FALSE TRUE or FALSE (boolean) Enable persistent SMTP connections. **smtp_crypto** No Default tls or ssl SMTP Encryption **wordwrap** TRUE TRUE or FALSE (boolean) Enable word-wrap. **wrapchars** 76 Character count to wrap at. From 758f40c3d971837d739fa5bc47529bccc846dcfd Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Mon, 18 Feb 2013 17:18:51 +0530 Subject: [PATCH 2128/5397] Fixed curly braces. Removed redundant method set_useragent() --- system/libraries/Email.php | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 7ea49a95986..b0d0921eb7a 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -416,8 +416,10 @@ public function __construct($config = array()) */ public function __destruct() { - if(is_resource($this->_smtp_connect)) + if (is_resource($this->_smtp_connect)) + { $this->_send_command('quit'); + } } // -------------------------------------------------------------------- @@ -788,23 +790,6 @@ public function set_mailtype($type = 'text') return $this; } - // -------------------------------------------------------------------- - - /** - * Set Useragent - * - * @param string - * @return void - */ - public function set_useragent($type = '') - { - if( ! $type) - $this->useragent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'PHP/'.phpversion(); - else - $this->useragent = $type; - return $this; - } - // -------------------------------------------------------------------- /** @@ -1861,10 +1846,14 @@ protected function _send_with_smtp() return FALSE; } - if($this->smtp_keepalive) + if ($this->smtp_keepalive) + { $this->_send_command('reset'); + } else + { $this->_send_command('quit'); + } return TRUE; } @@ -1879,7 +1868,7 @@ protected function _send_with_smtp() */ protected function _smtp_connect($force=FALSE) { - if( ! is_resource($this->_smtp_connect) || $force) + if ( ! is_resource($this->_smtp_connect) || $force) { $ssl = ($this->smtp_crypto === 'ssl') ? 'ssl://' : NULL; @@ -2026,7 +2015,9 @@ protected function _smtp_authenticate() $reply = $this->_get_smtp_data(); if (strpos($reply, '503') !== 0) // Already authenticated + { return TRUE; + } if (strpos($reply, '334') !== 0) { From 9892d4d36b4ccfc647e9490b3c2e24de8b44964a Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Mon, 18 Feb 2013 17:26:52 +0530 Subject: [PATCH 2129/5397] Styleguide fixes --- user_guide_src/source/changelog.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 94f7f9e4a4c..3824092b61b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -249,9 +249,7 @@ Release Date: Not Released - Added Wincache driver. - Added Redis driver. - Added a *key_prefix* option for cache IDs. - - :doc:`Email library ` changes include: - - Added SMTP keepalive option to avoid opening the connection for each ``Email::send()``. Accessible as ``$smtp_keepalive``. - - Empty string passed into useragent will be set to the first valid value in ``$_SERVER['HTTP_USER_AGENT']`` or ``PHP/``. + - :doc:`Email library ` changes include: - Added custom filename to ``Email::attach()`` as ``$this->email->attach($filename, $disposition, $newname)``. - Added possibility to send attachment as buffer string in ``Email::attach()`` as ``$this->email->attach($buffer, $disposition, $newname, $mime)``. - Added dsn (delivery status notification) option. @@ -264,6 +262,7 @@ Release Date: Not Released - Removed unused protected method ``_get_ip()`` (:doc:`Input Library `'s ``ip_address()`` should be used anyway). - Internal method ``_prep_q_encoding()`` now utilizes PHP's *mbstring* and *iconv* extensions (when available) and no longer has a second (``$from``) argument. - Added an optional parameter to ``print_debugger()`` to allow specifying which parts of the message should be printed ('headers', 'subject', 'body'). + - Added SMTP keepalive option to avoid opening the connection for each ``Email::send()``. Accessible as ``$smtp_keepalive``. - :doc:`Pagination Library ` changes include: - Added support for the anchor "rel" attribute. - Added support for setting custom attributes. @@ -339,7 +338,6 @@ Release Date: Not Released Bug fixes for 3.0 ------------------ -- Fixed a bug (#2255, #2256) where ``smtp_timeout`` was not being applied to read and writes for the socket. - Fixed a bug where ``unlink()`` raised an error if cache file did not exist when you try to delete it. - Fixed a bug (#181) where a mis-spelling was in the form validation language file. - Fixed a bug (#159, #163) that mishandled Query Builder nested transactions because _trans_depth was not getting incremented. @@ -488,6 +486,7 @@ Bug fixes for 3.0 - Fixed a bug - :doc:`DB result ` method ``list_fields()`` didn't reset its field pointer for the *mysql*, *mysqli* and *mssql* drivers. - Fixed a bug (#73) - :doc:`Security Library ` method ``sanitize_filename()`` could be tricked by an XSS attack. - Fixed a bug (#2211) - :doc:`Migration Library ` extensions couldn't execute ``CI_Migration::__construct()``. +- Fixed a bug (#2255, #2256) where ``smtp_timeout`` was not being applied to read and writes for the socket. Version 2.1.3 ============= From 193f0c76edbd85cf98ae730006b459c7c55a5b78 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Mon, 18 Feb 2013 17:29:23 +0530 Subject: [PATCH 2130/5397] removed PR from the bug list --- system/libraries/Email.php | 2 +- user_guide_src/source/changelog.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index b0d0921eb7a..91c119e0258 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1868,7 +1868,7 @@ protected function _send_with_smtp() */ protected function _smtp_connect($force=FALSE) { - if ( ! is_resource($this->_smtp_connect) || $force) + if ( ! is_resource($this->_smtp_connect) OR $force) { $ssl = ($this->smtp_crypto === 'ssl') ? 'ssl://' : NULL; diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 3824092b61b..f1bb0c58e63 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -486,7 +486,7 @@ Bug fixes for 3.0 - Fixed a bug - :doc:`DB result ` method ``list_fields()`` didn't reset its field pointer for the *mysql*, *mysqli* and *mssql* drivers. - Fixed a bug (#73) - :doc:`Security Library ` method ``sanitize_filename()`` could be tricked by an XSS attack. - Fixed a bug (#2211) - :doc:`Migration Library ` extensions couldn't execute ``CI_Migration::__construct()``. -- Fixed a bug (#2255, #2256) where ``smtp_timeout`` was not being applied to read and writes for the socket. +- Fixed a bug (#2255) where ``smtp_timeout`` was not being applied to read and writes for the socket. Version 2.1.3 ============= From a44e6913324bd47e17bfd4109fc65b699c508006 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Mon, 18 Feb 2013 18:07:03 +0530 Subject: [PATCH 2131/5397] Removed the unused $force paramter in Email::_smtp_connect() --- system/libraries/Email.php | 58 +++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 91c119e0258..1bf1da15ef6 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1863,47 +1863,47 @@ protected function _send_with_smtp() /** * SMTP Connect * - * @param bool * @return string */ - protected function _smtp_connect($force=FALSE) + protected function _smtp_connect() { - if ( ! is_resource($this->_smtp_connect) OR $force) + if (is_resource($this->_smtp_connect)) { - $ssl = ($this->smtp_crypto === 'ssl') ? 'ssl://' : NULL; + return TRUE; + } - $this->_smtp_connect = fsockopen($ssl.$this->smtp_host, - $this->smtp_port, - $errno, - $errstr, - $this->smtp_timeout); + $ssl = ($this->smtp_crypto === 'ssl') ? 'ssl://' : NULL; - if ( ! is_resource($this->_smtp_connect)) - { - $this->_set_error_message('lang:email_smtp_error', $errno.' '.$errstr); - return FALSE; - } + $this->_smtp_connect = fsockopen($ssl.$this->smtp_host, + $this->smtp_port, + $errno, + $errstr, + $this->smtp_timeout); - stream_set_timeout($this->_smtp_connect, $this->smtp_timeout); - $this->_set_error_message($this->_get_smtp_data()); + if ( ! is_resource($this->_smtp_connect)) + { + $this->_set_error_message('lang:email_smtp_error', $errno.' '.$errstr); + return FALSE; + } - if ($this->smtp_crypto === 'tls') - { - $this->_send_command('hello'); - $this->_send_command('starttls'); + stream_set_timeout($this->_smtp_connect, $this->smtp_timeout); + $this->_set_error_message($this->_get_smtp_data()); - $crypto = stream_socket_enable_crypto($this->_smtp_connect, TRUE, STREAM_CRYPTO_METHOD_TLS_CLIENT); + if ($this->smtp_crypto === 'tls') + { + $this->_send_command('hello'); + $this->_send_command('starttls'); - if ($crypto !== TRUE) - { - $this->_set_error_message('lang:email_smtp_error', $this->_get_smtp_data()); - return FALSE; - } - } + $crypto = stream_socket_enable_crypto($this->_smtp_connect, TRUE, STREAM_CRYPTO_METHOD_TLS_CLIENT); - return $this->_send_command('hello'); + if ($crypto !== TRUE) + { + $this->_set_error_message('lang:email_smtp_error', $this->_get_smtp_data()); + return FALSE; + } } - return TRUE; + + return $this->_send_command('hello'); } // -------------------------------------------------------------------- From 73c75cbfa066b4e72b8e691199ad964d1c2b3719 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Mon, 18 Feb 2013 18:11:03 +0530 Subject: [PATCH 2132/5397] removed a stray tab --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f1bb0c58e63..4e55182e545 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -249,7 +249,7 @@ Release Date: Not Released - Added Wincache driver. - Added Redis driver. - Added a *key_prefix* option for cache IDs. - - :doc:`Email library ` changes include: + - :doc:`Email library ` changes include: - Added custom filename to ``Email::attach()`` as ``$this->email->attach($filename, $disposition, $newname)``. - Added possibility to send attachment as buffer string in ``Email::attach()`` as ``$this->email->attach($buffer, $disposition, $newname, $mime)``. - Added dsn (delivery status notification) option. From 9ee847d9cee7c8490f1078102b33fb8401e2d8dc Mon Sep 17 00:00:00 2001 From: David Barratt Date: Mon, 18 Feb 2013 17:10:21 -0500 Subject: [PATCH 2133/5397] Set the --dev option for travis composer install command. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 070b23c8ac3..1f6a5953018 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ env: before_script: - curl -s http://getcomposer.org/installer | php - - php composer.phar install + - php composer.phar install --dev - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'mysqli' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi" From 21e91c53a79e9e3394be58381e759c952500ecd8 Mon Sep 17 00:00:00 2001 From: David Barratt Date: Mon, 18 Feb 2013 17:18:25 -0500 Subject: [PATCH 2134/5397] Set the --no-progress option for travis composer install command --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1f6a5953018..e94f1af8361 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ env: before_script: - curl -s http://getcomposer.org/installer | php - - php composer.phar install --dev + - php composer.phar install --dev --no-progress - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'mysqli' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi" From 1396a958a5b96cc6c617ae725034fa58542acd25 Mon Sep 17 00:00:00 2001 From: David Barratt Date: Mon, 18 Feb 2013 17:23:44 -0500 Subject: [PATCH 2135/5397] Attempt to get travis to work by adding php-invoker --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 54f305e89cd..ec34372ac7d 100644 --- a/composer.json +++ b/composer.json @@ -5,6 +5,7 @@ }, "require-dev": { "mikey179/vfsStream": "*", - "phpunit/phpunit": "*" + "phpunit/phpunit": "*", + "phpunit/php-invoker": ">=1.1.0,<1.2.0" } } \ No newline at end of file From bcc411efa6027f409eaf59d1d32422013e9c20da Mon Sep 17 00:00:00 2001 From: David Barratt Date: Mon, 18 Feb 2013 17:32:13 -0500 Subject: [PATCH 2136/5397] Revert "Attempt to get travis to work by adding php-invoker" This reverts commit 1396a958a5b96cc6c617ae725034fa58542acd25. --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index ec34372ac7d..54f305e89cd 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,6 @@ }, "require-dev": { "mikey179/vfsStream": "*", - "phpunit/phpunit": "*", - "phpunit/php-invoker": ">=1.1.0,<1.2.0" + "phpunit/phpunit": "*" } } \ No newline at end of file From acd76670ebdd1d5775259af1dcdf8d5f17ec5738 Mon Sep 17 00:00:00 2001 From: David Barratt Date: Mon, 18 Feb 2013 17:35:45 -0500 Subject: [PATCH 2137/5397] Simplify the composer command --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e94f1af8361..3b2f6bd5774 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,8 +14,7 @@ env: - DB=pdo/sqlite before_script: - - curl -s http://getcomposer.org/installer | php - - php composer.phar install --dev --no-progress + - composer install --dev - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'mysqli' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi" From b4a23d2af5309d5b264f3f12c272e93667b87aca Mon Sep 17 00:00:00 2001 From: David Barratt Date: Mon, 18 Feb 2013 17:46:47 -0500 Subject: [PATCH 2138/5397] See how many errors are produced when no dependencies are included --- composer.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 54f305e89cd..48aea9ff98a 100644 --- a/composer.json +++ b/composer.json @@ -2,9 +2,5 @@ "name" : "ellislab/codeigniter", "require": { "php": ">=5.2.4" - }, - "require-dev": { - "mikey179/vfsStream": "*", - "phpunit/phpunit": "*" - } + } } \ No newline at end of file From b2834114746585b60a490992a02c1b136363e791 Mon Sep 17 00:00:00 2001 From: David Barratt Date: Mon, 18 Feb 2013 17:52:14 -0500 Subject: [PATCH 2139/5397] vfsStream is required for travis --- composer.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 48aea9ff98a..e21aaed2edf 100644 --- a/composer.json +++ b/composer.json @@ -2,5 +2,8 @@ "name" : "ellislab/codeigniter", "require": { "php": ">=5.2.4" - } + }, + "require-dev": { + "mikey179/vfsStream": "*" + } } \ No newline at end of file From eb5991ccd0686d15615bff3a730a641889063943 Mon Sep 17 00:00:00 2001 From: David Barratt Date: Mon, 18 Feb 2013 18:04:45 -0500 Subject: [PATCH 2140/5397] Revert all changes to see if travis just doesn't like me. --- .travis.yml | 3 ++- composer.json | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3b2f6bd5774..070b23c8ac3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,8 @@ env: - DB=pdo/sqlite before_script: - - composer install --dev + - curl -s http://getcomposer.org/installer | php + - php composer.phar install - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'mysqli' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi" diff --git a/composer.json b/composer.json index e21aaed2edf..7d60020c3ac 100644 --- a/composer.json +++ b/composer.json @@ -1,9 +1,8 @@ { - "name" : "ellislab/codeigniter", "require": { - "php": ">=5.2.4" + "mikey179/vfsStream": "*" }, "require-dev": { - "mikey179/vfsStream": "*" - } + "phpunit/phpunit": "*" + } } \ No newline at end of file From f399425bacfa461a77be2e841c3c1f48f9241c4a Mon Sep 17 00:00:00 2001 From: vlakoff Date: Tue, 19 Feb 2013 01:45:23 +0100 Subject: [PATCH 2141/5397] Fix a code comment in Upload->_file_mime_type() Availability of dangerous functions is now tested using function_usable(). --- system/libraries/Email.php | 6 +++--- system/libraries/Upload.php | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 1bf1da15ef6..074ce60fce4 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -94,7 +94,7 @@ class CI_Email { * @var int */ public $smtp_timeout = 5; - + /** * SMTP persistent connection * @@ -408,7 +408,7 @@ public function __construct($config = array()) } // -------------------------------------------------------------------- - + /** * Destructor - Releases Resources * @@ -2018,7 +2018,7 @@ protected function _smtp_authenticate() { return TRUE; } - + if (strpos($reply, '334') !== 0) { $this->_set_error_message('lang:email_failed_smtp_login', $reply); diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index acd76b03bf1..1c14f99ed40 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1212,7 +1212,7 @@ protected function _file_mime_type($file) * Notes: * - the DIRECTORY_SEPARATOR comparison ensures that we're not on a Windows system * - many system admins would disable the exec(), shell_exec(), popen() and similar functions - * due to security concerns, hence the function_exists() checks + * due to security concerns, hence the function_usable() checks */ if (DIRECTORY_SEPARATOR !== '\\') { @@ -1223,7 +1223,7 @@ protected function _file_mime_type($file) if (function_usable('exec')) { /* This might look confusing, as $mime is being populated with all of the output when set in the second parameter. - * However, we only neeed the last line, which is the actual return value of exec(), and as such - it overwrites + * However, we only need the last line, which is the actual return value of exec(), and as such - it overwrites * anything that could already be set for $mime previously. This effectively makes the second parameter a dummy * value, which is only put to allow us to get the return status code. */ From a4d272e7ffbd76dcc824574348fd7cbaa7c8f085 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Tue, 19 Feb 2013 03:21:16 +0100 Subject: [PATCH 2142/5397] Fix typos in upgrade_300.rst --- .../source/installation/upgrade_300.rst | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index a3ea01d02ab..41bac0146ab 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -1,5 +1,5 @@ ############################# -Upgrading from 2.1.2 to 3.0.0 +Upgrading from 2.1.3 to 3.0.0 ############################# .. note:: These upgrade notes are for a version that is yet to be released. @@ -104,9 +104,9 @@ regular expression:: (.+) // matches ANYTHING (:any) // matches any character, except for '/' -******************************************* -Step 9: Update your librararies' file names -******************************************* +***************************************** +Step 9: Update your libraries' file names +***************************************** CodeIgniter 3.0 only allows library file names to be named in a *ucfirst* manner (meaning that the first letter of the class name must be a capital). For example, @@ -238,7 +238,7 @@ Security helper do_hash() :doc:`Security Helper <../helpers/security_helper>` function ``do_hash()`` is now just an alias for PHP's native ``hash()`` function. It is deprecated and scheduled for removal in CodeIgniter 3.1+. -.. note:: This function is still available, but you're strongly encouraged to remove it's usage sooner +.. note:: This function is still available, but you're strongly encouraged to remove its usage sooner rather than later. File helper read_file() @@ -248,7 +248,7 @@ File helper read_file() PHP's native ``file_get_contents()`` function. It is deprecated and scheduled for removal in CodeIgniter 3.1+. -.. note:: This function is still available, but you're strongly encouraged to remove it's usage sooner +.. note:: This function is still available, but you're strongly encouraged to remove its usage sooner rather than later. String helper repeater() @@ -257,7 +257,7 @@ String helper repeater() :doc:`String Helper <../helpers/string_helper>` function :php:func:`repeater()` is now just an alias for PHP's native ``str_repeat()`` function. It is deprecated and scheduled for removal in CodeIgniter 3.1+. -.. note:: This function is still available, but you're strongly encouraged to remove it's usage sooner +.. note:: This function is still available, but you're strongly encouraged to remove its usage sooner rather than later. String helper trim_slashes() @@ -267,7 +267,7 @@ String helper trim_slashes() for PHP's native ``trim()`` function (with a slash passed as its second argument). It is deprecated and scheduled for removal in CodeIgniter 3.1+. -.. note:: This function is still available, but you're strongly encouraged to remove it's usage sooner +.. note:: This function is still available, but you're strongly encouraged to remove its usage sooner rather than later. Email helper functions @@ -292,7 +292,7 @@ Date helper standard_date() to the availability of native PHP `constants `_, which when combined with ``date()`` provide the same functionality. Furthermore, they have the exact same names as the ones supported by ``standard_date()``. Here are examples of how to replace -it's usage: +its usage: :: @@ -308,7 +308,7 @@ it's usage: // Replacement date(DATE_ATOM, $time); -.. note:: This function is still available, but you're strongly encouraged to remove its' usage sooner +.. note:: This function is still available, but you're strongly encouraged to remove its usage sooner rather than later as it is scheduled for removal in CodeIgniter 3.1+. Pagination library 'anchor_class' setting @@ -320,7 +320,7 @@ attribute to your anchors via the 'attributes' configuration setting. This inclu As a result of that, the 'anchor_class' setting is now deprecated and scheduled for removal in CodeIgniter 3.1+. -.. note:: This setting is still available, but you're strongly encouraged to remove its' usage sooner +.. note:: This setting is still available, but you're strongly encouraged to remove its usage sooner rather than later. String helper random_string() types 'unique' and 'encrypt' From 92b8246ef31aa139925d3422838454e9f39f9351 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Tue, 19 Feb 2013 03:22:05 +0100 Subject: [PATCH 2143/5397] Add an upgrade note about change in the results of Directory Helper's directory_map() see issue #1978 --- .../source/installation/upgrade_300.rst | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 41bac0146ab..02841ab6e92 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -136,8 +136,15 @@ Step 10: Check the calls to Array Helper's element() and elements() functions The default return value of these functions, when the required elements don't exist, has been changed from FALSE to NULL. +*********************************************************************** +Step 11: Check the calls to Directory Helper's directory_map() function +*********************************************************************** + +In the resulting array, directories now end with a trailing directory +separator (i.e. a slash, usually). + ************************************************************* -Step 11: Update usage of Database Forge's drop_table() method +Step 12: Update usage of Database Forge's drop_table() method ************************************************************* Up until now, ``drop_table()`` added an IF EXISTS clause by default or it didn't work @@ -159,7 +166,7 @@ If your application relies on IF EXISTS, you'll have to change its usage. all drivers with the exception of ODBC. *********************************************************** -Step 12: Change usage of Email library with multiple emails +Step 13: Change usage of Email library with multiple emails *********************************************************** The :doc:`Email Library <../libraries/email>` will automatically clear the @@ -174,7 +181,7 @@ pass FALSE as the first parameter in the ``send()`` method: } *************************************************** -Step 13: Update your Form_validation language lines +Step 14: Update your Form_validation language lines *************************************************** Two improvements have been made to the :doc:`Form Validation Library @@ -205,7 +212,7 @@ files and error messages format: later. **************************************************************** -Step 14: Remove usage of (previously) deprecated functionalities +Step 15: Remove usage of (previously) deprecated functionalities **************************************************************** In addition to the ``$autoload['core']`` configuration setting, there's a From e1d5a7a0a6078d0edb0b9ac6e5d60a4c746ae365 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 19 Feb 2013 13:38:43 +0200 Subject: [PATCH 2144/5397] Fix form_upload() test --- tests/codeigniter/helpers/form_helper_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/codeigniter/helpers/form_helper_test.php b/tests/codeigniter/helpers/form_helper_test.php index 89165271e7f..e234f9c8340 100644 --- a/tests/codeigniter/helpers/form_helper_test.php +++ b/tests/codeigniter/helpers/form_helper_test.php @@ -58,7 +58,7 @@ public function test_form_password() public function test_form_upload() { $expected = << + EOH; From dc5c5a371aeab5af6440c0c39a4501405636b826 Mon Sep 17 00:00:00 2001 From: David Barratt Date: Tue, 19 Feb 2013 07:18:30 -0500 Subject: [PATCH 2145/5397] Revert "Revert all changes to see if travis just doesn't like me." This reverts commit eb5991ccd0686d15615bff3a730a641889063943. --- .travis.yml | 3 +-- composer.json | 7 ++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 070b23c8ac3..3b2f6bd5774 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,8 +14,7 @@ env: - DB=pdo/sqlite before_script: - - curl -s http://getcomposer.org/installer | php - - php composer.phar install + - composer install --dev - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'mysqli' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi" diff --git a/composer.json b/composer.json index 7d60020c3ac..e21aaed2edf 100644 --- a/composer.json +++ b/composer.json @@ -1,8 +1,9 @@ { + "name" : "ellislab/codeigniter", "require": { - "mikey179/vfsStream": "*" + "php": ">=5.2.4" }, "require-dev": { - "phpunit/phpunit": "*" - } + "mikey179/vfsStream": "*" + } } \ No newline at end of file From b63f07a6b9d26fe55dd65d09e0de584629b7e8bc Mon Sep 17 00:00:00 2001 From: David Barratt Date: Tue, 19 Feb 2013 07:19:44 -0500 Subject: [PATCH 2146/5397] Set the --no-progress option for travis composer install command --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3b2f6bd5774..ab0aa5616c6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ env: - DB=pdo/sqlite before_script: - - composer install --dev + - composer install --dev --no-progress - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'mysqli' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi" From 6bb98903662ed2870d1d46c492106fec3be1ca6f Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Tue, 19 Feb 2013 18:11:14 +0530 Subject: [PATCH 2147/5397] Fixed the issue with bcc_batch_mode and subject --- system/libraries/Email.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 1bf1da15ef6..0319ac5e7a3 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1205,8 +1205,11 @@ protected function _write_headers() { if ($this->protocol === 'mail') { - $this->_subject = $this->_headers['Subject']; - unset($this->_headers['Subject']); + if (isset($this->_headers['Subject'])) + { + $this->_subject = $this->_headers['Subject']; + unset($this->_headers['Subject']); + } } reset($this->_headers); From 32c1e626d51517418acbecadde9a83d67517e0a8 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Tue, 19 Feb 2013 18:13:01 +0530 Subject: [PATCH 2148/5397] Updated changelog --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4e55182e545..a5f560564d9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -487,6 +487,7 @@ Bug fixes for 3.0 - Fixed a bug (#73) - :doc:`Security Library ` method ``sanitize_filename()`` could be tricked by an XSS attack. - Fixed a bug (#2211) - :doc:`Migration Library ` extensions couldn't execute ``CI_Migration::__construct()``. - Fixed a bug (#2255) where ``smtp_timeout`` was not being applied to read and writes for the socket. +- Fixed a bug (#2239) of missing subject when using ``bcc_batch_mode``. Version 2.1.3 ============= From a1ff8b3c0ed9d5315cd4c22e5878d057204d9378 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 19 Feb 2013 15:08:31 +0200 Subject: [PATCH 2149/5397] [ci skip] Fix some changelog entries --- user_guide_src/source/changelog.rst | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a5f560564d9..37bd2036aed 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -60,12 +60,12 @@ Release Date: Not Released - Helpers - :doc:`Date Helper ` changes include: - - ``now()`` now works with all timezone strings supported by PHP. - - Added an optional third parameter to ``timespan()`` that constrains the number of time units displayed. - - Added an optional parameter to ``timezone_menu()`` that allows more attributes to be added to the generated select tag. + - :php:func:`now()` now works with all timezone strings supported by PHP. + - Added an optional third parameter to :php:func:`timespan()` that constrains the number of time units displayed. + - Added an optional parameter to :php:func:`timezone_menu()` that allows more attributes to be added to the generated select tag. - Deprecated ``standard_date()``, which now just uses the native ``date()`` with `DateTime constants `_. - - Added function ``date_range()`` that generates a list of dates between a specified period. - - ``create_captcha()`` accepts additional colors parameter, allowing for color customization. + - Added function :php:func:`date_range()` that generates a list of dates between a specified period. + - :doc:`Captcha Helper ` :php:func:`create_captcha()` now accepts additional colors parameter, allowing for color customization. - :doc:`URL Helper ` changes include: - Deprecated *separator* options **dash** and **underscore** for function :php:func:`url_title()` (they are only aliases for '-' and '_' respectively). - :php:func:`url_title()` will now trim extra dashes from beginning and end. @@ -340,16 +340,15 @@ Bug fixes for 3.0 - Fixed a bug where ``unlink()`` raised an error if cache file did not exist when you try to delete it. - Fixed a bug (#181) where a mis-spelling was in the form validation language file. -- Fixed a bug (#159, #163) that mishandled Query Builder nested transactions because _trans_depth was not getting incremented. +- Fixed a bug (#159, #163) - :doc:`Query Builder ` nested transactions didn't work properly due to ``_trans_depth`` not being incremented. - Fixed a bug (#737, #75) - :doc:`Pagination ` anchor class was not set properly when using initialize method. -- Fixed a bug (#419) - ``auto_link()`` now recognizes URLs that come after a word boundary. +- Fixed a bug (#419) - :php:func:`auto_link()` didn't recognize URLs that come after a word boundary. - Fixed a bug (#724) - :doc:`Form Validation Library ` rule **is_unique** didn't check if a database connection exists. - Fixed a bug (#647) - :doc:`Zip Library ` internal method ``_get_mod_time()`` didn't suppress possible "stat failed" errors generated by ``filemtime()``. -- Fixed a bug (#608) - Fixes an issue with the Image_lib class not clearing properties completely. -- Fixed a bug (#157, #174) - the Image_lib clear() function now resets all variables to their default values. -- Fixed a bug where using $this->dbforge->create_table() with PostgreSQL database could lead to fetching whole table. -- Fixed a bug (#795) - Fixed form method and accept-charset when passing an empty array. -- Fixed a bug (#797) - timespan() was using incorrect seconds for year and month. +- Fixed a bug (#157, #174) - :doc:`Image Manipulation Library ` method ``clear()`` didn't completely clear properties. +- Fixed a bug where :doc:`Database Forge ` method ``create_table()`` with PostgreSQL database could lead to fetching the whole table. +- Fixed a bug (#795) - :doc:`Form Helper ` :php:func:`form_open()` didn't add the default form *method* and *accept-charset* when an empty array is passed to it. +- Fixed a bug (#797) - :php:func:`timespan()` was using incorrect seconds for year and month. - Fixed a bug in CI_Cart::contents() where if called without a TRUE (or equal) parameter, it would fail due to a typo. - Fixed a bug (#696) - make oci_execute() calls inside num_rows() non-committing, since they are only there to reset which row is next in line for oci_fetch calls and thus don't need to be committed. - Fixed a bug (#406) - SQLSRV DB driver not returning resource on ``db_pconnect()``. @@ -486,8 +485,8 @@ Bug fixes for 3.0 - Fixed a bug - :doc:`DB result ` method ``list_fields()`` didn't reset its field pointer for the *mysql*, *mysqli* and *mssql* drivers. - Fixed a bug (#73) - :doc:`Security Library ` method ``sanitize_filename()`` could be tricked by an XSS attack. - Fixed a bug (#2211) - :doc:`Migration Library ` extensions couldn't execute ``CI_Migration::__construct()``. -- Fixed a bug (#2255) where ``smtp_timeout`` was not being applied to read and writes for the socket. -- Fixed a bug (#2239) of missing subject when using ``bcc_batch_mode``. +- Fixed a bug (#2255) - :doc:`Email Library ` didn't apply ``smtp_timeout``to socket reads and writes. +- Fixed a bug (#2239) - :doc:`Email Library ` improperly handled the Subject when used with ``bcc_batch_mode`` resulting in E_WARNING messages and an empty Subject. Version 2.1.3 ============= From 07a59548c0761c5ac4562019d13913f2b82c6018 Mon Sep 17 00:00:00 2001 From: Dionysis Arvanitis Date: Tue, 19 Feb 2013 22:31:05 +0200 Subject: [PATCH 2150/5397] Set transaction enabled flag default to TRUE --- system/database/drivers/pdo/pdo_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 34adf0f861f..ffbafea6b5c 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -53,7 +53,7 @@ class CI_DB_pdo_driver extends CI_DB { * * @var bool */ - public $trans_enabled = FALSE; + public $trans_enabled = TRUE; /** * PDO Options From 635ced168ce1ce7a91cfef782a1a3c37789f8930 Mon Sep 17 00:00:00 2001 From: Dionysis Arvanitis Date: Tue, 19 Feb 2013 23:11:34 +0200 Subject: [PATCH 2151/5397] DB_driver's trans_complete exception fix --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 35ac8e87049..05abd864ba7 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -625,7 +625,7 @@ public function query($sql, $binds = FALSE, $return_object = NULL) // if transactions are enabled. If we don't call this here // the error message will trigger an exit, causing the // transactions to remain in limbo. - $this->trans_complete(); + $this->_trans_depth > 0 && $this->trans_complete(); // Display errors return $this->display_error(array('Error Number: '.$error['code'], $error['message'], $sql)); From f8e2d0ed10018f81db5814d421dbafbe6d0834e4 Mon Sep 17 00:00:00 2001 From: Dionysis Arvanitis Date: Tue, 19 Feb 2013 23:27:16 +0200 Subject: [PATCH 2152/5397] Issue #2086 Session_cookie's _update_db not guaranteed to update --- system/libraries/Session/drivers/Session_cookie.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/system/libraries/Session/drivers/Session_cookie.php b/system/libraries/Session/drivers/Session_cookie.php index 11bb32fe07c..057e5a1d1c5 100644 --- a/system/libraries/Session/drivers/Session_cookie.php +++ b/system/libraries/Session/drivers/Session_cookie.php @@ -602,6 +602,9 @@ public function _update_db() $set['user_data'] = $this->_serialize($userdata); } + // Reset query builder values. + $this->CI->db->reset_query(); + // Run the update query // Any time we change the session id, it gets updated immediately, // so our where clause below is always safe From 95da6e75c41bcef079215972efa4a0734be7e8c4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 20 Feb 2013 12:38:44 +0200 Subject: [PATCH 2153/5397] Remove CI_DB_pdo_driver:: Improving on PR #2265, the property is inherited with the same value and doesn't need to be set. --- system/database/drivers/pdo/pdo_driver.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index ffbafea6b5c..fa89661b196 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -48,13 +48,6 @@ class CI_DB_pdo_driver extends CI_DB { */ public $dbdriver = 'pdo'; - /** - * Transaction enabled flag - * - * @var bool - */ - public $trans_enabled = TRUE; - /** * PDO Options * From 4796cebc4a2c2028134bd59257ddce4f1387c8ff Mon Sep 17 00:00:00 2001 From: Kevin Smith Date: Wed, 20 Feb 2013 14:20:54 -0600 Subject: [PATCH 2154/5397] Update user_guide_src/source/tutorial/news_section.rst Clarified a part of the tutorial so it's obvious the code should be replaced/update rather than added. --- user_guide_src/source/tutorial/news_section.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/tutorial/news_section.rst b/user_guide_src/source/tutorial/news_section.rst index 833e34ead7f..d7754e9f3a3 100644 --- a/user_guide_src/source/tutorial/news_section.rst +++ b/user_guide_src/source/tutorial/news_section.rst @@ -162,7 +162,7 @@ The news overview page is now done, but a page to display individual news items is still absent. The model created earlier is made in such way that it can easily be used for this functionality. You only need to add some code to the controller and create a new view. Go back to the -news controller and add the following lines to the file. +news controller and update ``view()`` with the following: :: @@ -211,4 +211,4 @@ a slug to the view method in the news controller. $route['default_controller'] = 'pages/view'; Point your browser to your document root, followed by index.php/news and -watch your news page. \ No newline at end of file +watch your news page. From 5e227994581f2325b4d10e90da6dadb113a4cde1 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Thu, 21 Feb 2013 13:09:29 +0530 Subject: [PATCH 2155/5397] Fix for issue #2236 --- system/helpers/form_helper.php | 33 +++++++++++++++++++++++----- system/libraries/Form_validation.php | 15 +++++++++++++ user_guide_src/source/changelog.rst | 4 +++- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index d6e3e85fa12..200da8ac588 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -642,14 +642,37 @@ function form_prep($str = '', $is_textarea = FALSE) */ function set_value($field = '', $default = '', $is_textarea = FALSE) { - if (FALSE === ($OBJ =& _get_validation_object())) + if (FALSE !== ($OBJ =& _get_validation_object()) && $OBJ->has_rule($field)) { - return isset($_POST[$field]) - ? form_prep($_POST[$field], $is_textarea) - : form_prep($default, $is_textarea); + return form_prep($OBJ->set_value($field, $default), $is_textarea); + } + + // We couldn't find the $field in validator, so try in $_POST array + $index = $field; + $container = $_POST; + + // Test if the $field is an array name, and try to obtain the final index + if (preg_match_all('/\[(.*?)\]/', $field, $matches)) + { + sscanf($field, '%[^[][', $index); + for ($i = 0, $c = count($matches[0]); $i < $c; $i++) + { + if (isset($container[$index]) && $matches[1][$i] !== '') + { + $container = $container[$index]; + $index = $matches[1][$i]; + } + else + { + $container = array(); + break; + } + } } - return form_prep($OBJ->set_value($field, $default), $is_textarea); + return isset($container[$index]) + ? form_prep($container[$index], $is_textarea) + : form_prep($default, $is_textarea); } } diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 172e799f647..1ed50844cf0 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -835,6 +835,21 @@ protected function _build_error_msg($line, $field = '', $param = '') // -------------------------------------------------------------------- + /** + * Checks if the rule is present within the validator + * + * Permits you to check if a rule is present within the validator + * + * @param string the field name + * @return bool + */ + public function has_rule($field) + { + return isset($this->_field_data[$field]); + } + + // -------------------------------------------------------------------- + /** * Get the value from a form * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a5f560564d9..2c2da6aaaf9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -244,6 +244,7 @@ Release Date: Not Released - Added support for named parameters in error messages. - :doc:`Language ` line keys must now be prefixed with **form_validation_**. - Added rule **alpha_numeric_spaces**. + - Added method ``has_rule()`` to determine if a rule exists. - Added support for setting :doc:`Table ` class defaults in a config file. - :doc:`Caching Library ` changes include: - Added Wincache driver. @@ -463,7 +464,7 @@ Bug fixes for 3.0 - Fixed a bug (#1255) - :doc:`User Agent Library ` method ``is_referral()`` only checked if ``$_SERVER['HTTP_REFERER']`` exists. - Fixed a bug (#1146) - :doc:`Download Helper ` function ``force_download()`` incorrectly sent *Cache-Control* directives *pre-check* and *post-check* to Internet Explorer. - Fixed a bug (#1811) - :doc:`URI Library ` didn't properly cache segments for ``uri_to_assoc()`` and ``ruri_to_assoc()``. -- Fixed a bug (#1506) - :doc:`Form Helpers ` set empty *name* attributes. +- Fixed a bug (#1506) - :doc:`Form Helper ` set empty *name* attributes. - Fixed a bug (#59) - :doc:`Query Builder ` method ``count_all_results()`` ignored the DISTINCT clause. - Fixed a bug (#1624) - :doc:`Form Validation Library ` rule **matches** didn't property handle array field names. - Fixed a bug (#1630) - :doc:`Form Helper ` function ``set_value()`` didn't escape HTML entities. @@ -488,6 +489,7 @@ Bug fixes for 3.0 - Fixed a bug (#2211) - :doc:`Migration Library ` extensions couldn't execute ``CI_Migration::__construct()``. - Fixed a bug (#2255) where ``smtp_timeout`` was not being applied to read and writes for the socket. - Fixed a bug (#2239) of missing subject when using ``bcc_batch_mode``. +- Fixed a bug (#2236) - :doc:`Form Helper ` incorrectly determined the value to return in method ``set_value()``. Version 2.1.3 ============= From e84c0144bbd15094cc19716222b691ed3a27d2e4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 21 Feb 2013 15:28:13 +0200 Subject: [PATCH 2156/5397] Fix Session tests --- tests/mocks/libraries/session.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/mocks/libraries/session.php b/tests/mocks/libraries/session.php index 562033bbffb..adbecb32970 100644 --- a/tests/mocks/libraries/session.php +++ b/tests/mocks/libraries/session.php @@ -33,4 +33,6 @@ protected function _setcookie($name, $value = '', $expire = 0, $path = '', $doma $_COOKIE[$name] = $value; } } -} \ No newline at end of file +} + +class Mock_Libraries_Session_native extends CI_Session_native {} \ No newline at end of file From 73cf876a65aa24c1dd4e25dd323f83a11bad3fbe Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 21 Feb 2013 15:36:13 +0200 Subject: [PATCH 2157/5397] [ci skip] Remove a changelog line for a non-existent change --- user_guide_src/source/changelog.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 37bd2036aed..1b6cff10ef2 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -65,7 +65,6 @@ Release Date: Not Released - Added an optional parameter to :php:func:`timezone_menu()` that allows more attributes to be added to the generated select tag. - Deprecated ``standard_date()``, which now just uses the native ``date()`` with `DateTime constants `_. - Added function :php:func:`date_range()` that generates a list of dates between a specified period. - - :doc:`Captcha Helper ` :php:func:`create_captcha()` now accepts additional colors parameter, allowing for color customization. - :doc:`URL Helper ` changes include: - Deprecated *separator* options **dash** and **underscore** for function :php:func:`url_title()` (they are only aliases for '-' and '_' respectively). - :php:func:`url_title()` will now trim extra dashes from beginning and end. From 3e01437a5b23d9ffdf1b1cc9fc0a0f8b66551342 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 21 Feb 2013 15:59:34 +0200 Subject: [PATCH 2158/5397] Manually apply PR #2234 --- system/database/DB_query_builder.php | 1 + user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index c7bc4a6993f..85a233b505f 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -2627,6 +2627,7 @@ protected function _reset_write() $this->_reset_run(array( 'qb_set' => array(), 'qb_from' => array(), + 'qb_join' => array(), 'qb_where' => array(), 'qb_orderby' => array(), 'qb_keys' => array(), diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1b6cff10ef2..216bf80bc2e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -486,6 +486,7 @@ Bug fixes for 3.0 - Fixed a bug (#2211) - :doc:`Migration Library ` extensions couldn't execute ``CI_Migration::__construct()``. - Fixed a bug (#2255) - :doc:`Email Library ` didn't apply ``smtp_timeout``to socket reads and writes. - Fixed a bug (#2239) - :doc:`Email Library ` improperly handled the Subject when used with ``bcc_batch_mode`` resulting in E_WARNING messages and an empty Subject. +- Fixed a bug (#2234) - :doc:`Query Builder ` didn't reset JOIN cache for write-type queries. Version 2.1.3 ============= From 49e68de96b420a444c826995746a5f09470e76d9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 21 Feb 2013 16:30:55 +0200 Subject: [PATCH 2159/5397] Disable autoloader call from class_exists() occurences to improve performance Note: The Driver libary tests seem to depend on that, so one occurence in CI_Loader is left until we resolve that. --- system/core/CodeIgniter.php | 6 +++--- system/core/Common.php | 4 ++-- system/core/Hooks.php | 2 +- system/core/Loader.php | 10 +++++----- system/core/Output.php | 2 +- system/database/DB.php | 4 ++-- system/database/DB_driver.php | 4 ++-- system/libraries/Cache/drivers/Cache_memcached.php | 4 ++-- system/libraries/Migration.php | 2 +- system/libraries/Xmlrpcs.php | 2 +- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index cb4b735d521..7f76977b582 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -263,7 +263,7 @@ function &get_instance() $class = $RTR->fetch_class(); $method = $RTR->fetch_method(); - if ( ! class_exists($class) OR $method[0] === '_' OR method_exists('CI_Controller', $method)) + if ( ! class_exists($class, FALSE) OR $method[0] === '_' OR method_exists('CI_Controller', $method)) { if ( ! empty($RTR->routes['404_override'])) { @@ -272,7 +272,7 @@ function &get_instance() $method = 'index'; } - if ( ! class_exists($class)) + if ( ! class_exists($class, FALSE)) { if ( ! file_exists(APPPATH.'controllers/'.$class.'.php')) { @@ -310,7 +310,7 @@ function &get_instance() $method = 'index'; } - if ( ! class_exists($class)) + if ( ! class_exists($class, FALSE)) { if ( ! file_exists(APPPATH.'controllers/'.$class.'.php')) { diff --git a/system/core/Common.php b/system/core/Common.php index f8c1290f5d9..ee9bb2e875a 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -149,7 +149,7 @@ function &load_class($class, $directory = 'libraries', $prefix = 'CI_') { $name = $prefix.$class; - if (class_exists($name) === FALSE) + if (class_exists($name, FALSE) === FALSE) { require_once($path.$directory.'/'.$class.'.php'); } @@ -163,7 +163,7 @@ function &load_class($class, $directory = 'libraries', $prefix = 'CI_') { $name = config_item('subclass_prefix').$class; - if (class_exists($name) === FALSE) + if (class_exists($name, FALSE) === FALSE) { require_once(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php'); } diff --git a/system/core/Hooks.php b/system/core/Hooks.php index 17f6a027e89..b3b11199165 100644 --- a/system/core/Hooks.php +++ b/system/core/Hooks.php @@ -195,7 +195,7 @@ protected function _run_hook($data) // Call the requested class and/or function if ($class !== FALSE) { - if ( ! class_exists($class)) + if ( ! class_exists($class, FALSE)) { require($filepath); } diff --git a/system/core/Loader.php b/system/core/Loader.php index 9306a09efcc..6e5b58ba772 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -270,7 +270,7 @@ public function model($model, $name = '', $db_conn = FALSE) continue; } - if ($db_conn !== FALSE && ! class_exists('CI_DB')) + if ($db_conn !== FALSE && ! class_exists('CI_DB', FALSE)) { if ($db_conn === TRUE) { @@ -280,7 +280,7 @@ public function model($model, $name = '', $db_conn = FALSE) $CI->load->database($db_conn, FALSE, TRUE); } - if ( ! class_exists('CI_Model')) + if ( ! class_exists('CI_Model', FALSE)) { load_class('Model', 'core'); } @@ -1091,11 +1091,11 @@ protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object if ($prefix === '') { - if (class_exists('CI_'.$class)) + if (class_exists('CI_'.$class, FALSE)) { $name = 'CI_'.$class; } - elseif (class_exists(config_item('subclass_prefix').$class)) + elseif (class_exists(config_item('subclass_prefix').$class, FALSE)) { $name = config_item('subclass_prefix').$class; } @@ -1110,7 +1110,7 @@ protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object } // Is the class name valid? - if ( ! class_exists($name)) + if ( ! class_exists($name, FALSE)) { log_message('error', 'Non-existent class: '.$name); show_error('Non-existent class: '.$name); diff --git a/system/core/Output.php b/system/core/Output.php index a2084146329..25ecd496c6e 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -395,7 +395,7 @@ public function _display($output = '') global $BM, $CFG; // Grab the super object if we can. - if (class_exists('CI_Controller')) + if (class_exists('CI_Controller', FALSE)) { $CI =& get_instance(); } diff --git a/system/database/DB.php b/system/database/DB.php index d9104747f39..83d97330486 100644 --- a/system/database/DB.php +++ b/system/database/DB.php @@ -149,7 +149,7 @@ function &DB($params = '', $query_builder_override = NULL) if ( ! isset($query_builder) OR $query_builder === TRUE) { require_once(BASEPATH.'database/DB_query_builder.php'); - if ( ! class_exists('CI_DB')) + if ( ! class_exists('CI_DB', FALSE)) { /** * CI_DB @@ -162,7 +162,7 @@ function &DB($params = '', $query_builder_override = NULL) class CI_DB extends CI_DB_query_builder { } } } - elseif ( ! class_exists('CI_DB')) + elseif ( ! class_exists('CI_DB', FALSE)) { /** * @ignore diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 35ac8e87049..213e2c3a872 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -704,7 +704,7 @@ public function load_rdriver() { $driver = 'CI_DB_'.$this->dbdriver.'_result'; - if ( ! class_exists($driver)) + if ( ! class_exists($driver, FALSE)) { include_once(BASEPATH.'database/DB_result.php'); include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php'); @@ -1560,7 +1560,7 @@ public function cache_delete_all() */ protected function _cache_init() { - if (class_exists('CI_DB_Cache')) + if (class_exists('CI_DB_Cache', FALSE)) { if (is_object($this->CACHE)) { diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 8096b2650de..246a7a264f2 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -182,11 +182,11 @@ protected function _setup_memcached() } } - if (class_exists('Memcached')) + if (class_exists('Memcached', FALSE)) { $this->_memcached = new Memcached(); } - elseif (class_exists('Memcache')) + elseif (class_exists('Memcache', FALSE)) { $this->_memcached = new Memcache(); } diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index b673e9cb7d5..cc6fe48f0d2 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -228,7 +228,7 @@ public function version($target_version) $class = 'Migration_'.ucfirst(strtolower($this->_get_migration_name(basename($file, '.php')))); // Validate the migration file structure - if ( ! class_exists($class)) + if ( ! class_exists($class, FALSE)) { $this->_error_string = sprintf($this->lang->line('migration_class_doesnt_exist'), $class); return FALSE; diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php index d4524d23002..d263d789d71 100644 --- a/system/libraries/Xmlrpcs.php +++ b/system/libraries/Xmlrpcs.php @@ -31,7 +31,7 @@ show_error('Your PHP installation does not support XML'); } -if ( ! class_exists('CI_Xmlrpc')) +if ( ! class_exists('CI_Xmlrpc', FALSE)) { show_error('You must load the Xmlrpc class before loading the Xmlrpcs class in order to create a server.'); } From 8cf596b5eabe431572ec1c4f21b9c32101feb22f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 21 Feb 2013 16:44:12 +0200 Subject: [PATCH 2160/5397] DB_result tests seem to also depend on autoloading via the class_exists() checks ... --- system/database/DB_driver.php | 2 +- tests/mocks/database/ci_test.sqlite | Bin 19456 -> 19456 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 213e2c3a872..f03f56c85e4 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -704,7 +704,7 @@ public function load_rdriver() { $driver = 'CI_DB_'.$this->dbdriver.'_result'; - if ( ! class_exists($driver, FALSE)) + if ( ! class_exists($driver)) { include_once(BASEPATH.'database/DB_result.php'); include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php'); diff --git a/tests/mocks/database/ci_test.sqlite b/tests/mocks/database/ci_test.sqlite index 44dcef9ec5e46b649f8cce366f04e18163a5177e..574d3ae53bc94a4bb6613507a2cc96971a611fa7 100755 GIT binary patch delta 113 zcmZpe!Pqc^ae@?+BiBS3CpJee2Hi)h8&ekWb1^f|WMF>4e1v)C=0J{aW^GMo7DjDz z=Hi0HKM1%;CGd<7txQIwj>2^5`tMA!kS{~ZJKFXk`I?=}mH PJYe4ZPFsj)k%|TYR|O*c delta 77 zcmZpe!Pqc^ae@?+O~XVPCpMb~2Hi(88&ekWb1*R Date: Thu, 21 Feb 2013 10:36:31 -0500 Subject: [PATCH 2161/5397] Fix #2273 --- user_guide_src/source/libraries/migration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/migration.rst b/user_guide_src/source/libraries/migration.rst index 9a7b10d642b..b734f5c34e4 100644 --- a/user_guide_src/source/libraries/migration.rst +++ b/user_guide_src/source/libraries/migration.rst @@ -10,7 +10,7 @@ need to be run against the production machines next time you deploy. The database table **migration** tracks which migrations have already been run so all you have to do is update your application files and -call **$this->migrate->current()** to work out which migrations should be run. +call **$this->migration->current()** to work out which migrations should be run. The current version is found in **config/migration.php**. ******************** From 452b668d4edda5ae04c16f494bffe09114afc3ba Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 21 Feb 2013 19:05:52 +0200 Subject: [PATCH 2162/5397] Add CI_Utf8::convert_to_utf8() test --- tests/codeigniter/core/Utf8_test.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/codeigniter/core/Utf8_test.php diff --git a/tests/codeigniter/core/Utf8_test.php b/tests/codeigniter/core/Utf8_test.php new file mode 100644 index 00000000000..caa7b69861e --- /dev/null +++ b/tests/codeigniter/core/Utf8_test.php @@ -0,0 +1,20 @@ +utf8 = new Mock_Core_Utf8(); + } + + // -------------------------------------------------------------------- + + public function test_convert_to_utf8() + { + $this->assertEquals( + $this->utf8->convert_to_utf8('òåñò', 'WINDOWS-1251'), + 'тест' + ); + } + +} \ No newline at end of file From b3a5d6e8ad90644760890182a43ed81a23b86efe Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 21 Feb 2013 22:03:23 +0200 Subject: [PATCH 2163/5397] Some miscellaneous tests --- tests/codeigniter/core/Input_test.php | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/tests/codeigniter/core/Input_test.php b/tests/codeigniter/core/Input_test.php index ca1c6dfd7cc..5cf25fefa64 100644 --- a/tests/codeigniter/core/Input_test.php +++ b/tests/codeigniter/core/Input_test.php @@ -95,8 +95,8 @@ public function test_get_post() public function test_cookie() { $_COOKIE['foo'] = 'bar'; - $this->assertEquals('bar', $this->input->cookie('foo')); + $this->assertNull($this->input->cookie('bar')); } // -------------------------------------------------------------------- @@ -138,4 +138,27 @@ public function test_valid_ip() } } + // -------------------------------------------------------------------- + + public function test_method() + { + $_SERVER['REQUEST_METHOD'] = 'GET'; + $this->assertEquals('get', $this->input->method()); + $this->assertEquals('GET', $this->input->method(TRUE)); + $_SERVER['REQUEST_METHOD'] = 'POST'; + $this->assertEquals('post', $this->input->method()); + $this->assertEquals('POST', $this->input->method(TRUE)); + } + + // -------------------------------------------------------------------- + + public function test_is_ajax_request() + { + $this->assertFalse($this->input->is_ajax_request()); + $_SERVER['HTTP_X_REQUESTED_WITH'] = 'test'; + $this->assertFalse($this->input->is_ajax_request()); + $_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'; + $this->assertTrue($this->input->is_ajax_request()); + } + } \ No newline at end of file From eb291c1d1e1116a4420fa30e587adeea0451eeb7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 21 Feb 2013 22:22:51 +0200 Subject: [PATCH 2164/5397] CI_Output [set/append/get]_output() tests --- tests/codeigniter/core/Output_test.php | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/codeigniter/core/Output_test.php b/tests/codeigniter/core/Output_test.php index 728df3bf6c4..0eeb93f7b17 100644 --- a/tests/codeigniter/core/Output_test.php +++ b/tests/codeigniter/core/Output_test.php @@ -3,6 +3,16 @@ class Output_test extends CI_TestCase { public $output; + protected $_output_data = << + + Basic HTML + + + Test + + +HTML; public function set_up() { @@ -13,6 +23,31 @@ public function set_up() // -------------------------------------------------------------------- + public function test_set_get_append_output() + { + $append = "\n"; + + $this->assertEquals( + $this->_output_data.$append, + $this->output + ->set_output($this->_output_data) + ->append_output("\n") + ->get_output() + ); + } + + // -------------------------------------------------------------------- + + public function test_minify() + { + $this->assertEquals( + str_replace(array("\t", "\n"), '', $this->_output_data), + $this->output->minify($this->_output_data) + ); + } + + // -------------------------------------------------------------------- + public function test_get_content_type() { $this->assertEquals('text/html', $this->output->get_content_type()); From 3b5b7f48848d098c6190781f8790a1b0dcb0217c Mon Sep 17 00:00:00 2001 From: Daniel Hunsaker Date: Fri, 22 Feb 2013 19:17:56 -0700 Subject: [PATCH 2165/5397] Updated exit codes as constant values Re-allocated exit status codes according to three references, which follow: BSD sysexits.h:http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits GNU recomendations:http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html Bash scripting:http://tldp.org/LDP/abs/html/exitcodes.html The GNU recommendations stem from and expand upon the standard C/C++ library (stdlibc) definitions, while also suggesting some best-practice conventions which happen to prevent exit status code collisions with bash, and probably other shells. The re-allocated codes are now mapped to constant values, set in *application/config/constants.php*, and used throughout the CodeIgniter core. They would additionally be used in *index.php*, but the constants file hasn't been loaded at that point, so the integer values are used instead, and a comment follows each such use with amplifying information on why that particular value was selected. Finally, the errors documentation has been updated accordingly. Signed-off-by: Daniel Hunsaker --- application/config/constants.php | 110 +++++++++++++++++++++++ index.php | 12 ++- system/core/CodeIgniter.php | 2 +- system/core/Common.php | 16 ++-- system/core/Exceptions.php | 2 +- system/core/Input.php | 2 +- system/core/Output.php | 2 +- system/database/DB_driver.php | 2 +- system/helpers/download_helper.php | 4 +- system/helpers/url_helper.php | 2 +- system/libraries/Driver.php | 2 +- system/libraries/Trackback.php | 4 +- system/libraries/Xmlrpcs.php | 2 +- user_guide_src/source/general/errors.rst | 21 ++++- 14 files changed, 158 insertions(+), 25 deletions(-) diff --git a/application/config/constants.php b/application/config/constants.php index 58264ed5a2b..32a71595212 100644 --- a/application/config/constants.php +++ b/application/config/constants.php @@ -73,6 +73,116 @@ */ define('SHOW_DEBUG_BACKTRACE', TRUE); +/* +|-------------------------------------------------------------------------- +| Exit Status Codes +|-------------------------------------------------------------------------- +| +| Used to indicate the conditions under which the script is exit()ing. +| While there is no universal standard for error codes, there are some +| broad conventions. Three such conventions are presented below, for +| those who wish to make use of them. The CodeIgniter defaults were +| chosen for the least overlap with these conventions, while still +| leaving room for others to be defined in future versions and user +| applications. The CodeIgniter values are defined last so you can +| set them to values used by any of the other conventions, and do so +| by name instead of value. +| +*/ + +/* + * standard C/C++ library (stdlibc): + */ +/* +define('LIBC_EXIT_SUCCESS', 0); +define('LIBC_EXIT_FAILURE', 1); // generic errors +*/ + +/* + * BSD sysexits.h + */ +/* +define('SYS_EX_OK', 0); // successful termination +define('SYS_EX_USAGE', 64); // command line usage error +define('SYS_EX_DATAERR', 65); // data format error +define('SYS_EX_NOINPUT', 66); // cannot open input +define('SYS_EX_NOUSER', 67); // specified user unknown +define('SYS_EX_NOHOST', 68); // specified host name unknown +define('SYS_EX_UNAVAILABLE', 69); // service unavailable +define('SYS_EX_SOFTWARE', 70); // internal software error +define('SYS_EX_OSERR', 71); // system error (e.g., can't fork) +define('SYS_EX_OSFILE', 72); // critical OS file missing +define('SYS_EX_CANTCREAT', 73); // can't create (user) output file +define('SYS_EX_IOERR', 74); // input/output error +define('SYS_EX_TEMPFAIL', 75); // temporary failure; user is invited to retry +define('SYS_EX_PROTOCOL', 76); // remote error in protocol +define('SYS_EX_NOPERM', 77); // permission denied +define('SYS_EX_CONFIG', 78); // configuration error +*/ + +/* + * Bash scripting + */ +/* +define('BASH_EXIT_SUCCESS', 0); +define('BASH_EXIT_ERROR', 1); +define('BASH_EXIT_BUILTIN_MISUSE', 2); +define('BASH_EXIT_CANT_EXEC', 126); +define('BASH_EXIT_CMD_NOT_FOUND', 127); +define('BASH_EXIT_INVALID_EXIT', 128); +define('BASH_EXIT_SIG_HUP', 129); +define('BASH_EXIT_SIG_INT', 130); +define('BASH_EXIT_SIG_QUIT', 131); +define('BASH_EXIT_SIG_ILL', 132); +define('BASH_EXIT_SIG_TRAP', 133); +define('BASH_EXIT_SIG_ABRT', 134); +define('BASH_EXIT_SIG_BUS', 135); +define('BASH_EXIT_SIG_FPE', 136); +define('BASH_EXIT_SIG_KILL', 137); +define('BASH_EXIT_SIG_USR1', 138); +define('BASH_EXIT_SIG_SEGV', 139); +define('BASH_EXIT_SIG_USR2', 140); +define('BASH_EXIT_SIG_PIPE', 141); +define('BASH_EXIT_SIG_ALRM', 142); +define('BASH_EXIT_SIG_TERM', 143); +define('BASH_EXIT_SIG_STKFLT', 144); +define('BASH_EXIT_SIG_CHLD', 145); +define('BASH_EXIT_SIG_CONT', 146); +define('BASH_EXIT_SIG_STOP', 147); +define('BASH_EXIT_SIG_TSTP', 148); +define('BASH_EXIT_SIG_TTIN', 149); +define('BASH_EXIT_SIG_TTOU', 150); +define('BASH_EXIT_SIG_URG', 151); +define('BASH_EXIT_SIG_XCPU', 152); +define('BASH_EXIT_SIG_XFSZ', 153); +define('BASH_EXIT_SIG_VTALRM', 154); +define('BASH_EXIT_SIG_PROF', 155); +define('BASH_EXIT_SIG_WINCH', 156); +define('BASH_EXIT_SIG_IO', 157); +define('BASH_EXIT_SIG_PWR', 158); +define('BASH_EXIT_SIG_SYS', 159); +*/ +/* + * BASH_EXIT_OUTOFRANGE would be 255, and mean an exit status code beyond + * the range of 0-255 was given. However, this code CANNOT BE USED IN PHP, + * so it isn't actually defined, even in a comment. + */ + +/* + * CodeIgniter defaults + */ +define('EXIT_SUCCESS', 0); // no errors +define('EXIT_FAILURE', 1); // generic error +define('EXIT_CONFIG', 3); // configuration error +define('EXIT_404', 4); // file not found; convenience value +define('EXIT_UNK_FILE', 4); // file not found +define('EXIT_UNK_CLASS', 5); // unknown class +define('EXIT_UNK_MEMBER', 6); // unknown class member +define('EXIT_USER_INPUT', 7); // invalid user input +define('EXIT_DATABASE', 8); // database error +define('EXIT__AUTO_MIN', 9); // lowest automatically-assigned error code +define('EXIT__AUTO_MAX', 125); // highest automatically-assigned error code + /* End of file constants.php */ /* Location: ./application/config/constants.php */ \ No newline at end of file diff --git a/index.php b/index.php index be094574043..a52a021ec62 100755 --- a/index.php +++ b/index.php @@ -67,7 +67,8 @@ default: header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); - exit('The application environment is not set correctly.'); + echo 'The application environment is not set correctly.'; + exit(1); // EXIT_* constants not yet defined; 1 is EXIT_FAILURE, a generic error. } /* @@ -190,7 +191,8 @@ if ( ! is_dir($system_path)) { header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); - exit('Your system folder path does not appear to be set correctly. Please open the following file and correct this: '.pathinfo(__FILE__, PATHINFO_BASENAME)); + echo 'Your system folder path does not appear to be set correctly. Please open the following file and correct this: '.pathinfo(__FILE__, PATHINFO_BASENAME); + exit(3); // EXIT_* constants not yet defined; 3 is EXIT_CONFIG. } /* @@ -225,7 +227,8 @@ if ( ! is_dir(BASEPATH.$application_folder.'/')) { header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); - exit('Your application folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF); + echo 'Your application folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF; + exit(3); // EXIT_* constants not yet defined; 3 is EXIT_CONFIG. } define('APPPATH', BASEPATH.$application_folder.'/'); @@ -241,7 +244,8 @@ elseif ( ! is_dir(APPPATH.'views/')) { header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); - exit('Your view folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF); + echo 'Your view folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF; + exit(3); // EXIT_* constants not yet defined; 3 is EXIT_CONFIG. } else { diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 5a872ef2131..8f5271add38 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -188,7 +188,7 @@ if ($EXT->call_hook('cache_override') === FALSE && $OUT->_display_cache($CFG, $URI) === TRUE) { - exit(0); + exit(EXIT_SUCCESS); } /* diff --git a/system/core/Common.php b/system/core/Common.php index 3cd97dc2e17..479f0da7f60 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -177,7 +177,7 @@ function &load_class($class, $directory = 'libraries', $prefix = 'CI_') // self-referencing loop with the Exceptions class set_status_header(503); echo 'Unable to locate the specified class: '.$class.'.php'; - exit(2); + exit(EXIT_UNK_CLASS); } // Keep track of what we just loaded @@ -251,7 +251,7 @@ function &get_config($replace = array()) { set_status_header(503); echo 'The configuration file does not exist.'; - exit(1); + exit(EXIT_CONFIG); } // Does the $config array exist in the file? @@ -259,7 +259,7 @@ function &get_config($replace = array()) { set_status_header(503); echo 'Your config file does not appear to be formatted correctly.'; - exit(1); + exit(EXIT_CONFIG); } // Are any values being dynamically replaced? @@ -374,12 +374,16 @@ function show_error($message, $status_code = 500, $heading = 'An Error Was Encou $status_code = abs($status_code); if ($status_code < 100) { - $exit_status = $status_code + 28; + $exit_status = $status_code + EXIT__AUTO_MIN; + if ($exit_status > EXIT__AUTO_MAX) + { + $exit_status = EXIT_FAILURE; + } $status_code = 500; } else { - $exit_status = 27; + $exit_status = EXIT_FAILURE; } $_error =& load_class('Exceptions', 'core'); @@ -407,7 +411,7 @@ function show_404($page = '', $log_error = TRUE) { $_error =& load_class('Exceptions', 'core'); $_error->show_404($page, $log_error); - exit(4); + exit(EXIT_UNK_FILE); } } diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php index f799d6027ae..423387ff995 100644 --- a/system/core/Exceptions.php +++ b/system/core/Exceptions.php @@ -117,7 +117,7 @@ public function show_404($page = '', $log_error = TRUE) } echo $this->show_error($heading, $message, 'error_404', 404); - exit(4); + exit(EXIT_UNK_FILE); } // -------------------------------------------------------------------- diff --git a/system/core/Input.php b/system/core/Input.php index 904f4d6e9ab..8d491e05504 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -746,7 +746,7 @@ protected function _clean_input_keys($str) { set_status_header(503); echo 'Disallowed Key Characters.'; - exit(6); + exit(EXIT_USER_INPUT); } // Clean UTF-8 if supported diff --git a/system/core/Output.php b/system/core/Output.php index d4abe871dda..1025703dcff 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -696,7 +696,7 @@ public function set_cache_header($last_modified, $expiration) if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { $this->set_status_header(304); - exit(0); + exit(EXIT_SUCCESS); } else { diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 6ae1d524dcc..18dbbc76ecd 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1658,7 +1658,7 @@ public function display_error($error = '', $swap = '', $native = FALSE) $error =& load_class('Exceptions', 'core'); echo $error->show_error($heading, $message, 'error_db'); - exit(5); + exit(EXIT_DATABASE); } // -------------------------------------------------------------------- diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index daf59f51ba7..25863eaa4d7 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -142,7 +142,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) if ($data !== NULL) { echo $data; - exit(0); + exit(EXIT_SUCCESS); } // Flush 1MB chunks of data @@ -152,7 +152,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) } fclose($fp); - exit(0); + exit(EXIT_SUCCESS); } } diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index d6bf7e2c96e..7d5ccff35f2 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -550,7 +550,7 @@ function redirect($uri = '', $method = 'auto', $code = NULL) header('Location: '.$uri, TRUE, $code); break; } - exit(0); + exit(EXIT_SUCCESS); } } diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index ba15f81dfc9..9a56013ab09 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -290,7 +290,7 @@ public function __call($method, $args = array()) $trace = debug_backtrace(); _exception_handler(E_ERROR, "No such method '{$method}'", $trace[1]['file'], $trace[1]['line']); - exit(3); + exit(EXIT_UNK_MEMBER); } // -------------------------------------------------------------------- diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index cc93b2e301c..ea8017efd41 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -212,7 +212,7 @@ public function receive() public function send_error($message = 'Incomplete Information') { echo '\n\n1\n".$message."\n"; - exit(0); + exit(EXIT_SUCCESS); } // -------------------------------------------------------------------- @@ -228,7 +228,7 @@ public function send_error($message = 'Incomplete Information') public function send_success() { echo '\n\n0\n"; - exit(0); + exit(EXIT_SUCCESS); } // -------------------------------------------------------------------- diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php index 2d2e7f13b67..e150c13b720 100644 --- a/system/libraries/Xmlrpcs.php +++ b/system/libraries/Xmlrpcs.php @@ -171,7 +171,7 @@ public function serve() header('Content-Type: text/xml'); header('Content-Length: '.strlen($payload)); echo $payload; - exit(0); + exit(EXIT_SUCCESS); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/general/errors.rst b/user_guide_src/source/general/errors.rst index 8c941aadb18..1d6f8120df3 100644 --- a/user_guide_src/source/general/errors.rst +++ b/user_guide_src/source/general/errors.rst @@ -18,6 +18,15 @@ procedural interfaces that are available globally throughout the application. This approach permits error messages to get triggered without having to worry about class/function scoping. +CodeIgniter also returns a status code whenever a portion of the core +calls ``exit()``. This exit status code is separate from the HTTP status +code, and serves as a notice to other processes that may be watching of +whether the script completed successfully, or if not, what kind of +problem it encountered that caused it to abort. These values are +defined in *application/config/constants.php*. While exit status codes +are most useful in CLI settings, returning the proper code helps server +software keep track of your scripts and the health of your application. + The following functions let you generate errors: show_error() @@ -36,7 +45,12 @@ following error template:: application/errors/error_general.php The optional parameter ``$status_code`` determines what HTTP status -code should be sent with the error. +code should be sent with the error. If ``$status_code`` is less than 100, +the HTTP status code will be set to 500, and the exit status code will +be set to ``$status_code + EXIT__AUTO_MIN``. If that value is larger than +``EXIT__AUTO_MAX``, or if ``$status_code`` is 100 or higher, the exit +status code will be set to ``EXIT_FAILURE``. You can check in +*application/config/constants.php* for more detail. show_404() ========== @@ -53,8 +67,9 @@ the following error template:: application/errors/error_404.php The function expects the string passed to it to be the file path to the -page that isn't found. Note that CodeIgniter automatically shows 404 -messages if controllers are not found. +page that isn't found. The exit status code will be set to ``EXIT_UNK_FILE``. +Note that CodeIgniter automatically shows 404 messages if controllers are +not found. CodeIgniter automatically logs any ``show_404()`` calls. Setting the optional second parameter to FALSE will skip logging. From 4addd5ee5b1153089161635d53ff543e1295371a Mon Sep 17 00:00:00 2001 From: Eric Roberts Date: Mon, 25 Feb 2013 14:14:05 -0600 Subject: [PATCH 2166/5397] Update Style Guide page. --- user_guide_src/source/general/styleguide.rst | 120 ++++++------------- 1 file changed, 37 insertions(+), 83 deletions(-) diff --git a/user_guide_src/source/general/styleguide.rst b/user_guide_src/source/general/styleguide.rst index 99bc056f7db..de1da06d6ab 100644 --- a/user_guide_src/source/general/styleguide.rst +++ b/user_guide_src/source/general/styleguide.rst @@ -3,8 +3,10 @@ PHP Style Guide ############### -The following page describes the use of coding rules adhered to when -developing CodeIgniter. +The following page describes the coding styles adhered to when +contributing to the development of CodeIgniter. There is no requirement +to use these styles in your own CodeIgniter application, though they +are recommended. .. contents:: Table of Contents @@ -72,14 +74,15 @@ identify a file as being complete and not truncated. /* End of file myfile.php */ /* Location: ./system/modules/mymodule/myfile.php */ +.. note:: There should be no empty line or newline character(s) following + the closing comments. If you happen to see one when + submitting a pull request, please check your IDE settings and fix it. + Class and Method Naming ======================= Class names should always start with an uppercase letter. Multiple words -should be separated with an underscore, and not CamelCased. All other -class methods should be entirely lowercased and named to clearly -indicate their function, preferably including a verb. Try to avoid -overly long and verbose names. +should be separated with an underscore, and not CamelCased. **INCORRECT**:: @@ -100,7 +103,9 @@ overly long and verbose names. } } -Examples of improper and proper method naming: +Class methods should be entirely lowercased and named to clearly +indicate their function, preferably including a verb. Try to avoid +overly long and verbose names. **INCORRECT**:: @@ -117,8 +122,8 @@ Examples of improper and proper method naming: Variable Names ============== -The guidelines for variable naming is very similar to that used for -class methods. Namely, variables should contain only lowercase letters, +The guidelines for variable naming are very similar to those used for +class methods. Variables should contain only lowercase letters, use underscore separators, and be reasonably named to indicate their purpose and contents. Very short, non-word variables should only be used as iterators in for() loops. @@ -242,10 +247,10 @@ uppercase. Logical Operators ================= -Use of **\|\|** is discouraged as its clarity on some output devices is -low (looking like the number 11 for instance). **&&** is preferred over -**AND** but either are acceptable, and a space should always precede and -follow **!**. +Use of the **\|\|** *OR* comparison operator is discouraged, as its clarity +on some output devices is low (looking like the number 11, for instance). +**&&** is preferred over **AND** but either are acceptable, and a space should +always precede and follow **!**. **INCORRECT**:: @@ -318,14 +323,9 @@ other numbers) become strings of digits, and boolean TRUE becomes "1":: Debugging Code ============== -No debugging code can be left in place for submitted add-ons unless it -is commented out, i.e. no var_dump(), print_r(), die(), and exit() -calls that were used while creating the add-on, unless they are -commented out. - -:: - - // print_r($foo); +Do not leave debugging code in your submissions, even when commented out. +Things such as var_dump(), print_r(), die() or exit() should not be included +in your code unless it serves a specific purpose other than debugging. Whitespace in Files =================== @@ -333,73 +333,27 @@ Whitespace in Files No whitespace can precede the opening PHP tag or follow the closing PHP tag. Output is buffered, so whitespace in your files can cause output to begin before CodeIgniter outputs its content, leading to errors and an -inability for CodeIgniter to send proper headers. In the examples below, -select the text with your mouse to reveal the incorrect whitespace. +inability for CodeIgniter to send proper headers. Compatibility ============= -Unless specifically mentioned in your add-on's documentation, all code -must be compatible with PHP version 5.1+. Additionally, do not use PHP -functions that require non-default libraries to be installed unless your -code contains an alternative method when the function is not available, -or you implicitly document that your add-on requires said PHP libraries. - -Class and File Names using Common Words -======================================= - -When your class or filename is a common word, or might quite likely be -identically named in another PHP script, provide a unique prefix to help -prevent collision. Always realize that your end users may be running -other add-ons or third party PHP scripts. Choose a prefix that is unique -to your identity as a developer or company. - -**INCORRECT**:: - - class Email pi.email.php - class Xml ext.xml.php - class Import mod.import.php - -**CORRECT**:: - - class Pre_email pi.pre_email.php - class Pre_xml ext.pre_xml.php - class Pre_import mod.pre_import.php - -Database Table Names -==================== - -Any tables that your add-on might use must use the 'exp\_' prefix, -followed by a prefix uniquely identifying you as the developer or -company, and then a short descriptive table name. You do not need to be -concerned about the database prefix being used on the user's -installation, as CodeIgniter's database class will automatically convert -'exp\_' to what is actually being used. - -**INCORRECT**:: - - email_addresses // missing both prefixes - pre_email_addresses // missing exp_ prefix - exp_email_addresses // missing unique prefix - -**CORRECT**:: - - exp_pre_email_addresses +CodeIgniter requires a minimum PHP version of 5.2.4. Your code must either +be compatible with this minimum requirement, provide a suitable fallback, +or be an optional feature that dies quietly without affecting a user's +application. -.. note:: Be mindful that MySQL has a limit of 64 characters for table - names. This should not be an issue as table names that would exceed this - would likely have unreasonable names. For instance, the following table - name exceeds this limitation by one character. Silly, no? - **exp_pre_email_addresses_of_registered_users_in_seattle_washington** +Additionally, do not use PHP functions that require non-default libraries +to be installed unless your code contains an alternative method when the +function is not available. One File per Class ================== -Use separate files for each class your add-on uses, unless the classes -are *closely related*. An example of CodeIgniter files that contains -multiple classes is the Database class file, which contains both the DB -class and the DB_Cache class, and the Magpie plugin, which contains -both the Magpie and Snoopy classes. +Use separate files for each class, unless the classes are *closely related*. +An example of CodeIgniter files that contains multiple classes is the +Database class file, which contains both the DB class and the DB_Cache +class. Whitespace ========== @@ -536,8 +490,8 @@ functions and increase readability. Localized Text ============== -Any text that is output in the control panel should use language -variables in your lang file to allow localization. +CodeIgniter libraries should take advantage of corresponding language files +whenever possible. **INCORRECT**:: @@ -550,7 +504,7 @@ variables in your lang file to allow localization. Private Methods and Variables ============================= -Methods and variables that are only accessed internally by your class, +Methods and variables that are only accessed internally, such as utility and helper functions that your public methods use for code abstraction, should be prefixed with an underscore. @@ -567,7 +521,7 @@ hidden to meet this requirement. For instance, never access a variable that you did not set yourself (such as ``$_POST`` array keys) without first checking to see that it ``isset()``. -Make sure that while developing your add-on, error reporting is enabled +Make sure that your dev environment has error reporting enabled for ALL users, and that display_errors is enabled in the PHP environment. You can check this setting with:: From d746f26d644b401811980784cb1e795b789e2105 Mon Sep 17 00:00:00 2001 From: Eric Roberts Date: Mon, 25 Feb 2013 19:55:49 -0600 Subject: [PATCH 2167/5397] Style guide PR tweaks. --- user_guide_src/source/general/styleguide.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/user_guide_src/source/general/styleguide.rst b/user_guide_src/source/general/styleguide.rst index de1da06d6ab..144b362f581 100644 --- a/user_guide_src/source/general/styleguide.rst +++ b/user_guide_src/source/general/styleguide.rst @@ -105,7 +105,8 @@ should be separated with an underscore, and not CamelCased. Class methods should be entirely lowercased and named to clearly indicate their function, preferably including a verb. Try to avoid -overly long and verbose names. +overly long and verbose names. Multiple words should be separated +with an underscore. **INCORRECT**:: @@ -247,10 +248,10 @@ uppercase. Logical Operators ================= -Use of the **\|\|** *OR* comparison operator is discouraged, as its clarity +Use of the ``||`` "or" comparison operator is discouraged, as its clarity on some output devices is low (looking like the number 11, for instance). -**&&** is preferred over **AND** but either are acceptable, and a space should -always precede and follow **!**. +``&&`` is preferred over ``AND`` but either are acceptable, and a space should +always precede and follow ``!``. **INCORRECT**:: @@ -324,7 +325,7 @@ Debugging Code ============== Do not leave debugging code in your submissions, even when commented out. -Things such as var_dump(), print_r(), die() or exit() should not be included +Things such as ``var_dump()``, ``print_r()``, ``die()``/``exit()`` should not be included in your code unless it serves a specific purpose other than debugging. Whitespace in Files @@ -351,9 +352,8 @@ One File per Class ================== Use separate files for each class, unless the classes are *closely related*. -An example of CodeIgniter files that contains multiple classes is the -Database class file, which contains both the DB class and the DB_Cache -class. +An example of a CodeIgniter file that contains multiple classes is the +Xmlrpc library file. Whitespace ========== From a5e0ea8131e16752ab369d776f585b130b526f85 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Wed, 27 Feb 2013 18:17:35 +0100 Subject: [PATCH 2168/5397] Fix this use case: load->vars->('foobar', '') Previously, only the other syntax was working: load->vars->(array('foobar' => '')) --- system/core/Loader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index 6e5b58ba772..d4e63231c22 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -459,7 +459,7 @@ public function file($path, $return = FALSE) */ public function vars($vars = array(), $val = '') { - if ($val !== '' && is_string($vars)) + if (is_string($vars)) { $vars = array($vars => $val); } From b76e29242fd399c47ec633152092f9ce7ac917fc Mon Sep 17 00:00:00 2001 From: Michelle Jones Date: Wed, 27 Feb 2013 16:59:48 -0500 Subject: [PATCH 2169/5397] Remove trailing delimiters from csv_from_result When using the csv_from_result function, the returned string includes an extra delimiter at the end of every line, usually a comma unless another delimiter is specified. A simple addition of a couple of lines to remove the extra delimiter from the column names and the data rows is included. (Lines 241 and 251) --- system/database/DB_utility.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index 9822fdaa3b7..9803307ed31 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -238,7 +238,8 @@ public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosur $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim; } - $out = rtrim($out).$newline; + $out = substr(rtrim($out),0,-strlen($delim)); // Remove the trailing delimiter character(s) at the end of the column names + $out = $out.$newline; // Next blast through the result array and build out the rows while ($row = $query->unbuffered_row('array')) @@ -247,6 +248,7 @@ public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosur { $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim; } + $out = substr(rtrim($out),0,-strlen($delim)); // Remove the trailing delimiter character(s) at the end of the row lines $out = rtrim($out).$newline; } From 381cfd9e3ef2c221fbb64e8af570f4949d366db3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 28 Feb 2013 14:47:42 +0200 Subject: [PATCH 2170/5397] [ci skip] Add application/x-zip for OpenOffice docs in application/config/mimes.php --- application/config/mimes.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index 5b8ceff2e65..6ff381279b9 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -58,7 +58,7 @@ 'mif' => 'application/vnd.mif', 'xls' => array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/x-xls', 'application/excel', 'application/download', 'application/vnd.ms-office', 'application/msword'), 'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint'), - 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'pptx' => array('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/x-zip', 'application/zip'), 'wbxml' => 'application/wbxml', 'wmlc' => 'application/wmlc', 'dcr' => 'application/x-director', @@ -126,7 +126,7 @@ 'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'), 'dot' => array('application/msword', 'application/vnd.ms-office'), 'dotx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'), - 'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword'), + 'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword', 'application/x-zip'), 'word' => array('application/msword', 'application/octet-stream'), 'xl' => 'application/excel', 'eml' => 'message/rfc822', From 31875730b3cb67e865e99e748f885c5365339c9e Mon Sep 17 00:00:00 2001 From: Michelle Jones Date: Thu, 28 Feb 2013 09:44:47 -0500 Subject: [PATCH 2171/5397] added spaces after the parameter separators --- system/database/DB_utility.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index 9803307ed31..b270cdd4dbf 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -238,7 +238,7 @@ public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosur $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim; } - $out = substr(rtrim($out),0,-strlen($delim)); // Remove the trailing delimiter character(s) at the end of the column names + $out = substr(rtrim($out), 0, -strlen($delim)); // Remove the trailing delimiter character(s) at the end of the column names $out = $out.$newline; // Next blast through the result array and build out the rows @@ -248,7 +248,7 @@ public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosur { $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim; } - $out = substr(rtrim($out),0,-strlen($delim)); // Remove the trailing delimiter character(s) at the end of the row lines + $out = substr(rtrim($out), 0, -strlen($delim)); // Remove the trailing delimiter character(s) at the end of the row lines $out = rtrim($out).$newline; } From f5b4f6a156cddbed81ee4c4c6c3484507fa58ac5 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Thu, 28 Feb 2013 22:17:51 +0100 Subject: [PATCH 2172/5397] Text helper: convert_accented_characters() optimization Thanks to static variables, array_keys() and array_values() are now executed once only. --- system/helpers/text_helper.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index 54db14f9468..b2351db956e 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -363,9 +363,9 @@ function highlight_phrase($str, $phrase, $tag_open = '', $tag_close = '< */ function convert_accented_characters($str) { - static $_foreign_characters; + static $array_from, $array_to; - if ( ! is_array($_foreign_characters)) + if ( ! is_array($array_from)) { if (file_exists(APPPATH.'config/foreign_chars.php')) { @@ -379,14 +379,17 @@ function convert_accented_characters($str) if (empty($foreign_characters) OR ! is_array($foreign_characters)) { - $_foreign_characters = array(); + $array_from = array(); + $array_to = array(); + return $str; } - $_foreign_characters = $foreign_characters; + $array_from = array_keys($foreign_characters); + $array_to = array_values($foreign_characters); } - return preg_replace(array_keys($_foreign_characters), array_values($_foreign_characters), $str); + return preg_replace($array_from, $array_to, $str); } } From d327c797027d4ccf3bb624d7f4edd10997e372ac Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 1 Mar 2013 16:28:58 +0200 Subject: [PATCH 2173/5397] Optimize changes from PR #2290 --- system/database/DB_utility.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index b270cdd4dbf..9f953d4acb2 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -238,8 +238,7 @@ public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosur $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim; } - $out = substr(rtrim($out), 0, -strlen($delim)); // Remove the trailing delimiter character(s) at the end of the column names - $out = $out.$newline; + $out = substr(rtrim($out), 0, -strlen($delim)).$newline; // Next blast through the result array and build out the rows while ($row = $query->unbuffered_row('array')) @@ -248,8 +247,7 @@ public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosur { $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim; } - $out = substr(rtrim($out), 0, -strlen($delim)); // Remove the trailing delimiter character(s) at the end of the row lines - $out = rtrim($out).$newline; + $out = substr(rtrim($out), 0, -strlen($delim)).$newline; } return $out; From 930d8ef0f04688e63cfcdaa6f0f7b073e7b644ff Mon Sep 17 00:00:00 2001 From: Daniel Robbins Date: Fri, 1 Mar 2013 21:36:48 -0500 Subject: [PATCH 2174/5397] Fix Session cookie driver storing untrimmed user agent string in the database causing set_userdata() calls to fail when $config['sess_match_useragent'] = TRUE Signed-off-by: Daniel Robbins --- system/libraries/Session/drivers/Session_cookie.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session/drivers/Session_cookie.php b/system/libraries/Session/drivers/Session_cookie.php index 057e5a1d1c5..0e864410267 100644 --- a/system/libraries/Session/drivers/Session_cookie.php +++ b/system/libraries/Session/drivers/Session_cookie.php @@ -494,7 +494,7 @@ protected function _sess_create() $this->userdata = array( 'session_id' => $this->_make_sess_id(), 'ip_address' => $this->CI->input->ip_address(), - 'user_agent' => substr($this->CI->input->user_agent(), 0, 120), + 'user_agent' => trim(substr($this->CI->input->user_agent(), 0, 120)), 'last_activity' => $this->now, ); From 5780d8b2078126f8eb5738658fceadd38c66fe5b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 4 Mar 2013 07:38:16 +0200 Subject: [PATCH 2175/5397] Fix #2298 --- system/database/DB_result.php | 9 +++------ user_guide_src/source/changelog.rst | 1 + 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/system/database/DB_result.php b/system/database/DB_result.php index a044fd5dcda..41a851777e2 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -478,12 +478,9 @@ public function next_row($type = 'object') return NULL; } - if (isset($result[$this->current_row + 1])) - { - ++$this->current_row; - } - - return $result[$this->current_row]; + return isset($result[$this->current_row + 1]) + ? $result[++$this->current_row] + : NULL; } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 216bf80bc2e..07dae1fdc93 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -487,6 +487,7 @@ Bug fixes for 3.0 - Fixed a bug (#2255) - :doc:`Email Library ` didn't apply ``smtp_timeout``to socket reads and writes. - Fixed a bug (#2239) - :doc:`Email Library ` improperly handled the Subject when used with ``bcc_batch_mode`` resulting in E_WARNING messages and an empty Subject. - Fixed a bug (#2234) - :doc:`Query Builder ` didn't reset JOIN cache for write-type queries. +- Fixed a bug (#2298) - :doc:`Database Results ` method `next_row()` kept returning the last row, allowing for infinite loops. Version 2.1.3 ============= From 50dfe0175df02fe4aa243757bdf1b42fb9fc3169 Mon Sep 17 00:00:00 2001 From: Daniel Hunsaker Date: Mon, 4 Mar 2013 02:05:20 -0700 Subject: [PATCH 2176/5397] Updated in accordance with feedback from @narfbg - Removed commented lists of constants from the three reference conventions, replacing each with the URLs at which more information can be found. - Renamed a few constants to more closely reflect CodeIgniter conventions. - Modified a couple of lines which were in violation of the CI Style Guide. Signed-off-by: Daniel Hunsaker --- application/config/constants.php | 108 ++++------------------- index.php | 2 +- system/core/Common.php | 23 ++--- system/core/Exceptions.php | 2 +- system/helpers/download_helper.php | 4 +- system/libraries/Driver.php | 2 +- system/libraries/Xmlrpcs.php | 2 +- user_guide_src/source/general/errors.rst | 4 +- 8 files changed, 38 insertions(+), 109 deletions(-) diff --git a/application/config/constants.php b/application/config/constants.php index 32a71595212..dc84712cde9 100644 --- a/application/config/constants.php +++ b/application/config/constants.php @@ -80,104 +80,30 @@ | | Used to indicate the conditions under which the script is exit()ing. | While there is no universal standard for error codes, there are some -| broad conventions. Three such conventions are presented below, for +| broad conventions. Three such conventions are mentioned below, for | those who wish to make use of them. The CodeIgniter defaults were | chosen for the least overlap with these conventions, while still | leaving room for others to be defined in future versions and user -| applications. The CodeIgniter values are defined last so you can -| set them to values used by any of the other conventions, and do so -| by name instead of value. +| applications. +| +| The three main conventions used for determining exit status codes +| are as follows: +| +| Standard C/C++ Library (stdlibc): +| http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html +| (This link also contains other GNU-specific conventions) +| BSD sysexits.h: +| http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits +| Bash scripting: +| http://tldp.org/LDP/abs/html/exitcodes.html | */ - -/* - * standard C/C++ library (stdlibc): - */ -/* -define('LIBC_EXIT_SUCCESS', 0); -define('LIBC_EXIT_FAILURE', 1); // generic errors -*/ - -/* - * BSD sysexits.h - */ -/* -define('SYS_EX_OK', 0); // successful termination -define('SYS_EX_USAGE', 64); // command line usage error -define('SYS_EX_DATAERR', 65); // data format error -define('SYS_EX_NOINPUT', 66); // cannot open input -define('SYS_EX_NOUSER', 67); // specified user unknown -define('SYS_EX_NOHOST', 68); // specified host name unknown -define('SYS_EX_UNAVAILABLE', 69); // service unavailable -define('SYS_EX_SOFTWARE', 70); // internal software error -define('SYS_EX_OSERR', 71); // system error (e.g., can't fork) -define('SYS_EX_OSFILE', 72); // critical OS file missing -define('SYS_EX_CANTCREAT', 73); // can't create (user) output file -define('SYS_EX_IOERR', 74); // input/output error -define('SYS_EX_TEMPFAIL', 75); // temporary failure; user is invited to retry -define('SYS_EX_PROTOCOL', 76); // remote error in protocol -define('SYS_EX_NOPERM', 77); // permission denied -define('SYS_EX_CONFIG', 78); // configuration error -*/ - -/* - * Bash scripting - */ -/* -define('BASH_EXIT_SUCCESS', 0); -define('BASH_EXIT_ERROR', 1); -define('BASH_EXIT_BUILTIN_MISUSE', 2); -define('BASH_EXIT_CANT_EXEC', 126); -define('BASH_EXIT_CMD_NOT_FOUND', 127); -define('BASH_EXIT_INVALID_EXIT', 128); -define('BASH_EXIT_SIG_HUP', 129); -define('BASH_EXIT_SIG_INT', 130); -define('BASH_EXIT_SIG_QUIT', 131); -define('BASH_EXIT_SIG_ILL', 132); -define('BASH_EXIT_SIG_TRAP', 133); -define('BASH_EXIT_SIG_ABRT', 134); -define('BASH_EXIT_SIG_BUS', 135); -define('BASH_EXIT_SIG_FPE', 136); -define('BASH_EXIT_SIG_KILL', 137); -define('BASH_EXIT_SIG_USR1', 138); -define('BASH_EXIT_SIG_SEGV', 139); -define('BASH_EXIT_SIG_USR2', 140); -define('BASH_EXIT_SIG_PIPE', 141); -define('BASH_EXIT_SIG_ALRM', 142); -define('BASH_EXIT_SIG_TERM', 143); -define('BASH_EXIT_SIG_STKFLT', 144); -define('BASH_EXIT_SIG_CHLD', 145); -define('BASH_EXIT_SIG_CONT', 146); -define('BASH_EXIT_SIG_STOP', 147); -define('BASH_EXIT_SIG_TSTP', 148); -define('BASH_EXIT_SIG_TTIN', 149); -define('BASH_EXIT_SIG_TTOU', 150); -define('BASH_EXIT_SIG_URG', 151); -define('BASH_EXIT_SIG_XCPU', 152); -define('BASH_EXIT_SIG_XFSZ', 153); -define('BASH_EXIT_SIG_VTALRM', 154); -define('BASH_EXIT_SIG_PROF', 155); -define('BASH_EXIT_SIG_WINCH', 156); -define('BASH_EXIT_SIG_IO', 157); -define('BASH_EXIT_SIG_PWR', 158); -define('BASH_EXIT_SIG_SYS', 159); -*/ -/* - * BASH_EXIT_OUTOFRANGE would be 255, and mean an exit status code beyond - * the range of 0-255 was given. However, this code CANNOT BE USED IN PHP, - * so it isn't actually defined, even in a comment. - */ - -/* - * CodeIgniter defaults - */ define('EXIT_SUCCESS', 0); // no errors -define('EXIT_FAILURE', 1); // generic error +define('EXIT_ERROR', 1); // generic error define('EXIT_CONFIG', 3); // configuration error -define('EXIT_404', 4); // file not found; convenience value -define('EXIT_UNK_FILE', 4); // file not found -define('EXIT_UNK_CLASS', 5); // unknown class -define('EXIT_UNK_MEMBER', 6); // unknown class member +define('EXIT_UNKNOWN_FILE', 4); // file not found +define('EXIT_UNKNOWN_CLASS', 5); // unknown class +define('EXIT_UNKNOWN_METHOD', 6); // unknown class member define('EXIT_USER_INPUT', 7); // invalid user input define('EXIT_DATABASE', 8); // database error define('EXIT__AUTO_MIN', 9); // lowest automatically-assigned error code diff --git a/index.php b/index.php index a52a021ec62..c6314da1fb3 100755 --- a/index.php +++ b/index.php @@ -68,7 +68,7 @@ default: header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); echo 'The application environment is not set correctly.'; - exit(1); // EXIT_* constants not yet defined; 1 is EXIT_FAILURE, a generic error. + exit(1); // EXIT_* constants not yet defined; 1 is EXIT_ERROR, a generic error. } /* diff --git a/system/core/Common.php b/system/core/Common.php index 479f0da7f60..e11668d5f3f 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -177,7 +177,7 @@ function &load_class($class, $directory = 'libraries', $prefix = 'CI_') // self-referencing loop with the Exceptions class set_status_header(503); echo 'Unable to locate the specified class: '.$class.'.php'; - exit(EXIT_UNK_CLASS); + exit(EXIT_UNKNOWN_CLASS); } // Keep track of what we just loaded @@ -377,13 +377,13 @@ function show_error($message, $status_code = 500, $heading = 'An Error Was Encou $exit_status = $status_code + EXIT__AUTO_MIN; if ($exit_status > EXIT__AUTO_MAX) { - $exit_status = EXIT_FAILURE; + $exit_status = EXIT_ERROR; } $status_code = 500; } else { - $exit_status = EXIT_FAILURE; + $exit_status = EXIT_ERROR; } $_error =& load_class('Exceptions', 'core'); @@ -411,7 +411,7 @@ function show_404($page = '', $log_error = TRUE) { $_error =& load_class('Exceptions', 'core'); $_error->show_404($page, $log_error); - exit(EXIT_UNK_FILE); + exit(EXIT_UNKNOWN_FILE); } } @@ -531,13 +531,16 @@ function set_status_header($code = 200, $text = '') $server_protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : FALSE; - if (strpos(php_sapi_name(), 'cgi') === 0) + if ( ! headers_sent()) { - if (!headers_sent()) header('Status: '.$code.' '.$text, TRUE); - } - else - { - if (!headers_sent()) header(($server_protocol ? $server_protocol : 'HTTP/1.1').' '.$code.' '.$text, TRUE, $code); + if (strpos(php_sapi_name(), 'cgi') === 0) + { + header('Status: '.$code.' '.$text, TRUE); + } + else + { + header(($server_protocol ? $server_protocol : 'HTTP/1.1').' '.$code.' '.$text, TRUE, $code); + } } } } diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php index 423387ff995..9c68d06a5b7 100644 --- a/system/core/Exceptions.php +++ b/system/core/Exceptions.php @@ -117,7 +117,7 @@ public function show_404($page = '', $log_error = TRUE) } echo $this->show_error($heading, $message, 'error_404', 404); - exit(EXIT_UNK_FILE); + exit(EXIT_UNKNOWN_FILE); } // -------------------------------------------------------------------- diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 25863eaa4d7..bd32965740e 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -142,7 +142,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) if ($data !== NULL) { echo $data; - exit(EXIT_SUCCESS); + exit; } // Flush 1MB chunks of data @@ -152,7 +152,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) } fclose($fp); - exit(EXIT_SUCCESS); + exit; } } diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index 9a56013ab09..1bc365cbcb9 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -290,7 +290,7 @@ public function __call($method, $args = array()) $trace = debug_backtrace(); _exception_handler(E_ERROR, "No such method '{$method}'", $trace[1]['file'], $trace[1]['line']); - exit(EXIT_UNK_MEMBER); + exit(EXIT_UNKNOWN_METHOD); } // -------------------------------------------------------------------- diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php index e150c13b720..a6048cb9fc2 100644 --- a/system/libraries/Xmlrpcs.php +++ b/system/libraries/Xmlrpcs.php @@ -171,7 +171,7 @@ public function serve() header('Content-Type: text/xml'); header('Content-Length: '.strlen($payload)); echo $payload; - exit(EXIT_SUCCESS); + exit; } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/general/errors.rst b/user_guide_src/source/general/errors.rst index 1d6f8120df3..441cedb8073 100644 --- a/user_guide_src/source/general/errors.rst +++ b/user_guide_src/source/general/errors.rst @@ -49,7 +49,7 @@ code should be sent with the error. If ``$status_code`` is less than 100, the HTTP status code will be set to 500, and the exit status code will be set to ``$status_code + EXIT__AUTO_MIN``. If that value is larger than ``EXIT__AUTO_MAX``, or if ``$status_code`` is 100 or higher, the exit -status code will be set to ``EXIT_FAILURE``. You can check in +status code will be set to ``EXIT_ERROR``. You can check in *application/config/constants.php* for more detail. show_404() @@ -67,7 +67,7 @@ the following error template:: application/errors/error_404.php The function expects the string passed to it to be the file path to the -page that isn't found. The exit status code will be set to ``EXIT_UNK_FILE``. +page that isn't found. The exit status code will be set to ``EXIT_UNKNOWN_FILE``. Note that CodeIgniter automatically shows 404 messages if controllers are not found. From b2ac67a3a766ac18f5041eff7a5cbeef7437a184 Mon Sep 17 00:00:00 2001 From: Daniel Hunsaker Date: Mon, 4 Mar 2013 02:31:26 -0700 Subject: [PATCH 2177/5397] Oops, missed a few places where EXIT_SUCCESS was being used. Signed-off-by: Daniel Hunsaker --- system/core/CodeIgniter.php | 2 +- system/core/Output.php | 2 +- system/helpers/url_helper.php | 2 +- system/libraries/Trackback.php | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 8f5271add38..7f76977b582 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -188,7 +188,7 @@ if ($EXT->call_hook('cache_override') === FALSE && $OUT->_display_cache($CFG, $URI) === TRUE) { - exit(EXIT_SUCCESS); + exit; } /* diff --git a/system/core/Output.php b/system/core/Output.php index 1025703dcff..25ecd496c6e 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -696,7 +696,7 @@ public function set_cache_header($last_modified, $expiration) if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { $this->set_status_header(304); - exit(EXIT_SUCCESS); + exit; } else { diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index 7d5ccff35f2..d0fab3fe0f2 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -550,7 +550,7 @@ function redirect($uri = '', $method = 'auto', $code = NULL) header('Location: '.$uri, TRUE, $code); break; } - exit(EXIT_SUCCESS); + exit; } } diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index ea8017efd41..ecc7129e3ff 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -212,7 +212,7 @@ public function receive() public function send_error($message = 'Incomplete Information') { echo '\n\n1\n".$message."\n"; - exit(EXIT_SUCCESS); + exit; } // -------------------------------------------------------------------- @@ -228,7 +228,7 @@ public function send_error($message = 'Incomplete Information') public function send_success() { echo '\n\n0\n"; - exit(EXIT_SUCCESS); + exit; } // -------------------------------------------------------------------- From 7d10006a0001ff0e7d82ec994b1e9cbb63683ffc Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Mon, 4 Mar 2013 17:20:12 +0530 Subject: [PATCH 2178/5397] Fixed #2289 --- system/libraries/Email.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index daa38484be3..728b637a364 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -2017,7 +2017,7 @@ protected function _smtp_authenticate() $reply = $this->_get_smtp_data(); - if (strpos($reply, '503') !== 0) // Already authenticated + if (strpos($reply, '503') === 0) // Already authenticated { return TRUE; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 07dae1fdc93..d805c8f1015 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -488,6 +488,7 @@ Bug fixes for 3.0 - Fixed a bug (#2239) - :doc:`Email Library ` improperly handled the Subject when used with ``bcc_batch_mode`` resulting in E_WARNING messages and an empty Subject. - Fixed a bug (#2234) - :doc:`Query Builder ` didn't reset JOIN cache for write-type queries. - Fixed a bug (#2298) - :doc:`Database Results ` method `next_row()` kept returning the last row, allowing for infinite loops. +- Fixed a bug (#2289) - :doc:`Email Library ` method `_smtp_authenticate()` returned prematurely from authentication due to opposite condition check. Version 2.1.3 ============= From 8626e93d5b4362c86a58933dda9206ac8810476d Mon Sep 17 00:00:00 2001 From: Daniel Hunsaker Date: Mon, 4 Mar 2013 05:14:22 -0700 Subject: [PATCH 2179/5397] Reverting changes to functions that have no business being used in CLI apps to begin with Signed-off-by: Daniel Hunsaker --- system/core/Common.php | 15 ++++++--------- system/helpers/download_helper.php | 3 +-- system/libraries/Trackback.php | 6 ++---- system/libraries/Xmlrpcs.php | 3 +-- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index e11668d5f3f..9baf5e31591 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -531,16 +531,13 @@ function set_status_header($code = 200, $text = '') $server_protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : FALSE; - if ( ! headers_sent()) + if (strpos(php_sapi_name(), 'cgi') === 0) { - if (strpos(php_sapi_name(), 'cgi') === 0) - { - header('Status: '.$code.' '.$text, TRUE); - } - else - { - header(($server_protocol ? $server_protocol : 'HTTP/1.1').' '.$code.' '.$text, TRUE, $code); - } + header('Status: '.$code.' '.$text, TRUE); + } + else + { + header(($server_protocol ? $server_protocol : 'HTTP/1.1').' '.$code.' '.$text, TRUE, $code); } } } diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index bd32965740e..4fe6a0e8844 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -141,8 +141,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) // If we have raw data - just dump it if ($data !== NULL) { - echo $data; - exit; + exit($data); } // Flush 1MB chunks of data diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index ecc7129e3ff..5a45be8ddc4 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -211,8 +211,7 @@ public function receive() */ public function send_error($message = 'Incomplete Information') { - echo '\n\n1\n".$message."\n"; - exit; + exit('\n\n1\n".$message."\n"); } // -------------------------------------------------------------------- @@ -227,8 +226,7 @@ public function send_error($message = 'Incomplete Information') */ public function send_success() { - echo '\n\n0\n"; - exit; + exit('\n\n0\n"); } // -------------------------------------------------------------------- diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php index a6048cb9fc2..d263d789d71 100644 --- a/system/libraries/Xmlrpcs.php +++ b/system/libraries/Xmlrpcs.php @@ -170,8 +170,7 @@ public function serve() header('Content-Type: text/xml'); header('Content-Length: '.strlen($payload)); - echo $payload; - exit; + exit($payload); } // -------------------------------------------------------------------- From fa01ae4b3a2ed51a93590527c04295eb8cba4e40 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 4 Mar 2013 14:40:18 +0200 Subject: [PATCH 2180/5397] [ci skip] Fix #2289 --- system/libraries/Email.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index daa38484be3..756a38a10b9 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -2017,12 +2017,11 @@ protected function _smtp_authenticate() $reply = $this->_get_smtp_data(); - if (strpos($reply, '503') !== 0) // Already authenticated + if (strpos($reply, '503') === 0) // Already authenticated { return TRUE; } - - if (strpos($reply, '334') !== 0) + elseif (strpos($reply, '334') !== 0) { $this->_set_error_message('lang:email_failed_smtp_login', $reply); return FALSE; From 83c344efcae85ef3f07453bda70292a6bb628178 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Mon, 4 Mar 2013 14:30:08 +0100 Subject: [PATCH 2181/5397] Cache file driver: clean() now preserves .htaccess and index files --- system/libraries/Cache/drivers/Cache_file.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index f1f1a30be6a..769bd5a2613 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -133,7 +133,7 @@ public function delete($id) */ public function clean() { - return delete_files($this->_cache_path); + return delete_files($this->_cache_path, FALSE, TRUE); } // ------------------------------------------------------------------------ From 5a6814e2c832186e61d15e2032c4ad41932c4f49 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 4 Mar 2013 15:44:12 +0200 Subject: [PATCH 2182/5397] Fix #2301 --- system/core/Common.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 9baf5e31591..10c22375ebf 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -1,4 +1,3 @@ - show_error($heading, $message, 'error_general', $status_code); exit($exit_status); From 2d33e22c0af65963d7617374427814846f419a2e Mon Sep 17 00:00:00 2001 From: Louis Racicot Date: Tue, 5 Mar 2013 15:29:51 -0500 Subject: [PATCH 2183/5397] Add unicode support in cart product name for unicode 00C000 to 00E01F. --- system/libraries/Cart.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index b7b0697fbd6..86c11d6f633 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -51,7 +51,7 @@ class CI_Cart { * * @var string */ - public $product_name_rules = '\.\:\-_ a-z0-9'; + public $product_name_rules = '\.\:\-_ a-zA-ZÀ-ÿ0-9'; /** * only allow safe product names @@ -544,4 +544,4 @@ public function destroy() } /* End of file Cart.php */ -/* Location: ./system/libraries/Cart.php */ \ No newline at end of file +/* Location: ./system/libraries/Cart.php */ From b527bb5ebb262351aa3c9fd393d91b98c8fbee00 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Tue, 5 Mar 2013 21:58:49 +0100 Subject: [PATCH 2184/5397] Documentation: update reserved names list Added constants from 50dfe0175df02fe4aa243757bdf1b42fb9fc3169 (exit status codes) --- user_guide_src/source/general/reserved_names.rst | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/general/reserved_names.rst b/user_guide_src/source/general/reserved_names.rst index d9129236301..1ca3b608a7c 100644 --- a/user_guide_src/source/general/reserved_names.rst +++ b/user_guide_src/source/general/reserved_names.rst @@ -66,4 +66,14 @@ Constants - FOPEN_WRITE_CREATE - FOPEN_READ_WRITE_CREATE - FOPEN_WRITE_CREATE_STRICT -- FOPEN_READ_WRITE_CREATE_STRICT \ No newline at end of file +- FOPEN_READ_WRITE_CREATE_STRICT +- EXIT_SUCCESS +- EXIT_ERROR +- EXIT_CONFIG +- EXIT_UNKNOWN_FILE +- EXIT_UNKNOWN_CLASS +- EXIT_UNKNOWN_METHOD +- EXIT_USER_INPUT +- EXIT_DATABASE +- EXIT__AUTO_MIN +- EXIT__AUTO_MAX \ No newline at end of file From 9a6032d87f3911ec6fcaf23736545920198a8b04 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Tue, 5 Mar 2013 23:03:12 +0100 Subject: [PATCH 2185/5397] Documentation: another update to reserved names list Added missing user functions. Also fixed a typo in common_functions.rst. --- user_guide_src/source/general/common_functions.rst | 2 +- user_guide_src/source/general/reserved_names.rst | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/general/common_functions.rst b/user_guide_src/source/general/common_functions.rst index 7917d323997..79bd9b45961 100644 --- a/user_guide_src/source/general/common_functions.rst +++ b/user_guide_src/source/general/common_functions.rst @@ -31,7 +31,7 @@ version of PHP is lower than the supplied version number. is_really_writable() ==================== -.. php:function:: is_really_writeable($file) +.. php:function:: is_really_writable($file) :param string $file: File path :returns: bool diff --git a/user_guide_src/source/general/reserved_names.rst b/user_guide_src/source/general/reserved_names.rst index 1ca3b608a7c..ccc17d61b2d 100644 --- a/user_guide_src/source/general/reserved_names.rst +++ b/user_guide_src/source/general/reserved_names.rst @@ -25,15 +25,21 @@ your controller any of these: Functions --------- +- :php:func:`is_php()` - :php:func:`is_really_writable()` - ``load_class()`` +- ``is_loaded()`` - ``get_config()`` - :php:func:`config_item()` - :php:func:`show_error()` - :php:func:`show_404()` - :php:func:`log_message()` +- :php:func:`set_status_header()` - :php:func:`get_mimes()` - :php:func:`html_escape()` +- :php:func:`remove_invisible_characters()` +- :php:func:`is_https()` +- :php:func:`function_usable()` - :php:func:`get_instance()` - ``_exception_handler()`` - ``_stringify_attributes()`` From affc3bca4348071c792b6f08e6f88dede7e45266 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Wed, 6 Mar 2013 01:30:15 +0100 Subject: [PATCH 2186/5397] Fix a typo in changelog.rst This missing space was broking the link generation. --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 07dae1fdc93..0e45a0e8f81 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -484,7 +484,7 @@ Bug fixes for 3.0 - Fixed a bug - :doc:`DB result ` method ``list_fields()`` didn't reset its field pointer for the *mysql*, *mysqli* and *mssql* drivers. - Fixed a bug (#73) - :doc:`Security Library ` method ``sanitize_filename()`` could be tricked by an XSS attack. - Fixed a bug (#2211) - :doc:`Migration Library ` extensions couldn't execute ``CI_Migration::__construct()``. -- Fixed a bug (#2255) - :doc:`Email Library ` didn't apply ``smtp_timeout``to socket reads and writes. +- Fixed a bug (#2255) - :doc:`Email Library ` didn't apply ``smtp_timeout`` to socket reads and writes. - Fixed a bug (#2239) - :doc:`Email Library ` improperly handled the Subject when used with ``bcc_batch_mode`` resulting in E_WARNING messages and an empty Subject. - Fixed a bug (#2234) - :doc:`Query Builder ` didn't reset JOIN cache for write-type queries. - Fixed a bug (#2298) - :doc:`Database Results ` method `next_row()` kept returning the last row, allowing for infinite loops. From 141e2cb8a20e84a4e521c47edd885102185b2419 Mon Sep 17 00:00:00 2001 From: Louis Racicot Date: Wed, 6 Mar 2013 09:29:45 -0500 Subject: [PATCH 2187/5397] Update Cart.php Regex were already case sensitive. --- system/libraries/Cart.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index 86c11d6f633..84be7fa859b 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -51,7 +51,7 @@ class CI_Cart { * * @var string */ - public $product_name_rules = '\.\:\-_ a-zA-ZÀ-ÿ0-9'; + public $product_name_rules = '\.\:\-_ a-z�-�0-9'; /** * only allow safe product names From 837b203bcbd52fc8fc909a3dc8c5031fb4dc3379 Mon Sep 17 00:00:00 2001 From: Louis Racicot Date: Wed, 6 Mar 2013 09:31:31 -0500 Subject: [PATCH 2188/5397] Github broke the file encoding. I repaired it. --- system/libraries/Cart.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index 84be7fa859b..d5664f22cb4 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -51,7 +51,7 @@ class CI_Cart { * * @var string */ - public $product_name_rules = '\.\:\-_ a-z�-�0-9'; + public $product_name_rules = '\.\:\-_ a-zÀ-ÿ0-9'; /** * only allow safe product names From 592e7d46895029f462369708085631d67494ec56 Mon Sep 17 00:00:00 2001 From: Louis Racicot Date: Wed, 6 Mar 2013 10:04:55 -0500 Subject: [PATCH 2189/5397] Full unicode support for the product name. --- system/libraries/Cart.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index d5664f22cb4..c224a6dc926 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -51,7 +51,7 @@ class CI_Cart { * * @var string */ - public $product_name_rules = '\.\:\-_ a-zÀ-ÿ0-9'; + public $product_name_rules = '\.\:\- \w'; /** * only allow safe product names @@ -214,7 +214,7 @@ protected function _insert($items = array()) // Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods. // Note: These can be user-specified by setting the $this->product_name_rules variable. - if ($this->product_name_safe && ! preg_match('/^['.$this->product_name_rules.']+$/i', $items['name'])) + if ($this->product_name_safe && ! preg_match('/^['.$this->product_name_rules.']+$/iu', $items['name'])) { log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces'); return FALSE; From 025b6465c4baa7ba501b24df64672fd15f779a1a Mon Sep 17 00:00:00 2001 From: Louis Racicot Date: Thu, 7 Mar 2013 09:32:16 -0500 Subject: [PATCH 2190/5397] check if uft8 is enabled --- system/libraries/Cart.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index c224a6dc926..6e203a8c74d 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -214,7 +214,7 @@ protected function _insert($items = array()) // Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods. // Note: These can be user-specified by setting the $this->product_name_rules variable. - if ($this->product_name_safe && ! preg_match('/^['.$this->product_name_rules.']+$/iu', $items['name'])) + if ($this->product_name_safe && ! preg_match('/^['.$this->product_name_rules.']+$/i'.(UTF8_ENABLED ? 'u' : ''), $items['name'])) { log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces'); return FALSE; From 65b8f835e572cc6ff73fe07024ffaa537fee912e Mon Sep 17 00:00:00 2001 From: Louis Racicot Date: Mon, 11 Mar 2013 09:03:25 -0400 Subject: [PATCH 2191/5397] reorder rules in product name regex by importance --- system/libraries/Cart.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index 6e203a8c74d..edc300bd7e0 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -51,7 +51,7 @@ class CI_Cart { * * @var string */ - public $product_name_rules = '\.\:\- \w'; + public $product_name_rules = '\w \-\.\:'; /** * only allow safe product names @@ -544,4 +544,4 @@ public function destroy() } /* End of file Cart.php */ -/* Location: ./system/libraries/Cart.php */ +/* Location: ./system/libraries/Cart.php */ \ No newline at end of file From 89b67b49616b19e9c9f0bee8f49cb1bfc93b7436 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Mar 2013 19:34:23 +0200 Subject: [PATCH 2192/5397] Fix #2320 --- system/libraries/Email.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 756a38a10b9..a745d331d59 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -105,9 +105,9 @@ class CI_Email { /** * SMTP Encryption * - * @var string NULL, 'tls' or 'ssl' + * @var string empty, 'tls' or 'ssl' */ - public $smtp_crypto = NULL; + public $smtp_crypto = ''; /** * Whether to apply word-wrapping to the message body. @@ -1875,7 +1875,7 @@ protected function _smtp_connect() return TRUE; } - $ssl = ($this->smtp_crypto === 'ssl') ? 'ssl://' : NULL; + $ssl = ($this->smtp_crypto === 'ssl') ? 'ssl://' : ''; $this->_smtp_connect = fsockopen($ssl.$this->smtp_host, $this->smtp_port, From 219565d05f6b223c28e24422b9d244b201890699 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Mar 2013 20:00:08 +0200 Subject: [PATCH 2193/5397] Add a (default) CI_DB_query_builder::_update_batch() method An improved version of PR #2324, which only targets ODBC. --- system/database/DB_query_builder.php | 41 +++++++++++++++++++ .../database/drivers/cubrid/cubrid_driver.php | 41 ------------------- .../database/drivers/mysql/mysql_driver.php | 41 ------------------- .../database/drivers/mysqli/mysqli_driver.php | 41 ------------------- .../pdo/subdrivers/pdo_mysql_driver.php | 41 ------------------- 5 files changed, 41 insertions(+), 164 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 85a233b505f..292621b66e6 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1854,6 +1854,47 @@ public function update_batch($table = '', $set = NULL, $index = NULL) // -------------------------------------------------------------------- + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @param string $table Table name + * @param array $values Update data + * @param string $index WHERE key + * @return string + */ + protected function _update_batch($table, $values, $index) + { + $ids = array(); + foreach ($values as $key => $val) + { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k." = CASE \n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END, '; + } + + $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); + + return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); + } + + // -------------------------------------------------------------------- + /** * The "set_update_batch" function. Allows key/value pairs to be set for batch updating * diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index 6663868bd9e..51bbbdb476e 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -429,47 +429,6 @@ public function error() // -------------------------------------------------------------------- - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * @return string - */ - protected function _update_batch($table, $values, $index) - { - $ids = array(); - foreach ($values as $key => $val) - { - $ids[] = $val[$index]; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k." = CASE \n" - .implode("\n", $v) - .'ELSE '.$k.' END, '; - } - - $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); - - return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); - } - - // -------------------------------------------------------------------- - /** * FROM tables * diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 95003f648fe..b94642b3547 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -455,47 +455,6 @@ public function error() // -------------------------------------------------------------------- - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * @return string - */ - protected function _update_batch($table, $values, $index) - { - $ids = array(); - foreach ($values as $key => $val) - { - $ids[] = $val[$index]; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k." = CASE \n" - .implode("\n", $v)."\n" - .'ELSE '.$k.' END, '; - } - - $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); - - return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); - } - - // -------------------------------------------------------------------- - /** * FROM tables * diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index b64a7a2e801..ef2cb8a8d81 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -426,47 +426,6 @@ public function error() // -------------------------------------------------------------------- - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * @return string - */ - protected function _update_batch($table, $values, $index) - { - $ids = array(); - foreach ($values as $key => $val) - { - $ids[] = $val[$index]; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k.' = CASE '."\n" - .implode("\n", $v)."\n" - .'ELSE '.$k.' END, '; - } - - $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); - - return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); - } - - // -------------------------------------------------------------------- - /** * FROM tables * diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php index 315f6f53b65..ff486fc5a7f 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -200,47 +200,6 @@ public function field_data($table = '') // -------------------------------------------------------------------- - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index UPDATE key - * @return string - */ - protected function _update_batch($table, $values, $index) - { - $ids = array(); - 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]; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k." = CASE \n" - .implode("\n", $v)."\n" - .'ELSE '.$k.' END), '; - } - - $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); - - return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); - } - - // -------------------------------------------------------------------- - /** * Truncate statement * From 7b90325ceb8aa6fdb4680afe959927fc000bf548 Mon Sep 17 00:00:00 2001 From: bayssmekanique Date: Tue, 12 Mar 2013 13:25:24 -0700 Subject: [PATCH 2194/5397] Output Class Minify Function Change Added 2 additional MIME types to match against for JavaScript detection. --- system/core/Output.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/system/core/Output.php b/system/core/Output.php index 25ecd496c6e..3320ae1547e 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -793,6 +793,8 @@ public function minify($output, $type = 'text/html') case 'text/css': case 'text/javascript': + case 'application/javascript': + case 'application/x-javascript': $output = $this->_minify_script_style($output); From 5cb5c0a4354518ac1a8c5b71971d7a7232c33480 Mon Sep 17 00:00:00 2001 From: Sam Doidge Date: Wed, 13 Mar 2013 01:28:06 +0000 Subject: [PATCH 2195/5397] adding thumb_marker to image_lib->clear() --- system/libraries/Image_lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 0cec43fc4c2..7f01ac028fa 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -388,7 +388,7 @@ public function __construct($props = array()) */ public function clear() { - $props = array('library_path', 'source_image', 'new_image', 'width', 'height', 'rotation_angle', 'x_axis', 'y_axis', 'wm_text', 'wm_overlay_path', 'wm_font_path', 'wm_shadow_color', 'source_folder', 'dest_folder', 'mime_type', 'orig_width', 'orig_height', 'image_type', 'size_str', 'full_src_path', 'full_dst_path'); + $props = array('thumb_marker', 'library_path', 'source_image', 'new_image', 'width', 'height', 'rotation_angle', 'x_axis', 'y_axis', 'wm_text', 'wm_overlay_path', 'wm_font_path', 'wm_shadow_color', 'source_folder', 'dest_folder', 'mime_type', 'orig_width', 'orig_height', 'image_type', 'size_str', 'full_src_path', 'full_dst_path'); foreach ($props as $val) { @@ -1767,4 +1767,4 @@ public function display_errors($open = '

    ', $close = '

    ') } /* End of file Image_lib.php */ -/* Location: ./system/libraries/Image_lib.php */ \ No newline at end of file +/* Location: ./system/libraries/Image_lib.php */ From 7ee2034cabf965c68861b68093f126befbf26727 Mon Sep 17 00:00:00 2001 From: Sam Doidge Date: Wed, 13 Mar 2013 04:43:55 +0000 Subject: [PATCH 2196/5397] removing linebreak --- system/libraries/Image_lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 7f01ac028fa..b6a11a3a526 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -1767,4 +1767,4 @@ public function display_errors($open = '

    ', $close = '

    ') } /* End of file Image_lib.php */ -/* Location: ./system/libraries/Image_lib.php */ +/* Location: ./system/libraries/Image_lib.php */ \ No newline at end of file From 13f6eabafa655828a8c09b4ae0a58a2e3776c269 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 15 Mar 2013 10:56:55 +0200 Subject: [PATCH 2197/5397] Fix MSSQL ALTER TABLE ADD statement An improved version of PR #2329 --- system/database/DB_forge.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index 53cdd53b667..d52029ecd18 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -680,8 +680,12 @@ protected function _alter_table($alter_type, $table, $field) return $sql.'DROP COLUMN '.$this->db->escape_identifiers($field); } + $sql .= ($alter_type === 'ADD') + ? 'ADD ' + : $alter_type.' COLUMN '; + $sqls = array(); - for ($i = 0, $c = count($field), $sql .= $alter_type.' COLUMN '; $i < $c; $i++) + for ($i = 0, $c = count($field); $i < $c; $i++) { $sqls[] = $sql .($field[$i]['_literal'] !== FALSE ? $field[$i]['_literal'] : $this->_process_column($field[$i])); From eaeaad5e974223d814ad7e0fa01d1923dc3c571a Mon Sep 17 00:00:00 2001 From: Katsumi Honda Date: Tue, 19 Mar 2013 17:56:09 +0900 Subject: [PATCH 2198/5397] Fixed problem for transaction test mode. trans_complete function is committed in test mode. Because any database drivers are set _trans_failure in test_mode, And trans_complete function is not evaluate _trans_failure. --- system/database/DB_driver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 18dbbc76ecd..3e637844879 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -816,7 +816,7 @@ public function trans_complete() } // The query() function will set this flag to FALSE in the event that a query failed - if ($this->_trans_status === FALSE) + if ($this->_trans_status === FALSE || $this->_trans_failure === TRUE) { $this->trans_rollback(); @@ -1859,4 +1859,4 @@ protected function _reset_select() } /* End of file DB_driver.php */ -/* Location: ./system/database/DB_driver.php */ \ No newline at end of file +/* Location: ./system/database/DB_driver.php */ From a7447d205296eeead94617f4b66707e336547b51 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Thu, 21 Mar 2013 15:48:10 +0530 Subject: [PATCH 2199/5397] Added array notation for keys in Input library --- system/core/Input.php | 74 ++++++++++++++++++++++------ system/helpers/form_helper.php | 44 +++++++++++++++-- system/libraries/Form_validation.php | 15 ++++++ user_guide_src/source/changelog.rst | 2 + 4 files changed, 114 insertions(+), 21 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index 8d491e05504..ffe7b4d278a 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -149,21 +149,59 @@ public function __construct() * @param array &$array $_GET, $_POST, $_COOKIE, $_SERVER, etc. * @param string $index Index for item to be fetched from $array * @param bool $xss_clean Whether to apply XSS filtering + * @param bool $recurse Whether to recurse into arrays via nested keys * @return mixed */ - protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) + protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE, $recurse = FALSE) { - if ( ! isset($array[$index])) + $value = NULL; + + if (isset($array[$index])) { - return NULL; + $value = $array[$index]; + } + else if($recurse) + { + // We couldn't find the $field as a simple key, so try the nested notation + $key = $index; + $container = $array; + + // Test if the $index is an array name, and try to obtain the final index + if (preg_match_all('/\[(.*?)\]/', $index, $matches)) + { + sscanf($index, '%[^[][', $key); + for ($i = 0, $c = count($matches[0]); $i < $c; $i++) + { + if($matches[1][$i] === '') // The array notation will return the value as array + { + break; + } + if (isset($container[$key])) + { + $container = $container[$key]; + $key = $matches[1][$i]; + } + else + { + $container = array(); + break; + } + } + + // Check if the deepest container has the field + if(isset($container[$key])) + { + $value = $container[$key]; + } + } } if ($xss_clean === TRUE) { - return $this->security->xss_clean($array[$index]); + return $this->security->xss_clean($value); } - return $array[$index]; + return $value; } // -------------------------------------------------------------------- @@ -173,9 +211,10 @@ protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) * * @param string $index Index for item to be fetched from $_GET * @param bool $xss_clean Whether to apply XSS filtering + * @param bool $recurse Whether to recurse into arrays via nested keys * @return mixed */ - public function get($index = NULL, $xss_clean = FALSE) + public function get($index = NULL, $xss_clean = FALSE, $recurse = FALSE) { // Check if a field has been provided if ($index === NULL) @@ -190,12 +229,12 @@ public function get($index = NULL, $xss_clean = FALSE) // loop through the full _GET array foreach (array_keys($_GET) as $key) { - $get[$key] = $this->_fetch_from_array($_GET, $key, $xss_clean); + $get[$key] = $this->_fetch_from_array($_GET, $key, $xss_clean, $recurse); } return $get; } - return $this->_fetch_from_array($_GET, $index, $xss_clean); + return $this->_fetch_from_array($_GET, $index, $xss_clean, $recurse); } // -------------------------------------------------------------------- @@ -205,9 +244,10 @@ public function get($index = NULL, $xss_clean = FALSE) * * @param string $index Index for item to be fetched from $_POST * @param bool $xss_clean Whether to apply XSS filtering + * @param bool $recurse Whether to recurse into arrays via nested keys * @return mixed */ - public function post($index = NULL, $xss_clean = FALSE) + public function post($index = NULL, $xss_clean = FALSE, $recurse = FALSE) { // Check if a field has been provided if ($index === NULL) @@ -222,12 +262,12 @@ public function post($index = NULL, $xss_clean = FALSE) // 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); + $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean, $recurse); } return $post; } - return $this->_fetch_from_array($_POST, $index, $xss_clean); + return $this->_fetch_from_array($_POST, $index, $xss_clean, $recurse); } // -------------------------------------------------------------------- @@ -237,13 +277,14 @@ public function post($index = NULL, $xss_clean = FALSE) * * @param string $index Index for item to be fetched from $_POST or $_GET * @param bool $xss_clean Whether to apply XSS filtering + * @param bool $recurse Whether to recurse into arrays via nested keys * @return mixed */ - public function get_post($index = '', $xss_clean = FALSE) + public function get_post($index = '', $xss_clean = FALSE, $recurse = FALSE) { return isset($_POST[$index]) - ? $this->post($index, $xss_clean) - : $this->get($index, $xss_clean); + ? $this->post($index, $xss_clean, $recurse) + : $this->get($index, $xss_clean, $recurse); } // -------------------------------------------------------------------- @@ -253,11 +294,12 @@ public function get_post($index = '', $xss_clean = FALSE) * * @param string $index Index for item to be fetched from $_COOKIE * @param bool $xss_clean Whether to apply XSS filtering + * @param bool $recurse Whether to recurse into arrays via nested keys * @return mixed */ - public function cookie($index = '', $xss_clean = FALSE) + public function cookie($index = '', $xss_clean = FALSE, $recurse = FALSE) { - return $this->_fetch_from_array($_COOKIE, $index, $xss_clean); + return $this->_fetch_from_array($_COOKIE, $index, $xss_clean, $recurse); } // -------------------------------------------------------------------- diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 692909c79d0..d2c22b05c38 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -642,14 +642,17 @@ function form_prep($str = '', $is_textarea = FALSE) */ function set_value($field = '', $default = '', $is_textarea = FALSE) { - if (FALSE === ($OBJ =& _get_validation_object())) + if (FALSE !== ($OBJ =& _get_validation_object()) && $OBJ->has_rule($field)) + { + return form_prep($OBJ->set_value($field, $default), $is_textarea); + } + + if (FALSE !== ($OBJ =& _get_input_object()) && ($value = $OBJ->post($field, FALSE, TRUE))) { - return isset($_POST[$field]) - ? form_prep($_POST[$field], $is_textarea) - : form_prep($default, $is_textarea); + return form_prep($value, $is_textarea); } - return form_prep($OBJ->set_value($field, $default), $is_textarea); + return form_prep($default, $is_textarea); } } @@ -1004,5 +1007,36 @@ function &_get_validation_object() } } +// ------------------------------------------------------------------------ + +if ( ! function_exists('_get_input_object')) +{ + /** + * Input Object + * + * Fetches the input object + * + * @return mixed + */ + function &_get_input_object() + { + $CI =& get_instance(); + + // We set this as a variable since we're returning by reference. + $return = FALSE; + + if ( ! isset($CI->input) OR ! is_object($CI->input)) + { + return $return; + } + else + { + $return = $CI->input; + } + + return $return; + } +} + /* End of file form_helper.php */ /* Location: ./system/helpers/form_helper.php */ \ No newline at end of file diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 172e799f647..1ed50844cf0 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -835,6 +835,21 @@ protected function _build_error_msg($line, $field = '', $param = '') // -------------------------------------------------------------------- + /** + * Checks if the rule is present within the validator + * + * Permits you to check if a rule is present within the validator + * + * @param string the field name + * @return bool + */ + public function has_rule($field) + { + return isset($this->_field_data[$field]); + } + + // -------------------------------------------------------------------- + /** * Get the value from a form * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a9c420af13d..33fc8fa9e4b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -304,6 +304,7 @@ Release Date: Not Released - Changed method ``valid_ip()`` to use PHP's native ``filter_var()`` function. - Changed internal method ``_sanitize_globals()`` to skip enforcing reversal of *register_globals* in PHP 5.4+, where this functionality no longer exists. - Changed methods ``get()``, ``post()``, ``get_post()``, ``cookie()``, ``server()``, ``user_agent()`` to return NULL instead of FALSE when no value is found. + - Added provision for using array notation for keys. - :doc:`Common functions ` changes include: - Added function :php:func:`get_mimes()` to return the *application/config/mimes.php* array. - Added support for HTTP code 303 ("See Other") in :php:func:`set_status_header()`. @@ -489,6 +490,7 @@ Bug fixes for 3.0 - Fixed a bug (#2234) - :doc:`Query Builder ` didn't reset JOIN cache for write-type queries. - Fixed a bug (#2298) - :doc:`Database Results ` method `next_row()` kept returning the last row, allowing for infinite loops. - Fixed a bug (#2289) - :doc:`Email Library ` method `_smtp_authenticate()` returned prematurely from authentication due to opposite condition check. +- Fixed a bug (#2236) - :doc:`Form Helper ` function ``set_value()`` didn't parse array notation for keys if the rule was not present in the :doc:`Form Validation Library `. Version 2.1.3 ============= From 395e2df7ff74fe9bf4c669dea3f6ae5eb46b081e Mon Sep 17 00:00:00 2001 From: RJ garcia Date: Thu, 21 Mar 2013 10:48:24 -0500 Subject: [PATCH 2200/5397] Making a performance modification to DB_driver list_fields() Signed-off-by: RJ garcia --- system/database/DB_driver.php | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 18dbbc76ecd..04490c82448 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1208,13 +1208,8 @@ public function list_fields($table = '') } else { - /* We have no other choice but to just get the first element's key. - * Due to array_shift() accepting it's argument by reference, if - * E_STRICT is on, this would trigger a warning. So we'll have to - * assign it first. - */ - $key = array_keys($row); - $key = array_shift($key); + // We have no other choice but to just get the first element's key. + $key = key($row); } } From a945d078d769f00410d10d10b9fdac3ea2e55b45 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Fri, 22 Mar 2013 00:49:11 +0530 Subject: [PATCH 2201/5397] Removed entry for erroneous bugfix --- user_guide_src/source/changelog.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 33fc8fa9e4b..bc74973e0cc 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -489,7 +489,6 @@ Bug fixes for 3.0 - Fixed a bug (#2239) - :doc:`Email Library ` improperly handled the Subject when used with ``bcc_batch_mode`` resulting in E_WARNING messages and an empty Subject. - Fixed a bug (#2234) - :doc:`Query Builder ` didn't reset JOIN cache for write-type queries. - Fixed a bug (#2298) - :doc:`Database Results ` method `next_row()` kept returning the last row, allowing for infinite loops. -- Fixed a bug (#2289) - :doc:`Email Library ` method `_smtp_authenticate()` returned prematurely from authentication due to opposite condition check. - Fixed a bug (#2236) - :doc:`Form Helper ` function ``set_value()`` didn't parse array notation for keys if the rule was not present in the :doc:`Form Validation Library `. Version 2.1.3 From e15d1be514dad1df7a3c38d6265566692ecf1260 Mon Sep 17 00:00:00 2001 From: Zach Cardoza Date: Fri, 22 Mar 2013 14:50:39 -0700 Subject: [PATCH 2202/5397] Fixed error in Form Helper textarea function Function had declaration of unused $name variable which caused errors. --- system/helpers/form_helper.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 692909c79d0..84a3e80cf73 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -261,7 +261,6 @@ function form_textarea($data = '', $value = '', $extra = '') unset($data['value']); // textareas don't use the value attribute } - $name = is_array($data) ? $data['name'] : $data; return '\n"; } } @@ -1005,4 +1004,4 @@ function &_get_validation_object() } /* End of file form_helper.php */ -/* Location: ./system/helpers/form_helper.php */ \ No newline at end of file +/* Location: ./system/helpers/form_helper.php */ From a5bcfb1d291d42521b0dc420b1b501c36710277d Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Sat, 23 Mar 2013 10:53:51 +0530 Subject: [PATCH 2203/5397] Removed $recurse parameter in lieu of auto parsing. Changed "provision" entry. --- system/core/Input.php | 32 ++++++++++++----------------- system/helpers/form_helper.php | 2 +- user_guide_src/source/changelog.rst | 2 +- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index ffe7b4d278a..7424a003a12 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -149,10 +149,9 @@ public function __construct() * @param array &$array $_GET, $_POST, $_COOKIE, $_SERVER, etc. * @param string $index Index for item to be fetched from $array * @param bool $xss_clean Whether to apply XSS filtering - * @param bool $recurse Whether to recurse into arrays via nested keys * @return mixed */ - protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE, $recurse = FALSE) + protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) { $value = NULL; @@ -160,9 +159,8 @@ protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE, $ { $value = $array[$index]; } - else if($recurse) + else if(preg_match('/\[[^]]*\]$/', $index)) // Does the index contain array notation { - // We couldn't find the $field as a simple key, so try the nested notation $key = $index; $container = $array; @@ -211,10 +209,9 @@ protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE, $ * * @param string $index Index for item to be fetched from $_GET * @param bool $xss_clean Whether to apply XSS filtering - * @param bool $recurse Whether to recurse into arrays via nested keys * @return mixed */ - public function get($index = NULL, $xss_clean = FALSE, $recurse = FALSE) + public function get($index = NULL, $xss_clean = FALSE) { // Check if a field has been provided if ($index === NULL) @@ -229,12 +226,12 @@ public function get($index = NULL, $xss_clean = FALSE, $recurse = FALSE) // loop through the full _GET array foreach (array_keys($_GET) as $key) { - $get[$key] = $this->_fetch_from_array($_GET, $key, $xss_clean, $recurse); + $get[$key] = $this->_fetch_from_array($_GET, $key, $xss_clean); } return $get; } - return $this->_fetch_from_array($_GET, $index, $xss_clean, $recurse); + return $this->_fetch_from_array($_GET, $index, $xss_clean); } // -------------------------------------------------------------------- @@ -244,10 +241,9 @@ public function get($index = NULL, $xss_clean = FALSE, $recurse = FALSE) * * @param string $index Index for item to be fetched from $_POST * @param bool $xss_clean Whether to apply XSS filtering - * @param bool $recurse Whether to recurse into arrays via nested keys * @return mixed */ - public function post($index = NULL, $xss_clean = FALSE, $recurse = FALSE) + public function post($index = NULL, $xss_clean = FALSE) { // Check if a field has been provided if ($index === NULL) @@ -262,12 +258,12 @@ public function post($index = NULL, $xss_clean = FALSE, $recurse = FALSE) // 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, $recurse); + $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean); } return $post; } - return $this->_fetch_from_array($_POST, $index, $xss_clean, $recurse); + return $this->_fetch_from_array($_POST, $index, $xss_clean); } // -------------------------------------------------------------------- @@ -277,14 +273,13 @@ public function post($index = NULL, $xss_clean = FALSE, $recurse = FALSE) * * @param string $index Index for item to be fetched from $_POST or $_GET * @param bool $xss_clean Whether to apply XSS filtering - * @param bool $recurse Whether to recurse into arrays via nested keys * @return mixed */ - public function get_post($index = '', $xss_clean = FALSE, $recurse = FALSE) + public function get_post($index = '', $xss_clean = FALSE) { return isset($_POST[$index]) - ? $this->post($index, $xss_clean, $recurse) - : $this->get($index, $xss_clean, $recurse); + ? $this->post($index, $xss_clean) + : $this->get($index, $xss_clean); } // -------------------------------------------------------------------- @@ -294,12 +289,11 @@ public function get_post($index = '', $xss_clean = FALSE, $recurse = FALSE) * * @param string $index Index for item to be fetched from $_COOKIE * @param bool $xss_clean Whether to apply XSS filtering - * @param bool $recurse Whether to recurse into arrays via nested keys * @return mixed */ - public function cookie($index = '', $xss_clean = FALSE, $recurse = FALSE) + public function cookie($index = '', $xss_clean = FALSE) { - return $this->_fetch_from_array($_COOKIE, $index, $xss_clean, $recurse); + return $this->_fetch_from_array($_COOKIE, $index, $xss_clean); } // -------------------------------------------------------------------- diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index d2c22b05c38..2238af92a86 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -647,7 +647,7 @@ function set_value($field = '', $default = '', $is_textarea = FALSE) return form_prep($OBJ->set_value($field, $default), $is_textarea); } - if (FALSE !== ($OBJ =& _get_input_object()) && ($value = $OBJ->post($field, FALSE, TRUE))) + if (FALSE !== ($OBJ =& _get_input_object()) && ($value = $OBJ->post($field, FALSE))) { return form_prep($value, $is_textarea); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index bc74973e0cc..6ef08c1a92f 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -304,7 +304,7 @@ Release Date: Not Released - Changed method ``valid_ip()`` to use PHP's native ``filter_var()`` function. - Changed internal method ``_sanitize_globals()`` to skip enforcing reversal of *register_globals* in PHP 5.4+, where this functionality no longer exists. - Changed methods ``get()``, ``post()``, ``get_post()``, ``cookie()``, ``server()``, ``user_agent()`` to return NULL instead of FALSE when no value is found. - - Added provision for using array notation for keys. + - Changed method ``_fetch_from_array()`` to parse array notation in field name. - :doc:`Common functions ` changes include: - Added function :php:func:`get_mimes()` to return the *application/config/mimes.php* array. - Added support for HTTP code 303 ("See Other") in :php:func:`set_status_header()`. From 9f27a3e0a86c7ffb1751a6815eaf475c28ca96ba Mon Sep 17 00:00:00 2001 From: Zachary Cardoza Date: Sat, 23 Mar 2013 21:59:20 -0700 Subject: [PATCH 2204/5397] Revert "Fixed error in Form Helper textarea function" This reverts commit e15d1be514dad1df7a3c38d6265566692ecf1260. --- system/helpers/form_helper.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 84a3e80cf73..692909c79d0 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -261,6 +261,7 @@ function form_textarea($data = '', $value = '', $extra = '') unset($data['value']); // textareas don't use the value attribute } + $name = is_array($data) ? $data['name'] : $data; return '\n"; } } @@ -1004,4 +1005,4 @@ function &_get_validation_object() } /* End of file form_helper.php */ -/* Location: ./system/helpers/form_helper.php */ +/* Location: ./system/helpers/form_helper.php */ \ No newline at end of file From d4d6e093cc706535398ea0a3800530d1b305f3a8 Mon Sep 17 00:00:00 2001 From: Zachary Cardoza Date: Sat, 23 Mar 2013 22:02:07 -0700 Subject: [PATCH 2205/5397] Fixed error in form_textarea helper function Reverted from GitHub edited version to remove document line end character. Good to merge now. --- system/helpers/form_helper.php | 1 - 1 file changed, 1 deletion(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 692909c79d0..fd9e7be7c26 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -261,7 +261,6 @@ function form_textarea($data = '', $value = '', $extra = '') unset($data['value']); // textareas don't use the value attribute } - $name = is_array($data) ? $data['name'] : $data; return '\n"; } } From 7b1a2f1f40d940dde34e47b36808a84e0353af56 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Mon, 25 Mar 2013 11:29:53 +0530 Subject: [PATCH 2206/5397] Changed "else if" to "elseif" --- system/core/Input.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Input.php b/system/core/Input.php index 7424a003a12..6ee132005da 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -159,7 +159,7 @@ protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) { $value = $array[$index]; } - else if(preg_match('/\[[^]]*\]$/', $index)) // Does the index contain array notation + elseif(preg_match('/\[[^]]*\]$/', $index)) // Does the index contain array notation { $key = $index; $container = $array; From 77236e055234cbbc9f6ca6be472c70077a1f5856 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Mon, 25 Mar 2013 23:42:36 +0530 Subject: [PATCH 2207/5397] Simplified notation parsing and other cosmetic fixes --- system/core/Input.php | 47 ++++++++++++---------------------- system/helpers/form_helper.php | 34 ++---------------------- 2 files changed, 18 insertions(+), 63 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index 6ee132005da..d707fe25cc7 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -153,53 +153,38 @@ public function __construct() */ protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) { - $value = NULL; - if (isset($array[$index])) { $value = $array[$index]; } - elseif(preg_match('/\[[^]]*\]$/', $index)) // Does the index contain array notation + elseif (($count = preg_match_all('/(?:^[^\[]+)|\[[^]]*\]/', $index, $matches)) > 1) // Does the index contain array notation { - $key = $index; $container = $array; - - // Test if the $index is an array name, and try to obtain the final index - if (preg_match_all('/\[(.*?)\]/', $index, $matches)) + for ($i = 0; $i < $count; $i++) { - sscanf($index, '%[^[][', $key); - for ($i = 0, $c = count($matches[0]); $i < $c; $i++) + $key = trim($matches[0][$i], '[]'); + if($key === '') // The array notation will return the value as array { - if($matches[1][$i] === '') // The array notation will return the value as array - { - break; - } - if (isset($container[$key])) - { - $container = $container[$key]; - $key = $matches[1][$i]; - } - else - { - $container = array(); - break; - } + break; } - - // Check if the deepest container has the field - if(isset($container[$key])) + if (isset($container[$key])) + { + $value = $container = $container[$key]; + } + else { - $value = $container[$key]; + return NULL; } } } - - if ($xss_clean === TRUE) + else { - return $this->security->xss_clean($value); + return NULL; } - return $value; + return ($xss_clean === TRUE) + ? $this->security->xss_clean($value) + : $value; } // -------------------------------------------------------------------- diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 2238af92a86..443a06a2d24 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -647,7 +647,8 @@ function set_value($field = '', $default = '', $is_textarea = FALSE) return form_prep($OBJ->set_value($field, $default), $is_textarea); } - if (FALSE !== ($OBJ =& _get_input_object()) && ($value = $OBJ->post($field, FALSE))) + $CI =& get_instance(); + if (NULL !== ($value = $CI->input->post($field, FALSE))) { return form_prep($value, $is_textarea); } @@ -1007,36 +1008,5 @@ function &_get_validation_object() } } -// ------------------------------------------------------------------------ - -if ( ! function_exists('_get_input_object')) -{ - /** - * Input Object - * - * Fetches the input object - * - * @return mixed - */ - function &_get_input_object() - { - $CI =& get_instance(); - - // We set this as a variable since we're returning by reference. - $return = FALSE; - - if ( ! isset($CI->input) OR ! is_object($CI->input)) - { - return $return; - } - else - { - $return = $CI->input; - } - - return $return; - } -} - /* End of file form_helper.php */ /* Location: ./system/helpers/form_helper.php */ \ No newline at end of file From 771308113f35d3167c6759f577aa536afd6264d1 Mon Sep 17 00:00:00 2001 From: Darren Benney Date: Tue, 26 Mar 2013 02:22:35 +0000 Subject: [PATCH 2208/5397] There are 21 preferences, not 17 --- user_guide_src/source/libraries/email.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/email.rst b/user_guide_src/source/libraries/email.rst index a55f1895dd5..39629ece166 100644 --- a/user_guide_src/source/libraries/email.rst +++ b/user_guide_src/source/libraries/email.rst @@ -43,7 +43,7 @@ This example assumes you are sending the email from one of your Setting Email Preferences ========================= -There are 17 different preferences available to tailor how your email +There are 21 different preferences available to tailor how your email messages are sent. You can either set them manually as described here, or automatically via preferences stored in your config file, described below: From 47ea5a8b99e17e9513be57d0af92f9e2637569b2 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Tue, 26 Mar 2013 18:57:28 +0530 Subject: [PATCH 2209/5397] Code fixes in line with suggestions --- system/core/Input.php | 11 ++++++----- system/helpers/form_helper.php | 15 +++++---------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index d707fe25cc7..1e21886ffe4 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -157,19 +157,20 @@ protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) { $value = $array[$index]; } - elseif (($count = preg_match_all('/(?:^[^\[]+)|\[[^]]*\]/', $index, $matches)) > 1) // Does the index contain array notation + elseif (($count = preg_match_all('/(?:^[^\[]+)|\[[^]]*\]/', $index, $matches)) > 1) // Does the index contain array notation { - $container = $array; + $value = $array; for ($i = 0; $i < $count; $i++) { $key = trim($matches[0][$i], '[]'); - if($key === '') // The array notation will return the value as array + if($key === '') // Empty notation will return the value as array { break; } - if (isset($container[$key])) + + if (isset($value[$key])) { - $value = $container = $container[$key]; + $value = $value[$key]; } else { diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 443a06a2d24..e2c0cc4c530 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -642,18 +642,13 @@ function form_prep($str = '', $is_textarea = FALSE) */ function set_value($field = '', $default = '', $is_textarea = FALSE) { - if (FALSE !== ($OBJ =& _get_validation_object()) && $OBJ->has_rule($field)) - { - return form_prep($OBJ->set_value($field, $default), $is_textarea); - } - $CI =& get_instance(); - if (NULL !== ($value = $CI->input->post($field, FALSE))) - { - return form_prep($value, $is_textarea); - } - return form_prep($default, $is_textarea); + $value = (isset($CI->form_validation) && is_object($CI->form_validation) && $CI->form_validation->has_rule($field)) + ? $CI->form_validation->set_value($field, $default) + : $CI->input->post($field, FALSE); + + return form_prep($value === NULL ? $default : $value, $is_textarea); } } From 408cbb4f3582ac64bb534a6539370992071d5950 Mon Sep 17 00:00:00 2001 From: nisheeth-barthwal Date: Tue, 26 Mar 2013 19:06:40 +0530 Subject: [PATCH 2210/5397] Code style fix --- system/core/Input.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Input.php b/system/core/Input.php index 1e21886ffe4..6690b7f2e76 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -163,7 +163,7 @@ protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) for ($i = 0; $i < $count; $i++) { $key = trim($matches[0][$i], '[]'); - if($key === '') // Empty notation will return the value as array + if ($key === '') // Empty notation will return the value as array { break; } From 3b0c08ac289cf14c86feadf1c836b8b87f61cdbf Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 29 Mar 2013 15:15:41 +0200 Subject: [PATCH 2211/5397] Fix #2353 --- system/database/DB_driver.php | 5 ++++- user_guide_src/source/changelog.rst | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 04490c82448..bbefbe566fa 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1706,7 +1706,10 @@ public function protect_identifiers($item, $prefix_single = FALSE, $protect_iden // If a parenthesis is found we know that we do not need to // escape the data or add a prefix. There's probably a more graceful // way to deal with this, but I'm not thinking of it -- Rick - if (strpos($item, '(') !== FALSE) + // + // Added exception for single quotes as well, we don't want to alter + // literal strings. -- Narf + if (strpos($item, '(') !== FALSE OR strpos($item, "'") !== FALSE) { return $item; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 6ef08c1a92f..21d0bde6361 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -482,7 +482,7 @@ Bug fixes for 3.0 - Fixed a bug (#113) - :doc:`Form Validation Library ` didn't properly handle empty fields that were specified as an array. - Fixed a bug (#2061) - :doc:`Routing Class ` didn't properly sanitize directory, controller and function triggers with **enable_query_strings** set to TRUE. - Fixed a bug - SQLSRV didn't support ``escape_like_str()`` or escaping an array of values. -- Fixed a bug - :doc:`DB result ` method ``list_fields()`` didn't reset its field pointer for the *mysql*, *mysqli* and *mssql* drivers. +- Fixed a bug - :doc:`Database Results ` method ``list_fields()`` didn't reset its field pointer for the *mysql*, *mysqli* and *mssql* drivers. - Fixed a bug (#73) - :doc:`Security Library ` method ``sanitize_filename()`` could be tricked by an XSS attack. - Fixed a bug (#2211) - :doc:`Migration Library ` extensions couldn't execute ``CI_Migration::__construct()``. - Fixed a bug (#2255) - :doc:`Email Library ` didn't apply ``smtp_timeout`` to socket reads and writes. @@ -490,6 +490,7 @@ Bug fixes for 3.0 - Fixed a bug (#2234) - :doc:`Query Builder ` didn't reset JOIN cache for write-type queries. - Fixed a bug (#2298) - :doc:`Database Results ` method `next_row()` kept returning the last row, allowing for infinite loops. - Fixed a bug (#2236) - :doc:`Form Helper ` function ``set_value()`` didn't parse array notation for keys if the rule was not present in the :doc:`Form Validation Library `. +- Fixed a bug (#2353) - :doc:`Query Builder ` erroneously prefixed literal strings with **dbprefix**. Version 2.1.3 ============= From 52301c76a9aa202927cade48e7528606d352db54 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Fri, 29 Mar 2013 14:23:34 +0100 Subject: [PATCH 2212/5397] Documentation: fix some outdated paths --- system/core/Common.php | 2 +- system/database/DB_driver.php | 2 +- user_guide_src/source/general/errors.rst | 4 ++-- user_guide_src/source/general/managing_apps.rst | 2 +- user_guide_src/source/general/routing.rst | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 10c22375ebf..efa7a9380e7 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -359,7 +359,7 @@ function is_https() * * This function lets us invoke the exception class and * display errors using the standard error template located - * in application/errors/errors.php + * in application/views/errors/error_general.php * This function will send the error page directly to the * browser and exit. * diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 04490c82448..6833172f671 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1609,7 +1609,7 @@ protected function _close() * @param string the error message * @param string any "swap" values * @param bool whether to localize the message - * @return string sends the application/error_db.php template + * @return string sends the application/views/errors/error_db.php template */ public function display_error($error = '', $swap = '', $native = FALSE) { diff --git a/user_guide_src/source/general/errors.rst b/user_guide_src/source/general/errors.rst index 441cedb8073..a247c1b9faa 100644 --- a/user_guide_src/source/general/errors.rst +++ b/user_guide_src/source/general/errors.rst @@ -42,7 +42,7 @@ show_error() This function will display the error message supplied to it using the following error template:: - application/errors/error_general.php + application/views/errors/error_general.php The optional parameter ``$status_code`` determines what HTTP status code should be sent with the error. If ``$status_code`` is less than 100, @@ -64,7 +64,7 @@ show_404() This function will display the 404 error message supplied to it using the following error template:: - application/errors/error_404.php + application/views/errors/error_404.php The function expects the string passed to it to be the file path to the page that isn't found. The exit status code will be set to ``EXIT_UNKNOWN_FILE``. diff --git a/user_guide_src/source/general/managing_apps.rst b/user_guide_src/source/general/managing_apps.rst index afb1aba2ec4..3ca0e03a731 100644 --- a/user_guide_src/source/general/managing_apps.rst +++ b/user_guide_src/source/general/managing_apps.rst @@ -21,7 +21,7 @@ Relocating your Application Directory ===================================== It is possible to move your application directory to a different -location on your server than your system directory. To do so open +location on your server than your web root. To do so open your main index.php and set a *full server path* in the ``$application_folder`` variable:: diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst index 0c6dfe8881f..123257fc8bd 100644 --- a/user_guide_src/source/general/routing.rst +++ b/user_guide_src/source/general/routing.rst @@ -163,7 +163,7 @@ This route indicates which controller class should be loaded if the requested controller is not found. It will override the default 404 error page. It won't affect to the ``show_404()`` function, which will continue loading the default *error_404.php* file at -*application/errors/error_404.php*. +*application/views/errors/error_404.php*. .. important:: The reserved routes must come before any wildcard or regular expression routes. \ No newline at end of file From 4052c73289803cabb7856620a88ca97bcc7d5ee0 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Fri, 29 Mar 2013 16:21:17 +0100 Subject: [PATCH 2213/5397] index.php: minor improvement in VIEWPATH definition code Fixes an oversight from 806ca600d3669343ee7ae90a9b5d65be9dfdbefe --- index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.php b/index.php index c6314da1fb3..cfb003eb87c 100755 --- a/index.php +++ b/index.php @@ -255,7 +255,7 @@ if (($_temp = realpath($view_folder)) !== FALSE) { - $view_folder = realpath($view_folder).'/'; + $view_folder = $_temp.'/'; } else { From 4ad3708eaed5dbf7754809edecd0d4b4ffb4339f Mon Sep 17 00:00:00 2001 From: vlakoff Date: Fri, 29 Mar 2013 18:14:22 +0100 Subject: [PATCH 2214/5397] User guide: fix list of allowed URI characters --- user_guide_src/source/general/security.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/general/security.rst b/user_guide_src/source/general/security.rst index 984ca840b21..3f93443bb6d 100644 --- a/user_guide_src/source/general/security.rst +++ b/user_guide_src/source/general/security.rst @@ -15,11 +15,12 @@ the following: - Alpha-numeric text (latin characters only) - Tilde: ~ +- Percent sign: % - Period: . - Colon: : - Underscore: \_ - Dash: - -- Pipe: | +- Space Register_globals ================= From 0612756dd37a3472259a19814e1a9bb403ab6e11 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Sat, 30 Mar 2013 00:06:39 +0100 Subject: [PATCH 2215/5397] Some cleanup related to mt_rand() - min and max values are 0 and mt_getrandmax() by default - remove useless mt_srand() seed calls --- system/core/Common.php | 2 +- system/core/Security.php | 3 +-- system/libraries/Encrypt.php | 2 +- system/libraries/Session/drivers/Session_cookie.php | 3 +-- system/libraries/Upload.php | 1 - 5 files changed, 4 insertions(+), 7 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index efa7a9380e7..b4f0c388ef4 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -92,7 +92,7 @@ function is_really_writable($file) */ if (is_dir($file)) { - $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100)); + $file = rtrim($file, '/').'/'.md5(mt_rand()); if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) { return FALSE; diff --git a/system/core/Security.php b/system/core/Security.php index 7aae54efc87..196d6114467 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -488,8 +488,7 @@ public function xss_hash() { if ($this->_xss_hash === '') { - mt_srand(); - $this->_xss_hash = md5(time() + mt_rand(0, 1999999999)); + $this->_xss_hash = md5(uniqid(mt_rand())); } return $this->_xss_hash; diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php index c6a1cb1750a..8ac5420dee0 100644 --- a/system/libraries/Encrypt.php +++ b/system/libraries/Encrypt.php @@ -244,7 +244,7 @@ protected function _xor_encode($string, $key) $rand = ''; do { - $rand .= mt_rand(0, mt_getrandmax()); + $rand .= mt_rand(); } while (strlen($rand) < 32); diff --git a/system/libraries/Session/drivers/Session_cookie.php b/system/libraries/Session/drivers/Session_cookie.php index 0e864410267..7174d63c853 100644 --- a/system/libraries/Session/drivers/Session_cookie.php +++ b/system/libraries/Session/drivers/Session_cookie.php @@ -641,7 +641,7 @@ protected function _make_sess_id() $new_sessid = ''; do { - $new_sessid .= mt_rand(0, mt_getrandmax()); + $new_sessid .= mt_rand(); } while (strlen($new_sessid) < 32); @@ -832,7 +832,6 @@ protected function _sess_gc() $probability = ini_get('session.gc_probability'); $divisor = ini_get('session.gc_divisor'); - srand(time()); if ((mt_rand(0, $divisor) / $divisor) < $probability) { $expire = $this->now - $this->sess_expiration; diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 1c14f99ed40..1fe49d8a69d 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -604,7 +604,6 @@ public function set_filename($path, $filename) { if ($this->encrypt_name === TRUE) { - mt_srand(); $filename = md5(uniqid(mt_rand())).$this->file_ext; } From 2e746812b59070c005b6eec26f202e92e9751a7a Mon Sep 17 00:00:00 2001 From: TheDragonSlayer Date: Sat, 30 Mar 2013 09:50:27 -0300 Subject: [PATCH 2216/5397] Update user_agents.php Added the PS Vita User Agent to the list. --- application/config/user_agents.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/application/config/user_agents.php b/application/config/user_agents.php index 35c36cb42b7..db75c81c628 100644 --- a/application/config/user_agents.php +++ b/application/config/user_agents.php @@ -149,6 +149,7 @@ 'mot-' => 'Motorola', 'playstation portable' => 'PlayStation Portable', 'playstation 3' => 'PlayStation 3', + 'playstation vita' => 'PlayStation Vita', 'hiptop' => 'Danger Hiptop', 'nec-' => 'NEC', 'panasonic' => 'Panasonic', @@ -218,4 +219,4 @@ ); /* End of file user_agents.php */ -/* Location: ./application/config/user_agents.php */ \ No newline at end of file +/* Location: ./application/config/user_agents.php */ From 14707e3a38aa0c8f0c20c1fff3a1008d34371ee7 Mon Sep 17 00:00:00 2001 From: Darren Benney Date: Sat, 30 Mar 2013 17:26:23 +0000 Subject: [PATCH 2217/5397] Added description to composer.json When executing "composer validate", an error is generated because there is no description. Also removed a couple of tabs and replaced them with spaces to neaten it up slightly. --- composer.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index e21aaed2edf..44c54b481ef 100644 --- a/composer.json +++ b/composer.json @@ -1,9 +1,10 @@ { + "description" : "Dependencies for CodeIgniter's testing environment", "name" : "ellislab/codeigniter", "require": { "php": ">=5.2.4" }, "require-dev": { - "mikey179/vfsStream": "*" - } -} \ No newline at end of file + "mikey179/vfsStream": "*" + } +} From e123a6046a4c8447a2221c9ed8279848d5cc672b Mon Sep 17 00:00:00 2001 From: Darren Benney Date: Sat, 30 Mar 2013 18:17:54 +0000 Subject: [PATCH 2218/5397] Modified do_upload() to use UPLOAD_ERR constants. Modified switchcase in the do_upload() use the UPLOAD_ERR_* constants, instead of just using an integer, and then commenting out the constant beside it. --- system/libraries/Upload.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 1c14f99ed40..0c6b7e6a590 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -366,25 +366,25 @@ public function do_upload($field = 'userfile') switch ($error) { - case 1: // UPLOAD_ERR_INI_SIZE + case UPLOAD_ERR_INI_SIZE: $this->set_error('upload_file_exceeds_limit'); break; - case 2: // UPLOAD_ERR_FORM_SIZE + case UPLOAD_ERR_FORM_SIZE: $this->set_error('upload_file_exceeds_form_limit'); break; - case 3: // UPLOAD_ERR_PARTIAL + case UPLOAD_ERR_PARTIAL: $this->set_error('upload_file_partial'); break; - case 4: // UPLOAD_ERR_NO_FILE + case UPLOAD_ERR_NO_FILE: $this->set_error('upload_no_file_selected'); break; - case 6: // UPLOAD_ERR_NO_TMP_DIR + case UPLOAD_ERR_NO_TMP_DIR: $this->set_error('upload_no_temp_directory'); break; - case 7: // UPLOAD_ERR_CANT_WRITE + case UPLOAD_ERR_CANT_WRITE: $this->set_error('upload_unable_to_write_file'); break; - case 8: // UPLOAD_ERR_EXTENSION + case UPLOAD_ERR_EXTENSION: $this->set_error('upload_stopped_by_extension'); break; default: From 4a8d1907d5fc5c054a24130cece8fe738ba46167 Mon Sep 17 00:00:00 2001 From: Darren Benney Date: Sat, 30 Mar 2013 20:07:49 +0000 Subject: [PATCH 2219/5397] Made set_error() method DRY. --- system/libraries/Upload.php | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 1c14f99ed40..4751a850f82 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1076,21 +1076,17 @@ public function set_error($msg) $CI =& get_instance(); $CI->lang->load('upload'); - if (is_array($msg)) + if ( ! is_array($msg)) { - foreach ($msg as $val) - { - $msg = ($CI->lang->line($val) === FALSE) ? $val : $CI->lang->line($val); - $this->error_msg[] = $msg; - log_message('error', $msg); - } - } - else - { - $msg = ($CI->lang->line($msg) === FALSE) ? $msg : $CI->lang->line($msg); - $this->error_msg[] = $msg; - log_message('error', $msg); - } + $msg = array($msg); + } + + foreach ($msg as $val) + { + $msg = ($CI->lang->line($val) === FALSE) ? $val : $CI->lang->line($val); + $this->error_msg[] = $msg; + log_message('error', $msg); + } } // -------------------------------------------------------------------- From 38d5f4b98a55012361fc30c4f3e0daa489ca8e21 Mon Sep 17 00:00:00 2001 From: Darren Benney Date: Sat, 30 Mar 2013 21:00:38 +0000 Subject: [PATCH 2220/5397] Reverted indenting spaces back to tabs. (My fault - Sorry!) --- system/libraries/Upload.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 4751a850f82..82b46f0941a 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1078,15 +1078,15 @@ public function set_error($msg) if ( ! is_array($msg)) { - $msg = array($msg); - } - - foreach ($msg as $val) - { - $msg = ($CI->lang->line($val) === FALSE) ? $val : $CI->lang->line($val); - $this->error_msg[] = $msg; - log_message('error', $msg); - } + $msg = array($msg); + } + + foreach ($msg as $val) + { + $msg = ($CI->lang->line($val) === FALSE) ? $val : $CI->lang->line($val); + $this->error_msg[] = $msg; + log_message('error', $msg); + } } // -------------------------------------------------------------------- From 714b11ac334bec39cf3f2aea5093e0f61c02f983 Mon Sep 17 00:00:00 2001 From: Darren Benney Date: Sat, 30 Mar 2013 21:04:11 +0000 Subject: [PATCH 2221/5397] Changed spaces to tabs for consistency. --- composer.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 44c54b481ef..ccc239400bb 100644 --- a/composer.json +++ b/composer.json @@ -1,10 +1,10 @@ { - "description" : "Dependencies for CodeIgniter's testing environment", - "name" : "ellislab/codeigniter", - "require": { - "php": ">=5.2.4" - }, - "require-dev": { - "mikey179/vfsStream": "*" - } + "description" : "Dependencies for CodeIgniter's testing environment", + "name" : "ellislab/codeigniter", + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "mikey179/vfsStream": "*" + } } From a8b29ac370a308002bae0850baefc16af642b78e Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 1 Apr 2013 01:14:39 +0700 Subject: [PATCH 2222/5397] fix typo : StdClass should be stdClass Signed-off-by: Abdul Malik Ikhsan --- tests/codeigniter/core/Loader_test.php | 2 +- tests/mocks/ci_testcase.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index dea01a55552..e75d0d564aa 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -220,7 +220,7 @@ public function test_model_subdir() // Test name conflict $obj = 'conflict'; - $this->ci_obj->$obj = new StdClass(); + $this->ci_obj->$obj = new stdClass(); $this->setExpectedException( 'RuntimeException', 'CI Error: The model name you are loading is the name of a resource that is already being used: '.$obj diff --git a/tests/mocks/ci_testcase.php b/tests/mocks/ci_testcase.php index f164929458a..ad4fe5ac3d7 100644 --- a/tests/mocks/ci_testcase.php +++ b/tests/mocks/ci_testcase.php @@ -27,7 +27,7 @@ class CI_TestCase extends PHPUnit_Framework_TestCase { public function __construct() { parent::__construct(); - $this->ci_instance = new StdClass(); + $this->ci_instance = new stdClass(); } // -------------------------------------------------------------------- From e514c764f599dcac5bb07ee0df761878a1066396 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 1 Apr 2013 10:36:44 +0300 Subject: [PATCH 2223/5397] [ci skip] Add changelog entries for PR #2303 --- user_guide_src/source/changelog.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 21d0bde6361..86907ca5381 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -221,6 +221,7 @@ Release Date: Not Released - *Product Name* strictness can be disabled by switching the ``$product_name_safe`` property to FALSE. - Added method ``remove()`` to remove a cart item, updating with quantity of 0 seemed like a hack but has remained to retain compatibility. - Added method ``get_item()`` to enable retrieving data for a single cart item. + - Added unicode support for product names. - :doc:`Image Manipulation library ` changes include: - The ``initialize()`` method now only sets existing class properties. - Added support for 3-length hex color values for *wm_font_color* and *wm_shadow_color* properties, as well as validation for them. @@ -491,6 +492,7 @@ Bug fixes for 3.0 - Fixed a bug (#2298) - :doc:`Database Results ` method `next_row()` kept returning the last row, allowing for infinite loops. - Fixed a bug (#2236) - :doc:`Form Helper ` function ``set_value()`` didn't parse array notation for keys if the rule was not present in the :doc:`Form Validation Library `. - Fixed a bug (#2353) - :doc:`Query Builder ` erroneously prefixed literal strings with **dbprefix**. +- Fixed a bug (#78) - :doc:`Cart Library ` didn't allow non-English letters in product names. Version 2.1.3 ============= From 492a3e332f4fb4da0beb28a12ec1ea234b875750 Mon Sep 17 00:00:00 2001 From: Darren Benney Date: Mon, 1 Apr 2013 10:22:39 +0100 Subject: [PATCH 2224/5397] Removed newline at EOF --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index ccc239400bb..29715763f2d 100644 --- a/composer.json +++ b/composer.json @@ -7,4 +7,4 @@ "require-dev": { "mikey179/vfsStream": "*" } -} +} \ No newline at end of file From 93f0b8f642abbafdb0b543f348ff1655adf919e6 Mon Sep 17 00:00:00 2001 From: Katsumi Honda Date: Wed, 3 Apr 2013 21:31:53 +0900 Subject: [PATCH 2225/5397] fixed for styleguide. || to OR remove the empty line at EOF --- system/database/DB_driver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 3e637844879..4f2f491eecf 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -816,7 +816,7 @@ public function trans_complete() } // The query() function will set this flag to FALSE in the event that a query failed - if ($this->_trans_status === FALSE || $this->_trans_failure === TRUE) + if ($this->_trans_status === FALSE or $this->_trans_failure === TRUE) { $this->trans_rollback(); @@ -1859,4 +1859,4 @@ protected function _reset_select() } /* End of file DB_driver.php */ -/* Location: ./system/database/DB_driver.php */ +/* Location: ./system/database/DB_driver.php */ \ No newline at end of file From fa99dc6e81cecfca434ba5b94d9f59647aa721c6 Mon Sep 17 00:00:00 2001 From: Katsumi Honda Date: Wed, 3 Apr 2013 22:47:34 +0900 Subject: [PATCH 2226/5397] Fixed for styleguide. --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 4f2f491eecf..b78f35a654b 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -816,7 +816,7 @@ public function trans_complete() } // The query() function will set this flag to FALSE in the event that a query failed - if ($this->_trans_status === FALSE or $this->_trans_failure === TRUE) + if ($this->_trans_status === FALSE OR $this->_trans_failure === TRUE) { $this->trans_rollback(); From 1bfc115e445045ebbf383960e57dd4f2a40c4172 Mon Sep 17 00:00:00 2001 From: Garth Kerr Date: Wed, 3 Apr 2013 13:02:21 -0400 Subject: [PATCH 2227/5397] Add common robot user agents. --- application/config/user_agents.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/application/config/user_agents.php b/application/config/user_agents.php index 35c36cb42b7..0aae987a28b 100644 --- a/application/config/user_agents.php +++ b/application/config/user_agents.php @@ -208,13 +208,15 @@ $robots = array( 'googlebot' => 'Googlebot', 'msnbot' => 'MSNBot', + 'baiduspider' => 'Baiduspider', 'bingbot' => 'Bing', 'slurp' => 'Inktomi Slurp', 'yahoo' => 'Yahoo', 'askjeeves' => 'AskJeeves', 'fastcrawler' => 'FastCrawler', 'infoseek' => 'InfoSeek Robot 1.0', - 'lycos' => 'Lycos' + 'lycos' => 'Lycos', + 'yandex' => 'YandexBot' ); /* End of file user_agents.php */ From 1ccaaaeb27d368e6bef5112aa00059eef1635c09 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 4 Apr 2013 13:59:50 +0300 Subject: [PATCH 2228/5397] Add a changelog entry for PR #2343 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 86907ca5381..95309b4cb21 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -493,6 +493,7 @@ Bug fixes for 3.0 - Fixed a bug (#2236) - :doc:`Form Helper ` function ``set_value()`` didn't parse array notation for keys if the rule was not present in the :doc:`Form Validation Library `. - Fixed a bug (#2353) - :doc:`Query Builder ` erroneously prefixed literal strings with **dbprefix**. - Fixed a bug (#78) - :doc:`Cart Library ` didn't allow non-English letters in product names. +- Fixed a bug (#77) - :doc:`Database Class ` didn't properly handle the transaction "test mode" flag. Version 2.1.3 ============= From 0e4237f8fb01320fb7cc87b1fb93a552630505d6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 4 Apr 2013 16:53:21 +0300 Subject: [PATCH 2229/5397] Fix #2380 and deprecate CI_Router::fetch_*() methods --- system/core/CodeIgniter.php | 8 ++++---- system/core/Router.php | 17 +++++++++------- system/libraries/Profiler.php | 2 +- user_guide_src/source/changelog.rst | 5 ++++- .../source/installation/upgrade_300.rst | 20 ++++++++++++++++++- 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 7f76977b582..3fe5c064892 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -241,12 +241,12 @@ function &get_instance() // 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')) + if ( ! file_exists(APPPATH.'controllers/'.$RTR->directory.$RTR->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'); + include(APPPATH.'controllers/'.$RTR->directory.$RTR->class.'.php'); // Set a mark point for benchmarking $BM->mark('loading_time:_base_classes_end'); @@ -260,8 +260,8 @@ function &get_instance() * 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(); + $class = $RTR->class; + $method = $RTR->method; if ( ! class_exists($class, FALSE) OR $method[0] === '_' OR method_exists('CI_Controller', $method)) { diff --git a/system/core/Router.php b/system/core/Router.php index bb0ce16bd97..c86ab9c2073 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -119,16 +119,16 @@ public function _set_routing() if (isset($_GET[$this->config->item('directory_trigger')]) && is_string($_GET[$this->config->item('directory_trigger')])) { $this->set_directory(trim($this->uri->_filter_uri($_GET[$this->config->item('directory_trigger')]))); - $segments[] = $this->fetch_directory(); + $segments[] = $this->directory; } $this->set_class(trim($this->uri->_filter_uri($_GET[$this->config->item('controller_trigger')]))); - $segments[] = $this->fetch_class(); + $segments[] = $this->class; if ( ! empty($_GET[$this->config->item('function_trigger')]) && is_string($_GET[$this->config->item('function_trigger')])) { $this->set_method(trim($this->uri->_filter_uri($_GET[$this->config->item('function_trigger')]))); - $segments[] = $this->fetch_method(); + $segments[] = $this->method; } } @@ -270,7 +270,7 @@ protected function _validate_request($segments) empty($segments[1]) OR $segments[1] = str_replace('-', '_', $segments[1]); // Does the requested controller exist in the sub-folder? - if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].'.php')) + if ( ! file_exists(APPPATH.'controllers/'.$this->directory.$segments[0].'.php')) { if ( ! empty($this->routes['404_override'])) { @@ -279,7 +279,7 @@ protected function _validate_request($segments) } else { - show_404($this->fetch_directory().$segments[0]); + show_404($this->directory.$segments[0]); } } } @@ -287,7 +287,7 @@ protected function _validate_request($segments) { // Is the method being specified in the route? $segments = explode('/', $this->default_controller); - if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].'.php')) + if ( ! file_exists(APPPATH.'controllers/'.$this->directory.$segments[0].'.php')) { $this->directory = ''; } @@ -413,6 +413,7 @@ public function set_class($class) /** * Fetch the current class * + * @deprecated 3.0.0 Read the 'class' property instead * @return string */ public function fetch_class() @@ -438,11 +439,12 @@ public function set_method($method) /** * Fetch the current method * + * @deprecated 3.0.0 Read the 'method' property instead * @return string */ public function fetch_method() { - return ($this->method === $this->fetch_class()) ? 'index' : $this->method; + return $this->method; } // -------------------------------------------------------------------- @@ -466,6 +468,7 @@ public function set_directory($dir) * Feches the sub-directory (if any) that contains the requested * controller class. * + * @deprecated 3.0.0 Read the 'directory' property instead * @return string */ public function fetch_directory() diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index 470688fdc6e..3c7ce54068e 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -405,7 +405,7 @@ protected function _compile_controller_info() .'
    ' ."\n" .'  '.$this->CI->lang->line('profiler_controller_info')."  \n" - .'
    '.$this->CI->router->fetch_class().'/'.$this->CI->router->fetch_method() + .'
    '.$this->CI->router->class.'/'.$this->CI->router->method .'
    '; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 95309b4cb21..65e21076158 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -330,6 +330,7 @@ Release Date: Not Released - :doc:`URI Routing ` changes include: - Added possibility to route requests using callbacks. - Added possibility to use dashes in the controller and method URI segments (translated to underscores). + - Deprecated methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` in favor of their respective public properties. - :doc:`Language Library ` changes include: - Changed method ``load()`` to filter the language name with ``ctype_digit()``. - Added an optional second parameter to method ``line()`` to disable error login for line keys that were not found. @@ -489,11 +490,13 @@ Bug fixes for 3.0 - Fixed a bug (#2255) - :doc:`Email Library ` didn't apply ``smtp_timeout`` to socket reads and writes. - Fixed a bug (#2239) - :doc:`Email Library ` improperly handled the Subject when used with ``bcc_batch_mode`` resulting in E_WARNING messages and an empty Subject. - Fixed a bug (#2234) - :doc:`Query Builder ` didn't reset JOIN cache for write-type queries. -- Fixed a bug (#2298) - :doc:`Database Results ` method `next_row()` kept returning the last row, allowing for infinite loops. +- Fixed a bug (#2298) - :doc:`Database Results ` method ``next_row()`` kept returning the last row, allowing for infinite loops. - Fixed a bug (#2236) - :doc:`Form Helper ` function ``set_value()`` didn't parse array notation for keys if the rule was not present in the :doc:`Form Validation Library `. - Fixed a bug (#2353) - :doc:`Query Builder ` erroneously prefixed literal strings with **dbprefix**. - Fixed a bug (#78) - :doc:`Cart Library ` didn't allow non-English letters in product names. - Fixed a bug (#77) - :doc:`Database Class ` didn't properly handle the transaction "test mode" flag. +- Fixed a bug (#2380) - :doc:`URI Routing ` method ``fetch_method()`` returned 'index' if the requested method name matches its controller name. + Version 2.1.3 ============= diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 02841ab6e92..926af312df8 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -383,4 +383,22 @@ You should now put AFTER clause field names in the field definition array instea sooner rather than later. .. note:: This is for MySQL and CUBRID databases only! Other drivers don't support this - clause and will silently ignore it. \ No newline at end of file + clause and will silently ignore it. + +URI Routing methods fetch_directory(), fetch_class(), fetch_method() +==================================================================== + +With properties ``CI_Router::$directory``, ``CI_Router::$class`` and ``CI_Router::$method`` +being public and their respective ``fetch_*()`` no longer doing anything else to just return +the properties - it doesn't make sense to keep them. + +Those are all internal, undocumented methods, but we've opted to deprecate them for now +in order to maintain backwards-compatibility just in case. If some of you have utilized them, +then you can now just access the properties instead:: + + $this->router->directory; + $this->router->class; + $this->router->method; + +.. note:: Those methods are still available, but you're strongly encouraged to remove their usage + sooner rather than later. \ No newline at end of file From ccdd4290aca2ddb3c64ca3db57e1da5c34537a6a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 5 Apr 2013 14:28:04 +0300 Subject: [PATCH 2230/5397] Fix #2387 --- system/core/Output.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/system/core/Output.php b/system/core/Output.php index 3320ae1547e..8f469005252 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -841,9 +841,8 @@ protected function _minify_script_style($output, $has_tags = FALSE) $output = substr_replace($output, '', 0, $pos); // Remove closing tag and save it for later - $end_pos = strlen($output); $pos = strpos($output, '= 0; $i--) + { + $output = substr_replace( + $output, + preg_replace('/\s*(:|;|,|}|{|\(|\))\s*/i', '$1', $chunks[$i][0]), + $chunks[$i][1], + strlen($chunks[$i][0]) + ); + } // Replace tabs with spaces // Replace carriage returns & multiple new lines with single new line From 8e038d50e8c94d610bfdedf01318462b7ddd8670 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 5 Apr 2013 19:31:04 +0300 Subject: [PATCH 2231/5397] [ci skip] Replace spaces with tabs --- system/core/Output.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/system/core/Output.php b/system/core/Output.php index 8f469005252..06d7a866b61 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -854,12 +854,12 @@ protected function _minify_script_style($output, $has_tags = FALSE) $chunks = preg_split('/([\'|"]).+(?![^\\\]\\1)\\1/iU', $output, -1, PREG_SPLIT_OFFSET_CAPTURE); for ($i = count($chunks) - 1; $i >= 0; $i--) { - $output = substr_replace( - $output, - preg_replace('/\s*(:|;|,|}|{|\(|\))\s*/i', '$1', $chunks[$i][0]), - $chunks[$i][1], - strlen($chunks[$i][0]) - ); + $output = substr_replace( + $output, + preg_replace('/\s*(:|;|,|}|{|\(|\))\s*/i', '$1', $chunks[$i][0]), + $chunks[$i][1], + strlen($chunks[$i][0]) + ); } // Replace tabs with spaces From 5eb1cbfa673bfa4b8a66ab8a56389a279c1f975b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 8 Apr 2013 01:20:31 +0300 Subject: [PATCH 2232/5397] Replace another fetch_directory() use --- system/core/URI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/URI.php b/system/core/URI.php index b2286f032fe..bc086d22367 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -720,7 +720,7 @@ public function ruri_string() { global $RTR; - if (($dir = $RTR->fetch_directory()) === '/') + if (($dir = $RTR->directory) === '/') { $dir = ''; } From 1aa336d53b686c07291bda4f8e9dd8ac23614fc3 Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 10 Apr 2013 12:30:12 +0100 Subject: [PATCH 2233/5397] Add options in create_captcha() to specify the randomly generated captcha word length and character pool Uses the same defaults as were hard coded in (8 chars in length, 0-9a-aA-Z). Small change in this file means less code elsewhere when generating random character strings for the captcha word. --- system/helpers/captcha_helper.php | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 78e255a1512..fe6c340bef2 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -51,7 +51,7 @@ */ 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); + $defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200, 'captcha_word_length' => 8, 'character_pool_for_generted_word' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); foreach ($defaults as $key => $val) { @@ -72,6 +72,17 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = return FALSE; } + + + // ----------------------------------- + // Make sure captcha max length is a valid/realistic value. + // ----------------------------------- + + $captcha_word_length = (int) $captcha_word_length; + if ($captcha_word_length < 4) { $captcha_word_length = 4;} + if ($captcha_word_length > 15) { $captcha_word_length = 15; } + + // ----------------------------------- // Remove old images // ----------------------------------- @@ -95,11 +106,10 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = if (empty($word)) { - $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $word = ''; - for ($i = 0, $mt_rand_max = strlen($pool) - 1; $i < 8; $i++) + for ($i = 0, $mt_rand_max = strlen($character_pool_for_generted_word) - 1; $i < $captcha_word_length; $i++) { - $word .= $pool[mt_rand(0, $mt_rand_max)]; + $word .= $character_pool_for_generted_word[mt_rand(0, $mt_rand_max)]; } } elseif ( ! is_string($word)) @@ -206,4 +216,5 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = } /* End of file captcha_helper.php */ -/* Location: ./system/helpers/captcha_helper.php */ \ No newline at end of file +/* Location: ./system/helpers/captcha_helper.php */ + From 79dfac7d2b8628d114b02493aa842acd39d39ede Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 10 Apr 2013 12:36:49 +0100 Subject: [PATCH 2234/5397] typo change Uses the same defaults as were hard coded in (8 chars in length, 0-9a-aA-Z). Small change in this file means less code elsewhere when generating random character strings for the captcha word. all existing code will work the same. --- system/helpers/captcha_helper.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index fe6c340bef2..731b59e1448 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -51,7 +51,7 @@ */ 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, 'captcha_word_length' => 8, 'character_pool_for_generted_word' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); + $defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200, 'captcha_word_length' => 8, 'character_pool_for_generated_word' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); foreach ($defaults as $key => $val) { @@ -107,9 +107,9 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = if (empty($word)) { $word = ''; - for ($i = 0, $mt_rand_max = strlen($character_pool_for_generted_word) - 1; $i < $captcha_word_length; $i++) + for ($i = 0, $mt_rand_max = strlen($character_pool_for_generated_word) - 1; $i < $captcha_word_length; $i++) { - $word .= $character_pool_for_generted_word[mt_rand(0, $mt_rand_max)]; + $word .= $character_pool_for_generated_word[mt_rand(0, $mt_rand_max)]; } } elseif ( ! is_string($word)) From 3fd9bf8777d6aea531a765f4bc0d995d24395221 Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 10 Apr 2013 12:40:31 +0100 Subject: [PATCH 2235/5397] Updated documenation --- user_guide_src/source/helpers/captcha_helper.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/helpers/captcha_helper.rst b/user_guide_src/source/helpers/captcha_helper.rst index 17462a8de71..598fdb4c6b6 100644 --- a/user_guide_src/source/helpers/captcha_helper.rst +++ b/user_guide_src/source/helpers/captcha_helper.rst @@ -62,7 +62,9 @@ Once loaded you can generate a captcha like this:: 'font_path' => './path/to/fonts/texb.ttf', 'img_width' => '150', 'img_height' => 30, - 'expiration' => 7200 + 'expiration' => 7200, + 'captcha_word_length' => 8, + 'character_pool_for_generated_word' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ); $cap = create_captcha($vals); @@ -140,4 +142,4 @@ this:: if ($row->count == 0) {      echo 'You must submit the word that appears in the image.'; - } \ No newline at end of file + } From 9c7e651922a78cefb1806becd0c5618fa23384c7 Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 10 Apr 2013 12:43:21 +0100 Subject: [PATCH 2236/5397] documenation edit --- user_guide_src/source/helpers/captcha_helper.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/helpers/captcha_helper.rst b/user_guide_src/source/helpers/captcha_helper.rst index 598fdb4c6b6..f924bd7170d 100644 --- a/user_guide_src/source/helpers/captcha_helper.rst +++ b/user_guide_src/source/helpers/captcha_helper.rst @@ -81,6 +81,7 @@ Once loaded you can generate a captcha like this:: - The **expiration** (in seconds) signifies how long an image will remain in the captcha folder before it will be deleted. The default is two hours. +- **captcha_word_length** defaults to 8 but a sanity check will enforce it to a minimum length of 4 or maximum length of 15, **character_pool_for_generated_word** defaults to '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' Adding a Database ----------------- From 4fa6385ff8232273f15f08fe8ef2799c9305419b Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 10 Apr 2013 12:44:57 +0100 Subject: [PATCH 2237/5397] Documentation change - explanation of captcha_word_length and character_pool_for_generated_word --- user_guide_src/source/helpers/captcha_helper.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/helpers/captcha_helper.rst b/user_guide_src/source/helpers/captcha_helper.rst index f924bd7170d..7dd642ae77f 100644 --- a/user_guide_src/source/helpers/captcha_helper.rst +++ b/user_guide_src/source/helpers/captcha_helper.rst @@ -81,7 +81,7 @@ Once loaded you can generate a captcha like this:: - The **expiration** (in seconds) signifies how long an image will remain in the captcha folder before it will be deleted. The default is two hours. -- **captcha_word_length** defaults to 8 but a sanity check will enforce it to a minimum length of 4 or maximum length of 15, **character_pool_for_generated_word** defaults to '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' +- **captcha_word_length** defaults to 8 but a sanity check in /system/helpers/captcha_helper.php will enforce it to a minimum length of 4 or maximum length of 15, **character_pool_for_generated_word** defaults to '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' Adding a Database ----------------- From 29ae72d893627edb07ad4fa124f4f8c4e1e0df34 Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 10 Apr 2013 13:59:42 +0100 Subject: [PATCH 2238/5397] removed sanity checks (developer-supplied value, not user input), added changelog entry, changed variable names --- system/helpers/captcha_helper.php | 18 +++--------------- user_guide_src/source/changelog.rst | 2 ++ .../source/helpers/captcha_helper.rst | 6 +++--- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 731b59e1448..61a478e9d8e 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -51,7 +51,7 @@ */ 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, 'captcha_word_length' => 8, 'character_pool_for_generated_word' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); + $defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200, 'word_length' => 8, 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); foreach ($defaults as $key => $val) { @@ -72,17 +72,6 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = return FALSE; } - - - // ----------------------------------- - // Make sure captcha max length is a valid/realistic value. - // ----------------------------------- - - $captcha_word_length = (int) $captcha_word_length; - if ($captcha_word_length < 4) { $captcha_word_length = 4;} - if ($captcha_word_length > 15) { $captcha_word_length = 15; } - - // ----------------------------------- // Remove old images // ----------------------------------- @@ -107,9 +96,9 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = if (empty($word)) { $word = ''; - for ($i = 0, $mt_rand_max = strlen($character_pool_for_generated_word) - 1; $i < $captcha_word_length; $i++) + for ($i = 0, $mt_rand_max = strlen($pool) - 1; $i < $word_length; $i++) { - $word .= $character_pool_for_generated_word[mt_rand(0, $mt_rand_max)]; + $word .= $pool[mt_rand(0, $mt_rand_max)]; } } elseif ( ! is_string($word)) @@ -217,4 +206,3 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = /* End of file captcha_helper.php */ /* Location: ./system/helpers/captcha_helper.php */ - diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 65e21076158..8ab3639810c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -105,6 +105,8 @@ Release Date: Not Released - :doc:`Directory Helper ` :php:func:`directory_map()` will now append ``DIRECTORY_SEPARATOR`` to directory names in the returned array. - :doc:`Language Helper ` :php:func:`lang()` now accepts an optional list of additional HTML attributes. - Deprecated the :doc:`Email Helper ` as its ``valid_email()``, ``send_email()`` functions are now only aliases for PHP native functions ``filter_var()`` and ``mail()`` respectively. + - :doc:`CAPTCHA Helper ` changes include: + - :php:func:`create_captcha` added word_length and pool options for setting length of randomly generated captcha word, and what characters to select from. - Database diff --git a/user_guide_src/source/helpers/captcha_helper.rst b/user_guide_src/source/helpers/captcha_helper.rst index 7dd642ae77f..c6fb002807e 100644 --- a/user_guide_src/source/helpers/captcha_helper.rst +++ b/user_guide_src/source/helpers/captcha_helper.rst @@ -63,8 +63,8 @@ Once loaded you can generate a captcha like this:: 'img_width' => '150', 'img_height' => 30, 'expiration' => 7200, - 'captcha_word_length' => 8, - 'character_pool_for_generated_word' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'word_length' => 8, + 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ); $cap = create_captcha($vals); @@ -81,7 +81,7 @@ Once loaded you can generate a captcha like this:: - The **expiration** (in seconds) signifies how long an image will remain in the captcha folder before it will be deleted. The default is two hours. -- **captcha_word_length** defaults to 8 but a sanity check in /system/helpers/captcha_helper.php will enforce it to a minimum length of 4 or maximum length of 15, **character_pool_for_generated_word** defaults to '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' +- **word_length** defaults to 8, **pool** defaults to '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' Adding a Database ----------------- From ba957133b0d02ceb3a7efe33e08a3b3d408f30d3 Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 10 Apr 2013 14:01:45 +0100 Subject: [PATCH 2239/5397] changed changelog format. --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8ab3639810c..30a22259d14 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -106,7 +106,7 @@ Release Date: Not Released - :doc:`Language Helper ` :php:func:`lang()` now accepts an optional list of additional HTML attributes. - Deprecated the :doc:`Email Helper ` as its ``valid_email()``, ``send_email()`` functions are now only aliases for PHP native functions ``filter_var()`` and ``mail()`` respectively. - :doc:`CAPTCHA Helper ` changes include: - - :php:func:`create_captcha` added word_length and pool options for setting length of randomly generated captcha word, and what characters to select from. + - :php:func:`create_captcha` added word_length and pool options for setting length of randomly generated captcha word, and what characters to select from. - Database From 68b285f2d28e2bc469f87cdaf2ee5592e2cdbb1b Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 10 Apr 2013 14:16:27 +0100 Subject: [PATCH 2240/5397] changelog change --- user_guide_src/source/changelog.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 30a22259d14..742dacbae6b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -105,8 +105,7 @@ Release Date: Not Released - :doc:`Directory Helper ` :php:func:`directory_map()` will now append ``DIRECTORY_SEPARATOR`` to directory names in the returned array. - :doc:`Language Helper ` :php:func:`lang()` now accepts an optional list of additional HTML attributes. - Deprecated the :doc:`Email Helper ` as its ``valid_email()``, ``send_email()`` functions are now only aliases for PHP native functions ``filter_var()`` and ``mail()`` respectively. - - :doc:`CAPTCHA Helper ` changes include: - - :php:func:`create_captcha` added word_length and pool options for setting length of randomly generated captcha word, and what characters to select from. + - :doc:`CAPTCHA Helper ` :php:func:`create_captcha` added word_length and pool options for setting length of randomly generated captcha word, and what characters to select from. - Database From a0c7ae665a181e0489ebb9a0366051669786cb44 Mon Sep 17 00:00:00 2001 From: ash Date: Sun, 14 Apr 2013 14:24:46 +0100 Subject: [PATCH 2241/5397] eol test. --- system/helpers/captcha_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 61a478e9d8e..d536246dcce 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -51,7 +51,7 @@ */ 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, 'word_length' => 8, 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); + $defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200, 'word_length' => 8, 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); foreach ($defaults as $key => $val) { From 19bafaf4eab644aac68d564d4eec36fa497aaa9f Mon Sep 17 00:00:00 2001 From: ash Date: Sun, 14 Apr 2013 14:29:43 +0100 Subject: [PATCH 2242/5397] eol 2 --- system/helpers/captcha_helper.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index d536246dcce..f2e155646bc 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -206,3 +206,4 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = /* End of file captcha_helper.php */ /* Location: ./system/helpers/captcha_helper.php */ + From 6e35774fecf392111840816cad08dd63e0463b23 Mon Sep 17 00:00:00 2001 From: ash Date: Sun, 14 Apr 2013 14:33:25 +0100 Subject: [PATCH 2243/5397] eol --- system/helpers/captcha_helper.php | 1 - 1 file changed, 1 deletion(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index f2e155646bc..d536246dcce 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -206,4 +206,3 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = /* End of file captcha_helper.php */ /* Location: ./system/helpers/captcha_helper.php */ - From c3dcf9f7e853e641ea710edfdd4454eabd591f30 Mon Sep 17 00:00:00 2001 From: ash Date: Sun, 14 Apr 2013 14:36:22 +0100 Subject: [PATCH 2244/5397] newline at end --- system/helpers/captcha_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index d536246dcce..1982f048942 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -205,4 +205,4 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = } /* End of file captcha_helper.php */ -/* Location: ./system/helpers/captcha_helper.php */ +/* Location: ./system/helpers/captcha_helper.php */ \ No newline at end of file From 3a66facb66d66aa8b1d564b0ad675240e629b041 Mon Sep 17 00:00:00 2001 From: ash Date: Sun, 14 Apr 2013 14:38:03 +0100 Subject: [PATCH 2245/5397] user guide newline. --- user_guide_src/source/helpers/captcha_helper.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/helpers/captcha_helper.rst b/user_guide_src/source/helpers/captcha_helper.rst index c6fb002807e..ca24e011fde 100644 --- a/user_guide_src/source/helpers/captcha_helper.rst +++ b/user_guide_src/source/helpers/captcha_helper.rst @@ -143,4 +143,4 @@ this:: if ($row->count == 0) {      echo 'You must submit the word that appears in the image.'; - } + } \ No newline at end of file From ffe1bd215fe64dc054296ed8aa1ac253bbf1962b Mon Sep 17 00:00:00 2001 From: ash Date: Sun, 14 Apr 2013 14:38:48 +0100 Subject: [PATCH 2246/5397] final change (extra space) --- system/helpers/captcha_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 1982f048942..f3b9c6cc41d 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -51,7 +51,7 @@ */ 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, 'word_length' => 8, 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); + $defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200, 'word_length' => 8, 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); foreach ($defaults as $key => $val) { From 1d3752c109547919f15b321beb2d5375fc2db150 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 14 Apr 2013 16:41:57 -0400 Subject: [PATCH 2247/5397] Fix for extending classes in a subdirectory (e.g. drivers) --- system/core/Loader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index d4e63231c22..8f76f9a6b82 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -955,7 +955,7 @@ protected function _ci_load_class($class, $params = NULL, $object_name = NULL) // Is this a class extension request? if (file_exists($subclass)) { - $baseclass = BASEPATH.'libraries/'.$class.'.php'; + $baseclass = BASEPATH.'libraries/'.$subdir.$class.'.php'; if ( ! file_exists($baseclass)) { From 826990fc88208103142385f1a448bb4771213155 Mon Sep 17 00:00:00 2001 From: CJ Date: Tue, 16 Apr 2013 14:17:53 +0800 Subject: [PATCH 2248/5397] apache_request_headers need not go through recapitalization of incoming headers and should be pass through as is. This is a follow up on #2107 (c82b57b) by @danhunsaker; --- system/core/Input.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index 6690b7f2e76..31bd7008b36 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -793,7 +793,7 @@ public function request_headers($xss_clean = FALSE) // In Apache, you can simply call apache_request_headers() if (function_exists('apache_request_headers')) { - $headers = apache_request_headers(); + $this->headers = apache_request_headers(); } else { @@ -806,15 +806,15 @@ public function request_headers($xss_clean = FALSE) $headers[$header] = $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(array('_', '-'), ' ', strtolower($key)); - $key = str_replace(' ', '-', ucwords($key)); + // 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; + $this->headers[$key] = $val; + } } return $this->headers; From 71cff1da396ba0c56644c04fdd2729db6766c557 Mon Sep 17 00:00:00 2001 From: CJ Date: Tue, 16 Apr 2013 21:50:55 +0800 Subject: [PATCH 2249/5397] #2409: Updated based on feedback by @narfbg; --- system/core/Input.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index 31bd7008b36..7a6b6e4e056 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -790,10 +790,16 @@ protected function _clean_input_keys($str) */ public function request_headers($xss_clean = FALSE) { + // If header is already defined, return it immediately + if ( ! empty($this->headers)) + { + return $this->headers; + } + // In Apache, you can simply call apache_request_headers() if (function_exists('apache_request_headers')) { - $this->headers = apache_request_headers(); + return $this->headers = apache_request_headers(); } else { @@ -810,7 +816,7 @@ public function request_headers($xss_clean = FALSE) // take SOME_HEADER and turn it into Some-Header foreach ($headers as $key => $val) { - $key = str_replace('_', ' ', strtolower($key)); + $key = str_replace(array('_', '-'), ' ', strtolower($key)); $key = str_replace(' ', '-', ucwords($key)); $this->headers[$key] = $val; From d08e18cafb31af586002e4de39f12cf8e048383b Mon Sep 17 00:00:00 2001 From: CJ Date: Wed, 17 Apr 2013 00:55:48 +0800 Subject: [PATCH 2250/5397] See #2409: Remove double replacing of dashes and instead change `Content-Type` to `CONTENT_TYPE` --- system/core/Input.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index 7a6b6e4e056..a0c5552f63a 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -803,7 +803,7 @@ public function request_headers($xss_clean = FALSE) } else { - $headers['Content-Type'] = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); + $headers['CONTENT_TYPE'] = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); foreach ($_SERVER as $key => $val) { @@ -816,7 +816,7 @@ public function request_headers($xss_clean = FALSE) // take SOME_HEADER and turn it into Some-Header foreach ($headers as $key => $val) { - $key = str_replace(array('_', '-'), ' ', strtolower($key)); + $key = str_replace('_', ' ', strtolower($key)); $key = str_replace(' ', '-', ucwords($key)); $this->headers[$key] = $val; From d195f224db31644eaaef4b4cb4713d9af5f57ead Mon Sep 17 00:00:00 2001 From: CJ Date: Wed, 17 Apr 2013 01:04:13 +0800 Subject: [PATCH 2251/5397] See #2409: Reformating and code cleanup for request_headers; --- system/core/Input.php | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index a0c5552f63a..6b7d5bd4368 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -801,25 +801,18 @@ public function request_headers($xss_clean = FALSE) { return $this->headers = apache_request_headers(); } - else - { - $headers['CONTENT_TYPE'] = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); - foreach ($_SERVER as $key => $val) - { - if (sscanf($key, 'HTTP_%s', $header) === 1) - { - $headers[$header] = $this->_fetch_from_array($_SERVER, $key, $xss_clean); - } - } + $this->headers['CONTENT_TYPE'] = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); - // take SOME_HEADER and turn it into Some-Header - foreach ($headers as $key => $val) + foreach ($_SERVER as $key => $val) + { + if (sscanf($key, 'HTTP_%s', $header) === 1) { - $key = str_replace('_', ' ', strtolower($key)); - $key = str_replace(' ', '-', ucwords($key)); + // take SOME_HEADER and turn it into Some-Header + $header = str_replace('_', ' ', strtolower($header)); + $header = str_replace(' ', '-', ucwords($header)); - $this->headers[$key] = $val; + $this->headers[$header] = $this->_fetch_from_array($_SERVER, $key, $xss_clean); } } From c5c522a069cc504509955890aacd55b97979043b Mon Sep 17 00:00:00 2001 From: CJ Date: Wed, 17 Apr 2013 11:59:22 +0800 Subject: [PATCH 2252/5397] #2409: Force Content Type to go through camelization; --- system/core/Input.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Input.php b/system/core/Input.php index 6b7d5bd4368..ff0bbe060bf 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -802,7 +802,7 @@ public function request_headers($xss_clean = FALSE) return $this->headers = apache_request_headers(); } - $this->headers['CONTENT_TYPE'] = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); + $_SERVER['HTTP_CONTENT_TYPE'] = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); foreach ($_SERVER as $key => $val) { From 05e6f1e41f8666e45571895c6219d2279db6b293 Mon Sep 17 00:00:00 2001 From: Dumk0 Date: Wed, 17 Apr 2013 12:58:34 +0300 Subject: [PATCH 2253/5397] fix typos in Parser.php --- system/libraries/Parser.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/libraries/Parser.php b/system/libraries/Parser.php index 1c26bd2b29d..7e843e71032 100644 --- a/system/libraries/Parser.php +++ b/system/libraries/Parser.php @@ -38,14 +38,14 @@ class CI_Parser { /** - * Left delimeter character for psuedo vars + * Left delimiter character for pseudo vars * * @var string */ public $l_delim = '{'; /** - * Right delimeter character for psuedo vars + * Right delimiter character for pseudo vars * * @var string */ @@ -228,4 +228,4 @@ protected function _match_pair($string, $variable) } /* End of file Parser.php */ -/* Location: ./system/libraries/Parser.php */ \ No newline at end of file +/* Location: ./system/libraries/Parser.php */ From 8347f9161a1ba080be62b22eb546cceea8f8a8e9 Mon Sep 17 00:00:00 2001 From: CJ Date: Wed, 17 Apr 2013 21:45:22 +0800 Subject: [PATCH 2254/5397] See #2409: Avoid overwriting global $_SERVER and set Content-Type to protected property; --- system/core/Input.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Input.php b/system/core/Input.php index ff0bbe060bf..0ef81128eb9 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -802,7 +802,7 @@ public function request_headers($xss_clean = FALSE) return $this->headers = apache_request_headers(); } - $_SERVER['HTTP_CONTENT_TYPE'] = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); + $this->headers['Content-Type'] = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); foreach ($_SERVER as $key => $val) { From 466e8083e7daed0926325b5646004f314489ef7f Mon Sep 17 00:00:00 2001 From: buhay Date: Wed, 17 Apr 2013 14:25:34 -0700 Subject: [PATCH 2255/5397] Correction for issue #2388. Updated _build_message() to return a boolean. This prevents email from sending if there is an error trying to attach an attachment to the email. --- system/libraries/Email.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index a745d331d59..886d7bd914c 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1236,7 +1236,7 @@ protected function _write_headers() /** * Build Final Body and attachments * - * @return void + * @return boolean */ protected function _build_message() { @@ -1401,7 +1401,7 @@ protected function _build_message() $body .= implode($this->newline, $attachment).$this->newline.'--'.$this->_atc_boundary.'--'; $this->_finalbody = ($this->_get_protocol() === 'mail') ? $body : $hdr.$body; - return; + return TRUE; } // -------------------------------------------------------------------- @@ -1606,7 +1606,10 @@ public function send($auto_clear = TRUE) return $result; } - $this->_build_message(); + if ($this->_build_message() === FALSE) + { + return FALSE; + } $result = $this->_spool_email(); if ($result && $auto_clear) @@ -1665,7 +1668,10 @@ public function batch_bcc_send() $this->_bcc_array = $bcc; } - $this->_build_message(); + if ($this->_build_message() === FALSE) + { + return FALSE; + } $this->_spool_email(); } } From c6da1ef1ffda3e281163b73015c4e95d50bae4b4 Mon Sep 17 00:00:00 2001 From: buhay Date: Thu, 18 Apr 2013 09:06:49 -0700 Subject: [PATCH 2256/5397] Change boolean to bool. Added whitespace. --- system/libraries/Email.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 886d7bd914c..10253c79604 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1236,7 +1236,7 @@ protected function _write_headers() /** * Build Final Body and attachments * - * @return boolean + * @return bool */ protected function _build_message() { @@ -1610,6 +1610,7 @@ public function send($auto_clear = TRUE) { return FALSE; } + $result = $this->_spool_email(); if ($result && $auto_clear) @@ -1672,6 +1673,7 @@ public function batch_bcc_send() { return FALSE; } + $this->_spool_email(); } } From 83c6efec0a2be84d6ca2c5264b22e4cc26934933 Mon Sep 17 00:00:00 2001 From: buhay Date: Thu, 18 Apr 2013 09:39:01 -0700 Subject: [PATCH 2257/5397] Added to the changelog. --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 742dacbae6b..ff7524b2a24 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -497,6 +497,7 @@ Bug fixes for 3.0 - Fixed a bug (#78) - :doc:`Cart Library ` didn't allow non-English letters in product names. - Fixed a bug (#77) - :doc:`Database Class ` didn't properly handle the transaction "test mode" flag. - Fixed a bug (#2380) - :doc:`URI Routing ` method ``fetch_method()`` returned 'index' if the requested method name matches its controller name. +- Fixed a bug (#2388) - :doc:`Email library ` Updated the method ``_build_message()`` to return a boolean value. Now it doesn't send an email if there is an error attaching a file to the email. Version 2.1.3 From 206d951e3da15bf9c69b3b8860c8bd274fb82b6f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 19 Apr 2013 04:25:53 +0300 Subject: [PATCH 2258/5397] Fix issue #2388 / PR #2413 changelog entry --- user_guide_src/source/changelog.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ff7524b2a24..38c6d05bded 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -497,8 +497,7 @@ Bug fixes for 3.0 - Fixed a bug (#78) - :doc:`Cart Library ` didn't allow non-English letters in product names. - Fixed a bug (#77) - :doc:`Database Class ` didn't properly handle the transaction "test mode" flag. - Fixed a bug (#2380) - :doc:`URI Routing ` method ``fetch_method()`` returned 'index' if the requested method name matches its controller name. -- Fixed a bug (#2388) - :doc:`Email library ` Updated the method ``_build_message()`` to return a boolean value. Now it doesn't send an email if there is an error attaching a file to the email. - +- Fixed a bug (#2388) - :doc:`Email Library ` used to ignore attachment errors, resulting in broken emails being sent. Version 2.1.3 ============= From d0c30ab416b0f6bc7fdc9ea70f6fd5e07ac13884 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Tue, 7 May 2013 07:49:23 +0200 Subject: [PATCH 2259/5397] Logging functions: level parameter is not optional This parameter cannot be optional, as the following parameter is mandatory. Also completed the corresponding documentation. --- system/core/Common.php | 8 ++++---- system/core/Log.php | 4 ++-- tests/mocks/core/common.php | 2 +- user_guide_src/source/general/common_functions.rst | 6 +++--- user_guide_src/source/general/errors.rst | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index b4f0c388ef4..cad340f332c 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -424,12 +424,12 @@ function show_404($page = '', $log_error = TRUE) * We use this as a simple mechanism to access the logging * class and send messages to be logged. * - * @param string - * @param string - * @param bool + * @param string the error level: 'error', 'debug' or 'info' + * @param string the error message + * @param bool whether the error is a native PHP error * @return void */ - function log_message($level = 'error', $message, $php_error = FALSE) + function log_message($level, $message, $php_error = FALSE) { static $_log, $_log_threshold; diff --git a/system/core/Log.php b/system/core/Log.php index a84d3dc2298..e4d72b5440b 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -138,12 +138,12 @@ public function __construct() * * Generally this function will be called using the global log_message() function * - * @param string the error level + * @param string the error level: 'error', 'debug' or 'info' * @param string the error message * @param bool whether the error is a native PHP error * @return bool */ - public function write_log($level = 'error', $msg, $php_error = FALSE) + public function write_log($level, $msg, $php_error = FALSE) { if ($this->_enabled === FALSE) { diff --git a/tests/mocks/core/common.php b/tests/mocks/core/common.php index 24d645ae317..0ccfe1ea4b9 100644 --- a/tests/mocks/core/common.php +++ b/tests/mocks/core/common.php @@ -178,7 +178,7 @@ function &is_loaded() if ( ! function_exists('log_message')) { - function log_message($level = 'error', $message, $php_error = FALSE) + function log_message($level, $message, $php_error = FALSE) { return TRUE; } diff --git a/user_guide_src/source/general/common_functions.rst b/user_guide_src/source/general/common_functions.rst index 79bd9b45961..a133fdc6df6 100644 --- a/user_guide_src/source/general/common_functions.rst +++ b/user_guide_src/source/general/common_functions.rst @@ -100,11 +100,11 @@ please see the :doc:`Error Handling ` documentation. log_message() ============= -.. php:function:: log_message($level = 'error', $message, $php_error = FALSE) +.. php:function:: log_message($level, $message, $php_error = FALSE) - :param string $level: Log level + :param string $level: Log level: 'error', 'debug' or 'info' :param string $message: Message to log - :param bool $php_error: Whether we're loggin a native PHP error message + :param bool $php_error: Whether we're logging a native PHP error message :returns: void This function is an alias for ``CI_Log::write_log()``. For more info, diff --git a/user_guide_src/source/general/errors.rst b/user_guide_src/source/general/errors.rst index a247c1b9faa..f12d992f846 100644 --- a/user_guide_src/source/general/errors.rst +++ b/user_guide_src/source/general/errors.rst @@ -77,11 +77,11 @@ optional second parameter to FALSE will skip logging. log_message() ============= -.. php:function:: log_message($level = 'error', $message, $php_error = FALSE) +.. php:function:: log_message($level, $message, $php_error = FALSE) - :param string $level: Log level + :param string $level: Log level: 'error', 'debug' or 'info' :param string $message: Message to log - :param bool $php_error: Whether we're loggin a native PHP error message + :param bool $php_error: Whether we're logging a native PHP error message :returns: void This function lets you write messages to your log files. You must supply From cdc6113987565975ed7ed83945e500bc00936d48 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Fri, 10 May 2013 16:47:47 +0200 Subject: [PATCH 2260/5397] Fix a docblock in Loader class --- system/core/Loader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index d4e63231c22..0a5cf5b84c6 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -713,7 +713,7 @@ public function add_package_path($path, $view_cascade = TRUE) * * Return a list of all package paths. * - * @param bool $include_base Whether to include BASEPATH (default: TRUE) + * @param bool $include_base Whether to include BASEPATH (default: FALSE) * @return array */ public function get_package_paths($include_base = FALSE) From fadb82230ba29b4c8a1e5f97092f7d775491f340 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Sun, 12 May 2013 10:57:09 +0200 Subject: [PATCH 2261/5397] Do not trigger a possible custom autoloader, as it is irrelevant here These were the last two calls of class_exists() without the $autoloader = FALSE argument. --- system/core/Loader.php | 2 +- system/database/DB_driver.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index d4e63231c22..6f90aec8b60 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -658,7 +658,7 @@ public function driver($library = '', $params = NULL, $object_name = NULL) return FALSE; } - if ( ! class_exists('CI_Driver_Library')) + if ( ! class_exists('CI_Driver_Library', FALSE)) { // We aren't instantiating an object here, just making the base class available require BASEPATH.'libraries/Driver.php'; diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 9239dc15470..593d78ba410 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -704,7 +704,7 @@ public function load_rdriver() { $driver = 'CI_DB_'.$this->dbdriver.'_result'; - if ( ! class_exists($driver)) + if ( ! class_exists($driver, FALSE)) { include_once(BASEPATH.'database/DB_result.php'); include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php'); From d3f9efe0999854262ef8788bebb62576d9b0ec43 Mon Sep 17 00:00:00 2001 From: Kevin Smith Date: Mon, 13 May 2013 16:34:37 -0500 Subject: [PATCH 2262/5397] Adds a few new lines to note directive to fix a build error in the docs. --- user_guide_src/source/general/controllers.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/general/controllers.rst b/user_guide_src/source/general/controllers.rst index 8cfb012a055..04f23276d0a 100644 --- a/user_guide_src/source/general/controllers.rst +++ b/user_guide_src/source/general/controllers.rst @@ -214,7 +214,9 @@ Here is an example:: echo $output; } -.. note:: Please note that your ``_output()`` method will receive the +.. note:: + + Please note that your ``_output()`` method will receive the data in its finalized state. Benchmark and memory usage data will be rendered, cache files written (if you have caching enabled), and headers will be sent (if you use that From e418e1e5b9b0f6726c953b6111b85adfe6043e9b Mon Sep 17 00:00:00 2001 From: Kevin Smith Date: Mon, 13 May 2013 17:33:25 -0500 Subject: [PATCH 2263/5397] Removes an obstacle to building the docs. --- user_guide_src/source/_themes/eldocs/layout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/_themes/eldocs/layout.html b/user_guide_src/source/_themes/eldocs/layout.html index 51d61b849d2..7f2fe1a3448 100644 --- a/user_guide_src/source/_themes/eldocs/layout.html +++ b/user_guide_src/source/_themes/eldocs/layout.html @@ -81,7 +81,7 @@ {%- block content %}
    - {{ toctree(collapse=true) }} + {{ toctree }}
    From 4ad89d8ec569b5589ca06ab61feaac203dbfe3da Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 18 May 2013 10:18:17 -0400 Subject: [PATCH 2264/5397] The date_range() function is a bit broken Neither $unix_time nor $start_date were defined here Signed-off-by: Rasmus Lerdorf --- system/helpers/date_helper.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 41a7ab63526..599e86a5741 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -677,7 +677,7 @@ function date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y $is_unix = ! ( ! $is_unix OR $is_unix === 'days'); // Validate input and try strtotime() on invalid timestamps/intervals, just in case - if ( ( ! ctype_digit((string) $unix_start) && ($unix_start = @strtotime($unix_time)) === FALSE) + if ( ( ! ctype_digit((string) $unix_start) && ($unix_start = @strtotime($unix_start)) === FALSE) OR ( ! ctype_digit((string) $mixed) && ($is_unix === FALSE OR ($mixed = @strtotime($mixed)) === FALSE)) OR ($is_unix === TRUE && $mixed < $unix_start)) { @@ -686,7 +686,7 @@ function date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y if ($is_unix && ($unix_start == $mixed OR date($format, $unix_start) === date($format, $mixed))) { - return array($start_date); + return array(date($format, $unix_start)); } $range = array(); @@ -780,4 +780,4 @@ function date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y } /* End of file date_helper.php */ -/* Location: ./system/helpers/date_helper.php */ \ No newline at end of file +/* Location: ./system/helpers/date_helper.php */ From 49bce11e2e959793fca2b31fa047f3e8d2533e46 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 18 May 2013 10:20:01 -0400 Subject: [PATCH 2265/5397] It looks like this should be $alter_type here Signed-off-by: Rasmus Lerdorf --- system/database/drivers/pdo/subdrivers/pdo_4d_forge.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php index a39045eb742..8d7db071bf5 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php @@ -103,7 +103,7 @@ protected function _alter_table($alter_type, $table, $field) { if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) { - return parent::_alter_table($alter_table, $table, $field); + return parent::_alter_table($alter_type, $table, $field); } // No method of modifying columns is supported @@ -206,4 +206,4 @@ protected function _attr_auto_increment(&$attributes, &$field) } /* End of file pdo_4d_forge.php */ -/* Location: ./system/database/drivers/pdo/subdrivers/pdo_4d_forge.php */ \ No newline at end of file +/* Location: ./system/database/drivers/pdo/subdrivers/pdo_4d_forge.php */ From 86417d040ace56e213acdb2a5338cd409606a272 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 18 May 2013 10:22:00 -0400 Subject: [PATCH 2266/5397] $element not $focus there and you can't have required params after an optional one Signed-off-by: Rasmus Lerdorf --- system/libraries/Javascript.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php index 773a5838418..6d2b99bbf39 100644 --- a/system/libraries/Javascript.php +++ b/system/libraries/Javascript.php @@ -172,7 +172,7 @@ public function error($element = 'this', $js = '') */ public function focus($element = 'this', $js = '') { - return $this->js->__add_event($focus, $js); + return $this->js->__add_event($element, $js); } // -------------------------------------------------------------------- @@ -187,7 +187,7 @@ public function focus($element = 'this', $js = '') * @param string - Javascript code for mouse out * @return string */ - public function hover($element = 'this', $over, $out) + public function hover($element = 'this', $over = '', $out = '') { return $this->js->__hover($element, $over, $out); } @@ -844,4 +844,4 @@ protected function _prep_args($result, $is_key = FALSE) } /* End of file Javascript.php */ -/* Location: ./system/libraries/Javascript.php */ \ No newline at end of file +/* Location: ./system/libraries/Javascript.php */ From e736f49f13bd07bf5bace06ca2453f260591489f Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 18 May 2013 10:25:03 -0400 Subject: [PATCH 2267/5397] Required arg in between optional ones Signed-off-by: Rasmus Lerdorf --- system/helpers/html_helper.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index 80a27876f0e..9990b4653f4 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -109,7 +109,7 @@ function ol($list, $attributes = '') * @param int * @return string */ - function _list($type = 'ul', $list, $attributes = '', $depth = 0) + function _list($type = 'ul', $list = array(), $attributes = '', $depth = 0) { // If an array wasn't submitted there's nothing to do... if ( ! is_array($list)) @@ -399,4 +399,4 @@ function nbs($num = 1) } /* End of file html_helper.php */ -/* Location: ./system/helpers/html_helper.php */ \ No newline at end of file +/* Location: ./system/helpers/html_helper.php */ From 0a6a88a271a30c9e600e89ea2182472f010bb0c6 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 18 May 2013 10:26:21 -0400 Subject: [PATCH 2268/5397] Required args after optional ones Signed-off-by: Rasmus Lerdorf --- system/libraries/Javascript/Jquery.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/libraries/Javascript/Jquery.php b/system/libraries/Javascript/Jquery.php index b6e0434b2f8..2b0cc08e684 100644 --- a/system/libraries/Javascript/Jquery.php +++ b/system/libraries/Javascript/Jquery.php @@ -225,7 +225,7 @@ protected function _focus($element = 'this', $js = '') * @param string - Javascript code for mouse out * @return string */ - protected function _hover($element = 'this', $over, $out) + protected function _hover($element = 'this', $over = '', $out = '') { $event = "\n\t$(".$this->_prep_element($element).").hover(\n\t\tfunction()\n\t\t{\n\t\t\t{$over}\n\t\t}, \n\t\tfunction()\n\t\t{\n\t\t\t{$out}\n\t\t});\n"; @@ -715,7 +715,7 @@ protected function _show($element = 'this', $speed = '', $callback = '') * @return string */ - protected function _updater($container = 'this', $controller, $options = '') + protected function _updater($container = 'this', $controller = '', $options = '') { $container = $this->_prep_element($container); $controller = (strpos('://', $controller) === FALSE) ? $controller : $this->CI->config->site_url($controller); @@ -1066,4 +1066,4 @@ protected function _validate_speed($speed) } /* End of file Jquery.php */ -/* Location: ./system/libraries/Jquery.php */ \ No newline at end of file +/* Location: ./system/libraries/Jquery.php */ From 998607025296044cd71b7ab9da7fe3551b1e3ac7 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 18 May 2013 10:27:12 -0400 Subject: [PATCH 2269/5397] values_parsing() only takes 1 arg Signed-off-by: Rasmus Lerdorf --- system/libraries/Xmlrpc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index 9e60791ae60..2675f724e64 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -446,7 +446,7 @@ public function values_parsing($value) { while (list($k) = each($value[0])) { - $value[0][$k] = $this->values_parsing($value[0][$k], TRUE); + $value[0][$k] = $this->values_parsing($value[0][$k]); } } @@ -1848,4 +1848,4 @@ public function iso8601_encode($time, $utc = FALSE) } // END XML_RPC_Values Class /* End of file Xmlrpc.php */ -/* Location: ./system/libraries/Xmlrpc.php */ \ No newline at end of file +/* Location: ./system/libraries/Xmlrpc.php */ From 164a1f28dd8f8093d260748e0d85fa714f232a57 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 18 May 2013 10:29:56 -0400 Subject: [PATCH 2270/5397] highlight_code() doesn't take an ENT_QUOTES arg Signed-off-by: Rasmus Lerdorf --- system/libraries/Profiler.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index 3c7ce54068e..7ce56931cb9 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -264,7 +264,7 @@ protected function _compile_queries() foreach ($db->queries as $key => $val) { $time = number_format($db->query_times[$key], 4); - $val = highlight_code($val, ENT_QUOTES); + $val = highlight_code($val); foreach ($highlight as $bold) { @@ -554,4 +554,4 @@ public function run() } /* End of file Profiler.php */ -/* Location: ./system/libraries/Profiler.php */ \ No newline at end of file +/* Location: ./system/libraries/Profiler.php */ From 08ddfb85c79579a8bf6285c1b5a20054166e2ac1 Mon Sep 17 00:00:00 2001 From: ThallisPHP Date: Mon, 20 May 2013 11:10:26 -0300 Subject: [PATCH 2271/5397] Removed unused variable $name in Cache_memcached.php --- system/libraries/Cache/drivers/Cache_memcached.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 246a7a264f2..4c35c55509e 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -196,7 +196,7 @@ protected function _setup_memcached() return FALSE; } - foreach ($this->_memcache_conf as $name => $cache_server) + foreach ($this->_memcache_conf as $cache_server) { if ( ! array_key_exists('hostname', $cache_server)) { @@ -260,4 +260,4 @@ public function is_supported() } /* End of file Cache_memcached.php */ -/* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */ \ No newline at end of file +/* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */ From 8c40c9cbbed7c25a6f544219127998924ec4c673 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Sat, 25 May 2013 04:09:44 +0200 Subject: [PATCH 2272/5397] Add a requirement in tests installation instructions PHPUnit requires Yaml package from pear.symfony.com channel. --- tests/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/README.md b/tests/README.md index a5f89a2b12c..3e32edc0ce3 100644 --- a/tests/README.md +++ b/tests/README.md @@ -17,6 +17,7 @@ format to facilitate clean api design. [see http://arrenbrecht.ch/testing/] PHP Unit >= 3.5.6 pear channel-discover pear.phpunit.de + pear channel-discover pear.symfony.com pear install phpunit/PHPUnit vfsStream From ef8ca68ea0f6c7a1ccde0dcb33308a6805a602ea Mon Sep 17 00:00:00 2001 From: vlakoff Date: Sat, 25 May 2013 19:17:48 +0200 Subject: [PATCH 2273/5397] Fix tests execution See #2442 --- tests/codeigniter/core/Loader_test.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index e75d0d564aa..04363c15ca6 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -147,6 +147,8 @@ public function test_load_library_in_application_dir() public function test_driver() { + $this->ci_vfs_clone('system/libraries/Driver.php'); + // Create driver in VFS $driver = 'unit_test_driver'; $dir = ucfirst($driver); From ef2be33c1e726f92d7e8a12669fe98733e32b086 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Sat, 25 May 2013 19:46:11 +0200 Subject: [PATCH 2274/5397] Try a different method, the previous one wasn't working in Travis --- tests/codeigniter/core/Loader_test.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index 04363c15ca6..ac2656e7502 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -147,7 +147,8 @@ public function test_load_library_in_application_dir() public function test_driver() { - $this->ci_vfs_clone('system/libraries/Driver.php'); + // Call the autoloader, to include system/libraries/Driver.php + class_exists('CI_Driver_Library', TRUE); // Create driver in VFS $driver = 'unit_test_driver'; From 3b0d1332e4397249f9fed654041b5af776132523 Mon Sep 17 00:00:00 2001 From: ckdarby Date: Thu, 6 Jun 2013 16:30:23 -0400 Subject: [PATCH 2275/5397] Add mimes pdf application/force-download --- application/config/mimes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index 6ff381279b9..32d10f6c151 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -49,7 +49,7 @@ 'sea' => 'application/octet-stream', 'dll' => 'application/octet-stream', 'oda' => 'application/oda', - 'pdf' => array('application/pdf', 'application/x-download', 'binary/octet-stream'), + 'pdf' => array('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream'), 'ai' => array('application/pdf', 'application/postscript'), 'eps' => 'application/postscript', 'ps' => 'application/postscript', From f55d51488da5b3628ead257189240907cc153184 Mon Sep 17 00:00:00 2001 From: florisluiten Date: Fri, 7 Jun 2013 17:20:06 +0300 Subject: [PATCH 2276/5397] Prevent email header injection When a header is set, newline characters are stripped so one cannot inject his/her own email header(s). Since set_header is only used to set one header at a time, it should have no effect on any code relying on this function --- system/libraries/Email.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 10253c79604..0774b4defc9 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -739,7 +739,7 @@ public function attach($filename, $disposition = '', $newname = NULL, $mime = '' */ public function set_header($header, $value) { - $this->_headers[$header] = $value; + $this->_headers[$header] = str_replace(array("\n", "\r"), '', $value); } // -------------------------------------------------------------------- @@ -2212,4 +2212,4 @@ protected function _mime_types($ext = '') } /* End of file Email.php */ -/* Location: ./system/libraries/Email.php */ \ No newline at end of file +/* Location: ./system/libraries/Email.php */ From c7325c120f872636131c93e56ad8bdad85311c16 Mon Sep 17 00:00:00 2001 From: Chris Ege Date: Tue, 11 Jun 2013 11:25:51 -0500 Subject: [PATCH 2277/5397] added newlines to end of email header when send_multipart === false --- system/libraries/Email.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 10253c79604..0c83a8ba942 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1275,7 +1275,7 @@ protected function _build_message() if ($this->send_multipart === FALSE) { $hdr .= 'Content-Type: text/html; charset='.$this->charset.$this->newline - .'Content-Transfer-Encoding: quoted-printable'; + .'Content-Transfer-Encoding: quoted-printable'.$this->newline.$this->newline; } else { From 1074bbf1851499e98912349c386701657c7f2cdd Mon Sep 17 00:00:00 2001 From: "Richard Deurwaarder (Xeli)" Date: Wed, 19 Jun 2013 10:57:27 +0200 Subject: [PATCH 2278/5397] Add support for https behind a reverse proxy using X-Forwarded-Proto --- system/core/Common.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index cad340f332c..7bf11dae544 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -345,9 +345,17 @@ function &get_mimes() * @return bool */ function is_https() - { - return (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on'); - } + { + if(isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on'){ + return True; + }elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'){ + return True; + }elseif (isset($_SERVER['HTTP_FRONT_END_HTTPS']) && $_SERVER['HTTP_FRONT_END_HTTPS'] == 'on'){ + return True; + }else{ + return False + } + } } // ------------------------------------------------------------------------ @@ -731,4 +739,4 @@ function function_usable($function_name) } /* End of file Common.php */ -/* Location: ./system/core/Common.php */ \ No newline at end of file +/* Location: ./system/core/Common.php */ From 983b3139d4d834caed06a2341f0cd0beaa09114a Mon Sep 17 00:00:00 2001 From: "Richard Deurwaarder (Xeli)" Date: Wed, 19 Jun 2013 13:49:08 +0200 Subject: [PATCH 2279/5397] Change True -> TRUE per codeigniter guidelines --- system/core/Common.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 7bf11dae544..467691cbf0f 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -347,13 +347,13 @@ function &get_mimes() function is_https() { if(isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on'){ - return True; + return TRUE; }elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'){ - return True; + return TRUE; }elseif (isset($_SERVER['HTTP_FRONT_END_HTTPS']) && $_SERVER['HTTP_FRONT_END_HTTPS'] == 'on'){ - return True; + return TRUE; }else{ - return False + return FALSE; } } } From d6b7cde7ed34f5d26dcb716dfce86cc6dbfba766 Mon Sep 17 00:00:00 2001 From: Michael Zimmer Date: Thu, 20 Jun 2013 11:54:07 +0200 Subject: [PATCH 2280/5397] fixed typo in guide/lib/xmlrpc.rst $size = $parameters[1]['shape']; replaced by: $shape = $parameters[1]['shape']; --- user_guide_src/source/libraries/xmlrpc.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/xmlrpc.rst b/user_guide_src/source/libraries/xmlrpc.rst index b478a2ded25..a43c488379b 100644 --- a/user_guide_src/source/libraries/xmlrpc.rst +++ b/user_guide_src/source/libraries/xmlrpc.rst @@ -423,7 +423,7 @@ the Server. $parameters = $request->output_parameters(); $name = $parameters[0]['name']; $size = $parameters[1]['size']; - $size = $parameters[1]['shape']; + $shape = $parameters[1]['shape']; ************************** XML-RPC Function Reference From 7cd4055f460f0c191e29d0e2952023d5f6400d30 Mon Sep 17 00:00:00 2001 From: "Richard Deurwaarder (Xeli)" Date: Mon, 24 Jun 2013 13:48:34 +0200 Subject: [PATCH 2281/5397] Use codeigniter coding style --- system/core/Common.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 467691cbf0f..db611e39a2a 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -346,13 +346,20 @@ function &get_mimes() */ function is_https() { - if(isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on'){ + if(isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on') + { return TRUE; - }elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'){ + } + elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') + { return TRUE; - }elseif (isset($_SERVER['HTTP_FRONT_END_HTTPS']) && $_SERVER['HTTP_FRONT_END_HTTPS'] == 'on'){ + } + elseif (isset($_SERVER['HTTP_FRONT_END_HTTPS']) && $_SERVER['HTTP_FRONT_END_HTTPS'] == 'on') + { return TRUE; - }else{ + } + else + { return FALSE; } } @@ -737,6 +744,5 @@ function function_usable($function_name) return FALSE; } } - /* End of file Common.php */ /* Location: ./system/core/Common.php */ From 668d0093a08a4be58f0bcfcf1414d94a924256b8 Mon Sep 17 00:00:00 2001 From: "Richard Deurwaarder (Xeli)" Date: Mon, 24 Jun 2013 13:50:52 +0200 Subject: [PATCH 2282/5397] remove newline in system/core/Common.php --- system/core/Common.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/core/Common.php b/system/core/Common.php index db611e39a2a..11ff4bae97f 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -744,5 +744,6 @@ function function_usable($function_name) return FALSE; } } + /* End of file Common.php */ /* Location: ./system/core/Common.php */ From 039cea8282eca2e480dddb37e906f6a4b800d1a3 Mon Sep 17 00:00:00 2001 From: "Richard Deurwaarder (Xeli)" Date: Mon, 24 Jun 2013 13:56:56 +0200 Subject: [PATCH 2283/5397] Added X-Forwarded-Proto support to changelog --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 38c6d05bded..2653b89a323 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -314,6 +314,7 @@ Release Date: Not Released - Changed ``_exception_handler()`` to respect php.ini *display_errors* setting. - Added function :php:func:`is_https()` to check if a secure connection is used. - Added function :php:func:`function_usable()` to check if a function exists and is not disabled by `Suhosin `. + - Added X-Forwarded-Proto support, used for loadbalancers / reverse proxy servers. - Added support for HTTP-Only cookies with new config option *cookie_httponly* (default FALSE). - Renamed method ``_call_hook()`` to ``call_hook()`` in the :doc:`Hooks Library `. - :doc:`Output Library ` changes include: From 7061bd014b6b7dbf89bf42e940aa134228f044ce Mon Sep 17 00:00:00 2001 From: "Richard Deurwaarder (Xeli)" Date: Mon, 24 Jun 2013 14:07:21 +0200 Subject: [PATCH 2284/5397] remove newline at eof in syste/core/Common --- system/core/Common.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Common.php b/system/core/Common.php index 11ff4bae97f..081b63cceca 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -746,4 +746,4 @@ function function_usable($function_name) } /* End of file Common.php */ -/* Location: ./system/core/Common.php */ +/* Location: ./system/core/Common.php */ \ No newline at end of file From 5d1cacfeadacb03dc8cb4dcb334a3e18db4fc5d7 Mon Sep 17 00:00:00 2001 From: Adrian Date: Mon, 24 Jun 2013 14:39:52 +0200 Subject: [PATCH 2285/5397] Force the file extension to lower case --- system/libraries/Upload.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 7c48b4294be..9c2b456596f 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -965,7 +965,7 @@ public function validate_upload_path() public function get_extension($filename) { $x = explode('.', $filename); - return (count($x) !== 1) ? '.'.end($x) : ''; + return (count($x) !== 1) ? '.'.strtolower(end($x)) : ''; } // -------------------------------------------------------------------- @@ -1284,4 +1284,4 @@ protected function _file_mime_type($file) } /* End of file Upload.php */ -/* Location: ./system/libraries/Upload.php */ \ No newline at end of file +/* Location: ./system/libraries/Upload.php */ From 4760aeff226175cc4267dd8fb8963a03031b78d2 Mon Sep 17 00:00:00 2001 From: "Richard Deurwaarder (Xeli)" Date: Mon, 24 Jun 2013 14:50:35 +0200 Subject: [PATCH 2286/5397] Revert "remove newline at eof in syste/core/Common" This reverts commit 7061bd014b6b7dbf89bf42e940aa134228f044ce. --- system/core/Common.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Common.php b/system/core/Common.php index 081b63cceca..11ff4bae97f 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -746,4 +746,4 @@ function function_usable($function_name) } /* End of file Common.php */ -/* Location: ./system/core/Common.php */ \ No newline at end of file +/* Location: ./system/core/Common.php */ From 23dc052fb2149725c15e0e51e64e34642b89defd Mon Sep 17 00:00:00 2001 From: "Richard Deurwaarder (Xeli)" Date: Mon, 24 Jun 2013 14:52:47 +0200 Subject: [PATCH 2287/5397] fix indentation according to codeigniter codestyle system/core/Common --- system/core/Common.php | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 11ff4bae97f..bd187dcda21 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -345,24 +345,24 @@ function &get_mimes() * @return bool */ function is_https() - { - if(isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on') - { - return TRUE; - } - elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') - { - return TRUE; - } - elseif (isset($_SERVER['HTTP_FRONT_END_HTTPS']) && $_SERVER['HTTP_FRONT_END_HTTPS'] == 'on') - { - return TRUE; - } - else - { - return FALSE; - } - } + { + if(isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on') + { + return TRUE; + } + elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') + { + return TRUE; + } + elseif (isset($_SERVER['HTTP_FRONT_END_HTTPS']) && $_SERVER['HTTP_FRONT_END_HTTPS'] == 'on') + { + return TRUE; + } + else + { + return FALSE; + } + } } // ------------------------------------------------------------------------ From 4055d577822130006e058f6505d022aac444f855 Mon Sep 17 00:00:00 2001 From: "Richard Deurwaarder (Xeli)" Date: Mon, 24 Jun 2013 14:59:20 +0200 Subject: [PATCH 2288/5397] remove newline again in system/core/Common.php, silly editor keeps adding it --- system/core/Common.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Common.php b/system/core/Common.php index bd187dcda21..851d4f34ec8 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -746,4 +746,4 @@ function function_usable($function_name) } /* End of file Common.php */ -/* Location: ./system/core/Common.php */ +/* Location: ./system/core/Common.php */ \ No newline at end of file From 7cc29451bb685d05b4faeb79762b1b291cb44b8b Mon Sep 17 00:00:00 2001 From: "Richard Deurwaarder (Xeli)" Date: Mon, 24 Jun 2013 15:06:19 +0200 Subject: [PATCH 2289/5397] remove else clause in is_https function, just add return FALSE as fallback --- system/core/Common.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 851d4f34ec8..f3a1b50556d 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -358,10 +358,7 @@ function is_https() { return TRUE; } - else - { - return FALSE; - } + return FALSE; } } From 98999976f6025d7ffcb04f8aa448518651fb0d89 Mon Sep 17 00:00:00 2001 From: "Richard Deurwaarder (Xeli)" Date: Mon, 24 Jun 2013 15:19:30 +0200 Subject: [PATCH 2290/5397] some more readablility tweaks in system/core/Common --- system/core/Common.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index f3a1b50556d..cb087cb227b 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -346,7 +346,7 @@ function &get_mimes() */ function is_https() { - if(isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on') + if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on') { return TRUE; } @@ -354,10 +354,11 @@ function is_https() { return TRUE; } - elseif (isset($_SERVER['HTTP_FRONT_END_HTTPS']) && $_SERVER['HTTP_FRONT_END_HTTPS'] == 'on') + elseif (isset($_SERVER['HTTP_FRONT_END_HTTPS']) && $_SERVER['HTTP_FRONT_END_HTTPS'] === 'on') { return TRUE; } + return FALSE; } } From 4a7310ec6e0c6b9e23bd4ff9450d8bfd04e567ea Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 24 Jun 2013 16:26:48 +0300 Subject: [PATCH 2291/5397] [ci skip] Remove an unnecessary/confusing changelog line --- user_guide_src/source/changelog.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2653b89a323..38c6d05bded 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -314,7 +314,6 @@ Release Date: Not Released - Changed ``_exception_handler()`` to respect php.ini *display_errors* setting. - Added function :php:func:`is_https()` to check if a secure connection is used. - Added function :php:func:`function_usable()` to check if a function exists and is not disabled by `Suhosin `. - - Added X-Forwarded-Proto support, used for loadbalancers / reverse proxy servers. - Added support for HTTP-Only cookies with new config option *cookie_httponly* (default FALSE). - Renamed method ``_call_hook()`` to ``call_hook()`` in the :doc:`Hooks Library `. - :doc:`Output Library ` changes include: From f496d13ee26c13b3406d30013206af679bf68922 Mon Sep 17 00:00:00 2001 From: Adrian Date: Mon, 24 Jun 2013 15:56:45 +0200 Subject: [PATCH 2292/5397] Add a config var to let the choice of having the lower case on the extensions when uploading. The default value is set to FALSE. --- system/libraries/Upload.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 9c2b456596f..14863d69a22 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -135,6 +135,13 @@ class CI_Upload { */ public $file_ext = ''; + /** + * Force filename extension to lowercase + * + * @var string + */ + public $file_ext_case = FALSE; + /** * Upload path * @@ -294,6 +301,7 @@ public function initialize($config = array()) 'file_type' => '', 'file_size' => NULL, 'file_ext' => '', + 'file_ext_case' => FALSE, 'upload_path' => '', 'overwrite' => FALSE, 'encrypt_name' => FALSE, @@ -965,7 +973,11 @@ public function validate_upload_path() public function get_extension($filename) { $x = explode('.', $filename); - return (count($x) !== 1) ? '.'.strtolower(end($x)) : ''; + + if($this->file_ext_case) + return (count($x) !== 1) ? '.'.strtolower(end($x)) : ''; + else + return (count($x) !== 1) ? '.'.end($x) : ''; } // -------------------------------------------------------------------- From 2d7009c56b99442591e25c86032865b05c6262c8 Mon Sep 17 00:00:00 2001 From: "Floris Luiten (lenwweb.nl)" Date: Mon, 24 Jun 2013 20:48:17 +0200 Subject: [PATCH 2293/5397] Removed empty line at EOF --- system/libraries/Email.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 0774b4defc9..1ee0035cb38 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -2212,4 +2212,4 @@ protected function _mime_types($ext = '') } /* End of file Email.php */ -/* Location: ./system/libraries/Email.php */ +/* Location: ./system/libraries/Email.php */ \ No newline at end of file From 8094452263bfa158316dccbfd5b03c8f2bfb564d Mon Sep 17 00:00:00 2001 From: "Floris Luiten (lenwweb.nl)" Date: Mon, 24 Jun 2013 20:48:47 +0200 Subject: [PATCH 2294/5397] Updated changelog to reflect latest changes --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 38c6d05bded..c0f1566ed35 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -264,6 +264,7 @@ Release Date: Not Released - Internal method ``_prep_q_encoding()`` now utilizes PHP's *mbstring* and *iconv* extensions (when available) and no longer has a second (``$from``) argument. - Added an optional parameter to ``print_debugger()`` to allow specifying which parts of the message should be printed ('headers', 'subject', 'body'). - Added SMTP keepalive option to avoid opening the connection for each ``Email::send()``. Accessible as ``$smtp_keepalive``. + - Public method ``set_header()`` now filters the input by removing all "\\r" and "\\n" characters. - :doc:`Pagination Library ` changes include: - Added support for the anchor "rel" attribute. - Added support for setting custom attributes. From 74a228b0b842e4aeb8cc9326c5d10c1fe4f4ce06 Mon Sep 17 00:00:00 2001 From: Adrian Date: Tue, 25 Jun 2013 12:09:22 +0200 Subject: [PATCH 2295/5397] New var name to make it more comprehensive Changes to follow the styleguide, proposed by narfbg (thanks to him) --- system/libraries/Upload.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 14863d69a22..5861df58421 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -140,7 +140,7 @@ class CI_Upload { * * @var string */ - public $file_ext_case = FALSE; + public $file_ext_tolower = FALSE; /** * Upload path @@ -301,7 +301,7 @@ public function initialize($config = array()) 'file_type' => '', 'file_size' => NULL, 'file_ext' => '', - 'file_ext_case' => FALSE, + 'file_ext_tolower' => FALSE, 'upload_path' => '', 'overwrite' => FALSE, 'encrypt_name' => FALSE, @@ -974,10 +974,13 @@ public function get_extension($filename) { $x = explode('.', $filename); - if($this->file_ext_case) - return (count($x) !== 1) ? '.'.strtolower(end($x)) : ''; - else - return (count($x) !== 1) ? '.'.end($x) : ''; + if (count($x) === 1) + { + return ''; + } + + $ext = ($this->file_ext_tolower) ? strtolower(end($x)) : end($x); + return '.'.$ext; } // -------------------------------------------------------------------- @@ -1296,4 +1299,4 @@ protected function _file_mime_type($file) } /* End of file Upload.php */ -/* Location: ./system/libraries/Upload.php */ +/* Location: ./system/libraries/Upload.php */ \ No newline at end of file From 7c72cfc8fa363cdacf4c19d3d2534e73a54cac66 Mon Sep 17 00:00:00 2001 From: Iacami Date: Thu, 27 Jun 2013 12:20:48 -0300 Subject: [PATCH 2296/5397] Update Profiler.php to show HTTP_DNT status show do not track header status --- system/libraries/Profiler.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index 3c7ce54068e..62830fe223a 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -447,7 +447,7 @@ protected function _compile_http_headers() .'  ('.$this->CI->lang->line('profiler_section_show').")\n\n\n" .'
    '."\n"; - foreach (array('HTTP_ACCEPT', 'HTTP_USER_AGENT', 'HTTP_CONNECTION', 'SERVER_PORT', 'SERVER_NAME', 'REMOTE_ADDR', 'SERVER_SOFTWARE', 'HTTP_ACCEPT_LANGUAGE', 'SCRIPT_NAME', 'REQUEST_METHOD',' HTTP_HOST', 'REMOTE_HOST', 'CONTENT_TYPE', 'SERVER_PROTOCOL', 'QUERY_STRING', 'HTTP_ACCEPT_ENCODING', 'HTTP_X_FORWARDED_FOR') as $header) + foreach (array('HTTP_ACCEPT', 'HTTP_USER_AGENT', 'HTTP_CONNECTION', 'SERVER_PORT', 'SERVER_NAME', 'REMOTE_ADDR', 'SERVER_SOFTWARE', 'HTTP_ACCEPT_LANGUAGE', 'SCRIPT_NAME', 'REQUEST_METHOD',' HTTP_HOST', 'REMOTE_HOST', 'CONTENT_TYPE', 'SERVER_PROTOCOL', 'QUERY_STRING', 'HTTP_ACCEPT_ENCODING', 'HTTP_X_FORWARDED_FOR', 'HTTP_DNT') as $header) { $val = isset($_SERVER[$header]) ? $_SERVER[$header] : ''; $output .= '{/cal_cell_end} {cal_cell_end_today}{/cal_cell_end_today} @@ -304,4 +304,4 @@ Class Reference :rtype: CI_Calendar Harvests the data within the template ``{pseudo-variables}`` used to - display the calendar. \ No newline at end of file + display the calendar. From 3645ab3fce68789b9b7884f4c22696013f6f51a2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 28 Sep 2015 12:58:35 +0300 Subject: [PATCH 3971/5397] Merge pull request #4125 from jim-parry/fix/lang_test Improve CI_Lang tests --- tests/codeigniter/core/Lang_test.php | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/tests/codeigniter/core/Lang_test.php b/tests/codeigniter/core/Lang_test.php index d2dd7598af5..4958f42e12c 100644 --- a/tests/codeigniter/core/Lang_test.php +++ b/tests/codeigniter/core/Lang_test.php @@ -34,11 +34,6 @@ public function test_load() $this->assertTrue($this->lang->load('email', 'german')); $this->assertEquals('german', $this->lang->is_loaded['email_lang.php']); - // Non-alpha idiom (should act the same as unspecified language) - $this->ci_vfs_clone('system/language/english/number_lang.php'); - $this->assertTrue($this->lang->load('number')); - $this->assertEquals('Bytes', $this->lang->language['bytes']); - // Non-existent file $this->setExpectedException( 'RuntimeException', @@ -49,6 +44,23 @@ public function test_load() // -------------------------------------------------------------------- + public function test_non_alpha_idiom() + { + // Non-alpha idiom (should act the same as unspecified language) + // test with existing file + $this->ci_vfs_clone('system/language/english/number_lang.php'); + $this->ci_vfs_clone('system/language/english/number_lang.php', 'system/language/123funny/'); + $this->assertTrue($this->lang->load('number', '123funny')); + $this->assertEquals('Bytes', $this->lang->language['bytes']); + + // test without existing file + $this->ci_vfs_clone('system/language/english/email_lang.php'); + $this->assertTrue($this->lang->load('email', '456funny')); + $this->assertEquals('You did not specify a SMTP hostname.', $this->lang->language['email_no_hostname']); + } + + // -------------------------------------------------------------------- + public function test_multiple_file_load() { // Multiple files From ee2ece8f59338087cef911073d16b2ee407a31bb Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 28 Sep 2015 13:18:05 +0300 Subject: [PATCH 3972/5397] [ci skip] Clarify docs about default_controller --- user_guide_src/source/general/controllers.rst | 22 +++++++++++-------- user_guide_src/source/general/routing.rst | 15 ++++++++----- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/user_guide_src/source/general/controllers.rst b/user_guide_src/source/general/controllers.rst index 7ab5a7f6a32..7efb9349e62 100644 --- a/user_guide_src/source/general/controllers.rst +++ b/user_guide_src/source/general/controllers.rst @@ -140,9 +140,12 @@ file and set this variable:: $route['default_controller'] = 'blog'; -Where Blog is the name of the controller class you want used. If you now +Where 'blog' is the name of the controller class you want used. If you now load your main index.php file without specifying any URI segments you'll -see your Hello World message by default. +see your "Hello World" message by default. + +For more information, please refer to the "Reserved Routes" section of the +:doc:`URI Routing ` documentation. Remapping Method Calls ====================== @@ -263,12 +266,12 @@ Trying to access it via the URL, like this, will not work:: Organizing Your Controllers into Sub-directories ================================================ -If you are building a large application you might find it convenient to -organize your controllers into sub-directories. CodeIgniter permits you -to do this. +If you are building a large application you might want to hierarchically +organize or structure your controllers into sub-directories. CodeIgniter +permits you to do this. -Simply create folders within your *application/controllers/* directory -and place your controller classes within them. +Simply create sub-directories under the main *application/controllers/* +one and place your controller classes within them. .. note:: When using this feature the first segment of your URI must specify the folder. For example, let's say you have a controller located @@ -281,8 +284,9 @@ and place your controller classes within them. example.com/index.php/products/shoes/show/123 Each of your sub-directories may contain a default controller which will be -called if the URL contains only the sub-folder. Simply name your default -controller as specified in your *application/config/routes.php* file. +called if the URL contains *only* the sub-directory. Simply put a controller +in there that matches the name of your 'default_controller' as specified in +your *application/config/routes.php* file. CodeIgniter also permits you to remap your URIs using its :doc:`URI Routing ` feature. diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst index 766e0b2abe9..dc5c0201e12 100644 --- a/user_guide_src/source/general/routing.rst +++ b/user_guide_src/source/general/routing.rst @@ -170,11 +170,16 @@ There are three reserved routes:: $route['default_controller'] = 'welcome'; -This route indicates which controller class should be loaded if the URI -contains no data, which will be the case when people load your root URL. -In the above example, the "welcome" class would be loaded. You are -encouraged to always have a default route otherwise a 404 page will -appear by default. +This route points to the action that should be executed if the URI contains +no data, which will be the case when people load your root URL. +The setting accepts a **controller/method** value and ``index()`` would be +the default method if you don't specify one. In the above example, it is +``Welcome::index()`` that would be called. + +.. note:: You can NOT use a directory as a part of this setting! + +You are encouraged to always have a default route as otherwise a 404 page +will appear by default. :: From 2845decb8a1867ae15eff941ae828c210fa64d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Sun, 27 Sep 2015 07:34:11 +0800 Subject: [PATCH 3973/5397] cal_cel_other forget to close a tag cal_cel_other --- user_guide_src/source/libraries/calendar.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/libraries/calendar.rst b/user_guide_src/source/libraries/calendar.rst index 52883d29757..ea0f4d108af 100644 --- a/user_guide_src/source/libraries/calendar.rst +++ b/user_guide_src/source/libraries/calendar.rst @@ -179,7 +179,7 @@ will be placed within a pair of pseudo-variables as shown here:: {cal_cell_blank} {/cal_cell_blank} - {cal_cell_other}{day}{cal_cel_other} + {cal_cell_other}{day}{/cal_cel_other} {cal_cell_end}{/cal_cell_end} {cal_cell_end_today}{/cal_cell_end_today} @@ -304,4 +304,4 @@ Class Reference :rtype: CI_Calendar Harvests the data within the template ``{pseudo-variables}`` used to - display the calendar. \ No newline at end of file + display the calendar. From 7f5c7533312d38ea922e6068cd097bf694fa3907 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 28 Sep 2015 17:05:52 +0300 Subject: [PATCH 3974/5397] [ci skip] Explain per-directory logic for 404_override too --- user_guide_src/source/general/routing.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst index dc5c0201e12..b2c9873ab7a 100644 --- a/user_guide_src/source/general/routing.rst +++ b/user_guide_src/source/general/routing.rst @@ -187,11 +187,13 @@ will appear by default. This route indicates which controller class should be loaded if the requested controller is not found. It will override the default 404 -error page. It won't affect to the ``show_404()`` function, which will +error page. Same per-directory rules as with 'default_controller' +apply here as well. + +It won't affect to the ``show_404()`` function, which will continue loading the default *error_404.php* file at *application/views/errors/error_404.php*. - :: $route['translate_uri_dashes'] = FALSE; From 0dbd848dbc69b74489f1fb4e360e8be785727c76 Mon Sep 17 00:00:00 2001 From: zoaked Date: Mon, 28 Sep 2015 11:38:16 -0400 Subject: [PATCH 3975/5397] Update changelog.rst --- user_guide_src/source/changelog.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index aa61a886e94..64120df8e29 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -22,7 +22,6 @@ Bug fixes for 3.0.2 - Fixed a bug (#2284) - :doc:`Database ` method ``protect_identifiers()`` breaks when :doc:`Query Builder ` isn't enabled. - Fixed a bug (#4052) - :doc:`Routing ` with anonymous functions didn't work for routes that don't use regular expressions. -- Fixed a bug (#4126) - :doc:`Form Validation Library ` was needlessly clearing ``$_config_rules`` when calling ``reset_validation()`` method. Version 3.0.1 ============= From e837851d3626617ff9f8311c45d26449167d5fa8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 29 Sep 2015 12:30:55 +0300 Subject: [PATCH 3976/5397] Merge pull request #4126 from zoaked/patch-1 Persist config file rules when using FV reset_validation() --- system/libraries/Form_validation.php | 1 - user_guide_src/source/libraries/form_validation.rst | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index af90316a4d3..a158225eea6 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1586,7 +1586,6 @@ public function encode_php_tags($str) public function reset_validation() { $this->_field_data = array(); - $this->_config_rules = array(); $this->_error_array = array(); $this->_error_messages = array(); $this->error_string = ''; diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 1fde68d734a..c288cc8c0a3 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -1140,4 +1140,4 @@ the following functions: - :php:func:`set_radio()` Note that these are procedural functions, so they **do not** require you -to prepend them with ``$this->form_validation``. \ No newline at end of file +to prepend them with ``$this->form_validation``. From f084acf240253f396d4a9787fed93a13d5771f46 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 29 Sep 2015 12:35:00 +0300 Subject: [PATCH 3977/5397] [ci skip] Add changelog message for PR #4126 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 9335fbfac19..bf912b29f34 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -34,6 +34,7 @@ Bug fixes for 3.0.2 - Fixed a bug (#4116) - :doc:`Pagination Library ` set the wrong page number on the "data-ci-pagination-page" attribute in generated links. - Fixed a bug where :doc:`Pagination Library` added the 'rel="start"' attribute to the first displayed link even if it's not actually linking the first page. - Fixed a bug (#4137) - :doc:`Error Handling ` breaks for the new ``Error`` exceptions under PHP 7. +- Fixed a bug (#4126) - :doc:`Form Validation Library ` method ``reset_validation()`` discarded validation rules from config files. Version 3.0.1 ============= From 84b5f24f2fa9932e6986cdb98731d1a0e7e76e1e Mon Sep 17 00:00:00 2001 From: Hongyi Zhang Date: Tue, 29 Sep 2015 17:42:29 -0700 Subject: [PATCH 3978/5397] refactor pulldown menu generation using sphinx toctree Signed-off-by: Hongyi Zhang --- .../_themes/sphinx_rtd_theme/breadcrumbs.html | 3 + .../_themes/sphinx_rtd_theme/layout.html | 2 + .../_themes/sphinx_rtd_theme/pulldown.html | 17 ++++ .../sphinx_rtd_theme/static/css/citheme.css | 70 ++++++++++++++- .../sphinx_rtd_theme/static/js/theme.js | 90 +++++-------------- 5 files changed, 113 insertions(+), 69 deletions(-) create mode 100644 user_guide_src/source/_themes/sphinx_rtd_theme/pulldown.html diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html b/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html index ff0938e5c82..55337accf53 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html @@ -14,6 +14,9 @@ View page source {% endif %} +
    + classic layout +

    diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/layout.html b/user_guide_src/source/_themes/sphinx_rtd_theme/layout.html index 1203b2f3440..20ede7d32ac 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/layout.html +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/layout.html @@ -77,6 +77,8 @@ + {% include "pulldown.html" %} +
    {# SIDE NAV, TOGGLES ON MOBILE #} diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/pulldown.html b/user_guide_src/source/_themes/sphinx_rtd_theme/pulldown.html new file mode 100644 index 00000000000..7877346d8d5 --- /dev/null +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/pulldown.html @@ -0,0 +1,17 @@ + + diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css index 10e7d04c6f2..0f83765b2dc 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css @@ -4,4 +4,72 @@ padding: 0px !important; font-weight: inherit !important; background-color: #f1d40f !important; -} \ No newline at end of file +} + +#nav { + background-color: #494949; + margin: 0; + padding: 0; + display:none; +} + +#nav2 { + background: url(data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAARgAA/+4ADkFkb2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJCQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAMgAzAwERAAIRAQMRAf/EAFkAAQADAQAAAAAAAAAAAAAAAAABBQcIAQEAAAAAAAAAAAAAAAAAAAAAEAABAgYDAAAAAAAAAAAAAAAAAVERAtMEFJRVBxgRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AMRAAAAAAAA7a87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wN/wJGAYEjAMCRgGBIwDAkYBgSMAwJGAsoIwCCMAgjAIIwCCMAgjAIIwEgAAAAAAAAAAAAAAAAAAAAAAAH//2Q==) repeat-x scroll left top transparent; + margin: 0; + padding: 0 310px 0 0; + text-align: right; + display:none; +} + +#nav_inner { + background-color: transparent; + font-family: Lucida Grande,Verdana,Geneva,sans-serif; + font-size: 11px; + margin: 0; + padding: 8px 12px 0 20px; +} + +div#pulldown-menu { + -moz-column-count: 5; + -moz-column-gap: 20px; + -webkit-column-count: 5; + -webkit-column-gap: 20px; + column-count: 5; + column-gap: 20px; + -webkit-column-rule: 1px groove #B8B8B8; + -moz-column-rule: 1px groove #B8B8B8; + column-rule: 1px groove #B8B8B8; +} + +#pulldown-menu > ul { + padding-top: 10px; + padding-bottom: 10px; + -webkit-column-break-inside: avoid; /*Chrome, Safari*/ + display: table; /*Firefox*/ + break-inside: avoid; /*IE 10+ theoretically*/ +} + +#pulldown-menu ul li.toctree-l2 { + font-size:0.82em; + margin-left: 20px; + list-style-image: url(data:image/gif;base64,R0lGODlhCwAJALMJAO7u7uTk5PLy8unp6fb29t7e3vj4+Li4uIWFheTk5AAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAkALAAAAAALAAkAAAQoMJ1JqTQ4Z3SI98jHCWSJkByArCyiHkMsIzEX3DeCc0Xv+4hEa5iIAAA7); +} + +#pulldown-menu ul li.toctree-l1 a { + color:#fff; + text-decoration: none; + font-size:12px; + font-family: "Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight: 700; +} + +#pulldown-menu ul li.toctree-l2 a { + text-decoration: none; + font-size:11px; + line-height:1.4em; + font-weight: 300; + font-family: Lucida Grande,Verdana,Geneva,sans-serif; + color: #aaa; +} + + diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js index 8aee6ca2987..267d87c6eb5 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js @@ -12,89 +12,43 @@ $(document).ready(function () { $(document).on('click', "[data-toggle='rst-current-version']", function () { $("[data-toggle='rst-versions']").toggleClass("shift-up"); }); - // Make tables responsive - $("table.docutils:not(.field-list)").wrap("
    "); + // // Make tables responsive + // $("table.docutils:not(.field-list)").wrap("
    "); // --- // START DOC MODIFICATION BY RUFNEX // v1.0 04.02.2015 // Add ToogleButton to get FullWidth-View by Johannes Gamperl codeigniter.de - // JLP - reformatted to make additions or corrections easier. Still hard-coded :(( - var ciNav = '\ -\ -
    \n\ -
    \n\ -

    Welcome to CodeIgniter

    \n\ -

    Installation Instructions

    \n\ -

    CodeIgniter Overview

    \n\ -

    Tutorial

    \n\ -

    Contributing to CodeIgniter

    \n\ -
    \n\ -

    General Topics

    \n\ -
    \n\ -

    Libraries

    \n\ -
    \n\ -

    Database Reference

    \n\ -
    \n\ -

    Helpers

    \n\ -
    \ -
    \ -'; - $('body').prepend(ciNav); - // - var a = ['Index', 'CodeIgniter User Guide¶', 'Change Log¶', 'Developer’s Certificate of Origin 1.1¶', 'The MIT License (MIT)¶']; - if ($.inArray($('h1').text(), a) > 0 || $('#search-results').length) - { - $('table.ciNav a').each(function () { - $(this).attr('href', $(this).attr("href").replace('../', '')); - }); - } - // $('#openToc').click(function () { $('#nav').slideToggle(); }); - $('.wy-breadcrumbs').append('
    toc
    '); $('#closeMe').toggle( - function () - { - setCookie('ciNav', true, 365); - $('#nav2').show(); - $('#topMenu').remove(); - $('body').css({background: 'none'}); - $('.wy-nav-content-wrap').css({background: 'none', 'margin-left': 0}); - $('.wy-breadcrumbs').append('
    ' + $('.wy-form').parent().html() + '
    '); - $('.wy-nav-side').toggle(); - }, - function () - { - setCookie('ciNav', false, 365); - $('#topMenu').remove(); - $('#nav').hide(); - $('#nav2').hide(); - $('body').css({background: '#edf0f2;'}); - $('.wy-nav-content-wrap').css({background: 'none repeat scroll 0 0 #fcfcfc;', 'margin-left': '300px'}); - $('.wy-nav-side').show(); - } + function () + { + setCookie('ciNav', true, 365); + $('#nav2').show(); + $('#topMenu').remove(); + $('body').css({background: 'none'}); + $('.wy-nav-content-wrap').css({background: 'none', 'margin-left': 0}); + $('.wy-breadcrumbs').append('
    ' + $('.wy-form').parent().html() + '
    '); + $('.wy-nav-side').toggle(); + }, + function () + { + setCookie('ciNav', false, 365); + $('#topMenu').remove(); + $('#nav').hide(); + $('#nav2').hide(); + $('body').css({background: '#edf0f2;'}); + $('.wy-nav-content-wrap').css({background: 'none repeat scroll 0 0 #fcfcfc;', 'margin-left': '300px'}); + $('.wy-nav-side').show(); + } ); if (getCookie('ciNav') == 'true') { $('#closeMe').trigger('click'); //$('#nav').slideToggle(); } - // END MODIFICATION --- }); // Rufnex Cookie functions From b881ba33067000117f50ede4a9b76aaef99a3605 Mon Sep 17 00:00:00 2001 From: Hongyi Zhang Date: Tue, 29 Sep 2015 17:46:48 -0700 Subject: [PATCH 3979/5397] add end modification message back Signed-off-by: Hongyi Zhang --- .../source/_themes/sphinx_rtd_theme/static/js/theme.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js index 267d87c6eb5..f7ea328bf99 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js @@ -49,6 +49,8 @@ $(document).ready(function () { $('#closeMe').trigger('click'); //$('#nav').slideToggle(); } + // END MODIFICATION --- + }); // Rufnex Cookie functions From ce5734911bcfe31e0a56d6e38f625d81ceb9c1b6 Mon Sep 17 00:00:00 2001 From: Hongyi Zhang Date: Thu, 1 Oct 2015 15:00:58 -0700 Subject: [PATCH 3980/5397] Fix indentations Signed-off-by: Hongyi Zhang --- .../_themes/sphinx_rtd_theme/breadcrumbs.html | 23 +++++++++---------- .../sphinx_rtd_theme/static/css/citheme.css | 14 +++++------ .../sphinx_rtd_theme/static/js/theme.js | 3 +-- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html b/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html index 55337accf53..74ca4dc00c6 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html @@ -2,21 +2,20 @@ -
    diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css index 0f83765b2dc..b2e1dd49463 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css @@ -31,11 +31,11 @@ div#pulldown-menu { -moz-column-count: 5; - -moz-column-gap: 20px; - -webkit-column-count: 5; - -webkit-column-gap: 20px; - column-count: 5; - column-gap: 20px; + -moz-column-gap: 20px; + -webkit-column-count: 5; + -webkit-column-gap: 20px; + column-count: 5; + column-gap: 20px; -webkit-column-rule: 1px groove #B8B8B8; -moz-column-rule: 1px groove #B8B8B8; column-rule: 1px groove #B8B8B8; @@ -45,8 +45,8 @@ div#pulldown-menu { padding-top: 10px; padding-bottom: 10px; -webkit-column-break-inside: avoid; /*Chrome, Safari*/ - display: table; /*Firefox*/ - break-inside: avoid; /*IE 10+ theoretically*/ + display: table; /*Firefox*/ + break-inside: avoid; /*IE 10+ theoretically*/ } #pulldown-menu ul li.toctree-l2 { diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js index f7ea328bf99..17ded53f19a 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js @@ -49,8 +49,7 @@ $(document).ready(function () { $('#closeMe').trigger('click'); //$('#nav').slideToggle(); } - // END MODIFICATION --- - + // END MODIFICATION --- }); // Rufnex Cookie functions From e8ea8ec857425575b7c3c7dfdce76c693d7f5b5c Mon Sep 17 00:00:00 2001 From: Hongyi Zhang Date: Thu, 1 Oct 2015 15:26:42 -0700 Subject: [PATCH 3981/5397] minor fixes: add back theme codes Signed-off-by: Hongyi Zhang --- .../source/_themes/sphinx_rtd_theme/breadcrumbs.html | 1 + .../source/_themes/sphinx_rtd_theme/static/js/theme.js | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html b/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html index 74ca4dc00c6..60343661a69 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html @@ -18,4 +18,5 @@ classic layout +
    diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js index 17ded53f19a..b77789d0605 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js @@ -12,8 +12,8 @@ $(document).ready(function () { $(document).on('click', "[data-toggle='rst-current-version']", function () { $("[data-toggle='rst-versions']").toggleClass("shift-up"); }); - // // Make tables responsive - // $("table.docutils:not(.field-list)").wrap("
    "); + // Make tables responsive + $("table.docutils:not(.field-list)").wrap("
    "); // --- // START DOC MODIFICATION BY RUFNEX // v1.0 04.02.2015 From 249580e711d42fe966e52d7bcc0f349ba99a94a3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Oct 2015 16:44:05 +0300 Subject: [PATCH 3982/5397] More XSS stuff --- system/core/Security.php | 2 +- tests/codeigniter/core/Security_test.php | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/system/core/Security.php b/system/core/Security.php index 0cae23a7969..27471d98e2d 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -808,7 +808,7 @@ protected function _sanitize_naughty_html($matches) .'([\s\042\047/=]*)' // non-attribute characters, excluding > (tag close) for obvious reasons .'(?[^\s\042\047>/=]+)' // attribute characters // optional attribute-value - .'(?:\s*=\s*\042[^\042]+\042|\s*=\s*\047[^\047]+\047|\s*=\s*[^\s\042\047=><`]*)?' // attribute-value separator + .'(?:\s*=(?:[^\s\042\047=><`]+|\s*\042[^\042]+\042|\s*\047[^\047]+\047|\s*(?U:[^\s\042\047=><`]*)))' // attribute-value separator .'#i'; if ($count = preg_match_all($pattern, $matches['attributes'], $attributes, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) diff --git a/tests/codeigniter/core/Security_test.php b/tests/codeigniter/core/Security_test.php index ca111c3bf72..b093393af86 100644 --- a/tests/codeigniter/core/Security_test.php +++ b/tests/codeigniter/core/Security_test.php @@ -162,7 +162,7 @@ public function test_xss_clean_sanitize_naughty_html_attributes() { $this->assertEquals('', $this->security->xss_clean('')); $this->assertEquals('', $this->security->xss_clean('')); - $this->assertEquals('', $this->security->xss_clean('')); + $this->assertEquals('', $this->security->xss_clean('')); $this->assertEquals('', $this->security->xss_clean('')); $this->assertEquals('onOutsideOfTag=test', $this->security->xss_clean('onOutsideOfTag=test')); $this->assertEquals('onNoTagAtAll = true', $this->security->xss_clean('onNoTagAtAll = true')); @@ -207,6 +207,11 @@ public function test_xss_clean_sanitize_naughty_html_attributes() '', $this->security->xss_clean('') ); + + $this->assertEquals( + '', + $this->security->xss_clean('') + ); } // -------------------------------------------------------------------- From 93e8513136b76fd848221fba275fa43b63b3dce7 Mon Sep 17 00:00:00 2001 From: Master Yoda Date: Fri, 2 Oct 2015 06:47:30 -0700 Subject: [PATCH 3983/5397] Rearrange the TOC slightly, to support consistency between the side menu and the sphonx toctree-derived pulldown menu. Signed-off-by:Master Yoda --- user_guide_src/source/index.rst | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/user_guide_src/source/index.rst b/user_guide_src/source/index.rst index 8d8aa943860..a13ec983e11 100644 --- a/user_guide_src/source/index.rst +++ b/user_guide_src/source/index.rst @@ -54,6 +54,16 @@ Tutorial tutorial/index +*************************** +Contributing to CodeIgniter +*************************** + +.. toctree:: + :glob: + :titlesonly: + + contributing/index + ************** General Topics ************** @@ -94,16 +104,6 @@ Helper Reference helpers/index -*************************** -Contributing to CodeIgniter -*************************** - -.. toctree:: - :glob: - :titlesonly: - - contributing/index - .. toctree:: :glob: :titlesonly: From b079ae972d1bd9f2f854e07ea43f4d700b2e487c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Oct 2015 16:50:04 +0300 Subject: [PATCH 3984/5397] Merge pull request #4148 from zhanghongyi/generate-pulldown [ci skip] Generate docs pulldown menu using sphinx toctree --- .../_themes/sphinx_rtd_theme/breadcrumbs.html | 23 ++--- .../_themes/sphinx_rtd_theme/layout.html | 2 + .../_themes/sphinx_rtd_theme/pulldown.html | 17 ++++ .../sphinx_rtd_theme/static/css/citheme.css | 70 ++++++++++++++- .../sphinx_rtd_theme/static/js/theme.js | 85 +++++-------------- 5 files changed, 121 insertions(+), 76 deletions(-) create mode 100644 user_guide_src/source/_themes/sphinx_rtd_theme/pulldown.html diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html b/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html index ff0938e5c82..60343661a69 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html @@ -2,18 +2,21 @@
    diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/layout.html b/user_guide_src/source/_themes/sphinx_rtd_theme/layout.html index 1203b2f3440..20ede7d32ac 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/layout.html +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/layout.html @@ -77,6 +77,8 @@ + {% include "pulldown.html" %} +
    {# SIDE NAV, TOGGLES ON MOBILE #} diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/pulldown.html b/user_guide_src/source/_themes/sphinx_rtd_theme/pulldown.html new file mode 100644 index 00000000000..7877346d8d5 --- /dev/null +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/pulldown.html @@ -0,0 +1,17 @@ + + diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css index 10e7d04c6f2..b2e1dd49463 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css @@ -4,4 +4,72 @@ padding: 0px !important; font-weight: inherit !important; background-color: #f1d40f !important; -} \ No newline at end of file +} + +#nav { + background-color: #494949; + margin: 0; + padding: 0; + display:none; +} + +#nav2 { + background: url(data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAARgAA/+4ADkFkb2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJCQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAMgAzAwERAAIRAQMRAf/EAFkAAQADAQAAAAAAAAAAAAAAAAABBQcIAQEAAAAAAAAAAAAAAAAAAAAAEAABAgYDAAAAAAAAAAAAAAAAAVERAtMEFJRVBxgRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AMRAAAAAAAA7a87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wN/wJGAYEjAMCRgGBIwDAkYBgSMAwJGAsoIwCCMAgjAIIwCCMAgjAIIwEgAAAAAAAAAAAAAAAAAAAAAAAH//2Q==) repeat-x scroll left top transparent; + margin: 0; + padding: 0 310px 0 0; + text-align: right; + display:none; +} + +#nav_inner { + background-color: transparent; + font-family: Lucida Grande,Verdana,Geneva,sans-serif; + font-size: 11px; + margin: 0; + padding: 8px 12px 0 20px; +} + +div#pulldown-menu { + -moz-column-count: 5; + -moz-column-gap: 20px; + -webkit-column-count: 5; + -webkit-column-gap: 20px; + column-count: 5; + column-gap: 20px; + -webkit-column-rule: 1px groove #B8B8B8; + -moz-column-rule: 1px groove #B8B8B8; + column-rule: 1px groove #B8B8B8; +} + +#pulldown-menu > ul { + padding-top: 10px; + padding-bottom: 10px; + -webkit-column-break-inside: avoid; /*Chrome, Safari*/ + display: table; /*Firefox*/ + break-inside: avoid; /*IE 10+ theoretically*/ +} + +#pulldown-menu ul li.toctree-l2 { + font-size:0.82em; + margin-left: 20px; + list-style-image: url(data:image/gif;base64,R0lGODlhCwAJALMJAO7u7uTk5PLy8unp6fb29t7e3vj4+Li4uIWFheTk5AAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAkALAAAAAALAAkAAAQoMJ1JqTQ4Z3SI98jHCWSJkByArCyiHkMsIzEX3DeCc0Xv+4hEa5iIAAA7); +} + +#pulldown-menu ul li.toctree-l1 a { + color:#fff; + text-decoration: none; + font-size:12px; + font-family: "Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight: 700; +} + +#pulldown-menu ul li.toctree-l2 a { + text-decoration: none; + font-size:11px; + line-height:1.4em; + font-weight: 300; + font-family: Lucida Grande,Verdana,Geneva,sans-serif; + color: #aaa; +} + + diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js index 8aee6ca2987..b77789d0605 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js @@ -18,76 +18,31 @@ $(document).ready(function () { // START DOC MODIFICATION BY RUFNEX // v1.0 04.02.2015 // Add ToogleButton to get FullWidth-View by Johannes Gamperl codeigniter.de - // JLP - reformatted to make additions or corrections easier. Still hard-coded :(( - var ciNav = '\ -\ -
    \ -'; - $('body').prepend(ciNav); - // - var a = ['Index', 'CodeIgniter User Guide¶', 'Change Log¶', 'Developer’s Certificate of Origin 1.1¶', 'The MIT License (MIT)¶']; - if ($.inArray($('h1').text(), a) > 0 || $('#search-results').length) - { - $('table.ciNav a').each(function () { - $(this).attr('href', $(this).attr("href").replace('../', '')); - }); - } - // $('#openToc').click(function () { $('#nav').slideToggle(); }); - $('.wy-breadcrumbs').append('
    toc
    '); $('#closeMe').toggle( - function () - { - setCookie('ciNav', true, 365); - $('#nav2').show(); - $('#topMenu').remove(); - $('body').css({background: 'none'}); - $('.wy-nav-content-wrap').css({background: 'none', 'margin-left': 0}); - $('.wy-breadcrumbs').append('
    ' + $('.wy-form').parent().html() + '
    '); - $('.wy-nav-side').toggle(); - }, - function () - { - setCookie('ciNav', false, 365); - $('#topMenu').remove(); - $('#nav').hide(); - $('#nav2').hide(); - $('body').css({background: '#edf0f2;'}); - $('.wy-nav-content-wrap').css({background: 'none repeat scroll 0 0 #fcfcfc;', 'margin-left': '300px'}); - $('.wy-nav-side').show(); - } + function () + { + setCookie('ciNav', true, 365); + $('#nav2').show(); + $('#topMenu').remove(); + $('body').css({background: 'none'}); + $('.wy-nav-content-wrap').css({background: 'none', 'margin-left': 0}); + $('.wy-breadcrumbs').append('
    ' + $('.wy-form').parent().html() + '
    '); + $('.wy-nav-side').toggle(); + }, + function () + { + setCookie('ciNav', false, 365); + $('#topMenu').remove(); + $('#nav').hide(); + $('#nav2').hide(); + $('body').css({background: '#edf0f2;'}); + $('.wy-nav-content-wrap').css({background: 'none repeat scroll 0 0 #fcfcfc;', 'margin-left': '300px'}); + $('.wy-nav-side').show(); + } ); if (getCookie('ciNav') == 'true') { From 13b6fa3a1e978edbbaf04ed8ba5c1f9c9ae4bc5d Mon Sep 17 00:00:00 2001 From: Master Yoda Date: Fri, 2 Oct 2015 06:47:30 -0700 Subject: [PATCH 3985/5397] Rearrange the TOC slightly, to support consistency between the side menu and the sphonx toctree-derived pulldown menu. Signed-off-by:Master Yoda --- user_guide_src/source/index.rst | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/user_guide_src/source/index.rst b/user_guide_src/source/index.rst index 8d8aa943860..a13ec983e11 100644 --- a/user_guide_src/source/index.rst +++ b/user_guide_src/source/index.rst @@ -54,6 +54,16 @@ Tutorial tutorial/index +*************************** +Contributing to CodeIgniter +*************************** + +.. toctree:: + :glob: + :titlesonly: + + contributing/index + ************** General Topics ************** @@ -94,16 +104,6 @@ Helper Reference helpers/index -*************************** -Contributing to CodeIgniter -*************************** - -.. toctree:: - :glob: - :titlesonly: - - contributing/index - .. toctree:: :glob: :titlesonly: From d4357dcc8ef213874d263dd9c55d39446bed2163 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Oct 2015 16:59:58 +0300 Subject: [PATCH 3986/5397] [ci skip] Some consistency in the docs' theme CSS --- .../sphinx_rtd_theme/static/css/citheme.css | 72 +++++++++---------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css index b2e1dd49463..192af2004d1 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css @@ -3,42 +3,42 @@ .highlighted { padding: 0px !important; font-weight: inherit !important; - background-color: #f1d40f !important; + background-color: #f1d40f !important; } -#nav { - background-color: #494949; - margin: 0; +#nav { + background-color: #494949; + margin: 0; padding: 0; - display:none; + display: none; } -#nav2 { - background: url(data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAARgAA/+4ADkFkb2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJCQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAMgAzAwERAAIRAQMRAf/EAFkAAQADAQAAAAAAAAAAAAAAAAABBQcIAQEAAAAAAAAAAAAAAAAAAAAAEAABAgYDAAAAAAAAAAAAAAAAAVERAtMEFJRVBxgRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AMRAAAAAAAA7a87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wN/wJGAYEjAMCRgGBIwDAkYBgSMAwJGAsoIwCCMAgjAIIwCCMAgjAIIwEgAAAAAAAAAAAAAAAAAAAAAAAH//2Q==) repeat-x scroll left top transparent; - margin: 0; - padding: 0 310px 0 0; +#nav2 { + background: url(data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAARgAA/+4ADkFkb2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJCQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAMgAzAwERAAIRAQMRAf/EAFkAAQADAQAAAAAAAAAAAAAAAAABBQcIAQEAAAAAAAAAAAAAAAAAAAAAEAABAgYDAAAAAAAAAAAAAAAAAVERAtMEFJRVBxgRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AMRAAAAAAAA7a87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wN/wJGAYEjAMCRgGBIwDAkYBgSMAwJGAsoIwCCMAgjAIIwCCMAgjAIIwEgAAAAAAAAAAAAAAAAAAAAAAAH//2Q==) repeat-x scroll left top transparent; + margin: 0; + padding: 0 310px 0 0; text-align: right; - display:none; + display: none; } -#nav_inner { - background-color: transparent; - font-family: Lucida Grande,Verdana,Geneva,sans-serif; - font-size: 11px; - margin: 0; +#nav_inner { + background-color: transparent; + font-family: Lucida Grande,Verdana,Geneva,sans-serif; + font-size: 11px; + margin: 0; padding: 8px 12px 0 20px; } -div#pulldown-menu { +div#pulldown-menu { -moz-column-count: 5; -moz-column-gap: 20px; -webkit-column-count: 5; -webkit-column-gap: 20px; column-count: 5; column-gap: 20px; - -webkit-column-rule: 1px groove #B8B8B8; - -moz-column-rule: 1px groove #B8B8B8; - column-rule: 1px groove #B8B8B8; + -webkit-column-rule: 1px groove #b8b8b8; + -moz-column-rule: 1px groove #b8b8b8; + column-rule: 1px groove #b8b8b8; } #pulldown-menu > ul { @@ -49,27 +49,25 @@ div#pulldown-menu { break-inside: avoid; /*IE 10+ theoretically*/ } -#pulldown-menu ul li.toctree-l2 { - font-size:0.82em; - margin-left: 20px; - list-style-image: url(data:image/gif;base64,R0lGODlhCwAJALMJAO7u7uTk5PLy8unp6fb29t7e3vj4+Li4uIWFheTk5AAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAkALAAAAAALAAkAAAQoMJ1JqTQ4Z3SI98jHCWSJkByArCyiHkMsIzEX3DeCc0Xv+4hEa5iIAAA7); +#pulldown-menu ul li.toctree-l2 { + font-size: 0.82em; + margin-left: 20px; + list-style-image: url(data:image/gif;base64,R0lGODlhCwAJALMJAO7u7uTk5PLy8unp6fb29t7e3vj4+Li4uIWFheTk5AAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAkALAAAAAALAAkAAAQoMJ1JqTQ4Z3SI98jHCWSJkByArCyiHkMsIzEX3DeCc0Xv+4hEa5iIAAA7); } -#pulldown-menu ul li.toctree-l1 a { - color:#fff; - text-decoration: none; - font-size:12px; +#pulldown-menu ul li.toctree-l1 a { + color: #ffffff; + text-decoration: none; + font-size: 12px; font-family: "Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; font-weight: 700; } -#pulldown-menu ul li.toctree-l2 a { - text-decoration: none; - font-size:11px; - line-height:1.4em; - font-weight: 300; - font-family: Lucida Grande,Verdana,Geneva,sans-serif; - color: #aaa; -} - - +#pulldown-menu ul li.toctree-l2 a { + text-decoration: none; + font-size: 11px; + line-height: 1.4em; + font-weight: 300; + font-family: Lucida Grande,Verdana,Geneva,sans-serif; + color: #aaaaaa; +} \ No newline at end of file From 8d4ac663909df3c95d546d3b0b405566f0df0d05 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 2 Oct 2015 16:59:58 +0300 Subject: [PATCH 3987/5397] [ci skip] Some consistency in the docs' theme CSS --- .../sphinx_rtd_theme/static/css/citheme.css | 72 +++++++++---------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css index b2e1dd49463..192af2004d1 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css @@ -3,42 +3,42 @@ .highlighted { padding: 0px !important; font-weight: inherit !important; - background-color: #f1d40f !important; + background-color: #f1d40f !important; } -#nav { - background-color: #494949; - margin: 0; +#nav { + background-color: #494949; + margin: 0; padding: 0; - display:none; + display: none; } -#nav2 { - background: url(data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAARgAA/+4ADkFkb2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJCQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAMgAzAwERAAIRAQMRAf/EAFkAAQADAQAAAAAAAAAAAAAAAAABBQcIAQEAAAAAAAAAAAAAAAAAAAAAEAABAgYDAAAAAAAAAAAAAAAAAVERAtMEFJRVBxgRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AMRAAAAAAAA7a87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wN/wJGAYEjAMCRgGBIwDAkYBgSMAwJGAsoIwCCMAgjAIIwCCMAgjAIIwEgAAAAAAAAAAAAAAAAAAAAAAAH//2Q==) repeat-x scroll left top transparent; - margin: 0; - padding: 0 310px 0 0; +#nav2 { + background: url(data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAARgAA/+4ADkFkb2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJCQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAMgAzAwERAAIRAQMRAf/EAFkAAQADAQAAAAAAAAAAAAAAAAABBQcIAQEAAAAAAAAAAAAAAAAAAAAAEAABAgYDAAAAAAAAAAAAAAAAAVERAtMEFJRVBxgRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AMRAAAAAAAA7a87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wHnbrLgV272uA87dZcCu3e1wN/wJGAYEjAMCRgGBIwDAkYBgSMAwJGAsoIwCCMAgjAIIwCCMAgjAIIwEgAAAAAAAAAAAAAAAAAAAAAAAH//2Q==) repeat-x scroll left top transparent; + margin: 0; + padding: 0 310px 0 0; text-align: right; - display:none; + display: none; } -#nav_inner { - background-color: transparent; - font-family: Lucida Grande,Verdana,Geneva,sans-serif; - font-size: 11px; - margin: 0; +#nav_inner { + background-color: transparent; + font-family: Lucida Grande,Verdana,Geneva,sans-serif; + font-size: 11px; + margin: 0; padding: 8px 12px 0 20px; } -div#pulldown-menu { +div#pulldown-menu { -moz-column-count: 5; -moz-column-gap: 20px; -webkit-column-count: 5; -webkit-column-gap: 20px; column-count: 5; column-gap: 20px; - -webkit-column-rule: 1px groove #B8B8B8; - -moz-column-rule: 1px groove #B8B8B8; - column-rule: 1px groove #B8B8B8; + -webkit-column-rule: 1px groove #b8b8b8; + -moz-column-rule: 1px groove #b8b8b8; + column-rule: 1px groove #b8b8b8; } #pulldown-menu > ul { @@ -49,27 +49,25 @@ div#pulldown-menu { break-inside: avoid; /*IE 10+ theoretically*/ } -#pulldown-menu ul li.toctree-l2 { - font-size:0.82em; - margin-left: 20px; - list-style-image: url(data:image/gif;base64,R0lGODlhCwAJALMJAO7u7uTk5PLy8unp6fb29t7e3vj4+Li4uIWFheTk5AAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAkALAAAAAALAAkAAAQoMJ1JqTQ4Z3SI98jHCWSJkByArCyiHkMsIzEX3DeCc0Xv+4hEa5iIAAA7); +#pulldown-menu ul li.toctree-l2 { + font-size: 0.82em; + margin-left: 20px; + list-style-image: url(data:image/gif;base64,R0lGODlhCwAJALMJAO7u7uTk5PLy8unp6fb29t7e3vj4+Li4uIWFheTk5AAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAkALAAAAAALAAkAAAQoMJ1JqTQ4Z3SI98jHCWSJkByArCyiHkMsIzEX3DeCc0Xv+4hEa5iIAAA7); } -#pulldown-menu ul li.toctree-l1 a { - color:#fff; - text-decoration: none; - font-size:12px; +#pulldown-menu ul li.toctree-l1 a { + color: #ffffff; + text-decoration: none; + font-size: 12px; font-family: "Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; font-weight: 700; } -#pulldown-menu ul li.toctree-l2 a { - text-decoration: none; - font-size:11px; - line-height:1.4em; - font-weight: 300; - font-family: Lucida Grande,Verdana,Geneva,sans-serif; - color: #aaa; -} - - +#pulldown-menu ul li.toctree-l2 a { + text-decoration: none; + font-size: 11px; + line-height: 1.4em; + font-weight: 300; + font-family: Lucida Grande,Verdana,Geneva,sans-serif; + color: #aaaaaa; +} \ No newline at end of file From 48844d16102d92fd146d562bc322b5624e44f9dd Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 5 Oct 2015 10:52:04 +0300 Subject: [PATCH 3988/5397] Close #4155 --- system/helpers/file_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php index cd1c641ec97..f6cb1629a6b 100644 --- a/system/helpers/file_helper.php +++ b/system/helpers/file_helper.php @@ -343,7 +343,7 @@ function get_mime_by_extension($filename) if ( ! is_array($mimes)) { - $mimes =& get_mimes(); + $mimes = get_mimes(); if (empty($mimes)) { From f0f47da9ae4227968ccc9ee6511bcab526498b4c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 5 Oct 2015 12:37:16 +0300 Subject: [PATCH 3989/5397] Some more intrusive XSS cleaning --- system/core/Security.php | 16 +++++++++++----- tests/codeigniter/core/Security_test.php | 9 +++++++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/system/core/Security.php b/system/core/Security.php index 27471d98e2d..ab85e2239c6 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -498,8 +498,8 @@ public function xss_clean($str, $is_image = FALSE) .'(?(?:[\s\042\047/=]*' // non-attribute characters, excluding > (tag close) for obvious reasons .'[^\s\042\047>/=]+' // attribute characters // optional attribute-value - .'(?:\s*=\s*' // attribute-value separator - .'(?:\042[^\042]*\042|\047[^\047]*\047|[^\s\042\047=><`]*)' // single, double or non-quoted value + .'(?:\s*=' // attribute-value separator + .'(?:[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*))' // single, double or non-quoted value .')?' // end optional attribute-value group .')*)' // end optional attributes group .'[^>]*)(?\>)?#isS'; @@ -808,7 +808,7 @@ protected function _sanitize_naughty_html($matches) .'([\s\042\047/=]*)' // non-attribute characters, excluding > (tag close) for obvious reasons .'(?[^\s\042\047>/=]+)' // attribute characters // optional attribute-value - .'(?:\s*=(?:[^\s\042\047=><`]+|\s*\042[^\042]+\042|\s*\047[^\047]+\047|\s*(?U:[^\s\042\047=><`]*)))' // attribute-value separator + .'(?:\s*=(?[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*)))' // attribute-value separator .'#i'; if ($count = preg_match_all($pattern, $matches['attributes'], $attributes, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) @@ -818,8 +818,14 @@ protected function _sanitize_naughty_html($matches) // so we don't damage the string. for ($i = $count - 1; $i > -1; $i--) { - // Is it indeed an "evil" attribute? - if (preg_match('#^('.implode('|', $evil_attributes).')$#i', $attributes[$i]['name'][0])) + if ( + // Is it indeed an "evil" attribute? + preg_match('#^('.implode('|', $evil_attributes).')$#i', $attributes[$i]['name'][0]) + // Or an attribute not starting with a letter? Some parsers get confused by that + OR ! ctype_alpha($attributes[$i]['name'][0][0]) + // Does it have an equals sign, but no value and not quoted? Strip that too! + OR (trim($attributes[$i]['value'][0]) === '') + ) { $matches['attributes'] = substr_replace( $matches['attributes'], diff --git a/tests/codeigniter/core/Security_test.php b/tests/codeigniter/core/Security_test.php index b093393af86..52967dc2f40 100644 --- a/tests/codeigniter/core/Security_test.php +++ b/tests/codeigniter/core/Security_test.php @@ -146,7 +146,7 @@ public function test_xss_clean_sanitize_naughty_html_tags() $this->assertEquals('', $this->security->xss_clean('')); $this->assertEquals( - ' src="x">', + ' src="x">', $this->security->xss_clean(' src="x">') ); @@ -209,9 +209,14 @@ public function test_xss_clean_sanitize_naughty_html_attributes() ); $this->assertEquals( - '', + '', $this->security->xss_clean('') ); + + $this->assertEquals( + '1">', + $this->security->xss_clean('') + ); } // -------------------------------------------------------------------- From c094becbcaf95fa8700ef7fc73c0b2bf808801a9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 8 Oct 2015 17:18:57 +0300 Subject: [PATCH 3990/5397] [ci skip] Fix broken links in user guide --- user_guide_src/source/changelog.rst | 2 +- user_guide_src/source/general/controllers.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index bf912b29f34..9648768c2e4 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -32,7 +32,7 @@ Bug fixes for 3.0.2 - Fixed a bug (#4044) - :doc:`Cache Library ` 'redis' driver didn't catch ``RedisException`` that could be thrown during authentication. - Fixed a bug (#4120) - :doc:`Database ` method ``error()`` didn't return error info when called after ``query()`` with the 'mssql' driver. - Fixed a bug (#4116) - :doc:`Pagination Library ` set the wrong page number on the "data-ci-pagination-page" attribute in generated links. -- Fixed a bug where :doc:`Pagination Library` added the 'rel="start"' attribute to the first displayed link even if it's not actually linking the first page. +- Fixed a bug where :doc:`Pagination Library ` added the 'rel="start"' attribute to the first displayed link even if it's not actually linking the first page. - Fixed a bug (#4137) - :doc:`Error Handling ` breaks for the new ``Error`` exceptions under PHP 7. - Fixed a bug (#4126) - :doc:`Form Validation Library ` method ``reset_validation()`` discarded validation rules from config files. diff --git a/user_guide_src/source/general/controllers.rst b/user_guide_src/source/general/controllers.rst index 7efb9349e62..5a111d8dca6 100644 --- a/user_guide_src/source/general/controllers.rst +++ b/user_guide_src/source/general/controllers.rst @@ -145,7 +145,7 @@ load your main index.php file without specifying any URI segments you'll see your "Hello World" message by default. For more information, please refer to the "Reserved Routes" section of the -:doc:`URI Routing ` documentation. +:doc:`URI Routing ` documentation. Remapping Method Calls ====================== From 47adcef68871cea1e556ffb2c0b6f585497e2a27 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 8 Oct 2015 17:21:06 +0300 Subject: [PATCH 3991/5397] [ci skip] Prepare 3.0.2 release --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/changelog.rst | 6 +++++- user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/installation/downloads.rst | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index b69630cf883..60dcc0e5ed6 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - define('CI_VERSION', '3.0.2-dev'); + define('CI_VERSION', '3.0.2'); /* * ------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 9648768c2e4..e1614fddedc 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -5,7 +5,11 @@ Change Log Version 3.0.2 ============= -Release Date: Not Released +Release Date: October 8, 2015 + +- **Security** + + - Fixed a number of XSS attack vectors in :doc:`Security Library ` method ``xss_clean()`` (thanks to Frans Rosén from `Detectify `_). - General Changes diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index d77c1e63f8e..c054490c31b 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.0.2-dev' +version = '3.0.2' # The full version, including alpha/beta/rc tags. -release = '3.0.2-dev' +release = '3.0.2' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 0026052c122..217ba654d0d 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,7 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.0.2-dev (Current version) `_ +- `CodeIgniter v3.0.2 (Current version) `_ - `CodeIgniter v3.0.1 `_ - `CodeIgniter v3.0.0 `_ - `CodeIgniter v2.2.3 `_ From d8687a59572f1f1b6d855588577363f6e628242e Mon Sep 17 00:00:00 2001 From: Ahmad Anbar Date: Sat, 10 Oct 2015 22:51:54 +0300 Subject: [PATCH 3992/5397] Optimize csv_from_result speed. --- system/database/DB_utility.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index 78398ea83bd..b51893e1813 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -254,11 +254,12 @@ public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosur // Next blast through the result array and build out the rows while ($row = $query->unbuffered_row('array')) { + $line = array(); foreach ($row as $item) { - $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim; + $line[] = $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure; } - $out = substr($out, 0, -strlen($delim)).$newline; + $out .= implode($delim, $line).$newline; } return $out; From 406ce65e26c4fda1b840b7267b148228cc3ca2f2 Mon Sep 17 00:00:00 2001 From: Hongyi Zhang Date: Sun, 11 Oct 2015 15:58:45 -0700 Subject: [PATCH 3993/5397] disable pulldown menu on mobile devices Signed-off-by: Hongyi Zhang --- .../source/_themes/sphinx_rtd_theme/breadcrumbs.html | 2 +- .../source/_themes/sphinx_rtd_theme/static/css/citheme.css | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html b/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html index 60343661a69..1694a1b0958 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html @@ -15,7 +15,7 @@ {% endif %}
    - classic layout + switch layout

    diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css index 192af2004d1..4c5c2f30bd4 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css @@ -70,4 +70,11 @@ div#pulldown-menu { font-weight: 300; font-family: Lucida Grande,Verdana,Geneva,sans-serif; color: #aaaaaa; +} + +/*disable switch layout on mobile devices*/ +@media (max-width: 768px) { + #closeMe { + display: none; + } } \ No newline at end of file From 4bb2b95a1b1f580427680c3bef71888e98c25523 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 12 Oct 2015 13:55:24 +0300 Subject: [PATCH 3994/5397] [ci skip] Add more info about security reporting to docs --- user_guide_src/source/contributing/index.rst | 20 ++++++++++++++++---- user_guide_src/source/general/security.rst | 3 +++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/user_guide_src/source/contributing/index.rst b/user_guide_src/source/contributing/index.rst index 0112ca065d8..5966070d1b6 100644 --- a/user_guide_src/source/contributing/index.rst +++ b/user_guide_src/source/contributing/index.rst @@ -29,12 +29,24 @@ own copy. This will require you to use the version control system called Git. Support ******* -Note that GitHub is not for general support questions! +Please note that GitHub is not for general support questions! If you are +having trouble using a feature of CodeIgniter, ask for help on our +`forums `_ instead. -If you are having trouble using a feature of CodeIgniter, ask for help on the forum. +If you are not sure whether you are using something correctly or if you +have found a bug, again - please ask on the forums first. -If you are wondering if you are using -something correctly or if you have found a bug, ask on the forum first. +******** +Security +******** + +Did you find a security issue in CodeIgniter? + +Please *don't* disclose it publicly, but e-mail us at security@codeigniter.com, +or report it via our page on `HackerOne `_. + +If you've found a critical vulnerability, we'd be happy to credit you in our +`ChangeLog <../changelog>`. **************************** Tips for a Good Issue Report diff --git a/user_guide_src/source/general/security.rst b/user_guide_src/source/general/security.rst index d4120d16266..8afdaca3151 100644 --- a/user_guide_src/source/general/security.rst +++ b/user_guide_src/source/general/security.rst @@ -5,6 +5,9 @@ Security This page describes some "best practices" regarding web security, and details CodeIgniter's internal security features. +.. note:: If you came here looking for a security contact, please refer to + our `Contribution Guide <../contributing/index>`. + URI Security ============ From 6d6b3b2f89d517b4589cb52965f34b115036584a Mon Sep 17 00:00:00 2001 From: Ahmad Anbar Date: Sat, 10 Oct 2015 22:51:54 +0300 Subject: [PATCH 3995/5397] Optimize csv_from_result speed. --- system/database/DB_utility.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index 78398ea83bd..b51893e1813 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -254,11 +254,12 @@ public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosur // Next blast through the result array and build out the rows while ($row = $query->unbuffered_row('array')) { + $line = array(); foreach ($row as $item) { - $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim; + $line[] = $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure; } - $out = substr($out, 0, -strlen($delim)).$newline; + $out .= implode($delim, $line).$newline; } return $out; From 2d7092c5771f7015b60f0e5cc6c699b8f4f802ba Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 12 Oct 2015 16:54:08 +0300 Subject: [PATCH 3996/5397] [ci skip] Add changelog entry for PR #4166 --- user_guide_src/source/changelog.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e1614fddedc..5e167a08f53 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -2,6 +2,18 @@ Change Log ########## +Version 3.0.3 +============= + +Release Date: Not Released + +- Database + + - Optimized :doc:`Database Utility ` method ``csv_from_result()`` for speed with larger result sets. + +Bug fixes for 3.0.3 +------------------- + Version 3.0.2 ============= From 2b5825ec66670b6ecb9528740cc1a51b59dbd3f2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 12 Oct 2015 16:57:28 +0300 Subject: [PATCH 3997/5397] [ci skip] This is 3.0.3-dev --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/installation/downloads.rst | 3 ++- user_guide_src/source/installation/upgrade_303.rst | 14 ++++++++++++++ user_guide_src/source/installation/upgrading.rst | 1 + 5 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 user_guide_src/source/installation/upgrade_303.rst diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 60dcc0e5ed6..8cea813a246 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - define('CI_VERSION', '3.0.2'); + define('CI_VERSION', '3.0.3-dev'); /* * ------------------------------------------------------ diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index c054490c31b..d77c1e63f8e 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.0.2' +version = '3.0.2-dev' # The full version, including alpha/beta/rc tags. -release = '3.0.2' +release = '3.0.2-dev' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 217ba654d0d..5b167d2ab64 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,8 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.0.2 (Current version) `_ +- `CodeIgniter v3.0.3-dev (Current version) `_ +- `CodeIgniter v3.0.2 `_ - `CodeIgniter v3.0.1 `_ - `CodeIgniter v3.0.0 `_ - `CodeIgniter v2.2.3 `_ diff --git a/user_guide_src/source/installation/upgrade_303.rst b/user_guide_src/source/installation/upgrade_303.rst new file mode 100644 index 00000000000..a98eed0d439 --- /dev/null +++ b/user_guide_src/source/installation/upgrade_303.rst @@ -0,0 +1,14 @@ +############################# +Upgrading from 3.0.2 to 3.0.3 +############################# + +Before performing an update you should take your site offline by +replacing the index.php file with a static one. + +Step 1: Update your CodeIgniter files +===================================== + +Replace all files and directories in your *system/* directory. + +.. note:: If you have any custom developed files in these directories, + please make copies of them first. \ No newline at end of file diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index 76fe434b5b9..010d1633e2e 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -8,6 +8,7 @@ upgrading from. .. toctree:: :titlesonly: + Upgrading from 3.0.2 to 3.0.3 Upgrading from 3.0.1 to 3.0.2 Upgrading from 3.0.0 to 3.0.1 Upgrading from 2.2.x to 3.0.x From 36a055e49b040e6f18be7bce5e010c2a90d2f44f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 12 Oct 2015 17:13:17 +0300 Subject: [PATCH 3998/5397] [ci skip] Correct download link for 3.0.3-dev --- user_guide_src/source/installation/downloads.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 5b167d2ab64..1249d14ecd8 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,7 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.0.3-dev (Current version) `_ +- `CodeIgniter v3.0.3-dev (Current version) `_ - `CodeIgniter v3.0.2 `_ - `CodeIgniter v3.0.1 `_ - `CodeIgniter v3.0.0 `_ From a3643a5e92cfe09b48327141d2b52701ab172977 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 13 Oct 2015 13:46:22 +0300 Subject: [PATCH 3999/5397] [ci skip] Correct version number in user guide conf --- user_guide_src/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index d77c1e63f8e..46e033ec83f 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.0.2-dev' +version = '3.0.3-dev' # The full version, including alpha/beta/rc tags. -release = '3.0.2-dev' +release = '3.0.3-dev' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 9d02ceafe0aa5ec755f1d8b011cf21f3841191cc Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 13 Oct 2015 14:38:30 +0300 Subject: [PATCH 4000/5397] [ci skip] Fix #4170 --- system/database/drivers/sqlsrv/sqlsrv_driver.php | 4 +--- user_guide_src/source/changelog.rst | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index 8d383b27433..1df3a42588a 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -275,9 +275,7 @@ public function affected_rows() */ public function insert_id() { - $query = $this->query('SELECT @@IDENTITY AS insert_id'); - $query = $query->row(); - return $query->insert_id; + return $this->query('SELECT SCOPE_IDENTITY() AS insert_id')->row()->insert_id; } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 5e167a08f53..e3dfac87967 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -14,6 +14,8 @@ Release Date: Not Released Bug fixes for 3.0.3 ------------------- +- Fixed a bug (#4170) - :doc:`Database ` method ``insert_id()`` could return an identity from the wrong scope with the 'sqlsrv' driver. + Version 3.0.2 ============= From 89c7123621f22533e1777796237a9b06bd190976 Mon Sep 17 00:00:00 2001 From: Hongyi Zhang Date: Fri, 16 Oct 2015 00:57:08 -0700 Subject: [PATCH 4001/5397] revert img alt changes, fix cookies, and improve pulldown menu in multiple screen size Signed-off-by: Hongyi Zhang --- .../_themes/sphinx_rtd_theme/breadcrumbs.html | 2 +- .../sphinx_rtd_theme/static/css/citheme.css | 18 ++++++++--- .../sphinx_rtd_theme/static/js/theme.js | 32 +++++++++++++++++-- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html b/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html index 1694a1b0958..60343661a69 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/breadcrumbs.html @@ -15,7 +15,7 @@ {% endif %}
    - switch layout + classic layout

    diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css index 4c5c2f30bd4..a2a3b3e91fa 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css @@ -72,9 +72,17 @@ div#pulldown-menu { color: #aaaaaa; } -/*disable switch layout on mobile devices*/ -@media (max-width: 768px) { - #closeMe { - display: none; - } +/*hide pulldown menu on mobile devices*/ +@media (max-width: 768px) { /*tablet size defined by theme*/ + #closeMe { + display: none; + } + + #pulldown { + display: none; + } + + #openToc { + display: none; + } } \ No newline at end of file diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js index b77789d0605..52580a0562e 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js @@ -25,7 +25,7 @@ $(document).ready(function () { $('#closeMe').toggle( function () { - setCookie('ciNav', true, 365); + setCookie('ciNav', 'true', 365); $('#nav2').show(); $('#topMenu').remove(); $('body').css({background: 'none'}); @@ -35,7 +35,7 @@ $(document).ready(function () { }, function () { - setCookie('ciNav', false, 365); + setCookie('ciNav', 'false', 365); $('#topMenu').remove(); $('#nav').hide(); $('#nav2').hide(); @@ -50,14 +50,19 @@ $(document).ready(function () { //$('#nav').slideToggle(); } // END MODIFICATION --- + }); // Rufnex Cookie functions function setCookie(cname, cvalue, exdays) { + // expire the old cookie if existed to avoid multiple cookies with the same name + if (getCookie(cname) != false) { + document.cookie = cname + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"; + } var d = new Date(); d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); var expires = "expires=" + d.toGMTString(); - document.cookie = cname + "=" + cvalue + "; " + expires; + document.cookie = cname + "=" + cvalue + "; " + expires + "; path=/"; } function getCookie(cname) { var name = cname + "="; @@ -74,6 +79,27 @@ function getCookie(cname) { } // End +// resize window +$(window).on('resize', function(){ + // show side nav on small screens when pulldown is enabled + if (getCookie('ciNav') == 'true' && $(window).width() <= 768) { // 768px is the tablet size defined by the theme + $('.wy-nav-side').show(); + } + // changing css with jQuenry seems to override the default css media query + // change margin + else if (getCookie('ciNav') == 'false' && $(window).width() <= 768) { + $('.wy-nav-content-wrap').css({'margin-left': 0}); + } + // hide side nav on large screens when pulldown is enabled + else if (getCookie('ciNav') == 'true' && $(window).width() > 768) { + $('.wy-nav-side').hide(); + } + // change margin + else if (getCookie('ciNav') == 'false' && $(window).width() > 768) { + $('.wy-nav-content-wrap').css({'margin-left': '300px'}); + } +}); + window.SphinxRtdTheme = (function (jquery) { var stickyNav = (function () { var navBar, From af042458194867ce9a9304eae2c261c14676b83a Mon Sep 17 00:00:00 2001 From: Hongyi Zhang Date: Fri, 16 Oct 2015 01:47:04 -0700 Subject: [PATCH 4002/5397] fix a typo in comment Signed-off-by: Hongyi Zhang --- .../source/_themes/sphinx_rtd_theme/static/js/theme.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js index 52580a0562e..bc996b71089 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js @@ -85,7 +85,7 @@ $(window).on('resize', function(){ if (getCookie('ciNav') == 'true' && $(window).width() <= 768) { // 768px is the tablet size defined by the theme $('.wy-nav-side').show(); } - // changing css with jQuenry seems to override the default css media query + // changing css with jquery seems to override the default css media query // change margin else if (getCookie('ciNav') == 'false' && $(window).width() <= 768) { $('.wy-nav-content-wrap').css({'margin-left': 0}); From de8b82ca8c4e201ad21c07ca962f5480493143eb Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 18 Oct 2015 20:58:38 +0300 Subject: [PATCH 4003/5397] Fix #4179 --- system/libraries/Session/drivers/Session_database_driver.php | 4 ++++ user_guide_src/source/changelog.rst | 1 + 2 files changed, 5 insertions(+) diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index 1d01c292390..72b39d12d47 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -159,6 +159,10 @@ public function read($session_id) if (($result = $this->_db->get()->row()) === NULL) { + // PHP7 will reuse the same SessionHandler object after + // ID regeneration, so we need to explicitly set this to + // FALSE instead of relying on the default ... + $this->_row_exists = FALSE; $this->_fingerprint = md5(''); return ''; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e3dfac87967..950a4a62664 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -15,6 +15,7 @@ Bug fixes for 3.0.3 ------------------- - Fixed a bug (#4170) - :doc:`Database ` method ``insert_id()`` could return an identity from the wrong scope with the 'sqlsrv' driver. +- Fixed a bug (#4179) - :doc:`Session Library ` doesn't properly maintain its state after ID regeneration with the 'database' driver on PHP7. Version 3.0.2 ============= From 97d5154c1b50e8c0e73b17355d20126dfaf043fa Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 19 Oct 2015 11:28:11 +0300 Subject: [PATCH 4004/5397] [ci skip] Fix docs about QB caching It doesn't support set() ... Related: #4175 --- user_guide_src/source/database/query_builder.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/database/query_builder.rst b/user_guide_src/source/database/query_builder.rst index 9c3ff306ff7..5d9ae459231 100644 --- a/user_guide_src/source/database/query_builder.rst +++ b/user_guide_src/source/database/query_builder.rst @@ -1018,7 +1018,7 @@ Here's a usage example:: .. note:: The following statements can be cached: select, from, join, - where, like, group_by, having, order_by, set + where, like, group_by, having, order_by *********************** From 95f815745855a5ac365595eb44abbda11766cfe5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 19 Oct 2015 13:16:19 +0300 Subject: [PATCH 4005/5397] Fix #4173 This reverts commit 7cc6cea2d421862726081a39e932dbceeefcc775 from PR #3968. At the time this seemed logical, but turns out it breaks the ability to create non-PRIMARY composite keys, so ... --- system/database/DB_forge.php | 8 +++++++- user_guide_src/source/changelog.rst | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index dde28559802..f9cf76a1462 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -239,7 +239,13 @@ public function drop_database($db_name) */ public function add_key($key, $primary = FALSE) { - if (is_array($key)) + // DO NOT change this! This condition is only applicable + // for PRIMARY keys because you can only have one such, + // and therefore all fields you add to it will be included + // in the same, composite PRIMARY KEY. + // + // It's not the same for regular indexes. + if ($primary === TRUE && is_array($key)) { foreach ($key as $one) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 950a4a62664..72bd9acf953 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -16,6 +16,7 @@ Bug fixes for 3.0.3 - Fixed a bug (#4170) - :doc:`Database ` method ``insert_id()`` could return an identity from the wrong scope with the 'sqlsrv' driver. - Fixed a bug (#4179) - :doc:`Session Library ` doesn't properly maintain its state after ID regeneration with the 'database' driver on PHP7. +- Fixed a bug (#4173) - :doc:`Database Forge ` method ``add_key()`` didn't allow creation of non-PRIMARY composite keys after the "bugfix" for #3968. Version 3.0.2 ============= From a7d4abaedc27497d570ae06ddc9cdde05930ec15 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 19 Oct 2015 14:39:44 +0300 Subject: [PATCH 4006/5397] Fix #4171 and a number of other transaction bugs --- system/database/DB_driver.php | 115 ++++++++++++++---- .../database/drivers/cubrid/cubrid_driver.php | 38 ++---- .../database/drivers/ibase/ibase_driver.php | 32 ++--- .../database/drivers/mssql/mssql_driver.php | 30 +---- .../database/drivers/mysql/mysql_driver.php | 37 ++---- .../database/drivers/mysqli/mysqli_driver.php | 30 +---- system/database/drivers/oci8/oci8_driver.php | 41 +------ system/database/drivers/odbc/odbc_driver.php | 34 ++---- system/database/drivers/pdo/pdo_driver.php | 30 +---- .../drivers/postgre/postgre_driver.php | 30 +---- .../database/drivers/sqlite/sqlite_driver.php | 39 +----- .../drivers/sqlite3/sqlite3_driver.php | 30 +---- .../database/drivers/sqlsrv/sqlsrv_driver.php | 30 +---- user_guide_src/source/changelog.rst | 4 + .../source/database/db_driver_reference.rst | 6 +- 15 files changed, 170 insertions(+), 356 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index cc94edc164f..0ea679432b1 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -668,7 +668,13 @@ public function query($sql, $binds = FALSE, $return_object = NULL) { do { + $trans_depth = $this->_trans_depth; $this->trans_complete(); + if ($trans_depth === $this->_trans_depth) + { + log_message('error', 'Database: Failure during an automated transaction commit/rollback!'); + break; + } } while ($this->_trans_depth !== 0); } @@ -813,24 +819,16 @@ public function trans_strict($mode = TRUE) * Start Transaction * * @param bool $test_mode = FALSE - * @return void + * @return bool */ public function trans_start($test_mode = FALSE) { if ( ! $this->trans_enabled) { - return; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - $this->_trans_depth += 1; - return; + return FALSE; } - $this->trans_begin($test_mode); - $this->_trans_depth += 1; + return $this->trans_begin($test_mode); } // -------------------------------------------------------------------- @@ -847,17 +845,6 @@ public function trans_complete() return FALSE; } - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 1) - { - $this->_trans_depth -= 1; - return TRUE; - } - else - { - $this->_trans_depth = 0; - } - // The query() function will set this flag to FALSE in the event that a query failed if ($this->_trans_status === FALSE OR $this->_trans_failure === TRUE) { @@ -875,8 +862,7 @@ public function trans_complete() return FALSE; } - $this->trans_commit(); - return TRUE; + return $this->trans_commit(); } // -------------------------------------------------------------------- @@ -893,6 +879,87 @@ public function trans_status() // -------------------------------------------------------------------- + /** + * Begin Transaction + * + * @param bool $test_mode + * @return bool + */ + public function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return FALSE; + } + // When transactions are nested we only begin/commit/rollback the outermost ones + elseif ($this->_trans_depth > 0) + { + $this->_trans_depth++; + 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); + + if ($this->_trans_begin()) + { + $this->_trans_depth++; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + public function trans_commit() + { + if ( ! $this->trans_enabled OR $this->_trans_depth === 0) + { + return FALSE; + } + // When transactions are nested we only begin/commit/rollback the outermost ones + elseif ($this->_trans_depth > 1 OR $this->_trans_commit()) + { + $this->_trans_depth--; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + public function trans_rollback() + { + if ( ! $this->trans_enabled OR $this->_trans_depth === 0) + { + return FALSE; + } + // When transactions are nested we only begin/commit/rollback the outermost ones + elseif ($this->_trans_depth > 1 OR $this->_trans_rollback()) + { + $this->_trans_depth--; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + /** * Compile Bindings * diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index f80b4db54b5..65f4adb3fbc 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -187,25 +187,17 @@ protected function _execute($sql) /** * Begin Transaction * - * @param bool $test_mode * @return bool */ - public function trans_begin($test_mode = FALSE) + protected function _trans_begin() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) + if (($autocommit = cubrid_get_autocommit($this->conn_id)) === NULL) { - return TRUE; + return FALSE; } - - // 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); - - if (cubrid_get_autocommit($this->conn_id)) + elseif ($autocommit === TRUE) { - cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE); + return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE); } return TRUE; @@ -218,19 +210,16 @@ public function trans_begin($test_mode = FALSE) * * @return bool */ - public function trans_commit() + protected function _trans_commit() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) + if ( ! cubrid_commit($this->conn_id)) { - return TRUE; + return FALSE; } - 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 cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); } return TRUE; @@ -243,16 +232,13 @@ public function trans_commit() * * @return bool */ - public function trans_rollback() + protected function _trans_rollback() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) + if ( ! cubrid_rollback($this->conn_id)) { - return TRUE; + return FALSE; } - cubrid_rollback($this->conn_id); - if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) { cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php index 529c320cd76..82550d51b18 100644 --- a/system/database/drivers/ibase/ibase_driver.php +++ b/system/database/drivers/ibase/ibase_driver.php @@ -134,24 +134,16 @@ protected function _execute($sql) /** * Begin Transaction * - * @param bool $test_mode * @return bool */ - public function trans_begin($test_mode = FALSE) + protected function _trans_begin() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) + if (($trans_handle = ibase_trans($this->conn_id)) === FALSE) { - return TRUE; + return FALSE; } - // 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); - - $this->_ibase_trans = ibase_trans($this->conn_id); - + $this->_ibase_trans = $trans_handle; return TRUE; } @@ -162,15 +154,15 @@ public function trans_begin($test_mode = FALSE) * * @return bool */ - public function trans_commit() + protected function _trans_commit() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans->depth > 0) + if (ibase_commit($this->_ibase_trans)) { + $this->_ibase_trans = NULL; return TRUE; } - return ibase_commit($this->_ibase_trans); + return FALSE; } // -------------------------------------------------------------------- @@ -180,15 +172,15 @@ public function trans_commit() * * @return bool */ - public function trans_rollback() + protected function _trans_rollback() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) + if (ibase_rollback($this->_ibase_trans)) { + $this->_ibase_trans = NULL; return TRUE; } - return ibase_rollback($this->_ibase_trans); + return FALSE; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 05e5418c38d..883973ae112 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -182,22 +182,10 @@ protected function _execute($sql) /** * Begin Transaction * - * @param bool $test_mode * @return bool */ - public function trans_begin($test_mode = FALSE) + protected function _trans_begin() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $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); - return $this->simple_query('BEGIN TRAN'); } @@ -208,14 +196,8 @@ public function trans_begin($test_mode = FALSE) * * @return bool */ - public function trans_commit() + protected function _trans_commit() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - return $this->simple_query('COMMIT TRAN'); } @@ -226,14 +208,8 @@ public function trans_commit() * * @return bool */ - public function trans_rollback() + protected function _trans_rollback() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - return $this->simple_query('ROLLBACK TRAN'); } diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index df0f24920d7..9c630d0d666 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -272,25 +272,12 @@ protected function _prep_query($sql) /** * Begin Transaction * - * @param bool $test_mode * @return bool */ - public function trans_begin($test_mode = FALSE) + protected function _trans_begin() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $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); - $this->simple_query('SET AUTOCOMMIT=0'); - $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK - return TRUE; + return $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK } // -------------------------------------------------------------------- @@ -300,17 +287,15 @@ public function trans_begin($test_mode = FALSE) * * @return bool */ - public function trans_commit() + protected function _trans_commit() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) + if ($this->simple_query('COMMIT')) { + $this->simple_query('SET AUTOCOMMIT=1'); return TRUE; } - $this->simple_query('COMMIT'); - $this->simple_query('SET AUTOCOMMIT=1'); - return TRUE; + return FALSE; } // -------------------------------------------------------------------- @@ -320,17 +305,15 @@ public function trans_commit() * * @return bool */ - public function trans_rollback() + protected function _trans_rollback() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) + if ($this->simple_query('ROLLBACK')) { + $this->simple_query('SET AUTOCOMMIT=1'); return TRUE; } - $this->simple_query('ROLLBACK'); - $this->simple_query('SET AUTOCOMMIT=1'); - return TRUE; + return FALSE; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index dd3cc77c6e6..8274700781a 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -291,22 +291,10 @@ protected function _prep_query($sql) /** * Begin Transaction * - * @param bool $test_mode * @return bool */ - public function trans_begin($test_mode = FALSE) + protected function _trans_begin() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $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); - $this->conn_id->autocommit(FALSE); return is_php('5.5') ? $this->conn_id->begin_transaction() @@ -320,14 +308,8 @@ public function trans_begin($test_mode = FALSE) * * @return bool */ - public function trans_commit() + protected function _trans_commit() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - if ($this->conn_id->commit()) { $this->conn_id->autocommit(TRUE); @@ -344,14 +326,8 @@ public function trans_commit() * * @return bool */ - public function trans_rollback() + protected function _trans_rollback() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - if ($this->conn_id->rollback()) { $this->conn_id->autocommit(TRUE); diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index f2e40da9b76..916ddeb9072 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -378,27 +378,10 @@ protected function _bind_params($params) /** * Begin Transaction * - * @param bool $test_mode * @return bool */ - public function trans_begin($test_mode = FALSE) + protected function _trans_begin() { - 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); - $this->commit_mode = is_php('5.3.2') ? OCI_NO_AUTO_COMMIT : OCI_DEFAULT; return TRUE; } @@ -410,20 +393,10 @@ public function trans_begin($test_mode = FALSE) * * @return bool */ - public function trans_commit() + protected 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->commit_mode = OCI_COMMIT_ON_SUCCESS; + return oci_commit($this->conn_id); } @@ -434,14 +407,8 @@ public function trans_commit() * * @return bool */ - public function trans_rollback() + protected function _trans_rollback() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - $this->commit_mode = OCI_COMMIT_ON_SUCCESS; return oci_rollback($this->conn_id); } diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index f5d77a14774..409284b44e5 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -143,22 +143,10 @@ protected function _execute($sql) /** * Begin Transaction * - * @param bool $test_mode * @return bool */ - public function trans_begin($test_mode = FALSE) + protected function _trans_begin() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $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); - return odbc_autocommit($this->conn_id, FALSE); } @@ -169,17 +157,15 @@ public function trans_begin($test_mode = FALSE) * * @return bool */ - public function trans_commit() + protected function _trans_commit() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) + if (odbc_commit($this->conn_id)) { + odbc_autocommit($this->conn_id, TRUE); return TRUE; } - $ret = odbc_commit($this->conn_id); - odbc_autocommit($this->conn_id, TRUE); - return $ret; + return FALSE; } // -------------------------------------------------------------------- @@ -189,17 +175,15 @@ public function trans_commit() * * @return bool */ - public function trans_rollback() + protected function _trans_rollback() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) + if (odbc_rollback($this->conn_id)) { + odbc_autocommit($this->conn_id, TRUE); return TRUE; } - $ret = odbc_rollback($this->conn_id); - odbc_autocommit($this->conn_id, TRUE); - return $ret; + return FALSE; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index cc77e956810..8c5a5e7e369 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -186,22 +186,10 @@ protected function _execute($sql) /** * Begin Transaction * - * @param bool $test_mode * @return bool */ - public function trans_begin($test_mode = FALSE) + protected function _trans_begin() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $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); - return $this->conn_id->beginTransaction(); } @@ -212,14 +200,8 @@ public function trans_begin($test_mode = FALSE) * * @return bool */ - public function trans_commit() + protected function _trans_commit() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - return $this->conn_id->commit(); } @@ -230,14 +212,8 @@ public function trans_commit() * * @return bool */ - public function trans_rollback() + protected function _trans_rollback() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - return $this->conn_id->rollBack(); } diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 7be07c3bf4d..b1df326f7eb 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -247,22 +247,10 @@ protected function _execute($sql) /** * Begin Transaction * - * @param bool $test_mode * @return bool */ - public function trans_begin($test_mode = FALSE) + protected function _trans_begin() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $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); - return (bool) pg_query($this->conn_id, 'BEGIN'); } @@ -273,14 +261,8 @@ public function trans_begin($test_mode = FALSE) * * @return bool */ - public function trans_commit() + protected function _trans_commit() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - return (bool) pg_query($this->conn_id, 'COMMIT'); } @@ -291,14 +273,8 @@ public function trans_commit() * * @return bool */ - public function trans_rollback() + protected function _trans_rollback() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - return (bool) pg_query($this->conn_id, 'ROLLBACK'); } diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index 9d9caa0b497..e000a8e5002 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -122,24 +122,11 @@ protected function _execute($sql) /** * Begin Transaction * - * @param bool $test_mode * @return bool */ - public function trans_begin($test_mode = FALSE) + protected function _trans_begin() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $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); - - $this->simple_query('BEGIN TRANSACTION'); - return TRUE; + return $this->simple_query('BEGIN TRANSACTION'); } // -------------------------------------------------------------------- @@ -149,16 +136,9 @@ public function trans_begin($test_mode = FALSE) * * @return bool */ - public function trans_commit() + protected function _trans_commit() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - - $this->simple_query('COMMIT'); - return TRUE; + return $this->simple_query('COMMIT'); } // -------------------------------------------------------------------- @@ -168,16 +148,9 @@ public function trans_commit() * * @return bool */ - public function trans_rollback() + protected function _trans_rollback() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - - $this->simple_query('ROLLBACK'); - return TRUE; + return $this->simple_query('ROLLBACK'); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index 31e37de9113..73e4537852e 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -134,22 +134,10 @@ protected function _execute($sql) /** * Begin Transaction * - * @param bool $test_mode * @return bool */ - public function trans_begin($test_mode = FALSE) + protected function _trans_begin() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $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); - return $this->conn_id->exec('BEGIN TRANSACTION'); } @@ -160,14 +148,8 @@ public function trans_begin($test_mode = FALSE) * * @return bool */ - public function trans_commit() + protected function _trans_commit() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - return $this->conn_id->exec('END TRANSACTION'); } @@ -178,14 +160,8 @@ public function trans_commit() * * @return bool */ - public function trans_rollback() + protected function _trans_rollback() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - return $this->conn_id->exec('ROLLBACK'); } diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index 1df3a42588a..414669a4b2c 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -197,22 +197,10 @@ protected function _execute($sql) /** * Begin Transaction * - * @param bool $test_mode * @return bool */ - public function trans_begin($test_mode = FALSE) + protected function _trans_begin() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $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); - return sqlsrv_begin_transaction($this->conn_id); } @@ -223,14 +211,8 @@ public function trans_begin($test_mode = FALSE) * * @return bool */ - public function trans_commit() + protected function _trans_commit() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - return sqlsrv_commit($this->conn_id); } @@ -241,14 +223,8 @@ public function trans_commit() * * @return bool */ - public function trans_rollback() + protected function _trans_rollback() { - // When transactions are nested we only begin/commit/rollback the outermost ones - if ( ! $this->trans_enabled OR $this->_trans_depth > 0) - { - return TRUE; - } - return sqlsrv_rollback($this->conn_id); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 72bd9acf953..b1caf9b56eb 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -10,6 +10,7 @@ Release Date: Not Released - Database - Optimized :doc:`Database Utility ` method ``csv_from_result()`` for speed with larger result sets. + - Added proper return values to :doc:`Database Transactions ` method ``trans_start()``. Bug fixes for 3.0.3 ------------------- @@ -17,6 +18,9 @@ Bug fixes for 3.0.3 - Fixed a bug (#4170) - :doc:`Database ` method ``insert_id()`` could return an identity from the wrong scope with the 'sqlsrv' driver. - Fixed a bug (#4179) - :doc:`Session Library ` doesn't properly maintain its state after ID regeneration with the 'database' driver on PHP7. - Fixed a bug (#4173) - :doc:`Database Forge ` method ``add_key()`` didn't allow creation of non-PRIMARY composite keys after the "bugfix" for #3968. +- Fixed a bug (#4171) - :doc:`Database Transactions ` didn't work with nesting in methods ``trans_begin()``, ``trans_commit()``, ``trans_rollback()``. +- Fixed a bug where :doc:`Database Transaction ` methods ``trans_begin()``, ``trans_commit()``, ``trans_rollback()`` ignored failures. +- Fixed a bug where all :doc:`Database Transaction ` methods returned TRUE while transactions are actually disabled. Version 3.0.2 ============= diff --git a/user_guide_src/source/database/db_driver_reference.rst b/user_guide_src/source/database/db_driver_reference.rst index ea692515cb3..8fc26c01b79 100644 --- a/user_guide_src/source/database/db_driver_reference.rst +++ b/user_guide_src/source/database/db_driver_reference.rst @@ -140,13 +140,15 @@ This article is intended to be a reference for them. .. php:method:: trans_start([$test_mode = FALSE]) :param bool $test_mode: Test mode flag - :rtype: void + :returns: TRUE on success, FALSE on failure + :rtype: bool Start a transaction. .. php:method:: trans_complete() - :rtype: void + :returns: TRUE on success, FALSE on failure + :rtype: bool Complete Transaction. From 99c8ff3d03a95b1e8f589ecfc9de925d5fecedac Mon Sep 17 00:00:00 2001 From: Hongyi Zhang Date: Mon, 19 Oct 2015 12:54:17 -0700 Subject: [PATCH 4007/5397] rename cookie values to make codes clear Signed-off-by: Hongyi Zhang --- .../sphinx_rtd_theme/static/js/theme.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js index bc996b71089..081d77bdf4a 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js @@ -25,7 +25,7 @@ $(document).ready(function () { $('#closeMe').toggle( function () { - setCookie('ciNav', 'true', 365); + setCookie('ciNav', 'yes', 365); $('#nav2').show(); $('#topMenu').remove(); $('body').css({background: 'none'}); @@ -35,7 +35,7 @@ $(document).ready(function () { }, function () { - setCookie('ciNav', 'false', 365); + setCookie('ciNav', 'no', 365); $('#topMenu').remove(); $('#nav').hide(); $('#nav2').hide(); @@ -44,7 +44,7 @@ $(document).ready(function () { $('.wy-nav-side').show(); } ); - if (getCookie('ciNav') == 'true') + if (getCookie('ciNav') == 'yes') { $('#closeMe').trigger('click'); //$('#nav').slideToggle(); @@ -56,7 +56,7 @@ $(document).ready(function () { // Rufnex Cookie functions function setCookie(cname, cvalue, exdays) { // expire the old cookie if existed to avoid multiple cookies with the same name - if (getCookie(cname) != false) { + if (getCookie(cname)) { document.cookie = cname + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"; } var d = new Date(); @@ -75,27 +75,27 @@ function getCookie(cname) { return c.substring(name.length, c.length); } } - return false; + return ''; } // End // resize window $(window).on('resize', function(){ // show side nav on small screens when pulldown is enabled - if (getCookie('ciNav') == 'true' && $(window).width() <= 768) { // 768px is the tablet size defined by the theme + if (getCookie('ciNav') == 'yes' && $(window).width() <= 768) { // 768px is the tablet size defined by the theme $('.wy-nav-side').show(); } // changing css with jquery seems to override the default css media query // change margin - else if (getCookie('ciNav') == 'false' && $(window).width() <= 768) { + else if (getCookie('ciNav') == 'no' && $(window).width() <= 768) { $('.wy-nav-content-wrap').css({'margin-left': 0}); } // hide side nav on large screens when pulldown is enabled - else if (getCookie('ciNav') == 'true' && $(window).width() > 768) { + else if (getCookie('ciNav') == 'yes' && $(window).width() > 768) { $('.wy-nav-side').hide(); } // change margin - else if (getCookie('ciNav') == 'false' && $(window).width() > 768) { + else if (getCookie('ciNav') == 'no' && $(window).width() > 768) { $('.wy-nav-content-wrap').css({'margin-left': '300px'}); } }); From 29b90f7ea402b9d8227fff86e32ab13de056b6c1 Mon Sep 17 00:00:00 2001 From: "Instructor, Computer Systems Technology" Date: Wed, 21 Oct 2015 06:10:32 -0700 Subject: [PATCH 4008/5397] Merge pull request #4167 from zhanghongyi/fix-pulldown disable pulldown menu on mobile devices --- .../sphinx_rtd_theme/static/css/citheme.css | 15 ++++++++ .../sphinx_rtd_theme/static/js/theme.js | 36 ++++++++++++++++--- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css index 192af2004d1..a2a3b3e91fa 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/css/citheme.css @@ -70,4 +70,19 @@ div#pulldown-menu { font-weight: 300; font-family: Lucida Grande,Verdana,Geneva,sans-serif; color: #aaaaaa; +} + +/*hide pulldown menu on mobile devices*/ +@media (max-width: 768px) { /*tablet size defined by theme*/ + #closeMe { + display: none; + } + + #pulldown { + display: none; + } + + #openToc { + display: none; + } } \ No newline at end of file diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js index b77789d0605..081d77bdf4a 100644 --- a/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js +++ b/user_guide_src/source/_themes/sphinx_rtd_theme/static/js/theme.js @@ -25,7 +25,7 @@ $(document).ready(function () { $('#closeMe').toggle( function () { - setCookie('ciNav', true, 365); + setCookie('ciNav', 'yes', 365); $('#nav2').show(); $('#topMenu').remove(); $('body').css({background: 'none'}); @@ -35,7 +35,7 @@ $(document).ready(function () { }, function () { - setCookie('ciNav', false, 365); + setCookie('ciNav', 'no', 365); $('#topMenu').remove(); $('#nav').hide(); $('#nav2').hide(); @@ -44,20 +44,25 @@ $(document).ready(function () { $('.wy-nav-side').show(); } ); - if (getCookie('ciNav') == 'true') + if (getCookie('ciNav') == 'yes') { $('#closeMe').trigger('click'); //$('#nav').slideToggle(); } // END MODIFICATION --- + }); // Rufnex Cookie functions function setCookie(cname, cvalue, exdays) { + // expire the old cookie if existed to avoid multiple cookies with the same name + if (getCookie(cname)) { + document.cookie = cname + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"; + } var d = new Date(); d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); var expires = "expires=" + d.toGMTString(); - document.cookie = cname + "=" + cvalue + "; " + expires; + document.cookie = cname + "=" + cvalue + "; " + expires + "; path=/"; } function getCookie(cname) { var name = cname + "="; @@ -70,10 +75,31 @@ function getCookie(cname) { return c.substring(name.length, c.length); } } - return false; + return ''; } // End +// resize window +$(window).on('resize', function(){ + // show side nav on small screens when pulldown is enabled + if (getCookie('ciNav') == 'yes' && $(window).width() <= 768) { // 768px is the tablet size defined by the theme + $('.wy-nav-side').show(); + } + // changing css with jquery seems to override the default css media query + // change margin + else if (getCookie('ciNav') == 'no' && $(window).width() <= 768) { + $('.wy-nav-content-wrap').css({'margin-left': 0}); + } + // hide side nav on large screens when pulldown is enabled + else if (getCookie('ciNav') == 'yes' && $(window).width() > 768) { + $('.wy-nav-side').hide(); + } + // change margin + else if (getCookie('ciNav') == 'no' && $(window).width() > 768) { + $('.wy-nav-content-wrap').css({'margin-left': '300px'}); + } +}); + window.SphinxRtdTheme = (function (jquery) { var stickyNav = (function () { var navBar, From b2d2535cc0326acea4722f7be9819cf58fd155da Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 23 Oct 2015 14:11:47 +0300 Subject: [PATCH 4009/5397] [ci skip] Link HackerOne page in the readme --- readme.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/readme.rst b/readme.rst index 640dd241bfd..2e35d7223f6 100644 --- a/readme.rst +++ b/readme.rst @@ -59,7 +59,8 @@ Resources - `Community Wiki `_ - `Community IRC `_ -Report security issues to our `Security Panel `_, thank you. +Report security issues to our `Security Panel `_ +or via our `page on HackerOne `_, thank you. *************** Acknowledgement From 175b17c4b74d03a7578440d92a3ac9d80924ef78 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 23 Oct 2015 14:11:47 +0300 Subject: [PATCH 4010/5397] [ci skip] Link HackerOne page in the readme --- readme.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/readme.rst b/readme.rst index 640dd241bfd..2e35d7223f6 100644 --- a/readme.rst +++ b/readme.rst @@ -59,7 +59,8 @@ Resources - `Community Wiki `_ - `Community IRC `_ -Report security issues to our `Security Panel `_, thank you. +Report security issues to our `Security Panel `_ +or via our `page on HackerOne `_, thank you. *************** Acknowledgement From d2ea460f138fd1f9a527c9b0ece7cce369fd430b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 30 Oct 2015 11:47:35 +0200 Subject: [PATCH 4011/5397] Fix #3201 --- system/core/Common.php | 7 ++++++- tests/codeigniter/core/Common_test.php | 5 +++++ user_guide_src/source/changelog.rst | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/system/core/Common.php b/system/core/Common.php index ad3ca9f9388..3ab98cf6da0 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -752,7 +752,12 @@ function html_escape($var, $double_encode = TRUE) if (is_array($var)) { - return array_map('html_escape', $var, array_fill(0, count($var), $double_encode)); + foreach (array_keys($var) as $key) + { + $var[$key] = html_escape($var[$key], $double_encode); + } + + return $var; } return htmlspecialchars($var, ENT_QUOTES, config_item('charset'), $double_encode); diff --git a/tests/codeigniter/core/Common_test.php b/tests/codeigniter/core/Common_test.php index 999b49cb36b..81a185eafb4 100644 --- a/tests/codeigniter/core/Common_test.php +++ b/tests/codeigniter/core/Common_test.php @@ -47,6 +47,11 @@ public function test_html_escape() html_escape('Here is a string containing "quoted" text.'), 'Here is a string containing "quoted" text.' ); + + $this->assertEquals( + html_escape(array('associative' => 'and', array('multi' => 'dimentional'))), + array('associative' => 'and', array('multi' => 'dimentional')) + ); } } \ No newline at end of file diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b1caf9b56eb..8aaf0bfc4ac 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -21,6 +21,7 @@ Bug fixes for 3.0.3 - Fixed a bug (#4171) - :doc:`Database Transactions ` didn't work with nesting in methods ``trans_begin()``, ``trans_commit()``, ``trans_rollback()``. - Fixed a bug where :doc:`Database Transaction ` methods ``trans_begin()``, ``trans_commit()``, ``trans_rollback()`` ignored failures. - Fixed a bug where all :doc:`Database Transaction ` methods returned TRUE while transactions are actually disabled. +- Fixed a bug (#3201) - :doc:`Common function ` :php:func:`html_escape()` modified keys of its array inputs. Version 3.0.2 ============= From 09a76b8f31e75bf2f7312b976731f985e12973f0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 30 Oct 2015 11:50:08 +0200 Subject: [PATCH 4012/5397] [ci skip] Fix changelog entry from latest commit #3201 is actually another issue, the bug fixed by a62aa820bdd3e642f44428b27f2c6cde1baf4adc was just reported in the comments there. --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8aaf0bfc4ac..60cf4cf024c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -21,7 +21,7 @@ Bug fixes for 3.0.3 - Fixed a bug (#4171) - :doc:`Database Transactions ` didn't work with nesting in methods ``trans_begin()``, ``trans_commit()``, ``trans_rollback()``. - Fixed a bug where :doc:`Database Transaction ` methods ``trans_begin()``, ``trans_commit()``, ``trans_rollback()`` ignored failures. - Fixed a bug where all :doc:`Database Transaction ` methods returned TRUE while transactions are actually disabled. -- Fixed a bug (#3201) - :doc:`Common function ` :php:func:`html_escape()` modified keys of its array inputs. +- Fixed a bug where :doc:`common function ` :php:func:`html_escape()` modified keys of its array inputs. Version 3.0.2 ============= From 3368cebeb6682013c44be7a03d3b3dac0f5c8973 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 30 Oct 2015 12:25:15 +0200 Subject: [PATCH 4013/5397] Fix #4192 --- system/libraries/Email.php | 13 ++++++++----- user_guide_src/source/changelog.rst | 1 + 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index acf3629c330..ebff7567a13 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1563,11 +1563,10 @@ protected function _prep_q_encoding($str) if ($this->charset === 'UTF-8') { - if (MB_ENABLED === TRUE) - { - return mb_encode_mimeheader($str, $this->charset, 'Q', $this->crlf); - } - elseif (ICONV_ENABLED === TRUE) + // Note: We used to have mb_encode_mimeheader() as the first choice + // here, but it turned out to be buggy and unreliable. DO NOT + // re-add it! -- Narf + if (ICONV_ENABLED === TRUE) { $output = @iconv_mime_encode('', $str, array( @@ -1590,6 +1589,10 @@ protected function _prep_q_encoding($str) $chars = iconv_strlen($str, 'UTF-8'); } + elseif (MB_ENABLED === TRUE) + { + $chars = mb_strlen($str, 'UTF-8'); + } } // We might already have this set for UTF-8 diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 60cf4cf024c..f9f451d985b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -22,6 +22,7 @@ Bug fixes for 3.0.3 - Fixed a bug where :doc:`Database Transaction ` methods ``trans_begin()``, ``trans_commit()``, ``trans_rollback()`` ignored failures. - Fixed a bug where all :doc:`Database Transaction ` methods returned TRUE while transactions are actually disabled. - Fixed a bug where :doc:`common function ` :php:func:`html_escape()` modified keys of its array inputs. +- Fixed a bug (#4192) - :doc:`Email Library ` wouldn't always have proper Quoted-printable encoding due to a bug in PHP's own ``mb_mime_encodeheader()`` function. Version 3.0.2 ============= From 71b1b3f5b2dcc0f4b652e9494e9853b82541ac8c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 27 Oct 2015 12:30:18 +0200 Subject: [PATCH 4014/5397] Harden xss_clean() --- system/core/Security.php | 66 ++++++++++++++---------- tests/codeigniter/core/Security_test.php | 35 +++++++------ 2 files changed, 59 insertions(+), 42 deletions(-) diff --git a/system/core/Security.php b/system/core/Security.php index ab85e2239c6..36dea4cf2ed 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -803,43 +803,55 @@ protected function _sanitize_naughty_html($matches) // For other tags, see if their attributes are "evil" and strip those elseif (isset($matches['attributes'])) { - // We'll need to catch all attributes separately first - $pattern = '#' - .'([\s\042\047/=]*)' // non-attribute characters, excluding > (tag close) for obvious reasons + // We'll store the already fitlered attributes here + $attributes = array(); + + // Attribute-catching pattern + $attributes_pattern = '#' .'(?[^\s\042\047>/=]+)' // attribute characters // optional attribute-value .'(?:\s*=(?[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*)))' // attribute-value separator .'#i'; - if ($count = preg_match_all($pattern, $matches['attributes'], $attributes, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) + // Blacklist pattern for evil attribute names + $is_evil_pattern = '#^('.implode('|', $evil_attributes).')$#i'; + + // Each iteration filters a single attribute + do { - // Since we'll be using substr_replace() below, we - // need to handle the attributes in reverse order, - // so we don't damage the string. - for ($i = $count - 1; $i > -1; $i--) + // Strip any non-alpha characters that may preceed an attribute. + // Browsers often parse these incorrectly and that has been a + // of numerous XSS issues we've had. + $matches['attributes'] = preg_replace('#^[^a-z]+#i', '', $matches['attributes']); + + if ( ! preg_match($attributes_pattern, $matches['attributes'], $attribute, PREG_OFFSET_CAPTURE)) { - if ( - // Is it indeed an "evil" attribute? - preg_match('#^('.implode('|', $evil_attributes).')$#i', $attributes[$i]['name'][0]) - // Or an attribute not starting with a letter? Some parsers get confused by that - OR ! ctype_alpha($attributes[$i]['name'][0][0]) - // Does it have an equals sign, but no value and not quoted? Strip that too! - OR (trim($attributes[$i]['value'][0]) === '') - ) - { - $matches['attributes'] = substr_replace( - $matches['attributes'], - ' [removed]', - $attributes[$i][0][1], - strlen($attributes[$i][0][0]) - ); - } + // No (valid) attribute found? Discard everything else inside the tag + break; } - // Note: This will strip some non-space characters and/or - // reduce multiple spaces between attributes. - return '<'.$matches['slash'].$matches['tagName'].' '.trim($matches['attributes']).'>'; + if ( + // Is it indeed an "evil" attribute? + preg_match($is_evil_pattern, $attribute['name'][0]) + // Or does it have an equals sign, but no value and not quoted? Strip that too! + OR (trim($attribute['value'][0]) === '') + ) + { + $attributes[] = 'xss=removed'; + } + else + { + $attributes[] = $attribute[0][0]; + } + + $matches['attributes'] = substr($matches['attributes'], $attribute[0][1] + strlen($attribute[0][0])); } + while ($matches['attributes'] !== ''); + + $attributes = empty($attributes) + ? '' + : ' '.implode(' ', $attributes); + return '<'.$matches['slash'].$matches['tagName'].$attributes.'>'; } return $matches[0]; diff --git a/tests/codeigniter/core/Security_test.php b/tests/codeigniter/core/Security_test.php index 52967dc2f40..2ef8228631c 100644 --- a/tests/codeigniter/core/Security_test.php +++ b/tests/codeigniter/core/Security_test.php @@ -115,7 +115,7 @@ public function test_xss_clean_image_invalid() public function test_xss_clean_entity_double_encoded() { $input = 'Clickhere'; - $this->assertEquals('Clickhere', $this->security->xss_clean($input)); + $this->assertEquals('Clickhere', $this->security->xss_clean($input)); } // -------------------------------------------------------------------- @@ -134,7 +134,7 @@ public function text_xss_clean_js_link_removal() public function test_xss_clean_js_img_removal() { $input = 'Clickhere'; - $this->assertEquals('', $this->security->xss_clean($input)); + $this->assertEquals('', $this->security->xss_clean($input)); } // -------------------------------------------------------------------- @@ -146,7 +146,7 @@ public function test_xss_clean_sanitize_naughty_html_tags() $this->assertEquals('', $this->security->xss_clean('')); $this->assertEquals( - ' src="x">', + ' src="x">', $this->security->xss_clean(' src="x">') ); @@ -160,21 +160,21 @@ public function test_xss_clean_sanitize_naughty_html_tags() public function test_xss_clean_sanitize_naughty_html_attributes() { - $this->assertEquals('', $this->security->xss_clean('')); - $this->assertEquals('', $this->security->xss_clean('')); - $this->assertEquals('', $this->security->xss_clean('')); + $this->assertEquals('', $this->security->xss_clean('')); + $this->assertEquals('', $this->security->xss_clean('')); + $this->assertEquals('', $this->security->xss_clean('')); $this->assertEquals('', $this->security->xss_clean('')); $this->assertEquals('onOutsideOfTag=test', $this->security->xss_clean('onOutsideOfTag=test')); $this->assertEquals('onNoTagAtAll = true', $this->security->xss_clean('onNoTagAtAll = true')); - $this->assertEquals('', $this->security->xss_clean('')); - $this->assertEquals('', $this->security->xss_clean('')); + $this->assertEquals('', $this->security->xss_clean('')); + $this->assertEquals('', $this->security->xss_clean('')); $this->assertEquals( - '\' [removed]>', + '\' xss=removed>', $this->security->xss_clean('\' onAfterGreaterThan="quotes">') ); $this->assertEquals( - '\' [removed]>', + '\' xss=removed>', $this->security->xss_clean('\' onAfterGreaterThan=noQuotes>') ); @@ -194,7 +194,7 @@ public function test_xss_clean_sanitize_naughty_html_attributes() ); $this->assertEquals( - '', + '', $this->security->xss_clean('') ); @@ -204,19 +204,24 @@ public function test_xss_clean_sanitize_naughty_html_attributes() ); $this->assertEquals( - '', + '', $this->security->xss_clean('') ); $this->assertEquals( - '', + '', $this->security->xss_clean('') ); $this->assertEquals( - '1">', + '1">', $this->security->xss_clean('') ); + + $this->assertEquals( + '', + $this->security->xss_clean('') + ); } // -------------------------------------------------------------------- @@ -228,7 +233,7 @@ public function test_xss_clean_sanitize_naughty_html_attributes() public function test_naughty_html_plus_evil_attributes() { $this->assertEquals( - '<svg', + '<svg', $this->security->xss_clean(' src="x" onerror="location=/javascript/.source+/:alert/.source+/(1)/.source">') ); } From 0a6b0661305f20ac1fbd219d43f59193bea90d1d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 26 Oct 2015 15:31:38 +0200 Subject: [PATCH 4015/5397] Prevent Host header injections --- application/config/config.php | 14 +++++--- system/core/Config.php | 6 ++-- tests/codeigniter/core/Config_test.php | 47 ++++++++++---------------- 3 files changed, 29 insertions(+), 38 deletions(-) diff --git a/application/config/config.php b/application/config/config.php index 479d591a4d1..4f8f8140651 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -11,10 +11,16 @@ | | http://example.com/ | -| If this is not set then CodeIgniter will try guess the protocol, domain -| and path to your installation. However, you should always configure this -| explicitly and never rely on auto-guessing, especially in production -| environments. +| WARNING: You MUST set this value! +| +| If it is not set, then CodeIgniter will try guess the protocol and path +| your installation, but due to security concerns the hostname will be set +| to $_SERVER['SERVER_ADDR'] if available, or localhost otherwise. +| The auto-detection mechanism exists only for convenience during +| development and MUST NOT be used in production! +| +| If you need to allow multiple domains, remember that this file is still +| a PHP script and you can easily do that on your own. | */ $config['base_url'] = ''; diff --git a/system/core/Config.php b/system/core/Config.php index feea7c85a46..0264776f98c 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -88,11 +88,9 @@ public function __construct() // Set the base_url automatically if none was provided if (empty($this->config['base_url'])) { - // The regular expression is only a basic validation for a valid "Host" header. - // It's not exhaustive, only checks for valid characters. - if (isset($_SERVER['HTTP_HOST']) && preg_match('/^((\[[0-9a-f:]+\])|(\d{1,3}(\.\d{1,3}){3})|[a-z0-9\-\.]+)(:\d+)?$/i', $_SERVER['HTTP_HOST'])) + if (isset($_SERVER['SERVER_ADDR'])) { - $base_url = (is_https() ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'] + $base_url = (is_https() ? 'https' : 'http').'://'.$_SERVER['SERVER_ADDR'] .substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME']))); } else diff --git a/tests/codeigniter/core/Config_test.php b/tests/codeigniter/core/Config_test.php index f125fc6e9a6..26a5f32f568 100644 --- a/tests/codeigniter/core/Config_test.php +++ b/tests/codeigniter/core/Config_test.php @@ -79,46 +79,33 @@ public function test_base_url() $old_script_name = isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : NULL; $old_script_filename = $_SERVER['SCRIPT_FILENAME']; $old_https = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : NULL; + $old_server_addr = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : NULL; - // Setup server vars for detection - $host = 'test.com'; - $path = '/'; - $script = 'base_test.php'; - $_SERVER['HTTP_HOST'] = $host; - $_SERVER['SCRIPT_NAME'] = $path.$script; - $_SERVER['SCRIPT_FILENAME'] = '/foo/bar/'.$script; - - // Rerun constructor + // The 'Host' header is user input and must not be trusted + $_SERVER['HTTP_HOST'] = 'test.com'; $this->config = new $cls; + $this->assertEquals('http://localhost/', $this->config->base_url()); - // Test plain detected (root) - $this->assertEquals('http://'.$host.$path, $this->config->base_url()); - - // Rerun constructor - $path = '/path/'; - $_SERVER['SCRIPT_NAME'] = $path.$script; - $_SERVER['SCRIPT_FILENAME'] = '/foo/bar/'.$path.$script; + // However, we may fallback to the server's IP address + $_SERVER['SERVER_ADDR'] = '127.0.0.1'; + $_SERVER['SCRIPT_NAME'] = '/base_test.php'; + $_SERVER['SCRIPT_FILENAME'] = '/foo/bar/base_test.php'; $this->config = new $cls; + $this->assertEquals('http://127.0.0.1/', $this->config->base_url()); - // Test plain detected (subfolder) - $this->assertEquals('http://'.$host.$path, $this->config->base_url()); - - // Rerun constructor + // Making sure that HTTPS and URI path are also detected $_SERVER['HTTPS'] = 'on'; + $_SERVER['SCRIPT_NAME'] = '/path/base_test.php'; + $_SERVER['SCRIPT_FILENAME'] = '/foo/bar/path/base_test.php'; $this->config = new $cls; - - // Test secure detected - $this->assertEquals('https://'.$host.$path, $this->config->base_url()); + $this->assertEquals('https://127.0.0.1/path/', $this->config->base_url()); // Restore server vars - if ($old_host === NULL) unset($_SERVER['HTTP_HOST']); - else $_SERVER['HTTP_HOST'] = $old_host; - if ($old_script_name === NULL) unset($_SERVER['SCRIPT_NAME']); - else $_SERVER['SCRIPT_NAME'] = $old_script_name; - if ($old_https === NULL) unset($_SERVER['HTTPS']); - else $_SERVER['HTTPS'] = $old_https; - + $_SERVER['HTTP_HOST'] = $old_host; + $_SERVER['SCRIPT_NAME'] = $old_script_name; $_SERVER['SCRIPT_FILENAME'] = $old_script_filename; + $_SERVER['HTTPS'] = $old_https; + $_SERVER['SERVER_ADDR'] = $old_server_addr; } // -------------------------------------------------------------------- From f8deea583f0cb68a83a44d361c0db3c86f387f95 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 23 Oct 2015 13:49:21 +0300 Subject: [PATCH 4016/5397] Use proper randomness when generating CAPTCHAs --- system/helpers/captcha_helper.php | 89 ++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 2 deletions(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 201987ac87a..85bcfb5a092 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -125,9 +125,94 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = if (empty($word)) { $word = ''; - for ($i = 0, $mt_rand_max = strlen($pool) - 1; $i < $word_length; $i++) + $pool_length = strlen($pool); + $rand_max = $pool_length - 1; + + // PHP7 or a suitable polyfill + if (function_exists('random_int')) + { + try + { + for ($i = 0; $i < $word_length; $i++) + { + $word .= $pool[random_int(0, $rand_max)]; + } + } + catch (Exception $e) + { + // This means fallback to the next possible + // alternative to random_int() + $word = ''; + } + } + } + + if (empty($word)) + { + // Nobody will have a larger character pool than + // 256 characters, but let's handle it just in case ... + // + // No, I do not care that the fallback to mt_rand() can + // handle it; if you trigger this, you're very obviously + // trying to break it. -- Narf + if ($pool_length > 256) + { + return FALSE; + } + + // We'll try using the operating system's PRNG first, + // which we can access through CI_Security::get_random_bytes() + $security = get_instance()->security; + + // To avoid numerous get_random_bytes() calls, we'll + // just try fetching as much bytes as we need at once. + if (($bytes = $security->get_random_bytes($pool_length)) !== FALSE) + { + $byte_index = $word_index = 0; + while ($word_index < $word_length) + { + if (($rand_index = unpack('C', $bytes[$byte_index++])) > $rand_max) + { + // Was this the last byte we have? + // If so, try to fetch more. + if ($byte_index === $pool_length) + { + // No failures should be possible if + // the first get_random_bytes() call + // didn't return FALSE, but still ... + for ($i = 0; $i < 5; $i++) + { + if (($bytes = $security->get_random_bytes($pool_length)) === FALSE) + { + continue; + } + + $byte_index = 0; + break; + } + + if ($bytes === FALSE) + { + // Sadly, this means fallback to mt_rand() + $word = ''; + break; + } + } + + continue; + } + + $word .= $pool[$rand_index]; + $word_index++; + } + } + } + + if (empty($word)) + { + for ($i = 0; $i < $word_length; $i++) { - $word .= $pool[mt_rand(0, $mt_rand_max)]; + $word .= $pool[mt_rand(0, $rand_max)]; } } elseif ( ! is_string($word)) From 0abc55a22535586929fb146a81d1cee68dbccd10 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 31 Oct 2015 19:30:41 +0200 Subject: [PATCH 4017/5397] [ci skip] Update changelog, version & upgrade instructions --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/changelog.rst | 8 +++- user_guide_src/source/conf.py | 4 +- .../source/installation/upgrade_300.rst | 45 ++++++++++++++++++- .../source/installation/upgrade_303.rst | 43 +++++++++++++++++- 5 files changed, 96 insertions(+), 6 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 8cea813a246..5080dc6d174 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - define('CI_VERSION', '3.0.3-dev'); + define('CI_VERSION', '3.0.3'); /* * ------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f9f451d985b..d67ae4e8c80 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -5,7 +5,13 @@ Change Log Version 3.0.3 ============= -Release Date: Not Released +Release Date: October 31, 2015 + +- **Security** + + - Fixed an XSS attack vector in :doc:`Security Library ` method ``xss_clean()``. + - Changed :doc:`Config Library ` method ``base_url()`` to fallback to ``$_SERVER['SERVER_ADDR']`` when ``$config['base_url']`` is empty in order to avoid *Host* header injections. + - Changed :doc:`CAPTCHA Helper ` to use the operating system's PRNG when possible. - Database diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 46e033ec83f..031f95e2dce 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.0.3-dev' +version = '3.0.3' # The full version, including alpha/beta/rc tags. -release = '3.0.3-dev' +release = '3.0.3' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 4b3b408a708..a29f400f8fb 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -464,8 +464,51 @@ files and error messages format: Therefore you're encouraged to update its usage sooner rather than later. +************************************************************ +Step 19: Make sure your 'base_url' config value is not empty +************************************************************ + +When ``$config['base_url']`` is not set, CodeIgniter tries to automatically +detect what your website's base URL is. This is done purely for convenience +when you are starting development of a new application. + +Auto-detection is never reliable and also has security implications, which +is why you should **always** have it manually configured! + +One of the changes in CodeIgniter 3.0.3 is how this auto-detection works, +and more specifically it now falls back to the server's IP address instead +of the hostname requested by the client. Therefore, if you've ever relied +on auto-detection, it will change how your website works now. + +In case you need to allow e.g. multiple domains, or both http:// and +https:// prefixes to be dynamically used depending on the request, +remember that *application/config/config.php* is still a PHP script, in +which you can create this logic with a few lines of code. For example:: + + $allowed_domains = array('domain1.tld', 'domain2.tld'); + $default_domain = 'domain1.tld'; + + if (in_array($_SERVER['HTTP_HOST'], $allowed_domains, TRUE)) + { + $domain = $_SERVER['HTTP_HOST']; + } + else + { + $domain = $default_domain; + } + + if ( ! empty($_SERVER['HTTPS'])) + { + $config['base_url'] = 'https://'.$domain; + } + else + { + $config['base_url'] = 'http://'.$domain; + } + + **************************************************************** -Step 19: Remove usage of (previously) deprecated functionalities +Step 20: Remove usage of (previously) deprecated functionalities **************************************************************** In addition to the ``$autoload['core']`` configuration setting, there's a diff --git a/user_guide_src/source/installation/upgrade_303.rst b/user_guide_src/source/installation/upgrade_303.rst index a98eed0d439..d13a0fe4647 100644 --- a/user_guide_src/source/installation/upgrade_303.rst +++ b/user_guide_src/source/installation/upgrade_303.rst @@ -11,4 +11,45 @@ Step 1: Update your CodeIgniter files Replace all files and directories in your *system/* directory. .. note:: If you have any custom developed files in these directories, - please make copies of them first. \ No newline at end of file + please make copies of them first. + +Step 2: Make sure your 'base_url' config value is not empty +=========================================================== + +When ``$config['base_url']`` is not set, CodeIgniter tries to automatically +detect what your website's base URL is. This is done purely for convenience +when you are starting development of a new application. + +Auto-detection is never reliable and also has security implications, which +is why you should **always** have it manually configured! + +One of the changes in CodeIgniter 3.0.3 is how this auto-detection works, +and more specifically it now falls back to the server's IP address instead +of the hostname requested by the client. Therefore, if you've ever relied +on auto-detection, it will change how your website works now. + +In case you need to allow e.g. multiple domains, or both http:// and +https:// prefixes to be dynamically used depending on the request, +remember that *application/config/config.php* is still a PHP script, in +which you can create this logic with a few lines of code. For example:: + + $allowed_domains = array('domain1.tld', 'domain2.tld'); + $default_domain = 'domain1.tld'; + + if (in_array($_SERVER['HTTP_HOST'], $allowed_domains, TRUE)) + { + $domain = $_SERVER['HTTP_HOST']; + } + else + { + $domain = $default_domain; + } + + if ( ! empty($_SERVER['HTTPS'])) + { + $config['base_url'] = 'https://'.$domain; + } + else + { + $config['base_url'] = 'http://'.$domain; + } From 2cef9ba1fbd67ae423333f824a89ef0c77667224 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 31 Oct 2015 19:33:53 +0200 Subject: [PATCH 4018/5397] [ci skip] Update download link --- user_guide_src/source/installation/downloads.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 1249d14ecd8..0f21453b4ae 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,7 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.0.3-dev (Current version) `_ +- `CodeIgniter v3.0.3 (Current version) `_ - `CodeIgniter v3.0.2 `_ - `CodeIgniter v3.0.1 `_ - `CodeIgniter v3.0.0 `_ From ab3c383fb3535e55253271f210870cd9361d94c9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 4 Nov 2015 15:40:55 +0200 Subject: [PATCH 4019/5397] [ci skip] Start of 3.0.4 development --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/installation/downloads.rst | 3 ++- user_guide_src/source/installation/upgrade_304.rst | 14 ++++++++++++++ user_guide_src/source/installation/upgrading.rst | 1 + 5 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 user_guide_src/source/installation/upgrade_304.rst diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 5080dc6d174..79a23c4ca23 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - define('CI_VERSION', '3.0.3'); + define('CI_VERSION', '3.0.4-dev'); /* * ------------------------------------------------------ diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 031f95e2dce..a1ebb520506 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.0.3' +version = '3.0.4-dev' # The full version, including alpha/beta/rc tags. -release = '3.0.3' +release = '3.0.4-dev' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 0f21453b4ae..00c98ab23ce 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,8 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.0.3 (Current version) `_ +- `CodeIgniter v3.0.4-dev (Current version) `_ +- `CodeIgniter v3.0.3 `_ - `CodeIgniter v3.0.2 `_ - `CodeIgniter v3.0.1 `_ - `CodeIgniter v3.0.0 `_ diff --git a/user_guide_src/source/installation/upgrade_304.rst b/user_guide_src/source/installation/upgrade_304.rst new file mode 100644 index 00000000000..4d5bd2bb056 --- /dev/null +++ b/user_guide_src/source/installation/upgrade_304.rst @@ -0,0 +1,14 @@ +############################# +Upgrading from 3.0.3 to 3.0.4 +############################# + +Before performing an update you should take your site offline by +replacing the index.php file with a static one. + +Step 1: Update your CodeIgniter files +===================================== + +Replace all files and directories in your *system/* directory. + +.. note:: If you have any custom developed files in these directories, + please make copies of them first. diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index 010d1633e2e..dd777346d76 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -8,6 +8,7 @@ upgrading from. .. toctree:: :titlesonly: + Upgrading from 3.0.3 to 3.0.4 Upgrading from 3.0.2 to 3.0.3 Upgrading from 3.0.1 to 3.0.2 Upgrading from 3.0.0 to 3.0.1 From 6afbb3a9f186f912d5105aea704bb58c55931762 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 4 Nov 2015 15:50:31 +0200 Subject: [PATCH 4020/5397] [ci skip] Add 3.0.4 to changelog as well --- user_guide_src/source/changelog.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d67ae4e8c80..20d85a9ab40 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -2,6 +2,11 @@ Change Log ########## +Version 3.0.4 +============= + +Release Date: Not Released + Version 3.0.3 ============= From 939f1a27f3e70170326f6acbc50c0e1c96e52fd3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 4 Nov 2015 15:52:16 +0200 Subject: [PATCH 4021/5397] Fix #4212 --- system/database/DB_query_builder.php | 2 +- user_guide_src/source/changelog.rst | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index cf1100d279a..7a3d2f594ce 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1379,7 +1379,7 @@ public function count_all_results($table = '', $reset = TRUE) $this->from($table); } - $result = ($this->qb_distinct === TRUE) + $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_orderby)) ? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results") : $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 20d85a9ab40..f632f72dde9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,11 @@ Version 3.0.4 Release Date: Not Released +Bug fixes for 3.0.4 +------------------- + +- Fixed a bug (#4212) - :doc:`Query Builder ` method ``count_all_results()`` could fail if an ``ORDER BY`` condition is used. + Version 3.0.3 ============= From a9f7e8cfb16b53394a5f77393e4ab3e93ef9001e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 4 Nov 2015 15:50:31 +0200 Subject: [PATCH 4022/5397] [ci skip] Add 3.0.4 to changelog as well --- user_guide_src/source/changelog.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f28fd8930f5..77ccd7ce7fd 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,10 @@ Version 3.1.0 Release Date: Not Released +Version 3.0.4 +============= + +Release Date: Not Released Version 3.0.3 ============= From 0139e6a4a99cbe9b0cc06f394fa12d5691193b72 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 4 Nov 2015 22:42:17 +0200 Subject: [PATCH 4023/5397] [ci skip] Fix a false default-fallback bug in set_checkbox(), set_radio() Relevant: #4210 --- system/helpers/form_helper.php | 41 +++++++++++++++++++++++------ user_guide_src/source/changelog.rst | 1 + 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index fd807769a5d..37dafd9137a 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -769,12 +769,11 @@ function set_checkbox($field, $value = '', $default = FALSE) { return $CI->form_validation->set_checkbox($field, $value, $default); } - elseif (($input = $CI->input->post($field, FALSE)) === NULL) - { - return ($default === TRUE) ? ' checked="checked"' : ''; - } + // Form inputs are always strings ... $value = (string) $value; + $input = $CI->input->post($field, FALSE); + if (is_array($input)) { // Note: in_array('', array(0)) returns TRUE, do not use it @@ -789,7 +788,13 @@ function set_checkbox($field, $value = '', $default = FALSE) return ''; } - return ($input === $value) ? ' checked="checked"' : ''; + // Unchecked checkbox and radio inputs are not even submitted by browsers ... + if ($CI->input->method() === 'post') + { + return ($input === 'value') ? ' checked="checked"' : ''; + } + + return ($default === TRUE) ? ' checked="checked"' : ''; } } @@ -816,12 +821,32 @@ function set_radio($field, $value = '', $default = FALSE) { return $CI->form_validation->set_radio($field, $value, $default); } - elseif (($input = $CI->input->post($field, FALSE)) === NULL) + + // Form inputs are always strings ... + $value = (string) $value; + $input = $CI->input->post($field, FALSE); + + if (is_array($input)) + { + // Note: in_array('', array(0)) returns TRUE, do not use it + foreach ($input as &$v) + { + if ($value === $v) + { + return ' checked="checked"'; + } + } + + return ''; + } + + // Unchecked checkbox and radio inputs are not even submitted by browsers ... + if ($CI->input->method() === 'post') { - return ($default === TRUE) ? ' checked="checked"' : ''; + return ($input === 'value') ? ' checked="checked"' : ''; } - return ($input === (string) $value) ? ' checked="checked"' : ''; + return ($default === TRUE) ? ' checked="checked"' : ''; } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f632f72dde9..2b0f51bee79 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -11,6 +11,7 @@ Bug fixes for 3.0.4 ------------------- - Fixed a bug (#4212) - :doc:`Query Builder ` method ``count_all_results()`` could fail if an ``ORDER BY`` condition is used. +- Fixed a bug where :doc:`Form Helper ` functions `set_checkbox()`, `set_radio()` didn't "uncheck" inputs on a submitted form if the default state is "checked". Version 3.0.3 ============= From 845ed89709f84d56edeeb91e877f585a5798006d Mon Sep 17 00:00:00 2001 From: Nate Silva Date: Thu, 5 Nov 2015 13:43:53 -0800 Subject: [PATCH 4024/5397] Build base_url correctly if SERVER_ADDR is IPv6 --- system/core/Config.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/system/core/Config.php b/system/core/Config.php index 0264776f98c..dfef8dbe4db 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -90,7 +90,15 @@ public function __construct() { if (isset($_SERVER['SERVER_ADDR'])) { - $base_url = (is_https() ? 'https' : 'http').'://'.$_SERVER['SERVER_ADDR'] + if ((bool) filter_var($_SERVER['SERVER_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) + { + $server_addr = '[' . $_SERVER['SERVER_ADDR'] . ']'; + } + else + { + $server_addr = $_SERVER['SERVER_ADDR']; + } + $base_url = (is_https() ? 'https' : 'http').'://'.$server_addr .substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME']))); } else From 76d5f881ecd0c70759cbebc9c5c622ef7d716aa8 Mon Sep 17 00:00:00 2001 From: Rafael Schwemmer Date: Thu, 5 Nov 2015 22:49:17 +0100 Subject: [PATCH 4025/5397] Added MIME types for JPEG2000 Added all MIME types and file extensions to support JPEG2000 images as allowed file type. --- application/config/mimes.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/application/config/mimes.php b/application/config/mimes.php index 8eff4d2d516..a9b82008fc5 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -78,6 +78,14 @@ 'jpeg' => array('image/jpeg', 'image/pjpeg'), 'jpg' => array('image/jpeg', 'image/pjpeg'), 'jpe' => array('image/jpeg', 'image/pjpeg'), + 'jp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'j2k' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpf' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpg2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpx' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpm' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'mj2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'mjp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), 'png' => array('image/png', 'image/x-png'), 'tiff' => 'image/tiff', 'tif' => 'image/tiff', From 871811e81af949c52604eb1df8394c0071dba10c Mon Sep 17 00:00:00 2001 From: Rafael Schwemmer Date: Fri, 6 Nov 2015 10:22:00 +0100 Subject: [PATCH 4026/5397] Fixed white-space for JPEG2000 MIME types Replaced spaces by tabs to be consistent with rest of the code --- application/config/mimes.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index a9b82008fc5..5e43773a829 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -78,14 +78,14 @@ 'jpeg' => array('image/jpeg', 'image/pjpeg'), 'jpg' => array('image/jpeg', 'image/pjpeg'), 'jpe' => array('image/jpeg', 'image/pjpeg'), - 'jp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), - 'j2k' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), - 'jpf' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), - 'jpg2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), - 'jpx' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), - 'jpm' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), - 'mj2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), - 'mjp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'j2k' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpf' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpg2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpx' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpm' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'mj2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'mjp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), 'png' => array('image/png', 'image/x-png'), 'tiff' => 'image/tiff', 'tif' => 'image/tiff', From ac66cab946334f76dac699dd67d25225e9b3548c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 6 Nov 2015 16:04:33 +0200 Subject: [PATCH 4027/5397] Merge pull request #4218 from schwemmer/develop [ci skip] Added MIME types for JPEG2000 --- application/config/mimes.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/application/config/mimes.php b/application/config/mimes.php index 1f591ba6b5a..aa3b1836ad8 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -77,6 +77,14 @@ 'jpeg' => array('image/jpeg', 'image/pjpeg'), 'jpg' => array('image/jpeg', 'image/pjpeg'), 'jpe' => array('image/jpeg', 'image/pjpeg'), + 'jp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'j2k' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpf' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpg2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpx' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpm' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'mj2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'mjp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), 'png' => array('image/png', 'image/x-png'), 'tiff' => 'image/tiff', 'tif' => 'image/tiff', From 4ccf88dc97d009e3421b79c351e426d31fc11b41 Mon Sep 17 00:00:00 2001 From: Nate Silva Date: Fri, 6 Nov 2015 07:06:28 -0800 Subject: [PATCH 4028/5397] Simpler way to detect an IPv6 address (strpos) --- system/core/Config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Config.php b/system/core/Config.php index dfef8dbe4db..87ed32acaf8 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -90,7 +90,7 @@ public function __construct() { if (isset($_SERVER['SERVER_ADDR'])) { - if ((bool) filter_var($_SERVER['SERVER_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) + if (strpos($_SERVER['SERVER_ADDR'], ':') !== FALSE) { $server_addr = '[' . $_SERVER['SERVER_ADDR'] . ']'; } From e735b1dfe14d1d6d955d142a30e8c83ba900fe2b Mon Sep 17 00:00:00 2001 From: Nate Silva Date: Fri, 6 Nov 2015 07:07:11 -0800 Subject: [PATCH 4029/5397] Tweak to match CI coding style --- system/core/Config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Config.php b/system/core/Config.php index 87ed32acaf8..1d2a0d1555f 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -92,7 +92,7 @@ public function __construct() { if (strpos($_SERVER['SERVER_ADDR'], ':') !== FALSE) { - $server_addr = '[' . $_SERVER['SERVER_ADDR'] . ']'; + $server_addr = '['.$_SERVER['SERVER_ADDR'].']'; } else { From ae480daecb0f7aeed017c5cc5a67cc39b90be570 Mon Sep 17 00:00:00 2001 From: Nate Silva Date: Fri, 6 Nov 2015 07:10:44 -0800 Subject: [PATCH 4030/5397] Minor formatting: add empty line after else close --- system/core/Config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/core/Config.php b/system/core/Config.php index 1d2a0d1555f..c507f342ca1 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -98,6 +98,7 @@ public function __construct() { $server_addr = $_SERVER['SERVER_ADDR']; } + $base_url = (is_https() ? 'https' : 'http').'://'.$server_addr .substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME']))); } From dd11297837f50ea2fd37f891cb8b4408f84f53e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20Stollfu=C3=9F?= Date: Sun, 8 Nov 2015 20:52:25 +0100 Subject: [PATCH 4031/5397] CI_DB_driver->simple_query() discard return of CI_DB_driver->initialize() when db_debug = FALSE #4223 --- system/database/DB_driver.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 0ea679432b1..6797df0f878 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -774,7 +774,10 @@ public function simple_query($sql) { if ( ! $this->conn_id) { - $this->initialize(); + if( !$this->initialize() ) + { + return FALSE; + } } return $this->_execute($sql); From 20edad807645a42df7f4b0baa6e6a2eb29bd2b0c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 Nov 2015 10:56:30 +0200 Subject: [PATCH 4032/5397] Merge pull request #4217 from natesilva/fix-ipv6-base_url Build base_url correctly if SERVER_ADDR is IPv6 --- system/core/Config.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/system/core/Config.php b/system/core/Config.php index 0264776f98c..c507f342ca1 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -90,7 +90,16 @@ public function __construct() { if (isset($_SERVER['SERVER_ADDR'])) { - $base_url = (is_https() ? 'https' : 'http').'://'.$_SERVER['SERVER_ADDR'] + if (strpos($_SERVER['SERVER_ADDR'], ':') !== FALSE) + { + $server_addr = '['.$_SERVER['SERVER_ADDR'].']'; + } + else + { + $server_addr = $_SERVER['SERVER_ADDR']; + } + + $base_url = (is_https() ? 'https' : 'http').'://'.$server_addr .substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME']))); } else From 4cda80715966ddb28815b69b6e67ec79b10d3d31 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 Nov 2015 11:00:32 +0200 Subject: [PATCH 4033/5397] [ci skip] Add changelog entry for PR #4217 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2b0f51bee79..cb955e83325 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -12,6 +12,7 @@ Bug fixes for 3.0.4 - Fixed a bug (#4212) - :doc:`Query Builder ` method ``count_all_results()`` could fail if an ``ORDER BY`` condition is used. - Fixed a bug where :doc:`Form Helper ` functions `set_checkbox()`, `set_radio()` didn't "uncheck" inputs on a submitted form if the default state is "checked". +- Fixed a bug (#4217) - :doc:`Config Library ` method ``base_url()`` didn't use proper formatting for IPv6 when it falls back to ``$_SERVER['SERVER_ADDR']``. Version 3.0.3 ============= From 06381b6307aa23f5e0fbe6669df0695d712ce69a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20Stollfu=C3=9F?= Date: Mon, 9 Nov 2015 10:15:29 +0100 Subject: [PATCH 4034/5397] Fixed PHP code style * fixed PHP code style --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 6797df0f878..88b41fa5e98 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -774,7 +774,7 @@ public function simple_query($sql) { if ( ! $this->conn_id) { - if( !$this->initialize() ) + if( ! $this->initialize()) { return FALSE; } From 2fe1a2389aa13c3acde7fb42ab35e79504e89f75 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 Nov 2015 11:24:19 +0200 Subject: [PATCH 4035/5397] [ci skip] Fix an infinite loop in captcha helper --- system/helpers/captcha_helper.php | 3 ++- user_guide_src/source/changelog.rst | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 85bcfb5a092..03c1dd8525c 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -171,7 +171,8 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = $byte_index = $word_index = 0; while ($word_index < $word_length) { - if (($rand_index = unpack('C', $bytes[$byte_index++])) > $rand_max) + list(, $rand_index) = unpack('C', $bytes[$byte_index++]); + if ($rand_index > $rand_max) { // Was this the last byte we have? // If so, try to fetch more. diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index cb955e83325..cdde4fa943a 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -13,6 +13,7 @@ Bug fixes for 3.0.4 - Fixed a bug (#4212) - :doc:`Query Builder ` method ``count_all_results()`` could fail if an ``ORDER BY`` condition is used. - Fixed a bug where :doc:`Form Helper ` functions `set_checkbox()`, `set_radio()` didn't "uncheck" inputs on a submitted form if the default state is "checked". - Fixed a bug (#4217) - :doc:`Config Library ` method ``base_url()`` didn't use proper formatting for IPv6 when it falls back to ``$_SERVER['SERVER_ADDR']``. +- Fixed a bug where :doc:`CAPTCHA Helper ` entered an infinite loop while generating a random string. Version 3.0.3 ============= From b880069aa8521291ebedc57d5c229bc6f72e0426 Mon Sep 17 00:00:00 2001 From: Hongyi Zhang Date: Mon, 9 Nov 2015 02:24:27 -0800 Subject: [PATCH 4036/5397] modify and add test cases for Loader class to test more exceptions Signed-off-by: Hongyi Zhang --- tests/codeigniter/core/Loader_test.php | 29 ++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index 889ab92e4cd..db5088d8068 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -48,11 +48,9 @@ public function test_library() // Test a string given to params $this->assertInstanceOf('CI_Loader', $this->load->library($lib, ' ')); - // Create library w/o class - $lib = 'bad_test_lib'; - $this->ci_vfs_create($lib, '', $this->ci_base_root, 'libraries'); + // test non existent lib + $lib = 'non_existent_test_lib'; - // Test non-existent class $this->setExpectedException( 'RuntimeException', 'CI Error: Unable to load the requested class: '.ucfirst($lib) @@ -62,6 +60,19 @@ public function test_library() // -------------------------------------------------------------------- + public function test_bad_library() + { + $lib = 'bad_test_lib'; + $this->ci_vfs_create(ucfirst($lib), '', $this->ci_app_root, 'libraries'); + $this->setExpectedException( + 'RuntimeException', + 'CI Error: Non-existent class: '.ucfirst($lib) + ); + $this->assertInstanceOf('CI_Loader', $this->load->library($lib)); + } + + // -------------------------------------------------------------------- + public function test_library_extension() { // Create library and extension in VFS @@ -131,6 +142,16 @@ public function test_library_config() // Test is_loaded $this->assertEquals($obj, $this->load->is_loaded(ucfirst($lib))); + + // Test to load another class with the same object name + $lib = 'another_test_lib'; + $class = ucfirst($lib); + $this->ci_vfs_create(ucfirst($lib), 'ci_app_root, 'libraries'); + $this->setExpectedException( + 'RuntimeException', + "CI Error: Resource '".$obj."' already exists and is not a ".$class." instance." + ); + $this->load->library($lib, NULL, $obj); } // -------------------------------------------------------------------- From cebb13b988e0e4d352d90170e064d1affbcf1697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20Stollfu=C3=9F?= Date: Mon, 9 Nov 2015 12:26:04 +0100 Subject: [PATCH 4037/5397] Fixed PHP code style part 2 * added missing space character --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 88b41fa5e98..25e70ec3f2b 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -774,7 +774,7 @@ public function simple_query($sql) { if ( ! $this->conn_id) { - if( ! $this->initialize()) + if ( ! $this->initialize()) { return FALSE; } From 39105007580edc46bffe8f628e6bef91a9f4dd04 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 Nov 2015 14:05:02 +0200 Subject: [PATCH 4038/5397] Merge pull request #4223 from j0inty/develop CI_DB_driver->simple_query() to check initialize() return value --- system/database/DB_driver.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 0ea679432b1..25e70ec3f2b 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -774,7 +774,10 @@ public function simple_query($sql) { if ( ! $this->conn_id) { - $this->initialize(); + if ( ! $this->initialize()) + { + return FALSE; + } } return $this->_execute($sql); From 3462f570526178d6dba6d6e0135bd783dcd3299f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 Nov 2015 14:07:51 +0200 Subject: [PATCH 4039/5397] [ci skip] Add changelog entry for PR #4223 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index cdde4fa943a..efb09f24f06 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -14,6 +14,7 @@ Bug fixes for 3.0.4 - Fixed a bug where :doc:`Form Helper ` functions `set_checkbox()`, `set_radio()` didn't "uncheck" inputs on a submitted form if the default state is "checked". - Fixed a bug (#4217) - :doc:`Config Library ` method ``base_url()`` didn't use proper formatting for IPv6 when it falls back to ``$_SERVER['SERVER_ADDR']``. - Fixed a bug where :doc:`CAPTCHA Helper ` entered an infinite loop while generating a random string. +- Fixed a bug (#4223) - :doc:`Database ` method ``simple_query()`` blindly executes queries without checking if the connection was initialized properly. Version 3.0.3 ============= From fe4c76e77bc9640872d34a874780031cf90dd2bd Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 Nov 2015 12:55:07 +0200 Subject: [PATCH 4040/5397] Merge pull request #4225 from zhanghongyi/loader-test Improve Loader test cases for libraries --- tests/codeigniter/core/Loader_test.php | 29 ++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index 889ab92e4cd..db5088d8068 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -48,11 +48,9 @@ public function test_library() // Test a string given to params $this->assertInstanceOf('CI_Loader', $this->load->library($lib, ' ')); - // Create library w/o class - $lib = 'bad_test_lib'; - $this->ci_vfs_create($lib, '', $this->ci_base_root, 'libraries'); + // test non existent lib + $lib = 'non_existent_test_lib'; - // Test non-existent class $this->setExpectedException( 'RuntimeException', 'CI Error: Unable to load the requested class: '.ucfirst($lib) @@ -62,6 +60,19 @@ public function test_library() // -------------------------------------------------------------------- + public function test_bad_library() + { + $lib = 'bad_test_lib'; + $this->ci_vfs_create(ucfirst($lib), '', $this->ci_app_root, 'libraries'); + $this->setExpectedException( + 'RuntimeException', + 'CI Error: Non-existent class: '.ucfirst($lib) + ); + $this->assertInstanceOf('CI_Loader', $this->load->library($lib)); + } + + // -------------------------------------------------------------------- + public function test_library_extension() { // Create library and extension in VFS @@ -131,6 +142,16 @@ public function test_library_config() // Test is_loaded $this->assertEquals($obj, $this->load->is_loaded(ucfirst($lib))); + + // Test to load another class with the same object name + $lib = 'another_test_lib'; + $class = ucfirst($lib); + $this->ci_vfs_create(ucfirst($lib), 'ci_app_root, 'libraries'); + $this->setExpectedException( + 'RuntimeException', + "CI Error: Resource '".$obj."' already exists and is not a ".$class." instance." + ); + $this->load->library($lib, NULL, $obj); } // -------------------------------------------------------------------- From 8f75f7fdd14acef06f591ce03163ef5937c3b612 Mon Sep 17 00:00:00 2001 From: Claudio Galdiolo Date: Wed, 11 Nov 2015 10:20:42 -0500 Subject: [PATCH 4041/5397] [ci skip] Make it clear that PHP <5.5 usage is discouraged PHP 5.4 reached end of life Signed-off-by: Claudio Galdiolo --- contributing.md | 2 +- readme.rst | 2 +- user_guide_src/source/contributing/index.rst | 2 +- user_guide_src/source/general/requirements.rst | 2 +- user_guide_src/source/general/styleguide.rst | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contributing.md b/contributing.md index 5a25698bf76..f4d6705ed42 100644 --- a/contributing.md +++ b/contributing.md @@ -29,7 +29,7 @@ If you change anything that requires a change to documentation then you will nee ### Compatibility -CodeIgniter recommends PHP 5.4 or newer to be used, but it should be +CodeIgniter recommends PHP 5.5 or newer to be used, but it should be compatible with PHP 5.2.4 so all code supplied must stick to this requirement. If PHP 5.3 (and above) functions or features are used then there must be a fallback for PHP 5.2.4. diff --git a/readme.rst b/readme.rst index 2e35d7223f6..64ace3a3948 100644 --- a/readme.rst +++ b/readme.rst @@ -29,7 +29,7 @@ guide change log `_ version 5.4 or newer is recommended. +`PHP `_ version 5.5 or newer is recommended. It should work on 5.2.4 as well, but we strongly advise you NOT to run such old versions of PHP, because of potential security and performance diff --git a/user_guide_src/source/general/styleguide.rst b/user_guide_src/source/general/styleguide.rst index 7704a59c5bd..b21246b4f40 100644 --- a/user_guide_src/source/general/styleguide.rst +++ b/user_guide_src/source/general/styleguide.rst @@ -345,7 +345,7 @@ inability for CodeIgniter to send proper headers. Compatibility ============= -CodeIgniter recommends PHP 5.4 or newer to be used, but it should be +CodeIgniter recommends PHP 5.5 or newer to be used, but it should be compatible with PHP 5.2.4. Your code must either be compatible with this requirement, provide a suitable fallback, or be an optional feature that dies quietly without affecting a user's application. From 01fb0d44167196ab0cb5bc0a3f1385204f932992 Mon Sep 17 00:00:00 2001 From: Craig Johnson Date: Thu, 12 Nov 2015 23:44:17 +0530 Subject: [PATCH 4042/5397] Grammar correction in database configuration guide "it" changed to "in" on line 10. "in" seems like the correct word to be used there. Small change. --- user_guide_src/source/database/configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/database/configuration.rst b/user_guide_src/source/database/configuration.rst index 8026be63ab4..e231a7d6af5 100644 --- a/user_guide_src/source/database/configuration.rst +++ b/user_guide_src/source/database/configuration.rst @@ -7,7 +7,7 @@ connection values (username, password, database name, etc.). The config file is located at application/config/database.php. You can also set database connection values for specific :doc:`environments <../libraries/config>` by placing **database.php** -it the respective environment config folder. +in the respective environment config folder. The config settings are stored in a multi-dimensional array with this prototype:: From 874096c1f652f25b7f3e89e8c6b45b13c8a5e0e8 Mon Sep 17 00:00:00 2001 From: sskaje Date: Sat, 14 Nov 2015 11:55:36 +0800 Subject: [PATCH 4043/5397] add unix socket support to redis session driver --- .../Session/drivers/Session_redis_driver.php | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index b098cc44162..f7406797832 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -85,10 +85,24 @@ public function __construct(&$params) { log_message('error', 'Session: No Redis save path configured.'); } + elseif (strpos($this->_config['save_path'], 'unix://') === 0 && preg_match('#(?:unix://)?([^:?]+)(\?.+)?#', $this->_config['save_path'], $matches)) + { + isset($matches[2]) OR $matches[2] = ''; // Just to avoid undefined index notices below + $this->_config['save_path'] = array( + 'type' => 'unix', + 'path' => $matches[1], + 'password' => preg_match('#auth=([^\s&]+)#', $matches[2], $match) ? $match[1] : NULL, + 'database' => preg_match('#database=(\d+)#', $matches[2], $match) ? (int) $match[1] : NULL, + 'timeout' => preg_match('#timeout=(\d+\.\d+)#', $matches[2], $match) ? (float) $match[1] : NULL + ); + + preg_match('#prefix=([^\s&]+)#', $matches[3], $match) && $this->_key_prefix = $match[1]; + } elseif (preg_match('#(?:tcp://)?([^:?]+)(?:\:(\d+))?(\?.+)?#', $this->_config['save_path'], $matches)) { isset($matches[3]) OR $matches[3] = ''; // Just to avoid undefined index notices below $this->_config['save_path'] = array( + 'type' => 'tcp', 'host' => $matches[1], 'port' => empty($matches[2]) ? NULL : $matches[2], 'password' => preg_match('#auth=([^\s&]+)#', $matches[3], $match) ? $match[1] : NULL, @@ -128,7 +142,11 @@ public function open($save_path, $name) } $redis = new Redis(); - if ( ! $redis->connect($this->_config['save_path']['host'], $this->_config['save_path']['port'], $this->_config['save_path']['timeout'])) + if ($this->_config['save_path']['type'] == 'unix' && !$redis->connect($this->_config['save_path']['path'])) + { + log_message('error', 'Session: Unable to connect to Redis with the configured settings.'); + } + else if ( ! $redis->connect($this->_config['save_path']['host'], $this->_config['save_path']['port'], $this->_config['save_path']['timeout'])) { log_message('error', 'Session: Unable to connect to Redis with the configured settings.'); } From 58d6854ad29b97061a1eb2fbd96ac57c29a13a3a Mon Sep 17 00:00:00 2001 From: Suhindra Date: Sat, 14 Nov 2015 15:04:00 +0700 Subject: [PATCH 4044/5397] Added and Updated MIME types for Flash Video Update 'f4v' entry and add 'flv' to support Flash Video as allowed file type. --- application/config/mimes.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index aa3b1836ad8..957dc05d8a7 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -137,7 +137,8 @@ '3gp' => array('video/3gp', 'video/3gpp'), 'mp4' => 'video/mp4', 'm4a' => 'audio/x-m4a', - 'f4v' => 'video/mp4', + 'f4v' => array('video/mp4', 'video/x-f4v'), + 'flv' => 'video/x-flv', 'webm' => 'video/webm', 'aac' => 'audio/x-acc', 'm4u' => 'application/vnd.mpegurl', From 9703a0bbac81477365da7012a6a47d71c547cf96 Mon Sep 17 00:00:00 2001 From: kemeng Date: Mon, 16 Nov 2015 18:35:43 +0800 Subject: [PATCH 4045/5397] fixed a typo in unix socket parameter; change coding style to match CI; fix an elseif --- .../Session/drivers/Session_redis_driver.php | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index f7406797832..fe82ca91777 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -85,7 +85,7 @@ public function __construct(&$params) { log_message('error', 'Session: No Redis save path configured.'); } - elseif (strpos($this->_config['save_path'], 'unix://') === 0 && preg_match('#(?:unix://)?([^:?]+)(\?.+)?#', $this->_config['save_path'], $matches)) + elseif (preg_match('#^unix://([^\?]+)(\?.+)?$#', $this->_config['save_path'], $matches)) { isset($matches[2]) OR $matches[2] = ''; // Just to avoid undefined index notices below $this->_config['save_path'] = array( @@ -96,7 +96,7 @@ public function __construct(&$params) 'timeout' => preg_match('#timeout=(\d+\.\d+)#', $matches[2], $match) ? (float) $match[1] : NULL ); - preg_match('#prefix=([^\s&]+)#', $matches[3], $match) && $this->_key_prefix = $match[1]; + preg_match('#prefix=([^\s&]+)#', $matches[2], $match) && $this->_key_prefix = $match[1]; } elseif (preg_match('#(?:tcp://)?([^:?]+)(?:\:(\d+))?(\?.+)?#', $this->_config['save_path'], $matches)) { @@ -142,15 +142,19 @@ public function open($save_path, $name) } $redis = new Redis(); - if ($this->_config['save_path']['type'] == 'unix' && !$redis->connect($this->_config['save_path']['path'])) + if ($this->_config['save_path']['type'] == 'unix') { - log_message('error', 'Session: Unable to connect to Redis with the configured settings.'); + if (! $redis->connect($this->_config['save_path']['path'])) + { + log_message('error', 'Session: Unable to connect to Redis with the configured settings.'); + } } - else if ( ! $redis->connect($this->_config['save_path']['host'], $this->_config['save_path']['port'], $this->_config['save_path']['timeout'])) + elseif (! $redis->connect($this->_config['save_path']['host'], $this->_config['save_path']['port'], $this->_config['save_path']['timeout'])) { log_message('error', 'Session: Unable to connect to Redis with the configured settings.'); } - elseif (isset($this->_config['save_path']['password']) && ! $redis->auth($this->_config['save_path']['password'])) + + if (isset($this->_config['save_path']['password']) && ! $redis->auth($this->_config['save_path']['password'])) { log_message('error', 'Session: Unable to authenticate to Redis instance.'); } From 47c37de5ec5f673b9db13a3c0f4d899fd651d703 Mon Sep 17 00:00:00 2001 From: kemeng Date: Mon, 16 Nov 2015 18:52:37 +0800 Subject: [PATCH 4046/5397] Spaces around ! . Changelog entry in 3.1.0. --- system/libraries/Session/drivers/Session_redis_driver.php | 4 ++-- user_guide_src/source/changelog.rst | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index fe82ca91777..44ffddc4b5f 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -144,12 +144,12 @@ public function open($save_path, $name) $redis = new Redis(); if ($this->_config['save_path']['type'] == 'unix') { - if (! $redis->connect($this->_config['save_path']['path'])) + if ( ! $redis->connect($this->_config['save_path']['path'])) { log_message('error', 'Session: Unable to connect to Redis with the configured settings.'); } } - elseif (! $redis->connect($this->_config['save_path']['host'], $this->_config['save_path']['port'], $this->_config['save_path']['timeout'])) + elseif ( ! $redis->connect($this->_config['save_path']['host'], $this->_config['save_path']['port'], $this->_config['save_path']['timeout'])) { log_message('error', 'Session: Unable to connect to Redis with the configured settings.'); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 77ccd7ce7fd..6c11bf3d767 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,11 @@ Version 3.1.0 Release Date: Not Released +- Session + + - Add unix socket support to redis session driver. + + Version 3.0.4 ============= From b06b5c46ef59534cb3d0eb7e9b95c0c5720ee5e5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 16 Nov 2015 13:37:58 +0200 Subject: [PATCH 4047/5397] Fix #4244 --- system/libraries/Email.php | 31 ++++++++++++++++++++++++++--- user_guide_src/source/changelog.rst | 1 + 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index ebff7567a13..034586ac956 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1469,6 +1469,20 @@ protected function _build_message() */ protected function _prep_quoted_printable($str) { + // ASCII code numbers for "safe" characters that can always be + // used literally, without encoding, as described in RFC 2049. + // http://www.ietf.org/rfc/rfc2049.txt + static $ascii_safe_chars = array( + // ' ( ) + , - . / : = ? + 39, 40, 41, 43, 44, 45, 46, 47, 58, 61, 63, + // numbers + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + // upper-case letters + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + // lower-case letters + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122 + ); + // We are intentionally wrapping so mail servers will encode characters // properly and MUAs will behave, so {unwrap} must go! $str = str_replace(array('{unwrap}', '{/unwrap}'), '', $str); @@ -1516,14 +1530,25 @@ protected function _prep_quoted_printable($str) $ascii = ord($char); // Convert spaces and tabs but only if it's the end of the line - if ($i === ($length - 1) && ($ascii === 32 OR $ascii === 9)) + if ($ascii === 32 OR $ascii === 9) { - $char = $escape.sprintf('%02s', dechex($ascii)); + if ($i === ($length - 1)) + { + $char = $escape.sprintf('%02s', dechex($ascii)); + } } - elseif ($ascii === 61) // encode = signs + // DO NOT move this below the $ascii_safe_chars line! + // + // = (equals) signs are allowed by RFC2049, but must be encoded + // as they are the encoding delimiter! + elseif ($ascii === 61) { $char = $escape.strtoupper(sprintf('%02s', dechex($ascii))); // =3D } + elseif ( ! in_array($ascii, $ascii_safe_chars, TRUE)) + { + $char = $escape.strtoupper(sprintf('%02s', dechex($ascii))); + } // If we're at the character limit, add the line to the output, // reset our temp variable, and keep on chuggin' diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index efb09f24f06..1d111b16166 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -15,6 +15,7 @@ Bug fixes for 3.0.4 - Fixed a bug (#4217) - :doc:`Config Library ` method ``base_url()`` didn't use proper formatting for IPv6 when it falls back to ``$_SERVER['SERVER_ADDR']``. - Fixed a bug where :doc:`CAPTCHA Helper ` entered an infinite loop while generating a random string. - Fixed a bug (#4223) - :doc:`Database ` method ``simple_query()`` blindly executes queries without checking if the connection was initialized properly. +- Fixed a bug (#4244) - :doc:`Email Library ` could improperly use "unsafe" US-ASCII characters during Quoted-printable encoding. Version 3.0.3 ============= From e9e4ab00991343ba94f9542c1a6f18a42b559257 Mon Sep 17 00:00:00 2001 From: kemeng Date: Mon, 16 Nov 2015 20:03:24 +0800 Subject: [PATCH 4048/5397] do not try to auth/select db on redis connect failure --- .../Session/drivers/Session_redis_driver.php | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index 44ffddc4b5f..8f9bcce24f3 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -141,31 +141,37 @@ public function open($save_path, $name) return FALSE; } + $connected = TRUE; $redis = new Redis(); if ($this->_config['save_path']['type'] == 'unix') { if ( ! $redis->connect($this->_config['save_path']['path'])) { log_message('error', 'Session: Unable to connect to Redis with the configured settings.'); + $connected = FALSE; } } elseif ( ! $redis->connect($this->_config['save_path']['host'], $this->_config['save_path']['port'], $this->_config['save_path']['timeout'])) { log_message('error', 'Session: Unable to connect to Redis with the configured settings.'); + $connected = FALSE; } - if (isset($this->_config['save_path']['password']) && ! $redis->auth($this->_config['save_path']['password'])) + if ($connected) { - log_message('error', 'Session: Unable to authenticate to Redis instance.'); - } - elseif (isset($this->_config['save_path']['database']) && ! $redis->select($this->_config['save_path']['database'])) - { - log_message('error', 'Session: Unable to select Redis database with index '.$this->_config['save_path']['database']); - } - else - { - $this->_redis = $redis; - return TRUE; + if (isset($this->_config['save_path']['password']) && ! $redis->auth($this->_config['save_path']['password'])) + { + log_message('error', 'Session: Unable to authenticate to Redis instance.'); + } + elseif (isset($this->_config['save_path']['database']) && ! $redis->select($this->_config['save_path']['database'])) + { + log_message('error', 'Session: Unable to select Redis database with index '.$this->_config['save_path']['database']); + } + else + { + $this->_redis = $redis; + return TRUE; + } } return FALSE; From 9e2c7b9dd7e87a94c5a3696bc326cbbec5da7bb8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 16 Nov 2015 15:44:24 +0200 Subject: [PATCH 4049/5397] [ci skip] Fix #4245 --- system/database/DB_forge.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index f9cf76a1462..d2302b2f207 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -781,7 +781,7 @@ protected function _process_fields($create_table = FALSE) case 'SET': $attributes['CONSTRAINT'] = $this->db->escape($attributes['CONSTRAINT']); $field['length'] = is_array($attributes['CONSTRAINT']) - ? "('".implode("','", $attributes['CONSTRAINT'])."')" + ? "(".implode(",", $attributes['CONSTRAINT']).")" : '('.$attributes['CONSTRAINT'].')'; break; default: diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1d111b16166..b0c4055b5ff 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -16,6 +16,7 @@ Bug fixes for 3.0.4 - Fixed a bug where :doc:`CAPTCHA Helper ` entered an infinite loop while generating a random string. - Fixed a bug (#4223) - :doc:`Database ` method ``simple_query()`` blindly executes queries without checking if the connection was initialized properly. - Fixed a bug (#4244) - :doc:`Email Library ` could improperly use "unsafe" US-ASCII characters during Quoted-printable encoding. +- Fixed a bug (#4245) - :doc:`Database Forge ` couldn't properly handle ``SET`` and ``ENUM`` type fields with string values. Version 3.0.3 ============= From 0f6e5bc4d356680bae470f05ccb9e115dd57422e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 16 Nov 2015 16:17:07 +0200 Subject: [PATCH 4050/5397] [ci skip] Polish changes from PR #4240 --- .../Session/drivers/Session_redis_driver.php | 71 +++++++++---------- user_guide_src/source/changelog.rst | 4 +- 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index 8f9bcce24f3..4fa6c28b343 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -85,41 +85,39 @@ public function __construct(&$params) { log_message('error', 'Session: No Redis save path configured.'); } - elseif (preg_match('#^unix://([^\?]+)(\?.+)?$#', $this->_config['save_path'], $matches)) + elseif (preg_match('#^unix://([^\?]+)(?\?.+)?$#', $this->_config['save_path'], $matches)) { - isset($matches[2]) OR $matches[2] = ''; // Just to avoid undefined index notices below - $this->_config['save_path'] = array( - 'type' => 'unix', - 'path' => $matches[1], - 'password' => preg_match('#auth=([^\s&]+)#', $matches[2], $match) ? $match[1] : NULL, - 'database' => preg_match('#database=(\d+)#', $matches[2], $match) ? (int) $match[1] : NULL, - 'timeout' => preg_match('#timeout=(\d+\.\d+)#', $matches[2], $match) ? (float) $match[1] : NULL - ); - - preg_match('#prefix=([^\s&]+)#', $matches[2], $match) && $this->_key_prefix = $match[1]; + $save_path = array('path' => $matches[1]); } - elseif (preg_match('#(?:tcp://)?([^:?]+)(?:\:(\d+))?(\?.+)?#', $this->_config['save_path'], $matches)) + elseif (preg_match('#(?:tcp://)?([^:?]+)(?:\:(\d+))?(?\?.+)?#', $this->_config['save_path'], $matches)) { - isset($matches[3]) OR $matches[3] = ''; // Just to avoid undefined index notices below - $this->_config['save_path'] = array( - 'type' => 'tcp', + $save_path = array( 'host' => $matches[1], - 'port' => empty($matches[2]) ? NULL : $matches[2], - 'password' => preg_match('#auth=([^\s&]+)#', $matches[3], $match) ? $match[1] : NULL, - 'database' => preg_match('#database=(\d+)#', $matches[3], $match) ? (int) $match[1] : NULL, - 'timeout' => preg_match('#timeout=(\d+\.\d+)#', $matches[3], $match) ? (float) $match[1] : NULL + 'port' => empty($matches[2]) ? NULL : $matches[2] ); - - preg_match('#prefix=([^\s&]+)#', $matches[3], $match) && $this->_key_prefix = $match[1]; } else { log_message('error', 'Session: Invalid Redis save path format: '.$this->_config['save_path']); } - if ($this->_config['match_ip'] === TRUE) + if (isset($save_path)) { - $this->_key_prefix .= $_SERVER['REMOTE_ADDR'].':'; + if (isset($matches['options'])) + { + $save_path['password'] = preg_match('#auth=([^\s&]+)#', $matches['options'], $match) ? $match[1] : NULL; + $save_path['database'] = preg_match('#database=(\d+)#', $matches['options'], $match) ? (int) $match[1] : NULL; + $save_path['timeout'] = preg_match('#timeout=(\d+\.\d+)#', $matches['options'], $match) ? (float) $match[1] : NULL; + + preg_match('#prefix=([^\s&]+)#', $matches['options'], $match) && $this->_key_prefix = $match[1]; + } + + $this->_config['save_path'] = $save_path; + + if ($this->_config['match_ip'] === TRUE) + { + $this->_key_prefix .= $_SERVER['REMOTE_ADDR'].':'; + } } } @@ -141,23 +139,16 @@ public function open($save_path, $name) return FALSE; } - $connected = TRUE; $redis = new Redis(); - if ($this->_config['save_path']['type'] == 'unix') - { - if ( ! $redis->connect($this->_config['save_path']['path'])) - { - log_message('error', 'Session: Unable to connect to Redis with the configured settings.'); - $connected = FALSE; - } - } - elseif ( ! $redis->connect($this->_config['save_path']['host'], $this->_config['save_path']['port'], $this->_config['save_path']['timeout'])) - { - log_message('error', 'Session: Unable to connect to Redis with the configured settings.'); - $connected = FALSE; - } + $connected = isset($this->_config['save_path']['path']) + ? $redis->connect($this->_config['save_path']['path']) + : $redis->connect( + $this->_config['save_path']['host'], + $this->_config['save_path']['port'], + $this->_config['save_path']['timeout'] + ); - if ($connected) + if ($connected) { if (isset($this->_config['save_path']['password']) && ! $redis->auth($this->_config['save_path']['password'])) { @@ -173,6 +164,10 @@ public function open($save_path, $name) return TRUE; } } + else + { + log_message('error', 'Session: Unable to connect to Redis with the configured settings.'); + } return FALSE; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 6c11bf3d767..98652543733 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,9 +7,9 @@ Version 3.1.0 Release Date: Not Released -- Session +- Libraries - - Add unix socket support to redis session driver. + - Added UNIX socket connection support to :doc:`Session Library ` 'redis' driver. Version 3.0.4 From b3847796666c8466dcfafaddbda1f13b4acf605e Mon Sep 17 00:00:00 2001 From: Craig Johnson Date: Thu, 12 Nov 2015 23:44:17 +0530 Subject: [PATCH 4051/5397] Grammar correction in database configuration guide "it" changed to "in" on line 10. "in" seems like the correct word to be used there. Small change. --- user_guide_src/source/database/configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/database/configuration.rst b/user_guide_src/source/database/configuration.rst index 8026be63ab4..e231a7d6af5 100644 --- a/user_guide_src/source/database/configuration.rst +++ b/user_guide_src/source/database/configuration.rst @@ -7,7 +7,7 @@ connection values (username, password, database name, etc.). The config file is located at application/config/database.php. You can also set database connection values for specific :doc:`environments <../libraries/config>` by placing **database.php** -it the respective environment config folder. +in the respective environment config folder. The config settings are stored in a multi-dimensional array with this prototype:: From 6a7a16073aefbc0bff0fb850d97ea11c57d693c1 Mon Sep 17 00:00:00 2001 From: dimitribalazs Date: Wed, 18 Nov 2015 11:50:22 +0100 Subject: [PATCH 4052/5397] =?UTF-8?q?Added=20alt=20attribute=20functionali?= =?UTF-8?q?ty=20=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It hasn't been possible to set the alt attribute on the image. Added img_alt key on the $defaults array and integrated the $img_alt variable into the img string. --- system/helpers/captcha_helper.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 85bcfb5a092..3cf581bba6c 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -79,7 +79,8 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = 'border' => array(153,102,102), 'text' => array(204,153,153), 'grid' => array(255,182,182) - ) + ), + 'img_alt' => 'captcha' ); foreach ($defaults as $key => $val) @@ -330,7 +331,7 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = return FALSE; } - $img = ' '; + $img = ''.$img_alt.''; ImageDestroy($im); return array('word' => $word, 'time' => $now, 'image' => $img, 'filename' => $img_filename); From 01d53bd69aef482a42d5bbc94fd3496e79a97f23 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 23 Nov 2015 13:09:22 +0200 Subject: [PATCH 4053/5397] [ci skip] Update routing docs Close #4258 --- user_guide_src/source/general/routing.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst index b2c9873ab7a..51536809922 100644 --- a/user_guide_src/source/general/routing.rst +++ b/user_guide_src/source/general/routing.rst @@ -113,18 +113,19 @@ A typical RegEx route might look something like this:: In the above example, a URI similar to products/shirts/123 would instead call the "shirts" controller class and the "id_123" method. -With regular expressions, you can also catch a segment containing a -forward slash ('/'), which would usually represent the delimiter between -multiple segments. - +With regular expressions, you can also catch multiple segments at once. For example, if a user accesses a password protected area of your web application and you wish to be able to redirect them back to the same page after they log in, you may find this example useful:: $route['login/(.+)'] = 'auth/login/$1'; +.. note:: In the above example, if the ``$1`` placeholder contains a + slash, it will still be split into multiple parameters when + passed to ``Auth::login()``. + For those of you who don't know regular expressions and want to learn -more about them, `regular-expressions.info ` +more about them, `regular-expressions.info `_ might be a good starting point. .. note:: You can also mix and match wildcards with regular expressions. From 422fd592428d6048e9a75868fa3e75527506dbb7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 24 Nov 2015 11:36:29 +0200 Subject: [PATCH 4054/5397] [ci skip] Remove some redundant code from DB_forge --- system/database/DB_forge.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index d2302b2f207..1546e40c09b 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -780,10 +780,6 @@ protected function _process_fields($create_table = FALSE) case 'ENUM': case 'SET': $attributes['CONSTRAINT'] = $this->db->escape($attributes['CONSTRAINT']); - $field['length'] = is_array($attributes['CONSTRAINT']) - ? "(".implode(",", $attributes['CONSTRAINT']).")" - : '('.$attributes['CONSTRAINT'].')'; - break; default: $field['length'] = is_array($attributes['CONSTRAINT']) ? '('.implode(',', $attributes['CONSTRAINT']).')' From 5afa348b48a93f24957377dc12f86ae64665b944 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 24 Nov 2015 11:48:39 +0200 Subject: [PATCH 4055/5397] Use PHP7's random_bytes() when possible Close #4260 --- system/core/Security.php | 16 ++++++++++++++++ system/libraries/Encryption.php | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/system/core/Security.php b/system/core/Security.php index 36dea4cf2ed..e79bf8affab 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -593,6 +593,22 @@ public function get_random_bytes($length) return FALSE; } + if (function_exists('random_bytes')) + { + try + { + // The cast is required to avoid TypeError + return random_bytes((int) $length); + } + catch (Exception $e) + { + // If random_bytes() can't do the job, we can't either ... + // There's no point in using fallbacks. + log_message('error', $e->getMessage()); + return FALSE; + } + } + // Unfortunately, none of the following PRNGs is guaranteed to exist ... if (defined('MCRYPT_DEV_URANDOM') && ($output = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM)) !== FALSE) { diff --git a/system/libraries/Encryption.php b/system/libraries/Encryption.php index f3e039881b4..151ce8dec2d 100644 --- a/system/libraries/Encryption.php +++ b/system/libraries/Encryption.php @@ -337,6 +337,11 @@ protected function _openssl_initialize($params) */ public function create_key($length) { + if (function_exists('random_bytes')) + { + return random_bytes((int) $length); + } + return ($this->_driver === 'mcrypt') ? mcrypt_create_iv($length, MCRYPT_DEV_URANDOM) : openssl_random_pseudo_bytes($length); From 7e983df144c7edca97bf4ce3b5e64f4487972262 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 24 Nov 2015 11:50:59 +0200 Subject: [PATCH 4056/5397] [ci skip] Add changelog entries for 5afa348b48a93f24957377dc12f86ae64665b944 Related: #4260 --- user_guide_src/source/changelog.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b0c4055b5ff..5b7f225a512 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,11 @@ Version 3.0.4 Release Date: Not Released +- General Changes + + - Updated :doc:`Security Library ` method ``get_random_bytes()`` to use PHP7's ``random_bytes()`` function when possible. + - Updated :doc:`Encryption Library ` method ``create_key()`` to use PHP7's ``random_bytes()`` function when possible. + Bug fixes for 3.0.4 ------------------- From fd70fa5ff7cec722a69f3e720a962aea3dec03fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Adam?= Date: Wed, 25 Nov 2015 18:25:17 +0100 Subject: [PATCH 4057/5397] HTML Helper - meta(): now can generate HTML meta charset & Open Graph property --- system/helpers/html_helper.php | 9 +++++---- user_guide_src/source/helpers/html_helper.rst | 12 ++++++------ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index 28fbe00bee8..4e25f8c9b50 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -338,7 +338,7 @@ function link_tag($href = '', $rel = 'stylesheet', $type = 'text/css', $title = if ( ! function_exists('meta')) { /** - * Generates meta tags from an array of key/values + * Generates meta tags from an array of key/values, compatible with html5 and open graph * * @param array * @param string @@ -359,13 +359,14 @@ function meta($name = '', $content = '', $type = 'name', $newline = "\n") // Turn single array into multidimensional $name = array($name); } - + $allowed_type = array('charset', 'http-equiv', 'name', 'property'); $str = ''; foreach ($name as $meta) { - $type = (isset($meta['type']) && $meta['type'] !== 'name') ? 'http-equiv' : 'name'; + $meta['type'] = (isset($meta['type']) && ($meta['type'] == 'equiv')) ? 'http-equiv' : $meta['type']; // backward compatibility + $type = (isset($meta['type']) && in_array($meta['type'], $allowed_type))? $meta['type'] : 'name'; $name = isset($meta['name']) ? $meta['name'] : ''; - $content = isset($meta['content']) ? $meta['content'] : ''; + $content = (isset($meta['content']) && $type != 'charset') ? $meta['content'] : ''; $newline = isset($meta['newline']) ? $meta['newline'] : "\n"; $str .= ''.$newline; diff --git a/user_guide_src/source/helpers/html_helper.rst b/user_guide_src/source/helpers/html_helper.rst index 2c748bea00c..1445b3bf0ac 100644 --- a/user_guide_src/source/helpers/html_helper.rst +++ b/user_guide_src/source/helpers/html_helper.rst @@ -285,9 +285,9 @@ The following functions are available: echo meta('description', 'My Great site'); // Generates: - echo meta('Content-type', 'text/html; charset=utf-8', 'equiv'); - // Note the third parameter. Can be "equiv" or "name" - // Generates: + echo meta('refresh', '30', 'http-equiv'); + // Note the third parameter. Can be "charset", "http-equiv", "name" or "property" + // Generates: echo meta(array('name' => 'robots', 'content' => 'no-cache')); // Generates: @@ -310,8 +310,8 @@ The following functions are available: 'content' => 'no-cache' ), array( - 'name' => 'Content-type', - 'content' => 'text/html; charset=utf-8', 'type' => 'equiv' + 'name' => 'UTF-8', + 'type' => 'charset' ) ); @@ -321,7 +321,7 @@ The following functions are available: // // // - // + // .. php:function:: doctype([$type = 'xhtml1-strict']) From dfcc5318d378ae66dd21806c6ac2dad67d73dc26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Adam?= Date: Wed, 25 Nov 2015 18:30:34 +0100 Subject: [PATCH 4058/5397] HTML Helper - doctype(): now default type is HTML 5 --- system/helpers/html_helper.php | 2 +- user_guide_src/source/helpers/html_helper.rst | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index 4e25f8c9b50..b4c605a019b 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -229,7 +229,7 @@ function img($src = '', $index_page = FALSE, $attributes = '') * @param string type The doctype to be generated * @return string */ - function doctype($type = 'xhtml1-strict') + function doctype($type = 'html5') { static $doctypes; diff --git a/user_guide_src/source/helpers/html_helper.rst b/user_guide_src/source/helpers/html_helper.rst index 1445b3bf0ac..bfd4afbe2d3 100644 --- a/user_guide_src/source/helpers/html_helper.rst +++ b/user_guide_src/source/helpers/html_helper.rst @@ -324,18 +324,18 @@ The following functions are available: // -.. php:function:: doctype([$type = 'xhtml1-strict']) +.. php:function:: doctype([$type = 'html5']) :param string $type: Doctype name :returns: HTML DocType tag :rtype: string - Helps you generate document type declarations, or DTD's. XHTML 1.0 - Strict is used by default, but many doctypes are available. + Helps you generate document type declarations, or DTD's. HTML 5 + is used by default, but many doctypes are available. Example:: - echo doctype(); // + echo doctype(); // echo doctype('html4-trans'); // From 49077f1a80c1c644c3e15864a1dab285e7fb8de5 Mon Sep 17 00:00:00 2001 From: Claudio Galdiolo Date: Wed, 25 Nov 2015 15:34:16 -0500 Subject: [PATCH 4059/5397] Fix file name With case-sensitive filesystem, visiting example.com/index.php/form/ returns a '404 Page Not Found' error --- user_guide_src/source/libraries/form_validation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index c288cc8c0a3..dd3ffbbaf62 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -116,7 +116,7 @@ this code and save it to your application/views/ folder:: The Controller ============== -Using a text editor, create a controller called form.php. In it, place +Using a text editor, create a controller called Form.php. In it, place this code and save it to your application/controllers/ folder:: Date: Wed, 25 Nov 2015 22:41:40 +0200 Subject: [PATCH 4060/5397] Merge pull request #4271 from galdiolo/patch-12 [ci skip] Fix file name in documentation --- user_guide_src/source/libraries/form_validation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index c288cc8c0a3..dd3ffbbaf62 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -116,7 +116,7 @@ this code and save it to your application/views/ folder:: The Controller ============== -Using a text editor, create a controller called form.php. In it, place +Using a text editor, create a controller called Form.php. In it, place this code and save it to your application/controllers/ folder:: Date: Thu, 26 Nov 2015 22:58:46 +0700 Subject: [PATCH 4061/5397] fix another file name according PR #4271 Fix another file name in documentation according PR #4271 --- user_guide_src/source/libraries/form_validation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index dd3ffbbaf62..9189d082ef8 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -175,7 +175,7 @@ The form (myform.php) is a standard web form with a couple exceptions: This function will return any error messages sent back by the validator. If there are no messages it returns an empty string. -The controller (form.php) has one method: ``index()``. This method +The controller (Form.php) has one method: ``index()``. This method initializes the validation class and loads the form helper and URL helper used by your view files. It also runs the validation routine. Based on whether the validation was successful it either presents the @@ -205,7 +205,7 @@ The above method takes **three** parameters as input: .. note:: If you would like the field name to be stored in a language file, please see :ref:`translating-field-names`. -Here is an example. In your controller (form.php), add this code just +Here is an example. In your controller (Form.php), add this code just below the validation initialization method:: $this->form_validation->set_rules('username', 'Username', 'required'); From 5734cb3cc59ca938112e981b9ebd27ba5bb69173 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 26 Nov 2015 18:25:40 +0200 Subject: [PATCH 4062/5397] Merge pull request #4273 from suhindra/develop [ci skip] Fix another file name in the docsaccording Similarly to PR #4271 --- user_guide_src/source/libraries/form_validation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index dd3ffbbaf62..9189d082ef8 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -175,7 +175,7 @@ The form (myform.php) is a standard web form with a couple exceptions: This function will return any error messages sent back by the validator. If there are no messages it returns an empty string. -The controller (form.php) has one method: ``index()``. This method +The controller (Form.php) has one method: ``index()``. This method initializes the validation class and loads the form helper and URL helper used by your view files. It also runs the validation routine. Based on whether the validation was successful it either presents the @@ -205,7 +205,7 @@ The above method takes **three** parameters as input: .. note:: If you would like the field name to be stored in a language file, please see :ref:`translating-field-names`. -Here is an example. In your controller (form.php), add this code just +Here is an example. In your controller (Form.php), add this code just below the validation initialization method:: $this->form_validation->set_rules('username', 'Username', 'required'); From 6ab09773d96ce6ac672a3d852256126d10aa25d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Adam?= Date: Tue, 1 Dec 2015 20:02:07 +0100 Subject: [PATCH 4063/5397] Modified as asked after pull request: * comment of meta fuction adapted * alignments in meta fuction adapted * using '===' comparator in meta function * changing back the example of the meta function help * changing back the default value of the doctype function Also changing test unit to reflect the modification of the meta function (original tests not modified). --- system/helpers/html_helper.php | 14 +++++++------- tests/codeigniter/helpers/html_helper_test.php | 6 +++++- user_guide_src/source/helpers/html_helper.rst | 4 ++-- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index b4c605a019b..36680053adc 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -229,7 +229,7 @@ function img($src = '', $index_page = FALSE, $attributes = '') * @param string type The doctype to be generated * @return string */ - function doctype($type = 'html5') + function doctype($type = 'xhtml1-strict') { static $doctypes; @@ -363,13 +363,13 @@ function meta($name = '', $content = '', $type = 'name', $newline = "\n") $str = ''; foreach ($name as $meta) { - $meta['type'] = (isset($meta['type']) && ($meta['type'] == 'equiv')) ? 'http-equiv' : $meta['type']; // backward compatibility - $type = (isset($meta['type']) && in_array($meta['type'], $allowed_type))? $meta['type'] : 'name'; - $name = isset($meta['name']) ? $meta['name'] : ''; - $content = (isset($meta['content']) && $type != 'charset') ? $meta['content'] : ''; - $newline = isset($meta['newline']) ? $meta['newline'] : "\n"; + $meta['type'] = isset($meta['type']) ? (($meta['type'] === 'equiv') ? 'http-equiv' : $meta['type']) : ''; // backward compatibility + $type = in_array($meta['type'], $allowed_type) ? $meta['type'] : 'name'; + $name = isset($meta['name']) ? $meta['name'] : ''; + $content = isset($meta['content']) ? $meta['content'] : ''; + $newline = isset($meta['newline']) ? $meta['newline'] : "\n"; - $str .= ''.$newline; + $str .= ''.$newline; } return $str; diff --git a/tests/codeigniter/helpers/html_helper_test.php b/tests/codeigniter/helpers/html_helper_test.php index d66ad895cb7..0b9655bf57b 100644 --- a/tests/codeigniter/helpers/html_helper_test.php +++ b/tests/codeigniter/helpers/html_helper_test.php @@ -87,6 +87,10 @@ public function test_meta() $this->assertEquals($expect, meta(array('name' => 'foo'))); + $expect = "\n"; + + $this->assertEquals($expect, meta(array('name' => 'foo', 'type' => 'charset'))); + } -} \ No newline at end of file +} diff --git a/user_guide_src/source/helpers/html_helper.rst b/user_guide_src/source/helpers/html_helper.rst index bfd4afbe2d3..fffb2cab49a 100644 --- a/user_guide_src/source/helpers/html_helper.rst +++ b/user_guide_src/source/helpers/html_helper.rst @@ -285,9 +285,9 @@ The following functions are available: echo meta('description', 'My Great site'); // Generates: - echo meta('refresh', '30', 'http-equiv'); + echo meta('Content-type', 'text/html; charset=utf-8', 'equiv'); // Note the third parameter. Can be "charset", "http-equiv", "name" or "property" - // Generates: + // Generates: echo meta(array('name' => 'robots', 'content' => 'no-cache')); // Generates: From 7cf4cda4d56ca8c7dc51b38442d83d3b593d96f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Adam?= Date: Tue, 1 Dec 2015 20:24:32 +0100 Subject: [PATCH 4064/5397] Forgot change in the comment on the meta function --- system/helpers/html_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index 36680053adc..9ed21a1681e 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -338,7 +338,7 @@ function link_tag($href = '', $rel = 'stylesheet', $type = 'text/css', $title = if ( ! function_exists('meta')) { /** - * Generates meta tags from an array of key/values, compatible with html5 and open graph + * Generates meta tags from an array of key/values * * @param array * @param string From a18c6097a38f7b3eac789b5c217a97d7ac0b7085 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 3 Dec 2015 17:53:14 +0200 Subject: [PATCH 4065/5397] Fix #4283 --- system/helpers/string_helper.php | 3 ++- user_guide_src/source/changelog.rst | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php index 63783516032..3138a04b3a3 100644 --- a/system/helpers/string_helper.php +++ b/system/helpers/string_helper.php @@ -270,7 +270,7 @@ function increment_string($str, $separator = '_', $first = 1) * @param string (as many parameters as needed) * @return string */ - function alternator($args) + function alternator() { static $i; @@ -279,6 +279,7 @@ function alternator($args) $i = 0; return ''; } + $args = func_get_args(); return $args[($i++ % count($args))]; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 5b7f225a512..a7807aa03eb 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -16,12 +16,13 @@ Bug fixes for 3.0.4 ------------------- - Fixed a bug (#4212) - :doc:`Query Builder ` method ``count_all_results()`` could fail if an ``ORDER BY`` condition is used. -- Fixed a bug where :doc:`Form Helper ` functions `set_checkbox()`, `set_radio()` didn't "uncheck" inputs on a submitted form if the default state is "checked". +- Fixed a bug where :doc:`Form Helper ` functions :php:func:`set_checkbox()`, :php:func:`set_radio()` didn't "uncheck" inputs on a submitted form if the default state is "checked". - Fixed a bug (#4217) - :doc:`Config Library ` method ``base_url()`` didn't use proper formatting for IPv6 when it falls back to ``$_SERVER['SERVER_ADDR']``. - Fixed a bug where :doc:`CAPTCHA Helper ` entered an infinite loop while generating a random string. - Fixed a bug (#4223) - :doc:`Database ` method ``simple_query()`` blindly executes queries without checking if the connection was initialized properly. - Fixed a bug (#4244) - :doc:`Email Library ` could improperly use "unsafe" US-ASCII characters during Quoted-printable encoding. - Fixed a bug (#4245) - :doc:`Database Forge ` couldn't properly handle ``SET`` and ``ENUM`` type fields with string values. +- Fixed a bug (#4283) - :doc:`String Helper ` function :php:func:`alternator()` couldn't be called without arguments. Version 3.0.3 ============= From 3f273628540c20ffa1ea8b88da315314a5046983 Mon Sep 17 00:00:00 2001 From: b-kaxa Date: Mon, 7 Dec 2015 02:23:10 +0900 Subject: [PATCH 4066/5397] fix phpdoc --- system/core/Router.php | 1 + system/core/URI.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/core/Router.php b/system/core/Router.php index a84be1f1d2c..0a69758816f 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -118,6 +118,7 @@ class CI_Router { * * Runs the route mapping function. * + * @param array $routing * @return void */ public function __construct($routing = NULL) diff --git a/system/core/URI.php b/system/core/URI.php index 5b658f679c4..5179b401f3f 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -294,7 +294,7 @@ protected function _parse_argv() * * Do some final cleaning of the URI and return it, currently only used in self::_parse_request_uri() * - * @param string $url + * @param string $uri * @return string */ protected function _remove_relative_directory($uri) From 5ced82ab986f6a53ca95f5498a63ac503ea8f580 Mon Sep 17 00:00:00 2001 From: "Halmai, Csongor" Date: Mon, 7 Dec 2015 13:20:39 +1100 Subject: [PATCH 4067/5397] Detecting if database connection was not successful --- system/core/Loader.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/system/core/Loader.php b/system/core/Loader.php index 18e4c5287a9..7593ae5d6c1 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -361,6 +361,10 @@ public function database($params = '', $return = FALSE, $query_builder = NULL) // Load the DB class $CI->db =& DB($params, $query_builder); + if (!$CI->db->conn_id) + { + return FALSE; + } return $this; } From 887eb91ff2799036a6d899ee3dbadd8a6a51ff54 Mon Sep 17 00:00:00 2001 From: b-kaxa Date: Mon, 7 Dec 2015 19:03:20 +0900 Subject: [PATCH 4068/5397] replace spaces with tabs --- system/core/Router.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Router.php b/system/core/Router.php index 0a69758816f..ce41aa95867 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -118,7 +118,7 @@ class CI_Router { * * Runs the route mapping function. * - * @param array $routing + * @param array $routing * @return void */ public function __construct($routing = NULL) From f0f93f50d2a85373988a225504115d4805446189 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 7 Dec 2015 12:12:44 +0200 Subject: [PATCH 4069/5397] Merge pull request #4291 from b-kaxa/fix-phpdoc [ci skip] phpdoc adjustments in CI_Router and CI_URI --- system/core/Router.php | 1 + system/core/URI.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/core/Router.php b/system/core/Router.php index a84be1f1d2c..ce41aa95867 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -118,6 +118,7 @@ class CI_Router { * * Runs the route mapping function. * + * @param array $routing * @return void */ public function __construct($routing = NULL) diff --git a/system/core/URI.php b/system/core/URI.php index 5b658f679c4..5179b401f3f 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -294,7 +294,7 @@ protected function _parse_argv() * * Do some final cleaning of the URI and return it, currently only used in self::_parse_request_uri() * - * @param string $url + * @param string $uri * @return string */ protected function _remove_relative_directory($uri) From 0f56007d95a8713f0c4276e37604e221f4efbe66 Mon Sep 17 00:00:00 2001 From: "Halmai, Csongor" Date: Tue, 8 Dec 2015 11:32:35 +1100 Subject: [PATCH 4070/5397] rolling back previous solution; throwing exception if database connection was not successful. --- system/core/Loader.php | 4 ---- system/database/DB_driver.php | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index 7593ae5d6c1..18e4c5287a9 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -361,10 +361,6 @@ public function database($params = '', $return = FALSE, $query_builder = NULL) // Load the DB class $CI->db =& DB($params, $query_builder); - if (!$CI->db->conn_id) - { - return FALSE; - } return $this; } diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 25e70ec3f2b..fb9955b7c62 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -436,7 +436,7 @@ public function initialize() $this->display_error('db_unable_to_connect'); } - return FALSE; + throw new RuntimeException('Database connection failure.'); } } From ac0e0bf62d483d1b7db86fe760447ca0dd83baf2 Mon Sep 17 00:00:00 2001 From: "Halmai, Csongor" Date: Tue, 8 Dec 2015 11:40:24 +1100 Subject: [PATCH 4071/5397] documentation for the new RuntimeException --- user_guide_src/source/changelog.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 98652543733..5a41fa18bec 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -11,6 +11,10 @@ Release Date: Not Released - Added UNIX socket connection support to :doc:`Session Library ` 'redis' driver. +- Database + + - CI_DB_driver::initialize() throws a "Database connection failure." RuntimeException if couldn't connect to the database. + Version 3.0.4 ============= From b1cde1fdd77aec1278dd2b4d6ae071e814a58c2a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 8 Dec 2015 13:10:41 +0200 Subject: [PATCH 4072/5397] Type-hint csv_from_result(), xml_from_result() DB utilities Close #4299 --- system/database/DB_utility.php | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index b51893e1813..fcc56f24e0b 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -235,13 +235,8 @@ public function repair_table($table_name) * @param string $enclosure Enclosure (default: ") * @return string */ - public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosure = '"') + public function csv_from_result(CI_DB_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) @@ -274,13 +269,8 @@ public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosur * @param array $params Any preferences * @return string */ - public function xml_from_result($query, $params = array()) + public function xml_from_result(CI_DB_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) { From 2410c30c457e108c1f57978df610e82abab0361e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 8 Dec 2015 13:25:19 +0200 Subject: [PATCH 4073/5397] Remove CI_DB_driver::load_rdriver() --- system/database/DB.php | 5 ++++- system/database/DB_driver.php | 27 +++------------------------ 2 files changed, 7 insertions(+), 25 deletions(-) diff --git a/system/database/DB.php b/system/database/DB.php index 23de414b5e4..355d26fb593 100644 --- a/system/database/DB.php +++ b/system/database/DB.php @@ -192,10 +192,13 @@ class CI_DB extends CI_DB_driver { } // Load the DB driver $driver_file = BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php'; - file_exists($driver_file) OR show_error('Invalid DB driver'); require_once($driver_file); + // Load the result classes as well + require_once(BASEPATH.'database/DB_result.php'); + require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_result.php'); + // Instantiate the DB adapter $driver = 'CI_DB_'.$params['dbdriver'].'_driver'; $DB = new $driver($params); diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 25e70ec3f2b..bc016efbf49 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -622,7 +622,6 @@ public function query($sql, $binds = FALSE, $return_object = NULL) // cached query if it exists if ($this->cache_on === TRUE && $return_object === TRUE && $this->_cache_init()) { - $this->load_rdriver(); if (FALSE !== ($cache = $this->CACHE->read($sql))) { return $cache; @@ -710,9 +709,9 @@ public function query($sql, $binds = FALSE, $return_object = NULL) return TRUE; } - // Load and instantiate the result driver - $driver = $this->load_rdriver(); - $RES = new $driver($this); + // Instantiate the driver-specific result class + $driver = 'CI_DB_'.$this->dbdriver.'_result'; + $RES = new $driver($this); // Is query caching enabled? If so, we'll serialize the // result object and save it to a cache file. @@ -741,26 +740,6 @@ public function query($sql, $binds = FALSE, $return_object = NULL) // -------------------------------------------------------------------- - /** - * Load the result drivers - * - * @return string the name of the result class - */ - public function load_rdriver() - { - $driver = 'CI_DB_'.$this->dbdriver.'_result'; - - if ( ! class_exists($driver, FALSE)) - { - require_once(BASEPATH.'database/DB_result.php'); - require_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php'); - } - - return $driver; - } - - // -------------------------------------------------------------------- - /** * Simple Query * This is a simplified version of the query() function. Internally From 62a106e277e53a99346314cc10480e549225b08c Mon Sep 17 00:00:00 2001 From: Phil Scherer Date: Tue, 8 Dec 2015 18:06:11 -0500 Subject: [PATCH 4074/5397] Fix mismatched brackets in documentation Sphinx generates incomplete/incorrect HTML output because there are mismatched brackets in the documentation. Signed-off-by: Phil Scherer --- user_guide_src/source/database/db_driver_reference.rst | 2 +- user_guide_src/source/helpers/cookie_helper.rst | 6 +++--- user_guide_src/source/helpers/form_helper.rst | 4 ++-- user_guide_src/source/libraries/sessions.rst | 2 +- user_guide_src/source/libraries/trackback.rst | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/user_guide_src/source/database/db_driver_reference.rst b/user_guide_src/source/database/db_driver_reference.rst index 8fc26c01b79..1e436ede18d 100644 --- a/user_guide_src/source/database/db_driver_reference.rst +++ b/user_guide_src/source/database/db_driver_reference.rst @@ -83,7 +83,7 @@ This article is intended to be a reference for them. Database version number. - .. php:method:: query($sql[, $binds = FALSE[, $return_object = NULL]]]) + .. php:method:: query($sql[, $binds = FALSE[, $return_object = NULL]]) :param string $sql: The SQL statement to execute :param array $binds: An array of binding data diff --git a/user_guide_src/source/helpers/cookie_helper.rst b/user_guide_src/source/helpers/cookie_helper.rst index da26151cb25..c9d2f419c52 100644 --- a/user_guide_src/source/helpers/cookie_helper.rst +++ b/user_guide_src/source/helpers/cookie_helper.rst @@ -25,7 +25,7 @@ Available Functions The following functions are available: -.. php:function:: set_cookie($name[, $value = ''[, $expire = ''[, $domain = ''[, $path = '/'[, $prefix = ''[, $secure = FALSE[, $httponly = FALSE]]]]]]]]) +.. php:function:: set_cookie($name[, $value = ''[, $expire = ''[, $domain = ''[, $path = '/'[, $prefix = ''[, $secure = FALSE[, $httponly = FALSE]]]]]]]) :param mixed $name: Cookie name *or* associative array of all of the parameters available to this function :param string $value: Cookie value @@ -42,7 +42,7 @@ The following functions are available: a description of its use, as this function is an alias for ``CI_Input::set_cookie()``. -.. php:function:: get_cookie($index[, $xss_clean = NULL]]) +.. php:function:: get_cookie($index[, $xss_clean = NULL]) :param string $index: Cookie name :param bool $xss_clean: Whether to apply XSS filtering to the returned value @@ -56,7 +56,7 @@ The following functions are available: the ``$config['cookie_prefix']`` that you might've set in your *application/config/config.php* file. -.. php:function:: delete_cookie($name[, $domain = ''[, $path = '/'[, $prefix = '']]]]) +.. php:function:: delete_cookie($name[, $domain = ''[, $path = '/'[, $prefix = '']]]) :param string $name: Cookie name :param string $domain: Cookie domain (usually: .yourdomain.com) diff --git a/user_guide_src/source/helpers/form_helper.rst b/user_guide_src/source/helpers/form_helper.rst index d3ee3ffb612..a67dbc0bf2b 100644 --- a/user_guide_src/source/helpers/form_helper.rst +++ b/user_guide_src/source/helpers/form_helper.rst @@ -108,7 +108,7 @@ The following functions are available: -.. php:function:: form_open_multipart([$action = ''[, $attributes = array()[, $hidden = array()]]) +.. php:function:: form_open_multipart([$action = ''[, $attributes = array()[, $hidden = array()]]]) :param string $action: Form action/target URI string :param array $attributes: HTML attributes @@ -187,7 +187,7 @@ The following functions are available: */ -.. php:function:: form_input([$data = ''[, $value = ''[, $extra = '']]) +.. php:function:: form_input([$data = ''[, $value = ''[, $extra = '']]]) :param array $data: Field attributes data :param string $value: Field value diff --git a/user_guide_src/source/libraries/sessions.rst b/user_guide_src/source/libraries/sessions.rst index 9c9761bbf59..881705c92ee 100644 --- a/user_guide_src/source/libraries/sessions.rst +++ b/user_guide_src/source/libraries/sessions.rst @@ -842,7 +842,7 @@ Class Reference .. note:: This method is DEPRECATED. Use ``userdata()`` with no parameters instead. - .. php:method:: &get_userdata() + .. php:method:: get_userdata() :returns: A reference to ``$_SESSION`` :rtype: array diff --git a/user_guide_src/source/libraries/trackback.rst b/user_guide_src/source/libraries/trackback.rst index 4e0cb554151..bceb515f270 100644 --- a/user_guide_src/source/libraries/trackback.rst +++ b/user_guide_src/source/libraries/trackback.rst @@ -239,7 +239,7 @@ Class Reference This method simply validates the incoming TB data, returning TRUE on success and FALSE on failure. If the data is valid it is set to the ``$this->data`` array so that it can be inserted into a database. - .. php:method:: send_error([$message = 'Incomplete information') + .. php:method:: send_error([$message = 'Incomplete information']) :param string $message: Error message :rtype: void From 367dad5bab86f72a843010f07590aa9c3ecc5780 Mon Sep 17 00:00:00 2001 From: Phil Scherer Date: Wed, 9 Dec 2015 13:34:38 -0500 Subject: [PATCH 4075/5397] Remove accidentally included change --- user_guide_src/source/libraries/sessions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/sessions.rst b/user_guide_src/source/libraries/sessions.rst index 881705c92ee..9c9761bbf59 100644 --- a/user_guide_src/source/libraries/sessions.rst +++ b/user_guide_src/source/libraries/sessions.rst @@ -842,7 +842,7 @@ Class Reference .. note:: This method is DEPRECATED. Use ``userdata()`` with no parameters instead. - .. php:method:: get_userdata() + .. php:method:: &get_userdata() :returns: A reference to ``$_SESSION`` :rtype: array From 3e75ff6050fd86816601a11effc2932ecd81ebf7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 10 Dec 2015 13:28:19 +0200 Subject: [PATCH 4076/5397] Merge pull request #4304 from scherepn/fix-doc-build-errors [ci skip] Fix mismatched brackets in documentation --- user_guide_src/source/database/db_driver_reference.rst | 2 +- user_guide_src/source/helpers/cookie_helper.rst | 6 +++--- user_guide_src/source/helpers/form_helper.rst | 4 ++-- user_guide_src/source/libraries/trackback.rst | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/user_guide_src/source/database/db_driver_reference.rst b/user_guide_src/source/database/db_driver_reference.rst index 8fc26c01b79..1e436ede18d 100644 --- a/user_guide_src/source/database/db_driver_reference.rst +++ b/user_guide_src/source/database/db_driver_reference.rst @@ -83,7 +83,7 @@ This article is intended to be a reference for them. Database version number. - .. php:method:: query($sql[, $binds = FALSE[, $return_object = NULL]]]) + .. php:method:: query($sql[, $binds = FALSE[, $return_object = NULL]]) :param string $sql: The SQL statement to execute :param array $binds: An array of binding data diff --git a/user_guide_src/source/helpers/cookie_helper.rst b/user_guide_src/source/helpers/cookie_helper.rst index da26151cb25..c9d2f419c52 100644 --- a/user_guide_src/source/helpers/cookie_helper.rst +++ b/user_guide_src/source/helpers/cookie_helper.rst @@ -25,7 +25,7 @@ Available Functions The following functions are available: -.. php:function:: set_cookie($name[, $value = ''[, $expire = ''[, $domain = ''[, $path = '/'[, $prefix = ''[, $secure = FALSE[, $httponly = FALSE]]]]]]]]) +.. php:function:: set_cookie($name[, $value = ''[, $expire = ''[, $domain = ''[, $path = '/'[, $prefix = ''[, $secure = FALSE[, $httponly = FALSE]]]]]]]) :param mixed $name: Cookie name *or* associative array of all of the parameters available to this function :param string $value: Cookie value @@ -42,7 +42,7 @@ The following functions are available: a description of its use, as this function is an alias for ``CI_Input::set_cookie()``. -.. php:function:: get_cookie($index[, $xss_clean = NULL]]) +.. php:function:: get_cookie($index[, $xss_clean = NULL]) :param string $index: Cookie name :param bool $xss_clean: Whether to apply XSS filtering to the returned value @@ -56,7 +56,7 @@ The following functions are available: the ``$config['cookie_prefix']`` that you might've set in your *application/config/config.php* file. -.. php:function:: delete_cookie($name[, $domain = ''[, $path = '/'[, $prefix = '']]]]) +.. php:function:: delete_cookie($name[, $domain = ''[, $path = '/'[, $prefix = '']]]) :param string $name: Cookie name :param string $domain: Cookie domain (usually: .yourdomain.com) diff --git a/user_guide_src/source/helpers/form_helper.rst b/user_guide_src/source/helpers/form_helper.rst index d3ee3ffb612..a67dbc0bf2b 100644 --- a/user_guide_src/source/helpers/form_helper.rst +++ b/user_guide_src/source/helpers/form_helper.rst @@ -108,7 +108,7 @@ The following functions are available: -.. php:function:: form_open_multipart([$action = ''[, $attributes = array()[, $hidden = array()]]) +.. php:function:: form_open_multipart([$action = ''[, $attributes = array()[, $hidden = array()]]]) :param string $action: Form action/target URI string :param array $attributes: HTML attributes @@ -187,7 +187,7 @@ The following functions are available: */ -.. php:function:: form_input([$data = ''[, $value = ''[, $extra = '']]) +.. php:function:: form_input([$data = ''[, $value = ''[, $extra = '']]]) :param array $data: Field attributes data :param string $value: Field value diff --git a/user_guide_src/source/libraries/trackback.rst b/user_guide_src/source/libraries/trackback.rst index 4e0cb554151..bceb515f270 100644 --- a/user_guide_src/source/libraries/trackback.rst +++ b/user_guide_src/source/libraries/trackback.rst @@ -239,7 +239,7 @@ Class Reference This method simply validates the incoming TB data, returning TRUE on success and FALSE on failure. If the data is valid it is set to the ``$this->data`` array so that it can be inserted into a database. - .. php:method:: send_error([$message = 'Incomplete information') + .. php:method:: send_error([$message = 'Incomplete information']) :param string $message: Error message :rtype: void From 71a65c359e6aee6f3f7a7f785dea1af4df064701 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 11 Dec 2015 17:21:51 +0200 Subject: [PATCH 4077/5397] Fix #4306 --- system/database/drivers/mssql/mssql_driver.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 883973ae112..b9e310a3af2 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -267,7 +267,7 @@ protected function _db_set_charset($charset) */ protected function _version() { - return 'SELECT @@VERSION AS ver'; + return "SELECT SERVERPROPERTY('ProductVersion') AS ver"; } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a7807aa03eb..7188e1037e2 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -23,6 +23,7 @@ Bug fixes for 3.0.4 - Fixed a bug (#4244) - :doc:`Email Library ` could improperly use "unsafe" US-ASCII characters during Quoted-printable encoding. - Fixed a bug (#4245) - :doc:`Database Forge ` couldn't properly handle ``SET`` and ``ENUM`` type fields with string values. - Fixed a bug (#4283) - :doc:`String Helper ` function :php:func:`alternator()` couldn't be called without arguments. +- Fixed a bug (#4306) - :doc:`Database ` method ``version()`` didn't work properly with the 'mssql' driver. Version 3.0.3 ============= From 8df6efd402180a6361b4dd619f5535d6c2bed334 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 11 Dec 2015 17:55:55 +0200 Subject: [PATCH 4078/5397] Fix #4039 --- system/libraries/Session/drivers/Session_files_driver.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index 45da91c46e6..173b43710f1 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -183,6 +183,12 @@ public function read($session_id) return ''; } } + // We shouldn't need this, but apparently we do ... + // See https://github.com/bcit-ci/CodeIgniter/issues/4039 + elseif ($this->_file_handler === FALSE) + { + return FALSE; + } else { rewind($this->_file_handle); From e705f8e71a80e7740fe6d87f9e01afebc40cd375 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 11 Dec 2015 17:58:55 +0200 Subject: [PATCH 4079/5397] [ci skip] Add changelog entry for issue #4039 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 7188e1037e2..f4e51588ab5 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -24,6 +24,7 @@ Bug fixes for 3.0.4 - Fixed a bug (#4245) - :doc:`Database Forge ` couldn't properly handle ``SET`` and ``ENUM`` type fields with string values. - Fixed a bug (#4283) - :doc:`String Helper ` function :php:func:`alternator()` couldn't be called without arguments. - Fixed a bug (#4306) - :doc:`Database ` method ``version()`` didn't work properly with the 'mssql' driver. +- Fixed a bug (#4039) - :doc:`Session Library ` could generate multiple (redundant) warnings in case of a read failure with the 'files' driver, due to a bug in PHP. Version 3.0.3 ============= From af849696d43f5c3b68962af1ae5096151a6d9f1a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Dec 2015 14:07:39 +0200 Subject: [PATCH 4080/5397] [ci skip] Proper error handling for Sessions on PHP 5 This was actually a PHP bug, see https://wiki.php.net/rfc/session.user.return-value Also related: #4039 --- system/libraries/Session/Session_driver.php | 23 ++++++++ .../drivers/Session_database_driver.php | 49 +++++++++------ .../Session/drivers/Session_files_driver.php | 59 +++++++++++-------- .../drivers/Session_memcached_driver.php | 45 +++++++------- .../Session/drivers/Session_redis_driver.php | 35 ++++++----- user_guide_src/source/changelog.rst | 1 + 6 files changed, 134 insertions(+), 78 deletions(-) diff --git a/system/libraries/Session/Session_driver.php b/system/libraries/Session/Session_driver.php index 47376da5b0f..64b4bb51147 100644 --- a/system/libraries/Session/Session_driver.php +++ b/system/libraries/Session/Session_driver.php @@ -74,6 +74,18 @@ abstract class CI_Session_driver implements SessionHandlerInterface { */ protected $_session_id; + /** + * Success and failure return values + * + * Necessary due to a bug in all PHP 5 versions where return values + * from userspace handlers are not handled properly. PHP 7 fixes the + * bug, so we need to return different values depending on the version. + * + * @see https://wiki.php.net/rfc/session.user.return-value + * @var mixed + */ + protected $_success, $_failure; + // ------------------------------------------------------------------------ /** @@ -85,6 +97,17 @@ abstract class CI_Session_driver implements SessionHandlerInterface { public function __construct(&$params) { $this->_config =& $params; + + if (is_php('7')) + { + $this->_success = TRUE; + $this->_failure = FALSE; + } + else + { + $this->_success = 0; + $this->_failure = -1; + } } // ------------------------------------------------------------------------ diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index 72b39d12d47..40a358fb876 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -125,9 +125,12 @@ public function __construct(&$params) */ public function open($save_path, $name) { - return empty($this->_db->conn_id) - ? (bool) $this->_db->db_connect() - : TRUE; + if (empty($this->_db->conn_id) && ! $this->_db->db_connect()) + { + return $this->_failure; + } + + return $this->_success; } // ------------------------------------------------------------------------ @@ -201,7 +204,7 @@ public function write($session_id, $session_data) { if ( ! $this->_release_lock() OR ! $this->_get_lock($session_id)) { - return FALSE; + return $this->_failure; } $this->_row_exists = FALSE; @@ -209,7 +212,7 @@ public function write($session_id, $session_data) } elseif ($this->_lock === FALSE) { - return FALSE; + return $this->_failure; } if ($this->_row_exists === FALSE) @@ -224,10 +227,11 @@ public function write($session_id, $session_data) if ($this->_db->insert($this->_config['save_path'], $insert_data)) { $this->_fingerprint = md5($session_data); - return $this->_row_exists = TRUE; + $this->_row_exists = TRUE; + return $this->_success; } - return FALSE; + return $this->_failure; } $this->_db->where('id', $session_id); @@ -247,10 +251,10 @@ public function write($session_id, $session_data) if ($this->_db->update($this->_config['save_path'], $update_data)) { $this->_fingerprint = md5($session_data); - return TRUE; + return $this->_success; } - return FALSE; + return $this->_failure; } // ------------------------------------------------------------------------ @@ -264,9 +268,9 @@ public function write($session_id, $session_data) */ public function close() { - return ($this->_lock) - ? $this->_release_lock() - : TRUE; + return ($this->_lock && ! $this->_release_lock()) + ? $this->_failure + : $this->_success; } // ------------------------------------------------------------------------ @@ -289,12 +293,19 @@ public function destroy($session_id) $this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']); } - return $this->_db->delete($this->_config['save_path']) - ? ($this->close() && $this->_cookie_destroy()) - : FALSE; + if ( ! $this->_db->delete($this->_config['save_path'])) + { + return $this->_failure; + } + } + + if ($this->close()) + { + $this->_cookie_destroy(); + return $this->_success; } - return ($this->close() && $this->_cookie_destroy()); + return $this->_failure; } // ------------------------------------------------------------------------ @@ -309,7 +320,9 @@ public function destroy($session_id) */ public function gc($maxlifetime) { - return $this->_db->delete($this->_config['save_path'], 'timestamp < '.(time() - $maxlifetime)); + return ($this->_db->delete($this->_config['save_path'], 'timestamp < '.(time() - $maxlifetime))) + ? $this->_success + : $this->_failure; } // ------------------------------------------------------------------------ @@ -390,4 +403,4 @@ protected function _release_lock() return parent::_release_lock(); } -} +} \ No newline at end of file diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index 173b43710f1..f0f055f87cc 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -129,7 +129,7 @@ public function open($save_path, $name) .$name // we'll use the session cookie name as a prefix to avoid collisions .($this->_config['match_ip'] ? md5($_SERVER['REMOTE_ADDR']) : ''); - return TRUE; + return $this->_success; } // ------------------------------------------------------------------------ @@ -156,13 +156,13 @@ public function read($session_id) if (($this->_file_handle = fopen($this->_file_path.$session_id, 'w+b')) === FALSE) { log_message('error', "Session: File '".$this->_file_path.$session_id."' doesn't exist and cannot be created."); - return FALSE; + return $this->_failure; } } elseif (($this->_file_handle = fopen($this->_file_path.$session_id, 'r+b')) === FALSE) { log_message('error', "Session: Unable to open file '".$this->_file_path.$session_id."'."); - return FALSE; + return $this->_failure; } if (flock($this->_file_handle, LOCK_EX) === FALSE) @@ -170,7 +170,7 @@ public function read($session_id) log_message('error', "Session: Unable to obtain lock for file '".$this->_file_path.$session_id."'."); fclose($this->_file_handle); $this->_file_handle = NULL; - return FALSE; + return $this->_failure; } // Needed by write() to detect session_regenerate_id() calls @@ -187,7 +187,7 @@ public function read($session_id) // See https://github.com/bcit-ci/CodeIgniter/issues/4039 elseif ($this->_file_handler === FALSE) { - return FALSE; + return $this->_failure; } else { @@ -226,18 +226,18 @@ public function write($session_id, $session_data) // and we need to close the old handle and open a new one if ($session_id !== $this->_session_id && ( ! $this->close() OR $this->read($session_id) === FALSE)) { - return FALSE; + return $this->_failure; } if ( ! is_resource($this->_file_handle)) { - return FALSE; + return $this->_failure; } elseif ($this->_fingerprint === md5($session_data)) { - return ($this->_file_new) - ? TRUE - : touch($this->_file_path.$session_id); + return ( ! $this->_file_new && ! touch($this->_file_path.$session_id)) + ? $this->_failure + : $this->_success; } if ( ! $this->_file_new) @@ -260,12 +260,12 @@ public function write($session_id, $session_data) { $this->_fingerprint = md5(substr($session_data, 0, $written)); log_message('error', 'Session: Unable to write data.'); - return FALSE; + return $this->_failure; } } $this->_fingerprint = md5($session_data); - return TRUE; + return $this->_success; } // ------------------------------------------------------------------------ @@ -285,10 +285,9 @@ public function close() fclose($this->_file_handle); $this->_file_handle = $this->_file_new = $this->_session_id = NULL; - return TRUE; } - return TRUE; + return $this->_success; } // ------------------------------------------------------------------------ @@ -305,19 +304,31 @@ public function destroy($session_id) { if ($this->close()) { - return file_exists($this->_file_path.$session_id) - ? (unlink($this->_file_path.$session_id) && $this->_cookie_destroy()) - : TRUE; + if (file_exists($this->_file_path.$session_id)) + { + $this->_cookie_destroy(); + return unlink($this->_file_path.$session_id) + ? $this->_success + : $this->_failure; + } + + return $this->_success; } elseif ($this->_file_path !== NULL) { clearstatcache(); - return file_exists($this->_file_path.$session_id) - ? (unlink($this->_file_path.$session_id) && $this->_cookie_destroy()) - : TRUE; + if (file_exists($this->_file_path.$session_id)) + { + $this->_cookie_destroy(); + return unlink($this->_file_path.$session_id) + ? $this->_success + : $this->_failure; + } + + return $this->_success; } - return FALSE; + return $this->_failure; } // ------------------------------------------------------------------------ @@ -335,7 +346,7 @@ public function gc($maxlifetime) if ( ! is_dir($this->_config['save_path']) OR ($directory = opendir($this->_config['save_path'])) === FALSE) { log_message('debug', "Session: Garbage collector couldn't list files under directory '".$this->_config['save_path']."'."); - return FALSE; + return $this->_failure; } $ts = time() - $maxlifetime; @@ -362,7 +373,7 @@ public function gc($maxlifetime) closedir($directory); - return TRUE; + return $this->_success; } -} +} \ No newline at end of file diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index 97b860588ae..760239dfbee 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -117,7 +117,7 @@ public function open($save_path, $name) { $this->_memcached = NULL; log_message('error', 'Session: Invalid Memcached save path format: '.$this->_config['save_path']); - return FALSE; + return $this->_failure; } foreach ($matches as $match) @@ -142,10 +142,10 @@ public function open($save_path, $name) if (empty($server_list)) { log_message('error', 'Session: Memcached server pool is empty.'); - return FALSE; + return $this->_failure; } - return TRUE; + return $this->_success; } // ------------------------------------------------------------------------ @@ -170,7 +170,7 @@ public function read($session_id) return $session_data; } - return FALSE; + return $this->_failure; } // ------------------------------------------------------------------------ @@ -188,14 +188,14 @@ public function write($session_id, $session_data) { if ( ! isset($this->_memcached)) { - return FALSE; + return $this->_failure; } // Was the ID regenerated? elseif ($session_id !== $this->_session_id) { if ( ! $this->_release_lock() OR ! $this->_get_lock($session_id)) { - return FALSE; + return $this->_failure; } $this->_fingerprint = md5(''); @@ -210,16 +210,18 @@ public function write($session_id, $session_data) if ($this->_memcached->set($this->_key_prefix.$session_id, $session_data, $this->_config['expiration'])) { $this->_fingerprint = $fingerprint; - return TRUE; + return $this->_success; } - return FALSE; + return $this->_failure; } - return $this->_memcached->touch($this->_key_prefix.$session_id, $this->_config['expiration']); + return $this->_memcached->touch($this->_key_prefix.$session_id, $this->_config['expiration']) + ? $this->_success + : $this->_failure; } - return FALSE; + return $this->_failure; } // ------------------------------------------------------------------------ @@ -238,14 +240,14 @@ public function close() isset($this->_lock_key) && $this->_memcached->delete($this->_lock_key); if ( ! $this->_memcached->quit()) { - return FALSE; + return $this->_failure; } $this->_memcached = NULL; - return TRUE; + return $this->_success; } - return FALSE; + return $this->_failure; } // ------------------------------------------------------------------------ @@ -263,10 +265,11 @@ public function destroy($session_id) if (isset($this->_memcached, $this->_lock_key)) { $this->_memcached->delete($this->_key_prefix.$session_id); - return $this->_cookie_destroy(); + $this->_cookie_destroy(); + return $this->_success; } - return FALSE; + return $this->_failure; } // ------------------------------------------------------------------------ @@ -282,7 +285,7 @@ public function destroy($session_id) public function gc($maxlifetime) { // Not necessary, Memcached takes care of that. - return TRUE; + return $this->_success; } // ------------------------------------------------------------------------ @@ -299,7 +302,9 @@ protected function _get_lock($session_id) { if (isset($this->_lock_key)) { - return $this->_memcached->replace($this->_lock_key, time(), 300); + return ($this->_memcached->replace($this->_lock_key, time(), 300)) + ? $this->_success + : $this->_failure; } // 30 attempts to obtain a lock, in case another request already has it @@ -316,7 +321,7 @@ protected function _get_lock($session_id) if ( ! $this->_memcached->set($lock_key, time(), 300)) { log_message('error', 'Session: Error while trying to obtain lock for '.$this->_key_prefix.$session_id); - return FALSE; + return $this->_failure; } $this->_lock_key = $lock_key; @@ -327,11 +332,11 @@ protected function _get_lock($session_id) if ($attempt === 30) { log_message('error', 'Session: Unable to obtain lock for '.$this->_key_prefix.$session_id.' after 30 attempts, aborting.'); - return FALSE; + return $this->_failure; } $this->_lock = TRUE; - return TRUE; + return $this->_success; } // ------------------------------------------------------------------------ diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index b098cc44162..e8915306f7c 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -124,7 +124,7 @@ public function open($save_path, $name) { if (empty($this->_config['save_path'])) { - return FALSE; + return $this->_failure; } $redis = new Redis(); @@ -143,10 +143,10 @@ public function open($save_path, $name) else { $this->_redis = $redis; - return TRUE; + return $this->_success; } - return FALSE; + return $this->_failure; } // ------------------------------------------------------------------------ @@ -171,7 +171,7 @@ public function read($session_id) return $session_data; } - return FALSE; + return $this->_failure; } // ------------------------------------------------------------------------ @@ -189,14 +189,14 @@ public function write($session_id, $session_data) { if ( ! isset($this->_redis)) { - return FALSE; + return $this->_failure; } // Was the ID regenerated? elseif ($session_id !== $this->_session_id) { if ( ! $this->_release_lock() OR ! $this->_get_lock($session_id)) { - return FALSE; + return $this->_failure; } $this->_fingerprint = md5(''); @@ -211,16 +211,18 @@ public function write($session_id, $session_data) if ($this->_redis->set($this->_key_prefix.$session_id, $session_data, $this->_config['expiration'])) { $this->_fingerprint = $fingerprint; - return TRUE; + return $this->_success; } - return FALSE; + return $this->_failure; } - return $this->_redis->setTimeout($this->_key_prefix.$session_id, $this->_config['expiration']); + return ($this->_redis->setTimeout($this->_key_prefix.$session_id, $this->_config['expiration'])) + ? $this->_success + : $this->_failure; } - return FALSE; + return $this->_failure; } // ------------------------------------------------------------------------ @@ -242,7 +244,7 @@ public function close() isset($this->_lock_key) && $this->_redis->delete($this->_lock_key); if ( ! $this->_redis->close()) { - return FALSE; + return $this->_failure; } } } @@ -252,10 +254,10 @@ public function close() } $this->_redis = NULL; - return TRUE; + return $this->_success; } - return TRUE; + return $this->_success; } // ------------------------------------------------------------------------ @@ -277,10 +279,11 @@ public function destroy($session_id) log_message('debug', 'Session: Redis::delete() expected to return 1, got '.var_export($result, TRUE).' instead.'); } - return $this->_cookie_destroy(); + $this->_cookie_destroy(); + return $this->_success; } - return FALSE; + return $this->_failure; } // ------------------------------------------------------------------------ @@ -296,7 +299,7 @@ public function destroy($session_id) public function gc($maxlifetime) { // Not necessary, Redis takes care of that. - return TRUE; + return $this->_success; } // ------------------------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f4e51588ab5..caa4455d8ce 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -25,6 +25,7 @@ Bug fixes for 3.0.4 - Fixed a bug (#4283) - :doc:`String Helper ` function :php:func:`alternator()` couldn't be called without arguments. - Fixed a bug (#4306) - :doc:`Database ` method ``version()`` didn't work properly with the 'mssql' driver. - Fixed a bug (#4039) - :doc:`Session Library ` could generate multiple (redundant) warnings in case of a read failure with the 'files' driver, due to a bug in PHP. +- Fixed a bug where :doc:`Session Library ` didn't have proper error handling on PHP 5 (due to a PHP bug). Version 3.0.3 ============= From 97ecf2fcce8e3133e286e16de1b49612235a8dcf Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Dec 2015 17:26:28 +0200 Subject: [PATCH 4081/5397] Complete the proposed changes from PR #4300 --- system/database/DB_driver.php | 19 +++---------------- user_guide_src/source/changelog.rst | 2 +- .../source/database/db_driver_reference.rst | 1 + 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index f3aeb7f8176..418de27c8d9 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -381,6 +381,7 @@ public function __construct($params) * Initialize Database Settings * * @return bool + * @throws RuntimeException In case of failure */ public function initialize() { @@ -429,14 +430,7 @@ public function initialize() // We still don't have a connection? if ( ! $this->conn_id) { - log_message('error', 'Unable to connect to the database'); - - if ($this->db_debug) - { - $this->display_error('db_unable_to_connect'); - } - - throw new RuntimeException('Database connection failure.'); + throw new RuntimeException('Unable to connect to the database.'); } } @@ -751,14 +745,7 @@ public function query($sql, $binds = FALSE, $return_object = NULL) */ public function simple_query($sql) { - if ( ! $this->conn_id) - { - if ( ! $this->initialize()) - { - return FALSE; - } - } - + empty($this->conn_id) && $this->initialize(); return $this->_execute($sql); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 5a41fa18bec..1ea34eee6e9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -13,7 +13,7 @@ Release Date: Not Released - Database - - CI_DB_driver::initialize() throws a "Database connection failure." RuntimeException if couldn't connect to the database. + - Failure to initialize a database connection will now throw a ``RuntimeException``. Version 3.0.4 diff --git a/user_guide_src/source/database/db_driver_reference.rst b/user_guide_src/source/database/db_driver_reference.rst index 1e436ede18d..f0a4388835e 100644 --- a/user_guide_src/source/database/db_driver_reference.rst +++ b/user_guide_src/source/database/db_driver_reference.rst @@ -19,6 +19,7 @@ This article is intended to be a reference for them. :returns: TRUE on success, FALSE on failure :rtype: bool + :throws: RuntimeException In case of failure Initialize database settings, establish a connection to the database. From ce8fa5acfe0e7f9d8b974fa470201a9404667b3d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 14 Dec 2015 12:57:09 +0200 Subject: [PATCH 4082/5397] Fix #4312 --- system/libraries/Form_validation.php | 9 +++------ user_guide_src/source/changelog.rst | 1 + 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index a158225eea6..c2212585d89 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -415,12 +415,9 @@ public function error_string($prefix = '', $suffix = '') */ public function run($group = '') { - // Do we even have any data to process? Mm? - $validation_array = empty($this->validation_data) ? $_POST : $this->validation_data; - if (count($validation_array) === 0) - { - return FALSE; - } + $validation_array = empty($this->validation_data) + ? $_POST + : $this->validation_data; // Does the _field_data array containing the validation rules exist? // If not, we look to see if they were assigned via a config file diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index caa4455d8ce..ab08c2f6e23 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -26,6 +26,7 @@ Bug fixes for 3.0.4 - Fixed a bug (#4306) - :doc:`Database ` method ``version()`` didn't work properly with the 'mssql' driver. - Fixed a bug (#4039) - :doc:`Session Library ` could generate multiple (redundant) warnings in case of a read failure with the 'files' driver, due to a bug in PHP. - Fixed a bug where :doc:`Session Library ` didn't have proper error handling on PHP 5 (due to a PHP bug). +- Fixed a bug (#4312) - :doc:`Form Validation Library ` didn't provide error feedback for failed validation on empty requests. Version 3.0.3 ============= From 27ba5e6957c9e245478285191b5a88df4bcdc5bb Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 14 Dec 2015 13:05:33 +0200 Subject: [PATCH 4083/5397] Close #4313 --- system/database/DB_driver.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 25e70ec3f2b..bfe9dd4b071 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -504,6 +504,18 @@ public function db_select() // -------------------------------------------------------------------- + /** + * Last error + * + * @return array + */ + public function error() + { + return array('code' => NULL, 'message' => NULL); + } + + // -------------------------------------------------------------------- + /** * Set client character set * From bc05b84995d5425d6bdc28c43174e70b720840ce Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 14 Dec 2015 16:22:33 +0200 Subject: [PATCH 4084/5397] Fix version() for Oracle DB drivers --- system/database/drivers/oci8/oci8_driver.php | 8 +++++-- .../drivers/pdo/subdrivers/pdo_oci_driver.php | 23 +++++++++++++++++++ user_guide_src/source/changelog.rst | 1 + 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 916ddeb9072..206924d0637 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -252,12 +252,16 @@ public function version() return $this->data_cache['version']; } - if ( ! $this->conn_id OR ($version = oci_server_version($this->conn_id)) === FALSE) + if ( ! $this->conn_id OR ($version_string = oci_server_version($this->conn_id)) === FALSE) { return FALSE; } + elseif (preg_match('#Release\s(\d+(?:\.\d+)+)#', $version_string, $match)) + { + return $this->data_cache['version'] = $match[1]; + } - return $this->data_cache['version'] = $version; + return FALSE; } // -------------------------------------------------------------------- diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php index d17e311f743..4791ab15701 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php @@ -129,6 +129,29 @@ public function __construct($params) // -------------------------------------------------------------------- + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + $version_string = parent::version(); + if (preg_match('#Release\s(?\d+(?:\.\d+)+)#', $version_string, $match)) + { + return $this->data_cache['version'] = $match[1]; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + /** * Show table query * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ab08c2f6e23..3b832b3a9a7 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -27,6 +27,7 @@ Bug fixes for 3.0.4 - Fixed a bug (#4039) - :doc:`Session Library ` could generate multiple (redundant) warnings in case of a read failure with the 'files' driver, due to a bug in PHP. - Fixed a bug where :doc:`Session Library ` didn't have proper error handling on PHP 5 (due to a PHP bug). - Fixed a bug (#4312) - :doc:`Form Validation Library ` didn't provide error feedback for failed validation on empty requests. +- Fixed a bug where :doc:`Database ` method `version()` returned banner text instead of only the version number with the 'oci8' and 'pdo/oci' drivers. Version 3.0.3 ============= From 85bc9fc53e4c3e46b2f4e1b1eac7e2828d4869e6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 14 Dec 2015 17:56:14 +0200 Subject: [PATCH 4085/5397] Change DB charset handling Close #4311 --- system/database/DB_driver.php | 32 +------------ .../database/drivers/mssql/mssql_driver.php | 14 +----- .../database/drivers/mysql/mysql_driver.php | 31 +++++++------ .../database/drivers/mysqli/mysqli_driver.php | 20 +++------ .../drivers/postgre/postgre_driver.php | 20 +++------ user_guide_src/source/changelog.rst | 5 ++- .../source/database/db_driver_reference.rst | 11 +---- .../source/installation/upgrade_310.rst | 45 +++++++++++++++++++ 8 files changed, 81 insertions(+), 97 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 885a814bebf..af6b9f399e8 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -380,7 +380,7 @@ public function __construct($params) /** * Initialize Database Settings * - * @return bool + * @return void * @throws RuntimeException In case of failure */ public function initialize() @@ -393,7 +393,7 @@ public function initialize() */ if ($this->conn_id) { - return TRUE; + return; } // ---------------------------------------------------------------- @@ -433,9 +433,6 @@ public function initialize() throw new RuntimeException('Unable to connect to the database.'); } } - - // Now we set the character set and that's all - return $this->db_set_charset($this->char_set); } // -------------------------------------------------------------------- @@ -510,31 +507,6 @@ public function error() // -------------------------------------------------------------------- - /** - * Set client character set - * - * @param string - * @return bool - */ - public function db_set_charset($charset) - { - if (method_exists($this, '_db_set_charset') && ! $this->_db_set_charset($charset)) - { - log_message('error', 'Unable to set database connection charset: '.$charset); - - if ($this->db_debug) - { - $this->display_error('db_unable_to_set_charset', $charset); - } - - return FALSE; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - /** * The name of the platform in use (mysql, mssql, etc...) * diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index b9e310a3af2..bf18babeb07 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -108,6 +108,7 @@ public function __construct($params) */ public function db_connect($persistent = FALSE) { + ini_set('mssql.charset', $this->char_set); $this->conn_id = ($persistent) ? mssql_pconnect($this->hostname, $this->username, $this->password) : mssql_connect($this->hostname, $this->username, $this->password); @@ -247,19 +248,6 @@ public function insert_id() // -------------------------------------------------------------------- - /** - * Set client character set - * - * @param string $charset - * @return bool - */ - protected function _db_set_charset($charset) - { - return (ini_set('mssql.charset', $charset) !== FALSE); - } - - // -------------------------------------------------------------------- - /** * Version number query string * diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 9c630d0d666..76f50368ff8 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -147,12 +147,24 @@ public function db_connect($persistent = FALSE) : FALSE; } - if ($this->stricton && is_resource($this->conn_id)) + if (is_resource($this->conn_id)) { - $this->simple_query('SET SESSION sql_mode="STRICT_ALL_TABLES"'); + if ( ! mysql_set_charset($this->char_set, $this->conn_id)) + { + log_message('error', "Database: Unable to set the configured connection charset ('{$this->char_set}')."); + $this->close(); + return ($this->db->debug) ? $this->display_error('db_unable_to_set_charset', $charset) : FALSE; + } + + if ($this->stricton) + { + $this->simple_query('SET SESSION sql_mode="STRICT_ALL_TABLES"'); + } + + return $this->conn_id; } - return $this->conn_id; + return FALSE; } // -------------------------------------------------------------------- @@ -199,19 +211,6 @@ public function db_select($database = '') // -------------------------------------------------------------------- - /** - * Set client character set - * - * @param string $charset - * @return bool - */ - protected function _db_set_charset($charset) - { - return mysql_set_charset($charset, $this->conn_id); - } - - // -------------------------------------------------------------------- - /** * Database version number * diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 8274700781a..f9a20ea2f71 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -173,6 +173,13 @@ public function db_connect($persistent = FALSE) return ($this->db->db_debug) ? $this->db->display_error($message, '', TRUE) : FALSE; } + if ( ! $mysqli->set_charset($this->char_set)) + { + log_message('error', "Database: Unable to set the configured connection charset ('{$this->char_set}')."); + $mysqli->close(); + return ($this->db->db_debug) ? $this->display_error('db_unable_to_set_charset', $charset) : FALSE; + } + return $mysqli; } @@ -223,19 +230,6 @@ public function db_select($database = '') // -------------------------------------------------------------------- - /** - * Set client character set - * - * @param string $charset - * @return bool - */ - protected function _db_set_charset($charset) - { - return $this->conn_id->set_charset($charset); - } - - // -------------------------------------------------------------------- - /** * Database version number * diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index b1df326f7eb..e4db12d6984 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -163,6 +163,13 @@ public function db_connect($persistent = FALSE) return FALSE; } + if (pg_set_client_encoding($this->conn_id, $charset) !== 0) + { + log_message('error', "Database: Unable to set the configured connection charset ('{$this->char_set}')."); + pg_close($this->conn_id); + return ($this->db->db_debug) ? $this->display_error('db_unable_to_set_charset', $charset) : FALSE; + } + empty($this->schema) OR $this->simple_query('SET search_path TO '.$this->schema.',public'); } @@ -189,19 +196,6 @@ public function reconnect() // -------------------------------------------------------------------- - /** - * Set client character set - * - * @param string $charset - * @return bool - */ - protected function _db_set_charset($charset) - { - return (pg_set_client_encoding($this->conn_id, $charset) === 0); - } - - // -------------------------------------------------------------------- - /** * Database version number * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 6d74747650e..3c0dc8a7273 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -13,8 +13,9 @@ Release Date: Not Released - Database - - Failure to initialize a database connection will now throw a ``RuntimeException``. - + - Changed method ``initialize()`` to return void and instead throw a ``RuntimeException`` in case of failure. + - Changed method ``db_connect()`` to always set the connection character set (if supported by the driver) and to fail if it can't. + - Removed method ``db_set_charset()`` and the ability to change a connection character set at runtime. Version 3.0.4 ============= diff --git a/user_guide_src/source/database/db_driver_reference.rst b/user_guide_src/source/database/db_driver_reference.rst index f0a4388835e..75d1538bde3 100644 --- a/user_guide_src/source/database/db_driver_reference.rst +++ b/user_guide_src/source/database/db_driver_reference.rst @@ -17,8 +17,7 @@ This article is intended to be a reference for them. .. php:method:: initialize() - :returns: TRUE on success, FALSE on failure - :rtype: bool + :rtype: void :throws: RuntimeException In case of failure Initialize database settings, establish a connection to @@ -62,14 +61,6 @@ This article is intended to be a reference for them. Select / switch the current database. - .. php:method:: db_set_charset($charset) - - :param string $charset: Character set name - :returns: TRUE on success, FALSE on failure - :rtype: bool - - Set client character set. - .. php:method:: platform() :returns: Platform name diff --git a/user_guide_src/source/installation/upgrade_310.rst b/user_guide_src/source/installation/upgrade_310.rst index 7060ebc4c7d..37772cd4f1e 100644 --- a/user_guide_src/source/installation/upgrade_310.rst +++ b/user_guide_src/source/installation/upgrade_310.rst @@ -12,3 +12,48 @@ Replace all files and directories in your *system/* directory. .. note:: If you have any custom developed files in these directories, please make copies of them first. + +Step 2: Change database connection handling +=========================================== + +"Loading" a database, whether by using the *config/autoload.php* settings +or manually via calling ``$this->load->database()`` or the less-known +``DB()`` function, will now throw a ``RuntimeException`` in case of a +failure. + +In addition, being unable to set the configured character set is now also +considered a connection failure. + +.. note:: This has been the case for most database drivers in the in the + past as well (i.e. all but the 'mysql', 'mysqli' and 'postgre' + drivers). + +What this means is that if you're unable to connect to a database, or +have an erroneous character set configured, CodeIgniter will no longer +fail silently, but will throw an exception instead. + +You may choose to explicitly catch it (and for that purpose you can't use +*config/autoload.php* to load the :doc:`Database Class <../database/index>`) +:: + + try + { + $this->load->database(); + } + catch (RuntimeException $e) + { + // Handle the failure + } + +Or you may leave it to CodeIgniter's default exception handler, which would +log the error message and display an error screen if you're running in +development mode. + +Remove db_set_charset() calls +----------------------------- + +With the above-mentioned changes, the purpose of the ``db_set_charset()`` +method would now only be to change the connection character set at runtime. +That doesn't make sense and that's the reason why most database drivers +don't support it at all. +Thus, ``db_set_charset()`` is no longer necessary and is removed. From 2dc9a352b7cb55255b54b5bab6ba2fc83fc86dbe Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 14 Dec 2015 17:57:23 +0200 Subject: [PATCH 4086/5397] Remove PHP 7 from allowed_failures in Travis --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index adc60d759d3..5a7eb11b9f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,6 @@ matrix: allow_failures: - php: 5.2 - php: hhvm - - php: 7 exclude: - php: hhvm env: DB=pgsql From 377a18a22307692c318235a7420c29d056c1a5c4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 14 Dec 2015 17:57:23 +0200 Subject: [PATCH 4087/5397] Remove PHP 7 from allowed_failures in Travis --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index adc60d759d3..5a7eb11b9f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,6 @@ matrix: allow_failures: - php: 5.2 - php: hhvm - - php: 7 exclude: - php: hhvm env: DB=pgsql From d3c8134b1342dc403df2faf3e63e4bdcdfbd4b92 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 14 Dec 2015 18:01:25 +0200 Subject: [PATCH 4088/5397] Adjust test case for changes from 85bc9fc53e4c3e46b2f4e1b1eac7e2828d4869e6 --- tests/codeigniter/database/DB_driver_test.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/codeigniter/database/DB_driver_test.php b/tests/codeigniter/database/DB_driver_test.php index 26416d3fcae..13e9abf8440 100644 --- a/tests/codeigniter/database/DB_driver_test.php +++ b/tests/codeigniter/database/DB_driver_test.php @@ -7,8 +7,6 @@ public function test_initialize() $config = Mock_Database_DB::config(DB_DRIVER); sscanf(DB_DRIVER, '%[^/]/', $driver_name); $driver = $this->{$driver_name}($config[DB_DRIVER]); - - $this->assertTrue($driver->initialize()); } protected function pdo($config) From f437fd20a78b9f28405d1ebba5f7ed53b1a33545 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 14 Dec 2015 18:06:49 +0200 Subject: [PATCH 4089/5397] Fix erroneous variables from 85bc9fc53e4c3e46b2f4e1b1eac7e2828d4869e6 --- system/database/drivers/mysql/mysql_driver.php | 2 +- system/database/drivers/mysqli/mysqli_driver.php | 2 +- system/database/drivers/postgre/postgre_driver.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 76f50368ff8..3fafe3fd8ac 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -153,7 +153,7 @@ public function db_connect($persistent = FALSE) { log_message('error', "Database: Unable to set the configured connection charset ('{$this->char_set}')."); $this->close(); - return ($this->db->debug) ? $this->display_error('db_unable_to_set_charset', $charset) : FALSE; + return ($this->db->debug) ? $this->display_error('db_unable_to_set_charset', $this->char_set) : FALSE; } if ($this->stricton) diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index f9a20ea2f71..847544780f0 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -177,7 +177,7 @@ public function db_connect($persistent = FALSE) { log_message('error', "Database: Unable to set the configured connection charset ('{$this->char_set}')."); $mysqli->close(); - return ($this->db->db_debug) ? $this->display_error('db_unable_to_set_charset', $charset) : FALSE; + return ($this->db->db_debug) ? $this->display_error('db_unable_to_set_charset', $this->char_set) : FALSE; } return $mysqli; diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index e4db12d6984..2d4e5a5d591 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -163,11 +163,11 @@ public function db_connect($persistent = FALSE) return FALSE; } - if (pg_set_client_encoding($this->conn_id, $charset) !== 0) + if (pg_set_client_encoding($this->conn_id, $this->char_set) !== 0) { log_message('error', "Database: Unable to set the configured connection charset ('{$this->char_set}')."); pg_close($this->conn_id); - return ($this->db->db_debug) ? $this->display_error('db_unable_to_set_charset', $charset) : FALSE; + return ($this->db->db_debug) ? $this->display_error('db_unable_to_set_charset', $this->char_set) : FALSE; } empty($this->schema) OR $this->simple_query('SET search_path TO '.$this->schema.',public'); From 2d6d9ab0bfeb546d8c9d7924af7ccc095f798e41 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 15 Dec 2015 12:32:50 +0200 Subject: [PATCH 4090/5397] Really fix #4039 A typo from 8df6efd402180a6361b4dd619f5535d6c2bed334 --- system/libraries/Session/drivers/Session_files_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index f0f055f87cc..1a943d5c921 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -185,7 +185,7 @@ public function read($session_id) } // We shouldn't need this, but apparently we do ... // See https://github.com/bcit-ci/CodeIgniter/issues/4039 - elseif ($this->_file_handler === FALSE) + elseif ($this->_file_handle === FALSE) { return $this->_failure; } From bb71dbadb7441a97a09e1e6d90fbddc884af67d1 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 15 Dec 2015 13:00:52 +0200 Subject: [PATCH 4091/5397] Fix logical errors from af849696d43f5c3b68962af1ae5096151a6d9f1a --- system/libraries/Session/drivers/Session_database_driver.php | 2 +- system/libraries/Session/drivers/Session_files_driver.php | 4 ++-- system/libraries/Session/drivers/Session_redis_driver.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index 40a358fb876..f2adacb6b6e 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -299,7 +299,7 @@ public function destroy($session_id) } } - if ($this->close()) + if ($this->close() === $this->_success) { $this->_cookie_destroy(); return $this->_success; diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index 1a943d5c921..c540996a7ff 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -224,7 +224,7 @@ public function write($session_id, $session_data) { // If the two IDs don't match, we have a session_regenerate_id() call // and we need to close the old handle and open a new one - if ($session_id !== $this->_session_id && ( ! $this->close() OR $this->read($session_id) === FALSE)) + if ($session_id !== $this->_session_id && ($this->close() === $this->_failure OR $this->read($session_id) === $this->_failure)) { return $this->_failure; } @@ -302,7 +302,7 @@ public function close() */ public function destroy($session_id) { - if ($this->close()) + if ($this->close() === $this->_success) { if (file_exists($this->_file_path.$session_id)) { diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index e8915306f7c..b60ef6b343a 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -242,7 +242,7 @@ public function close() if ($this->_redis->ping() === '+PONG') { isset($this->_lock_key) && $this->_redis->delete($this->_lock_key); - if ( ! $this->_redis->close()) + if ($this->_redis->close() === $this->_failure) { return $this->_failure; } From 3933a3f8a96346d45d98d2c15a41b14ec1f970b2 Mon Sep 17 00:00:00 2001 From: Suhindra Date: Thu, 17 Dec 2015 09:04:05 +0700 Subject: [PATCH 4092/5397] added Vivaldi browser added new browser Vivaldi --- application/config/user_agents.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/application/config/user_agents.php b/application/config/user_agents.php index 1129dbacd48..721ec08d3a9 100644 --- a/application/config/user_agents.php +++ b/application/config/user_agents.php @@ -87,7 +87,8 @@ 'amaya' => 'Amaya', 'IBrowse' => 'IBrowse', 'Maxthon' => 'Maxthon', - 'Ubuntu' => 'Ubuntu Web Browser' + 'Ubuntu' => 'Ubuntu Web Browser', + 'Vivaldi' => 'Vivaldi' ); $mobiles = array( From db68d401f67496ba5e495dd36adabe6d85187b44 Mon Sep 17 00:00:00 2001 From: Sai Phaninder Reddy Jonnala Date: Mon, 21 Dec 2015 11:33:57 -0500 Subject: [PATCH 4093/5397] Refactoring the `CI_Log` line formatting - Extracting the `CI_Log` line formatting into a protected function `_format_log_line()` so as to make it easy to change the log line format via extending the class and overriding the method. --- system/core/Log.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/system/core/Log.php b/system/core/Log.php index e8cb401f57f..cf2793a564e 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -204,7 +204,7 @@ public function write_log($level, $msg) $date = date($this->_date_fmt); } - $message .= $level.' - '.$date.' --> '.$msg."\n"; + $message .= $this->_format_log_line($level, $date, $msg); flock($fp, LOCK_EX); @@ -227,4 +227,20 @@ public function write_log($level, $msg) return is_int($result); } + /** + * Format the log line. + * + * This is for extensibility of log formatting. + * If you want to change the log format, + * extend the CI_Log class and override this method. + * + * @param $level + * @param $date + * @param $msg + * + * @return string formatted log line with a new line character '\n' at the end. + */ + protected function _format_log_line($level, $date, $msg){ + return $level.' - '.$date.' --> '.$msg."\n"; + } } From 3ac1fd1af92a1d45f9624fff99f5e0692c59d7c6 Mon Sep 17 00:00:00 2001 From: Sai Phaninder Reddy Jonnala Date: Mon, 21 Dec 2015 12:27:40 -0500 Subject: [PATCH 4094/5397] fixing my blatant mistakes in styling the code --- system/core/Log.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/system/core/Log.php b/system/core/Log.php index cf2793a564e..0e1f7e2acc7 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -234,13 +234,13 @@ public function write_log($level, $msg) * If you want to change the log format, * extend the CI_Log class and override this method. * - * @param $level - * @param $date - * @param $msg - * - * @return string formatted log line with a new line character '\n' at the end. + * @param string the error level: 'error', 'debug' or 'info' + * @param string formatted date string + * @param string the log message + * @return string formatted log line with a new line character '\n' at the end. */ - protected function _format_log_line($level, $date, $msg){ + protected function _format_log_line($level, $date, $msg) + { return $level.' - '.$date.' --> '.$msg."\n"; } } From f3b711fd9f7d8e096bf774f9c6cfc0a4ca075919 Mon Sep 17 00:00:00 2001 From: Sai Phaninder Reddy Jonnala Date: Mon, 28 Dec 2015 15:19:31 -0500 Subject: [PATCH 4095/5397] Refactor: logic to get the rule's error message --- system/libraries/Form_validation.php | 73 ++++++++++++++++------------ 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index c2212585d89..12cfdff4324 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -637,21 +637,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) // Set the message type $type = in_array('required', $rules) ? 'required' : 'isset'; - // Check if a custom message is defined - if (isset($this->_field_data[$row['field']]['errors'][$type])) - { - $line = $this->_field_data[$row['field']]['errors'][$type]; - } - elseif (isset($this->_error_messages[$type])) - { - $line = $this->_error_messages[$type]; - } - elseif (FALSE === ($line = $this->CI->lang->line('form_validation_'.$type)) - // DEPRECATED support for non-prefixed keys - && FALSE === ($line = $this->CI->lang->line($type, FALSE))) - { - $line = 'The field was not set'; - } + $line = $this->_get_raw_error_message($type, $row); // Build the error message $message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label'])); @@ -820,23 +806,9 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) { $line = $this->CI->lang->line('form_validation_error_message_not_set').'(Anonymous function)'; } - // Check if a custom message is defined - elseif (isset($this->_field_data[$row['field']]['errors'][$rule])) - { - $line = $this->_field_data[$row['field']]['errors'][$rule]; - } - elseif ( ! isset($this->_error_messages[$rule])) - { - if (FALSE === ($line = $this->CI->lang->line('form_validation_'.$rule)) - // DEPRECATED support for non-prefixed keys - && FALSE === ($line = $this->CI->lang->line($rule, FALSE))) - { - $line = $this->CI->lang->line('form_validation_error_message_not_set').'('.$rule.')'; - } - } else { - $line = $this->_error_messages[$rule]; + $line = $this->_get_raw_error_message($rule, $row); } // Is the parameter we are inserting into the error message the name @@ -864,6 +836,47 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) // -------------------------------------------------------------------- + /** + * Get the error message for the rule + * + * @param string the rule name. + * @param array + * @return string + */ + private function _get_raw_error_message($key, $row) + { + $error_message = ''; + // Check if a custom message is defined through validation config row. + if (isset($this->_field_data[$row['field']]['errors'][$key])) + { + $error_message = $this->_field_data[$row['field']]['errors'][$key]; + } + // check if a custom message has been set using the set_message() function + elseif (isset($this->_error_messages[$key])) + { + $error_message = $this->_error_messages[$key]; + } + // check if we have an error message in lang file + elseif (FALSE !== ($line_tmp = $this->CI->lang->line('form_validation_'.$key))) + { + $error_message = $line_tmp; + } + // DEPRECATED support for non-prefixed keys, lang file again + elseif (FALSE !== ($line_tmp = $this->CI->lang->line($key, FALSE))) + { + $error_message = $line_tmp; + } + //error message not found + else + { + $error_message = $this->CI->lang->line('form_validation_error_message_not_set').'('.$key.')'; + } + + return $error_message; + } + + // -------------------------------------------------------------------- + /** * Translate a field name * From 0951e58f94c970a03f8ac2d5cba31d122bfa948a Mon Sep 17 00:00:00 2001 From: Sai Phaninder Reddy Jonnala Date: Mon, 28 Dec 2015 15:28:02 -0500 Subject: [PATCH 4096/5397] renamed variable for better readability. --- system/libraries/Form_validation.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 12cfdff4324..a34694bfea3 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -843,33 +843,33 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) * @param array * @return string */ - private function _get_raw_error_message($key, $row) + private function _get_raw_error_message($rule_name, $row) { $error_message = ''; - // Check if a custom message is defined through validation config row. - if (isset($this->_field_data[$row['field']]['errors'][$key])) + // check if a custom message is defined through validation config row. + if (isset($this->_field_data[$row['field']]['errors'][$rule_name])) { - $error_message = $this->_field_data[$row['field']]['errors'][$key]; + $error_message = $this->_field_data[$row['field']]['errors'][$rule_name]; } // check if a custom message has been set using the set_message() function - elseif (isset($this->_error_messages[$key])) + elseif (isset($this->_error_messages[$rule_name])) { - $error_message = $this->_error_messages[$key]; + $error_message = $this->_error_messages[$rule_name]; } // check if we have an error message in lang file - elseif (FALSE !== ($line_tmp = $this->CI->lang->line('form_validation_'.$key))) + elseif (FALSE !== ($line_tmp = $this->CI->lang->line('form_validation_'.$rule_name))) { $error_message = $line_tmp; } // DEPRECATED support for non-prefixed keys, lang file again - elseif (FALSE !== ($line_tmp = $this->CI->lang->line($key, FALSE))) + elseif (FALSE !== ($line_tmp = $this->CI->lang->line($rule_name, FALSE))) { $error_message = $line_tmp; } - //error message not found + // error message not found else { - $error_message = $this->CI->lang->line('form_validation_error_message_not_set').'('.$key.')'; + $error_message = $this->CI->lang->line('form_validation_error_message_not_set').'('.$rule_name.')'; } return $error_message; From 0f13e09ebb153315539e1ff7f77698f2709996b5 Mon Sep 17 00:00:00 2001 From: Sai Phaninder Reddy Jonnala Date: Mon, 28 Dec 2015 15:45:03 -0500 Subject: [PATCH 4097/5397] block comment formatting --- system/libraries/Form_validation.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index a34694bfea3..c37a734188a 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -839,9 +839,9 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) /** * Get the error message for the rule * - * @param string the rule name. - * @param array - * @return string + * @param string the rule name. + * @param array + * @return string */ private function _get_raw_error_message($rule_name, $row) { From 20105a70a79c39aeffb06861e982558610ec8a43 Mon Sep 17 00:00:00 2001 From: Gordon Murray Date: Tue, 29 Dec 2015 13:24:34 +0000 Subject: [PATCH 4098/5397] Renamed Step 20 to Step 21 There were two Step 20's --- user_guide_src/source/installation/upgrade_300.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index a29f400f8fb..45ce2132031 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -855,7 +855,7 @@ It is now deprecated and scheduled for removal in CodeIgniter 3.1+. sooner rather than later. *********************************************************** -Step 20: Check your usage of Text helper highlight_phrase() +Step 21: Check your usage of Text helper highlight_phrase() *********************************************************** The default HTML tag used by :doc:`Text Helper <../helpers/text_helper>` function From f3ddda7ee890d5375f5c4fece118b7663dc465e2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 30 Dec 2015 21:38:54 +0200 Subject: [PATCH 4099/5397] Fix #4331 --- .../database/drivers/mysqli/mysqli_driver.php | 37 ++++++++++++------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 8274700781a..693a96bab56 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -97,6 +97,17 @@ class CI_DB_mysqli_driver extends CI_DB { // -------------------------------------------------------------------- + /** + * MySQLi object + * + * Has to be preserved without being assigned to $conn_id. + * + * @var MySQLi + */ + protected $_mysqli; + + // -------------------------------------------------------------------- + /** * Database connection * @@ -122,13 +133,13 @@ public function db_connect($persistent = FALSE) } $client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0; - $mysqli = mysqli_init(); + $this->_mysqli = mysqli_init(); - $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10); + $this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10); if ($this->stricton) { - $mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode="STRICT_ALL_TABLES"'); + $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode="STRICT_ALL_TABLES"'); } if (is_array($this->encrypt)) @@ -144,11 +155,11 @@ public function db_connect($persistent = FALSE) { if ( ! empty($this->encrypt['ssl_verify']) && defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT')) { - $mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, TRUE); + $this->_mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, TRUE); } $client_flags |= MYSQLI_CLIENT_SSL; - $mysqli->ssl_set( + $this->_mysqli->ssl_set( isset($ssl['key']) ? $ssl['key'] : NULL, isset($ssl['cert']) ? $ssl['cert'] : NULL, isset($ssl['ca']) ? $ssl['ca'] : NULL, @@ -158,22 +169,22 @@ public function db_connect($persistent = FALSE) } } - if ($mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, $socket, $client_flags)) + if ($this->_mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, $socket, $client_flags)) { // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails if ( ($client_flags & MYSQLI_CLIENT_SSL) - && version_compare($mysqli->client_info, '5.7.3', '<=') - && empty($mysqli->query("SHOW STATUS LIKE 'ssl_cipher'")->fetch_object()->Value) + && version_compare($this->_mysqli->client_info, '5.7.3', '<=') + && empty($this->_mysqli->query("SHOW STATUS LIKE 'ssl_cipher'")->fetch_object()->Value) ) { - $mysqli->close(); + $this->_mysqli->close(); $message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!'; log_message('error', $message); return ($this->db->db_debug) ? $this->db->display_error($message, '', TRUE) : FALSE; } - return $mysqli; + return $this->_mysqli; } return FALSE; @@ -457,11 +468,11 @@ public function field_data($table) */ public function error() { - if ( ! empty($this->conn_id->connect_errno)) + if ( ! empty($this->_mysqli->connect_errno)) { return array( - 'code' => $this->conn_id->connect_errno, - 'message' => is_php('5.2.9') ? $this->conn_id->connect_error : mysqli_connect_error() + 'code' => $this->_mysqli->connect_errno, + 'message' => is_php('5.2.9') ? $this->_mysqli->connect_error : mysqli_connect_error() ); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 3b832b3a9a7..3f220484759 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -28,6 +28,7 @@ Bug fixes for 3.0.4 - Fixed a bug where :doc:`Session Library ` didn't have proper error handling on PHP 5 (due to a PHP bug). - Fixed a bug (#4312) - :doc:`Form Validation Library ` didn't provide error feedback for failed validation on empty requests. - Fixed a bug where :doc:`Database ` method `version()` returned banner text instead of only the version number with the 'oci8' and 'pdo/oci' drivers. +- Fixed a bug (#4331) - :doc:`Database ` method ``error()`` didn't really work for connection errors with the 'mysqli' driver. Version 3.0.3 ============= From 9d84d3cb5cb2dd4044e57bfcbe81c423adab6d7c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 30 Dec 2015 21:50:20 +0200 Subject: [PATCH 4100/5397] Fix #4343 --- system/libraries/Email.php | 3 +-- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 034586ac956..754dd1784fa 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1854,8 +1854,7 @@ protected function _send_with_sendmail() // is popen() enabled? if ( ! function_usable('popen') OR FALSE === ($fp = @popen( - $this->mailpath.' -oi -f '.$this->clean_email($this->_headers['From']) - .' -t -r '.$this->clean_email($this->_headers['Return-Path']) + $this->mailpath.' -oi -f '.$this->clean_email($this->_headers['From']).' -t' , 'w')) ) // server probably has popen disabled, so nothing we can do to get a verbose error. { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 3f220484759..09b51ce6888 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -29,6 +29,7 @@ Bug fixes for 3.0.4 - Fixed a bug (#4312) - :doc:`Form Validation Library ` didn't provide error feedback for failed validation on empty requests. - Fixed a bug where :doc:`Database ` method `version()` returned banner text instead of only the version number with the 'oci8' and 'pdo/oci' drivers. - Fixed a bug (#4331) - :doc:`Database ` method ``error()`` didn't really work for connection errors with the 'mysqli' driver. +- Fixed a bug (#4343) - :doc:`Email Library ` failing with a *"More than one 'from' person"* message when using *sendmail*. Version 3.0.3 ============= From f603b44cbc497b85fe31fbf0bb4bf170d964f40d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 30 Dec 2015 21:53:40 +0200 Subject: [PATCH 4101/5397] Merge pull request #4345 from murrion/develop [ci skip] Corrected step 21 number in 3.0.0 upgrade instructions --- user_guide_src/source/installation/upgrade_300.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index a29f400f8fb..45ce2132031 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -855,7 +855,7 @@ It is now deprecated and scheduled for removal in CodeIgniter 3.1+. sooner rather than later. *********************************************************** -Step 20: Check your usage of Text helper highlight_phrase() +Step 21: Check your usage of Text helper highlight_phrase() *********************************************************** The default HTML tag used by :doc:`Text Helper <../helpers/text_helper>` function From 673413e06d05b5695bd7cc1d90c9d66a93aaa955 Mon Sep 17 00:00:00 2001 From: paranic Date: Sat, 2 Jan 2016 00:21:52 +0200 Subject: [PATCH 4102/5397] typo correction to avoid copy paste error --- user_guide_src/source/libraries/image_lib.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/image_lib.rst b/user_guide_src/source/libraries/image_lib.rst index 40a280b5cee..d5c24c1b097 100644 --- a/user_guide_src/source/libraries/image_lib.rst +++ b/user_guide_src/source/libraries/image_lib.rst @@ -471,4 +471,4 @@ Class Reference Returns all detected errors formatted as a string. :: - echo $this->image_lib->diplay_errors(); \ No newline at end of file + echo $this->image_lib->display_errors(); From 6bb9170b2f19b5b327e5c6998cbce414c5d28b50 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 2 Jan 2016 02:14:20 +0200 Subject: [PATCH 4103/5397] Merge pull request #4353 from paranic/patch-1 [ci skip] Docs typo correction --- user_guide_src/source/libraries/image_lib.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/image_lib.rst b/user_guide_src/source/libraries/image_lib.rst index e5f7c000fbc..27d2eb98c3f 100644 --- a/user_guide_src/source/libraries/image_lib.rst +++ b/user_guide_src/source/libraries/image_lib.rst @@ -471,4 +471,4 @@ Class Reference Returns all detected errors formatted as a string. :: - echo $this->image_lib->diplay_errors(); \ No newline at end of file + echo $this->image_lib->display_errors(); From 0b1efb38293416b13aee8d1d9505e97d2efade5f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 4 Jan 2016 12:34:14 +0200 Subject: [PATCH 4104/5397] Fix #4350 --- system/core/Loader.php | 32 ++++++++++++++++++++++++++++- user_guide_src/source/changelog.rst | 1 + 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index 18e4c5287a9..87f21b27939 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -285,9 +285,39 @@ public function model($model, $name = '', $db_conn = FALSE) $this->database($db_conn, FALSE, TRUE); } + // Note: All of the code under this condition used to be just: + // + // load_class('Model', 'core'); + // + // However, load_class() instantiates classes + // to cache them for later use and that prevents + // MY_Model from being an abstract class and is + // sub-optimal otherwise anyway. if ( ! class_exists('CI_Model', FALSE)) { - load_class('Model', 'core'); + $app_path = APPPATH.'core'.DIRECTORY_SEPARATOR; + if (file_exists($app_path.'Model.php')) + { + require_once($app_path.'Model.php'); + if ( ! class_exists('CI_Model', FALSE)) + { + throw new RuntimeException($app_path."Model.php exists, but doesn't declare class CI_Model"); + } + } + elseif ( ! class_exists('CI_Model', FALSE)) + { + require_once(BASEPATH.'core'.DIRECTORY_SEPARATOR.'Model.php'); + } + + $class = config_item('subclass_prefix').'Model'; + if (file_exists($app_path.$class.'.php')) + { + require_once($app_path.$class.'.php'); + if ( ! class_exists($class, FALSE)) + { + throw new RuntimeException($app_path.$class.".php exists, but doesn't declare class ".$class); + } + } } $model = ucfirst($model); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 09b51ce6888..c189767d88d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -30,6 +30,7 @@ Bug fixes for 3.0.4 - Fixed a bug where :doc:`Database ` method `version()` returned banner text instead of only the version number with the 'oci8' and 'pdo/oci' drivers. - Fixed a bug (#4331) - :doc:`Database ` method ``error()`` didn't really work for connection errors with the 'mysqli' driver. - Fixed a bug (#4343) - :doc:`Email Library ` failing with a *"More than one 'from' person"* message when using *sendmail*. +- Fixed a bug (#4350) - :doc:`Loader Library ` method ``model()`` logic directly instantiated the ``CI_Model`` or ``MY_Model`` classes. Version 3.0.3 ============= From 0ca9ae6ca109177eb0e80456b097a9d63412517e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 6 Jan 2016 14:51:27 +0200 Subject: [PATCH 4105/5397] Fix #4337 --- system/database/drivers/odbc/odbc_driver.php | 18 ++++++++++++++++++ .../drivers/pdo/subdrivers/pdo_odbc_driver.php | 18 ++++++++++++++++++ .../pdo/subdrivers/pdo_pgsql_driver.php | 7 ++++++- .../drivers/postgre/postgre_driver.php | 7 ++++++- user_guide_src/source/changelog.rst | 3 ++- 5 files changed, 50 insertions(+), 3 deletions(-) diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 409284b44e5..e12ad53bc36 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -188,6 +188,24 @@ protected function _trans_rollback() // -------------------------------------------------------------------- + /** + * Determines if a query is a "write" type. + * + * @param string An SQL query string + * @return bool + */ + public function is_write_type($sql) + { + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) + { + return FALSE; + } + + return parent::is_write_type($sql); + } + + // -------------------------------------------------------------------- + /** * Platform-dependant string escape * diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php index 51c70b630f3..4df2de8baa6 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php @@ -160,6 +160,24 @@ public function __construct($params) // -------------------------------------------------------------------- + /** + * Determines if a query is a "write" type. + * + * @param string An SQL query string + * @return bool + */ + public function is_write_type($sql) + { + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) + { + return FALSE; + } + + return parent::is_write_type($sql); + } + + // -------------------------------------------------------------------- + /** * Show table query * diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php index 2dd41ca8728..79c3c7be0d1 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php @@ -154,7 +154,12 @@ public function insert_id($name = NULL) */ public function is_write_type($sql) { - return (bool) preg_match('/^\s*"?(SET|INSERT(?![^\)]+\)\s+RETURNING)|UPDATE(?!.*\sRETURNING)|DELETE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', str_replace(array("\r\n", "\r", "\n"), ' ', $sql)); + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) + { + return FALSE; + } + + return parent::is_write_type($sql); } // -------------------------------------------------------------------- diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index b1df326f7eb..a7a02496b8d 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -288,7 +288,12 @@ protected function _trans_rollback() */ public function is_write_type($sql) { - return (bool) preg_match('/^\s*"?(SET|INSERT(?![^\)]+\)\s+RETURNING)|UPDATE(?!.*\sRETURNING)|DELETE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', str_replace(array("\r\n", "\r", "\n"), ' ', $sql)); + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) + { + return FALSE; + } + + return parent::is_write_type($sql); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index c189767d88d..2ac5213baa5 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -19,7 +19,7 @@ Bug fixes for 3.0.4 - Fixed a bug where :doc:`Form Helper ` functions :php:func:`set_checkbox()`, :php:func:`set_radio()` didn't "uncheck" inputs on a submitted form if the default state is "checked". - Fixed a bug (#4217) - :doc:`Config Library ` method ``base_url()`` didn't use proper formatting for IPv6 when it falls back to ``$_SERVER['SERVER_ADDR']``. - Fixed a bug where :doc:`CAPTCHA Helper ` entered an infinite loop while generating a random string. -- Fixed a bug (#4223) - :doc:`Database ` method ``simple_query()`` blindly executes queries without checking if the connection was initialized properly. +- Fixed a bug (#4223) - :doc:`Database ` method ``simple_query()`` blindly executes queries without checking if the connection was initialized properly. - Fixed a bug (#4244) - :doc:`Email Library ` could improperly use "unsafe" US-ASCII characters during Quoted-printable encoding. - Fixed a bug (#4245) - :doc:`Database Forge ` couldn't properly handle ``SET`` and ``ENUM`` type fields with string values. - Fixed a bug (#4283) - :doc:`String Helper ` function :php:func:`alternator()` couldn't be called without arguments. @@ -31,6 +31,7 @@ Bug fixes for 3.0.4 - Fixed a bug (#4331) - :doc:`Database ` method ``error()`` didn't really work for connection errors with the 'mysqli' driver. - Fixed a bug (#4343) - :doc:`Email Library ` failing with a *"More than one 'from' person"* message when using *sendmail*. - Fixed a bug (#4350) - :doc:`Loader Library ` method ``model()`` logic directly instantiated the ``CI_Model`` or ``MY_Model`` classes. +- Fixed a bug (#4337) - :doc:`Database ` method ``query()`` didn't return a result set for queries with the ``RETURNING`` statement on PostgreSQL. Version 3.0.3 ============= From e8de9eb4a8bba7cde0d81fe8571bcceed7aef77b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 6 Jan 2016 15:53:19 +0200 Subject: [PATCH 4106/5397] [ci skip] Add support for OFFSET with Oracle 12c As requested in #4279 --- system/database/drivers/oci8/oci8_driver.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 206924d0637..994f8f33ace 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -654,6 +654,14 @@ protected function _delete($table) */ protected function _limit($sql) { + if (version_compare($this->version(), '12.1', '>=')) + { + // OFFSET-FETCH can be used only with the ORDER BY clause + empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; + + return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; + } + $this->limit_used = TRUE; return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' .($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1) : ''); From 79b8a086187f199bb708bd56477850fbf1dd9e91 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 7 Jan 2016 13:55:21 +0200 Subject: [PATCH 4107/5397] Fix #4362 --- .../libraries/Session/drivers/Session_memcached_driver.php | 5 ++++- system/libraries/Session/drivers/Session_redis_driver.php | 5 ++++- user_guide_src/source/changelog.rst | 7 ++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index 760239dfbee..9d7ab117282 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -300,7 +300,10 @@ public function gc($maxlifetime) */ protected function _get_lock($session_id) { - if (isset($this->_lock_key)) + // PHP 7 reuses the SessionHandler object on regeneration, + // so we need to check here if the lock key is for the + // correct session ID. + if ($this->_lock_key === $this->_key_prefix.$session_id.':lock') { return ($this->_memcached->replace($this->_lock_key, time(), 300)) ? $this->_success diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index b60ef6b343a..a31c453729f 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -314,7 +314,10 @@ public function gc($maxlifetime) */ protected function _get_lock($session_id) { - if (isset($this->_lock_key)) + // PHP 7 reuses the SessionHandler object on regeneration, + // so we need to check here if the lock key is for the + // correct session ID. + if ($this->_lock_key === $this->_key_prefix.$session_id.':lock') { return $this->_redis->setTimeout($this->_lock_key, 300); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2ac5213baa5..d63696a77e8 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -9,8 +9,8 @@ Release Date: Not Released - General Changes - - Updated :doc:`Security Library ` method ``get_random_bytes()`` to use PHP7's ``random_bytes()`` function when possible. - - Updated :doc:`Encryption Library ` method ``create_key()`` to use PHP7's ``random_bytes()`` function when possible. + - Updated :doc:`Security Library ` method ``get_random_bytes()`` to use PHP 7's ``random_bytes()`` function when possible. + - Updated :doc:`Encryption Library ` method ``create_key()`` to use PHP 7's ``random_bytes()`` function when possible. Bug fixes for 3.0.4 ------------------- @@ -32,6 +32,7 @@ Bug fixes for 3.0.4 - Fixed a bug (#4343) - :doc:`Email Library ` failing with a *"More than one 'from' person"* message when using *sendmail*. - Fixed a bug (#4350) - :doc:`Loader Library ` method ``model()`` logic directly instantiated the ``CI_Model`` or ``MY_Model`` classes. - Fixed a bug (#4337) - :doc:`Database ` method ``query()`` didn't return a result set for queries with the ``RETURNING`` statement on PostgreSQL. +- Fixed a bug (#4362) - :doc:`Session Library ` doesn't properly maintain its state after ID regeneration with the 'redis' and 'memcached' drivers on PHP 7. Version 3.0.3 ============= @@ -53,7 +54,7 @@ Bug fixes for 3.0.3 ------------------- - Fixed a bug (#4170) - :doc:`Database ` method ``insert_id()`` could return an identity from the wrong scope with the 'sqlsrv' driver. -- Fixed a bug (#4179) - :doc:`Session Library ` doesn't properly maintain its state after ID regeneration with the 'database' driver on PHP7. +- Fixed a bug (#4179) - :doc:`Session Library ` doesn't properly maintain its state after ID regeneration with the 'database' driver on PHP 7. - Fixed a bug (#4173) - :doc:`Database Forge ` method ``add_key()`` didn't allow creation of non-PRIMARY composite keys after the "bugfix" for #3968. - Fixed a bug (#4171) - :doc:`Database Transactions ` didn't work with nesting in methods ``trans_begin()``, ``trans_commit()``, ``trans_rollback()``. - Fixed a bug where :doc:`Database Transaction ` methods ``trans_begin()``, ``trans_commit()``, ``trans_rollback()`` ignored failures. From 868b194fe50c0544b43cf8be523c39bdea18897d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 7 Jan 2016 14:22:00 +0200 Subject: [PATCH 4108/5397] [ci skip] Add Oracle 12.1 OFFSET support to PDO_OCI as well Reference: #4279 --- system/database/drivers/pdo/subdrivers/pdo_oci_driver.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php index 4791ab15701..d4cfb7dd7f2 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php @@ -311,6 +311,14 @@ protected function _delete($table) */ protected function _limit($sql) { + if (version_compare($this->version(), '12.1', '>=')) + { + // OFFSET-FETCH can be used only with the ORDER BY clause + empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; + + return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; + } + return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' .($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1): ''); } From 20d7d65fd3fca54b86f389b149da5a0d2f2d6808 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 7 Jan 2016 14:23:57 +0200 Subject: [PATCH 4109/5397] [ci skip] Add changelog entry for #4279 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d63696a77e8..89368f3ab67 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -11,6 +11,7 @@ Release Date: Not Released - Updated :doc:`Security Library ` method ``get_random_bytes()`` to use PHP 7's ``random_bytes()`` function when possible. - Updated :doc:`Encryption Library ` method ``create_key()`` to use PHP 7's ``random_bytes()`` function when possible. + - Updated :doc:`Database ` drivers 'oci8' and 'pdo/oci' with support for ``OFFSET-FETCH`` with Oracle 12c. Bug fixes for 3.0.4 ------------------- From 89576a8cf0918c4d1797f6ef34be98b5caef29d3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 7 Jan 2016 14:39:04 +0200 Subject: [PATCH 4110/5397] Add support for MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT Available since PHP 5.6.16 --- .../database/drivers/mysqli/mysqli_driver.php | 17 +++++++++++++++-- user_guide_src/source/changelog.rst | 8 ++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 693a96bab56..34366827b15 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -153,9 +153,22 @@ public function db_connect($persistent = FALSE) if ( ! empty($ssl)) { - if ( ! empty($this->encrypt['ssl_verify']) && defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT')) + if (isset($this->encrypt['ssl_verify'])) { - $this->_mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, TRUE); + if ($this->encrypt['ssl_verify']) + { + defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT') && $this->_mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, TRUE); + } + // Apparently (when it exists), setting MYSQLI_OPT_SSL_VERIFY_SERVER_CERT + // to FALSE didn't do anything, so PHP 5.6.16 introduced yet another + // constant ... + // + // https://secure.php.net/ChangeLog-5.php#5.6.16 + // https://bugs.php.net/bug.php?id=68344 + elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT')) + { + $this->_mysqli->options(MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT, TRUE); + } } $client_flags |= MYSQLI_CLIENT_SSL; diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 89368f3ab67..52c42461472 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -11,7 +11,11 @@ Release Date: Not Released - Updated :doc:`Security Library ` method ``get_random_bytes()`` to use PHP 7's ``random_bytes()`` function when possible. - Updated :doc:`Encryption Library ` method ``create_key()`` to use PHP 7's ``random_bytes()`` function when possible. - - Updated :doc:`Database ` drivers 'oci8' and 'pdo/oci' with support for ``OFFSET-FETCH`` with Oracle 12c. + +- :doc:`Database ` + + - Added support for ``OFFSET-FETCH`` with Oracle 12c for the 'oci8' and 'pdo/oci' drivers. + - Added support for the new ``MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT`` constant from `PHP 5.6.16 `_ for the 'mysqli' driver. Bug fixes for 3.0.4 ------------------- @@ -46,7 +50,7 @@ Release Date: October 31, 2015 - Changed :doc:`Config Library ` method ``base_url()`` to fallback to ``$_SERVER['SERVER_ADDR']`` when ``$config['base_url']`` is empty in order to avoid *Host* header injections. - Changed :doc:`CAPTCHA Helper ` to use the operating system's PRNG when possible. -- Database +- :doc:`Database` - Optimized :doc:`Database Utility ` method ``csv_from_result()`` for speed with larger result sets. - Added proper return values to :doc:`Database Transactions ` method ``trans_start()``. From b98c657c100d3220a5d7ed1b6ff3ec78e227b406 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 7 Jan 2016 16:10:10 +0200 Subject: [PATCH 4111/5397] Fix MySQL's 'stricton' feature --- .../database/drivers/mysql/mysql_driver.php | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 9c630d0d666..d9c1a98a6ef 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -147,9 +147,27 @@ public function db_connect($persistent = FALSE) : FALSE; } - if ($this->stricton && is_resource($this->conn_id)) + if (isset($this->stricton) && is_resource($this->conn_id)) { - $this->simple_query('SET SESSION sql_mode="STRICT_ALL_TABLES"'); + if ($this->stricton) + { + $this->simple_query('SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); + } + else + { + $this->simple_query( + 'SET SESSION sql_mode = + REPLACE( + REPLACE( + REPLACE(@@sql_mode, "STRICT_ALL_TABLES,", ""), + ",STRICT_ALL_TABLES", + "" + ), + "STRICT_ALL_TABLES", + "" + )' + ); + } } return $this->conn_id; From c83e894fe8b3c85ff40f00954df0033ad14940b0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 7 Jan 2016 17:27:39 +0200 Subject: [PATCH 4112/5397] Add MySQL stricton changes to mysqli and pdo/mysql drivers --- .../database/drivers/mysql/mysql_driver.php | 21 ++++++------- .../database/drivers/mysqli/mysqli_driver.php | 23 ++++++++++++-- .../pdo/subdrivers/pdo_mysql_driver.php | 31 +++++++++++++++---- 3 files changed, 55 insertions(+), 20 deletions(-) diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index d9c1a98a6ef..607388a6196 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -84,7 +84,7 @@ class CI_DB_mysql_driver extends CI_DB { * * @var bool */ - public $stricton = FALSE; + public $stricton; // -------------------------------------------------------------------- @@ -153,19 +153,18 @@ public function db_connect($persistent = FALSE) { $this->simple_query('SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); } - else + elseif (version_compare($this->version, '5.7', '>=')) { $this->simple_query( 'SET SESSION sql_mode = - REPLACE( - REPLACE( - REPLACE(@@sql_mode, "STRICT_ALL_TABLES,", ""), - ",STRICT_ALL_TABLES", - "" - ), - "STRICT_ALL_TABLES", - "" - )' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( + @@sql_mode, + "STRICT_ALL_TABLES,", ""), + ",STRICT_ALL_TABLES", ""), + "STRICT_ALL_TABLES", ""), + "STRICT_TRANS_TABLES,", ""), + ",STRICT_TRANS_TABLES", ""), + "STRICT_TRANS_TABLES", "")' ); } } diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 34366827b15..f8694b9d111 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -84,7 +84,7 @@ class CI_DB_mysqli_driver extends CI_DB { * * @var bool */ - public $stricton = FALSE; + public $stricton; // -------------------------------------------------------------------- @@ -137,9 +137,26 @@ public function db_connect($persistent = FALSE) $this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10); - if ($this->stricton) + if (isset($this->stricton)) { - $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode="STRICT_ALL_TABLES"'); + if ($this->stricton) + { + $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); + } + elseif (version_compare($this->version, '5.7', '>=')) + { + $this->_mysqli->options(MYSQLI_INIT_COMMAND, + 'SET SESSION sql_mode = + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( + @@sql_mode, + "STRICT_ALL_TABLES,", ""), + ",STRICT_ALL_TABLES", ""), + "STRICT_ALL_TABLES", ""), + "STRICT_TRANS_TABLES,", ""), + ",STRICT_TRANS_TABLES", ""), + "STRICT_TRANS_TABLES", "")' + ); + } } if (is_array($this->encrypt)) diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php index e9d25cebc4f..2d8eac4e31a 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -73,7 +73,7 @@ class CI_DB_pdo_mysql_driver extends CI_DB_pdo_driver { * * @var bool */ - public $stricton = FALSE; + public $stricton; // -------------------------------------------------------------------- @@ -133,15 +133,34 @@ public function db_connect($persistent = FALSE) .(empty($this->dbcollat) ? '' : ' COLLATE '.$this->dbcollat); } - if ($this->stricton) + if (isset($this->stricton)) { - if (empty($this->options[PDO::MYSQL_ATTR_INIT_COMMAND])) + if ($this->stricton) { - $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET SESSION sql_mode="STRICT_ALL_TABLES"'; + $sql = 'CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'; } - else + elseif (version_compare($this->version, '5.7', '>=')) { - $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] .= ', @@session.sql_mode = "STRICT_ALL_TABLES"'; + $sql = 'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( + @@sql_mode, + "STRICT_ALL_TABLES,", ""), + ",STRICT_ALL_TABLES", ""), + "STRICT_ALL_TABLES", ""), + "STRICT_TRANS_TABLES,", ""), + ",STRICT_TRANS_TABLES", ""), + "STRICT_TRANS_TABLES", "")'; + } + + if ( ! empty($sql)) + { + if (empty($this->options[PDO::MYSQL_ATTR_INIT_COMMAND])) + { + $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET SESSION sql_mode = '.$sql; + } + else + { + $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] .= ', @@session.sql_mode = '.$sql; + } } } From 679e94853451192410ac138cb592ac5ab021ea67 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 7 Jan 2016 17:31:21 +0200 Subject: [PATCH 4113/5397] [ci skip] Add changelog entries for #4349 --- user_guide_src/source/changelog.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 52c42461472..89d6a3a3a04 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -38,6 +38,8 @@ Bug fixes for 3.0.4 - Fixed a bug (#4350) - :doc:`Loader Library ` method ``model()`` logic directly instantiated the ``CI_Model`` or ``MY_Model`` classes. - Fixed a bug (#4337) - :doc:`Database ` method ``query()`` didn't return a result set for queries with the ``RETURNING`` statement on PostgreSQL. - Fixed a bug (#4362) - :doc:`Session Library ` doesn't properly maintain its state after ID regeneration with the 'redis' and 'memcached' drivers on PHP 7. +- Fixed a bug (#4349) - :doc:`Database ` drivers 'mysql', 'mysqli', 'pdo/mysql' discard other ``sql_mode`` flags when "stricton" is enabled. +- Fixed a bug (#4349) - :doc:`Database ` drivers 'mysql', 'mysqli', 'pdo/mysql' don't turn off ``STRICT_TRANS_TABLES`` on MySQL 5.7+ when "stricton" is disabled. Version 3.0.3 ============= From 2d2880dfa6976fbd38ad033765473fd1a8f0bc85 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 7 Jan 2016 17:43:10 +0200 Subject: [PATCH 4114/5397] Fix MySQL errors from latest commits Ref: #4349 --- system/database/drivers/mysql/mysql_driver.php | 2 +- system/database/drivers/mysqli/mysqli_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 607388a6196..2573e3c17c1 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -153,7 +153,7 @@ public function db_connect($persistent = FALSE) { $this->simple_query('SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); } - elseif (version_compare($this->version, '5.7', '>=')) + elseif (version_compare($this->version(), '5.7', '>=')) { $this->simple_query( 'SET SESSION sql_mode = diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index f8694b9d111..397368b72ed 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -143,7 +143,7 @@ public function db_connect($persistent = FALSE) { $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); } - elseif (version_compare($this->version, '5.7', '>=')) + elseif (version_compare($this->version(), '5.7', '>=')) { $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php index 2d8eac4e31a..0886216e41c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -139,7 +139,7 @@ public function db_connect($persistent = FALSE) { $sql = 'CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'; } - elseif (version_compare($this->version, '5.7', '>=')) + elseif (version_compare($this->version(), '5.7', '>=')) { $sql = 'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( @@sql_mode, From 0a9cc835b4ec7e85e0ccac04000fa889a599126e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 7 Jan 2016 17:52:20 +0200 Subject: [PATCH 4115/5397] MySQL stricton again ... remove the version condition Ref: #4349 --- system/database/drivers/mysql/mysql_driver.php | 2 +- system/database/drivers/mysqli/mysqli_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 2573e3c17c1..3a450ec4cb1 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -153,7 +153,7 @@ public function db_connect($persistent = FALSE) { $this->simple_query('SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); } - elseif (version_compare($this->version(), '5.7', '>=')) + else { $this->simple_query( 'SET SESSION sql_mode = diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 397368b72ed..323a67f63ed 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -143,7 +143,7 @@ public function db_connect($persistent = FALSE) { $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); } - elseif (version_compare($this->version(), '5.7', '>=')) + else { $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php index 0886216e41c..c230651dcfd 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -139,7 +139,7 @@ public function db_connect($persistent = FALSE) { $sql = 'CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'; } - elseif (version_compare($this->version(), '5.7', '>=')) + else { $sql = 'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( @@sql_mode, From b1b45557ad18c596bd9756bd2eebf93fe2d54b0d Mon Sep 17 00:00:00 2001 From: ponsfrilus Date: Fri, 8 Jan 2016 10:24:58 +0100 Subject: [PATCH 4116/5397] [typo] missing ; at end of PHP lines 464 and 469 --- user_guide_src/source/helpers/form_helper.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/helpers/form_helper.rst b/user_guide_src/source/helpers/form_helper.rst index a67dbc0bf2b..bc30a0e9843 100644 --- a/user_guide_src/source/helpers/form_helper.rst +++ b/user_guide_src/source/helpers/form_helper.rst @@ -461,12 +461,12 @@ The following functions are available: fourth parameter:: $js = 'onClick="some_function()"'; - echo form_checkbox('newsletter', 'accept', TRUE, $js) + echo form_checkbox('newsletter', 'accept', TRUE, $js); Or you can pass it as an array:: $js = array('onClick' => 'some_function();'); - echo form_checkbox('newsletter', 'accept', TRUE, $js) + echo form_checkbox('newsletter', 'accept', TRUE, $js); .. php:function:: form_radio([$data = ''[, $value = ''[, $checked = FALSE[, $extra = '']]]]) From 8f7cc15c8856d312c091c33cadc75db0605a2829 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 8 Jan 2016 12:59:11 +0200 Subject: [PATCH 4117/5397] Merge pull request #4365 from ponsfrilus/develop [ci skip] Form helper examples missing ; at end of function calls --- user_guide_src/source/helpers/form_helper.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/helpers/form_helper.rst b/user_guide_src/source/helpers/form_helper.rst index a67dbc0bf2b..bc30a0e9843 100644 --- a/user_guide_src/source/helpers/form_helper.rst +++ b/user_guide_src/source/helpers/form_helper.rst @@ -461,12 +461,12 @@ The following functions are available: fourth parameter:: $js = 'onClick="some_function()"'; - echo form_checkbox('newsletter', 'accept', TRUE, $js) + echo form_checkbox('newsletter', 'accept', TRUE, $js); Or you can pass it as an array:: $js = array('onClick' => 'some_function();'); - echo form_checkbox('newsletter', 'accept', TRUE, $js) + echo form_checkbox('newsletter', 'accept', TRUE, $js); .. php:function:: form_radio([$data = ''[, $value = ''[, $checked = FALSE[, $extra = '']]]]) From 8de7faa9ff7f342d57966bde0b0429ab241c2a6f Mon Sep 17 00:00:00 2001 From: Claudio Galdiolo Date: Fri, 8 Jan 2016 15:13:13 -0500 Subject: [PATCH 4118/5397] use 'while' instead of 'if' 'do' 'while' --- system/database/DB_driver.php | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index af6b9f399e8..59662a94671 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -641,19 +641,15 @@ public function query($sql, $binds = FALSE, $return_object = NULL) // if transactions are enabled. If we don't call this here // the error message will trigger an exit, causing the // transactions to remain in limbo. - if ($this->_trans_depth !== 0) + while ($this->_trans_depth !== 0) { - do + $trans_depth = $this->_trans_depth; + $this->trans_complete(); + if ($trans_depth === $this->_trans_depth) { - $trans_depth = $this->_trans_depth; - $this->trans_complete(); - if ($trans_depth === $this->_trans_depth) - { - log_message('error', 'Database: Failure during an automated transaction commit/rollback!'); - break; - } + log_message('error', 'Database: Failure during an automated transaction commit/rollback!'); + break; } - while ($this->_trans_depth !== 0); } // Display errors From 8219714647602c94dd38e6b2efedb4e7ed1c8c4e Mon Sep 17 00:00:00 2001 From: Fery Wardiyanto Date: Sat, 9 Jan 2016 19:30:32 +0700 Subject: [PATCH 4119/5397] Add extra mime for .ogg file Signed-off-by: Fery Wardiyanto --- application/config/mimes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index 957dc05d8a7..8bac8725111 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -149,7 +149,7 @@ 'au' => 'audio/x-au', 'ac3' => 'audio/ac3', 'flac' => 'audio/x-flac', - 'ogg' => 'audio/ogg', + 'ogg' => array('audio/ogg', 'video/ogg', 'application/ogg'), 'kmz' => array('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'), 'kml' => array('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'), 'ics' => 'text/calendar', From 803cc12107f687a8ff9a19427023122b2d6b7207 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jan 2016 11:15:27 +0200 Subject: [PATCH 4120/5397] Merge pull request #4369 from galdiolo/patch-12 Optimize transactions check in CI_DB_driver::query() --- system/database/DB_driver.php | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index bfe9dd4b071..40e40e927d6 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -676,19 +676,15 @@ public function query($sql, $binds = FALSE, $return_object = NULL) // if transactions are enabled. If we don't call this here // the error message will trigger an exit, causing the // transactions to remain in limbo. - if ($this->_trans_depth !== 0) + while ($this->_trans_depth !== 0) { - do + $trans_depth = $this->_trans_depth; + $this->trans_complete(); + if ($trans_depth === $this->_trans_depth) { - $trans_depth = $this->_trans_depth; - $this->trans_complete(); - if ($trans_depth === $this->_trans_depth) - { - log_message('error', 'Database: Failure during an automated transaction commit/rollback!'); - break; - } + log_message('error', 'Database: Failure during an automated transaction commit/rollback!'); + break; } - while ($this->_trans_depth !== 0); } // Display errors From 7886d70be269d4c79cbfd67c1bb7be313ce221fa Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 16 Nov 2015 12:02:22 +0200 Subject: [PATCH 4121/5397] Merge pull request #4241 from suhindra/develop [ci skip] Added/updated MIME types for Flash Video --- application/config/mimes.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index aa3b1836ad8..957dc05d8a7 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -137,7 +137,8 @@ '3gp' => array('video/3gp', 'video/3gpp'), 'mp4' => 'video/mp4', 'm4a' => 'audio/x-m4a', - 'f4v' => 'video/mp4', + 'f4v' => array('video/mp4', 'video/x-f4v'), + 'flv' => 'video/x-flv', 'webm' => 'video/webm', 'aac' => 'audio/x-acc', 'm4u' => 'application/vnd.mpegurl', From bffcdc06baed39dbaddaf8706b9d70c3d466047d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jan 2016 11:34:20 +0200 Subject: [PATCH 4122/5397] Merge pull request #4371 from feryardiant/contrib/mime-ogg [ci skip] Add extra mime for .ogg files --- application/config/mimes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index 957dc05d8a7..8bac8725111 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -149,7 +149,7 @@ 'au' => 'audio/x-au', 'ac3' => 'audio/ac3', 'flac' => 'audio/x-flac', - 'ogg' => 'audio/ogg', + 'ogg' => array('audio/ogg', 'video/ogg', 'application/ogg'), 'kmz' => array('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'), 'kml' => array('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'), 'ics' => 'text/calendar', From fd5fe1a64c03ae7204a7e72d936215f7a61d8c30 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jan 2016 11:58:40 +0200 Subject: [PATCH 4123/5397] Fix #4374 --- .../Session/drivers/Session_database_driver.php | 12 ++++++++++++ user_guide_src/source/changelog.rst | 1 + 2 files changed, 13 insertions(+) diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index f2adacb6b6e..8c4555481c4 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -147,6 +147,9 @@ public function read($session_id) { if ($this->_get_lock($session_id) !== FALSE) { + // Prevent previous QB calls from messing with our queries + $this->_db->reset_query(); + // Needed by write() to detect session_regenerate_id() calls $this->_session_id = $session_id; @@ -199,6 +202,9 @@ public function read($session_id) */ public function write($session_id, $session_data) { + // Prevent previous QB calls from messing with our queries + $this->_db->reset_query(); + // Was the ID regenerated? if ($session_id !== $this->_session_id) { @@ -287,6 +293,9 @@ public function destroy($session_id) { if ($this->_lock) { + // Prevent previous QB calls from messing with our queries + $this->_db->reset_query(); + $this->_db->where('id', $session_id); if ($this->_config['match_ip']) { @@ -320,6 +329,9 @@ public function destroy($session_id) */ public function gc($maxlifetime) { + // Prevent previous QB calls from messing with our queries + $this->_db->reset_query(); + return ($this->_db->delete($this->_config['save_path'], 'timestamp < '.(time() - $maxlifetime))) ? $this->_success : $this->_failure; diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 89d6a3a3a04..8b0fb677a6b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -40,6 +40,7 @@ Bug fixes for 3.0.4 - Fixed a bug (#4362) - :doc:`Session Library ` doesn't properly maintain its state after ID regeneration with the 'redis' and 'memcached' drivers on PHP 7. - Fixed a bug (#4349) - :doc:`Database ` drivers 'mysql', 'mysqli', 'pdo/mysql' discard other ``sql_mode`` flags when "stricton" is enabled. - Fixed a bug (#4349) - :doc:`Database ` drivers 'mysql', 'mysqli', 'pdo/mysql' don't turn off ``STRICT_TRANS_TABLES`` on MySQL 5.7+ when "stricton" is disabled. +- Fixed a bug (#4374) - :doc:`Session Library ` with the 'database' driver could be affected by userspace :doc:`Query Builder ` conditions. Version 3.0.3 ============= From 125ef4751080a2118cb203357d77687699e3eb25 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jan 2016 12:33:00 +0200 Subject: [PATCH 4124/5397] [ci skip] Bump year to 2016 --- license.txt | 2 +- system/core/Benchmark.php | 4 ++-- system/core/CodeIgniter.php | 4 ++-- system/core/Common.php | 4 ++-- system/core/Config.php | 4 ++-- system/core/Controller.php | 4 ++-- system/core/Exceptions.php | 4 ++-- system/core/Hooks.php | 4 ++-- system/core/Input.php | 4 ++-- system/core/Lang.php | 4 ++-- system/core/Loader.php | 4 ++-- system/core/Log.php | 4 ++-- system/core/Model.php | 4 ++-- system/core/Output.php | 4 ++-- system/core/Router.php | 4 ++-- system/core/Security.php | 4 ++-- system/core/URI.php | 4 ++-- system/core/Utf8.php | 4 ++-- system/core/compat/hash.php | 4 ++-- system/core/compat/mbstring.php | 4 ++-- system/core/compat/password.php | 4 ++-- system/core/compat/standard.php | 4 ++-- system/database/DB.php | 4 ++-- system/database/DB_cache.php | 4 ++-- system/database/DB_driver.php | 4 ++-- system/database/DB_forge.php | 4 ++-- system/database/DB_query_builder.php | 4 ++-- system/database/DB_result.php | 4 ++-- system/database/DB_utility.php | 4 ++-- system/database/drivers/cubrid/cubrid_driver.php | 4 ++-- system/database/drivers/cubrid/cubrid_forge.php | 4 ++-- system/database/drivers/cubrid/cubrid_result.php | 4 ++-- system/database/drivers/cubrid/cubrid_utility.php | 4 ++-- system/database/drivers/ibase/ibase_driver.php | 4 ++-- system/database/drivers/ibase/ibase_forge.php | 4 ++-- system/database/drivers/ibase/ibase_result.php | 4 ++-- system/database/drivers/ibase/ibase_utility.php | 4 ++-- system/database/drivers/mssql/mssql_driver.php | 4 ++-- system/database/drivers/mssql/mssql_forge.php | 4 ++-- system/database/drivers/mssql/mssql_result.php | 4 ++-- system/database/drivers/mssql/mssql_utility.php | 4 ++-- system/database/drivers/mysql/mysql_driver.php | 4 ++-- system/database/drivers/mysql/mysql_forge.php | 4 ++-- system/database/drivers/mysql/mysql_result.php | 4 ++-- system/database/drivers/mysql/mysql_utility.php | 4 ++-- system/database/drivers/mysqli/mysqli_driver.php | 4 ++-- system/database/drivers/mysqli/mysqli_forge.php | 4 ++-- system/database/drivers/mysqli/mysqli_result.php | 4 ++-- system/database/drivers/mysqli/mysqli_utility.php | 4 ++-- system/database/drivers/oci8/oci8_driver.php | 4 ++-- system/database/drivers/oci8/oci8_forge.php | 4 ++-- system/database/drivers/oci8/oci8_result.php | 4 ++-- system/database/drivers/oci8/oci8_utility.php | 4 ++-- system/database/drivers/odbc/odbc_driver.php | 4 ++-- system/database/drivers/odbc/odbc_forge.php | 4 ++-- system/database/drivers/odbc/odbc_result.php | 4 ++-- system/database/drivers/odbc/odbc_utility.php | 4 ++-- system/database/drivers/pdo/pdo_driver.php | 4 ++-- system/database/drivers/pdo/pdo_forge.php | 4 ++-- system/database/drivers/pdo/pdo_result.php | 4 ++-- system/database/drivers/pdo/pdo_utility.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_4d_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_4d_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php | 4 ++-- .../database/drivers/pdo/subdrivers/pdo_firebird_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php | 4 ++-- .../database/drivers/pdo/subdrivers/pdo_informix_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_informix_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_oci_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_oci_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php | 4 ++-- system/database/drivers/postgre/postgre_driver.php | 4 ++-- system/database/drivers/postgre/postgre_forge.php | 4 ++-- system/database/drivers/postgre/postgre_result.php | 4 ++-- system/database/drivers/postgre/postgre_utility.php | 4 ++-- system/database/drivers/sqlite/sqlite_driver.php | 4 ++-- system/database/drivers/sqlite/sqlite_forge.php | 4 ++-- system/database/drivers/sqlite/sqlite_result.php | 4 ++-- system/database/drivers/sqlite/sqlite_utility.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_driver.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_forge.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_result.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_utility.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_driver.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_forge.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_result.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_utility.php | 4 ++-- system/helpers/array_helper.php | 4 ++-- system/helpers/captcha_helper.php | 4 ++-- system/helpers/cookie_helper.php | 4 ++-- system/helpers/date_helper.php | 4 ++-- system/helpers/directory_helper.php | 4 ++-- system/helpers/download_helper.php | 4 ++-- system/helpers/email_helper.php | 4 ++-- system/helpers/file_helper.php | 4 ++-- system/helpers/form_helper.php | 4 ++-- system/helpers/html_helper.php | 4 ++-- system/helpers/inflector_helper.php | 4 ++-- system/helpers/language_helper.php | 4 ++-- system/helpers/number_helper.php | 4 ++-- system/helpers/path_helper.php | 4 ++-- system/helpers/security_helper.php | 4 ++-- system/helpers/smiley_helper.php | 4 ++-- system/helpers/string_helper.php | 4 ++-- system/helpers/text_helper.php | 4 ++-- system/helpers/typography_helper.php | 4 ++-- system/helpers/url_helper.php | 4 ++-- system/helpers/xml_helper.php | 4 ++-- system/language/english/calendar_lang.php | 4 ++-- system/language/english/date_lang.php | 4 ++-- system/language/english/db_lang.php | 4 ++-- system/language/english/email_lang.php | 4 ++-- system/language/english/form_validation_lang.php | 4 ++-- system/language/english/ftp_lang.php | 4 ++-- system/language/english/imglib_lang.php | 4 ++-- system/language/english/migration_lang.php | 4 ++-- system/language/english/number_lang.php | 4 ++-- system/language/english/pagination_lang.php | 4 ++-- system/language/english/profiler_lang.php | 4 ++-- system/language/english/unit_test_lang.php | 4 ++-- system/language/english/upload_lang.php | 4 ++-- system/libraries/Cache/Cache.php | 4 ++-- system/libraries/Cache/drivers/Cache_apc.php | 4 ++-- system/libraries/Cache/drivers/Cache_dummy.php | 4 ++-- system/libraries/Cache/drivers/Cache_file.php | 4 ++-- system/libraries/Cache/drivers/Cache_memcached.php | 4 ++-- system/libraries/Cache/drivers/Cache_redis.php | 4 ++-- system/libraries/Cache/drivers/Cache_wincache.php | 4 ++-- system/libraries/Calendar.php | 4 ++-- system/libraries/Cart.php | 4 ++-- system/libraries/Driver.php | 4 ++-- system/libraries/Email.php | 4 ++-- system/libraries/Encrypt.php | 4 ++-- system/libraries/Encryption.php | 4 ++-- system/libraries/Form_validation.php | 4 ++-- system/libraries/Ftp.php | 4 ++-- system/libraries/Image_lib.php | 4 ++-- system/libraries/Javascript.php | 4 ++-- system/libraries/Javascript/Jquery.php | 4 ++-- system/libraries/Migration.php | 4 ++-- system/libraries/Pagination.php | 4 ++-- system/libraries/Parser.php | 4 ++-- system/libraries/Profiler.php | 4 ++-- system/libraries/Session/Session.php | 4 ++-- system/libraries/Session/SessionHandlerInterface.php | 4 ++-- system/libraries/Session/Session_driver.php | 4 ++-- system/libraries/Session/drivers/Session_database_driver.php | 4 ++-- system/libraries/Session/drivers/Session_files_driver.php | 4 ++-- system/libraries/Session/drivers/Session_memcached_driver.php | 4 ++-- system/libraries/Session/drivers/Session_redis_driver.php | 4 ++-- system/libraries/Table.php | 4 ++-- system/libraries/Trackback.php | 4 ++-- system/libraries/Typography.php | 4 ++-- system/libraries/Unit_test.php | 4 ++-- system/libraries/Upload.php | 4 ++-- system/libraries/User_agent.php | 4 ++-- system/libraries/Xmlrpc.php | 4 ++-- system/libraries/Xmlrpcs.php | 4 ++-- system/libraries/Zip.php | 4 ++-- user_guide_src/cilexer/cilexer/cilexer.py | 4 ++-- user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/license.rst | 2 +- 176 files changed, 350 insertions(+), 350 deletions(-) diff --git a/license.txt b/license.txt index cb2d8b471a8..388eee33763 100644 --- a/license.txt +++ b/license.txt @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 - 2015, British Columbia Institute of Technology +Copyright (c) 2014 - 2016, British Columbia Institute of Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php index e420f62a109..414a801ee29 100644 --- a/system/core/Benchmark.php +++ b/system/core/Benchmark.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 79a23c4ca23..1394fd86298 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Common.php b/system/core/Common.php index 3ab98cf6da0..32e47b74351 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Config.php b/system/core/Config.php index c507f342ca1..d03e02d4dc8 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Controller.php b/system/core/Controller.php index a0d97baa240..260dee4f6e3 100644 --- a/system/core/Controller.php +++ b/system/core/Controller.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php index d8f62c0fe73..29a28516608 100644 --- a/system/core/Exceptions.php +++ b/system/core/Exceptions.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Hooks.php b/system/core/Hooks.php index 3b4fb225068..42090d16cca 100644 --- a/system/core/Hooks.php +++ b/system/core/Hooks.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Input.php b/system/core/Input.php index 4e7a4e95e22..55474fd0c30 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Lang.php b/system/core/Lang.php index deb955414b1..6913b92fa17 100644 --- a/system/core/Lang.php +++ b/system/core/Lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Loader.php b/system/core/Loader.php index 87f21b27939..500a86ae685 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Log.php b/system/core/Log.php index e8cb401f57f..4343d746de0 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Model.php b/system/core/Model.php index a0469de11a3..c9f1f8dd6f1 100644 --- a/system/core/Model.php +++ b/system/core/Model.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Output.php b/system/core/Output.php index 76c1329d299..75116b3a6cc 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Router.php b/system/core/Router.php index ce41aa95867..85d1df719a6 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Security.php b/system/core/Security.php index e79bf8affab..16375d17fb5 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/URI.php b/system/core/URI.php index 5179b401f3f..5262dd49c23 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Utf8.php b/system/core/Utf8.php index 9d8ac41e1a7..c6392c4e20f 100644 --- a/system/core/Utf8.php +++ b/system/core/Utf8.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.0.0 diff --git a/system/core/compat/hash.php b/system/core/compat/hash.php index 15954559ca2..7e5f1335d89 100644 --- a/system/core/compat/hash.php +++ b/system/core/compat/hash.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/core/compat/mbstring.php b/system/core/compat/mbstring.php index e335c85f7f1..ff8e79257b1 100644 --- a/system/core/compat/mbstring.php +++ b/system/core/compat/mbstring.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/core/compat/password.php b/system/core/compat/password.php index 7b933aa048e..3062b89c0fb 100644 --- a/system/core/compat/password.php +++ b/system/core/compat/password.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php index 5a428c114a4..c9f7ce22589 100644 --- a/system/core/compat/standard.php +++ b/system/core/compat/standard.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/DB.php b/system/database/DB.php index 0c7cf54b331..d713a68dd44 100644 --- a/system/database/DB.php +++ b/system/database/DB.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_cache.php b/system/database/DB_cache.php index 223055f6088..134737e3147 100644 --- a/system/database/DB_cache.php +++ b/system/database/DB_cache.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 40e40e927d6..78228818e7f 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index 1546e40c09b..6fc1e1f2b0d 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 7a3d2f594ce..7a65225e45d 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_result.php b/system/database/DB_result.php index 746f2a110fe..7b313914aca 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index b51893e1813..c4bad9eaf25 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index 65f4adb3fbc..70f28d6d076 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php index 9484e94e142..aac8f03b66b 100644 --- a/system/database/drivers/cubrid/cubrid_forge.php +++ b/system/database/drivers/cubrid/cubrid_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/cubrid/cubrid_result.php b/system/database/drivers/cubrid/cubrid_result.php index e666bab56a3..31ad09d7256 100644 --- a/system/database/drivers/cubrid/cubrid_result.php +++ b/system/database/drivers/cubrid/cubrid_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/cubrid/cubrid_utility.php b/system/database/drivers/cubrid/cubrid_utility.php index de7d715682e..c9648c597e2 100644 --- a/system/database/drivers/cubrid/cubrid_utility.php +++ b/system/database/drivers/cubrid/cubrid_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php index 82550d51b18..6b1c77b7f88 100644 --- a/system/database/drivers/ibase/ibase_driver.php +++ b/system/database/drivers/ibase/ibase_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/ibase/ibase_forge.php b/system/database/drivers/ibase/ibase_forge.php index 0e748c71073..02e7a37984d 100644 --- a/system/database/drivers/ibase/ibase_forge.php +++ b/system/database/drivers/ibase/ibase_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/ibase/ibase_result.php b/system/database/drivers/ibase/ibase_result.php index 991146f45dd..c907e35caa7 100644 --- a/system/database/drivers/ibase/ibase_result.php +++ b/system/database/drivers/ibase/ibase_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/ibase/ibase_utility.php b/system/database/drivers/ibase/ibase_utility.php index 79d2788e51f..0672113a3e5 100644 --- a/system/database/drivers/ibase/ibase_utility.php +++ b/system/database/drivers/ibase/ibase_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index b9e310a3af2..965e7b02d05 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php index 84406a01647..4d888ef5c21 100644 --- a/system/database/drivers/mssql/mssql_forge.php +++ b/system/database/drivers/mssql/mssql_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mssql/mssql_result.php b/system/database/drivers/mssql/mssql_result.php index c1c42a486b5..af1e4d79454 100644 --- a/system/database/drivers/mssql/mssql_result.php +++ b/system/database/drivers/mssql/mssql_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mssql/mssql_utility.php b/system/database/drivers/mssql/mssql_utility.php index 1040b5e417b..deffaeef134 100644 --- a/system/database/drivers/mssql/mssql_utility.php +++ b/system/database/drivers/mssql/mssql_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 3a450ec4cb1..c20b315a219 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php index cb90065f2ef..51ec17c594b 100644 --- a/system/database/drivers/mysql/mysql_forge.php +++ b/system/database/drivers/mysql/mysql_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php index 26aaddd325f..3483d816a0f 100644 --- a/system/database/drivers/mysql/mysql_result.php +++ b/system/database/drivers/mysql/mysql_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/mysql/mysql_utility.php b/system/database/drivers/mysql/mysql_utility.php index 55857ab08ef..3802a46fa2e 100644 --- a/system/database/drivers/mysql/mysql_utility.php +++ b/system/database/drivers/mysql/mysql_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 323a67f63ed..61a78037241 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php index 196afa845a1..0f19b737c0a 100644 --- a/system/database/drivers/mysqli/mysqli_forge.php +++ b/system/database/drivers/mysqli/mysqli_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php index d648828bd97..9b653088fb8 100644 --- a/system/database/drivers/mysqli/mysqli_result.php +++ b/system/database/drivers/mysqli/mysqli_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mysqli/mysqli_utility.php b/system/database/drivers/mysqli/mysqli_utility.php index 04fcd1dede7..c771f6f574b 100644 --- a/system/database/drivers/mysqli/mysqli_utility.php +++ b/system/database/drivers/mysqli/mysqli_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 994f8f33ace..1f5258ecfaf 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.4.1 diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index 80100977a2e..f2ec2d109fe 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.4.1 diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index 9ec54cc5c84..c6cbd5c58b9 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.4.1 diff --git a/system/database/drivers/oci8/oci8_utility.php b/system/database/drivers/oci8/oci8_utility.php index 90022a8c1c3..372ad37377a 100644 --- a/system/database/drivers/oci8/oci8_utility.php +++ b/system/database/drivers/oci8/oci8_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.4.1 diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index e12ad53bc36..5b17ff69214 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php index 45c5dc108c9..3dc765025a8 100644 --- a/system/database/drivers/odbc/odbc_forge.php +++ b/system/database/drivers/odbc/odbc_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/odbc/odbc_result.php b/system/database/drivers/odbc/odbc_result.php index 10b93d4fc0f..a8aa3f67fba 100644 --- a/system/database/drivers/odbc/odbc_result.php +++ b/system/database/drivers/odbc/odbc_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/odbc/odbc_utility.php b/system/database/drivers/odbc/odbc_utility.php index 0e6c2332835..35944a55ba8 100644 --- a/system/database/drivers/odbc/odbc_utility.php +++ b/system/database/drivers/odbc/odbc_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 8c5a5e7e369..4bd7ecfeeba 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/pdo/pdo_forge.php b/system/database/drivers/pdo/pdo_forge.php index eedd9722d48..25cd5d17239 100644 --- a/system/database/drivers/pdo/pdo_forge.php +++ b/system/database/drivers/pdo/pdo_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/pdo/pdo_result.php b/system/database/drivers/pdo/pdo_result.php index fe26fea6ea8..56370c97204 100644 --- a/system/database/drivers/pdo/pdo_result.php +++ b/system/database/drivers/pdo/pdo_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/pdo/pdo_utility.php b/system/database/drivers/pdo/pdo_utility.php index 72169c3cae9..8c45fd82f2b 100644 --- a/system/database/drivers/pdo/pdo_utility.php +++ b/system/database/drivers/pdo/pdo_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php index 7a767ef4013..c6cc6680502 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php index 6b420540ce8..c28c4734188 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php index 98ac89f3d79..e03c824f593 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php index 15b100d9b1d..8846f49a1f4 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php index ae2b9983bf7..2d19c3951a2 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php index d3dd9032e6d..7529addfab4 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php index 0bafde861a7..c5e772b182c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php index ad28a655045..91703509f46 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php index 5dba26ec9d0..4d363b198b1 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php index d1b5f92c946..e4693d6b0b1 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php index 9f8c017a5aa..230e60be75b 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php index 22bdf61049f..4de23016147 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php index c230651dcfd..a11ad796efa 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php index e8e24c6b3ed..04792c8443f 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php index d4cfb7dd7f2..cef12befe83 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php index e2078cf39c5..64d1c89f058 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php index 4df2de8baa6..bd4849b2bae 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php index 29135298296..4736c424498 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php index 79c3c7be0d1..a6c83a858f1 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php index b4a6160a8e9..3b2a9c857d3 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php index 409e6501bee..9d1fb6447ac 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php index 15afbdef5cd..91951718a3a 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php index f8ae5f6dbe0..ee68e5b1503 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php index 602a1d42697..e26c9597b65 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index a7a02496b8d..dd46503b109 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php index d26e84cbcaa..e185a40071c 100644 --- a/system/database/drivers/postgre/postgre_forge.php +++ b/system/database/drivers/postgre/postgre_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/postgre/postgre_result.php b/system/database/drivers/postgre/postgre_result.php index a8ad24edfdf..91e036432ab 100644 --- a/system/database/drivers/postgre/postgre_result.php +++ b/system/database/drivers/postgre/postgre_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php index 7c6c0259003..83e144420b3 100644 --- a/system/database/drivers/postgre/postgre_utility.php +++ b/system/database/drivers/postgre/postgre_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index e000a8e5002..d889ef5881f 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php index 2bba330c07a..9b97f88cbf6 100644 --- a/system/database/drivers/sqlite/sqlite_forge.php +++ b/system/database/drivers/sqlite/sqlite_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/sqlite/sqlite_result.php b/system/database/drivers/sqlite/sqlite_result.php index 487d00366bf..322a63cba91 100644 --- a/system/database/drivers/sqlite/sqlite_result.php +++ b/system/database/drivers/sqlite/sqlite_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/sqlite/sqlite_utility.php b/system/database/drivers/sqlite/sqlite_utility.php index 9cb454274c0..84c2abb4744 100644 --- a/system/database/drivers/sqlite/sqlite_utility.php +++ b/system/database/drivers/sqlite/sqlite_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index 73e4537852e..24cff60f8b2 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php index 24690ba20cd..6201d863249 100644 --- a/system/database/drivers/sqlite3/sqlite3_forge.php +++ b/system/database/drivers/sqlite3/sqlite3_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php index 387481b7f43..279c75673ea 100644 --- a/system/database/drivers/sqlite3/sqlite3_result.php +++ b/system/database/drivers/sqlite3/sqlite3_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/sqlite3/sqlite3_utility.php b/system/database/drivers/sqlite3/sqlite3_utility.php index 336f68754e6..21dc0b84df1 100644 --- a/system/database/drivers/sqlite3/sqlite3_utility.php +++ b/system/database/drivers/sqlite3/sqlite3_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index 414669a4b2c..38f89d502a4 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.0.3 diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php index b22b60a4af7..c01cdccac55 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.0.3 diff --git a/system/database/drivers/sqlsrv/sqlsrv_result.php b/system/database/drivers/sqlsrv/sqlsrv_result.php index d2be926aadd..64541baabf2 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_result.php +++ b/system/database/drivers/sqlsrv/sqlsrv_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.0.3 diff --git a/system/database/drivers/sqlsrv/sqlsrv_utility.php b/system/database/drivers/sqlsrv/sqlsrv_utility.php index 77cf0aaf3cb..ebb5d618f5a 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_utility.php +++ b/system/database/drivers/sqlsrv/sqlsrv_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.0.3 diff --git a/system/helpers/array_helper.php b/system/helpers/array_helper.php index 2ce55b9c49c..4bf7cd18853 100644 --- a/system/helpers/array_helper.php +++ b/system/helpers/array_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 03c1dd8525c..4d8e98ea6ab 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php index c2dc73a17c7..95b8224c57e 100644 --- a/system/helpers/cookie_helper.php +++ b/system/helpers/cookie_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index c9b71c30f72..5b6b7623167 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/directory_helper.php b/system/helpers/directory_helper.php index 8f05c5b18e3..01ab4500d19 100644 --- a/system/helpers/directory_helper.php +++ b/system/helpers/directory_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 73f6456c478..a005c91efaa 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/email_helper.php b/system/helpers/email_helper.php index c4d7058102a..b8f28da1c87 100644 --- a/system/helpers/email_helper.php +++ b/system/helpers/email_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php index f6cb1629a6b..305759556ae 100644 --- a/system/helpers/file_helper.php +++ b/system/helpers/file_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 37dafd9137a..badf7773d63 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index 28fbe00bee8..282aa5e7a11 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index f2890059f1c..a84647eb4b9 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/language_helper.php b/system/helpers/language_helper.php index 25ce8abe163..1b5d1396ff3 100644 --- a/system/helpers/language_helper.php +++ b/system/helpers/language_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index 3a24259e19c..328651cdb83 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/path_helper.php b/system/helpers/path_helper.php index c96d0b8b3e1..c9d1194359e 100644 --- a/system/helpers/path_helper.php +++ b/system/helpers/path_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/security_helper.php b/system/helpers/security_helper.php index adbf136bb59..ae88dfc077e 100644 --- a/system/helpers/security_helper.php +++ b/system/helpers/security_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php index d053dd22cb4..e13e1e4df22 100644 --- a/system/helpers/smiley_helper.php +++ b/system/helpers/smiley_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php index 3138a04b3a3..98cf882e050 100644 --- a/system/helpers/string_helper.php +++ b/system/helpers/string_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index fb47036f23f..b7f199d551f 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/typography_helper.php b/system/helpers/typography_helper.php index 45bb9b1d4cb..e8c84c9cac9 100644 --- a/system/helpers/typography_helper.php +++ b/system/helpers/typography_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index d65f92f1b90..6c96482d293 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/xml_helper.php b/system/helpers/xml_helper.php index 55f9c2f6686..8c2a6dcf1f4 100644 --- a/system/helpers/xml_helper.php +++ b/system/helpers/xml_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/calendar_lang.php b/system/language/english/calendar_lang.php index 9d33528682a..d7afdfe37d1 100644 --- a/system/language/english/calendar_lang.php +++ b/system/language/english/calendar_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/date_lang.php b/system/language/english/date_lang.php index c61c9c2ad8f..cdf55454ea5 100644 --- a/system/language/english/date_lang.php +++ b/system/language/english/date_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/db_lang.php b/system/language/english/db_lang.php index 5b67da65974..be37f2bfd20 100644 --- a/system/language/english/db_lang.php +++ b/system/language/english/db_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/email_lang.php b/system/language/english/email_lang.php index cc6b2fd5a6b..dd2331a8233 100644 --- a/system/language/english/email_lang.php +++ b/system/language/english/email_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/form_validation_lang.php b/system/language/english/form_validation_lang.php index 75d6e4b82ae..797c8024554 100644 --- a/system/language/english/form_validation_lang.php +++ b/system/language/english/form_validation_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/ftp_lang.php b/system/language/english/ftp_lang.php index bccc27397c6..02a73449fb4 100644 --- a/system/language/english/ftp_lang.php +++ b/system/language/english/ftp_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/imglib_lang.php b/system/language/english/imglib_lang.php index 41129cd6e5f..e52490e8d15 100644 --- a/system/language/english/imglib_lang.php +++ b/system/language/english/imglib_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/migration_lang.php b/system/language/english/migration_lang.php index 9e4a7c58cdb..f842e88bba9 100644 --- a/system/language/english/migration_lang.php +++ b/system/language/english/migration_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/language/english/number_lang.php b/system/language/english/number_lang.php index db229c5b537..f1756ac161e 100644 --- a/system/language/english/number_lang.php +++ b/system/language/english/number_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/pagination_lang.php b/system/language/english/pagination_lang.php index be133781e1c..d9930d36b0c 100644 --- a/system/language/english/pagination_lang.php +++ b/system/language/english/pagination_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/profiler_lang.php b/system/language/english/profiler_lang.php index ba3edba60e6..2259823f7ed 100644 --- a/system/language/english/profiler_lang.php +++ b/system/language/english/profiler_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/unit_test_lang.php b/system/language/english/unit_test_lang.php index 639829ed817..b9b53e75544 100644 --- a/system/language/english/unit_test_lang.php +++ b/system/language/english/unit_test_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/upload_lang.php b/system/language/english/upload_lang.php index a536dda318c..7fe518424e2 100644 --- a/system/language/english/upload_lang.php +++ b/system/language/english/upload_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php index 0c87a5628e6..023ad02bb09 100644 --- a/system/libraries/Cache/Cache.php +++ b/system/libraries/Cache/Cache.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.0.0 diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php index e0d2ffb399d..621a5964367 100644 --- a/system/libraries/Cache/drivers/Cache_apc.php +++ b/system/libraries/Cache/drivers/Cache_apc.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.0.0 diff --git a/system/libraries/Cache/drivers/Cache_dummy.php b/system/libraries/Cache/drivers/Cache_dummy.php index bf80945a99a..f1fb6b5a0c2 100644 --- a/system/libraries/Cache/drivers/Cache_dummy.php +++ b/system/libraries/Cache/drivers/Cache_dummy.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index c046f3b7d9c..01295baf543 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 59cf4685db1..f1011348dd3 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index ea0059ff702..62c1b391af7 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Cache/drivers/Cache_wincache.php b/system/libraries/Cache/drivers/Cache_wincache.php index 9cc6ff01604..46b12d036f1 100644 --- a/system/libraries/Cache/drivers/Cache_wincache.php +++ b/system/libraries/Cache/drivers/Cache_wincache.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php index f6a0c39c444..fd32cfde6d8 100644 --- a/system/libraries/Calendar.php +++ b/system/libraries/Calendar.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index bf27c639242..0be2a585ba2 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index da4c548e67d..f263d01b194 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 754dd1784fa..c8859b9c358 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php index a46d4f46296..18ef92dde5f 100644 --- a/system/libraries/Encrypt.php +++ b/system/libraries/Encrypt.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Encryption.php b/system/libraries/Encryption.php index 151ce8dec2d..b5d12c49026 100644 --- a/system/libraries/Encryption.php +++ b/system/libraries/Encryption.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index c2212585d89..e3665217817 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Ftp.php b/system/libraries/Ftp.php index 2d345c29446..e753396970d 100644 --- a/system/libraries/Ftp.php +++ b/system/libraries/Ftp.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index e813efd8929..cc865fd81be 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php index 4cc62869255..8e3180adc1f 100644 --- a/system/libraries/Javascript.php +++ b/system/libraries/Javascript.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Javascript/Jquery.php b/system/libraries/Javascript/Jquery.php index 11f2d2361a9..cbaee610843 100644 --- a/system/libraries/Javascript/Jquery.php +++ b/system/libraries/Javascript/Jquery.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index 45a3cbbcef9..d0254abfc37 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index 4d18998b93c..3a5e3479266 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Parser.php b/system/libraries/Parser.php index 57981af95af..508bd4f4fe1 100644 --- a/system/libraries/Parser.php +++ b/system/libraries/Parser.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index 1e464d8b01a..2f2848f3503 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index 05a470d860f..28c93434d2d 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 2.0.0 diff --git a/system/libraries/Session/SessionHandlerInterface.php b/system/libraries/Session/SessionHandlerInterface.php index 9dab5ac07fe..90bae937a63 100644 --- a/system/libraries/Session/SessionHandlerInterface.php +++ b/system/libraries/Session/SessionHandlerInterface.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/Session_driver.php b/system/libraries/Session/Session_driver.php index 64b4bb51147..6d66e274b01 100644 --- a/system/libraries/Session/Session_driver.php +++ b/system/libraries/Session/Session_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index 8c4555481c4..5523655d2d5 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index c540996a7ff..f9dc426aab4 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index 9d7ab117282..cf52caac4ae 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index a31c453729f..6a90a740588 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Table.php b/system/libraries/Table.php index 2d98230937f..3c7674e568a 100644 --- a/system/libraries/Table.php +++ b/system/libraries/Table.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.1 diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index 23bdbbd58d0..944672e62bb 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Typography.php b/system/libraries/Typography.php index 3b6cb164512..2bbe120c9d6 100644 --- a/system/libraries/Typography.php +++ b/system/libraries/Typography.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php index 3f986f3e858..2ddc40a1a2e 100644 --- a/system/libraries/Unit_test.php +++ b/system/libraries/Unit_test.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.3.1 diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 8a2dec76a4c..40ca502847c 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/User_agent.php b/system/libraries/User_agent.php index 53d932a5397..400ec1b3786 100644 --- a/system/libraries/User_agent.php +++ b/system/libraries/User_agent.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index 55555f56ffc..cc1b65eb116 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php index 00d1feca682..894597fa2c7 100644 --- a/system/libraries/Xmlrpcs.php +++ b/system/libraries/Xmlrpcs.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index 3e98ac56891..e3d63e802c7 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link http://codeigniter.com * @since Version 1.0.0 diff --git a/user_guide_src/cilexer/cilexer/cilexer.py b/user_guide_src/cilexer/cilexer/cilexer.py index 2580b0b301b..1abdcbbae9a 100644 --- a/user_guide_src/cilexer/cilexer/cilexer.py +++ b/user_guide_src/cilexer/cilexer/cilexer.py @@ -5,7 +5,7 @@ # # This content is released under the MIT License (MIT) # -# Copyright (c) 2014 - 2015, British Columbia Institute of Technology +# Copyright (c) 2014 - 2016, British Columbia Institute of Technology # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -26,7 +26,7 @@ # THE SOFTWARE. # # Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) -# Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) +# Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) # # http://opensource.org/licenses/MIT MIT License diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index a1ebb520506..8a4c9db595d 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -41,7 +41,7 @@ # General information about the project. project = u'CodeIgniter' -copyright = u'2014 - 2015, British Columbia Institute of Technology' +copyright = u'2014 - 2016, British Columbia Institute of Technology' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -229,7 +229,7 @@ epub_title = u'CodeIgniter' epub_author = u'British Columbia Institute of Technology' epub_publisher = u'British Columbia Institute of Technology' -epub_copyright = u'2014 - 2015, British Columbia Institute of Technology' +epub_copyright = u'2014 - 2016, British Columbia Institute of Technology' # The language of the text. It defaults to the language option # or en if the language is not set. diff --git a/user_guide_src/source/license.rst b/user_guide_src/source/license.rst index c1a32772f72..3f7b2f58bcb 100644 --- a/user_guide_src/source/license.rst +++ b/user_guide_src/source/license.rst @@ -2,7 +2,7 @@ The MIT License (MIT) ##################### -Copyright (c) 2014 - 2015, British Columbia Institute of Technology +Copyright (c) 2014 - 2016, British Columbia Institute of Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 09124f5961c7a6c9a54b5e87ff59e8e9315471b9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jan 2016 12:40:05 +0200 Subject: [PATCH 4125/5397] [ci skip] Update webchat link in readme --- readme.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.rst b/readme.rst index 2e35d7223f6..6ddee94106d 100644 --- a/readme.rst +++ b/readme.rst @@ -57,7 +57,7 @@ Resources - `Language File Translations `_ - `Community Forums `_ - `Community Wiki `_ -- `Community IRC `_ +- `Community IRC `_ Report security issues to our `Security Panel `_ or via our `page on HackerOne `_, thank you. From bd202c91b0e9cf0a8c93bcaa71df9574f5909346 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jan 2016 12:50:18 +0200 Subject: [PATCH 4126/5397] [ci skip] Update codeigniter.com links to https --- application/config/config.php | 8 ++++---- application/config/hooks.php | 2 +- application/config/memcached.php | 2 +- application/config/profiler.php | 2 +- application/config/routes.php | 2 +- application/config/smileys.php | 2 +- application/controllers/Welcome.php | 2 +- composer.json | 2 +- contributing.md | 4 ++-- index.php | 4 ++-- readme.rst | 6 +++--- system/core/Benchmark.php | 4 ++-- system/core/CodeIgniter.php | 4 ++-- system/core/Common.php | 4 ++-- system/core/Config.php | 4 ++-- system/core/Controller.php | 4 ++-- system/core/Exceptions.php | 4 ++-- system/core/Hooks.php | 4 ++-- system/core/Input.php | 4 ++-- system/core/Lang.php | 4 ++-- system/core/Loader.php | 4 ++-- system/core/Log.php | 4 ++-- system/core/Model.php | 4 ++-- system/core/Output.php | 4 ++-- system/core/Router.php | 4 ++-- system/core/Security.php | 4 ++-- system/core/URI.php | 4 ++-- system/core/Utf8.php | 4 ++-- system/core/compat/hash.php | 4 ++-- system/core/compat/mbstring.php | 4 ++-- system/core/compat/password.php | 4 ++-- system/core/compat/standard.php | 4 ++-- system/database/DB.php | 4 ++-- system/database/DB_cache.php | 4 ++-- system/database/DB_driver.php | 4 ++-- system/database/DB_forge.php | 4 ++-- system/database/DB_query_builder.php | 4 ++-- system/database/DB_result.php | 4 ++-- system/database/DB_utility.php | 4 ++-- system/database/drivers/cubrid/cubrid_driver.php | 4 ++-- system/database/drivers/cubrid/cubrid_forge.php | 4 ++-- system/database/drivers/cubrid/cubrid_result.php | 4 ++-- system/database/drivers/cubrid/cubrid_utility.php | 4 ++-- system/database/drivers/ibase/ibase_driver.php | 4 ++-- system/database/drivers/ibase/ibase_forge.php | 4 ++-- system/database/drivers/ibase/ibase_result.php | 4 ++-- system/database/drivers/ibase/ibase_utility.php | 4 ++-- system/database/drivers/mssql/mssql_driver.php | 4 ++-- system/database/drivers/mssql/mssql_forge.php | 4 ++-- system/database/drivers/mssql/mssql_result.php | 4 ++-- system/database/drivers/mssql/mssql_utility.php | 4 ++-- system/database/drivers/mysql/mysql_driver.php | 4 ++-- system/database/drivers/mysql/mysql_forge.php | 4 ++-- system/database/drivers/mysql/mysql_result.php | 4 ++-- system/database/drivers/mysql/mysql_utility.php | 4 ++-- system/database/drivers/mysqli/mysqli_driver.php | 4 ++-- system/database/drivers/mysqli/mysqli_forge.php | 4 ++-- system/database/drivers/mysqli/mysqli_result.php | 4 ++-- system/database/drivers/mysqli/mysqli_utility.php | 4 ++-- system/database/drivers/oci8/oci8_driver.php | 4 ++-- system/database/drivers/oci8/oci8_forge.php | 4 ++-- system/database/drivers/oci8/oci8_result.php | 4 ++-- system/database/drivers/oci8/oci8_utility.php | 4 ++-- system/database/drivers/odbc/odbc_driver.php | 4 ++-- system/database/drivers/odbc/odbc_forge.php | 4 ++-- system/database/drivers/odbc/odbc_result.php | 4 ++-- system/database/drivers/odbc/odbc_utility.php | 4 ++-- system/database/drivers/pdo/pdo_driver.php | 4 ++-- system/database/drivers/pdo/pdo_forge.php | 4 ++-- system/database/drivers/pdo/pdo_result.php | 4 ++-- system/database/drivers/pdo/pdo_utility.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_4d_driver.php | 4 ++-- .../database/drivers/pdo/subdrivers/pdo_4d_forge.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_cubrid_driver.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_cubrid_forge.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_dblib_driver.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_dblib_forge.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_firebird_driver.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_firebird_forge.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_ibm_driver.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_ibm_forge.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_informix_driver.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_informix_forge.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_mysql_driver.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_mysql_forge.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_oci_driver.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_oci_forge.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_odbc_driver.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_odbc_forge.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_pgsql_driver.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_pgsql_forge.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_sqlite_driver.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_sqlite_forge.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_sqlsrv_driver.php | 4 ++-- .../drivers/pdo/subdrivers/pdo_sqlsrv_forge.php | 4 ++-- system/database/drivers/postgre/postgre_driver.php | 4 ++-- system/database/drivers/postgre/postgre_forge.php | 4 ++-- system/database/drivers/postgre/postgre_result.php | 4 ++-- system/database/drivers/postgre/postgre_utility.php | 4 ++-- system/database/drivers/sqlite/sqlite_driver.php | 4 ++-- system/database/drivers/sqlite/sqlite_forge.php | 4 ++-- system/database/drivers/sqlite/sqlite_result.php | 4 ++-- system/database/drivers/sqlite/sqlite_utility.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_driver.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_forge.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_result.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_utility.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_driver.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_forge.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_result.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_utility.php | 4 ++-- system/helpers/array_helper.php | 4 ++-- system/helpers/captcha_helper.php | 4 ++-- system/helpers/cookie_helper.php | 4 ++-- system/helpers/date_helper.php | 4 ++-- system/helpers/directory_helper.php | 4 ++-- system/helpers/download_helper.php | 4 ++-- system/helpers/email_helper.php | 4 ++-- system/helpers/file_helper.php | 4 ++-- system/helpers/form_helper.php | 4 ++-- system/helpers/html_helper.php | 4 ++-- system/helpers/inflector_helper.php | 4 ++-- system/helpers/language_helper.php | 4 ++-- system/helpers/number_helper.php | 4 ++-- system/helpers/path_helper.php | 4 ++-- system/helpers/security_helper.php | 4 ++-- system/helpers/smiley_helper.php | 4 ++-- system/helpers/string_helper.php | 4 ++-- system/helpers/text_helper.php | 4 ++-- system/helpers/typography_helper.php | 4 ++-- system/helpers/url_helper.php | 4 ++-- system/helpers/xml_helper.php | 4 ++-- system/language/english/calendar_lang.php | 2 +- system/language/english/date_lang.php | 2 +- system/language/english/db_lang.php | 2 +- system/language/english/email_lang.php | 2 +- system/language/english/form_validation_lang.php | 2 +- system/language/english/ftp_lang.php | 2 +- system/language/english/imglib_lang.php | 2 +- system/language/english/migration_lang.php | 2 +- system/language/english/number_lang.php | 2 +- system/language/english/pagination_lang.php | 2 +- system/language/english/profiler_lang.php | 2 +- system/language/english/unit_test_lang.php | 2 +- system/language/english/upload_lang.php | 2 +- system/libraries/Cache/Cache.php | 2 +- system/libraries/Cache/drivers/Cache_apc.php | 2 +- system/libraries/Cache/drivers/Cache_dummy.php | 2 +- system/libraries/Cache/drivers/Cache_file.php | 2 +- system/libraries/Cache/drivers/Cache_memcached.php | 2 +- system/libraries/Cache/drivers/Cache_redis.php | 2 +- system/libraries/Cache/drivers/Cache_wincache.php | 2 +- system/libraries/Calendar.php | 4 ++-- system/libraries/Cart.php | 4 ++-- system/libraries/Driver.php | 2 +- system/libraries/Email.php | 4 ++-- system/libraries/Encrypt.php | 6 +++--- system/libraries/Encryption.php | 4 ++-- system/libraries/Form_validation.php | 4 ++-- system/libraries/Ftp.php | 4 ++-- system/libraries/Image_lib.php | 4 ++-- system/libraries/Javascript.php | 4 ++-- system/libraries/Javascript/Jquery.php | 4 ++-- system/libraries/Migration.php | 2 +- system/libraries/Pagination.php | 4 ++-- system/libraries/Parser.php | 4 ++-- system/libraries/Profiler.php | 4 ++-- system/libraries/Session/Session.php | 4 ++-- system/libraries/Session/SessionHandlerInterface.php | 4 ++-- system/libraries/Session/Session_driver.php | 4 ++-- .../Session/drivers/Session_database_driver.php | 4 ++-- .../Session/drivers/Session_files_driver.php | 4 ++-- .../Session/drivers/Session_memcached_driver.php | 4 ++-- .../Session/drivers/Session_redis_driver.php | 4 ++-- system/libraries/Table.php | 4 ++-- system/libraries/Trackback.php | 4 ++-- system/libraries/Typography.php | 4 ++-- system/libraries/Unit_test.php | 4 ++-- system/libraries/Upload.php | 4 ++-- system/libraries/User_agent.php | 4 ++-- system/libraries/Xmlrpc.php | 12 ++++++------ system/libraries/Xmlrpcs.php | 4 ++-- system/libraries/Zip.php | 4 ++-- user_guide_src/cilexer/cilexer/cilexer.py | 2 +- user_guide_src/source/contributing/index.rst | 4 ++-- user_guide_src/source/installation/upgrade_150.rst | 4 ++-- 186 files changed, 350 insertions(+), 350 deletions(-) diff --git a/application/config/config.php b/application/config/config.php index 4f8f8140651..23ef5a528c7 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -62,7 +62,7 @@ | This option allows you to add a suffix to all URLs generated by CodeIgniter. | For more information please see the user guide: | -| http://codeigniter.com/user_guide/general/urls.html +| https://codeigniter.com/user_guide/general/urls.html */ $config['url_suffix'] = ''; @@ -110,8 +110,8 @@ | This item allows you to set the filename/classname prefix when extending | native libraries. For more information please see the user guide: | -| http://codeigniter.com/user_guide/general/core_classes.html -| http://codeigniter.com/user_guide/general/creating_libraries.html +| https://codeigniter.com/user_guide/general/core_classes.html +| https://codeigniter.com/user_guide/general/creating_libraries.html | */ $config['subclass_prefix'] = 'MY_'; @@ -311,7 +311,7 @@ | If you use the Encryption class, you must set an encryption key. | See the user guide for more info. | -| http://codeigniter.com/user_guide/libraries/encryption.html +| https://codeigniter.com/user_guide/libraries/encryption.html | */ $config['encryption_key'] = ''; diff --git a/application/config/hooks.php b/application/config/hooks.php index 2eac5bbc9c1..a8f38a5dc92 100644 --- a/application/config/hooks.php +++ b/application/config/hooks.php @@ -8,6 +8,6 @@ | This file lets you define "hooks" to extend CI without hacking the core | files. Please see the user guide for info: | -| http://codeigniter.com/user_guide/general/hooks.html +| https://codeigniter.com/user_guide/general/hooks.html | */ diff --git a/application/config/memcached.php b/application/config/memcached.php index 55949a66c08..5c23b39c18a 100644 --- a/application/config/memcached.php +++ b/application/config/memcached.php @@ -7,7 +7,7 @@ | ------------------------------------------------------------------------- | Your Memcached servers can be specified below. | -| See: http://codeigniter.com/user_guide/libraries/caching.html#memcached +| See: https://codeigniter.com/user_guide/libraries/caching.html#memcached | */ $config = array( diff --git a/application/config/profiler.php b/application/config/profiler.php index b30204e1698..3db22e39c0b 100644 --- a/application/config/profiler.php +++ b/application/config/profiler.php @@ -9,6 +9,6 @@ | data are displayed when the Profiler is enabled. | Please see the user guide for info: | -| http://codeigniter.com/user_guide/general/profiling.html +| https://codeigniter.com/user_guide/general/profiling.html | */ diff --git a/application/config/routes.php b/application/config/routes.php index a98c6d12281..1b45740d7c7 100644 --- a/application/config/routes.php +++ b/application/config/routes.php @@ -19,7 +19,7 @@ | | Please see the user guide for complete details: | -| http://codeigniter.com/user_guide/general/routing.html +| https://codeigniter.com/user_guide/general/routing.html | | ------------------------------------------------------------------------- | RESERVED ROUTES diff --git a/application/config/smileys.php b/application/config/smileys.php index 1eeba4776cb..abf9a898dde 100644 --- a/application/config/smileys.php +++ b/application/config/smileys.php @@ -10,7 +10,7 @@ | :-) and :) use the same image replacement. | | Please see user guide for more info: -| http://codeigniter.com/user_guide/helpers/smiley_helper.html +| https://codeigniter.com/user_guide/helpers/smiley_helper.html | */ $smileys = array( diff --git a/application/controllers/Welcome.php b/application/controllers/Welcome.php index 34535ef0528..9213c0cf545 100644 --- a/application/controllers/Welcome.php +++ b/application/controllers/Welcome.php @@ -16,7 +16,7 @@ class Welcome extends CI_Controller { * * So any other public methods not prefixed with an underscore will * map to /index.php/welcome/ - * @see http://codeigniter.com/user_guide/general/urls.html + * @see https://codeigniter.com/user_guide/general/urls.html */ public function index() { diff --git a/composer.json b/composer.json index 0653a78859d..4a9e8748e80 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "description": "The CodeIgniter framework", "name": "codeigniter/framework", "type": "project", - "homepage": "http://codeigniter.com", + "homepage": "https://codeigniter.com", "license": "MIT", "support": { "forum": "http://forum.codeigniter.com/", diff --git a/contributing.md b/contributing.md index 5a25698bf76..2037e04243b 100644 --- a/contributing.md +++ b/contributing.md @@ -20,8 +20,8 @@ for us to maintain quality of the code-base. ### PHP Style -All code must meet the [Style Guide](http://codeigniter.com/user_guide/general/styleguide.html), which is -essentially the [Allman indent style](http://en.wikipedia.org/wiki/Indent_style#Allman_style), underscores and readable operators. This makes certain that all code is the same format as the existing code and means it will be as readable as possible. +All code must meet the [Style Guide](https://codeigniter.com/user_guide/general/styleguide.html), which is +essentially the [Allman indent style](https://en.wikipedia.org/wiki/Indent_style#Allman_style), underscores and readable operators. This makes certain that all code is the same format as the existing code and means it will be as readable as possible. ### Documentation diff --git a/index.php b/index.php index 4dbc12a5a55..a5f5df81924 100755 --- a/index.php +++ b/index.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -109,7 +109,7 @@ * folder than the default one you can set its name here. The folder * can also be renamed or relocated anywhere on your server. If * you do, use a full server path. For more info please see the user guide: - * http://codeigniter.com/user_guide/general/managing_apps.html + * https://codeigniter.com/user_guide/general/managing_apps.html * * NO TRAILING SLASH! */ diff --git a/readme.rst b/readme.rst index 6ddee94106d..526950e679a 100644 --- a/readme.rst +++ b/readme.rst @@ -16,7 +16,7 @@ Release Information This repo contains in-development code for future releases. To download the latest stable release please visit the `CodeIgniter Downloads -`_ page. +`_ page. ************************** Changelog and New Features @@ -39,7 +39,7 @@ issues, as well as missing features. Installation ************ -Please see the `installation section `_ +Please see the `installation section `_ of the CodeIgniter User Guide. ******* @@ -53,7 +53,7 @@ agreement `_ +- `User Guide `_ - `Language File Translations `_ - `Community Forums `_ - `Community Wiki `_ diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php index 414a801ee29..fc3b6aafb21 100644 --- a/system/core/Benchmark.php +++ b/system/core/Benchmark.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -47,7 +47,7 @@ * @subpackage Libraries * @category Libraries * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/benchmark.html + * @link https://codeigniter.com/user_guide/libraries/benchmark.html */ class CI_Benchmark { diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 1394fd86298..3b728ddae95 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage CodeIgniter * @category Front-controller * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/ + * @link https://codeigniter.com/user_guide/ */ /** diff --git a/system/core/Common.php b/system/core/Common.php index 32e47b74351..02421b1b1b5 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage CodeIgniter * @category Common Functions * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/ + * @link https://codeigniter.com/user_guide/ */ // ------------------------------------------------------------------------ diff --git a/system/core/Config.php b/system/core/Config.php index d03e02d4dc8..587877da641 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category Libraries * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/config.html + * @link https://codeigniter.com/user_guide/libraries/config.html */ class CI_Config { diff --git a/system/core/Controller.php b/system/core/Controller.php index 260dee4f6e3..c5c6ee0f4ef 100644 --- a/system/core/Controller.php +++ b/system/core/Controller.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -47,7 +47,7 @@ * @subpackage Libraries * @category Libraries * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/general/controllers.html + * @link https://codeigniter.com/user_guide/general/controllers.html */ class CI_Controller { diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php index 29a28516608..e3270d60984 100644 --- a/system/core/Exceptions.php +++ b/system/core/Exceptions.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Exceptions * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/exceptions.html + * @link https://codeigniter.com/user_guide/libraries/exceptions.html */ class CI_Exceptions { diff --git a/system/core/Hooks.php b/system/core/Hooks.php index 42090d16cca..af71dba8372 100644 --- a/system/core/Hooks.php +++ b/system/core/Hooks.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category Libraries * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/general/hooks.html + * @link https://codeigniter.com/user_guide/general/hooks.html */ class CI_Hooks { diff --git a/system/core/Input.php b/system/core/Input.php index 55474fd0c30..bb7ad23ba00 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category Input * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/input.html + * @link https://codeigniter.com/user_guide/libraries/input.html */ class CI_Input { diff --git a/system/core/Lang.php b/system/core/Lang.php index 6913b92fa17..20855f975b2 100644 --- a/system/core/Lang.php +++ b/system/core/Lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Language * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/language.html + * @link https://codeigniter.com/user_guide/libraries/language.html */ class CI_Lang { diff --git a/system/core/Loader.php b/system/core/Loader.php index 500a86ae685..4d093d1397c 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category Loader * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/loader.html + * @link https://codeigniter.com/user_guide/libraries/loader.html */ class CI_Loader { diff --git a/system/core/Log.php b/system/core/Log.php index 4343d746de0..a5f64f29d40 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Logging * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/general/errors.html + * @link https://codeigniter.com/user_guide/general/errors.html */ class CI_Log { diff --git a/system/core/Model.php b/system/core/Model.php index c9f1f8dd6f1..058387255a6 100644 --- a/system/core/Model.php +++ b/system/core/Model.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Libraries * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/config.html + * @link https://codeigniter.com/user_guide/libraries/config.html */ class CI_Model { diff --git a/system/core/Output.php b/system/core/Output.php index 75116b3a6cc..faeb0ea97eb 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category Output * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/output.html + * @link https://codeigniter.com/user_guide/libraries/output.html */ class CI_Output { diff --git a/system/core/Router.php b/system/core/Router.php index 85d1df719a6..e46ddb4a980 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category Libraries * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/general/routing.html + * @link https://codeigniter.com/user_guide/general/routing.html */ class CI_Router { diff --git a/system/core/Security.php b/system/core/Security.php index 16375d17fb5..f697dd9c2e1 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Security * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/security.html + * @link https://codeigniter.com/user_guide/libraries/security.html */ class CI_Security { diff --git a/system/core/URI.php b/system/core/URI.php index 5262dd49c23..22e454339aa 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category URI * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/uri.html + * @link https://codeigniter.com/user_guide/libraries/uri.html */ class CI_URI { diff --git a/system/core/Utf8.php b/system/core/Utf8.php index c6392c4e20f..523f5f248f4 100644 --- a/system/core/Utf8.php +++ b/system/core/Utf8.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category UTF-8 * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/utf8.html + * @link https://codeigniter.com/user_guide/libraries/utf8.html */ class CI_Utf8 { diff --git a/system/core/compat/hash.php b/system/core/compat/hash.php index 7e5f1335d89..405c014ab77 100644 --- a/system/core/compat/hash.php +++ b/system/core/compat/hash.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage CodeIgniter * @category Compatibility * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/ + * @link https://codeigniter.com/user_guide/ * @link http://php.net/hash */ diff --git a/system/core/compat/mbstring.php b/system/core/compat/mbstring.php index ff8e79257b1..0c64ed34681 100644 --- a/system/core/compat/mbstring.php +++ b/system/core/compat/mbstring.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage CodeIgniter * @category Compatibility * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/ + * @link https://codeigniter.com/user_guide/ * @link http://php.net/mbstring */ diff --git a/system/core/compat/password.php b/system/core/compat/password.php index 3062b89c0fb..6b6a0fc6047 100644 --- a/system/core/compat/password.php +++ b/system/core/compat/password.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage CodeIgniter * @category Compatibility * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/ + * @link https://codeigniter.com/user_guide/ * @link http://php.net/password */ diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php index c9f7ce22589..3d439e4698a 100644 --- a/system/core/compat/standard.php +++ b/system/core/compat/standard.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage CodeIgniter * @category Compatibility * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/ + * @link https://codeigniter.com/user_guide/ */ // ------------------------------------------------------------------------ diff --git a/system/database/DB.php b/system/database/DB.php index d713a68dd44..db777da1b29 100644 --- a/system/database/DB.php +++ b/system/database/DB.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ * * @param string|string[] $params * @param bool $query_builder_override diff --git a/system/database/DB_cache.php b/system/database/DB_cache.php index 134737e3147..f31a8e2fb58 100644 --- a/system/database/DB_cache.php +++ b/system/database/DB_cache.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_Cache { diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 78228818e7f..02f0cca724d 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ abstract class CI_DB_driver { diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index 6fc1e1f2b0d..4392eb25f1e 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ abstract class CI_DB_forge { diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 7a65225e45d..637397fdcbe 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ abstract class CI_DB_query_builder extends CI_DB_driver { diff --git a/system/database/DB_result.php b/system/database/DB_result.php index 7b313914aca..745c92ca7f7 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_result { diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index c4bad9eaf25..61900437668 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ abstract class CI_DB_utility { diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index 70f28d6d076..08ad3dcd41e 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.1.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author Esen Sagynov - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_cubrid_driver extends CI_DB { diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php index aac8f03b66b..7091559cdb1 100644 --- a/system/database/drivers/cubrid/cubrid_forge.php +++ b/system/database/drivers/cubrid/cubrid_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.1.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author Esen Sagynov - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_cubrid_forge extends CI_DB_forge { diff --git a/system/database/drivers/cubrid/cubrid_result.php b/system/database/drivers/cubrid/cubrid_result.php index 31ad09d7256..1ac2f899ed7 100644 --- a/system/database/drivers/cubrid/cubrid_result.php +++ b/system/database/drivers/cubrid/cubrid_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.1.0 * @filesource */ @@ -44,7 +44,7 @@ * * @category Database * @author Esen Sagynov - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_cubrid_result extends CI_DB_result { diff --git a/system/database/drivers/cubrid/cubrid_utility.php b/system/database/drivers/cubrid/cubrid_utility.php index c9648c597e2..f853a92757a 100644 --- a/system/database/drivers/cubrid/cubrid_utility.php +++ b/system/database/drivers/cubrid/cubrid_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.1.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author Esen Sagynov - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_cubrid_utility extends CI_DB_utility { diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php index 6b1c77b7f88..f1b89b74851 100644 --- a/system/database/drivers/ibase/ibase_driver.php +++ b/system/database/drivers/ibase/ibase_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_ibase_driver extends CI_DB { diff --git a/system/database/drivers/ibase/ibase_forge.php b/system/database/drivers/ibase/ibase_forge.php index 02e7a37984d..44be2ed00ec 100644 --- a/system/database/drivers/ibase/ibase_forge.php +++ b/system/database/drivers/ibase/ibase_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_ibase_forge extends CI_DB_forge { diff --git a/system/database/drivers/ibase/ibase_result.php b/system/database/drivers/ibase/ibase_result.php index c907e35caa7..a2c0d1d800c 100644 --- a/system/database/drivers/ibase/ibase_result.php +++ b/system/database/drivers/ibase/ibase_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -44,7 +44,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_ibase_result extends CI_DB_result { diff --git a/system/database/drivers/ibase/ibase_utility.php b/system/database/drivers/ibase/ibase_utility.php index 0672113a3e5..4b8790eee41 100644 --- a/system/database/drivers/ibase/ibase_utility.php +++ b/system/database/drivers/ibase/ibase_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_ibase_utility extends CI_DB_utility { diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 965e7b02d05..2a954a2758c 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mssql_driver extends CI_DB { diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php index 4d888ef5c21..9d0af0ce2c3 100644 --- a/system/database/drivers/mssql/mssql_forge.php +++ b/system/database/drivers/mssql/mssql_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mssql_forge extends CI_DB_forge { diff --git a/system/database/drivers/mssql/mssql_result.php b/system/database/drivers/mssql/mssql_result.php index af1e4d79454..bd747c77b4b 100644 --- a/system/database/drivers/mssql/mssql_result.php +++ b/system/database/drivers/mssql/mssql_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mssql_result extends CI_DB_result { diff --git a/system/database/drivers/mssql/mssql_utility.php b/system/database/drivers/mssql/mssql_utility.php index deffaeef134..d236c2045c5 100644 --- a/system/database/drivers/mssql/mssql_utility.php +++ b/system/database/drivers/mssql/mssql_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mssql_utility extends CI_DB_utility { diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index c20b315a219..7628ebd5529 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mysql_driver extends CI_DB { diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php index 51ec17c594b..09560bd6cf4 100644 --- a/system/database/drivers/mysql/mysql_forge.php +++ b/system/database/drivers/mysql/mysql_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mysql_forge extends CI_DB_forge { diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php index 3483d816a0f..286dcdf86fb 100644 --- a/system/database/drivers/mysql/mysql_result.php +++ b/system/database/drivers/mysql/mysql_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mysql_result extends CI_DB_result { diff --git a/system/database/drivers/mysql/mysql_utility.php b/system/database/drivers/mysql/mysql_utility.php index 3802a46fa2e..1b0abf4eee4 100644 --- a/system/database/drivers/mysql/mysql_utility.php +++ b/system/database/drivers/mysql/mysql_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mysql_utility extends CI_DB_utility { diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 61a78037241..62f143f3020 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mysqli_driver extends CI_DB { diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php index 0f19b737c0a..42b69b55aff 100644 --- a/system/database/drivers/mysqli/mysqli_forge.php +++ b/system/database/drivers/mysqli/mysqli_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mysqli_forge extends CI_DB_forge { diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php index 9b653088fb8..3ecb46c1150 100644 --- a/system/database/drivers/mysqli/mysqli_result.php +++ b/system/database/drivers/mysqli/mysqli_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mysqli_result extends CI_DB_result { diff --git a/system/database/drivers/mysqli/mysqli_utility.php b/system/database/drivers/mysqli/mysqli_utility.php index c771f6f574b..7192c55ddf1 100644 --- a/system/database/drivers/mysqli/mysqli_utility.php +++ b/system/database/drivers/mysqli/mysqli_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_mysqli_utility extends CI_DB_utility { diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 1f5258ecfaf..8bf432013ed 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.4.1 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ /** diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index f2ec2d109fe..97afcde89c5 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.4.1 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_oci8_forge extends CI_DB_forge { diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index c6cbd5c58b9..a70779cdf1c 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.4.1 * @filesource */ @@ -44,7 +44,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_oci8_result extends CI_DB_result { diff --git a/system/database/drivers/oci8/oci8_utility.php b/system/database/drivers/oci8/oci8_utility.php index 372ad37377a..cde4a5f0306 100644 --- a/system/database/drivers/oci8/oci8_utility.php +++ b/system/database/drivers/oci8/oci8_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.4.1 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_oci8_utility extends CI_DB_utility { diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 5b17ff69214..370cdaa973a 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_odbc_driver extends CI_DB { diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php index 3dc765025a8..0a482731be7 100644 --- a/system/database/drivers/odbc/odbc_forge.php +++ b/system/database/drivers/odbc/odbc_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/database/ + * @link https://codeigniter.com/database/ */ class CI_DB_odbc_forge extends CI_DB_forge { diff --git a/system/database/drivers/odbc/odbc_result.php b/system/database/drivers/odbc/odbc_result.php index a8aa3f67fba..d5aec527718 100644 --- a/system/database/drivers/odbc/odbc_result.php +++ b/system/database/drivers/odbc/odbc_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_odbc_result extends CI_DB_result { diff --git a/system/database/drivers/odbc/odbc_utility.php b/system/database/drivers/odbc/odbc_utility.php index 35944a55ba8..61d1d21fc60 100644 --- a/system/database/drivers/odbc/odbc_utility.php +++ b/system/database/drivers/odbc/odbc_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/database/ + * @link https://codeigniter.com/database/ */ class CI_DB_odbc_utility extends CI_DB_utility { diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 4bd7ecfeeba..612ec32be25 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.1.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_driver extends CI_DB { diff --git a/system/database/drivers/pdo/pdo_forge.php b/system/database/drivers/pdo/pdo_forge.php index 25cd5d17239..97bd4df82b0 100644 --- a/system/database/drivers/pdo/pdo_forge.php +++ b/system/database/drivers/pdo/pdo_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.1.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/database/ + * @link https://codeigniter.com/database/ */ class CI_DB_pdo_forge extends CI_DB_forge { diff --git a/system/database/drivers/pdo/pdo_result.php b/system/database/drivers/pdo/pdo_result.php index 56370c97204..6dcebda3cc1 100644 --- a/system/database/drivers/pdo/pdo_result.php +++ b/system/database/drivers/pdo/pdo_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.1.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_result extends CI_DB_result { diff --git a/system/database/drivers/pdo/pdo_utility.php b/system/database/drivers/pdo/pdo_utility.php index 8c45fd82f2b..dd5e3c4a2c3 100644 --- a/system/database/drivers/pdo/pdo_utility.php +++ b/system/database/drivers/pdo/pdo_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.1.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/database/ + * @link https://codeigniter.com/database/ */ class CI_DB_pdo_utility extends CI_DB_utility { diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php index c6cc6680502..d9314287614 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_4d_driver extends CI_DB_pdo_driver { diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php index c28c4734188..f6c3f362108 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_4d_forge extends CI_DB_pdo_forge { diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php index e03c824f593..3e52cd753ee 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_cubrid_driver extends CI_DB_pdo_driver { diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php index 8846f49a1f4..9f542c6d673 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_cubrid_forge extends CI_DB_pdo_forge { diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php index 2d19c3951a2..ee2465933c4 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_dblib_driver extends CI_DB_pdo_driver { diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php index 7529addfab4..42cdd188e97 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_dblib_forge extends CI_DB_pdo_forge { diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php index c5e772b182c..237029d2171 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_firebird_driver extends CI_DB_pdo_driver { diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php index 91703509f46..34d5f775016 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_firebird_forge extends CI_DB_pdo_forge { diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php index 4d363b198b1..ecc822187fe 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_ibm_driver extends CI_DB_pdo_driver { diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php index e4693d6b0b1..6698d5dd32c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_ibm_forge extends CI_DB_pdo_forge { diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php index 230e60be75b..f9476ecd401 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_informix_driver extends CI_DB_pdo_driver { diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php index 4de23016147..ee79e9950d6 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_informix_forge extends CI_DB_pdo_forge { diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php index a11ad796efa..d6c9ce5556b 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_mysql_driver extends CI_DB_pdo_driver { diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php index 04792c8443f..dc4426598a8 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_mysql_forge extends CI_DB_pdo_forge { diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php index cef12befe83..7c79c053117 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_oci_driver extends CI_DB_pdo_driver { diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php index 64d1c89f058..2f7bb6c7809 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_oci_forge extends CI_DB_pdo_forge { diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php index bd4849b2bae..622b0d41cb3 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_odbc_driver extends CI_DB_pdo_driver { diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php index 4736c424498..3724c63d516 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/database/ + * @link https://codeigniter.com/database/ */ class CI_DB_pdo_odbc_forge extends CI_DB_pdo_forge { diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php index a6c83a858f1..bd09a6756ec 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_pgsql_driver extends CI_DB_pdo_driver { diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php index 3b2a9c857d3..71ac3acb5d3 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_pgsql_forge extends CI_DB_pdo_forge { diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php index 9d1fb6447ac..5f85ecacfa8 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_sqlite_driver extends CI_DB_pdo_driver { diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php index 91951718a3a..afe9e782504 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_sqlite_forge extends CI_DB_pdo_forge { diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php index ee68e5b1503..23422431ec5 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_sqlsrv_driver extends CI_DB_pdo_driver { diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php index e26c9597b65..9091fc1d64b 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_pdo_sqlsrv_forge extends CI_DB_pdo_forge { diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index dd46503b109..1ef530afbee 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_postgre_driver extends CI_DB { diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php index e185a40071c..8adff543d7d 100644 --- a/system/database/drivers/postgre/postgre_forge.php +++ b/system/database/drivers/postgre/postgre_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_postgre_forge extends CI_DB_forge { diff --git a/system/database/drivers/postgre/postgre_result.php b/system/database/drivers/postgre/postgre_result.php index 91e036432ab..6c46b0faf55 100644 --- a/system/database/drivers/postgre/postgre_result.php +++ b/system/database/drivers/postgre/postgre_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_postgre_result extends CI_DB_result { diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php index 83e144420b3..abbe6f695b0 100644 --- a/system/database/drivers/postgre/postgre_utility.php +++ b/system/database/drivers/postgre/postgre_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_postgre_utility extends CI_DB_utility { diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index d889ef5881f..9adae082937 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_sqlite_driver extends CI_DB { diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php index 9b97f88cbf6..d6271bf90b3 100644 --- a/system/database/drivers/sqlite/sqlite_forge.php +++ b/system/database/drivers/sqlite/sqlite_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_sqlite_forge extends CI_DB_forge { diff --git a/system/database/drivers/sqlite/sqlite_result.php b/system/database/drivers/sqlite/sqlite_result.php index 322a63cba91..9e53e14c7d6 100644 --- a/system/database/drivers/sqlite/sqlite_result.php +++ b/system/database/drivers/sqlite/sqlite_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -44,7 +44,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_sqlite_result extends CI_DB_result { diff --git a/system/database/drivers/sqlite/sqlite_utility.php b/system/database/drivers/sqlite/sqlite_utility.php index 84c2abb4744..ed08929f1ac 100644 --- a/system/database/drivers/sqlite/sqlite_utility.php +++ b/system/database/drivers/sqlite/sqlite_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_sqlite_utility extends CI_DB_utility { diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index 24cff60f8b2..bf2be00d3d1 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_sqlite3_driver extends CI_DB { diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php index 6201d863249..854a734aae8 100644 --- a/system/database/drivers/sqlite3/sqlite3_forge.php +++ b/system/database/drivers/sqlite3/sqlite3_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_sqlite3_forge extends CI_DB_forge { diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php index 279c75673ea..b77c6ebc648 100644 --- a/system/database/drivers/sqlite3/sqlite3_result.php +++ b/system/database/drivers/sqlite3/sqlite3_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -44,7 +44,7 @@ * * @category Database * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_sqlite3_result extends CI_DB_result { diff --git a/system/database/drivers/sqlite3/sqlite3_utility.php b/system/database/drivers/sqlite3/sqlite3_utility.php index 21dc0b84df1..c9f772ddee7 100644 --- a/system/database/drivers/sqlite3/sqlite3_utility.php +++ b/system/database/drivers/sqlite3/sqlite3_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_sqlite3_utility extends CI_DB_utility { diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index 38f89d502a4..f3732544ae6 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.0.3 * @filesource */ @@ -48,7 +48,7 @@ * @subpackage Drivers * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_sqlsrv_driver extends CI_DB { diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php index c01cdccac55..4f1e76c1347 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.0.3 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_sqlsrv_forge extends CI_DB_forge { diff --git a/system/database/drivers/sqlsrv/sqlsrv_result.php b/system/database/drivers/sqlsrv/sqlsrv_result.php index 64541baabf2..b7e554858cd 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_result.php +++ b/system/database/drivers/sqlsrv/sqlsrv_result.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.0.3 * @filesource */ @@ -44,7 +44,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_sqlsrv_result extends CI_DB_result { diff --git a/system/database/drivers/sqlsrv/sqlsrv_utility.php b/system/database/drivers/sqlsrv/sqlsrv_utility.php index ebb5d618f5a..bdc8c170081 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_utility.php +++ b/system/database/drivers/sqlsrv/sqlsrv_utility.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.0.3 * @filesource */ @@ -42,7 +42,7 @@ * * @category Database * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/database/ + * @link https://codeigniter.com/user_guide/database/ */ class CI_DB_sqlsrv_utility extends CI_DB_utility { diff --git a/system/helpers/array_helper.php b/system/helpers/array_helper.php index 4bf7cd18853..151324cf994 100644 --- a/system/helpers/array_helper.php +++ b/system/helpers/array_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/array_helper.html + * @link https://codeigniter.com/user_guide/helpers/array_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 4d8e98ea6ab..db708e894ad 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/captcha_helper.html + * @link https://codeigniter.com/user_guide/helpers/captcha_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php index 95b8224c57e..9c12005a6c3 100644 --- a/system/helpers/cookie_helper.php +++ b/system/helpers/cookie_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/cookie_helper.html + * @link https://codeigniter.com/user_guide/helpers/cookie_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 5b6b7623167..8cc01f6e05d 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/date_helper.html + * @link https://codeigniter.com/user_guide/helpers/date_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/directory_helper.php b/system/helpers/directory_helper.php index 01ab4500d19..d37db44ac42 100644 --- a/system/helpers/directory_helper.php +++ b/system/helpers/directory_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/directory_helper.html + * @link https://codeigniter.com/user_guide/helpers/directory_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index a005c91efaa..c2362540edc 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/download_helper.html + * @link https://codeigniter.com/user_guide/helpers/download_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/email_helper.php b/system/helpers/email_helper.php index b8f28da1c87..65e79c8c5f8 100644 --- a/system/helpers/email_helper.php +++ b/system/helpers/email_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/email_helper.html + * @link https://codeigniter.com/user_guide/helpers/email_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php index 305759556ae..62af7e1f316 100644 --- a/system/helpers/file_helper.php +++ b/system/helpers/file_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/file_helper.html + * @link https://codeigniter.com/user_guide/helpers/file_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index badf7773d63..1624bded018 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/form_helper.html + * @link https://codeigniter.com/user_guide/helpers/form_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index 282aa5e7a11..2c7595c4fcf 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/html_helper.html + * @link https://codeigniter.com/user_guide/helpers/html_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index a84647eb4b9..f02afcf234a 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/inflector_helper.html + * @link https://codeigniter.com/user_guide/helpers/inflector_helper.html */ // -------------------------------------------------------------------- diff --git a/system/helpers/language_helper.php b/system/helpers/language_helper.php index 1b5d1396ff3..2de694c2af5 100644 --- a/system/helpers/language_helper.php +++ b/system/helpers/language_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/language_helper.html + * @link https://codeigniter.com/user_guide/helpers/language_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index 328651cdb83..b5edfde9c19 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/number_helper.html + * @link https://codeigniter.com/user_guide/helpers/number_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/path_helper.php b/system/helpers/path_helper.php index c9d1194359e..7135b5d601c 100644 --- a/system/helpers/path_helper.php +++ b/system/helpers/path_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/path_helper.html + * @link https://codeigniter.com/user_guide/helpers/path_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/security_helper.php b/system/helpers/security_helper.php index ae88dfc077e..80a0bf52e6b 100644 --- a/system/helpers/security_helper.php +++ b/system/helpers/security_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/security_helper.html + * @link https://codeigniter.com/user_guide/helpers/security_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php index e13e1e4df22..f437f03892f 100644 --- a/system/helpers/smiley_helper.php +++ b/system/helpers/smiley_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/smiley_helper.html + * @link https://codeigniter.com/user_guide/helpers/smiley_helper.html * @deprecated 3.0.0 This helper is too specific for CI. */ diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php index 98cf882e050..70172270ebc 100644 --- a/system/helpers/string_helper.php +++ b/system/helpers/string_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/string_helper.html + * @link https://codeigniter.com/user_guide/helpers/string_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index b7f199d551f..1100e670d01 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/text_helper.html + * @link https://codeigniter.com/user_guide/helpers/text_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/typography_helper.php b/system/helpers/typography_helper.php index e8c84c9cac9..139dd8c5e68 100644 --- a/system/helpers/typography_helper.php +++ b/system/helpers/typography_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/typography_helper.html + * @link https://codeigniter.com/user_guide/helpers/typography_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index 6c96482d293..2c66729228a 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/url_helper.html + * @link https://codeigniter.com/user_guide/helpers/url_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/helpers/xml_helper.php b/system/helpers/xml_helper.php index 8c2a6dcf1f4..dae094cf20d 100644 --- a/system/helpers/xml_helper.php +++ b/system/helpers/xml_helper.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Helpers * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/helpers/xml_helper.html + * @link https://codeigniter.com/user_guide/helpers/xml_helper.html */ // ------------------------------------------------------------------------ diff --git a/system/language/english/calendar_lang.php b/system/language/english/calendar_lang.php index d7afdfe37d1..c9603b58098 100644 --- a/system/language/english/calendar_lang.php +++ b/system/language/english/calendar_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/language/english/date_lang.php b/system/language/english/date_lang.php index cdf55454ea5..bb341c89e30 100644 --- a/system/language/english/date_lang.php +++ b/system/language/english/date_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/language/english/db_lang.php b/system/language/english/db_lang.php index be37f2bfd20..c28bdab3bc5 100644 --- a/system/language/english/db_lang.php +++ b/system/language/english/db_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/language/english/email_lang.php b/system/language/english/email_lang.php index dd2331a8233..18320269ab7 100644 --- a/system/language/english/email_lang.php +++ b/system/language/english/email_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/language/english/form_validation_lang.php b/system/language/english/form_validation_lang.php index 797c8024554..23391e41149 100644 --- a/system/language/english/form_validation_lang.php +++ b/system/language/english/form_validation_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/language/english/ftp_lang.php b/system/language/english/ftp_lang.php index 02a73449fb4..d649e4d2883 100644 --- a/system/language/english/ftp_lang.php +++ b/system/language/english/ftp_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/language/english/imglib_lang.php b/system/language/english/imglib_lang.php index e52490e8d15..fe06d449baf 100644 --- a/system/language/english/imglib_lang.php +++ b/system/language/english/imglib_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/language/english/migration_lang.php b/system/language/english/migration_lang.php index f842e88bba9..de81f6d6369 100644 --- a/system/language/english/migration_lang.php +++ b/system/language/english/migration_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ diff --git a/system/language/english/number_lang.php b/system/language/english/number_lang.php index f1756ac161e..010e83e0571 100644 --- a/system/language/english/number_lang.php +++ b/system/language/english/number_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/language/english/pagination_lang.php b/system/language/english/pagination_lang.php index d9930d36b0c..a2874feffa5 100644 --- a/system/language/english/pagination_lang.php +++ b/system/language/english/pagination_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/language/english/profiler_lang.php b/system/language/english/profiler_lang.php index 2259823f7ed..b66f4e5e5ac 100644 --- a/system/language/english/profiler_lang.php +++ b/system/language/english/profiler_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/language/english/unit_test_lang.php b/system/language/english/unit_test_lang.php index b9b53e75544..d9c09f9b0e4 100644 --- a/system/language/english/unit_test_lang.php +++ b/system/language/english/unit_test_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/language/english/upload_lang.php b/system/language/english/upload_lang.php index 7fe518424e2..a054031bdac 100644 --- a/system/language/english/upload_lang.php +++ b/system/language/english/upload_lang.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php index 023ad02bb09..64377de50c9 100644 --- a/system/libraries/Cache/Cache.php +++ b/system/libraries/Cache/Cache.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.0.0 * @filesource */ diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php index 621a5964367..5f373ba17f6 100644 --- a/system/libraries/Cache/drivers/Cache_apc.php +++ b/system/libraries/Cache/drivers/Cache_apc.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.0.0 * @filesource */ diff --git a/system/libraries/Cache/drivers/Cache_dummy.php b/system/libraries/Cache/drivers/Cache_dummy.php index f1fb6b5a0c2..d8c4b0b2b58 100644 --- a/system/libraries/Cache/drivers/Cache_dummy.php +++ b/system/libraries/Cache/drivers/Cache_dummy.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.0 * @filesource */ diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index 01295baf543..a52b054977f 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.0 * @filesource */ diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index f1011348dd3..67f9e4f4584 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.0 * @filesource */ diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 62c1b391af7..59f14d16be9 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ diff --git a/system/libraries/Cache/drivers/Cache_wincache.php b/system/libraries/Cache/drivers/Cache_wincache.php index 46b12d036f1..9b5029d8cf1 100644 --- a/system/libraries/Cache/drivers/Cache_wincache.php +++ b/system/libraries/Cache/drivers/Cache_wincache.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php index fd32cfde6d8..2a42b58449c 100644 --- a/system/libraries/Calendar.php +++ b/system/libraries/Calendar.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category Libraries * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/calendar.html + * @link https://codeigniter.com/user_guide/libraries/calendar.html */ class CI_Calendar { diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index 0be2a585ba2..af527da9ea5 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Shopping Cart * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/cart.html + * @link https://codeigniter.com/user_guide/libraries/cart.html * @deprecated 3.0.0 This class is too specific for CI. */ class CI_Cart { diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index f263d01b194..b8f740d6a5f 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ diff --git a/system/libraries/Email.php b/system/libraries/Email.php index c8859b9c358..ad4c02ff881 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category Libraries * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/email.html + * @link https://codeigniter.com/user_guide/libraries/email.html */ class CI_Email { diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php index 18ef92dde5f..608f7da28a9 100644 --- a/system/libraries/Encrypt.php +++ b/system/libraries/Encrypt.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category Libraries * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/encryption.html + * @link https://codeigniter.com/user_guide/libraries/encryption.html */ class CI_Encrypt { @@ -198,7 +198,7 @@ public function decode($string, $key = '') * This allows for backwards compatibility and a method to transition to the * new encryption algorithms. * - * For more details, see http://codeigniter.com/user_guide/installation/upgrade_200.html#encryption + * For more details, see https://codeigniter.com/user_guide/installation/upgrade_200.html#encryption * * @param string * @param int (mcrypt mode constant) diff --git a/system/libraries/Encryption.php b/system/libraries/Encryption.php index b5d12c49026..5e04fc1add2 100644 --- a/system/libraries/Encryption.php +++ b/system/libraries/Encryption.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category Libraries * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/libraries/encryption.html + * @link https://codeigniter.com/user_guide/libraries/encryption.html */ class CI_Encryption { diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index e3665217817..194a9292ee8 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Validation * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/form_validation.html + * @link https://codeigniter.com/user_guide/libraries/form_validation.html */ class CI_Form_validation { diff --git a/system/libraries/Ftp.php b/system/libraries/Ftp.php index e753396970d..53ff979e5ed 100644 --- a/system/libraries/Ftp.php +++ b/system/libraries/Ftp.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Libraries * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/ftp.html + * @link https://codeigniter.com/user_guide/libraries/ftp.html */ class CI_FTP { diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index cc865fd81be..d3a832415a9 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Image_lib * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/image_lib.html + * @link https://codeigniter.com/user_guide/libraries/image_lib.html */ class CI_Image_lib { diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php index 8e3180adc1f..ba8aedb60a0 100644 --- a/system/libraries/Javascript.php +++ b/system/libraries/Javascript.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Javascript * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/javascript.html + * @link https://codeigniter.com/user_guide/libraries/javascript.html * @deprecated 3.0.0 This was never a good idea in the first place. */ class CI_Javascript { diff --git a/system/libraries/Javascript/Jquery.php b/system/libraries/Javascript/Jquery.php index cbaee610843..1039a4aa80d 100644 --- a/system/libraries/Javascript/Jquery.php +++ b/system/libraries/Javascript/Jquery.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Loader * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/javascript.html + * @link https://codeigniter.com/user_guide/libraries/javascript.html */ class CI_Jquery extends CI_Javascript { diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index d0254abfc37..259c83c547d 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index 3a5e3479266..9831730e4c0 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Pagination * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/pagination.html + * @link https://codeigniter.com/user_guide/libraries/pagination.html */ class CI_Pagination { diff --git a/system/libraries/Parser.php b/system/libraries/Parser.php index 508bd4f4fe1..7f3be467212 100644 --- a/system/libraries/Parser.php +++ b/system/libraries/Parser.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Parser * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/parser.html + * @link https://codeigniter.com/user_guide/libraries/parser.html */ class CI_Parser { diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index 2f2848f3503..4ad33bbac67 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -50,7 +50,7 @@ * @subpackage Libraries * @category Libraries * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/general/profiling.html + * @link https://codeigniter.com/user_guide/general/profiling.html */ class CI_Profiler { diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index 28c93434d2d..1e81ec53f59 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 2.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Sessions * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/libraries/sessions.html + * @link https://codeigniter.com/user_guide/libraries/sessions.html */ class CI_Session { diff --git a/system/libraries/Session/SessionHandlerInterface.php b/system/libraries/Session/SessionHandlerInterface.php index 90bae937a63..ea825a066eb 100644 --- a/system/libraries/Session/SessionHandlerInterface.php +++ b/system/libraries/Session/SessionHandlerInterface.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category Sessions * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/libraries/sessions.html + * @link https://codeigniter.com/user_guide/libraries/sessions.html */ interface SessionHandlerInterface { diff --git a/system/libraries/Session/Session_driver.php b/system/libraries/Session/Session_driver.php index 6d66e274b01..02d984cdf5e 100644 --- a/system/libraries/Session/Session_driver.php +++ b/system/libraries/Session/Session_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Sessions * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/libraries/sessions.html + * @link https://codeigniter.com/user_guide/libraries/sessions.html */ abstract class CI_Session_driver implements SessionHandlerInterface { diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index 5523655d2d5..b3191e060ec 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Sessions * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/libraries/sessions.html + * @link https://codeigniter.com/user_guide/libraries/sessions.html */ class CI_Session_database_driver extends CI_Session_driver implements SessionHandlerInterface { diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index f9dc426aab4..5ac1dcd36f2 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Sessions * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/libraries/sessions.html + * @link https://codeigniter.com/user_guide/libraries/sessions.html */ class CI_Session_files_driver extends CI_Session_driver implements SessionHandlerInterface { diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index cf52caac4ae..b2feb56f142 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Sessions * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/libraries/sessions.html + * @link https://codeigniter.com/user_guide/libraries/sessions.html */ class CI_Session_memcached_driver extends CI_Session_driver implements SessionHandlerInterface { diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index 6a90a740588..04776055498 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 3.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Sessions * @author Andrey Andreev - * @link http://codeigniter.com/user_guide/libraries/sessions.html + * @link https://codeigniter.com/user_guide/libraries/sessions.html */ class CI_Session_redis_driver extends CI_Session_driver implements SessionHandlerInterface { diff --git a/system/libraries/Table.php b/system/libraries/Table.php index 3c7674e568a..e261d3e0141 100644 --- a/system/libraries/Table.php +++ b/system/libraries/Table.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.1 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category HTML Tables * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/table.html + * @link https://codeigniter.com/user_guide/libraries/table.html */ class CI_Table { diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index 944672e62bb..7488a809bc0 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category Trackbacks * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/trackback.html + * @link https://codeigniter.com/user_guide/libraries/trackback.html */ class CI_Trackback { diff --git a/system/libraries/Typography.php b/system/libraries/Typography.php index 2bbe120c9d6..71a6d0809b9 100644 --- a/system/libraries/Typography.php +++ b/system/libraries/Typography.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Helpers * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/typography.html + * @link https://codeigniter.com/user_guide/libraries/typography.html */ class CI_Typography { diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php index 2ddc40a1a2e..6db39212bf8 100644 --- a/system/libraries/Unit_test.php +++ b/system/libraries/Unit_test.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.3.1 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category UnitTesting * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/unit_testing.html + * @link https://codeigniter.com/user_guide/libraries/unit_testing.html */ class CI_Unit_test { diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 40ca502847c..5cb25eeec9b 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -44,7 +44,7 @@ * @subpackage Libraries * @category Uploads * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/file_uploading.html + * @link https://codeigniter.com/user_guide/libraries/file_uploading.html */ class CI_Upload { diff --git a/system/libraries/User_agent.php b/system/libraries/User_agent.php index 400ec1b3786..150643a4dc4 100644 --- a/system/libraries/User_agent.php +++ b/system/libraries/User_agent.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -46,7 +46,7 @@ * @subpackage Libraries * @category User Agent * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/user_agent.html + * @link https://codeigniter.com/user_guide/libraries/user_agent.html */ class CI_User_agent { diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index cc1b65eb116..d4bcbd0195c 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -51,7 +51,7 @@ * @subpackage Libraries * @category XML-RPC * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html + * @link https://codeigniter.com/user_guide/libraries/xmlrpc.html */ class CI_Xmlrpc { @@ -559,7 +559,7 @@ public function send_response($response) * * @category XML-RPC * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html + * @link https://codeigniter.com/user_guide/libraries/xmlrpc.html */ class XML_RPC_Client extends CI_Xmlrpc { @@ -781,7 +781,7 @@ public function sendPayload($msg) * * @category XML-RPC * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html + * @link https://codeigniter.com/user_guide/libraries/xmlrpc.html */ class XML_RPC_Response { @@ -1030,7 +1030,7 @@ public function iso8601_decode($time, $utc = FALSE) * * @category XML-RPC * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html + * @link https://codeigniter.com/user_guide/libraries/xmlrpc.html */ class XML_RPC_Message extends CI_Xmlrpc { @@ -1649,7 +1649,7 @@ public function decode_message($param) * * @category XML-RPC * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html + * @link https://codeigniter.com/user_guide/libraries/xmlrpc.html */ class XML_RPC_Values extends CI_Xmlrpc { diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php index 894597fa2c7..b75fa288ef3 100644 --- a/system/libraries/Xmlrpcs.php +++ b/system/libraries/Xmlrpcs.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -56,7 +56,7 @@ * @subpackage Libraries * @category XML-RPC * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html + * @link https://codeigniter.com/user_guide/libraries/xmlrpc.html */ class CI_Xmlrpcs extends CI_Xmlrpc { diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index e3d63e802c7..d412ebf34c4 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License - * @link http://codeigniter.com + * @link https://codeigniter.com * @since Version 1.0.0 * @filesource */ @@ -50,7 +50,7 @@ * @subpackage Libraries * @category Encryption * @author EllisLab Dev Team - * @link http://codeigniter.com/user_guide/libraries/zip.html + * @link https://codeigniter.com/user_guide/libraries/zip.html */ class CI_Zip { diff --git a/user_guide_src/cilexer/cilexer/cilexer.py b/user_guide_src/cilexer/cilexer/cilexer.py index 1abdcbbae9a..d6bebe28d61 100644 --- a/user_guide_src/cilexer/cilexer/cilexer.py +++ b/user_guide_src/cilexer/cilexer/cilexer.py @@ -1,5 +1,5 @@ # CodeIgniter -# http://codeigniter.com +# https://codeigniter.com # # An open source application development framework for PHP # diff --git a/user_guide_src/source/contributing/index.rst b/user_guide_src/source/contributing/index.rst index 5966070d1b6..9551fbeb74c 100644 --- a/user_guide_src/source/contributing/index.rst +++ b/user_guide_src/source/contributing/index.rst @@ -86,9 +86,9 @@ PHP Style ========= All code must meet the `Style Guide -`_, which is +`_, which is essentially the `Allman indent style -`_, underscores and +`_, underscores and readable operators. This makes certain that all code is the same format as the existing code and means it will be as readable as possible. diff --git a/user_guide_src/source/installation/upgrade_150.rst b/user_guide_src/source/installation/upgrade_150.rst index bfe01ebba10..50eb5eae5d3 100644 --- a/user_guide_src/source/installation/upgrade_150.rst +++ b/user_guide_src/source/installation/upgrade_150.rst @@ -49,8 +49,8 @@ Open your application/config/config.php file and ADD these new items:: | This item allows you to set the filename/classname prefix when extending | native libraries. For more information please see the user guide: | - | http://codeigniter.com/user_guide/general/core_classes.html - | http://codeigniter.com/user_guide/general/creating_libraries.html + | https://codeigniter.com/user_guide/general/core_classes.html + | https://codeigniter.com/user_guide/general/creating_libraries.html | */ $config['subclass_prefix'] = 'MY_'; From 700dbadb23bfa937f519df668a57c9050cd05062 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jan 2016 12:51:46 +0200 Subject: [PATCH 4127/5397] Alter a valid URL test --- tests/codeigniter/libraries/Form_validation_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/codeigniter/libraries/Form_validation_test.php b/tests/codeigniter/libraries/Form_validation_test.php index 26d82ec9395..65a3bbff7e3 100644 --- a/tests/codeigniter/libraries/Form_validation_test.php +++ b/tests/codeigniter/libraries/Form_validation_test.php @@ -229,7 +229,7 @@ public function test_rule_is_natural_no_zero() public function test_rule_valid_url() { $this->assertTrue($this->form_validation->valid_url('www.codeigniter.com')); - $this->assertTrue($this->form_validation->valid_url('http://codeigniter.eu')); + $this->assertTrue($this->form_validation->valid_url('http://codeigniter.com')); $this->assertFalse($this->form_validation->valid_url('htt://www.codeIgniter.com')); $this->assertFalse($this->form_validation->valid_url('')); From 1924e879b165fb119847a49a7a5eab2f28295fa2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jan 2016 12:55:34 +0200 Subject: [PATCH 4128/5397] [ci skip] Update ellislab.com links to https too --- index.php | 2 +- system/core/Benchmark.php | 2 +- system/core/CodeIgniter.php | 2 +- system/core/Common.php | 2 +- system/core/Config.php | 2 +- system/core/Controller.php | 2 +- system/core/Exceptions.php | 2 +- system/core/Hooks.php | 2 +- system/core/Input.php | 2 +- system/core/Lang.php | 2 +- system/core/Loader.php | 2 +- system/core/Log.php | 2 +- system/core/Model.php | 2 +- system/core/Output.php | 2 +- system/core/Router.php | 2 +- system/core/Security.php | 2 +- system/core/URI.php | 2 +- system/core/Utf8.php | 2 +- system/core/compat/hash.php | 2 +- system/core/compat/mbstring.php | 2 +- system/core/compat/password.php | 2 +- system/core/compat/standard.php | 2 +- system/database/DB.php | 2 +- system/database/DB_cache.php | 2 +- system/database/DB_driver.php | 2 +- system/database/DB_forge.php | 2 +- system/database/DB_query_builder.php | 2 +- system/database/DB_result.php | 2 +- system/database/DB_utility.php | 2 +- system/database/drivers/cubrid/cubrid_driver.php | 2 +- system/database/drivers/cubrid/cubrid_forge.php | 2 +- system/database/drivers/cubrid/cubrid_result.php | 2 +- system/database/drivers/cubrid/cubrid_utility.php | 2 +- system/database/drivers/ibase/ibase_driver.php | 2 +- system/database/drivers/ibase/ibase_forge.php | 2 +- system/database/drivers/ibase/ibase_result.php | 2 +- system/database/drivers/ibase/ibase_utility.php | 2 +- system/database/drivers/mssql/mssql_driver.php | 2 +- system/database/drivers/mssql/mssql_forge.php | 2 +- system/database/drivers/mssql/mssql_result.php | 2 +- system/database/drivers/mssql/mssql_utility.php | 2 +- system/database/drivers/mysql/mysql_driver.php | 2 +- system/database/drivers/mysql/mysql_forge.php | 2 +- system/database/drivers/mysql/mysql_result.php | 2 +- system/database/drivers/mysql/mysql_utility.php | 2 +- system/database/drivers/mysqli/mysqli_driver.php | 2 +- system/database/drivers/mysqli/mysqli_forge.php | 2 +- system/database/drivers/mysqli/mysqli_result.php | 2 +- system/database/drivers/mysqli/mysqli_utility.php | 2 +- system/database/drivers/oci8/oci8_driver.php | 2 +- system/database/drivers/oci8/oci8_forge.php | 2 +- system/database/drivers/oci8/oci8_result.php | 2 +- system/database/drivers/oci8/oci8_utility.php | 2 +- system/database/drivers/odbc/odbc_driver.php | 2 +- system/database/drivers/odbc/odbc_forge.php | 2 +- system/database/drivers/odbc/odbc_result.php | 2 +- system/database/drivers/odbc/odbc_utility.php | 2 +- system/database/drivers/pdo/pdo_driver.php | 2 +- system/database/drivers/pdo/pdo_forge.php | 2 +- system/database/drivers/pdo/pdo_result.php | 2 +- system/database/drivers/pdo/pdo_utility.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_4d_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_4d_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_informix_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_informix_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_oci_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_oci_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php | 2 +- system/database/drivers/postgre/postgre_driver.php | 2 +- system/database/drivers/postgre/postgre_forge.php | 2 +- system/database/drivers/postgre/postgre_result.php | 2 +- system/database/drivers/postgre/postgre_utility.php | 2 +- system/database/drivers/sqlite/sqlite_driver.php | 2 +- system/database/drivers/sqlite/sqlite_forge.php | 2 +- system/database/drivers/sqlite/sqlite_result.php | 2 +- system/database/drivers/sqlite/sqlite_utility.php | 2 +- system/database/drivers/sqlite3/sqlite3_driver.php | 2 +- system/database/drivers/sqlite3/sqlite3_forge.php | 2 +- system/database/drivers/sqlite3/sqlite3_result.php | 2 +- system/database/drivers/sqlite3/sqlite3_utility.php | 2 +- system/database/drivers/sqlsrv/sqlsrv_driver.php | 2 +- system/database/drivers/sqlsrv/sqlsrv_forge.php | 2 +- system/database/drivers/sqlsrv/sqlsrv_result.php | 2 +- system/database/drivers/sqlsrv/sqlsrv_utility.php | 2 +- system/helpers/array_helper.php | 2 +- system/helpers/captcha_helper.php | 2 +- system/helpers/cookie_helper.php | 2 +- system/helpers/date_helper.php | 2 +- system/helpers/directory_helper.php | 2 +- system/helpers/download_helper.php | 2 +- system/helpers/email_helper.php | 2 +- system/helpers/file_helper.php | 2 +- system/helpers/form_helper.php | 2 +- system/helpers/html_helper.php | 2 +- system/helpers/inflector_helper.php | 2 +- system/helpers/language_helper.php | 2 +- system/helpers/number_helper.php | 2 +- system/helpers/path_helper.php | 2 +- system/helpers/security_helper.php | 2 +- system/helpers/smiley_helper.php | 2 +- system/helpers/string_helper.php | 2 +- system/helpers/text_helper.php | 2 +- system/helpers/typography_helper.php | 2 +- system/helpers/url_helper.php | 2 +- system/helpers/xml_helper.php | 2 +- system/language/english/calendar_lang.php | 2 +- system/language/english/date_lang.php | 2 +- system/language/english/db_lang.php | 2 +- system/language/english/email_lang.php | 2 +- system/language/english/form_validation_lang.php | 2 +- system/language/english/ftp_lang.php | 2 +- system/language/english/imglib_lang.php | 2 +- system/language/english/migration_lang.php | 2 +- system/language/english/number_lang.php | 2 +- system/language/english/pagination_lang.php | 2 +- system/language/english/profiler_lang.php | 2 +- system/language/english/unit_test_lang.php | 2 +- system/language/english/upload_lang.php | 2 +- system/libraries/Cache/Cache.php | 2 +- system/libraries/Cache/drivers/Cache_apc.php | 2 +- system/libraries/Cache/drivers/Cache_dummy.php | 2 +- system/libraries/Cache/drivers/Cache_file.php | 2 +- system/libraries/Cache/drivers/Cache_memcached.php | 2 +- system/libraries/Cache/drivers/Cache_redis.php | 2 +- system/libraries/Cache/drivers/Cache_wincache.php | 2 +- system/libraries/Calendar.php | 2 +- system/libraries/Cart.php | 2 +- system/libraries/Driver.php | 2 +- system/libraries/Email.php | 2 +- system/libraries/Encrypt.php | 2 +- system/libraries/Encryption.php | 2 +- system/libraries/Form_validation.php | 2 +- system/libraries/Ftp.php | 2 +- system/libraries/Image_lib.php | 2 +- system/libraries/Javascript.php | 2 +- system/libraries/Javascript/Jquery.php | 2 +- system/libraries/Migration.php | 2 +- system/libraries/Pagination.php | 2 +- system/libraries/Parser.php | 2 +- system/libraries/Profiler.php | 2 +- system/libraries/Session/Session.php | 2 +- system/libraries/Session/SessionHandlerInterface.php | 2 +- system/libraries/Session/Session_driver.php | 2 +- system/libraries/Session/drivers/Session_database_driver.php | 2 +- system/libraries/Session/drivers/Session_files_driver.php | 2 +- system/libraries/Session/drivers/Session_memcached_driver.php | 2 +- system/libraries/Session/drivers/Session_redis_driver.php | 2 +- system/libraries/Table.php | 2 +- system/libraries/Trackback.php | 2 +- system/libraries/Typography.php | 2 +- system/libraries/Unit_test.php | 2 +- system/libraries/Upload.php | 2 +- system/libraries/User_agent.php | 2 +- system/libraries/Xmlrpc.php | 2 +- system/libraries/Xmlrpcs.php | 2 +- system/libraries/Zip.php | 2 +- user_guide_src/cilexer/cilexer/cilexer.py | 2 +- 174 files changed, 174 insertions(+), 174 deletions(-) diff --git a/index.php b/index.php index a5f5df81924..13fcd599688 100755 --- a/index.php +++ b/index.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php index fc3b6aafb21..b1d74f78f94 100644 --- a/system/core/Benchmark.php +++ b/system/core/Benchmark.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 3b728ddae95..727f370297a 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Common.php b/system/core/Common.php index 02421b1b1b5..b87ce4d626f 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Config.php b/system/core/Config.php index 587877da641..ca6fb379371 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Controller.php b/system/core/Controller.php index c5c6ee0f4ef..83b3df26c88 100644 --- a/system/core/Controller.php +++ b/system/core/Controller.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php index e3270d60984..a1c6a19709e 100644 --- a/system/core/Exceptions.php +++ b/system/core/Exceptions.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Hooks.php b/system/core/Hooks.php index af71dba8372..856795cbad4 100644 --- a/system/core/Hooks.php +++ b/system/core/Hooks.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Input.php b/system/core/Input.php index bb7ad23ba00..a7c9ecd0d74 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Lang.php b/system/core/Lang.php index 20855f975b2..1fcff078a61 100644 --- a/system/core/Lang.php +++ b/system/core/Lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Loader.php b/system/core/Loader.php index 4d093d1397c..37d1ecaf946 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Log.php b/system/core/Log.php index a5f64f29d40..72d3cfbae86 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Model.php b/system/core/Model.php index 058387255a6..941881a9f30 100644 --- a/system/core/Model.php +++ b/system/core/Model.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Output.php b/system/core/Output.php index faeb0ea97eb..ad87f854529 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Router.php b/system/core/Router.php index e46ddb4a980..045d3668754 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Security.php b/system/core/Security.php index f697dd9c2e1..bad511dd3a7 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/URI.php b/system/core/URI.php index 22e454339aa..544f6c85f0d 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/Utf8.php b/system/core/Utf8.php index 523f5f248f4..f2f42e6ca6c 100644 --- a/system/core/Utf8.php +++ b/system/core/Utf8.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/compat/hash.php b/system/core/compat/hash.php index 405c014ab77..6854e4c2689 100644 --- a/system/core/compat/hash.php +++ b/system/core/compat/hash.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/compat/mbstring.php b/system/core/compat/mbstring.php index 0c64ed34681..554d10040a9 100644 --- a/system/core/compat/mbstring.php +++ b/system/core/compat/mbstring.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/compat/password.php b/system/core/compat/password.php index 6b6a0fc6047..f0c22c780cc 100644 --- a/system/core/compat/password.php +++ b/system/core/compat/password.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php index 3d439e4698a..47d47aeff88 100644 --- a/system/core/compat/standard.php +++ b/system/core/compat/standard.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/DB.php b/system/database/DB.php index db777da1b29..b4b7767e8a7 100644 --- a/system/database/DB.php +++ b/system/database/DB.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/DB_cache.php b/system/database/DB_cache.php index f31a8e2fb58..8855cc1b196 100644 --- a/system/database/DB_cache.php +++ b/system/database/DB_cache.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 02f0cca724d..df0ce6a9bb3 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index 4392eb25f1e..826aa1ebfe4 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 637397fdcbe..e92c570919a 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/DB_result.php b/system/database/DB_result.php index 745c92ca7f7..d9d1fccc7b6 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index 61900437668..70528286c9d 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index 08ad3dcd41e..77f591ced31 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php index 7091559cdb1..8262beb6b41 100644 --- a/system/database/drivers/cubrid/cubrid_forge.php +++ b/system/database/drivers/cubrid/cubrid_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/cubrid/cubrid_result.php b/system/database/drivers/cubrid/cubrid_result.php index 1ac2f899ed7..9cccb257067 100644 --- a/system/database/drivers/cubrid/cubrid_result.php +++ b/system/database/drivers/cubrid/cubrid_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/cubrid/cubrid_utility.php b/system/database/drivers/cubrid/cubrid_utility.php index f853a92757a..942fa3b4e41 100644 --- a/system/database/drivers/cubrid/cubrid_utility.php +++ b/system/database/drivers/cubrid/cubrid_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php index f1b89b74851..cbc1022ff88 100644 --- a/system/database/drivers/ibase/ibase_driver.php +++ b/system/database/drivers/ibase/ibase_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/ibase/ibase_forge.php b/system/database/drivers/ibase/ibase_forge.php index 44be2ed00ec..9c358c36537 100644 --- a/system/database/drivers/ibase/ibase_forge.php +++ b/system/database/drivers/ibase/ibase_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/ibase/ibase_result.php b/system/database/drivers/ibase/ibase_result.php index a2c0d1d800c..f3c21fcec24 100644 --- a/system/database/drivers/ibase/ibase_result.php +++ b/system/database/drivers/ibase/ibase_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/ibase/ibase_utility.php b/system/database/drivers/ibase/ibase_utility.php index 4b8790eee41..619ebad0161 100644 --- a/system/database/drivers/ibase/ibase_utility.php +++ b/system/database/drivers/ibase/ibase_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 2a954a2758c..d40d67a0b34 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php index 9d0af0ce2c3..24d1fc204b0 100644 --- a/system/database/drivers/mssql/mssql_forge.php +++ b/system/database/drivers/mssql/mssql_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/mssql/mssql_result.php b/system/database/drivers/mssql/mssql_result.php index bd747c77b4b..b62bf75cbb6 100644 --- a/system/database/drivers/mssql/mssql_result.php +++ b/system/database/drivers/mssql/mssql_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/mssql/mssql_utility.php b/system/database/drivers/mssql/mssql_utility.php index d236c2045c5..cd23be828eb 100644 --- a/system/database/drivers/mssql/mssql_utility.php +++ b/system/database/drivers/mssql/mssql_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 7628ebd5529..78b1d703a18 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php index 09560bd6cf4..fa84be37105 100644 --- a/system/database/drivers/mysql/mysql_forge.php +++ b/system/database/drivers/mysql/mysql_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php index 286dcdf86fb..20cade2e1fc 100644 --- a/system/database/drivers/mysql/mysql_result.php +++ b/system/database/drivers/mysql/mysql_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/mysql/mysql_utility.php b/system/database/drivers/mysql/mysql_utility.php index 1b0abf4eee4..4c1f2391b5d 100644 --- a/system/database/drivers/mysql/mysql_utility.php +++ b/system/database/drivers/mysql/mysql_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 62f143f3020..06c34187f4a 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php index 42b69b55aff..c17f729c0fa 100644 --- a/system/database/drivers/mysqli/mysqli_forge.php +++ b/system/database/drivers/mysqli/mysqli_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php index 3ecb46c1150..0ce07414fec 100644 --- a/system/database/drivers/mysqli/mysqli_result.php +++ b/system/database/drivers/mysqli/mysqli_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/mysqli/mysqli_utility.php b/system/database/drivers/mysqli/mysqli_utility.php index 7192c55ddf1..79d9f3670f7 100644 --- a/system/database/drivers/mysqli/mysqli_utility.php +++ b/system/database/drivers/mysqli/mysqli_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 8bf432013ed..59f0e8456c1 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index 97afcde89c5..1ca559a32b7 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index a70779cdf1c..fc860ea1225 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/oci8/oci8_utility.php b/system/database/drivers/oci8/oci8_utility.php index cde4a5f0306..ebe49c46357 100644 --- a/system/database/drivers/oci8/oci8_utility.php +++ b/system/database/drivers/oci8/oci8_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 370cdaa973a..19b7b744bf9 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php index 0a482731be7..bac30bedc16 100644 --- a/system/database/drivers/odbc/odbc_forge.php +++ b/system/database/drivers/odbc/odbc_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/odbc/odbc_result.php b/system/database/drivers/odbc/odbc_result.php index d5aec527718..110d6ab0f1e 100644 --- a/system/database/drivers/odbc/odbc_result.php +++ b/system/database/drivers/odbc/odbc_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/odbc/odbc_utility.php b/system/database/drivers/odbc/odbc_utility.php index 61d1d21fc60..2e344963d1d 100644 --- a/system/database/drivers/odbc/odbc_utility.php +++ b/system/database/drivers/odbc/odbc_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 612ec32be25..c6f84e0f937 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/pdo_forge.php b/system/database/drivers/pdo/pdo_forge.php index 97bd4df82b0..2595f7b6e84 100644 --- a/system/database/drivers/pdo/pdo_forge.php +++ b/system/database/drivers/pdo/pdo_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/pdo_result.php b/system/database/drivers/pdo/pdo_result.php index 6dcebda3cc1..d1809bef255 100644 --- a/system/database/drivers/pdo/pdo_result.php +++ b/system/database/drivers/pdo/pdo_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/pdo_utility.php b/system/database/drivers/pdo/pdo_utility.php index dd5e3c4a2c3..384661bf02a 100644 --- a/system/database/drivers/pdo/pdo_utility.php +++ b/system/database/drivers/pdo/pdo_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php index d9314287614..3dedfd9b37d 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php index f6c3f362108..41994f9dbfe 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php index 3e52cd753ee..8377798045a 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php index 9f542c6d673..5f854061d0e 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php index ee2465933c4..84695ee9b40 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php index 42cdd188e97..d5dd9aad13f 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php index 237029d2171..96dcc5ec172 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php index 34d5f775016..256fa1413c6 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php index ecc822187fe..2366c40362b 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php index 6698d5dd32c..a2dbfc25ac2 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php index f9476ecd401..d40d17a8804 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php index ee79e9950d6..5af39b18182 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php index d6c9ce5556b..70f2bfd4ed7 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php index dc4426598a8..9d04a8a9a84 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php index 7c79c053117..dd1d31c260c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php index 2f7bb6c7809..d0b7be8f257 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php index 622b0d41cb3..333448838e7 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php index 3724c63d516..7c65daa8450 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php index bd09a6756ec..ee8f76348cb 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php index 71ac3acb5d3..214b6f5282c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php index 5f85ecacfa8..62690139c5c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php index afe9e782504..f6f9bb4813e 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php index 23422431ec5..dfccb7d696f 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php index 9091fc1d64b..602f895f188 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 1ef530afbee..58d4451874e 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php index 8adff543d7d..8d985ba7d85 100644 --- a/system/database/drivers/postgre/postgre_forge.php +++ b/system/database/drivers/postgre/postgre_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/postgre/postgre_result.php b/system/database/drivers/postgre/postgre_result.php index 6c46b0faf55..354bb08d5bc 100644 --- a/system/database/drivers/postgre/postgre_result.php +++ b/system/database/drivers/postgre/postgre_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php index abbe6f695b0..bb5e6e04b75 100644 --- a/system/database/drivers/postgre/postgre_utility.php +++ b/system/database/drivers/postgre/postgre_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index 9adae082937..16b8c29c369 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php index d6271bf90b3..8a16594300f 100644 --- a/system/database/drivers/sqlite/sqlite_forge.php +++ b/system/database/drivers/sqlite/sqlite_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/sqlite/sqlite_result.php b/system/database/drivers/sqlite/sqlite_result.php index 9e53e14c7d6..d40b98aab94 100644 --- a/system/database/drivers/sqlite/sqlite_result.php +++ b/system/database/drivers/sqlite/sqlite_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/sqlite/sqlite_utility.php b/system/database/drivers/sqlite/sqlite_utility.php index ed08929f1ac..59c46f9ef1c 100644 --- a/system/database/drivers/sqlite/sqlite_utility.php +++ b/system/database/drivers/sqlite/sqlite_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index bf2be00d3d1..9743499bdce 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php index 854a734aae8..43cbe33e5d9 100644 --- a/system/database/drivers/sqlite3/sqlite3_forge.php +++ b/system/database/drivers/sqlite3/sqlite3_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php index b77c6ebc648..aa559eef685 100644 --- a/system/database/drivers/sqlite3/sqlite3_result.php +++ b/system/database/drivers/sqlite3/sqlite3_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/sqlite3/sqlite3_utility.php b/system/database/drivers/sqlite3/sqlite3_utility.php index c9f772ddee7..b47c086f60d 100644 --- a/system/database/drivers/sqlite3/sqlite3_utility.php +++ b/system/database/drivers/sqlite3/sqlite3_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index f3732544ae6..0cd9ce16df5 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php index 4f1e76c1347..f915dad3eed 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/sqlsrv/sqlsrv_result.php b/system/database/drivers/sqlsrv/sqlsrv_result.php index b7e554858cd..fde7264b98a 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_result.php +++ b/system/database/drivers/sqlsrv/sqlsrv_result.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/database/drivers/sqlsrv/sqlsrv_utility.php b/system/database/drivers/sqlsrv/sqlsrv_utility.php index bdc8c170081..726fe3ea6cb 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_utility.php +++ b/system/database/drivers/sqlsrv/sqlsrv_utility.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/array_helper.php b/system/helpers/array_helper.php index 151324cf994..3fdccf90991 100644 --- a/system/helpers/array_helper.php +++ b/system/helpers/array_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index db708e894ad..fd1b8f1edb6 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php index 9c12005a6c3..ca432449571 100644 --- a/system/helpers/cookie_helper.php +++ b/system/helpers/cookie_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 8cc01f6e05d..c43209f0570 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/directory_helper.php b/system/helpers/directory_helper.php index d37db44ac42..cdc4c16bcce 100644 --- a/system/helpers/directory_helper.php +++ b/system/helpers/directory_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index c2362540edc..a6463dfd754 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/email_helper.php b/system/helpers/email_helper.php index 65e79c8c5f8..35944fc7b56 100644 --- a/system/helpers/email_helper.php +++ b/system/helpers/email_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php index 62af7e1f316..0d8d1d0d94f 100644 --- a/system/helpers/file_helper.php +++ b/system/helpers/file_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 1624bded018..04778b08487 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index 2c7595c4fcf..fdc463fcae1 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index f02afcf234a..96b723c8d16 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/language_helper.php b/system/helpers/language_helper.php index 2de694c2af5..3721164b775 100644 --- a/system/helpers/language_helper.php +++ b/system/helpers/language_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index b5edfde9c19..e7810c70672 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/path_helper.php b/system/helpers/path_helper.php index 7135b5d601c..838ece9e975 100644 --- a/system/helpers/path_helper.php +++ b/system/helpers/path_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/security_helper.php b/system/helpers/security_helper.php index 80a0bf52e6b..4eb63883daa 100644 --- a/system/helpers/security_helper.php +++ b/system/helpers/security_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php index f437f03892f..688ca24c21b 100644 --- a/system/helpers/smiley_helper.php +++ b/system/helpers/smiley_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php index 70172270ebc..db531fa9aab 100644 --- a/system/helpers/string_helper.php +++ b/system/helpers/string_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index 1100e670d01..1fdbedda5d7 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/typography_helper.php b/system/helpers/typography_helper.php index 139dd8c5e68..928cb6d043d 100644 --- a/system/helpers/typography_helper.php +++ b/system/helpers/typography_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index 2c66729228a..fd7b5e116f3 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/helpers/xml_helper.php b/system/helpers/xml_helper.php index dae094cf20d..3489da91c9f 100644 --- a/system/helpers/xml_helper.php +++ b/system/helpers/xml_helper.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/calendar_lang.php b/system/language/english/calendar_lang.php index c9603b58098..8af5e80561b 100644 --- a/system/language/english/calendar_lang.php +++ b/system/language/english/calendar_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/date_lang.php b/system/language/english/date_lang.php index bb341c89e30..39af5a23966 100644 --- a/system/language/english/date_lang.php +++ b/system/language/english/date_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/db_lang.php b/system/language/english/db_lang.php index c28bdab3bc5..ed93452b493 100644 --- a/system/language/english/db_lang.php +++ b/system/language/english/db_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/email_lang.php b/system/language/english/email_lang.php index 18320269ab7..84fb0910949 100644 --- a/system/language/english/email_lang.php +++ b/system/language/english/email_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/form_validation_lang.php b/system/language/english/form_validation_lang.php index 23391e41149..92d6d5ebbc0 100644 --- a/system/language/english/form_validation_lang.php +++ b/system/language/english/form_validation_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/ftp_lang.php b/system/language/english/ftp_lang.php index d649e4d2883..9e72bce4210 100644 --- a/system/language/english/ftp_lang.php +++ b/system/language/english/ftp_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/imglib_lang.php b/system/language/english/imglib_lang.php index fe06d449baf..7f23233b4f7 100644 --- a/system/language/english/imglib_lang.php +++ b/system/language/english/imglib_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/migration_lang.php b/system/language/english/migration_lang.php index de81f6d6369..bce9210d3bc 100644 --- a/system/language/english/migration_lang.php +++ b/system/language/english/migration_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/number_lang.php b/system/language/english/number_lang.php index 010e83e0571..0aaf51e72e6 100644 --- a/system/language/english/number_lang.php +++ b/system/language/english/number_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/pagination_lang.php b/system/language/english/pagination_lang.php index a2874feffa5..4d36bdee862 100644 --- a/system/language/english/pagination_lang.php +++ b/system/language/english/pagination_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/profiler_lang.php b/system/language/english/profiler_lang.php index b66f4e5e5ac..2d8fa51f461 100644 --- a/system/language/english/profiler_lang.php +++ b/system/language/english/profiler_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/unit_test_lang.php b/system/language/english/unit_test_lang.php index d9c09f9b0e4..29a4137a537 100644 --- a/system/language/english/unit_test_lang.php +++ b/system/language/english/unit_test_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/language/english/upload_lang.php b/system/language/english/upload_lang.php index a054031bdac..058dca9939f 100644 --- a/system/language/english/upload_lang.php +++ b/system/language/english/upload_lang.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php index 64377de50c9..349af15794e 100644 --- a/system/libraries/Cache/Cache.php +++ b/system/libraries/Cache/Cache.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php index 5f373ba17f6..dd18e7bc84e 100644 --- a/system/libraries/Cache/drivers/Cache_apc.php +++ b/system/libraries/Cache/drivers/Cache_apc.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Cache/drivers/Cache_dummy.php b/system/libraries/Cache/drivers/Cache_dummy.php index d8c4b0b2b58..4323a68af24 100644 --- a/system/libraries/Cache/drivers/Cache_dummy.php +++ b/system/libraries/Cache/drivers/Cache_dummy.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index a52b054977f..e1ce16a5a4e 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 67f9e4f4584..c44958b9765 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 59f14d16be9..81b49e2fcb7 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Cache/drivers/Cache_wincache.php b/system/libraries/Cache/drivers/Cache_wincache.php index 9b5029d8cf1..f66080514c0 100644 --- a/system/libraries/Cache/drivers/Cache_wincache.php +++ b/system/libraries/Cache/drivers/Cache_wincache.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php index 2a42b58449c..1f8ef814f7c 100644 --- a/system/libraries/Calendar.php +++ b/system/libraries/Calendar.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index af527da9ea5..44d87e0bf66 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index b8f740d6a5f..38c6aefe696 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Email.php b/system/libraries/Email.php index ad4c02ff881..007f9b4317c 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php index 608f7da28a9..1372a311fe2 100644 --- a/system/libraries/Encrypt.php +++ b/system/libraries/Encrypt.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Encryption.php b/system/libraries/Encryption.php index 5e04fc1add2..92c38a0ed24 100644 --- a/system/libraries/Encryption.php +++ b/system/libraries/Encryption.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 194a9292ee8..31632762d45 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Ftp.php b/system/libraries/Ftp.php index 53ff979e5ed..88f2658087b 100644 --- a/system/libraries/Ftp.php +++ b/system/libraries/Ftp.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index d3a832415a9..f594b712580 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php index ba8aedb60a0..dcf9337794d 100644 --- a/system/libraries/Javascript.php +++ b/system/libraries/Javascript.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Javascript/Jquery.php b/system/libraries/Javascript/Jquery.php index 1039a4aa80d..9df1be1c1f1 100644 --- a/system/libraries/Javascript/Jquery.php +++ b/system/libraries/Javascript/Jquery.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index 259c83c547d..7aefb6c23cd 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index 9831730e4c0..cef98ebf483 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Parser.php b/system/libraries/Parser.php index 7f3be467212..22cffb2c48a 100644 --- a/system/libraries/Parser.php +++ b/system/libraries/Parser.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index 4ad33bbac67..cc76414362f 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index 1e81ec53f59..b93c00c156b 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Session/SessionHandlerInterface.php b/system/libraries/Session/SessionHandlerInterface.php index ea825a066eb..b3533dd1eae 100644 --- a/system/libraries/Session/SessionHandlerInterface.php +++ b/system/libraries/Session/SessionHandlerInterface.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Session/Session_driver.php b/system/libraries/Session/Session_driver.php index 02d984cdf5e..98fc897e3b2 100644 --- a/system/libraries/Session/Session_driver.php +++ b/system/libraries/Session/Session_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index b3191e060ec..3ba9d3d366b 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index 5ac1dcd36f2..119bf65729e 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index b2feb56f142..d017dfb2f3e 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index 04776055498..46b8fa1c244 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Table.php b/system/libraries/Table.php index e261d3e0141..3bce294d8c4 100644 --- a/system/libraries/Table.php +++ b/system/libraries/Table.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index 7488a809bc0..a9b256464b2 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Typography.php b/system/libraries/Typography.php index 71a6d0809b9..c45398bdca4 100644 --- a/system/libraries/Typography.php +++ b/system/libraries/Typography.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php index 6db39212bf8..3ac6af78ed9 100644 --- a/system/libraries/Unit_test.php +++ b/system/libraries/Unit_test.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 5cb25eeec9b..15caebebe5b 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/User_agent.php b/system/libraries/User_agent.php index 150643a4dc4..c4e11592d98 100644 --- a/system/libraries/User_agent.php +++ b/system/libraries/User_agent.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index d4bcbd0195c..f965858e2e7 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php index b75fa288ef3..afcdbe68c35 100644 --- a/system/libraries/Xmlrpcs.php +++ b/system/libraries/Xmlrpcs.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index d412ebf34c4..140ad72123c 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -28,7 +28,7 @@ * * @package CodeIgniter * @author EllisLab Dev Team - * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com diff --git a/user_guide_src/cilexer/cilexer/cilexer.py b/user_guide_src/cilexer/cilexer/cilexer.py index d6bebe28d61..40582f88aae 100644 --- a/user_guide_src/cilexer/cilexer/cilexer.py +++ b/user_guide_src/cilexer/cilexer/cilexer.py @@ -25,7 +25,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # -# Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/) +# Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) # Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) # # http://opensource.org/licenses/MIT MIT License From 8f1047ff6bc961159a7103e7be02e6cc459d925e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jan 2016 13:20:12 +0200 Subject: [PATCH 4129/5397] Polish changes from PR #4269 --- system/helpers/html_helper.php | 28 ++++++++++++---- .../codeigniter/helpers/html_helper_test.php | 32 ++++++++++++------- user_guide_src/source/helpers/html_helper.rst | 12 +++++-- 3 files changed, 50 insertions(+), 22 deletions(-) diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index 5cc994ff146..becd9a00c81 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -359,17 +359,31 @@ function meta($name = '', $content = '', $type = 'name', $newline = "\n") // Turn single array into multidimensional $name = array($name); } - $allowed_type = array('charset', 'http-equiv', 'name', 'property'); + + $allowed_types = array('charset', 'http-equiv', 'name', 'property'); $str = ''; foreach ($name as $meta) { - $meta['type'] = isset($meta['type']) ? (($meta['type'] === 'equiv') ? 'http-equiv' : $meta['type']) : ''; // backward compatibility - $type = in_array($meta['type'], $allowed_type) ? $meta['type'] : 'name'; - $name = isset($meta['name']) ? $meta['name'] : ''; - $content = isset($meta['content']) ? $meta['content'] : ''; - $newline = isset($meta['newline']) ? $meta['newline'] : "\n"; + // This is to preserve BC with pre-3.1 versions where only + // 'http-equiv' (default) and 'name' were supported. + if (isset($meta['type'])) + { + if ($meta['type'] === 'equiv') + { + $meta['type'] === 'http-equiv'; + } + elseif ( ! in_array($meta['type'], $allowed_types, TRUE)) + { + $meta['type'] = 'name'; + } + } + + $type = isset($meta['type']) ? $meta['type'] : 'name'; + $name = isset($meta['name']) ? $meta['name'] : ''; + $content = isset($meta['content']) ? $meta['content'] : ''; + $newline = isset($meta['newline']) ? $meta['newline'] : "\n"; - $str .= ''.$newline; + $str .= ''.$newline; } return $str; diff --git a/tests/codeigniter/helpers/html_helper_test.php b/tests/codeigniter/helpers/html_helper_test.php index 0b9655bf57b..029f3f4cd8a 100644 --- a/tests/codeigniter/helpers/html_helper_test.php +++ b/tests/codeigniter/helpers/html_helper_test.php @@ -81,16 +81,24 @@ public function test_NBS() public function test_meta() { - $this->assertEquals("\n", meta('test', 'foo')); - - $expect = "\n"; - - $this->assertEquals($expect, meta(array('name' => 'foo'))); - - $expect = "\n"; - - $this->assertEquals($expect, meta(array('name' => 'foo', 'type' => 'charset'))); - + $this->assertEquals( + "\n", + meta('test', 'foo') + ); + + $this->assertEquals( + "\n", + meta(array('name' => 'foo')) + ); + + $this->assertEquals( + "\n", + meta(array('name' => 'foo', 'type' => 'charset')) + ); + + $this->assertEquals( + "\n", + meta(array('name' => 'foo', 'type' => 'charset')) + ); } - -} +} \ No newline at end of file diff --git a/user_guide_src/source/helpers/html_helper.rst b/user_guide_src/source/helpers/html_helper.rst index fffb2cab49a..a19924dde46 100644 --- a/user_guide_src/source/helpers/html_helper.rst +++ b/user_guide_src/source/helpers/html_helper.rst @@ -309,6 +309,11 @@ The following functions are available: 'name' => 'robots', 'content' => 'no-cache' ), + array( + 'name' => 'Content-Type', + 'type' => 'http-equiv', + 'content' => 'text/html; charset=utf-8' + ), array( 'name' => 'UTF-8', 'type' => 'charset' @@ -321,21 +326,22 @@ The following functions are available: // // // + // // -.. php:function:: doctype([$type = 'html5']) +.. php:function:: doctype([$type = 'xhtml1-strict']) :param string $type: Doctype name :returns: HTML DocType tag :rtype: string - Helps you generate document type declarations, or DTD's. HTML 5 + Helps you generate document type declarations, or DTD's. XHTML 1.0 is used by default, but many doctypes are available. Example:: - echo doctype(); // + echo doctype(); // echo doctype('html4-trans'); // From c5cbe8cafc55dae693b8fa973d8f219272d463bd Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 11 Jan 2016 13:22:42 +0200 Subject: [PATCH 4130/5397] [ci skip] Add changelog entry for PR #4269 --- user_guide_src/source/changelog.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 7a0d0f9fa3a..bf5427ef4ce 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -17,6 +17,10 @@ Release Date: Not Released - Changed method ``db_connect()`` to always set the connection character set (if supported by the driver) and to fail if it can't. - Removed method ``db_set_charset()`` and the ability to change a connection character set at runtime. +- Helpers + + - Updated :doc:`HTML Helper ` function :php:func:`meta()` with support for "charset" and "property" properties. + Version 3.0.4 ============= From 363d56a6fafb1ff7c8dd8ac8d88abe854df26868 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jan 2016 16:15:50 +0200 Subject: [PATCH 4131/5397] [ci skip] 2016 in index.php --- index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.php b/index.php index 13fcd599688..5cc37108a8d 100755 --- a/index.php +++ b/index.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 From 4e44a4d9fcf6590fddbba93545b8bde893910c22 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Jan 2016 16:15:50 +0200 Subject: [PATCH 4132/5397] [ci skip] 2016 in index.php --- index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.php b/index.php index 13fcd599688..5cc37108a8d 100755 --- a/index.php +++ b/index.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2015, British Columbia Institute of Technology + * Copyright (c) 2014 - 2016, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 From 1f91ac640ada20850fa651d249beea548a63d978 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 13 Jan 2016 02:05:39 +0200 Subject: [PATCH 4133/5397] [ci skip] Fix a changelog line --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8b0fb677a6b..3826fc66da0 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -53,7 +53,7 @@ Release Date: October 31, 2015 - Changed :doc:`Config Library ` method ``base_url()`` to fallback to ``$_SERVER['SERVER_ADDR']`` when ``$config['base_url']`` is empty in order to avoid *Host* header injections. - Changed :doc:`CAPTCHA Helper ` to use the operating system's PRNG when possible. -- :doc:`Database` +- :doc:`Database ` - Optimized :doc:`Database Utility ` method ``csv_from_result()`` for speed with larger result sets. - Added proper return values to :doc:`Database Transactions ` method ``trans_start()``. From 4307bff0a4ae884d57cc0c0fa8f54de6c05000e7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 13 Jan 2016 02:13:10 +0200 Subject: [PATCH 4134/5397] [ci skip] Mark the start of 3.0.5 development --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/changelog.rst | 8 +++++++- user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/installation/downloads.rst | 3 ++- user_guide_src/source/installation/upgrade_305.rst | 14 ++++++++++++++ user_guide_src/source/installation/upgrading.rst | 1 + 6 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 user_guide_src/source/installation/upgrade_305.rst diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 727f370297a..52b542654a9 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - define('CI_VERSION', '3.0.4-dev'); + define('CI_VERSION', '3.0.5-dev'); /* * ------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 3826fc66da0..1ba85fa3544 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -2,11 +2,17 @@ Change Log ########## -Version 3.0.4 +Version 3.0.5 ============= Release Date: Not Released + +Version 3.0.4 +============= + +Release Date: January 13, 2016 + - General Changes - Updated :doc:`Security Library ` method ``get_random_bytes()`` to use PHP 7's ``random_bytes()`` function when possible. diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 8a4c9db595d..12339eb9194 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.0.4-dev' +version = '3.0.5-dev' # The full version, including alpha/beta/rc tags. -release = '3.0.4-dev' +release = '3.0.5-dev' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 00c98ab23ce..c7db54cd80f 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,8 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.0.4-dev (Current version) `_ +- `CodeIgniter v3.0.5-dev (Current version) `_ +- `CodeIgniter v3.0.4 `_ - `CodeIgniter v3.0.3 `_ - `CodeIgniter v3.0.2 `_ - `CodeIgniter v3.0.1 `_ diff --git a/user_guide_src/source/installation/upgrade_305.rst b/user_guide_src/source/installation/upgrade_305.rst new file mode 100644 index 00000000000..a4798248157 --- /dev/null +++ b/user_guide_src/source/installation/upgrade_305.rst @@ -0,0 +1,14 @@ +############################# +Upgrading from 3.0.4 to 3.0.5 +############################# + +Before performing an update you should take your site offline by +replacing the index.php file with a static one. + +Step 1: Update your CodeIgniter files +===================================== + +Replace all files and directories in your *system/* directory. + +.. note:: If you have any custom developed files in these directories, + please make copies of them first. diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index dd777346d76..102f20abf39 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -8,6 +8,7 @@ upgrading from. .. toctree:: :titlesonly: + Upgrading from 3.0.4 to 3.0.5 Upgrading from 3.0.3 to 3.0.4 Upgrading from 3.0.2 to 3.0.3 Upgrading from 3.0.1 to 3.0.2 From d1688af15458af8684a109e5e65f41a8a02786fb Mon Sep 17 00:00:00 2001 From: Jason Neal Date: Wed, 13 Jan 2016 08:46:03 -0500 Subject: [PATCH 4135/5397] Fix type in default constants configuration The word "destructive" was misspelled in the conditional portion. --- application/config/constants.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/config/constants.php b/application/config/constants.php index e8d2c00ea03..18d3b4b76ff 100644 --- a/application/config/constants.php +++ b/application/config/constants.php @@ -42,7 +42,7 @@ defined('FOPEN_READ') OR define('FOPEN_READ', 'rb'); defined('FOPEN_READ_WRITE') OR define('FOPEN_READ_WRITE', 'r+b'); defined('FOPEN_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); // truncates existing file data, use with care -defined('FOPEN_READ_WRITE_CREATE_DESCTRUCTIVE') OR define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care +defined('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care defined('FOPEN_WRITE_CREATE') OR define('FOPEN_WRITE_CREATE', 'ab'); defined('FOPEN_READ_WRITE_CREATE') OR define('FOPEN_READ_WRITE_CREATE', 'a+b'); defined('FOPEN_WRITE_CREATE_STRICT') OR define('FOPEN_WRITE_CREATE_STRICT', 'xb'); From 05268d6d08afb3b66e7edd5877c597ef7ea2113a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 13 Jan 2016 15:59:42 +0200 Subject: [PATCH 4136/5397] Merge pull request #4378 from jtneal/patch-1 [ci skip] Fix a defined() typo in config/constants.php --- application/config/constants.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/config/constants.php b/application/config/constants.php index e8d2c00ea03..18d3b4b76ff 100644 --- a/application/config/constants.php +++ b/application/config/constants.php @@ -42,7 +42,7 @@ defined('FOPEN_READ') OR define('FOPEN_READ', 'rb'); defined('FOPEN_READ_WRITE') OR define('FOPEN_READ_WRITE', 'r+b'); defined('FOPEN_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); // truncates existing file data, use with care -defined('FOPEN_READ_WRITE_CREATE_DESCTRUCTIVE') OR define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care +defined('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care defined('FOPEN_WRITE_CREATE') OR define('FOPEN_WRITE_CREATE', 'ab'); defined('FOPEN_READ_WRITE_CREATE') OR define('FOPEN_READ_WRITE_CREATE', 'a+b'); defined('FOPEN_WRITE_CREATE_STRICT') OR define('FOPEN_WRITE_CREATE_STRICT', 'xb'); From 009ce6c4b68375f77bc8864528602824d6c603ba Mon Sep 17 00:00:00 2001 From: Sai Phaninder Reddy Jonnala Date: Fri, 15 Jan 2016 10:25:53 -0500 Subject: [PATCH 4137/5397] Code styling changes as suggested by narfbg --- system/core/Log.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/system/core/Log.php b/system/core/Log.php index 0e1f7e2acc7..f338a36ec4a 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -154,8 +154,8 @@ public function __construct() * * Generally this function will be called using the global log_message() function * - * @param string the error level: 'error', 'debug' or 'info' - * @param string the error message + * @param string $level The error level: 'error', 'debug' or 'info' + * @param string $msg The error message * @return bool */ public function write_log($level, $msg) @@ -204,7 +204,7 @@ public function write_log($level, $msg) $date = date($this->_date_fmt); } - $message .= $this->_format_log_line($level, $date, $msg); + $message .= $this->_format_line($level, $date, $msg); flock($fp, LOCK_EX); @@ -227,6 +227,8 @@ public function write_log($level, $msg) return is_int($result); } + // -------------------------------------------------------------------- + /** * Format the log line. * @@ -234,13 +236,13 @@ public function write_log($level, $msg) * If you want to change the log format, * extend the CI_Log class and override this method. * - * @param string the error level: 'error', 'debug' or 'info' - * @param string formatted date string - * @param string the log message + * @param string $level The error level + * @param string $date Formatted date string + * @param string $msg The log message * @return string formatted log line with a new line character '\n' at the end. */ - protected function _format_log_line($level, $date, $msg) + protected function _format_line($level, $date, $message) { - return $level.' - '.$date.' --> '.$msg."\n"; + return $level.' - '.$date.' --> '.$message."\n"; } } From b6774cbeb11ac7bc5bd694c1da87ed77e9d4f9fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Adam?= Date: Wed, 20 Jan 2016 09:25:22 +0100 Subject: [PATCH 4138/5397] Default doctype is now HTML 5 --- system/helpers/html_helper.php | 2 +- user_guide_src/source/helpers/html_helper.rst | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index becd9a00c81..696f0eee27e 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -229,7 +229,7 @@ function img($src = '', $index_page = FALSE, $attributes = '') * @param string type The doctype to be generated * @return string */ - function doctype($type = 'xhtml1-strict') + function doctype($type = 'html5') { static $doctypes; diff --git a/user_guide_src/source/helpers/html_helper.rst b/user_guide_src/source/helpers/html_helper.rst index a19924dde46..b4e56fdca47 100644 --- a/user_guide_src/source/helpers/html_helper.rst +++ b/user_guide_src/source/helpers/html_helper.rst @@ -330,18 +330,18 @@ The following functions are available: // -.. php:function:: doctype([$type = 'xhtml1-strict']) +.. php:function:: doctype([$type = 'html5']) :param string $type: Doctype name :returns: HTML DocType tag :rtype: string - Helps you generate document type declarations, or DTD's. XHTML 1.0 + Helps you generate document type declarations, or DTD's. HTML 5 is used by default, but many doctypes are available. Example:: - echo doctype(); // + echo doctype(); // echo doctype('html4-trans'); // From a062bdc6cf80268f89309d8be416cc3489e010c5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 20 Jan 2016 12:03:21 +0200 Subject: [PATCH 4139/5397] [ci skip] Add changelog entry and upgrade instructions following PR #4389 --- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/installation/upgrade_310.rst | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 9bbe38207ea..7c09047f0b6 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -20,6 +20,7 @@ Release Date: Not Released - Helpers - Updated :doc:`HTML Helper ` function :php:func:`meta()` with support for "charset" and "property" properties. + - Changed :doc:`HTML Helper ` function :php:func:`doctype()` default document type to HTML 5. Version 3.0.5 ============= diff --git a/user_guide_src/source/installation/upgrade_310.rst b/user_guide_src/source/installation/upgrade_310.rst index 37772cd4f1e..b86bb1da3c6 100644 --- a/user_guide_src/source/installation/upgrade_310.rst +++ b/user_guide_src/source/installation/upgrade_310.rst @@ -57,3 +57,16 @@ method would now only be to change the connection character set at runtime. That doesn't make sense and that's the reason why most database drivers don't support it at all. Thus, ``db_set_charset()`` is no longer necessary and is removed. + +Step 3: Check usage of doctype() HTML helper +============================================ + +The :doc:`HTML Helper <../helpers/html_helper>` function +:php:func:`doctype()` used to default to 'xhtml1-strict' (XHTML 1.0 Strict) +when no document type was specified. That default value is now changed to +'html5', which obviously stands for the modern HTML 5 standard. + +Nothing should be really broken by this change, but if your application +relies on the default value, you should double-check it and either +explicitly set the desired format, or adapt your front-end to use proper +HTML 5 formatting. \ No newline at end of file From 22df06b544cb74b4a71c0e1b0d9fa0bc13c95469 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 20 Jan 2016 12:10:08 +0200 Subject: [PATCH 4140/5397] [ci skip] Fix a documentation error on output cache times --- system/core/Output.php | 2 +- user_guide_src/source/libraries/output.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/system/core/Output.php b/system/core/Output.php index ad87f854529..ec9c21b9177 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -377,7 +377,7 @@ public function set_profiler_sections($sections) /** * Set Cache * - * @param int $time Cache expiration time in seconds + * @param int $time Cache expiration time in minutes * @return CI_Output */ public function cache($time) diff --git a/user_guide_src/source/libraries/output.rst b/user_guide_src/source/libraries/output.rst index 84529f76614..92060f66a8e 100644 --- a/user_guide_src/source/libraries/output.rst +++ b/user_guide_src/source/libraries/output.rst @@ -199,11 +199,11 @@ Class Reference .. php:method:: cache($time) - :param int $time: Cache expiration time in seconds + :param int $time: Cache expiration time in minutes :returns: CI_Output instance (method chaining) :rtype: CI_Output - Caches the current page for the specified amount of seconds. + Caches the current page for the specified amount of minutes. For more information, please see the :doc:`caching documentation <../general/caching>`. From c70216d560d85adf907d9941868a0d8d3df868ca Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 20 Jan 2016 17:25:13 +0200 Subject: [PATCH 4141/5397] Fix #4391 --- system/libraries/Email.php | 18 +++++++++++------- user_guide_src/source/changelog.rst | 4 ++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 007f9b4317c..ed6f737a1f9 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -574,14 +574,18 @@ public function reply_to($replyto, $name = '') $this->validate_email($this->_str_to_array($replyto)); } - if ($name === '') - { - $name = $replyto; - } - - if (strpos($name, '"') !== 0) + if ($name !== '') { - $name = '"'.$name.'"'; + // only use Q encoding if there are characters that would require it + if ( ! preg_match('/[\200-\377]/', $name)) + { + // add slashes for non-printing characters, slashes, and double quotes, and surround it in double quotes + $name = '"'.addcslashes($name, "\0..\37\177'\"\\").'"'; + } + else + { + $name = $this->_prep_q_encoding($name); + } } $this->set_header('Reply-To', $name.' <'.$replyto.'>'); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1ba85fa3544..bd3d567d95f 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,10 @@ Version 3.0.5 Release Date: Not Released +Bug fixes for 3.0.5 +------------------- + +- Fixed a bug (#4391) - :doc:`Email Library ` method ``reply_to()`` didn't apply Q-encoding. Version 3.0.4 ============= From 356ad58b61d485570d4f4ca96fefda0d3a9c5d32 Mon Sep 17 00:00:00 2001 From: jekkos Date: Mon, 18 Jan 2016 21:14:06 +0100 Subject: [PATCH 4142/5397] Respect $config['cur_page'] variable for pagination After upgrading to CI3 I noticed that developers are able to determine the current page counter for pagination based on * Explicit query string parameters * URI segment configuration In earlier versions a developer could still set the current page counter in the pagination lib directly which is useful if you want to use pagination with HTTP POST instead of GET. This could be done by passing $config['cur_page'] = '10'; to the pagination function for link generation. Currently this code has changed and will always try to check whether the uri segment is a valid number or not, even if the cur_page variable was passed in the associative array, and fallback to zero if it fails to validate that result. This can be easily resolved by checking whether the counter was already set with a valid number from the $config array before trying to resolve it from the uri segment. This fix give a developer more flexibility and stop CI from overwriting the externally set value with an incorrect one. Signed-off-by: jekkos --- system/libraries/Pagination.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index cef98ebf483..9ac9661ad80 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -497,7 +497,7 @@ public function create_links() { $this->cur_page = $this->CI->input->get($this->query_string_segment); } - else + elseif (empty($this->cur_page)) { // Default to the last segment number if one hasn't been defined. if ($this->uri_segment === 0) @@ -512,6 +512,10 @@ public function create_links() { $this->cur_page = str_replace(array($this->prefix, $this->suffix), '', $this->cur_page); } + } + else + { + $this->cur_page = (string) $this->cur_page; } // If something isn't quite right, back to the default base page. From 1e77136c47032221ae0cdb7f6b43f56792dae224 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 20 Jan 2016 19:36:39 +0200 Subject: [PATCH 4143/5397] [ci skip] Remove a trailing space from latest PR merge --- system/libraries/Pagination.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index 9ac9661ad80..44f848fe035 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -512,7 +512,7 @@ public function create_links() { $this->cur_page = str_replace(array($this->prefix, $this->suffix), '', $this->cur_page); } - } + } else { $this->cur_page = (string) $this->cur_page; From 4e87bd3622b3b9edcb90d7d4792f4374daf46446 Mon Sep 17 00:00:00 2001 From: jekkos Date: Mon, 18 Jan 2016 21:14:06 +0100 Subject: [PATCH 4144/5397] Respect $config['cur_page'] variable for pagination After upgrading to CI3 I noticed that developers are able to determine the current page counter for pagination based on * Explicit query string parameters * URI segment configuration In earlier versions a developer could still set the current page counter in the pagination lib directly which is useful if you want to use pagination with HTTP POST instead of GET. This could be done by passing $config['cur_page'] = '10'; to the pagination function for link generation. Currently this code has changed and will always try to check whether the uri segment is a valid number or not, even if the cur_page variable was passed in the associative array, and fallback to zero if it fails to validate that result. This can be easily resolved by checking whether the counter was already set with a valid number from the $config array before trying to resolve it from the uri segment. This fix give a developer more flexibility and stop CI from overwriting the externally set value with an incorrect one. Signed-off-by: jekkos --- system/libraries/Pagination.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index cef98ebf483..9ac9661ad80 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -497,7 +497,7 @@ public function create_links() { $this->cur_page = $this->CI->input->get($this->query_string_segment); } - else + elseif (empty($this->cur_page)) { // Default to the last segment number if one hasn't been defined. if ($this->uri_segment === 0) @@ -512,6 +512,10 @@ public function create_links() { $this->cur_page = str_replace(array($this->prefix, $this->suffix), '', $this->cur_page); } + } + else + { + $this->cur_page = (string) $this->cur_page; } // If something isn't quite right, back to the default base page. From ca26561a987bf0ec6e2736ea4c2eab29c663b94b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 20 Jan 2016 19:36:39 +0200 Subject: [PATCH 4145/5397] [ci skip] Remove a trailing space from latest PR merge --- system/libraries/Pagination.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index 9ac9661ad80..44f848fe035 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -512,7 +512,7 @@ public function create_links() { $this->cur_page = str_replace(array($this->prefix, $this->suffix), '', $this->cur_page); } - } + } else { $this->cur_page = (string) $this->cur_page; From b5d410530f7641ba0feb1ec0e25b4243be1fe053 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 20 Jan 2016 19:41:29 +0200 Subject: [PATCH 4146/5397] [ci skip] Add changelog entry for PR #4384 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index bd3d567d95f..d0d0a10eb78 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -11,6 +11,7 @@ Bug fixes for 3.0.5 ------------------- - Fixed a bug (#4391) - :doc:`Email Library ` method ``reply_to()`` didn't apply Q-encoding. +- Fixed a bug (#4384) - :doc:`Pagination Library ` ignored (possible) *cur_page* configuration value. Version 3.0.4 ============= From 075bdb4e90d9b567cdb4db3e46410854c0437856 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 25 Jan 2016 13:31:23 +0200 Subject: [PATCH 4147/5397] Fix #4395 --- system/database/DB_query_builder.php | 16 +++++++++++++++- user_guide_src/source/changelog.rst | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index e92c570919a..c180a17e922 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1379,7 +1379,16 @@ public function count_all_results($table = '', $reset = TRUE) $this->from($table); } - $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_orderby)) + // ORDER BY usage is often problematic here (most notably + // on Microsoft SQL Server) and ultimately unnecessary + // for selecting COUNT(*) ... + if ( ! empty($this->qb_orderby)) + { + $orderby = $this->qb_orderby; + $this->qb_orderby = NULL; + } + + $result = ($this->qb_distinct === TRUE) ? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results") : $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); @@ -1387,6 +1396,11 @@ public function count_all_results($table = '', $reset = TRUE) { $this->_reset_select(); } + // If we've previously reset the qb_orderby values, get them back + elseif ( ! isset($this->qb_orderby)) + { + $this->qb_orderby = $orderby; + } if ($result->num_rows() === 0) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d0d0a10eb78..466726a7ea4 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -12,6 +12,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4391) - :doc:`Email Library ` method ``reply_to()`` didn't apply Q-encoding. - Fixed a bug (#4384) - :doc:`Pagination Library ` ignored (possible) *cur_page* configuration value. +- Fixed a bug (#4395) - :doc:`Query Builder ` method ``count_all_results()`` still fails if an ``ORDER BY`` condition is used. Version 3.0.4 ============= From 8ec82e2885d60847331e88f22ecffa71feafcb61 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 26 Jan 2016 16:33:31 +0200 Subject: [PATCH 4148/5397] Fix #4399 --- system/database/DB_query_builder.php | 43 ++++++++++++++++++---------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index c180a17e922..be7582815dd 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1458,20 +1458,26 @@ public function get_where($table = '', $where = NULL, $limit = NULL, $offset = N * @param bool $escape Whether to escape values and identifiers * @return int Number of rows inserted or FALSE on failure */ - public function insert_batch($table = '', $set = NULL, $escape = NULL) + public function insert_batch($table, $set = NULL, $escape = NULL) { - if ($set !== NULL) + if ($set === NULL) { - $this->set_insert_batch($set, '', $escape); + if (empty($this->qb_set)) + { + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + } } - - if (count($this->qb_set) === 0) + else { - // No valid data array. Folds in cases where keys and values did not match up - return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + if (empty($set)) + { + return ($this->db_debug) ? $this->display_error('insert_batch() called with no data') : FALSE; + } + + $this->set_insert_batch($set, '', $escape); } - if ($table === '') + if (strlen($table) === 0) { if ( ! isset($this->qb_from[0])) { @@ -1859,7 +1865,7 @@ protected function _validate_update($table) * @param string the where key * @return int number of rows affected or FALSE on failure */ - public function update_batch($table = '', $set = NULL, $index = NULL) + public function update_batch($table, $set = NULL, $index = NULL) { // Combine any cached components with the current statements $this->_merge_cache(); @@ -1869,17 +1875,24 @@ public function update_batch($table = '', $set = NULL, $index = NULL) return ($this->db_debug) ? $this->display_error('db_must_use_index') : FALSE; } - if ($set !== NULL) + if ($set === NULL) { - $this->set_update_batch($set, $index); + if (empty($this->qb_set)) + { + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + } } - - if (count($this->qb_set) === 0) + else { - return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + if (empty($set)) + { + return ($this->db_debug) ? $this->display_error('update_batch() called with no data') : FALSE; + } + + $this->set_update_batch($set, $index); } - if ($table === '') + if (strlen($table) === 0) { if ( ! isset($this->qb_from[0])) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 466726a7ea4..1623341ea1a 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -13,6 +13,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4391) - :doc:`Email Library ` method ``reply_to()`` didn't apply Q-encoding. - Fixed a bug (#4384) - :doc:`Pagination Library ` ignored (possible) *cur_page* configuration value. - Fixed a bug (#4395) - :doc:`Query Builder ` method ``count_all_results()`` still fails if an ``ORDER BY`` condition is used. +- Fixed a bug (#4399) - :doc:`Query Builder ` methods ``insert_batch()``, ``update_batch()`` produced confusing error messages when called with no data and *db_debug* is enabled. Version 3.0.4 ============= From 1089a862fc8cd6fdd6bb2a5f88e1446d37912ace Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 27 Jan 2016 16:15:01 +0200 Subject: [PATCH 4149/5397] Fix #4401 --- system/database/DB_driver.php | 8 ++++---- user_guide_src/source/changelog.rst | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index df0ce6a9bb3..bad641d1772 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1566,11 +1566,11 @@ protected function _get_operator($str) '\s*>\s*', // > '\s+IS NULL', // IS NULL '\s+IS NOT NULL', // IS NOT NULL - '\s+EXISTS\s*\([^\)]+\)', // EXISTS(sql) - '\s+NOT EXISTS\s*\([^\)]+\)', // NOT EXISTS(sql) + '\s+EXISTS\s*\(.*\)', // EXISTS(sql) + '\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS(sql) '\s+BETWEEN\s+', // BETWEEN value AND value - '\s+IN\s*\([^\)]+\)', // IN(list) - '\s+NOT IN\s*\([^\)]+\)', // NOT IN (list) + '\s+IN\s*\(.*\)', // IN(list) + '\s+NOT IN\s*\(.*\)', // NOT IN (list) '\s+LIKE\s+\S.*('.$_les.')?', // LIKE 'expr'[ ESCAPE '%s'] '\s+NOT LIKE\s+\S.*('.$_les.')?' // NOT LIKE 'expr'[ ESCAPE '%s'] ); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1623341ea1a..8e76f1d01f0 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -14,6 +14,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4384) - :doc:`Pagination Library ` ignored (possible) *cur_page* configuration value. - Fixed a bug (#4395) - :doc:`Query Builder ` method ``count_all_results()`` still fails if an ``ORDER BY`` condition is used. - Fixed a bug (#4399) - :doc:`Query Builder ` methods ``insert_batch()``, ``update_batch()`` produced confusing error messages when called with no data and *db_debug* is enabled. +- Fixed a bug (#4401) - :doc:`Query Builder ` breaks ``WHERE`` and ``HAVING`` conditions that use ``IN()`` with strings containing a closing parenthesis. Version 3.0.4 ============= From 4a7d2fd8d7dfc3512f15172431c75c8b2dba281a Mon Sep 17 00:00:00 2001 From: Sherman K Date: Fri, 29 Jan 2016 02:12:04 +0800 Subject: [PATCH 4150/5397] Fixed minor typographical error Signed-off-by: Sherman K --- user_guide_src/source/contributing/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/contributing/index.rst b/user_guide_src/source/contributing/index.rst index da5bb527b68..64e9f0d92cf 100644 --- a/user_guide_src/source/contributing/index.rst +++ b/user_guide_src/source/contributing/index.rst @@ -155,5 +155,5 @@ could even alias git commit to use the -s flag so you don’t have to think abou it. By signing your work in this manner, you certify to a "Developer's Certificate -or Origin". The current version of this certificate is in the :doc:`/DCO` file +of Origin". The current version of this certificate is in the :doc:`/DCO` file in the root of this documentation. From 168c7212a2b458bf27460e790b63066d24f2296d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 29 Jan 2016 00:56:27 +0200 Subject: [PATCH 4151/5397] Merge pull request #4408 from ShrmnK/develop [ci skip] Fixed minor typographical error in DCO doc --- user_guide_src/source/contributing/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/contributing/index.rst b/user_guide_src/source/contributing/index.rst index 9551fbeb74c..739d436a0fb 100644 --- a/user_guide_src/source/contributing/index.rst +++ b/user_guide_src/source/contributing/index.rst @@ -155,5 +155,5 @@ could even alias git commit to use the -s flag so you don’t have to think abou it. By signing your work in this manner, you certify to a "Developer's Certificate -or Origin". The current version of this certificate is in the :doc:`/DCO` file +of Origin". The current version of this certificate is in the :doc:`/DCO` file in the root of this documentation. From 0b59bdd3cd647b44c83e746a5d3d3aa179325df4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 29 Jan 2016 01:18:08 +0200 Subject: [PATCH 4152/5397] Fix a regression in Form helper caused by 0139e6a4a99cbe9b0cc06f394fa12d5691193b72 --- system/helpers/form_helper.php | 4 ++-- user_guide_src/source/changelog.rst | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 04778b08487..3e103952560 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -791,7 +791,7 @@ function set_checkbox($field, $value = '', $default = FALSE) // Unchecked checkbox and radio inputs are not even submitted by browsers ... if ($CI->input->method() === 'post') { - return ($input === 'value') ? ' checked="checked"' : ''; + return ($input === $value) ? ' checked="checked"' : ''; } return ($default === TRUE) ? ' checked="checked"' : ''; @@ -843,7 +843,7 @@ function set_radio($field, $value = '', $default = FALSE) // Unchecked checkbox and radio inputs are not even submitted by browsers ... if ($CI->input->method() === 'post') { - return ($input === 'value') ? ' checked="checked"' : ''; + return ($input === $value) ? ' checked="checked"' : ''; } return ($default === TRUE) ? ' checked="checked"' : ''; diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8e76f1d01f0..372261efde9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -15,6 +15,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4395) - :doc:`Query Builder ` method ``count_all_results()`` still fails if an ``ORDER BY`` condition is used. - Fixed a bug (#4399) - :doc:`Query Builder ` methods ``insert_batch()``, ``update_batch()`` produced confusing error messages when called with no data and *db_debug* is enabled. - Fixed a bug (#4401) - :doc:`Query Builder ` breaks ``WHERE`` and ``HAVING`` conditions that use ``IN()`` with strings containing a closing parenthesis. +- Fixed a regression in :doc:`Form Helper ` functions :php:func:`set_checkbox()`, :php:func:`set_radio()` where "checked" inputs aren't recognized after a form submit. Version 3.0.4 ============= From 237b4c915d873ab1b4efc80d50e86b97cbb97c03 Mon Sep 17 00:00:00 2001 From: Sherman K Date: Fri, 29 Jan 2016 09:33:20 +0800 Subject: [PATCH 4153/5397] Consistent formatting of italicised file paths and inline code references Signed-off-by: Sherman K --- user_guide_src/source/installation/index.rst | 18 +++++++++--------- .../source/installation/troubleshooting.rst | 6 +++--- user_guide_src/source/overview/at_a_glance.rst | 4 ++-- .../source/tutorial/create_news_items.rst | 16 ++++++++-------- .../source/tutorial/static_pages.rst | 2 +- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/user_guide_src/source/installation/index.rst b/user_guide_src/source/installation/index.rst index 50493bbbd32..fbf6ecee1ca 100644 --- a/user_guide_src/source/installation/index.rst +++ b/user_guide_src/source/installation/index.rst @@ -6,37 +6,37 @@ CodeIgniter is installed in four steps: #. Unzip the package. #. Upload the CodeIgniter folders and files to your server. Normally the - index.php file will be at your root. -#. Open the application/config/config.php file with a text editor and + *index.php* file will be at your root. +#. Open the *application/config/config.php* file with a text editor and set your base URL. If you intend to use encryption or sessions, set your encryption key. #. If you intend to use a database, open the - application/config/database.php file with a text editor and set your + *application/config/database.php* file with a text editor and set your database settings. If you wish to increase security by hiding the location of your CodeIgniter files you can rename the system and application folders to something more private. If you do rename them, you must open your main -index.php file and set the $system_path and $application_folder +*index.php* file and set the ``$system_path`` and ``$application_folder`` variables at the top of the file with the new name you've chosen. For the best security, both the system and any application folders should be placed above web root so that they are not directly accessible -via a browser. By default, .htaccess files are included in each folder +via a browser. By default, *.htaccess* files are included in each folder to help prevent direct access, but it is best to remove them from public access entirely in case the web server configuration changes or doesn't -abide by the .htaccess. +abide by the *.htaccess*. If you would like to keep your views public it is also possible to move the views folder out of your application folder. After moving them, open your main index.php file and set the -$system_path, $application_folder and $view_folder variables, -preferably with a full path, e.g. '/www/MyUser/system'. +``$system_path``, ``$application_folder`` and ``$view_folder`` variables, +preferably with a full path, e.g. '*/www/MyUser/system*'. One additional measure to take in production environments is to disable PHP error reporting and any other development-only functionality. In -CodeIgniter, this can be done by setting the ENVIRONMENT constant, which +CodeIgniter, this can be done by setting the ``ENVIRONMENT`` constant, which is more fully described on the :doc:`security page <../general/security>`. diff --git a/user_guide_src/source/installation/troubleshooting.rst b/user_guide_src/source/installation/troubleshooting.rst index e874bb0ecc6..ffd65e0e966 100644 --- a/user_guide_src/source/installation/troubleshooting.rst +++ b/user_guide_src/source/installation/troubleshooting.rst @@ -4,12 +4,12 @@ Troubleshooting If you find that no matter what you put in your URL only your default page is loading, it might be that your server does not support the -REQUEST_URI variable needed to serve search-engine friendly URLs. As a -first step, open your application/config/config.php file and look for +``REQUEST_URI`` variable needed to serve search-engine friendly URLs. As a +first step, open your *application/config/config.php* file and look for the URI Protocol information. It will recommend that you try a couple alternate settings. If it still doesn't work after you've tried this you'll need to force CodeIgniter to add a question mark to your URLs. To -do this open your **application/config/config.php** file and change this:: +do this open your *application/config/config.php* file and change this:: $config['index_page'] = "index.php"; diff --git a/user_guide_src/source/overview/at_a_glance.rst b/user_guide_src/source/overview/at_a_glance.rst index ce195c21104..b4db6b18bca 100644 --- a/user_guide_src/source/overview/at_a_glance.rst +++ b/user_guide_src/source/overview/at_a_glance.rst @@ -54,8 +54,8 @@ approach:: example.com/news/article/345 -Note: By default the index.php file is included in the URL but it can be -removed using a simple .htaccess file. +Note: By default the *index.php* file is included in the URL but it can be +removed using a simple *.htaccess* file. CodeIgniter Packs a Punch ========================= diff --git a/user_guide_src/source/tutorial/create_news_items.rst b/user_guide_src/source/tutorial/create_news_items.rst index bc0ce7612bc..e10eebd3bdd 100644 --- a/user_guide_src/source/tutorial/create_news_items.rst +++ b/user_guide_src/source/tutorial/create_news_items.rst @@ -14,7 +14,7 @@ To input data into the database you need to create a form where you can input the information to be stored. This means you'll be needing a form with two fields, one for the title and one for the text. You'll derive the slug from our title in the model. Create the new view at -application/views/news/create.php. +*application/views/news/create.php*. :: @@ -35,7 +35,7 @@ application/views/news/create.php. There are only two things here that probably look unfamiliar to you: the -form_open() function and the validation_errors() function. +``form_open()`` function and the ``validation_errors()`` function. The first function is provided by the :doc:`form helper <../helpers/form_helper>` and renders the form element and @@ -76,7 +76,7 @@ validation <../libraries/form_validation>` library to do this. The code above adds a lot of functionality. The first few lines load the form helper and the form validation library. After that, rules for the -form validation are set. The set\_rules() method takes three arguments; +form validation are set. The ``set\_rules()`` method takes three arguments; the name of the input field, the name to be used in error messages, and the rule. In this case the title and text fields are required. @@ -88,7 +88,7 @@ Continuing down, you can see a condition that checks whether the form validation ran successfully. If it did not, the form is displayed, if it was submitted **and** passed all the rules, the model is called. After this, a view is loaded to display a success message. Create a view at -application/views/news/success.php and write a success message. +*application/views/news/success.php* and write a success message. Model ----- @@ -123,19 +123,19 @@ sure everything is in lowercase characters. This leaves you with a nice slug, perfect for creating URIs. Let's continue with preparing the record that is going to be inserted -later, inside the $data array. Each element corresponds with a column in +later, inside the ``$data`` array. Each element corresponds with a column in the database table created earlier. You might notice a new method here, -namely the post() method from the :doc:`input +namely the ``post()`` method from the :doc:`input library <../libraries/input>`. This method makes sure the data is sanitized, protecting you from nasty attacks from others. The input -library is loaded by default. At last, you insert our $data array into +library is loaded by default. At last, you insert our ``$data`` array into our database. Routing ------- Before you can start adding news items into your CodeIgniter application -you have to add an extra rule to config/routes.php file. Make sure your +you have to add an extra rule to *config/routes.php* file. Make sure your file contains the following. This makes sure CodeIgniter sees 'create' as a method instead of a news item's slug. diff --git a/user_guide_src/source/tutorial/static_pages.rst b/user_guide_src/source/tutorial/static_pages.rst index 66621471e9d..569287c98a6 100644 --- a/user_guide_src/source/tutorial/static_pages.rst +++ b/user_guide_src/source/tutorial/static_pages.rst @@ -24,7 +24,7 @@ you'll see URL patterns that match: As URL schemes become more complex, this may change. But for now, this is all we will need to know. -Create a file at application/controllers/Pages.php with the following +Create a file at *application/controllers/Pages.php* with the following code. :: From c31588a7fc0a2bc44d6b64644726cebba0be7b3f Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 25 Jan 2016 14:57:39 +0900 Subject: [PATCH 4154/5397] Fix formatting of paths Signed-off-by: Kenji Suzuki --- user_guide_src/source/installation/upgrade_300.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 45ce2132031..9a40f2b60ec 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -65,7 +65,7 @@ Step 3: Replace config/mimes.php ******************************** This config file has been updated to contain more user mime-types, please copy -it to _application/config/mimes.php*. +it to *application/config/mimes.php*. ************************************************************** Step 4: Remove $autoload['core'] from your config/autoload.php @@ -206,13 +206,13 @@ Step 8: Replace your error templates ************************************ In CodeIgniter 3.0, the error templates are now considered as views and have been moved to the -_application/views/errors* directory. +*application/views/errors* directory. Furthermore, we've added support for CLI error templates in plain-text format that unlike HTML, is suitable for the command line. This of course requires another level of separation. -It is safe to move your old templates from _application/errors* to _application/views/errors/html*, -but you'll have to copy the new _application/views/errors/cli* directory from the CodeIgniter archive. +It is safe to move your old templates from *application/errors* to *application/views/errors/html*, +but you'll have to copy the new *application/views/errors/cli* directory from the CodeIgniter archive. ****************************************** Step 9: Update your config/routes.php file From 6a802289522abc85309527855d9dc2faa34f54e0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 29 Jan 2016 12:12:57 +0200 Subject: [PATCH 4155/5397] Merge pull request #4411 from kenjis/fix-upgrade_300-1 [ci skip] Fix formatting of paths in 3.0.0 upgrade instructions --- user_guide_src/source/installation/upgrade_300.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 45ce2132031..9a40f2b60ec 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -65,7 +65,7 @@ Step 3: Replace config/mimes.php ******************************** This config file has been updated to contain more user mime-types, please copy -it to _application/config/mimes.php*. +it to *application/config/mimes.php*. ************************************************************** Step 4: Remove $autoload['core'] from your config/autoload.php @@ -206,13 +206,13 @@ Step 8: Replace your error templates ************************************ In CodeIgniter 3.0, the error templates are now considered as views and have been moved to the -_application/views/errors* directory. +*application/views/errors* directory. Furthermore, we've added support for CLI error templates in plain-text format that unlike HTML, is suitable for the command line. This of course requires another level of separation. -It is safe to move your old templates from _application/errors* to _application/views/errors/html*, -but you'll have to copy the new _application/views/errors/cli* directory from the CodeIgniter archive. +It is safe to move your old templates from *application/errors* to *application/views/errors/html*, +but you'll have to copy the new *application/views/errors/cli* directory from the CodeIgniter archive. ****************************************** Step 9: Update your config/routes.php file From 6af9dd6e24687b6a7b9d14a058a47edcac761e61 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 29 Jan 2016 13:29:57 +0200 Subject: [PATCH 4156/5397] Fix #4407 --- system/helpers/text_helper.php | 21 ++++++++++++++++++--- user_guide_src/source/changelog.rst | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index 1fdbedda5d7..79aaf1492db 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -275,13 +275,28 @@ function word_censor($str, $censored, $replacement = '') foreach ($censored as $badword) { + $badword = str_replace('\*', '\w*?', preg_quote($badword, '/')); if ($replacement !== '') { - $str = preg_replace("/({$delim})(".str_replace('\*', '\w*?', preg_quote($badword, '/')).")({$delim})/i", "\\1{$replacement}\\3", $str); + $str = preg_replace( + "/({$delim})(".$badword.")({$delim})/i", + "\\1{$replacement}\\3", + $str + ); } - else + elseif (preg_match_all("/{$delim}(".$badword."){$delim}/i", $str, $matches, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE)) { - $str = preg_replace("/({$delim})(".str_replace('\*', '\w*?', preg_quote($badword, '/')).")({$delim})/ie", "'\\1'.str_repeat('#', strlen('\\2')).'\\3'", $str); + $matches = $matches[1]; + for ($i = count($matches); $i >= 0; $i--) + { + $length = strlen($matches[$i][0]); + $str = substr_replace( + $str, + str_repeat('#', $length), + $matches[$i][1], + $length + ); + } } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 372261efde9..a3fed6af32d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -16,6 +16,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4399) - :doc:`Query Builder ` methods ``insert_batch()``, ``update_batch()`` produced confusing error messages when called with no data and *db_debug* is enabled. - Fixed a bug (#4401) - :doc:`Query Builder ` breaks ``WHERE`` and ``HAVING`` conditions that use ``IN()`` with strings containing a closing parenthesis. - Fixed a regression in :doc:`Form Helper ` functions :php:func:`set_checkbox()`, :php:func:`set_radio()` where "checked" inputs aren't recognized after a form submit. +- Fixed a bug (#4407) - :doc:`Text Helper ` function :php:func:`word_censor()` doesn't work under PHP 7 if there's no custom replacement provided. Version 3.0.4 ============= From 9aab22e0a1aa876b98dcfa58781b0ffde71f97a1 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 29 Jan 2016 16:19:46 +0200 Subject: [PATCH 4157/5397] Fix an error from 6af9dd6e24687b6a7b9d14a058a47edcac761e61 Related: #4407 --- system/helpers/text_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index 79aaf1492db..4f9210f2da1 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -287,7 +287,7 @@ function word_censor($str, $censored, $replacement = '') elseif (preg_match_all("/{$delim}(".$badword."){$delim}/i", $str, $matches, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE)) { $matches = $matches[1]; - for ($i = count($matches); $i >= 0; $i--) + for ($i = count($matches) - 1; $i >= 0; $i--) { $length = strlen($matches[$i][0]); $str = substr_replace( From 391d339b921623ce921bdb5520fb93f9cf62fac5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 30 Jan 2016 22:43:41 +0200 Subject: [PATCH 4158/5397] Fix #4415 and add unit tests for https://bugs.php.net/bug.php?id=51192 --- system/libraries/Form_validation.php | 8 ++++++++ tests/codeigniter/libraries/Form_validation_test.php | 7 +++++++ user_guide_src/source/changelog.rst | 1 + 3 files changed, 16 insertions(+) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 31632762d45..ea3bc6de766 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1214,6 +1214,14 @@ public function valid_url($str) $str = $matches[2]; } + // PHP 7 accepts IPv6 addresses within square brackets as hostnames, + // but it appears that the PR that came in with https://bugs.php.net/bug.php?id=68039 + // was never merged into a PHP 5 branch ... https://3v4l.org/8PsSN + if (preg_match('/^\[([^\]]+)\]/', $str, $matches) && ! is_php('7') && filter_var($matches[1], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== FALSE) + { + $str = 'ipv6.host'.substr($str, strlen($matches[1]) + 2); + } + $str = 'http://'.$str; // There's a bug affecting PHP 5.2.13, 5.3.2 that considers the diff --git a/tests/codeigniter/libraries/Form_validation_test.php b/tests/codeigniter/libraries/Form_validation_test.php index 65a3bbff7e3..f455b9146a6 100644 --- a/tests/codeigniter/libraries/Form_validation_test.php +++ b/tests/codeigniter/libraries/Form_validation_test.php @@ -231,6 +231,13 @@ public function test_rule_valid_url() $this->assertTrue($this->form_validation->valid_url('www.codeigniter.com')); $this->assertTrue($this->form_validation->valid_url('http://codeigniter.com')); + // https://bugs.php.net/bug.php?id=51192 + $this->assertTrue($this->form_validation->valid_url('http://accept-dashes.tld')); + $this->assertFalse($this->form_validation->valid_url('http://reject_underscores.tld')); + + // https://github.com/bcit-ci/CodeIgniter/issues/4415 + $this->assertTrue($this->form_validation->valid_url('http://[::1]/ipv6')); + $this->assertFalse($this->form_validation->valid_url('htt://www.codeIgniter.com')); $this->assertFalse($this->form_validation->valid_url('')); $this->assertFalse($this->form_validation->valid_url('code igniter')); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a3fed6af32d..a8cb3f5c345 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -17,6 +17,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4401) - :doc:`Query Builder ` breaks ``WHERE`` and ``HAVING`` conditions that use ``IN()`` with strings containing a closing parenthesis. - Fixed a regression in :doc:`Form Helper ` functions :php:func:`set_checkbox()`, :php:func:`set_radio()` where "checked" inputs aren't recognized after a form submit. - Fixed a bug (#4407) - :doc:`Text Helper ` function :php:func:`word_censor()` doesn't work under PHP 7 if there's no custom replacement provided. +- Fixed a bug (#4415) - :doc:`Form Validation Library ` rule **valid_url** didn't accept URLs with IPv6 addresses enclosed in square brackets under PHP 5 (upstream bug). Version 3.0.4 ============= From f51ef09e34f049911af99332f937ebaf723c129e Mon Sep 17 00:00:00 2001 From: Kristian Matthews Date: Sun, 31 Jan 2016 15:54:30 +0000 Subject: [PATCH 4159/5397] Added Unique Field Attribute Doc Signed-off-by: Kristian Matthews --- user_guide_src/source/database/forge.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/user_guide_src/source/database/forge.rst b/user_guide_src/source/database/forge.rst index 646e3a56eea..cb5c3566234 100644 --- a/user_guide_src/source/database/forge.rst +++ b/user_guide_src/source/database/forge.rst @@ -97,6 +97,7 @@ Additionally, the following key/values can be used: - auto_increment/true : generates an auto_increment flag on the field. Note that the field type must be a type that supports this, such as integer. +- unique/false : to generate a unique key for the field definition. :: @@ -110,6 +111,7 @@ Additionally, the following key/values can be used: 'blog_title' => array( 'type' => 'VARCHAR', 'constraint' => '100', + 'unique' => TRUE, ), 'blog_author' => array( 'type' =>'VARCHAR', @@ -175,14 +177,14 @@ below is for MySQL. $this->dbforge->add_key('blog_id', TRUE); // gives PRIMARY KEY `blog_id` (`blog_id`) - + $this->dbforge->add_key('blog_id', TRUE); $this->dbforge->add_key('site_id', TRUE); // gives PRIMARY KEY `blog_id_site_id` (`blog_id`, `site_id`) - + $this->dbforge->add_key('blog_name'); // gives KEY `blog_name` (`blog_name`) - + $this->dbforge->add_key(array('blog_name', 'blog_label')); // gives KEY `blog_name_blog_label` (`blog_name`, `blog_label`) @@ -261,7 +263,7 @@ number of additional fields. $fields = array( 'preferences' => array('type' => 'TEXT') ); - $this->dbforge->add_column('table_name', $fields); + $this->dbforge->add_column('table_name', $fields); // Executes: ALTER TABLE table_name ADD preferences TEXT If you are using MySQL or CUBIRD, then you can take advantage of their From ea07f04725c56730d4b99d5f215d6e09edb54df6 Mon Sep 17 00:00:00 2001 From: Kristian Matthews Date: Mon, 1 Feb 2016 18:06:17 +0000 Subject: [PATCH 4160/5397] Changed Unique Value Changed unique value from false to true. Signed-off-by: Kristian Matthews --- user_guide_src/source/database/forge.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/database/forge.rst b/user_guide_src/source/database/forge.rst index cb5c3566234..5af4f224843 100644 --- a/user_guide_src/source/database/forge.rst +++ b/user_guide_src/source/database/forge.rst @@ -97,7 +97,7 @@ Additionally, the following key/values can be used: - auto_increment/true : generates an auto_increment flag on the field. Note that the field type must be a type that supports this, such as integer. -- unique/false : to generate a unique key for the field definition. +- unique/true : to generate a unique key for the field definition. :: From e8bcc9eeb4ccbbea78442275c646de21aaaa6594 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 2 Feb 2016 14:01:50 +0200 Subject: [PATCH 4161/5397] Merge pull request #4419 from EpicKris/hotfix/database-forge-unique-doc [ci skip] Added docs for UNIQUE keys in DBForge --- user_guide_src/source/database/forge.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/user_guide_src/source/database/forge.rst b/user_guide_src/source/database/forge.rst index 646e3a56eea..5af4f224843 100644 --- a/user_guide_src/source/database/forge.rst +++ b/user_guide_src/source/database/forge.rst @@ -97,6 +97,7 @@ Additionally, the following key/values can be used: - auto_increment/true : generates an auto_increment flag on the field. Note that the field type must be a type that supports this, such as integer. +- unique/true : to generate a unique key for the field definition. :: @@ -110,6 +111,7 @@ Additionally, the following key/values can be used: 'blog_title' => array( 'type' => 'VARCHAR', 'constraint' => '100', + 'unique' => TRUE, ), 'blog_author' => array( 'type' =>'VARCHAR', @@ -175,14 +177,14 @@ below is for MySQL. $this->dbforge->add_key('blog_id', TRUE); // gives PRIMARY KEY `blog_id` (`blog_id`) - + $this->dbforge->add_key('blog_id', TRUE); $this->dbforge->add_key('site_id', TRUE); // gives PRIMARY KEY `blog_id_site_id` (`blog_id`, `site_id`) - + $this->dbforge->add_key('blog_name'); // gives KEY `blog_name` (`blog_name`) - + $this->dbforge->add_key(array('blog_name', 'blog_label')); // gives KEY `blog_name_blog_label` (`blog_name`, `blog_label`) @@ -261,7 +263,7 @@ number of additional fields. $fields = array( 'preferences' => array('type' => 'TEXT') ); - $this->dbforge->add_column('table_name', $fields); + $this->dbforge->add_column('table_name', $fields); // Executes: ALTER TABLE table_name ADD preferences TEXT If you are using MySQL or CUBIRD, then you can take advantage of their From 4dc17cf59142b3d3d80e9b3cdba77e7db0d2b75c Mon Sep 17 00:00:00 2001 From: Jonty Sewell Date: Wed, 3 Feb 2016 11:41:34 +0000 Subject: [PATCH 4162/5397] If attempting to write an empty session to Redis, a key will not actually be created, so when the driver tries to set the expiration timeout on the key, 0 is returned, triggering a warning from session_write_close Signed-off-by: Jonty Sewell --- .../Session/drivers/Session_redis_driver.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index c7c57420233..aa8459beffd 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -240,9 +240,15 @@ public function write($session_id, $session_data) return $this->_failure; } - return ($this->_redis->setTimeout($this->_key_prefix.$session_id, $this->_config['expiration'])) - ? $this->_success - : $this->_failure; + if($this->_fingerprint === md5('')) + { + // A blank session will not be written to redis, so a timeout cannot be set on it + return $this->_success; + } else { + return ($this->_redis->setTimeout($this->_key_prefix.$session_id, $this->_config['expiration'])) + ? $this->_success + : $this->_failure; + } } return $this->_failure; From ec9e96eb09caa9d024c89a8bdb1b00bf6540278a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 4 Feb 2016 14:43:46 +0200 Subject: [PATCH 4163/5397] Fix #4427 --- system/helpers/captcha_helper.php | 45 +++++++++++++++-------------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index fd1b8f1edb6..3c1e006f8b5 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -171,35 +171,36 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = $byte_index = $word_index = 0; while ($word_index < $word_length) { - list(, $rand_index) = unpack('C', $bytes[$byte_index++]); - if ($rand_index > $rand_max) + // Do we have more random data to use? + // It could be exhausted by previous iterations + // ignoring bytes higher than $rand_max. + if ($byte_index === $pool_length) { - // Was this the last byte we have? - // If so, try to fetch more. - if ($byte_index === $pool_length) + // No failures should be possible if the + // first get_random_bytes() call didn't + // return FALSE, but still ... + for ($i = 0; $i < 5; $i++) { - // No failures should be possible if - // the first get_random_bytes() call - // didn't return FALSE, but still ... - for ($i = 0; $i < 5; $i++) + if (($bytes = $security->get_random_bytes($pool_length)) === FALSE) { - if (($bytes = $security->get_random_bytes($pool_length)) === FALSE) - { - continue; - } - - $byte_index = 0; - break; + continue; } - if ($bytes === FALSE) - { - // Sadly, this means fallback to mt_rand() - $word = ''; - break; - } + $byte_index = 0; + break; + } + + if ($bytes === FALSE) + { + // Sadly, this means fallback to mt_rand() + $word = ''; + break; } + } + list(, $rand_index) = unpack('C', $bytes[$byte_index++]); + if ($rand_index > $rand_max) + { continue; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a8cb3f5c345..cde4b8b4e8d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -18,6 +18,7 @@ Bug fixes for 3.0.5 - Fixed a regression in :doc:`Form Helper ` functions :php:func:`set_checkbox()`, :php:func:`set_radio()` where "checked" inputs aren't recognized after a form submit. - Fixed a bug (#4407) - :doc:`Text Helper ` function :php:func:`word_censor()` doesn't work under PHP 7 if there's no custom replacement provided. - Fixed a bug (#4415) - :doc:`Form Validation Library ` rule **valid_url** didn't accept URLs with IPv6 addresses enclosed in square brackets under PHP 5 (upstream bug). +- Fixed a bug (#4427) - :doc:`CAPTCHA Helper ` triggers an error if the provided character pool is too small. Version 3.0.4 ============= From 71d64cbcfde625606ffb55867e0bb547123ef22f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 4 Feb 2016 15:04:35 +0200 Subject: [PATCH 4164/5397] Fix #4430 --- system/libraries/Upload.php | 6 ++++++ user_guide_src/source/changelog.rst | 1 + 2 files changed, 7 insertions(+) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 15caebebe5b..f2418378b03 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -526,6 +526,12 @@ public function do_upload($field = 'userfile') $this->file_name = preg_replace('/\s+/', '_', $this->file_name); } + if ($this->file_ext_tolower && ($ext_length = strlen($this->file_ext))) + { + // file_ext was previously lower-cased by a get_extension() call + $this->file_name = substr($this->file_name, 0, -$ext_length).$this->file_ext; + } + /* * Validate the file name * This function appends an number onto the end of diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index cde4b8b4e8d..1a06bd5aef1 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -19,6 +19,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4407) - :doc:`Text Helper ` function :php:func:`word_censor()` doesn't work under PHP 7 if there's no custom replacement provided. - Fixed a bug (#4415) - :doc:`Form Validation Library ` rule **valid_url** didn't accept URLs with IPv6 addresses enclosed in square brackets under PHP 5 (upstream bug). - Fixed a bug (#4427) - :doc:`CAPTCHA Helper ` triggers an error if the provided character pool is too small. +- Fixed a bug (#4430) - :doc:`File Uploading Library ` option **file_ext_tolower** didn't work. Version 3.0.4 ============= From 105a48bbfc97be5902dbe80f90f8936fe174c9cf Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 4 Feb 2016 15:45:10 +0200 Subject: [PATCH 4165/5397] Add batch_size param to insert_batch(), update_batch() This should resolve #42 --- system/database/DB_query_builder.php | 12 ++++++------ user_guide_src/source/changelog.rst | 5 +++++ .../source/database/query_builder.rst | 18 ++++++++++++++---- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index be7582815dd..4922dd6231e 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1458,7 +1458,7 @@ public function get_where($table = '', $where = NULL, $limit = NULL, $offset = N * @param bool $escape Whether to escape values and identifiers * @return int Number of rows inserted or FALSE on failure */ - public function insert_batch($table, $set = NULL, $escape = NULL) + public function insert_batch($table, $set = NULL, $escape = NULL, $batch_size = 100) { if ($set === NULL) { @@ -1489,9 +1489,9 @@ public function insert_batch($table, $set = NULL, $escape = NULL) // Batch this baby $affected_rows = 0; - for ($i = 0, $total = count($this->qb_set); $i < $total; $i += 100) + for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) { - $this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, 100))); + $this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size))); $affected_rows += $this->affected_rows(); } @@ -1865,7 +1865,7 @@ protected function _validate_update($table) * @param string the where key * @return int number of rows affected or FALSE on failure */ - public function update_batch($table, $set = NULL, $index = NULL) + public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 100) { // Combine any cached components with the current statements $this->_merge_cache(); @@ -1904,9 +1904,9 @@ public function update_batch($table, $set = NULL, $index = NULL) // Batch this baby $affected_rows = 0; - for ($i = 0, $total = count($this->qb_set); $i < $total; $i += 100) + for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) { - $this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, 100), $this->protect_identifiers($index))); + $this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, $batch_size), $this->protect_identifiers($index))); $affected_rows += $this->affected_rows(); $this->qb_where = array(); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1a06bd5aef1..7e72c230fc6 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,11 @@ Version 3.0.5 Release Date: Not Released +- :doc:`Query Builder ` + + - Added a ``$batch_size`` parameter to the ``insert_batch()`` method (defaults to 100). + - Added a ``$batch_size`` parameter to the ``update_batch()`` method (defaults to 100). + Bug fixes for 3.0.5 ------------------- diff --git a/user_guide_src/source/database/query_builder.rst b/user_guide_src/source/database/query_builder.rst index 5d9ae459231..3135f76daae 100644 --- a/user_guide_src/source/database/query_builder.rst +++ b/user_guide_src/source/database/query_builder.rst @@ -1433,15 +1433,20 @@ Class Reference Compiles and executes an INSERT statement. - .. php:method:: insert_batch([$table = ''[, $set = NULL[, $escape = NULL]]]) + .. php:method:: insert_batch($table[, $set = NULL[, $escape = NULL[, $batch_size = 100]]]) :param string $table: Table name :param array $set: Data to insert :param bool $escape: Whether to escape values and identifiers + :param int $batch_size: Count of rows to insert at once :returns: Number of rows inserted or FALSE on failure :rtype: mixed - Compiles and executes batch INSERT statements. + Compiles and executes batch ``INSERT`` statements. + + .. note:: When more than ``$batch_size`` rows are provided, multiple + ``INSERT`` queries will be executed, each trying to insert + up to ``$batch_size`` rows. .. php:method:: set_insert_batch($key[, $value = ''[, $escape = NULL]]) @@ -1464,15 +1469,20 @@ Class Reference Compiles and executes an UPDATE statement. - .. php:method:: update_batch([$table = ''[, $set = NULL[, $value = NULL]]]) + .. php:method:: update_batch($table[, $set = NULL[, $value = NULL[, $batch_size = 100]]]) :param string $table: Table name :param array $set: Field name, or an associative array of field/value pairs :param string $value: Field value, if $set is a single field + :param int $batch_size: Count of conditions to group in a single query :returns: Number of rows updated or FALSE on failure :rtype: mixed - Compiles and executes batch UPDATE statements. + Compiles and executes batch ``UPDATE`` statements. + + .. note:: When more than ``$batch_size`` field/value pairs are provided, + multiple queries will be executed, each handling up to + ``$batch_size`` field/value pairs. .. php:method:: set_update_batch($key[, $value = ''[, $escape = NULL]]) From b864ece65755e91e28a802824da7e4beebab3a9c Mon Sep 17 00:00:00 2001 From: Claudio Galdiolo Date: Thu, 4 Feb 2016 13:02:39 -0500 Subject: [PATCH 4166/5397] [ci skip] fix comment --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index e565f0fd158..1b52bf3b8ec 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1731,7 +1731,7 @@ public function display_error($error = '', $swap = '', $native = FALSE) * the table prefix onto it. Some logic is necessary in order to deal with * column names that include the path. Consider a query like this: * - * SELECT * FROM hostname.database.table.column AS c FROM hostname.database.table + * SELECT hostname.database.table.column AS c FROM hostname.database.table * * Or a query with aliasing: * From 27eb5c9e63b15643f9648bb7198c680010debbd1 Mon Sep 17 00:00:00 2001 From: Claudio Galdiolo Date: Thu, 4 Feb 2016 13:02:39 -0500 Subject: [PATCH 4167/5397] [ci skip] fix comment --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index bad641d1772..848516adc54 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1793,7 +1793,7 @@ public function display_error($error = '', $swap = '', $native = FALSE) * the table prefix onto it. Some logic is necessary in order to deal with * column names that include the path. Consider a query like this: * - * SELECT * FROM hostname.database.table.column AS c FROM hostname.database.table + * SELECT hostname.database.table.column AS c FROM hostname.database.table * * Or a query with aliasing: * From 880036d5cea0021258c43c0d0fba0e6fd9d04b69 Mon Sep 17 00:00:00 2001 From: Jonty Sewell Date: Fri, 5 Feb 2016 09:27:47 +0000 Subject: [PATCH 4168/5397] Revert previous changes - fixing the source of the problem rather than working around it Signed-off-by: Jonty Sewell --- .../Session/drivers/Session_redis_driver.php | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index aa8459beffd..c7c57420233 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -240,15 +240,9 @@ public function write($session_id, $session_data) return $this->_failure; } - if($this->_fingerprint === md5('')) - { - // A blank session will not be written to redis, so a timeout cannot be set on it - return $this->_success; - } else { - return ($this->_redis->setTimeout($this->_key_prefix.$session_id, $this->_config['expiration'])) - ? $this->_success - : $this->_failure; - } + return ($this->_redis->setTimeout($this->_key_prefix.$session_id, $this->_config['expiration'])) + ? $this->_success + : $this->_failure; } return $this->_failure; From 74f846890d69e6f5ff5f0bb4268539803242d015 Mon Sep 17 00:00:00 2001 From: Jonty Sewell Date: Fri, 5 Feb 2016 09:39:05 +0000 Subject: [PATCH 4169/5397] Add a flag to determine whether the redis key currently exists, and if not, force creation of it at write-time Signed-off-by: Jonty Sewell --- .../Session/drivers/Session_redis_driver.php | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index c7c57420233..e62a3c597c8 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -69,6 +69,13 @@ class CI_Session_redis_driver extends CI_Session_driver implements SessionHandle */ protected $_lock_key; + /** + * Key exists flag + * + * @var boolean + */ + protected $_key_exists = FALSE; + // ------------------------------------------------------------------------ /** @@ -189,7 +196,15 @@ public function read($session_id) // Needed by write() to detect session_regenerate_id() calls $this->_session_id = $session_id; - $session_data = (string) $this->_redis->get($this->_key_prefix.$session_id); + $session_data = $this->_redis->get($this->_key_prefix.$session_id); + + if ($session_data === FALSE) + { + // The session ID does not exist in redis yet, so set a flag to create it + $this->_key_exists = FALSE; + $session_data = ''; + } + $this->_fingerprint = md5($session_data); return $session_data; } @@ -229,7 +244,7 @@ public function write($session_id, $session_data) if (isset($this->_lock_key)) { $this->_redis->setTimeout($this->_lock_key, 300); - if ($this->_fingerprint !== ($fingerprint = md5($session_data))) + if ($this->_fingerprint !== ($fingerprint = md5($session_data)) OR $this->_key_exists === FALSE) { if ($this->_redis->set($this->_key_prefix.$session_id, $session_data, $this->_config['expiration'])) { From a7f9ea28aa40bd036de1cee7a4ec4ab63235fd12 Mon Sep 17 00:00:00 2001 From: Jonty Sewell Date: Fri, 5 Feb 2016 10:33:00 +0000 Subject: [PATCH 4170/5397] Set the _key_exists flag to TRUE when the key does in fact exist. Set it to FALSE if the ID is being regenerated, and set it to TRUE once it's been written. Signed-off-by: Jonty Sewell --- .../libraries/Session/drivers/Session_redis_driver.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index e62a3c597c8..be5b37e813d 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -72,7 +72,7 @@ class CI_Session_redis_driver extends CI_Session_driver implements SessionHandle /** * Key exists flag * - * @var boolean + * @var bool */ protected $_key_exists = FALSE; @@ -204,6 +204,10 @@ public function read($session_id) $this->_key_exists = FALSE; $session_data = ''; } + else + { + $this->_key_exists = TRUE; + } $this->_fingerprint = md5($session_data); return $session_data; @@ -237,7 +241,7 @@ public function write($session_id, $session_data) return $this->_failure; } - $this->_fingerprint = md5(''); + $this->_key_exists = FALSE; $this->_session_id = $session_id; } @@ -249,6 +253,7 @@ public function write($session_id, $session_data) if ($this->_redis->set($this->_key_prefix.$session_id, $session_data, $this->_config['expiration'])) { $this->_fingerprint = $fingerprint; + $this->_key_exists = TRUE; return $this->_success; } From 0f19fd0550e95354e8512c28ff19799aa913c0f9 Mon Sep 17 00:00:00 2001 From: Jonty Sewell Date: Fri, 5 Feb 2016 10:38:43 +0000 Subject: [PATCH 4171/5397] Setting the flag to FALSE is unnecessary since it defaults to FALSE, therefore this block of code can be reduced to a single statement Signed-off-by: Jonty Sewell --- .../Session/drivers/Session_redis_driver.php | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index be5b37e813d..c4483e439d9 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -198,16 +198,7 @@ public function read($session_id) $session_data = $this->_redis->get($this->_key_prefix.$session_id); - if ($session_data === FALSE) - { - // The session ID does not exist in redis yet, so set a flag to create it - $this->_key_exists = FALSE; - $session_data = ''; - } - else - { - $this->_key_exists = TRUE; - } + is_string($session_data) && $this->_key_exists = TRUE; $this->_fingerprint = md5($session_data); return $session_data; From 805eddaefd9503b5dbbd924bd6da66e29c4768f3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 5 Feb 2016 12:44:19 +0200 Subject: [PATCH 4172/5397] Fix #4431 --- system/database/DB_query_builder.php | 9 ++++----- user_guide_src/source/changelog.rst | 1 + 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 4922dd6231e..68df309f9ae 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -542,9 +542,8 @@ public function join($table, $cond, $type = '', $escape = NULL) $s = $m[0][$i][1] + strlen($m[0][$i][0]), $i++) { $temp = substr($cond, $s, ($m[0][$i][1] - $s)); - - $newcond .= preg_match("/([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $temp, $match) - ? $this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3]) + $newcond .= preg_match("/(.*)([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $temp, $match) + ? $match[1].$this->protect_identifiers($match[2]).$match[3].$this->protect_identifiers($match[4]) : $temp; $newcond .= $m[0][$i][0]; @@ -553,9 +552,9 @@ public function join($table, $cond, $type = '', $escape = NULL) $cond = ' ON '.$newcond; } // Split apart the condition and protect the identifiers - elseif ($escape === TRUE && preg_match("/([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $cond, $match)) + elseif ($escape === TRUE && preg_match("/(.*)([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $cond, $match)) { - $cond = ' ON '.$this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3]); + $cond = ' ON '.$match[1].$this->protect_identifiers($match[2]).$match[3].$this->protect_identifiers($match[4]); } elseif ( ! $this->_has_operator($cond)) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 7e72c230fc6..e993a862ae8 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -25,6 +25,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4415) - :doc:`Form Validation Library ` rule **valid_url** didn't accept URLs with IPv6 addresses enclosed in square brackets under PHP 5 (upstream bug). - Fixed a bug (#4427) - :doc:`CAPTCHA Helper ` triggers an error if the provided character pool is too small. - Fixed a bug (#4430) - :doc:`File Uploading Library ` option **file_ext_tolower** didn't work. +- Fixed a bug (#4431) - :doc:`Query Builder ` method ``join()`` discarded opening parentheses. Version 3.0.4 ============= From 28fdb3185c4f1e4f78b493c5a7eab09e975260ef Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 5 Feb 2016 14:04:32 +0200 Subject: [PATCH 4173/5397] Fix a regression caused by 805eddaefd9503b5dbbd924bd6da66e29c4768f3 --- system/database/DB_query_builder.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 68df309f9ae..b46730e220d 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -552,9 +552,9 @@ public function join($table, $cond, $type = '', $escape = NULL) $cond = ' ON '.$newcond; } // Split apart the condition and protect the identifiers - elseif ($escape === TRUE && preg_match("/(.*)([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $cond, $match)) + elseif ($escape === TRUE && preg_match("/([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $cond, $match)) { - $cond = ' ON '.$match[1].$this->protect_identifiers($match[2]).$match[3].$this->protect_identifiers($match[4]); + $cond = ' ON '.$this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3]); } elseif ( ! $this->_has_operator($cond)) { From 95bd763784f215a5cb4c38a4bc1caf5ac3c8f72d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 5 Feb 2016 14:15:45 +0200 Subject: [PATCH 4174/5397] Fix another regression caused by 805eddaefd9503b5dbbd924bd6da66e29c4768f3 Also added a unit test for #4431 --- system/database/DB_query_builder.php | 6 +++--- .../database/query_builder/join_test.php | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index b46730e220d..66ef913c90f 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -542,7 +542,7 @@ public function join($table, $cond, $type = '', $escape = NULL) $s = $m[0][$i][1] + strlen($m[0][$i][0]), $i++) { $temp = substr($cond, $s, ($m[0][$i][1] - $s)); - $newcond .= preg_match("/(.*)([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $temp, $match) + $newcond .= preg_match("/(\(*)?([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $temp, $match) ? $match[1].$this->protect_identifiers($match[2]).$match[3].$this->protect_identifiers($match[4]) : $temp; @@ -552,9 +552,9 @@ public function join($table, $cond, $type = '', $escape = NULL) $cond = ' ON '.$newcond; } // Split apart the condition and protect the identifiers - elseif ($escape === TRUE && preg_match("/([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $cond, $match)) + elseif ($escape === TRUE && preg_match("/(\(*)?([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $cond, $match)) { - $cond = ' ON '.$this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3]); + $cond = ' ON '.$match[1].$this->protect_identifiers($match[2]).$match[3].$this->protect_identifiers($match[4]); } elseif ( ! $this->_has_operator($cond)) { diff --git a/tests/codeigniter/database/query_builder/join_test.php b/tests/codeigniter/database/query_builder/join_test.php index 25bd4accbb4..58cb2149223 100644 --- a/tests/codeigniter/database/query_builder/join_test.php +++ b/tests/codeigniter/database/query_builder/join_test.php @@ -55,4 +55,24 @@ public function test_join_escape_multiple_conditions() $this->assertEquals($expected, $result); } + // ------------------------------------------------------------------------ + + public function test_join_escape_multiple_conditions_with_parentheses() + { + // We just need a valid query produced, not one that makes sense + $fields = array($this->db->protect_identifiers('table1.field1'), $this->db->protect_identifiers('table2.field2')); + + $expected = 'SELECT '.implode(', ', $fields) + ."\nFROM ".$this->db->escape_identifiers('table1') + ."\nRIGHT JOIN ".$this->db->escape_identifiers('table2').' ON '.implode(' = ', $fields) + .' AND ('.$fields[0]." = 'foo' OR ".$fields[1].' = 0)'; + + $result = $this->db->select('table1.field1, table2.field2') + ->from('table1') + ->join('table2', "table1.field1 = table2.field2 AND (table1.field1 = 'foo' OR table2.field2 = 0)", 'RIGHT') + ->get_compiled_select(); + + $this->assertEquals($expected, $result); + } + } \ No newline at end of file From c07ae0888377fb434ce70d0817746962722ea3b1 Mon Sep 17 00:00:00 2001 From: Jonty Sewell Date: Fri, 5 Feb 2016 12:34:01 +0000 Subject: [PATCH 4175/5397] Fix regression on PHP7 when regenerating the session (#4362) --- system/libraries/Session/drivers/Session_redis_driver.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index c4483e439d9..dc4328644b4 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -198,7 +198,9 @@ public function read($session_id) $session_data = $this->_redis->get($this->_key_prefix.$session_id); - is_string($session_data) && $this->_key_exists = TRUE; + is_string($session_data) + ? $this->_key_exists = TRUE + : $session_data = ''; $this->_fingerprint = md5($session_data); return $session_data; From 173cf413d38be042b40c2e519041ecaafb6a0919 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 5 Feb 2016 14:36:50 +0200 Subject: [PATCH 4176/5397] Merge pull request #4424 from jonty-comp/develop [ci skip] Fix PHP session_write_close() warning when writing a new session to Redis --- .../Session/drivers/Session_redis_driver.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index 46b8fa1c244..ad95309da7a 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -69,6 +69,13 @@ class CI_Session_redis_driver extends CI_Session_driver implements SessionHandle */ protected $_lock_key; + /** + * Key exists flag + * + * @var bool + */ + protected $_key_exists = FALSE; + // ------------------------------------------------------------------------ /** @@ -166,7 +173,12 @@ public function read($session_id) // Needed by write() to detect session_regenerate_id() calls $this->_session_id = $session_id; - $session_data = (string) $this->_redis->get($this->_key_prefix.$session_id); + $session_data = $this->_redis->get($this->_key_prefix.$session_id); + + is_string($session_data) + ? $this->_key_exists = TRUE + : $session_data = ''; + $this->_fingerprint = md5($session_data); return $session_data; } @@ -199,18 +211,19 @@ public function write($session_id, $session_data) return $this->_failure; } - $this->_fingerprint = md5(''); + $this->_key_exists = FALSE; $this->_session_id = $session_id; } if (isset($this->_lock_key)) { $this->_redis->setTimeout($this->_lock_key, 300); - if ($this->_fingerprint !== ($fingerprint = md5($session_data))) + if ($this->_fingerprint !== ($fingerprint = md5($session_data)) OR $this->_key_exists === FALSE) { if ($this->_redis->set($this->_key_prefix.$session_id, $session_data, $this->_config['expiration'])) { $this->_fingerprint = $fingerprint; + $this->_key_exists = TRUE; return $this->_success; } From acc2f249315f70bfb9c236389627869d4b247930 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 5 Feb 2016 14:39:40 +0200 Subject: [PATCH 4177/5397] [ci skip] Add changelog entry for PR #4424 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e993a862ae8..6176875c739 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -26,6 +26,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4427) - :doc:`CAPTCHA Helper ` triggers an error if the provided character pool is too small. - Fixed a bug (#4430) - :doc:`File Uploading Library ` option **file_ext_tolower** didn't work. - Fixed a bug (#4431) - :doc:`Query Builder ` method ``join()`` discarded opening parentheses. +- Fixed a bug (#4424) - :doc:`Session Library ` triggered a PHP warning when writing a newly created session with the 'redis' driver. Version 3.0.4 ============= From 57fb63c388b8487e3f4d08f251b3fca1677688e5 Mon Sep 17 00:00:00 2001 From: Sherman K Date: Sat, 6 Feb 2016 14:16:38 +0800 Subject: [PATCH 4178/5397] Reverted formatting for non-variable --- user_guide_src/source/installation/troubleshooting.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/installation/troubleshooting.rst b/user_guide_src/source/installation/troubleshooting.rst index ffd65e0e966..cca2907633d 100644 --- a/user_guide_src/source/installation/troubleshooting.rst +++ b/user_guide_src/source/installation/troubleshooting.rst @@ -4,7 +4,7 @@ Troubleshooting If you find that no matter what you put in your URL only your default page is loading, it might be that your server does not support the -``REQUEST_URI`` variable needed to serve search-engine friendly URLs. As a +REQUEST_URI variable needed to serve search-engine friendly URLs. As a first step, open your *application/config/config.php* file and look for the URI Protocol information. It will recommend that you try a couple alternate settings. If it still doesn't work after you've tried this From b37036a48a7639b82050d9aba24d92a48f50de75 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 6 Feb 2016 15:25:40 +0200 Subject: [PATCH 4179/5397] Merge pull request #4410 from ShrmnK/develop [ci skip] Consistent formatting of file paths and inline code in docs --- user_guide_src/source/installation/index.rst | 18 +++++++++--------- .../source/installation/troubleshooting.rst | 4 ++-- user_guide_src/source/overview/at_a_glance.rst | 4 ++-- .../source/tutorial/create_news_items.rst | 16 ++++++++-------- .../source/tutorial/static_pages.rst | 2 +- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/user_guide_src/source/installation/index.rst b/user_guide_src/source/installation/index.rst index 50493bbbd32..fbf6ecee1ca 100644 --- a/user_guide_src/source/installation/index.rst +++ b/user_guide_src/source/installation/index.rst @@ -6,37 +6,37 @@ CodeIgniter is installed in four steps: #. Unzip the package. #. Upload the CodeIgniter folders and files to your server. Normally the - index.php file will be at your root. -#. Open the application/config/config.php file with a text editor and + *index.php* file will be at your root. +#. Open the *application/config/config.php* file with a text editor and set your base URL. If you intend to use encryption or sessions, set your encryption key. #. If you intend to use a database, open the - application/config/database.php file with a text editor and set your + *application/config/database.php* file with a text editor and set your database settings. If you wish to increase security by hiding the location of your CodeIgniter files you can rename the system and application folders to something more private. If you do rename them, you must open your main -index.php file and set the $system_path and $application_folder +*index.php* file and set the ``$system_path`` and ``$application_folder`` variables at the top of the file with the new name you've chosen. For the best security, both the system and any application folders should be placed above web root so that they are not directly accessible -via a browser. By default, .htaccess files are included in each folder +via a browser. By default, *.htaccess* files are included in each folder to help prevent direct access, but it is best to remove them from public access entirely in case the web server configuration changes or doesn't -abide by the .htaccess. +abide by the *.htaccess*. If you would like to keep your views public it is also possible to move the views folder out of your application folder. After moving them, open your main index.php file and set the -$system_path, $application_folder and $view_folder variables, -preferably with a full path, e.g. '/www/MyUser/system'. +``$system_path``, ``$application_folder`` and ``$view_folder`` variables, +preferably with a full path, e.g. '*/www/MyUser/system*'. One additional measure to take in production environments is to disable PHP error reporting and any other development-only functionality. In -CodeIgniter, this can be done by setting the ENVIRONMENT constant, which +CodeIgniter, this can be done by setting the ``ENVIRONMENT`` constant, which is more fully described on the :doc:`security page <../general/security>`. diff --git a/user_guide_src/source/installation/troubleshooting.rst b/user_guide_src/source/installation/troubleshooting.rst index e874bb0ecc6..cca2907633d 100644 --- a/user_guide_src/source/installation/troubleshooting.rst +++ b/user_guide_src/source/installation/troubleshooting.rst @@ -5,11 +5,11 @@ Troubleshooting If you find that no matter what you put in your URL only your default page is loading, it might be that your server does not support the REQUEST_URI variable needed to serve search-engine friendly URLs. As a -first step, open your application/config/config.php file and look for +first step, open your *application/config/config.php* file and look for the URI Protocol information. It will recommend that you try a couple alternate settings. If it still doesn't work after you've tried this you'll need to force CodeIgniter to add a question mark to your URLs. To -do this open your **application/config/config.php** file and change this:: +do this open your *application/config/config.php* file and change this:: $config['index_page'] = "index.php"; diff --git a/user_guide_src/source/overview/at_a_glance.rst b/user_guide_src/source/overview/at_a_glance.rst index ce195c21104..b4db6b18bca 100644 --- a/user_guide_src/source/overview/at_a_glance.rst +++ b/user_guide_src/source/overview/at_a_glance.rst @@ -54,8 +54,8 @@ approach:: example.com/news/article/345 -Note: By default the index.php file is included in the URL but it can be -removed using a simple .htaccess file. +Note: By default the *index.php* file is included in the URL but it can be +removed using a simple *.htaccess* file. CodeIgniter Packs a Punch ========================= diff --git a/user_guide_src/source/tutorial/create_news_items.rst b/user_guide_src/source/tutorial/create_news_items.rst index bc0ce7612bc..e10eebd3bdd 100644 --- a/user_guide_src/source/tutorial/create_news_items.rst +++ b/user_guide_src/source/tutorial/create_news_items.rst @@ -14,7 +14,7 @@ To input data into the database you need to create a form where you can input the information to be stored. This means you'll be needing a form with two fields, one for the title and one for the text. You'll derive the slug from our title in the model. Create the new view at -application/views/news/create.php. +*application/views/news/create.php*. :: @@ -35,7 +35,7 @@ application/views/news/create.php. There are only two things here that probably look unfamiliar to you: the -form_open() function and the validation_errors() function. +``form_open()`` function and the ``validation_errors()`` function. The first function is provided by the :doc:`form helper <../helpers/form_helper>` and renders the form element and @@ -76,7 +76,7 @@ validation <../libraries/form_validation>` library to do this. The code above adds a lot of functionality. The first few lines load the form helper and the form validation library. After that, rules for the -form validation are set. The set\_rules() method takes three arguments; +form validation are set. The ``set\_rules()`` method takes three arguments; the name of the input field, the name to be used in error messages, and the rule. In this case the title and text fields are required. @@ -88,7 +88,7 @@ Continuing down, you can see a condition that checks whether the form validation ran successfully. If it did not, the form is displayed, if it was submitted **and** passed all the rules, the model is called. After this, a view is loaded to display a success message. Create a view at -application/views/news/success.php and write a success message. +*application/views/news/success.php* and write a success message. Model ----- @@ -123,19 +123,19 @@ sure everything is in lowercase characters. This leaves you with a nice slug, perfect for creating URIs. Let's continue with preparing the record that is going to be inserted -later, inside the $data array. Each element corresponds with a column in +later, inside the ``$data`` array. Each element corresponds with a column in the database table created earlier. You might notice a new method here, -namely the post() method from the :doc:`input +namely the ``post()`` method from the :doc:`input library <../libraries/input>`. This method makes sure the data is sanitized, protecting you from nasty attacks from others. The input -library is loaded by default. At last, you insert our $data array into +library is loaded by default. At last, you insert our ``$data`` array into our database. Routing ------- Before you can start adding news items into your CodeIgniter application -you have to add an extra rule to config/routes.php file. Make sure your +you have to add an extra rule to *config/routes.php* file. Make sure your file contains the following. This makes sure CodeIgniter sees 'create' as a method instead of a news item's slug. diff --git a/user_guide_src/source/tutorial/static_pages.rst b/user_guide_src/source/tutorial/static_pages.rst index 66621471e9d..569287c98a6 100644 --- a/user_guide_src/source/tutorial/static_pages.rst +++ b/user_guide_src/source/tutorial/static_pages.rst @@ -24,7 +24,7 @@ you'll see URL patterns that match: As URL schemes become more complex, this may change. But for now, this is all we will need to know. -Create a file at application/controllers/Pages.php with the following +Create a file at *application/controllers/Pages.php* with the following code. :: From c52ff48f7449b25719fde942757f6043a2d14dde Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 6 Feb 2016 15:27:15 +0200 Subject: [PATCH 4180/5397] [ci skip] Note adjustment in docs --- user_guide_src/source/overview/at_a_glance.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/overview/at_a_glance.rst b/user_guide_src/source/overview/at_a_glance.rst index b4db6b18bca..742d7bd0e47 100644 --- a/user_guide_src/source/overview/at_a_glance.rst +++ b/user_guide_src/source/overview/at_a_glance.rst @@ -54,8 +54,8 @@ approach:: example.com/news/article/345 -Note: By default the *index.php* file is included in the URL but it can be -removed using a simple *.htaccess* file. +.. note:: By default the *index.php* file is included in the URL but it can + be removed using a simple *.htaccess* file. CodeIgniter Packs a Punch ========================= From 9fee9e450372963e0869ed4fe034acebc74b7a81 Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Sun, 7 Feb 2016 21:33:46 +0200 Subject: [PATCH 4181/5397] hunanize() helper: Escaping the $separator argument. --- system/helpers/inflector_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index 96b723c8d16..c064d8de470 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -219,7 +219,7 @@ function underscore($str) */ function humanize($str, $separator = '_') { - return ucwords(preg_replace('/['.$separator.']+/', ' ', trim(MB_ENABLED ? mb_strtolower($str) : strtolower($str)))); + return ucwords(preg_replace('/['.preg_quote($separator).']+/', ' ', trim(MB_ENABLED ? mb_strtolower($str) : strtolower($str)))); } } From c65a37e21d87a27ac7dc397eac16b5f70aec064f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 8 Feb 2016 12:29:14 +0200 Subject: [PATCH 4182/5397] [ci skip] Add a changelog entry for PR #4437 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 6176875c739..a64a6c75a90 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -27,6 +27,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4430) - :doc:`File Uploading Library ` option **file_ext_tolower** didn't work. - Fixed a bug (#4431) - :doc:`Query Builder ` method ``join()`` discarded opening parentheses. - Fixed a bug (#4424) - :doc:`Session Library ` triggered a PHP warning when writing a newly created session with the 'redis' driver. +- Fixed a bug (#4437) - :doc:`Inflector Helper ` function :php:func:`humanize()` didn't escape its ``$separator`` parameter while using it in a regular expression. Version 3.0.4 ============= From dd149da93a2064937e490977343d152207b73815 Mon Sep 17 00:00:00 2001 From: Sai Phaninder Reddy Jonnala Date: Mon, 8 Feb 2016 09:32:24 -0500 Subject: [PATCH 4183/5397] code styling changes as suggested by @narfbg --- system/libraries/Form_validation.php | 36 ++++++++++++---------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index c37a734188a..da5ab4e0441 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -637,7 +637,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) // Set the message type $type = in_array('required', $rules) ? 'required' : 'isset'; - $line = $this->_get_raw_error_message($type, $row); + $line = $this->_get_error_message($type, $row["field"]); // Build the error message $message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label'])); @@ -808,7 +808,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) } else { - $line = $this->_get_raw_error_message($rule, $row); + $line = $this->_get_error_message($rule, $row["field"]); } // Is the parameter we are inserting into the error message the name @@ -839,40 +839,34 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) /** * Get the error message for the rule * - * @param string the rule name. - * @param array + * @param string $rule The rule name + * @param string $field + * * @return string */ - private function _get_raw_error_message($rule_name, $row) + protected function _get_error_message($rule, $field) { - $error_message = ''; // check if a custom message is defined through validation config row. - if (isset($this->_field_data[$row['field']]['errors'][$rule_name])) + if (isset($this->_field_data[$field]['errors'][$rule])) { - $error_message = $this->_field_data[$row['field']]['errors'][$rule_name]; + return $this->_field_data[$field]['errors'][$rule]; } // check if a custom message has been set using the set_message() function - elseif (isset($this->_error_messages[$rule_name])) + elseif (isset($this->_error_messages[$rule])) { - $error_message = $this->_error_messages[$rule_name]; + return $this->_error_messages[$rule]; } - // check if we have an error message in lang file - elseif (FALSE !== ($line_tmp = $this->CI->lang->line('form_validation_'.$rule_name))) + elseif (FALSE !== ($tmp = $this->CI->lang->line('form_validation_' . $rule))) { - $error_message = $line_tmp; + return $tmp; } // DEPRECATED support for non-prefixed keys, lang file again - elseif (FALSE !== ($line_tmp = $this->CI->lang->line($rule_name, FALSE))) - { - $error_message = $line_tmp; - } - // error message not found - else + elseif (FALSE !== ($tmp = $this->CI->lang->line($rule, FALSE))) { - $error_message = $this->CI->lang->line('form_validation_error_message_not_set').'('.$rule_name.')'; + return $tmp; } - return $error_message; + return $this->CI->lang->line('form_validation_error_message_not_set'). '(' . $rule . ')'; } // -------------------------------------------------------------------- From e9aad049553f4f276093a1a212a2f03f20cb337d Mon Sep 17 00:00:00 2001 From: Sai Phaninder Reddy Jonnala Date: Mon, 8 Feb 2016 16:42:37 -0500 Subject: [PATCH 4184/5397] Doc block formatting change. --- system/core/Log.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/system/core/Log.php b/system/core/Log.php index f338a36ec4a..34ac64a27a5 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -232,14 +232,13 @@ public function write_log($level, $msg) /** * Format the log line. * - * This is for extensibility of log formatting. - * If you want to change the log format, - * extend the CI_Log class and override this method. + * This is for extensibility of log formatting + * If you want to change the log format, extend the CI_Log class and override this method * * @param string $level The error level * @param string $date Formatted date string * @param string $msg The log message - * @return string formatted log line with a new line character '\n' at the end. + * @return string Formatted log line with a new line character '\n' at the end */ protected function _format_line($level, $date, $message) { From 7b31ac381409989580dbcab99d56be4024d14cb9 Mon Sep 17 00:00:00 2001 From: Damien Grandi Date: Tue, 9 Feb 2016 13:49:04 +0100 Subject: [PATCH 4185/5397] Update DB_query_builder.php - phpdoc (some incorrect return type) Edit of some return type in phpdoc. This can also help to fix some autocompletion troubles in some IDE. --- system/database/DB_query_builder.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index be7582815dd..cf2927b23ab 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1138,7 +1138,7 @@ public function group_by($by, $escape = NULL) * @param string $key * @param string $value * @param bool $escape - * @return object + * @return CI_DB_query_builder */ public function having($key, $value = NULL, $escape = NULL) { @@ -1155,7 +1155,7 @@ public function having($key, $value = NULL, $escape = NULL) * @param string $key * @param string $value * @param bool $escape - * @return object + * @return CI_DB_query_builder */ public function or_having($key, $value = NULL, $escape = NULL) { @@ -1339,7 +1339,7 @@ public function get_compiled_select($table = '', $reset = TRUE) * @param string the table * @param string the limit clause * @param string the offset clause - * @return object + * @return CI_DB_result */ public function get($table = '', $limit = NULL, $offset = NULL) { @@ -1422,7 +1422,7 @@ public function count_all_results($table = '', $reset = TRUE) * @param string $where * @param int $limit * @param int $offset - * @return object + * @return CI_DB_result */ public function get_where($table = '', $where = NULL, $limit = NULL, $offset = NULL) { @@ -1456,7 +1456,7 @@ public function get_where($table = '', $where = NULL, $limit = NULL, $offset = N * @param string $table Table to insert into * @param array $set An associative array of insert values * @param bool $escape Whether to escape values and identifiers - * @return int Number of rows inserted or FALSE on failure + * @return int|bool Number of rows inserted or FALSE on failure */ public function insert_batch($table, $set = NULL, $escape = NULL) { @@ -1618,7 +1618,7 @@ public function get_compiled_insert($table = '', $reset = TRUE) * @param string the table to insert data into * @param array an associative array of insert values * @param bool $escape Whether to escape values and identifiers - * @return object + * @return bool TRUE on success, FALSE on failure */ public function insert($table = '', $set = NULL, $escape = NULL) { @@ -1684,7 +1684,7 @@ protected function _validate_insert($table = '') * * @param string the table to replace data into * @param array an associative array of insert values - * @return object + * @return bool TRUE on success, FALSE on failure */ public function replace($table = '', $set = NULL) { @@ -1790,7 +1790,7 @@ public function get_compiled_update($table = '', $reset = TRUE) * @param array $set An associative array of update values * @param mixed $where * @param int $limit - * @return object + * @return bool TRUE on success, FALSE on failure */ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) { @@ -1863,7 +1863,7 @@ protected function _validate_update($table) * @param string the table to retrieve the results from * @param array an associative array of update values * @param string the where key - * @return int number of rows affected or FALSE on failure + * @return int|bool Number of rows affected or FALSE on failure */ public function update_batch($table, $set = NULL, $index = NULL) { @@ -2010,7 +2010,7 @@ public function set_update_batch($key, $index = '', $escape = NULL) * Compiles a delete string and runs "DELETE FROM table" * * @param string the table to empty - * @return object + * @return bool TRUE on success, FALSE on failure */ public function empty_table($table = '') { @@ -2043,7 +2043,7 @@ public function empty_table($table = '') * This function maps to "DELETE FROM table" * * @param string the table to truncate - * @return object + * @return bool TRUE on success, FALSE on failure */ public function truncate($table = '') { @@ -2114,7 +2114,7 @@ public function get_compiled_delete($table = '', $reset = TRUE) * @param mixed the where clause * @param mixed the limit clause * @param bool - * @return mixed + * @return CI_DB_query_builder|bool CI_DB_query_builder instance or FALSE on failure */ public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE) { From 8d6df5afde9b4c0eb29fcce233bc8e290378d557 Mon Sep 17 00:00:00 2001 From: Damien Grandi Date: Tue, 9 Feb 2016 18:09:46 +0100 Subject: [PATCH 4186/5397] Revert some previous changes --- system/database/DB_query_builder.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index cf2927b23ab..02be94d6659 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1456,7 +1456,7 @@ public function get_where($table = '', $where = NULL, $limit = NULL, $offset = N * @param string $table Table to insert into * @param array $set An associative array of insert values * @param bool $escape Whether to escape values and identifiers - * @return int|bool Number of rows inserted or FALSE on failure + * @return int Number of rows inserted or FALSE on failure */ public function insert_batch($table, $set = NULL, $escape = NULL) { @@ -1863,7 +1863,7 @@ protected function _validate_update($table) * @param string the table to retrieve the results from * @param array an associative array of update values * @param string the where key - * @return int|bool Number of rows affected or FALSE on failure + * @return int Number of rows affected or FALSE on failure */ public function update_batch($table, $set = NULL, $index = NULL) { @@ -2114,7 +2114,7 @@ public function get_compiled_delete($table = '', $reset = TRUE) * @param mixed the where clause * @param mixed the limit clause * @param bool - * @return CI_DB_query_builder|bool CI_DB_query_builder instance or FALSE on failure + * @return mixed */ public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE) { From a90c53e71d3dfac5372526363f8aaa0e1d30ad9e Mon Sep 17 00:00:00 2001 From: Damien Grandi Date: Tue, 9 Feb 2016 18:11:29 +0100 Subject: [PATCH 4187/5397] fix a typo edit --- system/database/DB_query_builder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 02be94d6659..00c5394e2ed 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1863,7 +1863,7 @@ protected function _validate_update($table) * @param string the table to retrieve the results from * @param array an associative array of update values * @param string the where key - * @return int Number of rows affected or FALSE on failure + * @return int number of rows affected or FALSE on failure */ public function update_batch($table, $set = NULL, $index = NULL) { From aec5126f5d554fb3b14cd8f37adf57339446d957 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 9 Feb 2016 21:11:07 +0200 Subject: [PATCH 4188/5397] Merge pull request #4445 from damiengrandi/develop [ci skip] Update QB phpdoc returns --- system/database/DB_query_builder.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 66ef913c90f..d6f35e0df66 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1137,7 +1137,7 @@ public function group_by($by, $escape = NULL) * @param string $key * @param string $value * @param bool $escape - * @return object + * @return CI_DB_query_builder */ public function having($key, $value = NULL, $escape = NULL) { @@ -1154,7 +1154,7 @@ public function having($key, $value = NULL, $escape = NULL) * @param string $key * @param string $value * @param bool $escape - * @return object + * @return CI_DB_query_builder */ public function or_having($key, $value = NULL, $escape = NULL) { @@ -1338,7 +1338,7 @@ public function get_compiled_select($table = '', $reset = TRUE) * @param string the table * @param string the limit clause * @param string the offset clause - * @return object + * @return CI_DB_result */ public function get($table = '', $limit = NULL, $offset = NULL) { @@ -1421,7 +1421,7 @@ public function count_all_results($table = '', $reset = TRUE) * @param string $where * @param int $limit * @param int $offset - * @return object + * @return CI_DB_result */ public function get_where($table = '', $where = NULL, $limit = NULL, $offset = NULL) { @@ -1617,7 +1617,7 @@ public function get_compiled_insert($table = '', $reset = TRUE) * @param string the table to insert data into * @param array an associative array of insert values * @param bool $escape Whether to escape values and identifiers - * @return object + * @return bool TRUE on success, FALSE on failure */ public function insert($table = '', $set = NULL, $escape = NULL) { @@ -1683,7 +1683,7 @@ protected function _validate_insert($table = '') * * @param string the table to replace data into * @param array an associative array of insert values - * @return object + * @return bool TRUE on success, FALSE on failure */ public function replace($table = '', $set = NULL) { @@ -1789,7 +1789,7 @@ public function get_compiled_update($table = '', $reset = TRUE) * @param array $set An associative array of update values * @param mixed $where * @param int $limit - * @return object + * @return bool TRUE on success, FALSE on failure */ public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) { @@ -2009,7 +2009,7 @@ public function set_update_batch($key, $index = '', $escape = NULL) * Compiles a delete string and runs "DELETE FROM table" * * @param string the table to empty - * @return object + * @return bool TRUE on success, FALSE on failure */ public function empty_table($table = '') { @@ -2042,7 +2042,7 @@ public function empty_table($table = '') * This function maps to "DELETE FROM table" * * @param string the table to truncate - * @return object + * @return bool TRUE on success, FALSE on failure */ public function truncate($table = '') { From 1ccc8bed6ed169356ef31397d9ae988a16cd9a63 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 9 Feb 2016 21:15:10 +0200 Subject: [PATCH 4189/5397] Merge pull request #4323 from jspreddy/sai/log_line_formatting_extensibility_change Refactored CI_Log line formatting to allow extensibility --- system/core/Log.php | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/system/core/Log.php b/system/core/Log.php index 72d3cfbae86..7c81d358b28 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -154,8 +154,8 @@ public function __construct() * * Generally this function will be called using the global log_message() function * - * @param string the error level: 'error', 'debug' or 'info' - * @param string the error message + * @param string $level The error level: 'error', 'debug' or 'info' + * @param string $msg The error message * @return bool */ public function write_log($level, $msg) @@ -204,7 +204,7 @@ public function write_log($level, $msg) $date = date($this->_date_fmt); } - $message .= $level.' - '.$date.' --> '.$msg."\n"; + $message .= $this->_format_line($level, $date, $msg); flock($fp, LOCK_EX); @@ -227,4 +227,21 @@ public function write_log($level, $msg) return is_int($result); } + // -------------------------------------------------------------------- + + /** + * Format the log line. + * + * This is for extensibility of log formatting + * If you want to change the log format, extend the CI_Log class and override this method + * + * @param string $level The error level + * @param string $date Formatted date string + * @param string $msg The log message + * @return string Formatted log line with a new line character '\n' at the end + */ + protected function _format_line($level, $date, $message) + { + return $level.' - '.$date.' --> '.$message."\n"; + } } From 37da3bd78530478b2bb2a23bc2144d50e1589313 Mon Sep 17 00:00:00 2001 From: Sai Phaninder Reddy Jonnala Date: Tue, 9 Feb 2016 16:09:57 -0500 Subject: [PATCH 4190/5397] Code formatting changes, again. I am bad at this. --- system/libraries/Form_validation.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index da5ab4e0441..097d7aabaa3 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -637,7 +637,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) // Set the message type $type = in_array('required', $rules) ? 'required' : 'isset'; - $line = $this->_get_error_message($type, $row["field"]); + $line = $this->_get_error_message($type, $row['field']); // Build the error message $message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label'])); @@ -808,7 +808,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) } else { - $line = $this->_get_error_message($rule, $row["field"]); + $line = $this->_get_error_message($rule, $row['field']); } // Is the parameter we are inserting into the error message the name @@ -840,8 +840,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) * Get the error message for the rule * * @param string $rule The rule name - * @param string $field - * + * @param string $field The field name * @return string */ protected function _get_error_message($rule, $field) @@ -856,7 +855,7 @@ protected function _get_error_message($rule, $field) { return $this->_error_messages[$rule]; } - elseif (FALSE !== ($tmp = $this->CI->lang->line('form_validation_' . $rule))) + elseif (FALSE !== ($tmp = $this->CI->lang->line('form_validation_'.$rule))) { return $tmp; } @@ -866,7 +865,7 @@ protected function _get_error_message($rule, $field) return $tmp; } - return $this->CI->lang->line('form_validation_error_message_not_set'). '(' . $rule . ')'; + return $this->CI->lang->line('form_validation_error_message_not_set').'('.$rule.')'; } // -------------------------------------------------------------------- From 39967987ebcc79fc867c1f7fa8d69cc65801f594 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 9 Feb 2016 23:34:04 +0200 Subject: [PATCH 4191/5397] Add CI_Log test cases --- tests/codeigniter/core/Log_test.php | 64 +++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 tests/codeigniter/core/Log_test.php diff --git a/tests/codeigniter/core/Log_test.php b/tests/codeigniter/core/Log_test.php new file mode 100644 index 00000000000..01e90f5fca2 --- /dev/null +++ b/tests/codeigniter/core/Log_test.php @@ -0,0 +1,64 @@ +setAccessible(TRUE); + $threshold = new ReflectionProperty('CI_Log', '_threshold'); + $threshold->setAccessible(TRUE); + $date_fmt = new ReflectionProperty('CI_Log', '_date_fmt'); + $date_fmt->setAccessible(TRUE); + $file_ext = new ReflectionProperty('CI_Log', '_file_ext'); + $file_ext->setAccessible(TRUE); + $file_perms = new ReflectionProperty('CI_Log', '_file_permissions'); + $file_perms->setAccessible(TRUE); + $enabled = new ReflectionProperty('CI_Log', '_enabled'); + $enabled->setAccessible(TRUE); + + $this->ci_set_config('log_path', '/root/'); + $this->ci_set_config('log_threshold', 'z'); + $this->ci_set_config('log_date_format', 'd.m.Y'); + $this->ci_set_config('log_file_extension', ''); + $this->ci_set_config('log_file_permissions', ''); + $instance = new CI_Log(); + + $this->assertEquals($path->getValue($instance), '/root/'); + $this->assertEquals($threshold->getValue($instance), 1); + $this->assertEquals($date_fmt->getValue($instance), 'd.m.Y'); + $this->assertEquals($file_ext->getValue($instance), 'php'); + $this->assertEquals($file_perms->getValue($instance), 0644); + $this->assertEquals($enabled->getValue($instance), FALSE); + + $this->ci_set_config('log_path', ''); + $this->ci_set_config('log_threshold', '0'); + $this->ci_set_config('log_date_format', ''); + $this->ci_set_config('log_file_extension', '.log'); + $this->ci_set_config('log_file_permissions', 0600); + $instance = new CI_Log(); + + $this->assertEquals($path->getValue($instance), APPPATH.'logs/'); + $this->assertEquals($threshold->getValue($instance), 0); + $this->assertEquals($date_fmt->getValue($instance), 'Y-m-d H:i:s'); + $this->assertEquals($file_ext->getValue($instance), 'log'); + $this->assertEquals($file_perms->getValue($instance), 0600); + $this->assertEquals($enabled->getValue($instance), TRUE); + } + + // -------------------------------------------------------------------- + + public function test_format_line() + { + $this->ci_set_config('log_path', ''); + $this->ci_set_config('log_threshold', 0); + $instance = new CI_Log(); + + $format_line = new ReflectionMethod($instance, '_format_line'); + $format_line->setAccessible(TRUE); + $this->assertEquals( + $format_line->invoke($instance, 'LEVEL', 'Timestamp', 'Message'), + "LEVEL - Timestamp --> Message\n" + ); + } +} \ No newline at end of file From 9a33f7833729005e2ffd40dea9c10268b1bc0fbe Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 9 Feb 2016 23:37:59 +0200 Subject: [PATCH 4192/5397] [ci skip] Whitespace --- tests/codeigniter/core/Log_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/codeigniter/core/Log_test.php b/tests/codeigniter/core/Log_test.php index 01e90f5fca2..d44cbac0fc8 100644 --- a/tests/codeigniter/core/Log_test.php +++ b/tests/codeigniter/core/Log_test.php @@ -17,7 +17,7 @@ public function test_configuration() $enabled = new ReflectionProperty('CI_Log', '_enabled'); $enabled->setAccessible(TRUE); - $this->ci_set_config('log_path', '/root/'); + $this->ci_set_config('log_path', '/root/'); $this->ci_set_config('log_threshold', 'z'); $this->ci_set_config('log_date_format', 'd.m.Y'); $this->ci_set_config('log_file_extension', ''); From 376ae77cb420df1bae8313d76bf0b01d5c523c48 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 9 Feb 2016 23:37:59 +0200 Subject: [PATCH 4193/5397] [ci skip] Whitespace --- tests/codeigniter/core/Log_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/codeigniter/core/Log_test.php b/tests/codeigniter/core/Log_test.php index 01e90f5fca2..d44cbac0fc8 100644 --- a/tests/codeigniter/core/Log_test.php +++ b/tests/codeigniter/core/Log_test.php @@ -17,7 +17,7 @@ public function test_configuration() $enabled = new ReflectionProperty('CI_Log', '_enabled'); $enabled->setAccessible(TRUE); - $this->ci_set_config('log_path', '/root/'); + $this->ci_set_config('log_path', '/root/'); $this->ci_set_config('log_threshold', 'z'); $this->ci_set_config('log_date_format', 'd.m.Y'); $this->ci_set_config('log_file_extension', ''); From 98c14ae881549c58298aef1d3f5ef7f88ff48d1e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 9 Feb 2016 23:43:55 +0200 Subject: [PATCH 4194/5397] Merge pull request #4342 from jspreddy/sai/form_validation_refactor Abstract error message fetching in Form_validation --- system/libraries/Form_validation.php | 66 +++++++++++++++------------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index ea3bc6de766..24b2d1fc432 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -637,21 +637,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) // Set the message type $type = in_array('required', $rules) ? 'required' : 'isset'; - // Check if a custom message is defined - if (isset($this->_field_data[$row['field']]['errors'][$type])) - { - $line = $this->_field_data[$row['field']]['errors'][$type]; - } - elseif (isset($this->_error_messages[$type])) - { - $line = $this->_error_messages[$type]; - } - elseif (FALSE === ($line = $this->CI->lang->line('form_validation_'.$type)) - // DEPRECATED support for non-prefixed keys - && FALSE === ($line = $this->CI->lang->line($type, FALSE))) - { - $line = 'The field was not set'; - } + $line = $this->_get_error_message($type, $row['field']); // Build the error message $message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label'])); @@ -820,23 +806,9 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) { $line = $this->CI->lang->line('form_validation_error_message_not_set').'(Anonymous function)'; } - // Check if a custom message is defined - elseif (isset($this->_field_data[$row['field']]['errors'][$rule])) - { - $line = $this->_field_data[$row['field']]['errors'][$rule]; - } - elseif ( ! isset($this->_error_messages[$rule])) - { - if (FALSE === ($line = $this->CI->lang->line('form_validation_'.$rule)) - // DEPRECATED support for non-prefixed keys - && FALSE === ($line = $this->CI->lang->line($rule, FALSE))) - { - $line = $this->CI->lang->line('form_validation_error_message_not_set').'('.$rule.')'; - } - } else { - $line = $this->_error_messages[$rule]; + $line = $this->_get_error_message($rule, $row['field']); } // Is the parameter we are inserting into the error message the name @@ -864,6 +836,40 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) // -------------------------------------------------------------------- + /** + * Get the error message for the rule + * + * @param string $rule The rule name + * @param string $field The field name + * @return string + */ + protected function _get_error_message($rule, $field) + { + // check if a custom message is defined through validation config row. + if (isset($this->_field_data[$field]['errors'][$rule])) + { + return $this->_field_data[$field]['errors'][$rule]; + } + // check if a custom message has been set using the set_message() function + elseif (isset($this->_error_messages[$rule])) + { + return $this->_error_messages[$rule]; + } + elseif (FALSE !== ($tmp = $this->CI->lang->line('form_validation_'.$rule))) + { + return $tmp; + } + // DEPRECATED support for non-prefixed keys, lang file again + elseif (FALSE !== ($tmp = $this->CI->lang->line($rule, FALSE))) + { + return $tmp; + } + + return $this->CI->lang->line('form_validation_error_message_not_set').'('.$rule.')'; + } + + // -------------------------------------------------------------------- + /** * Translate a field name * From b30a64a73057ad1253ae1f61f6cd8b125f64cc99 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 9 Feb 2016 23:46:25 +0200 Subject: [PATCH 4195/5397] Rename back a variable changed by the last PR merge Because. --- system/libraries/Form_validation.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 24b2d1fc432..296ddb92a3e 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -855,14 +855,14 @@ protected function _get_error_message($rule, $field) { return $this->_error_messages[$rule]; } - elseif (FALSE !== ($tmp = $this->CI->lang->line('form_validation_'.$rule))) + elseif (FALSE !== ($line = $this->CI->lang->line('form_validation_'.$rule))) { - return $tmp; + return $line; } // DEPRECATED support for non-prefixed keys, lang file again - elseif (FALSE !== ($tmp = $this->CI->lang->line($rule, FALSE))) + elseif (FALSE !== ($line = $this->CI->lang->line($rule, FALSE))) { - return $tmp; + return $line; } return $this->CI->lang->line('form_validation_error_message_not_set').'('.$rule.')'; From 24adbfc5e163de9da72f59e36be6c0ac02bf10c2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 9 Feb 2016 23:46:25 +0200 Subject: [PATCH 4196/5397] Rename back a variable changed by the last PR merge Because. --- system/libraries/Form_validation.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 24b2d1fc432..296ddb92a3e 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -855,14 +855,14 @@ protected function _get_error_message($rule, $field) { return $this->_error_messages[$rule]; } - elseif (FALSE !== ($tmp = $this->CI->lang->line('form_validation_'.$rule))) + elseif (FALSE !== ($line = $this->CI->lang->line('form_validation_'.$rule))) { - return $tmp; + return $line; } // DEPRECATED support for non-prefixed keys, lang file again - elseif (FALSE !== ($tmp = $this->CI->lang->line($rule, FALSE))) + elseif (FALSE !== ($line = $this->CI->lang->line($rule, FALSE))) { - return $tmp; + return $line; } return $this->CI->lang->line('form_validation_error_message_not_set').'('.$rule.')'; From c4de3c2f93cb6d2af65b325ae2812fccad7e98b8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 10 Feb 2016 07:41:43 +0200 Subject: [PATCH 4197/5397] [ci skip] Fix Memcached session lock handling and error checking around replace() usage --- .../drivers/Session_memcached_driver.php | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index d017dfb2f3e..e9246443caf 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -204,10 +204,16 @@ public function write($session_id, $session_data) if (isset($this->_lock_key)) { + $key = $this->_key_prefix.$session_id; + $this->_memcached->replace($this->_lock_key, time(), 300); if ($this->_fingerprint !== ($fingerprint = md5($session_data))) { - if ($this->_memcached->set($this->_key_prefix.$session_id, $session_data, $this->_config['expiration'])) + + if ( + $this->_memcached->replace($key, $session_data, $this->_config['expiration']) + OR ($this->_memcached->getResultCode() === Memcached::RES_NOTSTORED && $this->_memcached->set($key, $session_data, $this->_config['expiration'])) + ) { $this->_fingerprint = $fingerprint; return $this->_success; @@ -305,9 +311,12 @@ protected function _get_lock($session_id) // correct session ID. if ($this->_lock_key === $this->_key_prefix.$session_id.':lock') { - return ($this->_memcached->replace($this->_lock_key, time(), 300)) - ? $this->_success - : $this->_failure; + if ( ! $this->_memcached->replace($this->_lock_key, time(), 300)) + { + return ($this->_memcached->getResultCode() === Memcached::RES_NOTSTORED) + ? $this->_memcached->set($this->_lock_key, time(), 300) + : FALSE; + } } // 30 attempts to obtain a lock, in case another request already has it @@ -324,7 +333,7 @@ protected function _get_lock($session_id) if ( ! $this->_memcached->set($lock_key, time(), 300)) { log_message('error', 'Session: Error while trying to obtain lock for '.$this->_key_prefix.$session_id); - return $this->_failure; + return FALSE; } $this->_lock_key = $lock_key; @@ -335,11 +344,11 @@ protected function _get_lock($session_id) if ($attempt === 30) { log_message('error', 'Session: Unable to obtain lock for '.$this->_key_prefix.$session_id.' after 30 attempts, aborting.'); - return $this->_failure; + return FALSE; } $this->_lock = TRUE; - return $this->_success; + return TRUE; } // ------------------------------------------------------------------------ @@ -367,5 +376,4 @@ protected function _release_lock() return TRUE; } - -} +} \ No newline at end of file From d45cd5ab7d35f3c9b55414dc7709a0a41d91c0be Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 10 Feb 2016 07:50:19 +0200 Subject: [PATCH 4198/5397] [ci skip] Add changelog entry for latest commit --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a64a6c75a90..cd18599baab 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -28,6 +28,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4431) - :doc:`Query Builder ` method ``join()`` discarded opening parentheses. - Fixed a bug (#4424) - :doc:`Session Library ` triggered a PHP warning when writing a newly created session with the 'redis' driver. - Fixed a bug (#4437) - :doc:`Inflector Helper ` function :php:func:`humanize()` didn't escape its ``$separator`` parameter while using it in a regular expression. +- Fixed a bug where :doc:`Session Library ` didn't properly handle its locks' statuses with the 'memcached' driver. Version 3.0.4 ============= From a54a2b90bf057d7883ea7506d78a1073478ea4cf Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 10 Feb 2016 19:55:39 +0200 Subject: [PATCH 4199/5397] Fix a bug where CI_Session_memcached_driver doesn't write empty sessions Related: #3919 --- .../Session/drivers/Session_memcached_driver.php | 11 +++++++---- user_guide_src/source/changelog.rst | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index e9246443caf..ab3b1d97cd3 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -209,7 +209,6 @@ public function write($session_id, $session_data) $this->_memcached->replace($this->_lock_key, time(), 300); if ($this->_fingerprint !== ($fingerprint = md5($session_data))) { - if ( $this->_memcached->replace($key, $session_data, $this->_config['expiration']) OR ($this->_memcached->getResultCode() === Memcached::RES_NOTSTORED && $this->_memcached->set($key, $session_data, $this->_config['expiration'])) @@ -222,9 +221,13 @@ public function write($session_id, $session_data) return $this->_failure; } - return $this->_memcached->touch($this->_key_prefix.$session_id, $this->_config['expiration']) - ? $this->_success - : $this->_failure; + if ( + $this->_memcached->touch($key, $this->_config['expiration']) + OR ($this->_memcached->getResultCode() === Memcached::RES_NOTFOUND && $this->_memcached->set($key, $session_data, $this->_config['expiration'])) + ) + { + return $this->_success; + } } return $this->_failure; diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index cd18599baab..e9a265f764a 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -29,6 +29,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4424) - :doc:`Session Library ` triggered a PHP warning when writing a newly created session with the 'redis' driver. - Fixed a bug (#4437) - :doc:`Inflector Helper ` function :php:func:`humanize()` didn't escape its ``$separator`` parameter while using it in a regular expression. - Fixed a bug where :doc:`Session Library ` didn't properly handle its locks' statuses with the 'memcached' driver. +- Fixed a bug where :doc:`Session Library ` triggered a PHP warning when writing a newly created session with the 'memcached' driver. Version 3.0.4 ============= From 46adb9fdbc9604065dc7990bc61707446aa5cc81 Mon Sep 17 00:00:00 2001 From: Kristian Matthews Date: Thu, 11 Feb 2016 21:23:30 +0000 Subject: [PATCH 4200/5397] Autoload Driver Object Names Updated documentation for `$autoload['drivers']`. Updated loader to autoload drivers with object names the same as autoloading libraries. Signed-off-by: Kristian Matthews --- application/config/autoload.php | 5 +++++ system/core/Loader.php | 16 ++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/application/config/autoload.php b/application/config/autoload.php index 4bc6bf0ad80..aeacbdb66b8 100644 --- a/application/config/autoload.php +++ b/application/config/autoload.php @@ -72,6 +72,11 @@ | Prototype: | | $autoload['drivers'] = array('cache'); +| +| You can also supply an alternative library name to be assigned in +| the controller: +| +| $autoload['drivers'] = array('cache' => 'cch'); */ $autoload['drivers'] = array(); diff --git a/system/core/Loader.php b/system/core/Loader.php index 18e4c5287a9..dc61ed88246 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -688,9 +688,16 @@ public function driver($library, $params = NULL, $object_name = NULL) { if (is_array($library)) { - foreach ($library as $driver) + foreach ($library as $key => $value) { - $this->driver($driver); + if (is_int($key)) + { + $this->driver($value, $params); + } + else + { + $this->driver($key, $params, $value) + } } return $this; @@ -1304,10 +1311,7 @@ protected function _ci_autoloader() // Autoload drivers if (isset($autoload['drivers'])) { - foreach ($autoload['drivers'] as $item) - { - $this->driver($item); - } + $this->driver($autoload['drivers']); } // Load libraries From c6011941511e706c3a3d44151eccda7d0b472007 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 11 Feb 2016 23:49:37 +0200 Subject: [PATCH 4201/5397] Fix #4449 --- system/database/DB_query_builder.php | 60 +++++++++++-------- .../database/query_builder/join_test.php | 27 ++++++++- 2 files changed, 59 insertions(+), 28 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index d6f35e0df66..6bf039ead59 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -531,38 +531,46 @@ public function join($table, $cond, $type = '', $escape = NULL) is_bool($escape) OR $escape = $this->_protect_identifiers; - // Split multiple conditions - if ($escape === TRUE && preg_match_all('/\sAND\s|\sOR\s/i', $cond, $m, PREG_OFFSET_CAPTURE)) + if ( ! $this->_has_operator($cond)) { - $newcond = ''; - $m[0][] = array('', strlen($cond)); - - for ($i = 0, $c = count($m[0]), $s = 0; - $i < $c; - $s = $m[0][$i][1] + strlen($m[0][$i][0]), $i++) - { - $temp = substr($cond, $s, ($m[0][$i][1] - $s)); - $newcond .= preg_match("/(\(*)?([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $temp, $match) - ? $match[1].$this->protect_identifiers($match[2]).$match[3].$this->protect_identifiers($match[4]) - : $temp; - - $newcond .= $m[0][$i][0]; - } - - $cond = ' ON '.$newcond; - } - // Split apart the condition and protect the identifiers - elseif ($escape === TRUE && preg_match("/(\(*)?([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $cond, $match)) - { - $cond = ' ON '.$match[1].$this->protect_identifiers($match[2]).$match[3].$this->protect_identifiers($match[4]); + $cond = ' USING ('.($escape ? $this->escape_identifiers($cond) : $cond).')'; } - elseif ( ! $this->_has_operator($cond)) + elseif ($escape === FALSE) { - $cond = ' USING ('.($escape ? $this->escape_identifiers($cond) : $cond).')'; + $cond = ' ON '.$cond; } else { - $cond = ' ON '.$cond; + // Split multiple conditions + if (preg_match_all('/\sAND\s|\sOR\s/i', $cond, $joints, PREG_OFFSET_CAPTURE)) + { + $conditions = array(); + $joints = $joints[0]; + array_unshift($joints, array('', 0)); + + for ($i = count($joints) - 1, $pos = strlen($cond); $i >= 0; $i--) + { + $joints[$i][1] += strlen($joints[$i][0]); // offset + $conditions[$i] = substr($cond, $joints[$i][1], $pos - $joints[$i][1]); + $pos = $joints[$i][1] - strlen($joints[$i][0]); + $joints[$i] = $joints[$i][0]; + } + } + else + { + $conditions = array($cond); + $joints = array(''); + } + + $cond = ' ON '; + for ($i = 0, $c = count($conditions); $i < $c; $i++) + { + $operator = $this->_get_operator($conditions[$i]); + $cond .= $joints[$i]; + $cond .= preg_match("/(\(*)?([\[\]\w\.'-]+)".preg_quote($operator)."(.*)/i", $conditions[$i], $match) + ? $match[1].$this->protect_identifiers($match[2]).$operator.$this->protect_identifiers($match[3]) + : $conditions[$i]; + } } // Do we want to escape the table name? diff --git a/tests/codeigniter/database/query_builder/join_test.php b/tests/codeigniter/database/query_builder/join_test.php index 58cb2149223..54b2a4e1863 100644 --- a/tests/codeigniter/database/query_builder/join_test.php +++ b/tests/codeigniter/database/query_builder/join_test.php @@ -37,6 +37,29 @@ public function test_join_simple() // ------------------------------------------------------------------------ + public function test_join_escape_is_null() + { + $expected = 'SELECT '.$this->db->escape_identifiers('field') + ."\nFROM ".$this->db->escape_identifiers('table1') + ."\nJOIN ".$this->db->escape_identifiers('table2').' ON '.$this->db->escape_identifiers('field').' IS NULL'; + + $this->assertEquals( + $expected, + $this->db->select('field')->from('table1')->join('table2', 'field IS NULL')->get_compiled_select() + ); + + $expected = 'SELECT '.$this->db->escape_identifiers('field') + ."\nFROM ".$this->db->escape_identifiers('table1') + ."\nJOIN ".$this->db->escape_identifiers('table2').' ON '.$this->db->escape_identifiers('field').' IS NOT NULL'; + + $this->assertEquals( + $expected, + $this->db->select('field')->from('table1')->join('table2', 'field IS NOT NULL')->get_compiled_select() + ); + } + + // ------------------------------------------------------------------------ + public function test_join_escape_multiple_conditions() { // We just need a valid query produced, not one that makes sense @@ -65,11 +88,11 @@ public function test_join_escape_multiple_conditions_with_parentheses() $expected = 'SELECT '.implode(', ', $fields) ."\nFROM ".$this->db->escape_identifiers('table1') ."\nRIGHT JOIN ".$this->db->escape_identifiers('table2').' ON '.implode(' = ', $fields) - .' AND ('.$fields[0]." = 'foo' OR ".$fields[1].' = 0)'; + .' AND ('.$fields[0]." = 'foo' OR ".$fields[1].' IS NULL)'; $result = $this->db->select('table1.field1, table2.field2') ->from('table1') - ->join('table2', "table1.field1 = table2.field2 AND (table1.field1 = 'foo' OR table2.field2 = 0)", 'RIGHT') + ->join('table2', "table1.field1 = table2.field2 AND (table1.field1 = 'foo' OR table2.field2 IS NULL)", 'RIGHT') ->get_compiled_select(); $this->assertEquals($expected, $result); From 9198ad04ba27803ce9f924bbd753fad36122fb5a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 12 Feb 2016 00:07:31 +0200 Subject: [PATCH 4202/5397] [ci skip] Add changelog entry for issue #4449 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e9a265f764a..ba9f93860c5 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -30,6 +30,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4437) - :doc:`Inflector Helper ` function :php:func:`humanize()` didn't escape its ``$separator`` parameter while using it in a regular expression. - Fixed a bug where :doc:`Session Library ` didn't properly handle its locks' statuses with the 'memcached' driver. - Fixed a bug where :doc:`Session Library ` triggered a PHP warning when writing a newly created session with the 'memcached' driver. +- Fixed a bug (#4449) - :doc:`Query Builder ` method ``join()`` breaks conditions containing ``IS NULL``, ``IS NOT NULL``. Version 3.0.4 ============= From 7730dbebab54e6533a30f93c43311039b89c5760 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 12 Feb 2016 00:09:23 +0200 Subject: [PATCH 4203/5397] Skip CI_Log tests on PHP 5.2 We still run those (with failures enabled) and that test breaks them --- tests/codeigniter/core/Log_test.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/codeigniter/core/Log_test.php b/tests/codeigniter/core/Log_test.php index d44cbac0fc8..2dd9d90d219 100644 --- a/tests/codeigniter/core/Log_test.php +++ b/tests/codeigniter/core/Log_test.php @@ -1,9 +1,13 @@ markTestSkipped("PHP 5.2 doesn't have ReflectionProperty::setAccessible() and can't run this test"); + } + $path = new ReflectionProperty('CI_Log', '_log_path'); $path->setAccessible(TRUE); $threshold = new ReflectionProperty('CI_Log', '_threshold'); @@ -50,6 +54,11 @@ public function test_configuration() public function test_format_line() { + if ( ! is_php('5.3')) + { + return $this->markTestSkipped("PHP 5.2 doesn't have ReflectionProperty::setAccessible() and can't run this test"); + } + $this->ci_set_config('log_path', ''); $this->ci_set_config('log_threshold', 0); $instance = new CI_Log(); From 0d181ee540749c3a5dc147b1e280b7515d1b360e Mon Sep 17 00:00:00 2001 From: Kristian Matthews Date: Fri, 12 Feb 2016 12:13:04 +0000 Subject: [PATCH 4204/5397] Fixed syntax error. Signed-off-by: Kristian Matthews --- system/core/Loader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index dc61ed88246..b9f5a52c7c9 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -696,7 +696,7 @@ public function driver($library, $params = NULL, $object_name = NULL) } else { - $this->driver($key, $params, $value) + $this->driver($key, $params, $value); } } From 1be0f05e3f70a369e9e3e5153d0f786c0d2dface Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 12 Feb 2016 22:31:15 +0100 Subject: [PATCH 4205/5397] return false when image isn't valid --- system/language/english/imglib_lang.php | 1 + system/libraries/Image_lib.php | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/system/language/english/imglib_lang.php b/system/language/english/imglib_lang.php index 7f23233b4f7..0f3ba0f5999 100644 --- a/system/language/english/imglib_lang.php +++ b/system/language/english/imglib_lang.php @@ -51,6 +51,7 @@ $lang['imglib_image_process_failed'] = 'Image processing failed. Please verify that your server supports the chosen protocol and that the path to your image library is correct.'; $lang['imglib_rotation_angle_required'] = 'An angle of rotation is required to rotate the image.'; $lang['imglib_invalid_path'] = 'The path to the image is not correct.'; +$lang['imglib_invalid_image'] = 'The provided image is not valid.'; $lang['imglib_copy_failed'] = 'The image copy routine failed.'; $lang['imglib_missing_font'] = 'Unable to find a font to use.'; $lang['imglib_save_failed'] = 'Unable to save the image. Please make sure the image and file directory are writable.'; diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index f594b712580..e3e87f93f19 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -1641,6 +1641,11 @@ public function get_image_properties($path = '', $return = FALSE) } $vals = getimagesize($path); + if ($vals === FALSE) + { + $this->set_error('imglib_invalid_image'); + return FALSE; + } $types = array(1 => 'gif', 2 => 'jpeg', 3 => 'png'); $mime = (isset($types[$vals[2]])) ? 'image/'.$types[$vals[2]] : 'image/jpg'; From 8215e2fcf828964b232e9f48befac4f08fa11187 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 11 Feb 2016 20:30:43 +0200 Subject: [PATCH 4206/5397] [ci skip] Fix Memcached replace() result code checks in CI_Session Related #3919 --- system/libraries/Session/drivers/Session_memcached_driver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index ab3b1d97cd3..875e72255d5 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -211,7 +211,7 @@ public function write($session_id, $session_data) { if ( $this->_memcached->replace($key, $session_data, $this->_config['expiration']) - OR ($this->_memcached->getResultCode() === Memcached::RES_NOTSTORED && $this->_memcached->set($key, $session_data, $this->_config['expiration'])) + OR ($this->_memcached->getResultCode() === Memcached::RES_NOTFOUND && $this->_memcached->set($key, $session_data, $this->_config['expiration'])) ) { $this->_fingerprint = $fingerprint; @@ -316,7 +316,7 @@ protected function _get_lock($session_id) { if ( ! $this->_memcached->replace($this->_lock_key, time(), 300)) { - return ($this->_memcached->getResultCode() === Memcached::RES_NOTSTORED) + return ($this->_memcached->getResultCode() === Memcached::RES_NOTFOUND) ? $this->_memcached->set($this->_lock_key, time(), 300) : FALSE; } From a6d1c538f61ce12216eef7bb92716e24af0b86bf Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 15 Feb 2016 14:09:48 +0200 Subject: [PATCH 4207/5397] Don't apply url_suffix, permitted_uri_chars to CLI requests Close #4085 Close #4460 --- system/core/URI.php | 118 ++++++++++-------- user_guide_src/source/changelog.rst | 4 + .../source/installation/upgrade_310.rst | 15 ++- 3 files changed, 86 insertions(+), 51 deletions(-) diff --git a/system/core/URI.php b/system/core/URI.php index 544f6c85f0d..79cf640b973 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -100,41 +100,36 @@ public function __construct() { $this->config =& load_class('Config', 'core'); + // If it's a CLI request, ignore the configuration + if (is_cli()) + { + $this->_set_uri_string($this->_parse_argv(), TRUE); + } // If query strings are enabled, we don't need to parse any segments. - // However, they don't make sense under CLI. - if (is_cli() OR $this->config->item('enable_query_strings') !== TRUE) + elseif ($this->config->item('enable_query_strings') !== TRUE) { $this->_permitted_uri_chars = $this->config->item('permitted_uri_chars'); + $protocol = $this->config->item('uri_protocol'); + empty($protocol) && $protocol = 'REQUEST_URI'; - // If it's a CLI request, ignore the configuration - if (is_cli()) + switch ($protocol) { - $uri = $this->_parse_argv(); + case 'AUTO': // For BC purposes only + case 'REQUEST_URI': + $uri = $this->_parse_request_uri(); + break; + case 'QUERY_STRING': + $uri = $this->_parse_query_string(); + break; + case 'PATH_INFO': + default: + $uri = isset($_SERVER[$protocol]) + ? $_SERVER[$protocol] + : $this->_parse_request_uri(); + break; } - else - { - $protocol = $this->config->item('uri_protocol'); - empty($protocol) && $protocol = 'REQUEST_URI'; - switch ($protocol) - { - case 'AUTO': // For BC purposes only - case 'REQUEST_URI': - $uri = $this->_parse_request_uri(); - break; - case 'QUERY_STRING': - $uri = $this->_parse_query_string(); - break; - case 'PATH_INFO': - default: - $uri = isset($_SERVER[$protocol]) - ? $_SERVER[$protocol] - : $this->_parse_request_uri(); - break; - } - } - - $this->_set_uri_string($uri); + $this->_set_uri_string($uri, FALSE); } log_message('info', 'URI Class Initialized'); @@ -145,43 +140,66 @@ public function __construct() /** * Set URI String * - * @param string $str + * @param string $str Input URI string + * @param bool $is_cli Whether the input comes from CLI * @return void */ - protected function _set_uri_string($str) + protected function _set_uri_string($str, $is_cli = FALSE) { - // Filter out control characters and trim slashes - $this->uri_string = trim(remove_invisible_characters($str, FALSE), '/'); - - if ($this->uri_string !== '') + // CLI requests have a bit simpler logic + if ($is_cli) { - // Remove the URL suffix, if present - if (($suffix = (string) $this->config->item('url_suffix')) !== '') + if (($this->uri_string = trim($str, '/')) === '') { - $slen = strlen($suffix); - - if (substr($this->uri_string, -$slen) === $suffix) - { - $this->uri_string = substr($this->uri_string, 0, -$slen); - } + return; } $this->segments[0] = NULL; - // Populate the segments array - foreach (explode('/', trim($this->uri_string, '/')) as $val) + foreach (explode('/', $this->uri_string) as $segment) { - $val = trim($val); - // Filter segments for security - $this->filter_uri($val); - - if ($val !== '') + if (($segment = trim($segment)) !== '') { - $this->segments[] = $val; + $this->segments[] = $segment; } } unset($this->segments[0]); + return; + } + + // Filter out control characters and trim slashes + $this->uri_string = trim(remove_invisible_characters($str, FALSE), '/'); + + if ($this->uri_string === '') + { + return; } + + // Remove the URL suffix, if present + if (($suffix = (string) $this->config->item('url_suffix')) !== '') + { + $slen = strlen($suffix); + + if (substr($this->uri_string, -$slen) === $suffix) + { + $this->uri_string = substr($this->uri_string, 0, -$slen); + } + } + + $this->segments[0] = NULL; + foreach (explode('/', trim($this->uri_string, '/')) as $segment) + { + $segment = trim($segment); + // Filter segments for security + $this->filter_uri($segment); + + if ($segment !== '') + { + $this->segments[] = $segment; + } + } + + unset($this->segments[0]); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d490f15048a..8e1789fb9c4 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,10 @@ Version 3.1.0 Release Date: Not Released +- Core + + - Changed :doc:`URI Library ` to ignore the ``$config['url_suffix']``, ``$config['permitted_uri_chars']`` configuration settings for CLI requests. + - Libraries - Added UNIX socket connection support to :doc:`Session Library ` 'redis' driver. diff --git a/user_guide_src/source/installation/upgrade_310.rst b/user_guide_src/source/installation/upgrade_310.rst index b86bb1da3c6..a6e6bae7e58 100644 --- a/user_guide_src/source/installation/upgrade_310.rst +++ b/user_guide_src/source/installation/upgrade_310.rst @@ -58,7 +58,20 @@ That doesn't make sense and that's the reason why most database drivers don't support it at all. Thus, ``db_set_charset()`` is no longer necessary and is removed. -Step 3: Check usage of doctype() HTML helper +Step 3: Check logic related to URI parsing of CLI requests +========================================================== + +When running a CodeIgniter application from the CLI, the +:doc:`URI Library ` will now ignore the +``$config['url_suffix']`` and ``$config['permitted_uri_chars']`` +configuration settings. + +These two options don't make sense under the command line (which is why +this change was made) and therefore you shouldn't be affected by this, but +if you've relied on them for some reason, you'd probably have to make some +changes to your code. + +Step 4: Check usage of doctype() HTML helper ============================================ The :doc:`HTML Helper <../helpers/html_helper>` function From 2426635afc58f7bbf8355e80d4228076321a669d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 15 Feb 2016 14:21:13 +0200 Subject: [PATCH 4208/5397] [ci skip] Add notes in config about CLI for url_suffix, permitted_uri_chars --- application/config/config.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/application/config/config.php b/application/config/config.php index 23ef5a528c7..0a7b8202be6 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -63,6 +63,8 @@ | For more information please see the user guide: | | https://codeigniter.com/user_guide/general/urls.html +| +| Note: This option is ignored for CLI requests. */ $config['url_suffix'] = ''; @@ -157,6 +159,8 @@ | | DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!! | +| Note: This option is ignored for CLI requests. +| */ $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-'; From 2a34081c5e1b8a86d2d3f87c3da69b9d580d6027 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 15 Feb 2016 14:33:34 +0200 Subject: [PATCH 4209/5397] Pass CI_Config as a parameter to CI_URI constructor --- system/core/CodeIgniter.php | 2 +- system/core/URI.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 14f62edaa7c..84f2241233c 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -298,7 +298,7 @@ * Instantiate the URI class * ------------------------------------------------------ */ - $URI =& load_class('URI', 'core'); + $URI =& load_class('URI', 'core', $CFG); /* * ------------------------------------------------------ diff --git a/system/core/URI.php b/system/core/URI.php index 79cf640b973..7c93e36b722 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -96,9 +96,9 @@ class CI_URI { * * @return void */ - public function __construct() + public function __construct(CI_Config &$config) { - $this->config =& load_class('Config', 'core'); + $this->config = $config; // If it's a CLI request, ignore the configuration if (is_cli()) From 02fde67322db74df42ef8dc953cc2be3f9fc4ccd Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 15 Feb 2016 14:35:37 +0200 Subject: [PATCH 4210/5397] Remove reference usage from last commit ... it's useless --- system/core/URI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/URI.php b/system/core/URI.php index 7c93e36b722..7f07bfe1e4b 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -96,7 +96,7 @@ class CI_URI { * * @return void */ - public function __construct(CI_Config &$config) + public function __construct(CI_Config $config) { $this->config = $config; From a7bd30c75e844f133b6aa8aae7c64e6cf9ce143a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 15 Feb 2016 14:39:59 +0200 Subject: [PATCH 4211/5397] [ci skip] Polish changes from PR #4453 --- application/config/autoload.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/application/config/autoload.php b/application/config/autoload.php index aeacbdb66b8..7cdc9013c11 100644 --- a/application/config/autoload.php +++ b/application/config/autoload.php @@ -73,10 +73,11 @@ | | $autoload['drivers'] = array('cache'); | -| You can also supply an alternative library name to be assigned in +| You can also supply an alternative property name to be assigned in | the controller: | -| $autoload['drivers'] = array('cache' => 'cch'); +| $autoload['drivers'] = array('cache' => 'cch'); +| */ $autoload['drivers'] = array(); From 44d3b185ae7a15e50bd595440187c6c863a13415 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 15 Feb 2016 14:37:14 +0200 Subject: [PATCH 4212/5397] Merge pull request #4453 from EpicKris/feature/Autoload-Driver-Object-Name Autoload Driver Object Names --- application/config/autoload.php | 5 +++++ system/core/Loader.php | 16 ++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/application/config/autoload.php b/application/config/autoload.php index 4bc6bf0ad80..aeacbdb66b8 100644 --- a/application/config/autoload.php +++ b/application/config/autoload.php @@ -72,6 +72,11 @@ | Prototype: | | $autoload['drivers'] = array('cache'); +| +| You can also supply an alternative library name to be assigned in +| the controller: +| +| $autoload['drivers'] = array('cache' => 'cch'); */ $autoload['drivers'] = array(); diff --git a/system/core/Loader.php b/system/core/Loader.php index 37d1ecaf946..80de804ead1 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -718,9 +718,16 @@ public function driver($library, $params = NULL, $object_name = NULL) { if (is_array($library)) { - foreach ($library as $driver) + foreach ($library as $key => $value) { - $this->driver($driver); + if (is_int($key)) + { + $this->driver($value, $params); + } + else + { + $this->driver($key, $params, $value); + } } return $this; @@ -1334,10 +1341,7 @@ protected function _ci_autoloader() // Autoload drivers if (isset($autoload['drivers'])) { - foreach ($autoload['drivers'] as $item) - { - $this->driver($item); - } + $this->driver($autoload['drivers']); } // Load libraries From 5fd4afdecba772d5f38254cb57a845b2fd607d82 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 15 Feb 2016 14:39:59 +0200 Subject: [PATCH 4213/5397] [ci skip] Polish changes from PR #4453 --- application/config/autoload.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/application/config/autoload.php b/application/config/autoload.php index aeacbdb66b8..7cdc9013c11 100644 --- a/application/config/autoload.php +++ b/application/config/autoload.php @@ -73,10 +73,11 @@ | | $autoload['drivers'] = array('cache'); | -| You can also supply an alternative library name to be assigned in +| You can also supply an alternative property name to be assigned in | the controller: | -| $autoload['drivers'] = array('cache' => 'cch'); +| $autoload['drivers'] = array('cache' => 'cch'); +| */ $autoload['drivers'] = array(); From 82efb383544dc06aef7c628780b74acac31fb622 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 15 Feb 2016 14:43:06 +0200 Subject: [PATCH 4214/5397] [ci skip] Add changelog entry for PR #4453 --- user_guide_src/source/changelog.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ba9f93860c5..6bbd7f9e9ce 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,10 @@ Version 3.0.5 Release Date: Not Released +- Core + + - Changed :doc:`Loader Library ` to allow ``$autoload['drivers']`` assigning with custom property names. + - :doc:`Query Builder ` - Added a ``$batch_size`` parameter to the ``insert_batch()`` method (defaults to 100). From 86d2ec40b47f885a6d7e28b9dd519fac3332e7ae Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 17 Feb 2016 19:19:56 +0200 Subject: [PATCH 4215/5397] [ci skip] Update docs to reflect escape_like_str() usage with ESCAPE '\!' Closes #4462 --- user_guide_src/source/database/db_driver_reference.rst | 7 +++++++ user_guide_src/source/database/queries.rst | 8 +++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/database/db_driver_reference.rst b/user_guide_src/source/database/db_driver_reference.rst index 1e436ede18d..1ecd389688a 100644 --- a/user_guide_src/source/database/db_driver_reference.rst +++ b/user_guide_src/source/database/db_driver_reference.rst @@ -234,6 +234,13 @@ This article is intended to be a reference for them. and ``_`` wildcard characters, so that they don't cause false-positives in LIKE conditions. + .. important:: The ``escape_like_str()`` method uses '!' (exclamation mark) + to escape special characters for *LIKE* conditions. Because this + method escapes partial strings that you would wrap in quotes + yourself, it cannot automatically add the ``ESCAPE '!'`` + condition for you, and so you'll have to manually do that. + + .. php:method:: primary($table) :param string $table: Table name diff --git a/user_guide_src/source/database/queries.rst b/user_guide_src/source/database/queries.rst index 43a0a30bf03..d4ffd16cfcc 100644 --- a/user_guide_src/source/database/queries.rst +++ b/user_guide_src/source/database/queries.rst @@ -123,7 +123,13 @@ this: $search = '20% raise'; $sql = "SELECT id FROM table WHERE column LIKE '%" . - $this->db->escape_like_str($search)."%'"; + $this->db->escape_like_str($search)."%' ESCAPE '!'"; + +.. important:: The ``escape_like_str()`` method uses '!' (exclamation mark) + to escape special characters for *LIKE* conditions. Because this + method escapes partial strings that you would wrap in quotes + yourself, it cannot automatically add the ``ESCAPE '!'`` + condition for you, and so you'll have to manually do that. ************** From 6f1342986a2954daa331b0a849e8a6817e5e1920 Mon Sep 17 00:00:00 2001 From: vibbow Date: Sat, 20 Feb 2016 17:30:48 +0000 Subject: [PATCH 4216/5397] Update CodeIgniter.php Declare get_instance() return type --- system/core/CodeIgniter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 84f2241233c..3d8ae7e8746 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -359,7 +359,7 @@ * * Returns current CI instance object * - * @return object + * @return CI_Controller object */ function &get_instance() { From 7230d5dea1e2fa6b242df2b840ad2dc54f0306b0 Mon Sep 17 00:00:00 2001 From: versalle88 Date: Tue, 23 Feb 2016 11:44:35 -0500 Subject: [PATCH 4217/5397] Changed calls to class_exists to ignore __autoload() to match other calls --- system/core/Loader.php | 2 +- system/libraries/Session/Session.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index 80de804ead1..62781a7bf9f 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -321,7 +321,7 @@ public function model($model, $name = '', $db_conn = FALSE) } $model = ucfirst($model); - if ( ! class_exists($model)) + if ( ! class_exists($model, FALSE)) { foreach ($this->_ci_model_paths as $mod_path) { diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index b93c00c156b..c6413c102a2 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -231,7 +231,7 @@ interface_exists('SessionHandlerInterface', FALSE) OR require_once(BASEPATH.'lib } } - if ( ! class_exists($prefix.$class) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php')) + if ( ! class_exists($prefix.$class, FAlSE) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php')) { require_once($file_path); if (class_exists($prefix.$class, FALSE)) From 17c52eaef97a58545004b49141689ef612c9456c Mon Sep 17 00:00:00 2001 From: versalle88 Date: Tue, 23 Feb 2016 11:46:08 -0500 Subject: [PATCH 4218/5397] Changed calls to class_exists to ignore __autoload() to match other calls --- system/libraries/Session/Session.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index c6413c102a2..77c56ae7003 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -231,7 +231,7 @@ interface_exists('SessionHandlerInterface', FALSE) OR require_once(BASEPATH.'lib } } - if ( ! class_exists($prefix.$class, FAlSE) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php')) + if ( ! class_exists($prefix.$class, FALSE) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php')) { require_once($file_path); if (class_exists($prefix.$class, FALSE)) From 1e4e75421ec0fd00b75de1b34ca60d84b300e050 Mon Sep 17 00:00:00 2001 From: versalle88 Date: Tue, 23 Feb 2016 11:47:45 -0500 Subject: [PATCH 4219/5397] Removed --- system/libraries/Session/Session.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index 77c56ae7003..b93c00c156b 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -231,7 +231,7 @@ interface_exists('SessionHandlerInterface', FALSE) OR require_once(BASEPATH.'lib } } - if ( ! class_exists($prefix.$class, FALSE) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php')) + if ( ! class_exists($prefix.$class) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php')) { require_once($file_path); if (class_exists($prefix.$class, FALSE)) From 82d5c231d55aa290a2739d01055a9b8e6c8243a6 Mon Sep 17 00:00:00 2001 From: versalle88 Date: Tue, 23 Feb 2016 11:48:04 -0500 Subject: [PATCH 4220/5397] Fixed typo --- system/libraries/Session/Session.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index b93c00c156b..77c56ae7003 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -231,7 +231,7 @@ interface_exists('SessionHandlerInterface', FALSE) OR require_once(BASEPATH.'lib } } - if ( ! class_exists($prefix.$class) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php')) + if ( ! class_exists($prefix.$class, FALSE) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php')) { require_once($file_path); if (class_exists($prefix.$class, FALSE)) From 738b9e30404a56a8e2e8053f024550232b72ea09 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 24 Feb 2016 12:14:10 +0200 Subject: [PATCH 4221/5397] Merge pull request #4480 from versalle88/develop Changed class_exists() calls to ignore __autoload() --- system/core/Loader.php | 2 +- system/libraries/Session/Session.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index 80de804ead1..62781a7bf9f 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -321,7 +321,7 @@ public function model($model, $name = '', $db_conn = FALSE) } $model = ucfirst($model); - if ( ! class_exists($model)) + if ( ! class_exists($model, FALSE)) { foreach ($this->_ci_model_paths as $mod_path) { diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index b93c00c156b..77c56ae7003 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -231,7 +231,7 @@ interface_exists('SessionHandlerInterface', FALSE) OR require_once(BASEPATH.'lib } } - if ( ! class_exists($prefix.$class) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php')) + if ( ! class_exists($prefix.$class, FALSE) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php')) { require_once($file_path); if (class_exists($prefix.$class, FALSE)) From fa34429e85b4bf452ba595072124a884ca3e8b89 Mon Sep 17 00:00:00 2001 From: sprakash4 Date: Fri, 26 Feb 2016 16:02:07 -0800 Subject: [PATCH 4222/5397] Downgraded log level for some pesky messages to INFO --- system/core/Config.php | 2 +- system/core/Input.php | 2 +- system/core/Output.php | 4 ++-- system/core/Utf8.php | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/system/core/Config.php b/system/core/Config.php index ca6fb379371..5c6ba2a4d17 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -169,7 +169,7 @@ public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE $this->is_loaded[] = $file_path; $config = NULL; $loaded = TRUE; - log_message('debug', 'Config file loaded: '.$file_path); + log_message('info', 'Config file loaded: '.$file_path); } } diff --git a/system/core/Input.php b/system/core/Input.php index a7c9ecd0d74..59b39620c5d 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -653,7 +653,7 @@ protected function _sanitize_globals() // Sanitize PHP_SELF $_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); - log_message('debug', 'Global POST, GET and COOKIE data sanitized'); + log_message('info', 'Global POST, GET and COOKIE data sanitized'); } // -------------------------------------------------------------------- diff --git a/system/core/Output.php b/system/core/Output.php index ec9c21b9177..6e0b4e724ea 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -492,7 +492,7 @@ public function _display($output = '') echo $output; log_message('info', 'Final output sent to browser'); - log_message('debug', 'Total execution time: '.$elapsed); + log_message('info', 'Total execution time: '.$elapsed); return; } @@ -529,7 +529,7 @@ public function _display($output = '') } log_message('info', 'Final output sent to browser'); - log_message('debug', 'Total execution time: '.$elapsed); + log_message('info', 'Total execution time: '.$elapsed); } // -------------------------------------------------------------------- diff --git a/system/core/Utf8.php b/system/core/Utf8.php index f2f42e6ca6c..93c61167501 100644 --- a/system/core/Utf8.php +++ b/system/core/Utf8.php @@ -66,12 +66,12 @@ public function __construct() ) { define('UTF8_ENABLED', TRUE); - log_message('debug', 'UTF-8 Support Enabled'); + log_message('info', 'UTF-8 Support Enabled'); } else { define('UTF8_ENABLED', FALSE); - log_message('debug', 'UTF-8 Support Disabled'); + log_message('info', 'UTF-8 Support Disabled'); } log_message('info', 'Utf8 Class Initialized'); From b89f5d3ddfc897f0afc4f15a0993f8f1b2b56b88 Mon Sep 17 00:00:00 2001 From: roastduck Date: Sun, 28 Feb 2016 10:18:19 +0800 Subject: [PATCH 4223/5397] clean current lock key in redis session driver set $this->_lock_key to NULL after close Signed-off-by: roastduck --- system/libraries/Session/drivers/Session_redis_driver.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index dc4328644b4..5081bd5d47f 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -278,6 +278,7 @@ public function close() if ($this->_redis->ping() === '+PONG') { isset($this->_lock_key) && $this->_redis->delete($this->_lock_key); + $this->_lock_key = NULL; if ($this->_redis->close() === $this->_failure) { return $this->_failure; From 9d1c16a8ccbfe555e5646b4a08c47d26dc36a33c Mon Sep 17 00:00:00 2001 From: Claudio Galdiolo Date: Mon, 29 Feb 2016 09:36:20 -0500 Subject: [PATCH 4224/5397] [ci skip] fix comment --- system/database/DB_query_builder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index d6f35e0df66..eb9620f1637 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -2342,7 +2342,7 @@ protected function _compile_select($select_override = FALSE) * * Escapes identifiers in WHERE and HAVING statements at execution time. * - * Required so that aliases are tracked properly, regardless of wether + * Required so that aliases are tracked properly, regardless of whether * where(), or_where(), having(), or_having are called prior to from(), * join() and dbprefix is added only if needed. * From 99c17e516438843a69496046e5bc0ea627c3b0f8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 29 Feb 2016 16:53:45 +0200 Subject: [PATCH 4225/5397] Merge pull request #4495 from galdiolo/patch-15 [ci skip] Fix a comment typo --- system/database/DB_query_builder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 6bf039ead59..c862d937de2 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -2350,7 +2350,7 @@ protected function _compile_select($select_override = FALSE) * * Escapes identifiers in WHERE and HAVING statements at execution time. * - * Required so that aliases are tracked properly, regardless of wether + * Required so that aliases are tracked properly, regardless of whether * where(), or_where(), having(), or_having are called prior to from(), * join() and dbprefix is added only if needed. * From 7f0f73ba81ad712f2553e2f7ef5d0a50f16e119e Mon Sep 17 00:00:00 2001 From: __RD Date: Mon, 29 Feb 2016 22:56:29 +0800 Subject: [PATCH 4226/5397] delete lock directly -> call _release_lock() --- system/libraries/Session/drivers/Session_redis_driver.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index 5081bd5d47f..3b648d18364 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -277,8 +277,7 @@ public function close() try { if ($this->_redis->ping() === '+PONG') { - isset($this->_lock_key) && $this->_redis->delete($this->_lock_key); - $this->_lock_key = NULL; + $this->_release_lock($this->_lock_key); if ($this->_redis->close() === $this->_failure) { return $this->_failure; From 9a15344bc610b2c6a3a1a0a0b73db2fe0eba987a Mon Sep 17 00:00:00 2001 From: __RD Date: Mon, 29 Feb 2016 22:58:23 +0800 Subject: [PATCH 4227/5397] fix typo --- system/libraries/Session/drivers/Session_redis_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index 3b648d18364..c0c20a7cabd 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -277,7 +277,7 @@ public function close() try { if ($this->_redis->ping() === '+PONG') { - $this->_release_lock($this->_lock_key); + $this->_release_lock(); if ($this->_redis->close() === $this->_failure) { return $this->_failure; From f06858c3df09fd33c80f9fc415b6c63b3430869c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 29 Feb 2016 17:35:12 +0200 Subject: [PATCH 4228/5397] Merge pull request #4491 from roastduck/develop [ci skip] Clean current lock key on close() in redis session driver --- system/libraries/Session/drivers/Session_redis_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index ad95309da7a..7b7951f5d82 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -254,7 +254,7 @@ public function close() try { if ($this->_redis->ping() === '+PONG') { - isset($this->_lock_key) && $this->_redis->delete($this->_lock_key); + $this->_release_lock(); if ($this->_redis->close() === $this->_failure) { return $this->_failure; From 215922144082eb4b613e2418ba552776d23ea1db Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 29 Feb 2016 17:38:51 +0200 Subject: [PATCH 4229/5397] [ci skip] Apply #4491 to Memcached driver --- system/libraries/Session/drivers/Session_memcached_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index 875e72255d5..4bd63991f87 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -246,7 +246,7 @@ public function close() { if (isset($this->_memcached)) { - isset($this->_lock_key) && $this->_memcached->delete($this->_lock_key); + $this->_release_lock(); if ( ! $this->_memcached->quit()) { return $this->_failure; From e0b11e9a57f1fa3ef8b0d8ee7cef640aa5cc0eef Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 29 Feb 2016 17:41:19 +0200 Subject: [PATCH 4230/5397] [ci skip] Add changelog entries for PR #4491 and 215922144082eb4b613e2418ba552776d23ea1db --- user_guide_src/source/changelog.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 6bbd7f9e9ce..45e891e8905 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -35,6 +35,8 @@ Bug fixes for 3.0.5 - Fixed a bug where :doc:`Session Library ` didn't properly handle its locks' statuses with the 'memcached' driver. - Fixed a bug where :doc:`Session Library ` triggered a PHP warning when writing a newly created session with the 'memcached' driver. - Fixed a bug (#4449) - :doc:`Query Builder ` method ``join()`` breaks conditions containing ``IS NULL``, ``IS NOT NULL``. +- Fixed a bug (#4491) - :doc:`Session Library ` didn't clean-up internal variables for emulated locks with the 'redis' driver. +- Fixed a bug where :doc:`Session Library ` didn't clean-up internal variables for emulated locks with the 'memcached' driver. Version 3.0.4 ============= From e1f36e341a4ff513f8ba1f9908326f159edca4e7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 1 Mar 2016 13:33:37 +0200 Subject: [PATCH 4231/5397] [ci skip] Move flock() call in CI_Log::write_log() immediately after fopen() --- system/core/Log.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/core/Log.php b/system/core/Log.php index 7c81d358b28..1abdaa00e85 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -191,6 +191,8 @@ public function write_log($level, $msg) return FALSE; } + flock($fp, LOCK_EX); + // Instantiating DateTime with microseconds appended to initial date is needed for proper support of this format if (strpos($this->_date_fmt, 'u') !== FALSE) { @@ -206,8 +208,6 @@ public function write_log($level, $msg) $message .= $this->_format_line($level, $date, $msg); - flock($fp, LOCK_EX); - for ($written = 0, $length = strlen($message); $written < $length; $written += $result) { if (($result = fwrite($fp, substr($message, $written))) === FALSE) From b03380c8d20f76bbc6b49c7d9d31198bb769f422 Mon Sep 17 00:00:00 2001 From: Adi Prasetyo Date: Thu, 3 Mar 2016 03:53:26 +0700 Subject: [PATCH 4232/5397] Doc , update image_lib.rst > at *the* same level *as* --- user_guide_src/source/libraries/image_lib.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/image_lib.rst b/user_guide_src/source/libraries/image_lib.rst index d5c24c1b097..b25d2512f1a 100644 --- a/user_guide_src/source/libraries/image_lib.rst +++ b/user_guide_src/source/libraries/image_lib.rst @@ -63,7 +63,8 @@ called *mypic.jpg* located in the source_image folder, then create a thumbnail that is 75 X 50 pixels using the GD2 image_library. Since the maintain_ratio option is enabled, the thumb will be as close to the target width and height as possible while preserving the original aspect -ratio. The thumbnail will be called *mypic_thumb.jpg* +ratio. The thumbnail will be called *mypic_thumb.jpg* and located at +the same level as *source_image*. .. note:: In order for the image class to be allowed to do any processing, the folder containing the image files must have write From 858e8b704fef1378713e3a6c865dcd2b07577076 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 4 Mar 2016 15:19:24 +0200 Subject: [PATCH 4233/5397] Merge pull request #4502 from brutalcrozt/develop [ci skip] Update image_lib docs --- user_guide_src/source/libraries/image_lib.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/image_lib.rst b/user_guide_src/source/libraries/image_lib.rst index 27d2eb98c3f..22407962f71 100644 --- a/user_guide_src/source/libraries/image_lib.rst +++ b/user_guide_src/source/libraries/image_lib.rst @@ -63,7 +63,8 @@ called *mypic.jpg* located in the source_image folder, then create a thumbnail that is 75 X 50 pixels using the GD2 image_library. Since the maintain_ratio option is enabled, the thumb will be as close to the target width and height as possible while preserving the original aspect -ratio. The thumbnail will be called *mypic_thumb.jpg* +ratio. The thumbnail will be called *mypic_thumb.jpg* and located at +the same level as *source_image*. .. note:: In order for the image class to be allowed to do any processing, the folder containing the image files must have write From 1d7443acb57fa473295ecf4856a456d2c4fbe59f Mon Sep 17 00:00:00 2001 From: mixinix Date: Mon, 7 Mar 2016 05:23:38 +0700 Subject: [PATCH 4234/5397] Update calendar.rst --- user_guide_src/source/libraries/calendar.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user_guide_src/source/libraries/calendar.rst b/user_guide_src/source/libraries/calendar.rst index ea0f4d108af..8fdacf1d75d 100644 --- a/user_guide_src/source/libraries/calendar.rst +++ b/user_guide_src/source/libraries/calendar.rst @@ -60,10 +60,10 @@ parameter of the calendar generating function. Consider this example:: $this->load->library('calendar'); $data = array( - 3 => 'http://example.com/news/article/2006/03/', - 7 => 'http://example.com/news/article/2006/07/', - 13 => 'http://example.com/news/article/2006/13/', - 26 => 'http://example.com/news/article/2006/26/' + 3 => 'http://example.com/news/article/2006/06/03/', + 7 => 'http://example.com/news/article/2006/06/07/', + 13 => 'http://example.com/news/article/2006/06/13/', + 26 => 'http://example.com/news/article/2006/06/26/' ); echo $this->calendar->generate(2006, 6, $data); From c1721f15c72fb0b062a381d89dadaf1e86f8576b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 7 Mar 2016 10:03:58 +0200 Subject: [PATCH 4235/5397] Merge pull request #4506 from mixinix/patch-1 [ci skip] Update Calendar docs --- user_guide_src/source/libraries/calendar.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user_guide_src/source/libraries/calendar.rst b/user_guide_src/source/libraries/calendar.rst index ea0f4d108af..8fdacf1d75d 100644 --- a/user_guide_src/source/libraries/calendar.rst +++ b/user_guide_src/source/libraries/calendar.rst @@ -60,10 +60,10 @@ parameter of the calendar generating function. Consider this example:: $this->load->library('calendar'); $data = array( - 3 => 'http://example.com/news/article/2006/03/', - 7 => 'http://example.com/news/article/2006/07/', - 13 => 'http://example.com/news/article/2006/13/', - 26 => 'http://example.com/news/article/2006/26/' + 3 => 'http://example.com/news/article/2006/06/03/', + 7 => 'http://example.com/news/article/2006/06/07/', + 13 => 'http://example.com/news/article/2006/06/13/', + 26 => 'http://example.com/news/article/2006/06/26/' ); echo $this->calendar->generate(2006, 6, $data); From 8108b612fb80327215ae66b53c75c158d6f07e62 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 7 Mar 2016 10:10:17 +0200 Subject: [PATCH 4236/5397] [ci skip] Fix transactions for the ibase driver Reported via the forums: http://forum.codeigniter.com/thread-64559.html --- system/database/drivers/ibase/ibase_driver.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php index cbc1022ff88..c1055c1e6a8 100644 --- a/system/database/drivers/ibase/ibase_driver.php +++ b/system/database/drivers/ibase/ibase_driver.php @@ -126,7 +126,7 @@ public function version() */ protected function _execute($sql) { - return ibase_query($this->conn_id, $sql); + return ibase_query(isset($this->_ibase_trans) ? $this->_ibase_trans : $this->conn_id, $sql); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 45e891e8905..d963b57dc3d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -37,6 +37,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4449) - :doc:`Query Builder ` method ``join()`` breaks conditions containing ``IS NULL``, ``IS NOT NULL``. - Fixed a bug (#4491) - :doc:`Session Library ` didn't clean-up internal variables for emulated locks with the 'redis' driver. - Fixed a bug where :doc:`Session Library ` didn't clean-up internal variables for emulated locks with the 'memcached' driver. +- Fixed a bug where :doc:`Database ` transactions didn't work with the 'ibase' driver. Version 3.0.4 ============= From 3c0d8da56b8535bb3ab563256e221c81a4a96e4a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 7 Mar 2016 10:52:15 +0200 Subject: [PATCH 4237/5397] Fix #4475 --- system/core/Security.php | 9 ++++++++- tests/codeigniter/core/Security_test.php | 6 ++++-- user_guide_src/source/changelog.rst | 1 + 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/system/core/Security.php b/system/core/Security.php index bad511dd3a7..d5305d1ca0b 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -762,7 +762,14 @@ public function sanitize_filename($str, $relative_path = FALSE) */ public function strip_image_tags($str) { - return preg_replace(array('##', '##'), '\\1', $str); + return preg_replace( + array( + '##i', + '#`]+)).*?\>#i' + ), + '\\2', + $str + ); } // ---------------------------------------------------------------- diff --git a/tests/codeigniter/core/Security_test.php b/tests/codeigniter/core/Security_test.php index 2ef8228631c..8328c37cbc9 100644 --- a/tests/codeigniter/core/Security_test.php +++ b/tests/codeigniter/core/Security_test.php @@ -299,7 +299,8 @@ public function test_strip_image_tags() 'MD Logo', '', '', - '' + '', + '' ); $urls = array( @@ -310,7 +311,8 @@ public function test_strip_image_tags() 'mdn-logo-sm.png', '', '', - '' + '', + 'non-quoted.attribute' ); for ($i = 0; $i < count($imgtags); $i++) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d963b57dc3d..12d1fc4a363 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -38,6 +38,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4491) - :doc:`Session Library ` didn't clean-up internal variables for emulated locks with the 'redis' driver. - Fixed a bug where :doc:`Session Library ` didn't clean-up internal variables for emulated locks with the 'memcached' driver. - Fixed a bug where :doc:`Database ` transactions didn't work with the 'ibase' driver. +- Fixed a bug (#4475) - :doc:`Security Library ` method ``strip_image_tags()`` preserves only the first URL character from non-quoted *src* attributes. Version 3.0.4 ============= From e6a5f797de7381791537b736eb83b71c6fb28b39 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 7 Mar 2016 11:34:43 +0200 Subject: [PATCH 4238/5397] [ci skip] Fix Profiler not applying htmlspecialchars() to all inputs --- system/libraries/Profiler.php | 44 ++++++++++++----------------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index cc76414362f..cf455d3dab9 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -314,12 +314,14 @@ protected function _compile_get() foreach ($_GET as $key => $val) { - is_int($key) OR $key = "'".$key."'"; + is_int($key) OR $key = "'".htmlspecialchars($key, ENT_QUOTES, config_item('charset'))."'"; + $val = (is_array($val) OR is_object($val)) + ? '
    '.htmlspecialchars(print_r($val, TRUE), ENT_QUOTES, config_item('charset'))
    +					: htmlspecialchars($val, ENT_QUOTES, config_item('charset'));
     
     				$output .= '$_GET['
     					.$key.']   '
    -					.((is_array($val) OR is_object($val)) ? '
    '.htmlspecialchars(stripslashes(print_r($val, TRUE))).'
    ' : htmlspecialchars(stripslashes($val))) - ."\n"; + .$val."\n"; } $output .= "\n"; @@ -352,36 +354,26 @@ protected function _compile_post() foreach ($_POST as $key => $val) { - is_int($key) OR $key = "'".$key."'"; + is_int($key) OR $key = "'".htmlspecialchars($key, ENT_QUOTES, config_item('charset'))."'"; + $val = (is_array($val) OR is_object($val)) + ? '
    '.htmlspecialchars(print_r($val, TRUE), ENT_QUOTES, config_item('charset'))
    +					: htmlspecialchars($val, ENT_QUOTES, config_item('charset'));
     
     				$output .= '$_POST['
    -					.$key.']   ';
    -
    -				if (is_array($val) OR is_object($val))
    -				{
    -					$output .= '
    '.htmlspecialchars(stripslashes(print_r($val, TRUE))).'
    '; - } - else - { - $output .= htmlspecialchars(stripslashes($val)); - } - - $output .= "\n"; + .$key.']   ' + .$val."\n"; } foreach ($_FILES as $key => $val) { - is_int($key) OR $key = "'".$key."'"; + is_int($key) OR $key = "'".htmlspecialchars($key, ENT_QUOTES, config_item('charset'))."'"; + $val = (is_array($val) OR is_object($val)) + ? '
    '.htmlspecialchars(print_r($val, TRUE), ENT_QUOTES, config_item('charset'))
    +					: htmlspecialchars($val, ENT_QUOTES, config_item('charset'));
     
     				$output .= '$_FILES['
    -					.$key.']   ';
    -
    -				if (is_array($val) OR is_object($val))
    -				{
    -					$output .= '
    '.htmlspecialchars(stripslashes(print_r($val, TRUE))).'
    '; - } - - $output .= "\n"; + .$key.']   ' + .$val."\n"; } $output .= "\n"; @@ -465,7 +457,7 @@ protected function _compile_http_headers() foreach (array('HTTP_ACCEPT', 'HTTP_USER_AGENT', 'HTTP_CONNECTION', 'SERVER_PORT', 'SERVER_NAME', 'REMOTE_ADDR', 'SERVER_SOFTWARE', 'HTTP_ACCEPT_LANGUAGE', 'SCRIPT_NAME', 'REQUEST_METHOD',' HTTP_HOST', 'REMOTE_HOST', 'CONTENT_TYPE', 'SERVER_PROTOCOL', 'QUERY_STRING', 'HTTP_ACCEPT_ENCODING', 'HTTP_X_FORWARDED_FOR', 'HTTP_DNT') as $header) { - $val = isset($_SERVER[$header]) ? $_SERVER[$header] : ''; + $val = isset($_SERVER[$header]) ? htmlspecialchars($_SERVER[$header], ENT_QUOTES, config_item('charset')) : ''; $output .= '' .$header.'  '.$val."\n"; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 12d1fc4a363..4f2bfc04e2a 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -39,6 +39,7 @@ Bug fixes for 3.0.5 - Fixed a bug where :doc:`Session Library ` didn't clean-up internal variables for emulated locks with the 'memcached' driver. - Fixed a bug where :doc:`Database ` transactions didn't work with the 'ibase' driver. - Fixed a bug (#4475) - :doc:`Security Library ` method ``strip_image_tags()`` preserves only the first URL character from non-quoted *src* attributes. +- Fixed a bug where :doc:`Profiler Library ` didn't apply ``htmlspecialchars()`` to all displayed inputs. Version 3.0.4 ============= From 1b7840b58c0705cc8a78c164940a114fa0012fae Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 7 Mar 2016 13:01:57 +0200 Subject: [PATCH 4239/5397] [ci skip] Add random_compat as a suggested package in composer.json --- composer.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/composer.json b/composer.json index 4a9e8748e80..64d1be155f6 100644 --- a/composer.json +++ b/composer.json @@ -13,6 +13,9 @@ "require": { "php": ">=5.2.4" }, + "suggest": { + "paragonie/random_compat": "Provides better randomness in PHP 5.x" + }, "require-dev": { "mikey179/vfsStream": "1.1.*" } From a479ae85f21caef9d109b2e75229853e0b660cce Mon Sep 17 00:00:00 2001 From: vibbow Date: Mon, 7 Mar 2016 15:38:36 +0000 Subject: [PATCH 4240/5397] Update CodeIgniter.php --- system/core/CodeIgniter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 3d8ae7e8746..d9ac7efe301 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -359,7 +359,7 @@ * * Returns current CI instance object * - * @return CI_Controller object + * @return CI_Controller */ function &get_instance() { From 7e0bde27c8a6669b781d87c15ea51b750c91f97c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 7 Mar 2016 17:52:26 +0200 Subject: [PATCH 4241/5397] Merge pull request #4472 from vibbow/patch-1 [ci skip] Update get_instance() return type in docblock --- system/core/CodeIgniter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 52b542654a9..bf41ab2a21f 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -359,7 +359,7 @@ * * Returns current CI instance object * - * @return object + * @return CI_Controller */ function &get_instance() { From a027a7fd0d770cec0d71e888d8b6f4aa1568ce9f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 10 Mar 2016 13:59:20 +0200 Subject: [PATCH 4242/5397] Improve ext/session error messages --- system/libraries/Session/Session_driver.php | 20 +++++++++++++++++ .../drivers/Session_database_driver.php | 21 +++++++++--------- .../drivers/Session_memcached_driver.php | 20 ++++++++--------- .../Session/drivers/Session_redis_driver.php | 22 +++++++++---------- user_guide_src/source/changelog.rst | 4 ++++ 5 files changed, 55 insertions(+), 32 deletions(-) diff --git a/system/libraries/Session/Session_driver.php b/system/libraries/Session/Session_driver.php index 98fc897e3b2..55ddb25e0cc 100644 --- a/system/libraries/Session/Session_driver.php +++ b/system/libraries/Session/Session_driver.php @@ -168,4 +168,24 @@ protected function _release_lock() return TRUE; } + // ------------------------------------------------------------------------ + + /** + * Fail + * + * Drivers other than the 'files' one don't (need to) use the + * session.save_path INI setting, but that leads to confusing + * error messages emitted by PHP when open() or write() fail, + * as the message contains session.save_path ... + * To work around the problem, the drivers will call this method + * so that the INI is set just in time for the error message to + * be properly generated. + * + * @return mixed + */ + protected function _fail() + { + ini_set('session.save_path', config_item('sess_save_path')); + return $this->_failure; + } } diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index 3ba9d3d366b..da0331220fa 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -127,7 +127,7 @@ public function open($save_path, $name) { if (empty($this->_db->conn_id) && ! $this->_db->db_connect()) { - return $this->_failure; + return $this->_fail(); } return $this->_success; @@ -163,7 +163,7 @@ public function read($session_id) $this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']); } - if (($result = $this->_db->get()->row()) === NULL) + if ( ! ($result = $this->_db->get()) OR $result->row() === NULL) { // PHP7 will reuse the same SessionHandler object after // ID regeneration, so we need to explicitly set this to @@ -210,7 +210,7 @@ public function write($session_id, $session_data) { if ( ! $this->_release_lock() OR ! $this->_get_lock($session_id)) { - return $this->_failure; + return $this->_fail(); } $this->_row_exists = FALSE; @@ -218,7 +218,7 @@ public function write($session_id, $session_data) } elseif ($this->_lock === FALSE) { - return $this->_failure; + return $this->_fail(); } if ($this->_row_exists === FALSE) @@ -237,7 +237,7 @@ public function write($session_id, $session_data) return $this->_success; } - return $this->_failure; + return $this->_fail(); } $this->_db->where('id', $session_id); @@ -260,7 +260,7 @@ public function write($session_id, $session_data) return $this->_success; } - return $this->_failure; + return $this->_fail(); } // ------------------------------------------------------------------------ @@ -275,7 +275,7 @@ public function write($session_id, $session_data) public function close() { return ($this->_lock && ! $this->_release_lock()) - ? $this->_failure + ? $this->_fail() : $this->_success; } @@ -304,7 +304,7 @@ public function destroy($session_id) if ( ! $this->_db->delete($this->_config['save_path'])) { - return $this->_failure; + return $this->_fail(); } } @@ -314,7 +314,7 @@ public function destroy($session_id) return $this->_success; } - return $this->_failure; + return $this->_fail(); } // ------------------------------------------------------------------------ @@ -334,7 +334,7 @@ public function gc($maxlifetime) return ($this->_db->delete($this->_config['save_path'], 'timestamp < '.(time() - $maxlifetime))) ? $this->_success - : $this->_failure; + : $this->_fail(); } // ------------------------------------------------------------------------ @@ -414,5 +414,4 @@ protected function _release_lock() return parent::_release_lock(); } - } \ No newline at end of file diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index 4bd63991f87..88eb4b3a6f8 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -117,7 +117,7 @@ public function open($save_path, $name) { $this->_memcached = NULL; log_message('error', 'Session: Invalid Memcached save path format: '.$this->_config['save_path']); - return $this->_failure; + return $this->_fail(); } foreach ($matches as $match) @@ -142,7 +142,7 @@ public function open($save_path, $name) if (empty($server_list)) { log_message('error', 'Session: Memcached server pool is empty.'); - return $this->_failure; + return $this->_fail(); } return $this->_success; @@ -170,7 +170,7 @@ public function read($session_id) return $session_data; } - return $this->_failure; + return $this->_fail(); } // ------------------------------------------------------------------------ @@ -188,14 +188,14 @@ public function write($session_id, $session_data) { if ( ! isset($this->_memcached)) { - return $this->_failure; + return $this->_fail(); } // Was the ID regenerated? elseif ($session_id !== $this->_session_id) { if ( ! $this->_release_lock() OR ! $this->_get_lock($session_id)) { - return $this->_failure; + return $this->_fail(); } $this->_fingerprint = md5(''); @@ -218,7 +218,7 @@ public function write($session_id, $session_data) return $this->_success; } - return $this->_failure; + return $this->_fail(); } if ( @@ -230,7 +230,7 @@ public function write($session_id, $session_data) } } - return $this->_failure; + return $this->_fail(); } // ------------------------------------------------------------------------ @@ -249,14 +249,14 @@ public function close() $this->_release_lock(); if ( ! $this->_memcached->quit()) { - return $this->_failure; + return $this->_fail(); } $this->_memcached = NULL; return $this->_success; } - return $this->_failure; + return $this->_fail(); } // ------------------------------------------------------------------------ @@ -278,7 +278,7 @@ public function destroy($session_id) return $this->_success; } - return $this->_failure; + return $this->_fail(); } // ------------------------------------------------------------------------ diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index 7b7951f5d82..cc242dd3d93 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -131,7 +131,7 @@ public function open($save_path, $name) { if (empty($this->_config['save_path'])) { - return $this->_failure; + return $this->_fail(); } $redis = new Redis(); @@ -153,7 +153,7 @@ public function open($save_path, $name) return $this->_success; } - return $this->_failure; + return $this->_fail(); } // ------------------------------------------------------------------------ @@ -183,7 +183,7 @@ public function read($session_id) return $session_data; } - return $this->_failure; + return $this->_fail(); } // ------------------------------------------------------------------------ @@ -201,14 +201,14 @@ public function write($session_id, $session_data) { if ( ! isset($this->_redis)) { - return $this->_failure; + return $this->_fail(); } // Was the ID regenerated? elseif ($session_id !== $this->_session_id) { if ( ! $this->_release_lock() OR ! $this->_get_lock($session_id)) { - return $this->_failure; + return $this->_fail(); } $this->_key_exists = FALSE; @@ -227,15 +227,15 @@ public function write($session_id, $session_data) return $this->_success; } - return $this->_failure; + return $this->_fail(); } return ($this->_redis->setTimeout($this->_key_prefix.$session_id, $this->_config['expiration'])) ? $this->_success - : $this->_failure; + : $this->_fail(); } - return $this->_failure; + return $this->_fail(); } // ------------------------------------------------------------------------ @@ -255,9 +255,9 @@ public function close() if ($this->_redis->ping() === '+PONG') { $this->_release_lock(); - if ($this->_redis->close() === $this->_failure) + if ($this->_redis->close() === $this->_fail()) { - return $this->_failure; + return $this->_fail(); } } } @@ -296,7 +296,7 @@ public function destroy($session_id) return $this->_success; } - return $this->_failure; + return $this->_fail(); } // ------------------------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4f2bfc04e2a..888ae5f8269 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -11,6 +11,10 @@ Release Date: Not Released - Changed :doc:`Loader Library ` to allow ``$autoload['drivers']`` assigning with custom property names. +- General Changes + + - Updated the :doc:`Session Library ` to produce friendlier error messages on failures with drivers other than 'files'. + - :doc:`Query Builder ` - Added a ``$batch_size`` parameter to the ``insert_batch()`` method (defaults to 100). From 7bdd4950da2226859b00042ce9e8b2b9797129a7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 10 Mar 2016 14:01:09 +0200 Subject: [PATCH 4243/5397] Fix a logical error from last commit --- system/libraries/Session/drivers/Session_database_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index da0331220fa..317bd7d4d0a 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -163,7 +163,7 @@ public function read($session_id) $this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']); } - if ( ! ($result = $this->_db->get()) OR $result->row() === NULL) + if ( ! ($result = $this->_db->get()) OR ($result = $result->row()) === NULL) { // PHP7 will reuse the same SessionHandler object after // ID regeneration, so we need to explicitly set this to From f56068bfd34e3ebc1325b049bf33901d855c7321 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 11 Mar 2016 11:11:53 +0200 Subject: [PATCH 4244/5397] Revert an unintended change from a027a7fd0d770cec0d71e888d8b6f4aa1568ce9f --- system/libraries/Session/drivers/Session_redis_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index cc242dd3d93..e4e09fe0dda 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -255,7 +255,7 @@ public function close() if ($this->_redis->ping() === '+PONG') { $this->_release_lock(); - if ($this->_redis->close() === $this->_fail()) + if ($this->_redis->close() === $this->_failure) { return $this->_fail(); } From 1be8987176ad422ae6bc8af5c8f148eba9b5dff1 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 11 Mar 2016 18:12:57 +0200 Subject: [PATCH 4245/5397] Fix a number of CI_Cache bugs Fixes #4277 Supersedes #4474 Really fixes #4066 --- system/libraries/Cache/drivers/Cache_apc.php | 27 +++++++++++++------ .../Cache/drivers/Cache_memcached.php | 1 + .../libraries/Cache/drivers/Cache_redis.php | 6 +++++ .../Cache/drivers/Cache_wincache.php | 27 +++++++++++++------ user_guide_src/source/changelog.rst | 2 ++ 5 files changed, 47 insertions(+), 16 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php index dd18e7bc84e..07ea8f474f9 100644 --- a/system/libraries/Cache/drivers/Cache_apc.php +++ b/system/libraries/Cache/drivers/Cache_apc.php @@ -48,6 +48,24 @@ */ class CI_Cache_apc extends CI_Driver { + /** + * Class constructor + * + * Only present so that an error message is logged + * if APC is not available. + * + * @return void + */ + public function __construct() + { + if ( ! $this->is_supported()) + { + log_message('error', 'Cache: Failed to initialize APC; extension not loaded/enabled?'); + } + } + + // ------------------------------------------------------------------------ + /** * Get * @@ -198,13 +216,6 @@ public function get_metadata($id) */ public function is_supported() { - if ( ! extension_loaded('apc') OR ! ini_get('apc.enabled')) - { - log_message('debug', 'The APC PHP extension must be loaded to use APC Cache.'); - return FALSE; - } - - return TRUE; + return (extension_loaded('apc') && ini_get('apc.enabled')); } - } diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index c44958b9765..7e67fc40f9c 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -107,6 +107,7 @@ public function __construct() else { log_message('error', 'Cache: Failed to create Memcache(d) object; extension not loaded?'); + return; } foreach ($this->_memcache_conf as $cache_server) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 81b49e2fcb7..e9194a4997b 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -91,6 +91,12 @@ class CI_Cache_redis extends CI_Driver */ public function __construct() { + if ( ! $this->is_supported()) + { + log_message('error', 'Cache: Failed to create Redis object; extension not loaded?'); + return; + } + $config = array(); $CI =& get_instance(); diff --git a/system/libraries/Cache/drivers/Cache_wincache.php b/system/libraries/Cache/drivers/Cache_wincache.php index f66080514c0..d6a0d4fb6b8 100644 --- a/system/libraries/Cache/drivers/Cache_wincache.php +++ b/system/libraries/Cache/drivers/Cache_wincache.php @@ -51,6 +51,24 @@ */ class CI_Cache_wincache extends CI_Driver { + /** + * Class constructor + * + * Only present so that an error message is logged + * if APC is not available. + * + * @return void + */ + public function __construct() + { + if ( ! $this->is_supported()) + { + log_message('error', 'Cache: Failed to initialize Wincache; extension not loaded/enabled?'); + } + } + + // ------------------------------------------------------------------------ + /** * Get * @@ -194,13 +212,6 @@ public function get_metadata($id) */ public function is_supported() { - if ( ! extension_loaded('wincache') OR ! ini_get('wincache.ucenabled')) - { - log_message('debug', 'The Wincache PHP extension must be loaded to use Wincache Cache.'); - return FALSE; - } - - return TRUE; + return (extension_loaded('wincache') && ini_get('wincache.ucenabled')); } - } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 888ae5f8269..52e8d13d6db 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -44,6 +44,8 @@ Bug fixes for 3.0.5 - Fixed a bug where :doc:`Database ` transactions didn't work with the 'ibase' driver. - Fixed a bug (#4475) - :doc:`Security Library ` method ``strip_image_tags()`` preserves only the first URL character from non-quoted *src* attributes. - Fixed a bug where :doc:`Profiler Library ` didn't apply ``htmlspecialchars()`` to all displayed inputs. +- Fixed a bug (#4277) - :doc:`Cache Library ` triggered fatal errors if accessing the Memcache(d) and/or Redis driver and they are not available on the system. +- Fixed a bug where :doc:`Cache Library ` method ``is_supported()`` logged an error message on when it returns ``FALSE`` for the APC and Wincache drivers. Version 3.0.4 ============= From 92d1cc05362998ceabe39c4023f41fd939c1f5b2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 11 Mar 2016 18:19:23 +0200 Subject: [PATCH 4246/5397] Add a defensive check in CI_Loader::_ci_load() Prevents possible internal variable overwrites when loading views --- system/core/Loader.php | 8 ++++++++ user_guide_src/source/changelog.rst | 1 + 2 files changed, 9 insertions(+) diff --git a/system/core/Loader.php b/system/core/Loader.php index 62781a7bf9f..c742ae71a75 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -936,6 +936,14 @@ protected function _ci_load($_ci_data) */ if (is_array($_ci_vars)) { + foreach (array_keys($_ci_vars) as $key) + { + if (strncmp($key, '_ci_', 4) === 0) + { + unset($_ci_vars[$key]); + } + } + $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars); } extract($this->_ci_cached_vars); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 52e8d13d6db..11d7918e7bb 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -10,6 +10,7 @@ Release Date: Not Released - Core - Changed :doc:`Loader Library ` to allow ``$autoload['drivers']`` assigning with custom property names. + - Changed :doc:`Loader Library ` to ignore variables prefixed with '_ci_' when loading views. - General Changes From 59bcd1810f6c18e6dd4158003f122f750536d22e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 11 Mar 2016 18:23:27 +0200 Subject: [PATCH 4247/5397] [ci skip] Prepare for 3.0.5 release --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/changelog.rst | 2 +- user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/installation/downloads.rst | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index bf41ab2a21f..94d34c3fd9d 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - define('CI_VERSION', '3.0.5-dev'); + define('CI_VERSION', '3.0.5'); /* * ------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 11d7918e7bb..efb5c111c48 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -5,7 +5,7 @@ Change Log Version 3.0.5 ============= -Release Date: Not Released +Release Date: March 11, 2016 - Core diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 12339eb9194..6c263d7ff3b 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.0.5-dev' +version = '3.0.5' # The full version, including alpha/beta/rc tags. -release = '3.0.5-dev' +release = '3.0.5' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index c7db54cd80f..598bc5a9a94 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,7 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.0.5-dev (Current version) `_ +- `CodeIgniter v3.0.5 (Current version) `_ - `CodeIgniter v3.0.4 `_ - `CodeIgniter v3.0.3 `_ - `CodeIgniter v3.0.2 `_ From aac958210f862ed74f85f1ba8963775bca2d6402 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 11 Mar 2016 18:25:37 +0200 Subject: [PATCH 4248/5397] [ci skip] Fix a wrong page link in the changelog --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index efb5c111c48..c689017f6e4 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -32,7 +32,7 @@ Bug fixes for 3.0.5 - Fixed a regression in :doc:`Form Helper ` functions :php:func:`set_checkbox()`, :php:func:`set_radio()` where "checked" inputs aren't recognized after a form submit. - Fixed a bug (#4407) - :doc:`Text Helper ` function :php:func:`word_censor()` doesn't work under PHP 7 if there's no custom replacement provided. - Fixed a bug (#4415) - :doc:`Form Validation Library ` rule **valid_url** didn't accept URLs with IPv6 addresses enclosed in square brackets under PHP 5 (upstream bug). -- Fixed a bug (#4427) - :doc:`CAPTCHA Helper ` triggers an error if the provided character pool is too small. +- Fixed a bug (#4427) - :doc:`CAPTCHA Helper ` triggers an error if the provided character pool is too small. - Fixed a bug (#4430) - :doc:`File Uploading Library ` option **file_ext_tolower** didn't work. - Fixed a bug (#4431) - :doc:`Query Builder ` method ``join()`` discarded opening parentheses. - Fixed a bug (#4424) - :doc:`Session Library ` triggered a PHP warning when writing a newly created session with the 'redis' driver. From 4f9b20ae507dda7379d392386fb7ce5702626a91 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 11 Mar 2016 18:35:58 +0200 Subject: [PATCH 4249/5397] [ci skip] Mark the start of 3.0.6 development --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/changelog.rst | 6 ++++++ user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/installation/downloads.rst | 3 ++- user_guide_src/source/installation/upgrade_306.rst | 14 ++++++++++++++ user_guide_src/source/installation/upgrading.rst | 1 + 6 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 user_guide_src/source/installation/upgrade_306.rst diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 94d34c3fd9d..f0d7c8f533e 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - define('CI_VERSION', '3.0.5'); + define('CI_VERSION', '3.0.6-dev'); /* * ------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index c689017f6e4..71e9673ab8d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -2,6 +2,12 @@ Change Log ########## +Version 3.0.6 +============= + +Release Date: Not Released + + Version 3.0.5 ============= diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 6c263d7ff3b..e4d14d10032 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.0.5' +version = '3.0.6-dev' # The full version, including alpha/beta/rc tags. -release = '3.0.5' +release = '3.0.6-dev' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 598bc5a9a94..be33a1dc9af 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,8 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.0.5 (Current version) `_ +- `CodeIgniter v3.0.6-dev (Current version) `_ +- `CodeIgniter v3.0.5 `_ - `CodeIgniter v3.0.4 `_ - `CodeIgniter v3.0.3 `_ - `CodeIgniter v3.0.2 `_ diff --git a/user_guide_src/source/installation/upgrade_306.rst b/user_guide_src/source/installation/upgrade_306.rst new file mode 100644 index 00000000000..e9c4bdd7957 --- /dev/null +++ b/user_guide_src/source/installation/upgrade_306.rst @@ -0,0 +1,14 @@ +############################# +Upgrading from 3.0.5 to 3.0.6 +############################# + +Before performing an update you should take your site offline by +replacing the index.php file with a static one. + +Step 1: Update your CodeIgniter files +===================================== + +Replace all files and directories in your *system/* directory. + +.. note:: If you have any custom developed files in these directories, + please make copies of them first. diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index 102f20abf39..040c7283267 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -8,6 +8,7 @@ upgrading from. .. toctree:: :titlesonly: + Upgrading from 3.0.5 to 3.0.6 Upgrading from 3.0.4 to 3.0.5 Upgrading from 3.0.3 to 3.0.4 Upgrading from 3.0.2 to 3.0.3 From 1719223f936c1f202b176ebeba7718f6b24e4886 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 11 Mar 2016 22:09:53 +0200 Subject: [PATCH 4250/5397] [ci skip] Fix a changelog message typo --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 71e9673ab8d..1492b30119b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -52,7 +52,7 @@ Bug fixes for 3.0.5 - Fixed a bug (#4475) - :doc:`Security Library ` method ``strip_image_tags()`` preserves only the first URL character from non-quoted *src* attributes. - Fixed a bug where :doc:`Profiler Library ` didn't apply ``htmlspecialchars()`` to all displayed inputs. - Fixed a bug (#4277) - :doc:`Cache Library ` triggered fatal errors if accessing the Memcache(d) and/or Redis driver and they are not available on the system. -- Fixed a bug where :doc:`Cache Library ` method ``is_supported()`` logged an error message on when it returns ``FALSE`` for the APC and Wincache drivers. +- Fixed a bug where :doc:`Cache Library ` method ``is_supported()`` logged an error message when it returns ``FALSE`` for the APC and Wincache drivers. Version 3.0.4 ============= From fb78f8576816133973ee9586c523a72cdcaeac35 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 10:49:41 +0500 Subject: [PATCH 4251/5397] Added variables to Docblocks where they are skipped --- system/libraries/Cache/drivers/Cache_redis.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 81b49e2fcb7..a9a9e09cbde 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -138,7 +138,7 @@ public function __construct() /** * Get cache * - * @param string Cache ID + * @param string $key Cache ID * @return mixed */ public function get($key) @@ -190,7 +190,7 @@ public function save($id, $data, $ttl = 60, $raw = FALSE) /** * Delete from cache * - * @param string Cache key + * @param string $key Cache key * @return bool */ public function delete($key) @@ -255,7 +255,7 @@ public function clean() /** * Get cache driver info * - * @param string Not supported in Redis. + * @param string $type Not supported in Redis. * Only included in order to offer a * consistent cache API. * @return array @@ -271,7 +271,7 @@ public function cache_info($type = NULL) /** * Get cache metadata * - * @param string Cache key + * @param string $key Cache key * @return array */ public function get_metadata($key) From bbfa3ffdb8096e9d20b800ebbc8de672caf98d9e Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 11:12:58 +0500 Subject: [PATCH 4252/5397] Added the destructor (disconnect from memcache(d)) --- .../Cache/drivers/Cache_memcached.php | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index c44958b9765..91ad4d243c7 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -286,4 +286,25 @@ public function is_supported() { return (extension_loaded('memcached') OR extension_loaded('memcache')); } + + // ------------------------------------------------------------------------ + + /** + * Class destructor + * + * Closes the connection to Memcache(d) if present. + * + * @return void + */ + public function __destruct() + { + if ($this->_memcached instanceof Memcache) + { + $this->_memcached->close(); + } + elseif ($this->_memcached instanceof Memcached) + { + $this->_memcached->quit(); + } + } } From ae340cc7fca696b9d71588f724c6f35924d24dc4 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 11:19:25 +0500 Subject: [PATCH 4253/5397] Added variables to Docblocks (memcached) --- system/libraries/Cache/drivers/Cache_memcached.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index c44958b9765..16684fbb1e1 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -186,7 +186,7 @@ public function save($id, $data, $ttl = 60, $raw = FALSE) /** * Delete from Cache * - * @param mixed key to be deleted. + * @param mixed $id key to be deleted. * @return bool true on success, false on failure */ public function delete($id) @@ -251,7 +251,7 @@ public function cache_info() /** * Get Cache Metadata * - * @param mixed key to get cache metadata on + * @param mixed $id key to get cache metadata on * @return mixed FALSE on failure, array on success. */ public function get_metadata($id) From 4933c16efd7bad7353877910b7d43d0b5a87735e Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 11:26:28 +0500 Subject: [PATCH 4254/5397] Renamed $this->_memcache_conf to $this->_config --- system/libraries/Cache/drivers/Cache_memcached.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index c44958b9765..09dc7b0de4d 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -60,7 +60,7 @@ class CI_Cache_memcached extends CI_Driver { * * @var array */ - protected $_memcache_conf = array( + protected $_config = array( 'default' => array( 'host' => '127.0.0.1', 'port' => 11211, @@ -81,17 +81,17 @@ public function __construct() { // Try to load memcached server info from the config file. $CI =& get_instance(); - $defaults = $this->_memcache_conf['default']; + $defaults = $this->_config['default']; if ($CI->config->load('memcached', TRUE, TRUE)) { if (is_array($CI->config->config['memcached'])) { - $this->_memcache_conf = array(); + $this->_config = array(); foreach ($CI->config->config['memcached'] as $name => $conf) { - $this->_memcache_conf[$name] = $conf; + $this->_config[$name] = $conf; } } } @@ -109,7 +109,7 @@ public function __construct() log_message('error', 'Cache: Failed to create Memcache(d) object; extension not loaded?'); } - foreach ($this->_memcache_conf as $cache_server) + foreach ($this->_config as $cache_server) { isset($cache_server['hostname']) OR $cache_server['hostname'] = $defaults['host']; isset($cache_server['port']) OR $cache_server['port'] = $defaults['port']; From 2f10aebf8ca7d650ecf7614e8d5e3455c88f96d9 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 11:28:57 +0500 Subject: [PATCH 4255/5397] Reduction of constructions --- system/libraries/Cache/drivers/Cache_memcached.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 09dc7b0de4d..7a3267a1eeb 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -87,12 +87,7 @@ public function __construct() { if (is_array($CI->config->config['memcached'])) { - $this->_config = array(); - - foreach ($CI->config->config['memcached'] as $name => $conf) - { - $this->_config[$name] = $conf; - } + $this->_config = $CI->config->config['memcached']; } } From d03832c6ee27ac1dcf3c5bff3831fcfdd35765f6 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 11:31:16 +0500 Subject: [PATCH 4256/5397] Combined two "if" conditions to one --- system/libraries/Cache/drivers/Cache_memcached.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 7a3267a1eeb..02b2d438e58 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -83,12 +83,9 @@ public function __construct() $CI =& get_instance(); $defaults = $this->_config['default']; - if ($CI->config->load('memcached', TRUE, TRUE)) + if ($CI->config->load('memcached', TRUE, TRUE) && is_array($CI->config->config['memcached'])) { - if (is_array($CI->config->config['memcached'])) - { - $this->_config = $CI->config->config['memcached']; - } + $this->_config = $CI->config->config['memcached']; } if (class_exists('Memcached', FALSE)) From db91d5b1b3ed2cfd8e1ad0ba59906ad527ef8786 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 11:37:27 +0500 Subject: [PATCH 4257/5397] The "get_class($A) == B" replaced by "$A instanceof B" --- system/libraries/Cache/drivers/Cache_memcached.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index c44958b9765..ae90b985851 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -115,7 +115,7 @@ public function __construct() isset($cache_server['port']) OR $cache_server['port'] = $defaults['port']; isset($cache_server['weight']) OR $cache_server['weight'] = $defaults['weight']; - if (get_class($this->_memcached) === 'Memcache') + if ($this->_memcached instanceof Memcache) { // Third parameter is persistance and defaults to TRUE. $this->_memcached->addServer( @@ -169,11 +169,11 @@ public function save($id, $data, $ttl = 60, $raw = FALSE) $data = array($data, time(), $ttl); } - if (get_class($this->_memcached) === 'Memcached') + if ($this->_memcached instanceof Memcached) { return $this->_memcached->set($id, $data, $ttl); } - elseif (get_class($this->_memcached) === 'Memcache') + elseif ($this->_memcached instanceof Memcache) { return $this->_memcached->set($id, $data, 0, $ttl); } From 35d9f36538be2acc86beb060fb54d93f268cf307 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 11:38:47 +0500 Subject: [PATCH 4258/5397] Added a second check "instanceof" --- system/libraries/Cache/drivers/Cache_memcached.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index ae90b985851..c22a36f4c00 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -125,7 +125,7 @@ public function __construct() $cache_server['weight'] ); } - else + elseif ($this->_memcached instanceof Memcached) { $this->_memcached->addServer( $cache_server['hostname'], From e5102e1fa8adaa7317f8d3da773f8b77d6f7a2c1 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 12:32:49 +0500 Subject: [PATCH 4259/5397] Changed the methods of working with serializable values --- .../libraries/Cache/drivers/Cache_redis.php | 47 +++++++------------ 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 81b49e2fcb7..c50da130384 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -143,14 +143,21 @@ public function __construct() */ public function get($key) { - $value = $this->_redis->get($key); + $value = $this->_redis->hMGet($key, array('serialized', 'data')); - if ($value !== FALSE && isset($this->_serialized[$key])) + if ( ! is_array($value)) { - return unserialize($value); + return FALSE; } - return $value; + if ( ! empty($value['serialized'])) + { + return unserialize($value['data']); + } + else + { + return $value['data']; + } } // ------------------------------------------------------------------------ @@ -168,21 +175,12 @@ public function save($id, $data, $ttl = 60, $raw = FALSE) { if (is_array($data) OR is_object($data)) { - if ( ! $this->_redis->sIsMember('_ci_redis_serialized', $id) && ! $this->_redis->sAdd('_ci_redis_serialized', $id)) - { - return FALSE; - } - - isset($this->_serialized[$id]) OR $this->_serialized[$id] = TRUE; - $data = serialize($data); + return $this->_redis->hMSet($id, array('serialized' => TRUE, 'data' => serialize($data))); } - elseif (isset($this->_serialized[$id])) + else { - $this->_serialized[$id] = NULL; - $this->_redis->sRemove('_ci_redis_serialized', $id); + return $this->_redis->hMSet($id, array('serialized' => FALSE, 'data' => $data)); } - - return $this->_redis->set($id, $data, $ttl); } // ------------------------------------------------------------------------ @@ -195,18 +193,7 @@ public function save($id, $data, $ttl = 60, $raw = FALSE) */ public function delete($key) { - if ($this->_redis->delete($key) !== 1) - { - return FALSE; - } - - if (isset($this->_serialized[$key])) - { - $this->_serialized[$key] = NULL; - $this->_redis->sRemove('_ci_redis_serialized', $key); - } - - return TRUE; + return ($this->_redis->delete($key) === 1); } // ------------------------------------------------------------------------ @@ -220,7 +207,7 @@ public function delete($key) */ public function increment($id, $offset = 1) { - return $this->_redis->incr($id, $offset); + return $this->_redis->hIncrBy($id, 'data', $offset); } // ------------------------------------------------------------------------ @@ -234,7 +221,7 @@ public function increment($id, $offset = 1) */ public function decrement($id, $offset = 1) { - return $this->_redis->decr($id, $offset); + return $this->_redis->hIncrBy($id, 'data', -$offset); } // ------------------------------------------------------------------------ From 25da4ec2e02d7ec258f11916d1b9b40c10b97ace Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 12:40:07 +0500 Subject: [PATCH 4260/5397] Fixed the index existence error --- system/libraries/Cache/drivers/Cache_redis.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index c50da130384..a302609a208 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -145,12 +145,12 @@ public function get($key) { $value = $this->_redis->hMGet($key, array('serialized', 'data')); - if ( ! is_array($value)) + if ( ! is_array($value) OR ! isset($value['serialized'], $value['data'])) { return FALSE; } - if ( ! empty($value['serialized'])) + if ($value['serialized']) { return unserialize($value['data']); } From 12c3d1474e43cdd6e76245e89f11440793a5d8f0 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 12:51:46 +0500 Subject: [PATCH 4261/5397] Setup the data defining for stored data --- system/libraries/Cache/drivers/Cache_redis.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index a302609a208..c334afb0d6e 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -143,19 +143,20 @@ public function __construct() */ public function get($key) { - $value = $this->_redis->hMGet($key, array('serialized', 'data')); + $value = $this->_redis->hMGet($key, array('type', 'data')); - if ( ! is_array($value) OR ! isset($value['serialized'], $value['data'])) + if ( ! is_array($value) OR ! isset($value['type'], $value['data'])) { return FALSE; } - if ($value['serialized']) + if ($value['type'] === 'array' OR $value['type'] === 'object') { return unserialize($value['data']); } else { + settype($value['data'], $value['type']); return $value['data']; } } @@ -175,11 +176,11 @@ public function save($id, $data, $ttl = 60, $raw = FALSE) { if (is_array($data) OR is_object($data)) { - return $this->_redis->hMSet($id, array('serialized' => TRUE, 'data' => serialize($data))); + return $this->_redis->hMSet($id, array('type' => gettype($data), 'data' => serialize($data))); } else { - return $this->_redis->hMSet($id, array('serialized' => FALSE, 'data' => $data)); + return $this->_redis->hMSet($id, array('type' => gettype($data), 'data' => $data)); } } From 7243d0b9019eec108255fae5b7eaf08a14a8092e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 11:40:34 +0200 Subject: [PATCH 4262/5397] Fix #4516 --- system/libraries/Form_validation.php | 5 ++++- tests/codeigniter/libraries/Form_validation_test.php | 10 ++++++++++ user_guide_src/source/changelog.rst | 4 ++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 296ddb92a3e..09d6c9a9724 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -583,7 +583,10 @@ protected function _reset_post_array() protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) { // If the $_POST data is an array we will run a recursive call - if (is_array($postdata)) + // + // Note: We MUST check if the array is empty or not! + // Otherwise empty arrays will always pass validation. + if (is_array($postdata) && ! empty($postdata)) { foreach ($postdata as $key => $val) { diff --git a/tests/codeigniter/libraries/Form_validation_test.php b/tests/codeigniter/libraries/Form_validation_test.php index f455b9146a6..3537eb3552a 100644 --- a/tests/codeigniter/libraries/Form_validation_test.php +++ b/tests/codeigniter/libraries/Form_validation_test.php @@ -28,6 +28,16 @@ public function set_up() $this->form_validation = new CI_Form_validation(); } + public function test_empty_array_input() + { + $this->assertFalse( + $this->run_rules( + array(array('field' => 'foo', 'label' => 'Foo Label', 'rules' => 'required')), + array('foo' => array()) + ) + ); + } + public function test_rule_required() { $rules = array(array('field' => 'foo', 'label' => 'foo_label', 'rules' => 'required')); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1492b30119b..227841250b2 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,10 @@ Version 3.0.6 Release Date: Not Released +Bug fixes for 3.0.6 +------------------- + +- Fixed a bug (#4516) - :doc:`Form Validation Library ` always accepted empty array inputs. Version 3.0.5 ============= From 522c3f32c0fe3113ce6ffc7d79c0e698dfc0bcc1 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 12:13:43 +0200 Subject: [PATCH 4263/5397] Merge pull request #4522 from masterklavi/memcached_destruct Added destructor to Cache_memcached --- .../Cache/drivers/Cache_memcached.php | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 7e67fc40f9c..8bb4a5696cc 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -287,4 +287,25 @@ public function is_supported() { return (extension_loaded('memcached') OR extension_loaded('memcache')); } + + // ------------------------------------------------------------------------ + + /** + * Class destructor + * + * Closes the connection to Memcache(d) if present. + * + * @return void + */ + public function __destruct() + { + if ($this->_memcached instanceof Memcache) + { + $this->_memcached->close(); + } + elseif ($this->_memcached instanceof Memcached) + { + $this->_memcached->quit(); + } + } } From fab0d4fe1315ef8114e9755e4a3a94abf47825f8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 12:16:49 +0200 Subject: [PATCH 4264/5397] [ci skip] Add changelog entry for PR #4522 --- user_guide_src/source/changelog.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 227841250b2..de488a9956d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,10 @@ Version 3.0.6 Release Date: Not Released +- General Changes + + - Added a destructor to :doc:`Cache Library ` 'memcached' driver to ensure that Memcache(d) connections are properly closed. + Bug fixes for 3.0.6 ------------------- From 364ba6fb407f281a4ba9e5ace070025f507faf69 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 12:18:36 +0200 Subject: [PATCH 4265/5397] Merge pull request #4523 from masterklavi/memcached_docblock [ci skip] Added missing variable names to Cache_memcached docblocks --- system/libraries/Cache/drivers/Cache_memcached.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 8bb4a5696cc..56ab5b85bfd 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -187,7 +187,7 @@ public function save($id, $data, $ttl = 60, $raw = FALSE) /** * Delete from Cache * - * @param mixed key to be deleted. + * @param mixed $id key to be deleted. * @return bool true on success, false on failure */ public function delete($id) @@ -252,7 +252,7 @@ public function cache_info() /** * Get Cache Metadata * - * @param mixed key to get cache metadata on + * @param mixed $id key to get cache metadata on * @return mixed FALSE on failure, array on success. */ public function get_metadata($id) From 5ea30f85f964b6b207a27c2700c65df89736d0e9 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 15:21:29 +0500 Subject: [PATCH 4266/5397] Fixed an indent of description --- system/libraries/Cache/drivers/Cache_redis.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index a9a9e09cbde..9d48da8f9c8 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -256,8 +256,8 @@ public function clean() * Get cache driver info * * @param string $type Not supported in Redis. - * Only included in order to offer a - * consistent cache API. + * Only included in order to offer a + * consistent cache API. * @return array * @see Redis::info() */ From a604554c592c090334b3a57d41e498d6f03fd1e4 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 15:27:58 +0500 Subject: [PATCH 4267/5397] Removed an unnecessary is_array() check. --- system/libraries/Cache/drivers/Cache_memcached.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 02b2d438e58..2d6236a6f92 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -83,7 +83,7 @@ public function __construct() $CI =& get_instance(); $defaults = $this->_config['default']; - if ($CI->config->load('memcached', TRUE, TRUE) && is_array($CI->config->config['memcached'])) + if ($CI->config->load('memcached', TRUE, TRUE)) { $this->_config = $CI->config->config['memcached']; } From 51f00ca8f3ba297ac0eec04071bd6aa85968d2ca Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 12:27:14 +0200 Subject: [PATCH 4268/5397] Merge pull request #4521 from masterklavi/redis_docblock [ci skip] Added missing variable names to Cache_redis docblocks --- system/libraries/Cache/drivers/Cache_redis.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index e9194a4997b..a58aaef4ed6 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -144,7 +144,7 @@ public function __construct() /** * Get cache * - * @param string Cache ID + * @param string $key Cache ID * @return mixed */ public function get($key) @@ -196,7 +196,7 @@ public function save($id, $data, $ttl = 60, $raw = FALSE) /** * Delete from cache * - * @param string Cache key + * @param string $key Cache key * @return bool */ public function delete($key) @@ -261,9 +261,9 @@ public function clean() /** * Get cache driver info * - * @param string Not supported in Redis. - * Only included in order to offer a - * consistent cache API. + * @param string $type Not supported in Redis. + * Only included in order to offer a + * consistent cache API. * @return array * @see Redis::info() */ @@ -277,7 +277,7 @@ public function cache_info($type = NULL) /** * Get cache metadata * - * @param string Cache key + * @param string $key Cache key * @return array */ public function get_metadata($key) From c13b4a6bfe45fc3eeb71aeb27ae0d69ef09580a5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 12:30:21 +0200 Subject: [PATCH 4269/5397] Merge pull request #4525 from masterklavi/memcached_instanceof Use instanceof instead of get_class() in Cache_memcached --- system/libraries/Cache/drivers/Cache_memcached.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 56ab5b85bfd..df02ca2d06e 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -116,7 +116,7 @@ public function __construct() isset($cache_server['port']) OR $cache_server['port'] = $defaults['port']; isset($cache_server['weight']) OR $cache_server['weight'] = $defaults['weight']; - if (get_class($this->_memcached) === 'Memcache') + if ($this->_memcached instanceof Memcache) { // Third parameter is persistance and defaults to TRUE. $this->_memcached->addServer( @@ -126,7 +126,7 @@ public function __construct() $cache_server['weight'] ); } - else + elseif ($this->_memcached instanceof Memcached) { $this->_memcached->addServer( $cache_server['hostname'], @@ -170,11 +170,11 @@ public function save($id, $data, $ttl = 60, $raw = FALSE) $data = array($data, time(), $ttl); } - if (get_class($this->_memcached) === 'Memcached') + if ($this->_memcached instanceof Memcached) { return $this->_memcached->set($id, $data, $ttl); } - elseif (get_class($this->_memcached) === 'Memcache') + elseif ($this->_memcached instanceof Memcache) { return $this->_memcached->set($id, $data, 0, $ttl); } From 9c948aa715a539aa4dcdd1647156436700411dd1 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 12:33:07 +0200 Subject: [PATCH 4270/5397] Merge pull request #4524 from masterklavi/memcached_refactoring Cache_memcached configuration refactoring --- .../libraries/Cache/drivers/Cache_memcached.php | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index df02ca2d06e..6dee1e8e465 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -60,7 +60,7 @@ class CI_Cache_memcached extends CI_Driver { * * @var array */ - protected $_memcache_conf = array( + protected $_config = array( 'default' => array( 'host' => '127.0.0.1', 'port' => 11211, @@ -81,19 +81,11 @@ public function __construct() { // Try to load memcached server info from the config file. $CI =& get_instance(); - $defaults = $this->_memcache_conf['default']; + $defaults = $this->_config['default']; if ($CI->config->load('memcached', TRUE, TRUE)) { - if (is_array($CI->config->config['memcached'])) - { - $this->_memcache_conf = array(); - - foreach ($CI->config->config['memcached'] as $name => $conf) - { - $this->_memcache_conf[$name] = $conf; - } - } + $this->_config = $CI->config->config['memcached']; } if (class_exists('Memcached', FALSE)) @@ -110,7 +102,7 @@ public function __construct() return; } - foreach ($this->_memcache_conf as $cache_server) + foreach ($this->_config as $cache_server) { isset($cache_server['hostname']) OR $cache_server['hostname'] = $defaults['host']; isset($cache_server['port']) OR $cache_server['port'] = $defaults['port']; From b13604287adcd1b70a624c83be67b8e2f35835c5 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 11:59:54 +0500 Subject: [PATCH 4271/5397] The "$config" variable is moved to "if" condition --- system/libraries/Cache/drivers/Cache_redis.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index a58aaef4ed6..27107b332d2 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -102,10 +102,13 @@ public function __construct() if ($CI->config->load('redis', TRUE, TRUE)) { - $config = $CI->config->item('redis'); + $config = array_merge(self::$_default_config, $CI->config->item('redis')); + } + else + { + $config = self::$_default_config; } - $config = array_merge(self::$_default_config, $config); $this->_redis = new Redis(); try From 12798c426d6232eb4ad2930af4d58d18692d077f Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 15:55:51 +0500 Subject: [PATCH 4272/5397] Removed an unnecessary array() initialization --- system/libraries/Cache/drivers/Cache_redis.php | 1 - 1 file changed, 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 27107b332d2..d4d95ebb183 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -97,7 +97,6 @@ public function __construct() return; } - $config = array(); $CI =& get_instance(); if ($CI->config->load('redis', TRUE, TRUE)) From a0556f128417467faaa7048bb1bf8da154e79582 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 13:05:38 +0200 Subject: [PATCH 4273/5397] Merge pull request #4526 from masterklavi/redis_refactor Remove an unnecessary assignment from Cache_redis configuration --- system/libraries/Cache/drivers/Cache_redis.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index a58aaef4ed6..d4d95ebb183 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -97,15 +97,17 @@ public function __construct() return; } - $config = array(); $CI =& get_instance(); if ($CI->config->load('redis', TRUE, TRUE)) { - $config = $CI->config->item('redis'); + $config = array_merge(self::$_default_config, $CI->config->item('redis')); + } + else + { + $config = self::$_default_config; } - $config = array_merge(self::$_default_config, $config); $this->_redis = new Redis(); try From 0c70b8ab83998c3771bbda3a9717da574f421357 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 16:15:30 +0500 Subject: [PATCH 4274/5397] Fixed a condition in the get method --- system/libraries/Cache/drivers/Cache_redis.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index c334afb0d6e..a50eb22aca6 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -145,7 +145,7 @@ public function get($key) { $value = $this->_redis->hMGet($key, array('type', 'data')); - if ( ! is_array($value) OR ! isset($value['type'], $value['data'])) + if ($value === FALSE OR $value['type'] === FALSE) { return FALSE; } From f26a876acf4cca26329dfbe3d0eee1aa0c05ace0 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 16:25:56 +0500 Subject: [PATCH 4275/5397] Removed an extra space char --- system/libraries/Cache/drivers/Cache_redis.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index a50eb22aca6..e29551089af 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -145,7 +145,7 @@ public function get($key) { $value = $this->_redis->hMGet($key, array('type', 'data')); - if ($value === FALSE OR $value['type'] === FALSE) + if ($value === FALSE OR $value['type'] === FALSE) { return FALSE; } From 0abb9777fd45cf87dc3e0e4780ae2292b2822407 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 16:32:13 +0500 Subject: [PATCH 4276/5397] Changed a condition in the get method to empty() --- system/libraries/Cache/drivers/Cache_redis.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index e29551089af..88f1815a7d0 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -145,7 +145,7 @@ public function get($key) { $value = $this->_redis->hMGet($key, array('type', 'data')); - if ($value === FALSE OR $value['type'] === FALSE) + if (empty($value['type'])) { return FALSE; } From fb722b6eacc574975de223a05e619f9c90aa8d99 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 17:32:12 +0500 Subject: [PATCH 4277/5397] Added the expiration to save() method --- system/libraries/Cache/drivers/Cache_redis.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 6da86728cd8..fa318403e60 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -184,12 +184,19 @@ public function save($id, $data, $ttl = 60, $raw = FALSE) { if (is_array($data) OR is_object($data)) { - return $this->_redis->hMSet($id, array('type' => gettype($data), 'data' => serialize($data))); + $success = $this->_redis->hMSet($id, array('type' => gettype($data), 'data' => serialize($data))); } else { - return $this->_redis->hMSet($id, array('type' => gettype($data), 'data' => $data)); + $success = $this->_redis->hMSet($id, array('type' => gettype($data), 'data' => $data)); } + + if ($success && $ttl) + { + $this->_redis->expireAt($id, time() + $ttl); + } + + return $success; } // ------------------------------------------------------------------------ From 44ce8f4545c8a0c0de97e93ceb9b2b9f751bc474 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 14:52:22 +0200 Subject: [PATCH 4278/5397] Add changelog entries for and polish changes from PRs #4528, #4530 --- .../libraries/Cache/drivers/Cache_redis.php | 52 +++++++++++++------ user_guide_src/source/changelog.rst | 6 +++ 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index fa318403e60..49385dffa85 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -151,21 +151,29 @@ public function __construct() */ public function get($key) { - $value = $this->_redis->hMGet($key, array('type', 'data')); + $data = $this->_redis->hMGet($key, array('__ci_type', '__ci_value')); - if (empty($value['type'])) + if ( ! isset($data['__ci_type'], $data['__ci_value']) OR $data['__ci_value'] === FALSE) { return FALSE; } - if ($value['type'] === 'array' OR $value['type'] === 'object') + switch ($data['__ci_type']) { - return unserialize($value['data']); - } - else - { - settype($value['data'], $value['type']); - return $value['data']; + case 'array': + case 'object': + return unserialize($data['__ci_value']); + case 'boolean': + case 'integer': + case 'double': // Yes, 'double' is returned and NOT 'float' + case 'string': + case 'NULL': + return settype($data['__ci_value'], $data['__ci_type']) + ? $data['__ci_value'] + : FALSE; + case 'resource': + default: + return FALSE; } } @@ -182,21 +190,33 @@ public function get($key) */ public function save($id, $data, $ttl = 60, $raw = FALSE) { - if (is_array($data) OR is_object($data)) + switch ($data_type = gettype($data)) { - $success = $this->_redis->hMSet($id, array('type' => gettype($data), 'data' => serialize($data))); + case 'array': + case 'object': + $data = serialize($data); + break; + case 'boolean': + case 'integer': + case 'double': // Yes, 'double' is returned and NOT 'float' + case 'string': + case 'NULL': + break; + case 'resource': + default: + return FALSE; } - else + + if ( ! $this->_redis->hMSet($id, array('__ci_type' => $data_type, '__ci_value' => $data))) { - $success = $this->_redis->hMSet($id, array('type' => gettype($data), 'data' => $data)); + return FALSE; } - - if ($success && $ttl) + elseif ($ttl) { $this->_redis->expireAt($id, time() + $ttl); } - return $success; + return TRUE; } // ------------------------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2a9ccd57aa5..3bb7e48f5e0 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -14,6 +14,7 @@ Release Date: Not Released - Libraries - Added UNIX socket connection support to :doc:`Session Library ` 'redis' driver. + - Changed data serialization logic in :doc:`Cache Library ` 'redis' driver for better performance. - Database @@ -26,6 +27,11 @@ Release Date: Not Released - Updated :doc:`HTML Helper ` function :php:func:`meta()` with support for "charset" and "property" properties. - Changed :doc:`HTML Helper ` function :php:func:`doctype()` default document type to HTML 5. +Bug fixes for 3.1.0 +------------------- + +- Fixed a bug (#4528) - :doc:`Cache Library ` stored all scalar values as strings with the 'redis' driver. + Version 3.0.6 ============= From 16436e3c037ba4688954cffab2316d44115b2eff Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 15:00:43 +0200 Subject: [PATCH 4279/5397] [ci skip] Removed leftovers from the old serialization logic in Cache_redis --- system/libraries/Cache/drivers/Cache_redis.php | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 49385dffa85..7d1b4f39af8 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -69,13 +69,6 @@ class CI_Cache_redis extends CI_Driver */ protected $_redis; - /** - * An internal cache for storing keys of serialized values. - * - * @var array - */ - protected $_serialized = array(); - // ------------------------------------------------------------------------ /** @@ -135,10 +128,6 @@ public function __construct() { log_message('error', 'Cache: Redis connection refused ('.$e->getMessage().')'); } - - // Initialize the index of serialized values. - $serialized = $this->_redis->sMembers('_ci_redis_serialized'); - empty($serialized) OR $this->_serialized = array_flip($serialized); } // ------------------------------------------------------------------------ From 55a40b769b5e3350d07b63264b332fce5e1341d2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 15:43:22 +0200 Subject: [PATCH 4280/5397] A small memory optimization to CI_Form_validation --- system/libraries/Form_validation.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 09d6c9a9724..9fb686892ef 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -450,7 +450,7 @@ public function run($group = '') $this->CI->lang->load('form_validation'); // Cycle through the rules for each field and match the corresponding $validation_data item - foreach ($this->_field_data as $field => $row) + foreach ($this->_field_data as $field => &$row) { // Fetch the data from the validation_data array item and cache it in the _field_data array. // Depending on whether the field name is an array or a string will determine where we get it from. @@ -467,7 +467,7 @@ public function run($group = '') // Execute validation rules // Note: A second foreach (for now) is required in order to avoid false-positives // for rules like 'matches', which correlate to other validation fields. - foreach ($this->_field_data as $field => $row) + foreach ($this->_field_data as $field => &$row) { // Don't try to validate if we have no rules set if (empty($row['rules'])) @@ -475,7 +475,7 @@ public function run($group = '') continue; } - $this->_execute($row, $row['rules'], $this->_field_data[$field]['postdata']); + $this->_execute($row, $row['rules'], $row['postdata']); } // Did we end up with any errors? From 9cc1618502a147d973e5917d6b305642437e7e8c Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sat, 12 Mar 2016 19:05:47 +0500 Subject: [PATCH 4281/5397] Removed the second condition for unix sockets --- system/libraries/Cache/drivers/Cache_redis.php | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 7d1b4f39af8..29f43ba6f9e 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -55,7 +55,6 @@ class CI_Cache_redis extends CI_Driver * @var array */ protected static $_default_config = array( - 'socket_type' => 'tcp', 'host' => '127.0.0.1', 'password' => NULL, 'port' => 6379, @@ -105,16 +104,7 @@ public function __construct() try { - if ($config['socket_type'] === 'unix') - { - $success = $this->_redis->connect($config['socket']); - } - else // tcp socket - { - $success = $this->_redis->connect($config['host'], $config['port'], $config['timeout']); - } - - if ( ! $success) + if ( ! $this->_redis->connect($config['host'], $config['port'], $config['timeout'])) { log_message('error', 'Cache: Redis connection failed. Check your configuration.'); } From 7e5ed70625180c416a1b7d784c3fae7fe9ff6cea Mon Sep 17 00:00:00 2001 From: Goran Grbic Date: Sat, 12 Mar 2016 15:26:50 +0100 Subject: [PATCH 4282/5397] Removing character Removing forward slash since `APPPATH` ends with `DIRECTORY_SEPARATOR`. --- user_guide_src/source/tutorial/static_pages.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/tutorial/static_pages.rst b/user_guide_src/source/tutorial/static_pages.rst index 569287c98a6..5daaa958fd9 100644 --- a/user_guide_src/source/tutorial/static_pages.rst +++ b/user_guide_src/source/tutorial/static_pages.rst @@ -97,7 +97,7 @@ page actually exists: public function view($page = 'home') { - if ( ! file_exists(APPPATH.'/views/pages/'.$page.'.php')) + if ( ! file_exists(APPPATH.'views/pages/'.$page.'.php')) { // Whoops, we don't have a page for that! show_404(); From b5a5d76d0733780c846963592ff813f867beaf97 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 16:34:30 +0200 Subject: [PATCH 4283/5397] Merge pull request #4532 from Tpojka/develop [ci skip] Remove an unnecessary slash from a documentation example --- user_guide_src/source/tutorial/static_pages.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/tutorial/static_pages.rst b/user_guide_src/source/tutorial/static_pages.rst index 569287c98a6..5daaa958fd9 100644 --- a/user_guide_src/source/tutorial/static_pages.rst +++ b/user_guide_src/source/tutorial/static_pages.rst @@ -97,7 +97,7 @@ page actually exists: public function view($page = 'home') { - if ( ! file_exists(APPPATH.'/views/pages/'.$page.'.php')) + if ( ! file_exists(APPPATH.'views/pages/'.$page.'.php')) { // Whoops, we don't have a page for that! show_404(); From 4f555079a6d85abd11403c72b9dbaa8823dc2e6d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 17:21:55 +0200 Subject: [PATCH 4284/5397] [ci skip] Deprecate prep_for_form() in Form_validation --- system/libraries/Form_validation.php | 7 ++++--- user_guide_src/source/changelog.rst | 1 + .../source/installation/upgrade_306.rst | 19 +++++++++++++++++++ .../source/libraries/form_validation.rst | 8 ++++---- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 9fb686892ef..6be593adda3 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1515,10 +1515,11 @@ public function valid_base64($str) * This function allows HTML to be safely shown in a form. * Special characters are converted. * - * @param string - * @return string + * @deprecated 3.0.6 Not used anywhere within the framework and pretty much useless + * @param mixed $data Input data + * @return mixed */ - public function prep_for_form($data = '') + public function prep_for_form($data) { if ($this->_safe_form_data === FALSE OR empty($data)) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index de488a9956d..e88b68f85f0 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -10,6 +10,7 @@ Release Date: Not Released - General Changes - Added a destructor to :doc:`Cache Library ` 'memcached' driver to ensure that Memcache(d) connections are properly closed. + - Deprecated :doc:`Form Validation Library ` method ``prep_for_form()``. Bug fixes for 3.0.6 ------------------- diff --git a/user_guide_src/source/installation/upgrade_306.rst b/user_guide_src/source/installation/upgrade_306.rst index e9c4bdd7957..f6d2f13d40a 100644 --- a/user_guide_src/source/installation/upgrade_306.rst +++ b/user_guide_src/source/installation/upgrade_306.rst @@ -12,3 +12,22 @@ Replace all files and directories in your *system/* directory. .. note:: If you have any custom developed files in these directories, please make copies of them first. + +Step 2: Remove 'prep_for_form' usage (deprecation) +================================================== + +The :doc:`Form Validation Library <../libraries/form_validation>` has a +``prep_for_form()`` method, which is/can also be used as a rule in +``set_rules()`` to automatically perform HTML encoding on input data. + +Automatically encoding input (instead of output) data is a bad practice in +the first place, and CodeIgniter and PHP itself offer other alternatives +to this method anyway. +For example, :doc:`Form Helper <../helpers/form_helper>` functions will +automatically perform HTML escaping when necessary. + +Therefore, the *prep_for_form* method/rule is pretty much useless and is now +deprecated and scheduled for removal in 3.1+. + +.. note:: The method is still available, but you're strongly encouraged to + remove its usage sooner rather than later. diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 9189d082ef8..44adfd715cc 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -1007,14 +1007,14 @@ Prepping Reference The following is a list of all the prepping methods that are available to use: -==================== ========= ======================================================================================================= +==================== ========= ============================================================================================================== Name Parameter Description -==================== ========= ======================================================================================================= -**prep_for_form** No Converts special characters so that HTML data can be shown in a form field without breaking it. +==================== ========= ============================================================================================================== +**prep_for_form** No DEPRECATED: Converts special characters so that HTML data can be shown in a form field without breaking it. **prep_url** No Adds "\http://" to URLs if missing. **strip_image_tags** No Strips the HTML from image tags leaving the raw URL. **encode_php_tags** No Converts PHP tags to entities. -==================== ========= ======================================================================================================= +==================== ========= ============================================================================================================== .. note:: You can also use any native PHP functions that permits one parameter, like ``trim()``, ``htmlspecialchars()``, ``urldecode()``, From 2961883c06ba963a67a68c34ef90a57ff5c38646 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 20:01:57 +0200 Subject: [PATCH 4285/5397] [ci skip] Update the index.php file - Use DIRECTORY_SEPARATOR instead of a hard-coded forward-slash - Use more proper terminology in comment descriptions - Small tweaks to directory detection logic --- index.php | 125 +++++++++++------- .../source/installation/upgrade_306.rst | 17 ++- 2 files changed, 90 insertions(+), 52 deletions(-) diff --git a/index.php b/index.php index 5cc37108a8d..6986e1e5ddb 100755 --- a/index.php +++ b/index.php @@ -91,24 +91,25 @@ /* *--------------------------------------------------------------- - * SYSTEM FOLDER NAME + * SYSTEM DIRCTORY NAME *--------------------------------------------------------------- * - * This variable must contain the name of your "system" folder. - * Include the path if the folder is not in the same directory - * as this file. + * This variable must contain the name of your "system" directory. + * Set the path if it is not in the same directory as this file. */ $system_path = 'system'; /* *--------------------------------------------------------------- - * APPLICATION FOLDER NAME + * APPLICATION DIRECTORY NAME *--------------------------------------------------------------- * * If you want this front controller to use a different "application" - * folder than the default one you can set its name here. The folder - * can also be renamed or relocated anywhere on your server. If - * you do, use a full server path. For more info please see the user guide: + * directory than the default one you can set its name here. The directory + * can also be renamed or relocated anywhere on your server. If you do, + * use an absolute (full) server path. + * For more info please see the user guide: + * * https://codeigniter.com/user_guide/general/managing_apps.html * * NO TRAILING SLASH! @@ -117,14 +118,14 @@ /* *--------------------------------------------------------------- - * VIEW FOLDER NAME + * VIEW DIRECTORY NAME *--------------------------------------------------------------- * - * If you want to move the view folder out of the application - * folder set the path to the folder here. The folder can be renamed + * If you want to move the view directory out of the application + * directory, set the path to it here. The directory can be renamed * and relocated anywhere on your server. If blank, it will default - * to the standard location inside your application folder. If you - * do move this, use the full server path to this folder. + * to the standard location inside your application directory. + * If you do move this, use an absolute (full) server path. * * NO TRAILING SLASH! */ @@ -150,8 +151,8 @@ * * Un-comment the $routing array below to use this feature */ - // The directory name, relative to the "controllers" folder. Leave blank - // if your controller is not in a sub-folder within the "controllers" folder + // The directory name, relative to the "controllers" directory. Leave blank + // if your controller is not in a sub-directory within the "controllers" one // $routing['directory'] = ''; // The controller class file name. Example: mycontroller @@ -197,12 +198,16 @@ if (($_temp = realpath($system_path)) !== FALSE) { - $system_path = $_temp.'/'; + $system_path = $_temp.DIRECTORY_SEPARATOR; } else { // Ensure there's a trailing slash - $system_path = rtrim($system_path, '/').'/'; + $system_path = strtr( + rtrim($system_path, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ).DIRECTORY_SEPARATOR; } // Is the system path correct? @@ -221,66 +226,84 @@ // The name of THIS file define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME)); - // Path to the system folder - define('BASEPATH', str_replace('\\', '/', $system_path)); + // Path to the system directory + define('BASEPATH', $system_path); - // Path to the front controller (this file) - define('FCPATH', dirname(__FILE__).'/'); + // Path to the front controller (this file) directory + define('FCPATH', dirname(__FILE__).DIRECTORY_SEPARATOR); - // Name of the "system folder" - define('SYSDIR', trim(strrchr(trim(BASEPATH, '/'), '/'), '/')); + // Name of the "system" directory + define('SYSDIR', basename(BASEPATH)); - // The path to the "application" folder + // The path to the "application" directory if (is_dir($application_folder)) { if (($_temp = realpath($application_folder)) !== FALSE) { - $application_folder = $_temp; + $application_folder = $_temp.DIRECTORY_SEPARATOR; + } + else + { + $application_folder = strtr( + rtrim($application_folder, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ); } - - define('APPPATH', $application_folder.DIRECTORY_SEPARATOR); + } + elseif (is_dir(BASEPATH.$application_folder.DIRECTORY_SEPARATOR)) + { + $application_folder = BASEPATH.strtr( + trim($application_folder, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ); } else { - if ( ! is_dir(BASEPATH.$application_folder.DIRECTORY_SEPARATOR)) - { - header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); - echo 'Your application folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF; - exit(3); // EXIT_CONFIG - } - - define('APPPATH', BASEPATH.$application_folder.DIRECTORY_SEPARATOR); + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); + echo 'Your application folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF; + exit(3); // EXIT_CONFIG } - // The path to the "views" folder - if ( ! is_dir($view_folder)) + define('APPPATH', $application_folder.DIRECTORY_SEPARATOR); + + // The path to the "views" directory + if ( ! isset($view_folder[0]) && is_dir(APPPATH.'views'.DIRECTORY_SEPARATOR)) { - if ( ! empty($view_folder) && is_dir(APPPATH.$view_folder.DIRECTORY_SEPARATOR)) - { - $view_folder = APPPATH.$view_folder; - } - elseif ( ! is_dir(APPPATH.'views'.DIRECTORY_SEPARATOR)) + $view_folder = APPPATH.'views'; + } + elseif (is_dir($view_folder)) + { + if (($_temp = realpath($view_folder)) !== FALSE) { - header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); - echo 'Your view folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF; - exit(3); // EXIT_CONFIG + $view_folder = $_temp; } else { - $view_folder = APPPATH.'views'; + $view_folder = strtr( + rtrim($view_folder, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ); } } - - if (($_temp = realpath($view_folder)) !== FALSE) + elseif (is_dir(APPPATH.$view_folder.DIRECTORY_SEPARATOR)) { - $view_folder = $_temp.DIRECTORY_SEPARATOR; + $view_folder = APPPATH.strtr( + trim($view_folder, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ); } else { - $view_folder = rtrim($view_folder, '/\\').DIRECTORY_SEPARATOR; + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); + echo 'Your view folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF; + exit(3); // EXIT_CONFIG } - define('VIEWPATH', $view_folder); + define('VIEWPATH', $view_folder.DIRECTORY_SEPARATOR); /* * -------------------------------------------------------------------- diff --git a/user_guide_src/source/installation/upgrade_306.rst b/user_guide_src/source/installation/upgrade_306.rst index f6d2f13d40a..3863e0afa5f 100644 --- a/user_guide_src/source/installation/upgrade_306.rst +++ b/user_guide_src/source/installation/upgrade_306.rst @@ -13,7 +13,22 @@ Replace all files and directories in your *system/* directory. .. note:: If you have any custom developed files in these directories, please make copies of them first. -Step 2: Remove 'prep_for_form' usage (deprecation) +Step 2: Update your index.php file (optional) +============================================= + +We've made some tweaks to the index.php file, mostly related to proper +usage of directory separators (i.e. use the ``DIRECTORY_SEPARATOR`` +constant instead of a hard coded forward slash "/"). + +Nothing will break if you skip this step, but if you're running Windows +or just want to be up to date with every change - we do recommend that +you update your index.php file. + +*Tip: Just copy the ``ENVIRONMENT``, ``$system_path``, ``$application_folder`` +and ``$view_folder`` declarations from the old file and put them into the +new one, replacing the defaults.* + +Step 3: Remove 'prep_for_form' usage (deprecation) ================================================== The :doc:`Form Validation Library <../libraries/form_validation>` has a From ca956162f5793527d7151bddd1fb223edbfed46b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 12 Mar 2016 20:04:08 +0200 Subject: [PATCH 4286/5397] [ci skip] Revert an unnecessary change from last commit --- index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.php b/index.php index 6986e1e5ddb..7f9a777b572 100755 --- a/index.php +++ b/index.php @@ -240,7 +240,7 @@ { if (($_temp = realpath($application_folder)) !== FALSE) { - $application_folder = $_temp.DIRECTORY_SEPARATOR; + $application_folder = $_temp; } else { From a990a8d195a13dd38bdd1620391a4e1b40770952 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sun, 13 Mar 2016 15:44:01 +0200 Subject: [PATCH 4287/5397] [ci skip] Fix a comment typo --- index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.php b/index.php index 7f9a777b572..d02b6bb3899 100755 --- a/index.php +++ b/index.php @@ -91,7 +91,7 @@ /* *--------------------------------------------------------------- - * SYSTEM DIRCTORY NAME + * SYSTEM DIRECTORY NAME *--------------------------------------------------------------- * * This variable must contain the name of your "system" directory. From 6047ec16b2a99b3c19d452b07b81be9df8d2ad78 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Mon, 14 Mar 2016 13:08:22 +0500 Subject: [PATCH 4288/5397] Removed socket_type and socket parameters from the user guide --- user_guide_src/source/libraries/caching.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/user_guide_src/source/libraries/caching.rst b/user_guide_src/source/libraries/caching.rst index a7081ec6b61..81019c0150e 100644 --- a/user_guide_src/source/libraries/caching.rst +++ b/user_guide_src/source/libraries/caching.rst @@ -255,8 +255,6 @@ To use it, you need `Redis server and phpredis PHP extension Date: Mon, 14 Mar 2016 13:18:39 +0500 Subject: [PATCH 4289/5397] UNIX socket check --- system/libraries/Cache/drivers/Cache_redis.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 29f43ba6f9e..b55d8bf258c 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -104,6 +104,11 @@ public function __construct() try { + if ($config['host']{0} === '/') + { + $config['port'] = 0; // for unix domain socket + } + if ( ! $this->_redis->connect($config['host'], $config['port'], $config['timeout'])) { log_message('error', 'Cache: Redis connection failed. Check your configuration.'); From 7755322d9457b1ba73f27e46e1d1fcfa62b46830 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Mon, 14 Mar 2016 13:36:15 +0500 Subject: [PATCH 4290/5397] Fixed brackets --- system/libraries/Cache/drivers/Cache_redis.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index b55d8bf258c..bae46bab480 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -104,7 +104,7 @@ public function __construct() try { - if ($config['host']{0} === '/') + if ($config['host'][0] === '/') { $config['port'] = 0; // for unix domain socket } From d3029505bc703c439d17dc902ad208574ba788b4 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Mon, 14 Mar 2016 13:38:58 +0500 Subject: [PATCH 4291/5397] Added the timeout value for the UNIX socket check --- system/libraries/Cache/drivers/Cache_redis.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index bae46bab480..1c12a0a2258 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -104,9 +104,11 @@ public function __construct() try { + // for unix domain socket if ($config['host'][0] === '/') { - $config['port'] = 0; // for unix domain socket + $config['port'] = 0; + $config['timeout'] = 0; } if ( ! $this->_redis->connect($config['host'], $config['port'], $config['timeout'])) From 49f440a12974ea0af37b3e306cd3a26aa557f469 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Mon, 14 Mar 2016 13:40:01 +0500 Subject: [PATCH 4292/5397] Removed a space char --- system/libraries/Cache/drivers/Cache_redis.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 1c12a0a2258..475dd4420d9 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -104,7 +104,7 @@ public function __construct() try { - // for unix domain socket + // for unix domain socket if ($config['host'][0] === '/') { $config['port'] = 0; From d327a4fc32b507a44e418cdd4b6e2c63690bc5cc Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Mon, 14 Mar 2016 14:05:12 +0500 Subject: [PATCH 4293/5397] Unix socket check in one long line --- system/libraries/Cache/drivers/Cache_redis.php | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 475dd4420d9..ec443243791 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -104,14 +104,7 @@ public function __construct() try { - // for unix domain socket - if ($config['host'][0] === '/') - { - $config['port'] = 0; - $config['timeout'] = 0; - } - - if ( ! $this->_redis->connect($config['host'], $config['port'], $config['timeout'])) + if ( ! $this->_redis->connect($config['host'], ($config['host'][0] === '/' ? 0 : $config['port']), $config['timeout'])) { log_message('error', 'Cache: Redis connection failed. Check your configuration.'); } From 2c10f60586faf59b9380608c5a9bf01ff2522483 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 15 Mar 2016 14:39:02 +0200 Subject: [PATCH 4294/5397] Add __isset() to CI_Session --- system/libraries/Session/Session.php | 18 ++++++++++++++++++ user_guide_src/source/changelog.rst | 1 + 2 files changed, 19 insertions(+) diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index 77c56ae7003..c9d2e8adc07 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -583,6 +583,24 @@ public function __get($key) // ------------------------------------------------------------------------ + /** + * __isset() + * + * @param string $key 'session_id' or a session data key + * @return bool + */ + public function __isset($key) + { + if ($key === 'session_id') + { + return (session_status() === PHP_SESSION_ACTIVE); + } + + return isset($_SESSION[$key]); + } + + // ------------------------------------------------------------------------ + /** * __set() * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e88b68f85f0..e235d2e6af3 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -16,6 +16,7 @@ Bug fixes for 3.0.6 ------------------- - Fixed a bug (#4516) - :doc:`Form Validation Library ` always accepted empty array inputs. +- Fixed a bug where :doc:`Session Library ` allowed accessing ``$_SESSION`` values as class properties but ``isset()`` didn't work on them. Version 3.0.5 ============= From 5576d2ca40666ada969fb2cb951fbddf8ca4ad8e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 16 Mar 2016 12:16:45 +0200 Subject: [PATCH 4295/5397] Simplify a bit of internal code in CI_Form_validation --- system/libraries/Form_validation.php | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 6be593adda3..ed4b9bccbc2 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -527,10 +527,7 @@ protected function _reset_post_array() { if ($row['is_array'] === FALSE) { - if (isset($_POST[$row['field']])) - { - $_POST[$row['field']] = $row['postdata']; - } + isset($_POST[$field]) && $_POST[$field] = $row['postdata']; } else { @@ -550,20 +547,7 @@ protected function _reset_post_array() } } - if (is_array($row['postdata'])) - { - $array = array(); - foreach ($row['postdata'] as $k => $v) - { - $array[$k] = $v; - } - - $post_ref = $array; - } - else - { - $post_ref = $row['postdata']; - } + $post_ref = $row['postdata']; } } } From 02ac187ce4789c5ab122a41e3b064ca923d98a82 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 16 Mar 2016 12:19:34 +0200 Subject: [PATCH 4296/5397] Fix a Form_validation bug that unnecessarily modifes $_POST --- system/libraries/Form_validation.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index ed4b9bccbc2..e4a5189579a 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -486,7 +486,7 @@ public function run($group = '') } // Now we need to re-set the POST data with the new, processed data - $this->_reset_post_array(); + empty($this->validation_data) && $this->_reset_post_array(); return ($total_errors === 0); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e235d2e6af3..8203aba4101 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -17,6 +17,7 @@ Bug fixes for 3.0.6 - Fixed a bug (#4516) - :doc:`Form Validation Library ` always accepted empty array inputs. - Fixed a bug where :doc:`Session Library ` allowed accessing ``$_SESSION`` values as class properties but ``isset()`` didn't work on them. +- Fixed a bug where :doc:`Form Validation Library ` modified the ``$_POST`` array when the data being validated was actually provided via ``set_data()``. Version 3.0.5 ============= From 7df9453c0797b3e9f8af2b2a03413282890a677b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 16 Mar 2016 12:39:52 +0200 Subject: [PATCH 4297/5397] [ci skip] Add (detection-based) UNIX sockets support to Cache_memcached --- .../Cache/drivers/Cache_memcached.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 6dee1e8e465..ca3997ad57b 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -102,10 +102,22 @@ public function __construct() return; } - foreach ($this->_config as $cache_server) + foreach ($this->_config as $cache_name => $cache_server) { - isset($cache_server['hostname']) OR $cache_server['hostname'] = $defaults['host']; - isset($cache_server['port']) OR $cache_server['port'] = $defaults['port']; + if ( ! isset($cache_server['hostname'])) + { + log_message('debug', 'Cache: Memcache(d) configuration "'.$cache_name.'" doesn\'t include a hostname; ignoring.'); + continue; + } + elseif ($cache_server['hostname'][0] === '/') + { + $cache_server['port'] = 0; + } + elseif (empty($cache_server['port'])) + { + $cache_server['port'] = $defaults['port']; + } + isset($cache_server['weight']) OR $cache_server['weight'] = $defaults['weight']; if ($this->_memcached instanceof Memcache) From 35e91f609d7d4d5944d13d1048c61e407b537c9e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 16 Mar 2016 12:40:24 +0200 Subject: [PATCH 4298/5397] [ci skip] Add changelog entries for recent CI_Cache changes to redis, memcached --- user_guide_src/source/changelog.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 3bb7e48f5e0..a9614cf8466 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -14,7 +14,13 @@ Release Date: Not Released - Libraries - Added UNIX socket connection support to :doc:`Session Library ` 'redis' driver. - - Changed data serialization logic in :doc:`Cache Library ` 'redis' driver for better performance. + + - :doc:`Cache Library ` changes include: + + - Added UNIX socket connection support to the 'memcached' driver. + - Changed the 'memcached' driver to ignore configurations that don't specify a hostname. + - Removed the *socket_type* configuration setting from the 'redis' driver. + - Changed data serialization logic in 'redis' driver for better performance. - Database From fa91f30c144c041ad19925e55fe06c4065337896 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 16 Mar 2016 14:33:15 +0200 Subject: [PATCH 4299/5397] [ci skip] Add upgrade instructions for CI_Cache changes --- .../source/installation/upgrade_310.rst | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/installation/upgrade_310.rst b/user_guide_src/source/installation/upgrade_310.rst index a6e6bae7e58..36f69d01bd6 100644 --- a/user_guide_src/source/installation/upgrade_310.rst +++ b/user_guide_src/source/installation/upgrade_310.rst @@ -62,7 +62,7 @@ Step 3: Check logic related to URI parsing of CLI requests ========================================================== When running a CodeIgniter application from the CLI, the -:doc:`URI Library ` will now ignore the +:doc:`URI Library <../libraries/uri>` will now ignore the ``$config['url_suffix']`` and ``$config['permitted_uri_chars']`` configuration settings. @@ -71,7 +71,34 @@ this change was made) and therefore you shouldn't be affected by this, but if you've relied on them for some reason, you'd probably have to make some changes to your code. -Step 4: Check usage of doctype() HTML helper +Step 4: Check Cache Library configurations for Redis, Memcache(d) +================================================================= + +The new improvements for the 'redis' and 'memcached' drivers of the +:doc:`Cache Library <../libraries/caching>` may require some small +adjustments to your configuration values ... + +Redis +----- + +If you're using the 'redis' driver with a UNIX socket connection, you'll +have to move the socket path from ``$config['socket']`` to +``$config['host']`` instead. + +The ``$config['socket_type']`` option is also removed, although that won't +affect your application - it will be ignored and the connection type will +be determined by the format used for ``$config['host']`` instead. + +Memcache(d) +----------- + +The 'memcached' will now ignore configurations that don't specify a ``host`` +value (previously, it just set the host to the default '127.0.0.1'). + +Therefore, if you've added a configuration that only sets e.g. a ``port``, +you will now have to explicitly set the ``host`` to '127.0.0.1' as well. + +Step 5: Check usage of doctype() HTML helper ============================================ The :doc:`HTML Helper <../helpers/html_helper>` function From f8490b994c959de3e1eabba27d8d919433e3fc70 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 16 Mar 2016 16:22:14 +0200 Subject: [PATCH 4300/5397] Fix #4539 --- system/libraries/Migration.php | 97 +++++++++++++++++++---------- user_guide_src/source/changelog.rst | 2 + 2 files changed, 65 insertions(+), 34 deletions(-) diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index 7aefb6c23cd..74bec3d60bc 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -96,9 +96,9 @@ class CI_Migration { /** * Migration basename regex * - * @var bool + * @var string */ - protected $_migration_regex = NULL; + protected $_migration_regex; /** * Error message @@ -217,31 +217,61 @@ public function version($target_version) if ($target_version > $current_version) { - // Moving Up $method = 'up'; } else { - // Moving Down, apply in reverse order $method = 'down'; + // We need this so that migrations are applied in reverse order krsort($migrations); } - if (empty($migrations)) - { - return TRUE; - } - - $previous = FALSE; - - // Validate all available migrations, and run the ones within our target range + // Validate all available migrations within our target range. + // + // Unfortunately, we'll have to use another loop to run them + // in order to avoid leaving the procedure in a broken state. + // + // See https://github.com/bcit-ci/CodeIgniter/issues/4539 + $pending = array(); foreach ($migrations as $number => $file) { + // Ignore versions out of our range. + // + // Because we've previously sorted the $migrations array depending on the direction, + // we can safely break the loop once we reach $target_version ... + if ($method === 'up') + { + if ($number <= $current_version) + { + continue; + } + elseif ($number > $target_version) + { + break; + } + } + else + { + if ($number > $current_version) + { + continue; + } + elseif ($number <= $target_version) + { + break; + } + } + // Check for sequence gaps - if ($this->_migration_type === 'sequential' && $previous !== FALSE && abs($number - $previous) > 1) + if ($this->_migration_type === 'sequential') { - $this->_error_string = sprintf($this->lang->line('migration_sequence_gap'), $number); - return FALSE; + if (isset($previous) && abs($number - $previous) > 1) + { + $this->_error_string = sprintf($this->lang->line('migration_sequence_gap'), $number); + return FALSE; + } + + $previous = $number; } include_once($file); @@ -253,27 +283,27 @@ public function version($target_version) $this->_error_string = sprintf($this->lang->line('migration_class_doesnt_exist'), $class); return FALSE; } + // method_exists() returns true for non-public methods, + // while is_callable() can't be used without instantiating. + // Only get_class_methods() satisfies both conditions. + elseif ( ! in_array($method, array_map('strtolower', get_class_methods($class)))) + { + $this->_error_string = sprintf($this->lang->line('migration_missing_'.$method.'_method'), $class); + return FALSE; + } - $previous = $number; + $pending[$number] = array($class, $method); + } - // Run migrations that are inside the target range - if ( - ($method === 'up' && $number > $current_version && $number <= $target_version) OR - ($method === 'down' && $number <= $current_version && $number > $target_version) - ) - { - $instance = new $class(); - if ( ! is_callable(array($instance, $method))) - { - $this->_error_string = sprintf($this->lang->line('migration_missing_'.$method.'_method'), $class); - return FALSE; - } + // Now just run the necessary migrations + foreach ($pending as $number => $migration) + { + log_message('debug', 'Migrating '.$method.' from version '.$current_version.' to version '.$number); - log_message('debug', 'Migrating '.$method.' from version '.$current_version.' to version '.$number); - call_user_func(array($instance, $method)); - $current_version = $number; - $this->_update_version($current_version); - } + $migration[0] = new $migration[0]; + call_user_func($migration); + $current_version = $number; + $this->_update_version($current_version); } // This is necessary when moving down, since the the last migration applied @@ -285,7 +315,6 @@ public function version($target_version) } log_message('debug', 'Finished migrating to '.$current_version); - return $current_version; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8203aba4101..b6d64fb8fff 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -18,6 +18,8 @@ Bug fixes for 3.0.6 - Fixed a bug (#4516) - :doc:`Form Validation Library ` always accepted empty array inputs. - Fixed a bug where :doc:`Session Library ` allowed accessing ``$_SESSION`` values as class properties but ``isset()`` didn't work on them. - Fixed a bug where :doc:`Form Validation Library ` modified the ``$_POST`` array when the data being validated was actually provided via ``set_data()``. +- Fixed a bug (#4539) - :doc:`Migration Library ` applied migrations before validating that all migrations within the requested version range are valid. +- Fixed a bug (#4539) - :doc:`Migration Library ` triggered failures for migrations that are out of the requested version range. Version 3.0.5 ============= From 3df07729b8018acd764a7a8a08f34f1579c43e5e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 16 Mar 2016 21:15:52 +0200 Subject: [PATCH 4301/5397] A small Migrations tweak --- system/libraries/Migration.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index 74bec3d60bc..316c94ae3a2 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -219,12 +219,17 @@ public function version($target_version) { $method = 'up'; } - else + elseif ($target_version < $current_version) { $method = 'down'; // We need this so that migrations are applied in reverse order krsort($migrations); } + else + { + // Well, there's nothing to migrate then ... + return TRUE; + } // Validate all available migrations within our target range. // From 51ee810a6463d05730da61893a76b122e0acc993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=BCl=C3=B6p=20M=C3=A1rk?= Date: Thu, 17 Mar 2016 13:58:40 +0100 Subject: [PATCH 4302/5397] adding code format on line 29 --- user_guide_src/source/libraries/zip.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/zip.rst b/user_guide_src/source/libraries/zip.rst index 816f49ca1ec..9704d5b1d81 100644 --- a/user_guide_src/source/libraries/zip.rst +++ b/user_guide_src/source/libraries/zip.rst @@ -24,7 +24,7 @@ your controller using the $this->load->library function:: $this->load->library('zip'); -Once loaded, the Zip library object will be available using: +Once loaded, the Zip library object will be available using:: $this->zip From 83dfab90b351ad575fb8b8b7c6ff4b2c287d1e9b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 17 Mar 2016 18:09:50 +0200 Subject: [PATCH 4303/5397] Merge pull request #4544 from fulopm/develop [ci skip] Fix codeblock formatting in Zip library docs --- user_guide_src/source/libraries/zip.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/zip.rst b/user_guide_src/source/libraries/zip.rst index 816f49ca1ec..9704d5b1d81 100644 --- a/user_guide_src/source/libraries/zip.rst +++ b/user_guide_src/source/libraries/zip.rst @@ -24,7 +24,7 @@ your controller using the $this->load->library function:: $this->load->library('zip'); -Once loaded, the Zip library object will be available using: +Once loaded, the Zip library object will be available using:: $this->zip From 9de0f0b3a65bea6adff9999977ea6b717099e194 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 21 Mar 2016 18:22:33 +0200 Subject: [PATCH 4304/5397] [ci skip] Prepare for 3.0.6 release --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/changelog.rst | 2 +- user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/installation/downloads.rst | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index f0d7c8f533e..3eb3e057333 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - define('CI_VERSION', '3.0.6-dev'); + define('CI_VERSION', '3.0.6'); /* * ------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b6d64fb8fff..86f51ca58d7 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -5,7 +5,7 @@ Change Log Version 3.0.6 ============= -Release Date: Not Released +Release Date: March 21, 2016 - General Changes diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index e4d14d10032..4fa2f01ba31 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.0.6-dev' +version = '3.0.6' # The full version, including alpha/beta/rc tags. -release = '3.0.6-dev' +release = '3.0.6' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index be33a1dc9af..979e4c20f6c 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,7 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.0.6-dev (Current version) `_ +- `CodeIgniter v3.0.6 (Current version) `_ - `CodeIgniter v3.0.5 `_ - `CodeIgniter v3.0.4 `_ - `CodeIgniter v3.0.3 `_ From eb373a1abb348515001123ecbaca5e5384e69d19 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 21 Mar 2016 18:30:06 +0200 Subject: [PATCH 4305/5397] [ci skip] Mark the start of 3.0.7 development --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/changelog.rst | 6 ++++++ user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/installation/downloads.rst | 3 ++- user_guide_src/source/installation/upgrade_307.rst | 14 ++++++++++++++ user_guide_src/source/installation/upgrading.rst | 1 + 6 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 user_guide_src/source/installation/upgrade_307.rst diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 3eb3e057333..f0d7c8f533e 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - define('CI_VERSION', '3.0.6'); + define('CI_VERSION', '3.0.6-dev'); /* * ------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 86f51ca58d7..341415f14b5 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -2,6 +2,12 @@ Change Log ########## +Version 3.0.7 +============= + +Release Date: Not Released + + Version 3.0.6 ============= diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 4fa2f01ba31..26f854d85af 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.0.6' +version = '3.0.7-dev' # The full version, including alpha/beta/rc tags. -release = '3.0.6' +release = '3.0.7-dev' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 979e4c20f6c..22c63b873d0 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,8 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.0.6 (Current version) `_ +- `CodeIgniter v3.0.7-dev (Current version) `_ +- `CodeIgniter v3.0.6 `_ - `CodeIgniter v3.0.5 `_ - `CodeIgniter v3.0.4 `_ - `CodeIgniter v3.0.3 `_ diff --git a/user_guide_src/source/installation/upgrade_307.rst b/user_guide_src/source/installation/upgrade_307.rst new file mode 100644 index 00000000000..ee957aabf96 --- /dev/null +++ b/user_guide_src/source/installation/upgrade_307.rst @@ -0,0 +1,14 @@ +############################# +Upgrading from 3.0.6 to 3.0.7 +############################# + +Before performing an update you should take your site offline by +replacing the index.php file with a static one. + +Step 1: Update your CodeIgniter files +===================================== + +Replace all files and directories in your *system/* directory. + +.. note:: If you have any custom developed files in these directories, + please make copies of them first. diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index 040c7283267..5beca65865e 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -8,6 +8,7 @@ upgrading from. .. toctree:: :titlesonly: + Upgrading from 3.0.6 to 3.0.7 Upgrading from 3.0.5 to 3.0.6 Upgrading from 3.0.4 to 3.0.5 Upgrading from 3.0.3 to 3.0.4 From 951a4d5c76a5b6403b40bcaff326cf8dbedcbca6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 22 Mar 2016 11:08:54 +0200 Subject: [PATCH 4306/5397] [ci skip] Fix CI_VERSION --- system/core/CodeIgniter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index f0d7c8f533e..aef0d3a5db1 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - define('CI_VERSION', '3.0.6-dev'); + define('CI_VERSION', '3.0.7-dev'); /* * ------------------------------------------------------ From eac4adfc24d1ad60af2bc3e08222ee7e5858f638 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 22 Mar 2016 11:24:14 +0200 Subject: [PATCH 4307/5397] [ci skip] Validate width, height config values --- system/libraries/Image_lib.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index f594b712580..edd13372d9e 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -456,7 +456,7 @@ public function initialize($props = array()) { if (property_exists($this, $key)) { - if (in_array($key, array('wm_font_color', 'wm_shadow_color'))) + if (in_array($key, array('wm_font_color', 'wm_shadow_color'), TRUE)) { if (preg_match('/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i', $val, $matches)) { @@ -478,6 +478,10 @@ public function initialize($props = array()) continue; } } + elseif (in_array($key, array('width', 'height'), TRUE) && ! ctype_digit((string) $val)) + { + continue; + } $this->$key = $val; } From b3f6934cb870f2da9c9891968e6f4d98effa741e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 22 Mar 2016 11:31:58 +0200 Subject: [PATCH 4308/5397] [ci skip] Escape image paths passed as shell arguments to imagemagick --- system/libraries/Image_lib.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index edd13372d9e..24fe8c68dfb 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -866,27 +866,28 @@ public function image_process_imagemagick($action = 'resize') if ($action === 'crop') { - $cmd .= ' -crop '.$this->width.'x'.$this->height.'+'.$this->x_axis.'+'.$this->y_axis.' "'.$this->full_src_path.'" "'.$this->full_dst_path .'" 2>&1'; + $cmd .= ' -crop '.$this->width.'x'.$this->height.'+'.$this->x_axis.'+'.$this->y_axis; } elseif ($action === 'rotate') { - $angle = ($this->rotation_angle === 'hor' OR $this->rotation_angle === 'vrt') - ? '-flop' : '-rotate '.$this->rotation_angle; - - $cmd .= ' '.$angle.' "'.$this->full_src_path.'" "'.$this->full_dst_path.'" 2>&1'; + $cmd .= ($this->rotation_angle === 'hor' OR $this->rotation_angle === 'vrt') + ? ' -flop' + : ' -rotate '.$this->rotation_angle; } else // Resize { if($this->maintain_ratio === TRUE) { - $cmd .= ' -resize '.$this->width.'x'.$this->height.' "'.$this->full_src_path.'" "'.$this->full_dst_path.'" 2>&1'; + $cmd .= ' -resize '.$this->width.'x'.$this->height; } else { - $cmd .= ' -resize '.$this->width.'x'.$this->height.'\! "'.$this->full_src_path.'" "'.$this->full_dst_path.'" 2>&1'; + $cmd .= ' -resize '.$this->width.'x'.$this->height.'\!'; } } + $cmd .= ' "'.escapeshellarg($this->full_src_path).'" "'.escapeshellarg($this->full_dst_path).'" 2>&1'; + $retval = 1; // exec() might be disabled if (function_usable('exec')) From 86758e1003e6ce44b205d2eb104318a309fd92ab Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 22 Mar 2016 11:39:41 +0200 Subject: [PATCH 4309/5397] [ci skip] Add changelog entries for last two commits --- user_guide_src/source/changelog.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 341415f14b5..88b797b9187 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,14 @@ Version 3.0.7 Release Date: Not Released +- General Changes + + - Updated :doc:`Image Manipulation Library ` to validate *width* and *height* configuration values. + +Bug fixes for 3.0.7 +------------------- + +- Fixed a bug where :doc:`Image Manipulation Library ` didn't escape image source paths passed to ImageMagick as shell arguments. Version 3.0.6 ============= From 4d2628e8aab6d0673ac0a010acbfaa9d76b7d568 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 22 Mar 2016 13:42:03 +0200 Subject: [PATCH 4310/5397] random_bytes()-related improvements See #4260 --- system/core/compat/password.php | 26 ++++++++++++++++++++++---- system/libraries/Encryption.php | 26 ++++++++++++++++++++------ user_guide_src/source/changelog.rst | 7 +++++++ 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/system/core/compat/password.php b/system/core/compat/password.php index f0c22c780cc..76dd2cf0a1d 100644 --- a/system/core/compat/password.php +++ b/system/core/compat/password.php @@ -116,13 +116,21 @@ function password_hash($password, $algo, array $options = array()) } elseif ( ! isset($options['salt'])) { - if (defined('MCRYPT_DEV_URANDOM')) + if (function_exists('random_bytes')) { - $options['salt'] = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); + try + { + $options['salt'] = random_bytes(16); + } + catch (Exception $e) + { + log_message('error', 'compat/password: Error while trying to use random_bytes(): '.$e->getMessage()); + return FALSE; + } } - elseif (function_exists('openssl_random_pseudo_bytes')) + elseif (defined('MCRYPT_DEV_URANDOM')) { - $options['salt'] = openssl_random_pseudo_bytes(16); + $options['salt'] = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); } elseif (DIRECTORY_SEPARATOR === '/' && (is_readable($dev = '/dev/arandom') OR is_readable($dev = '/dev/urandom'))) { @@ -148,6 +156,16 @@ function password_hash($password, $algo, array $options = array()) fclose($fp); } + elseif (function_exists('openssl_random_pseudo_bytes')) + { + $is_secure = NULL; + $options['salt'] = openssl_random_pseudo_bytes(16, $is_secure); + if ($is_secure !== TRUE) + { + log_message('error', 'compat/password: openssl_random_pseudo_bytes() set the $cryto_strong flag to FALSE'); + return FALSE; + } + } else { log_message('error', 'compat/password: No CSPRNG available.'); diff --git a/system/libraries/Encryption.php b/system/libraries/Encryption.php index 92c38a0ed24..a10a5c20ccc 100644 --- a/system/libraries/Encryption.php +++ b/system/libraries/Encryption.php @@ -339,12 +339,26 @@ public function create_key($length) { if (function_exists('random_bytes')) { - return random_bytes((int) $length); + try + { + return random_bytes((int) $length); + } + catch (Exception $e) + { + log_message('error', $e->getMessage()); + return FALSE; + } + } + elseif (defined('MCRYPT_DEV_URANDOM')) + { + return mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); } - return ($this->_driver === 'mcrypt') - ? mcrypt_create_iv($length, MCRYPT_DEV_URANDOM) - : openssl_random_pseudo_bytes($length); + $is_secure = NULL; + $key = openssl_random_pseudo_bytes($length, $is_secure); + return ($is_secure === TRUE) + ? $key + : FALSE; } // -------------------------------------------------------------------- @@ -400,7 +414,7 @@ protected function _mcrypt_encrypt($data, $params) // The greater-than-1 comparison is mostly a work-around for a bug, // where 1 is returned for ARCFour instead of 0. $iv = (($iv_size = mcrypt_enc_get_iv_size($params['handle'])) > 1) - ? mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM) + ? $this->create_key($iv_size) : NULL; if (mcrypt_generic_init($params['handle'], $params['key'], $iv) < 0) @@ -463,7 +477,7 @@ protected function _openssl_encrypt($data, $params) } $iv = ($iv_size = openssl_cipher_iv_length($params['handle'])) - ? openssl_random_pseudo_bytes($iv_size) + ? $this->create_key($iv_size) : NULL; $data = openssl_encrypt( diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 88b797b9187..5732ed3c6a5 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -10,6 +10,13 @@ Release Date: Not Released - General Changes - Updated :doc:`Image Manipulation Library ` to validate *width* and *height* configuration values. + - Updated :doc:`Encryption Library ` to always prefer ``random_bytes()`` when it is available. + + - :php:func:`password_hash()` :doc:`compatibility function ` changes: + + - Changed salt-generation logic to prefer ``random_bytes()`` when it is available. + - Changed salt-generation logic to prefer direct access to */dev/urandom* over ``openssl_random_pseudo_bytes()``. + - Changed salt-generation logic to error if ``openssl_random_pseudo_bytes()`` sets its ``$crypto_strong`` flag to FALSE. Bug fixes for 3.0.7 ------------------- From 2f576ef91e9517191b31f6771c3a3e58f638b47d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 22 Mar 2016 15:32:52 +0200 Subject: [PATCH 4311/5397] [ci skip] Add prep_for_form deprecation (since 3.0.6) to 3.0.x upgrade instructions --- .../source/installation/upgrade_300.rst | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 9a40f2b60ec..0fc211f893f 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -842,7 +842,6 @@ CodeIgniter 3.1+. .. note:: This method is still available, but you're strongly encouraged to remove its usage sooner rather than later. -====================== The Javascript library ====================== @@ -854,6 +853,25 @@ It is now deprecated and scheduled for removal in CodeIgniter 3.1+. .. note:: This library is still available, but you're strongly encouraged to remove its usage sooner rather than later. +Form Validation method prep_for_form() +====================================== + +The :doc:`Form Validation Library <../libraries/form_validation>` has a +``prep_for_form()`` method, which is/can also be used as a rule in +``set_rules()`` to automatically perform HTML encoding on input data. + +Automatically encoding input (instead of output) data is a bad practice in +the first place, and CodeIgniter and PHP itself offer other alternatives +to this method anyway. +For example, :doc:`Form Helper <../helpers/form_helper>` functions will +automatically perform HTML escaping when necessary. + +Therefore, the *prep_for_form* method/rule is pretty much useless and is now +deprecated and scheduled for removal in 3.1+. + +.. note:: The method is still available, but you're strongly encouraged to + remove its usage sooner rather than later. + *********************************************************** Step 21: Check your usage of Text helper highlight_phrase() *********************************************************** From b9c69165355732c5c8d18f16f11481283a04ccb0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 30 Mar 2016 13:32:15 +0300 Subject: [PATCH 4312/5397] [ci skip] Fix #4557 --- user_guide_src/source/libraries/form_validation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 44adfd715cc..b03b544e2fb 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -465,7 +465,7 @@ for you to process. To invoke a callback just put the method name in a rule, with "callback\_" as the rule **prefix**. If you need to receive an extra parameter in your callback method, just add it normally after the -method name between square brackets, as in: "callback_foo**[bar]**", +method name between square brackets, as in: ``callback_foo[bar]``, then it will be passed as the second argument of your callback method. .. note:: You can also process the form data that is passed to your From b97e6b2e7e2f58aa7bba937b96dd2e9d3089e4d2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 1 Apr 2016 12:04:01 +0300 Subject: [PATCH 4313/5397] [ci skip] Fix #861 (regression) --- system/database/drivers/mssql/mssql_forge.php | 5 +++++ system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php | 5 +++++ system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php | 5 +++++ system/database/drivers/sqlsrv/sqlsrv_forge.php | 5 +++++ user_guide_src/source/changelog.rst | 1 + 5 files changed, 21 insertions(+) diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php index 24d1fc204b0..91b5794bc04 100644 --- a/system/database/drivers/mssql/mssql_forge.php +++ b/system/database/drivers/mssql/mssql_forge.php @@ -113,6 +113,11 @@ protected function _alter_table($alter_type, $table, $field) */ protected function _attr_type(&$attributes) { + if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) + { + unset($attributes['CONSTRAINT']); + } + switch (strtoupper($attributes['TYPE'])) { case 'MEDIUMINT': diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php index d5dd9aad13f..83020032545 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php @@ -111,6 +111,11 @@ protected function _alter_table($alter_type, $table, $field) */ protected function _attr_type(&$attributes) { + if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) + { + unset($attributes['CONSTRAINT']); + } + switch (strtoupper($attributes['TYPE'])) { case 'MEDIUMINT': diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php index 602f895f188..56bf87f3a4c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php @@ -111,6 +111,11 @@ protected function _alter_table($alter_type, $table, $field) */ protected function _attr_type(&$attributes) { + if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) + { + unset($attributes['CONSTRAINT']); + } + switch (strtoupper($attributes['TYPE'])) { case 'MEDIUMINT': diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php index f915dad3eed..4f0ce9d6fa6 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -111,6 +111,11 @@ protected function _alter_table($alter_type, $table, $field) */ protected function _attr_type(&$attributes) { + if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) + { + unset($attributes['CONSTRAINT']); + } + switch (strtoupper($attributes['TYPE'])) { case 'MEDIUMINT': diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 5732ed3c6a5..3cef6b66cf6 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -22,6 +22,7 @@ Bug fixes for 3.0.7 ------------------- - Fixed a bug where :doc:`Image Manipulation Library ` didn't escape image source paths passed to ImageMagick as shell arguments. +- Fixed a bug (#861) - :doc:`Database Forge ` method ``create_table()`` incorrectly accepts field width constraints for MSSQL/SQLSRV integer-type columns. Version 3.0.6 ============= From f8312cfa38d2793f1b365f918395019f343fe1c0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 1 Apr 2016 21:11:23 +0300 Subject: [PATCH 4314/5397] [ci skip] Fix #4562 --- system/libraries/Cache/drivers/Cache_memcached.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 6dee1e8e465..836336d469d 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -295,7 +295,7 @@ public function __destruct() { $this->_memcached->close(); } - elseif ($this->_memcached instanceof Memcached) + elseif ($this->_memcached instanceof Memcached && method_exists($this->_memcached, 'quit')) { $this->_memcached->quit(); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 3cef6b66cf6..1f886608904 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -23,6 +23,7 @@ Bug fixes for 3.0.7 - Fixed a bug where :doc:`Image Manipulation Library ` didn't escape image source paths passed to ImageMagick as shell arguments. - Fixed a bug (#861) - :doc:`Database Forge ` method ``create_table()`` incorrectly accepts field width constraints for MSSQL/SQLSRV integer-type columns. +- Fixed a bug (#4562) - :doc:`Cache Library ` didn't check if ``Memcached::quit()`` is available before calling it. Version 3.0.6 ============= From 85dfc2a6f76ca95e803535c25877e2aa1c05c38b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 1 Apr 2016 22:54:15 +0300 Subject: [PATCH 4315/5397] [ci skip] Add some 'debug' log messages to CI_Session --- system/libraries/Session/Session.php | 1 + system/libraries/Session/drivers/Session_database_driver.php | 5 ++++- system/libraries/Session/drivers/Session_files_driver.php | 1 + user_guide_src/source/changelog.rst | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index c9d2e8adc07..1bdc6e5ccef 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -91,6 +91,7 @@ public function __construct(array $params = array()) // Note: BC workaround elseif (config_item('sess_use_database')) { + log_message('debug', 'Session: "sess_driver" is empty; using BC fallback to "sess_use_database".'); $this->_driver = 'database'; } diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index 317bd7d4d0a..cb152f91fa7 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -109,7 +109,10 @@ public function __construct(&$params) } // Note: BC work-around for the old 'sess_table_name' setting, should be removed in the future. - isset($this->_config['save_path']) OR $this->_config['save_path'] = config_item('sess_table_name'); + if ( ! isset($this->_config['save_path']) && ($this->_config['save_path'] = config_item('sess_table_name'))) + { + log_message('debug', 'Session: "sess_save_path" is empty; using BC fallback to "sess_table_name".'); + } } // ------------------------------------------------------------------------ diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index 119bf65729e..57c3777a2a5 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -95,6 +95,7 @@ public function __construct(&$params) } else { + log_message('debug', 'Session: "sess_save_path" is empty; using "session.save_path" value from php.ini.'); $this->_config['save_path'] = rtrim(ini_get('session.save_path'), '/\\'); } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1f886608904..40f7c13028f 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -11,6 +11,7 @@ Release Date: Not Released - Updated :doc:`Image Manipulation Library ` to validate *width* and *height* configuration values. - Updated :doc:`Encryption Library ` to always prefer ``random_bytes()`` when it is available. + - Updated :doc:`Session Library ` to log 'debug' messages when using fallbacks to *session.save_path* (php.ini) or 'sess_use_database', 'sess_table_name' settings. - :php:func:`password_hash()` :doc:`compatibility function ` changes: From cd3d5956f7880091740489c5f24af0e72f677c0c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 4 Apr 2016 10:28:31 +0300 Subject: [PATCH 4316/5397] Fix #4563 --- system/core/Input.php | 26 ++++++++++++++------------ user_guide_src/source/changelog.rst | 1 + 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index a7c9ecd0d74..50ca047e8d2 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -760,30 +760,32 @@ public function request_headers($xss_clean = FALSE) // If header is already defined, return it immediately if ( ! empty($this->headers)) { - return $this->headers; + return $this->_fetch_from_array($this->headers, NULL, $xss_clean); } // In Apache, you can simply call apache_request_headers() if (function_exists('apache_request_headers')) { - return $this->headers = apache_request_headers(); + $this->headers = apache_request_headers(); } - - $this->headers['Content-Type'] = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); - - foreach ($_SERVER as $key => $val) + else { - if (sscanf($key, 'HTTP_%s', $header) === 1) + isset($_SERVER['CONTENT_TYPE']) && $this->headers['Content-Type'] = $_SERVER['CONTENT_TYPE']; + + foreach ($_SERVER as $key => $val) { - // take SOME_HEADER and turn it into Some-Header - $header = str_replace('_', ' ', strtolower($header)); - $header = str_replace(' ', '-', ucwords($header)); + if (sscanf($key, 'HTTP_%s', $header) === 1) + { + // take SOME_HEADER and turn it into Some-Header + $header = str_replace('_', ' ', strtolower($header)); + $header = str_replace(' ', '-', ucwords($header)); - $this->headers[$header] = $this->_fetch_from_array($_SERVER, $key, $xss_clean); + $this->headers[$header] = $_SERVER[$key]; + } } } - return $this->headers; + return $this->_fetch_from_array($this->headers, NULL, $xss_clean); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 40f7c13028f..5a482208aa9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -25,6 +25,7 @@ Bug fixes for 3.0.7 - Fixed a bug where :doc:`Image Manipulation Library ` didn't escape image source paths passed to ImageMagick as shell arguments. - Fixed a bug (#861) - :doc:`Database Forge ` method ``create_table()`` incorrectly accepts field width constraints for MSSQL/SQLSRV integer-type columns. - Fixed a bug (#4562) - :doc:`Cache Library ` didn't check if ``Memcached::quit()`` is available before calling it. +- Fixed a bug (#4563) - :doc:`Input Library ` method ``request_headers()`` ignores ``$xss_clean`` parameter value after first call. Version 3.0.6 ============= From a2f837f0931f23cc440c1b7ffd298c6fe8705fe9 Mon Sep 17 00:00:00 2001 From: Moses Kurniawan Date: Wed, 13 Apr 2016 01:05:17 +0700 Subject: [PATCH 4317/5397] Removed double quotes on $cid because if we using quotes, the embedded image will not appear. --- user_guide_src/source/libraries/email.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/email.rst b/user_guide_src/source/libraries/email.rst index eadfcfd5c38..0b38737f10f 100644 --- a/user_guide_src/source/libraries/email.rst +++ b/user_guide_src/source/libraries/email.rst @@ -374,7 +374,7 @@ Class Reference { $this->email->to($address); $cid = $this->email->attachment_cid($filename); - $this->email->message('photo1'); + $this->email->message('photo1'); $this->email->send(); } From 98026f1ef2b05859b15602a5e2445575b24188ba Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 12 Apr 2016 21:15:38 +0300 Subject: [PATCH 4318/5397] Merge pull request #4579 from mokalovesoulmate/develop [ci skip] Fix a CI_Email documentation example --- user_guide_src/source/libraries/email.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/email.rst b/user_guide_src/source/libraries/email.rst index eadfcfd5c38..0b38737f10f 100644 --- a/user_guide_src/source/libraries/email.rst +++ b/user_guide_src/source/libraries/email.rst @@ -374,7 +374,7 @@ Class Reference { $this->email->to($address); $cid = $this->email->attachment_cid($filename); - $this->email->message('photo1'); + $this->email->message('photo1'); $this->email->send(); } From 92d8eb2acf7204d01f595081551a4b08c4660cf3 Mon Sep 17 00:00:00 2001 From: Robert Angyal Date: Sun, 17 Apr 2016 06:48:22 +0200 Subject: [PATCH 4319/5397] Fixes #4583 by separating attachments to related and mixed multiparts Signed-off-by: Robert Angyal --- system/libraries/Email.php | 135 +++++++++++++++++++++++++++---------- 1 file changed, 101 insertions(+), 34 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index ed6f737a1f9..ef9b58b617d 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -149,13 +149,6 @@ class CI_Email { */ public $charset = 'utf-8'; - /** - * Multipart message - * - * @var string 'mixed' (in the body) or 'related' (separate) - */ - public $multipart = 'mixed'; // "mixed" (in the body) or "related" (separate) - /** * Alternative message (for HTML messages only) * @@ -274,6 +267,13 @@ class CI_Email { */ protected $_atc_boundary = ''; + /** + * Related Attachment boundary + * + * @var string + */ + protected $_rel_boundary = ''; + /** * Final headers to send * @@ -766,7 +766,8 @@ public function attach($file, $disposition = '', $newname = NULL, $mime = '') 'name' => array($file, $newname), 'disposition' => empty($disposition) ? 'attachment' : $disposition, // Can also be 'inline' Not sure if it matters 'type' => $mime, - 'content' => chunk_split(base64_encode($file_content)) + 'content' => chunk_split(base64_encode($file_content)), + 'multipart' => 'mixed' ); return $this; @@ -784,15 +785,11 @@ public function attach($file, $disposition = '', $newname = NULL, $mime = '') */ public function attachment_cid($filename) { - if ($this->multipart !== 'related') - { - $this->multipart = 'related'; // Thunderbird need this for inline images - } - for ($i = 0, $c = count($this->_attachments); $i < $c; $i++) { if ($this->_attachments[$i]['name'][0] === $filename) { + $this->_attachments[$i]['multipart'] = 'related'; $this->_attachments[$i]['cid'] = uniqid(basename($this->_attachments[$i]['name'][0]).'@'); return $this->_attachments[$i]['cid']; } @@ -945,6 +942,7 @@ protected function _set_boundaries() { $this->_alt_boundary = 'B_ALT_'.uniqid(''); // multipart/alternative $this->_atc_boundary = 'B_ATC_'.uniqid(''); // attachment boundary + $this->_rel_boundary = 'B_REL_'.uniqid(''); // related attachment boundary } // -------------------------------------------------------------------- @@ -1391,7 +1389,7 @@ protected function _build_message() case 'plain-attach' : - $hdr .= 'Content-Type: multipart/'.$this->multipart.'; boundary="'.$this->_atc_boundary.'"'; + $hdr .= 'Content-Type: multipart/mixed; boundary="'.$this->_atc_boundary.'"'; if ($this->_get_protocol() === 'mail') { @@ -1406,18 +1404,45 @@ protected function _build_message() .$this->newline .$this->_body.$this->newline.$this->newline; + $attachment_prepared = $this->_prep_attachments($this->_attachments, $this->_atc_boundary); + break; case 'html-attach' : - $hdr .= 'Content-Type: multipart/'.$this->multipart.'; boundary="'.$this->_atc_boundary.'"'; + $attachments_indexed_by_multipart = $this->_attachments_indexed_by_multipart(); + $attachments_related = $attachments_indexed_by_multipart['related']; + $attachments_mixed = $attachments_indexed_by_multipart['mixed']; + $prepared_attachment_parts = array(); + + if (isset($attachments_mixed) && count($attachments_mixed) > 0) + { + $hdr .= 'Content-Type: multipart/mixed; boundary="'.$this->_atc_boundary.'"'; + + array_push($prepared_attachment_parts, $this->_prep_attachments($attachments_mixed, $this->_atc_boundary)); + $last_boundary = $this->_atc_boundary; + } + + if (isset($attachments_related) && count($attachments_related) > 0) + { + $target_container =& $hdr; + if (isset($last_boundary)) { + $target_container =& $body; + $target_container .= '--' . $last_boundary . $this->newline; + } + $target_container .= 'Content-Type: multipart/related; boundary="'.$this->_rel_boundary.'"'; + + array_unshift($prepared_attachment_parts, $this->_prep_attachments($attachments_related, $this->_rel_boundary)); + $last_boundary = $this->_rel_boundary; + } if ($this->_get_protocol() === 'mail') { $this->_header_str .= $hdr; } + if (strlen(body) > 0) $body .= $this->newline.$this->newline; $body .= $this->_get_mime_message().$this->newline.$this->newline - .'--'.$this->_atc_boundary.$this->newline + .'--'.$last_boundary.$this->newline .'Content-Type: multipart/alternative; boundary="'.$this->_alt_boundary.'"'.$this->newline.$this->newline .'--'.$this->_alt_boundary.$this->newline @@ -1432,27 +1457,12 @@ protected function _build_message() .$this->_prep_quoted_printable($this->_body).$this->newline.$this->newline .'--'.$this->_alt_boundary.'--'.$this->newline.$this->newline; - break; - } - - $attachment = array(); - for ($i = 0, $c = count($this->_attachments), $z = 0; $i < $c; $i++) - { - $filename = $this->_attachments[$i]['name'][0]; - $basename = ($this->_attachments[$i]['name'][1] === NULL) - ? basename($filename) : $this->_attachments[$i]['name'][1]; - - $attachment[$z++] = '--'.$this->_atc_boundary.$this->newline - .'Content-type: '.$this->_attachments[$i]['type'].'; ' - .'name="'.$basename.'"'.$this->newline - .'Content-Disposition: '.$this->_attachments[$i]['disposition'].';'.$this->newline - .'Content-Transfer-Encoding: base64'.$this->newline - .(empty($this->_attachments[$i]['cid']) ? '' : 'Content-ID: <'.$this->_attachments[$i]['cid'].'>'.$this->newline); + $attachment_prepared = implode($this->newline.$this->newline, $prepared_attachment_parts); - $attachment[$z++] = $this->_attachments[$i]['content']; + break; } - $body .= implode($this->newline, $attachment).$this->newline.'--'.$this->_atc_boundary.'--'; + $body .= $attachment_prepared; $this->_finalbody = ($this->_get_protocol() === 'mail') ? $body : $hdr.$this->newline.$this->newline.$body; @@ -1462,6 +1472,63 @@ protected function _build_message() // -------------------------------------------------------------------- + /** + * Returns attachments mapped by multipart type + * + * @return array + */ + protected function _attachments_indexed_by_multipart() + { + foreach ($this->_attachments as $attachment) + { + $multipart = $attachment['multipart']; + if (!isset($attachments_indexed[$multipart])) + { + $attachments_indexed[$multipart] = array(); + } + array_push($attachments_indexed[$multipart], $attachment); + } + + return $attachments_indexed; + } + + // -------------------------------------------------------------------- + + /** + * Prepares attachment string + * + * @param array $attachments + * @param string $boundary Multipart boundary string + * @return string + */ + protected function _prep_attachments($attachments, $boundary) + { + if (!isset($attachments) || count($attachments) === 0) return ''; + + $attachment_parts = array(); + foreach ($attachments as $attachment) + { + $filename = $attachment['name'][0]; + $basename = ($attachment['name'][1] === NULL) + ? basename($filename) : $attachment['name'][1]; + + array_push( + $attachment_parts, + '--'.$boundary.$this->newline + .'Content-type: '.$attachment['type'].'; ' + .'name="'.$basename.'"'.$this->newline + .'Content-Disposition: '.$attachment['disposition'].';'.$this->newline + .'Content-Transfer-Encoding: base64'.$this->newline + .(empty($attachment['cid']) ? '' : 'Content-ID: <'.$attachment['cid'].'>'.$this->newline), + $attachment['content'] + ); + } + + return implode($this->newline, $attachment_parts).$this->newline.'--'.$boundary.'--'; + } + + // -------------------------------------------------------------------- + /** * Prep Quoted Printable * From 832fd00b10f2fb236e0bf5b770d3298e6fedee64 Mon Sep 17 00:00:00 2001 From: Robert Angyal Date: Wed, 20 Apr 2016 05:20:15 +0200 Subject: [PATCH 4320/5397] #4583 Fix code style issues Signed-off-by: Robert Angyal --- system/libraries/Email.php | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index ef9b58b617d..cbb48f52574 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -767,7 +767,7 @@ public function attach($file, $disposition = '', $newname = NULL, $mime = '') 'disposition' => empty($disposition) ? 'attachment' : $disposition, // Can also be 'inline' Not sure if it matters 'type' => $mime, 'content' => chunk_split(base64_encode($file_content)), - 'multipart' => 'mixed' + 'multipart' => 'mixed' ); return $this; @@ -1413,6 +1413,7 @@ protected function _build_message() $attachments_related = $attachments_indexed_by_multipart['related']; $attachments_mixed = $attachments_indexed_by_multipart['mixed']; $prepared_attachment_parts = array(); + $last_boundary = NULL; if (isset($attachments_mixed) && count($attachments_mixed) > 0) { @@ -1425,7 +1426,8 @@ protected function _build_message() if (isset($attachments_related) && count($attachments_related) > 0) { $target_container =& $hdr; - if (isset($last_boundary)) { + if (isset($last_boundary)) + { $target_container =& $body; $target_container .= '--' . $last_boundary . $this->newline; } @@ -1440,7 +1442,10 @@ protected function _build_message() $this->_header_str .= $hdr; } - if (strlen(body) > 0) $body .= $this->newline.$this->newline; + if (strlen(body) > 0) + { + $body .= $this->newline.$this->newline; + } $body .= $this->_get_mime_message().$this->newline.$this->newline .'--'.$last_boundary.$this->newline @@ -1475,7 +1480,7 @@ protected function _build_message() /** * Returns attachments mapped by multipart type * - * @return array + * @return array */ protected function _attachments_indexed_by_multipart() { @@ -1497,13 +1502,16 @@ protected function _attachments_indexed_by_multipart() /** * Prepares attachment string * - * @param array $attachments - * @param string $boundary Multipart boundary string - * @return string + * @param array $attachments + * @param string $boundary Multipart boundary string + * @return string */ protected function _prep_attachments($attachments, $boundary) { - if (!isset($attachments) || count($attachments) === 0) return ''; + if (!isset($attachments) OR count($attachments) === 0) + { + return ''; + } $attachment_parts = array(); foreach ($attachments as $attachment) From 57d2140687c74abd7b5a4bb4b859015eb703d565 Mon Sep 17 00:00:00 2001 From: rochefort Date: Thu, 28 Apr 2016 02:41:17 +0900 Subject: [PATCH 4321/5397] Fix a type of parameter in url_title [ci skip] --- user_guide_src/source/helpers/url_helper.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/helpers/url_helper.rst b/user_guide_src/source/helpers/url_helper.rst index 64deae240ec..6fb0dd94260 100644 --- a/user_guide_src/source/helpers/url_helper.rst +++ b/user_guide_src/source/helpers/url_helper.rst @@ -277,7 +277,7 @@ Available Functions :param string $str: Input string :param string $separator: Word separator - :param string $lowercase: Whether to transform the output string to lower-case + :param bool $lowercase: Whether to transform the output string to lower-case :returns: URL-formatted string :rtype: string @@ -370,4 +370,4 @@ Available Functions will *automatically* be selected when the page is currently accessed via POST and HTTP/1.1 is used. - .. important:: This function will terminate script execution. \ No newline at end of file + .. important:: This function will terminate script execution. From 9343851e6155f6728e02332000f1885e248e907d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 28 Apr 2016 11:09:06 +0300 Subject: [PATCH 4322/5397] Merge pull request #4603 from rochefort/fix-type [ci skip] Fix a parameter type in url_title() docs --- user_guide_src/source/helpers/url_helper.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/helpers/url_helper.rst b/user_guide_src/source/helpers/url_helper.rst index 64deae240ec..6fb0dd94260 100644 --- a/user_guide_src/source/helpers/url_helper.rst +++ b/user_guide_src/source/helpers/url_helper.rst @@ -277,7 +277,7 @@ Available Functions :param string $str: Input string :param string $separator: Word separator - :param string $lowercase: Whether to transform the output string to lower-case + :param bool $lowercase: Whether to transform the output string to lower-case :returns: URL-formatted string :rtype: string @@ -370,4 +370,4 @@ Available Functions will *automatically* be selected when the page is currently accessed via POST and HTTP/1.1 is used. - .. important:: This function will terminate script execution. \ No newline at end of file + .. important:: This function will terminate script execution. From ed458fbdb36f8d8d7bd7d818dbb2983485e86b3c Mon Sep 17 00:00:00 2001 From: Robert Angyal Date: Thu, 28 Apr 2016 10:26:56 +0200 Subject: [PATCH 4323/5397] #4583 Refactor according to the suggestions commented on Pull Request Signed-off-by: Robert Angyal --- system/libraries/Email.php | 68 +++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index cbb48f52574..e35c48ec46a 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1406,34 +1406,34 @@ protected function _build_message() $attachment_prepared = $this->_prep_attachments($this->_attachments, $this->_atc_boundary); - break; + break; case 'html-attach' : $attachments_indexed_by_multipart = $this->_attachments_indexed_by_multipart(); - $attachments_related = $attachments_indexed_by_multipart['related']; - $attachments_mixed = $attachments_indexed_by_multipart['mixed']; $prepared_attachment_parts = array(); $last_boundary = NULL; - if (isset($attachments_mixed) && count($attachments_mixed) > 0) + if ( ! empty($attachments_indexed_by_multipart['mixed'])) { $hdr .= 'Content-Type: multipart/mixed; boundary="'.$this->_atc_boundary.'"'; - array_push($prepared_attachment_parts, $this->_prep_attachments($attachments_mixed, $this->_atc_boundary)); + $prepared_attachment_parts[] = $this->_prep_attachments($attachments_indexed_by_multipart['mixed'], $this->_atc_boundary); $last_boundary = $this->_atc_boundary; } - if (isset($attachments_related) && count($attachments_related) > 0) + if ( ! empty($attachments_indexed_by_multipart['related'])) { - $target_container =& $hdr; + $rel_boundary_header = 'Content-Type: multipart/related; boundary="'.$this->_rel_boundary.'"'; if (isset($last_boundary)) { - $target_container =& $body; - $target_container .= '--' . $last_boundary . $this->newline; + $body .= '--' . $last_boundary . $this->newline . $rel_boundary_header; + } + else + { + $hdr .= $rel_boundary_header; } - $target_container .= 'Content-Type: multipart/related; boundary="'.$this->_rel_boundary.'"'; - array_unshift($prepared_attachment_parts, $this->_prep_attachments($attachments_related, $this->_rel_boundary)); + array_unshift($prepared_attachment_parts, $this->_prep_attachments($attachments_indexed_by_multipart['related'], $this->_rel_boundary)); $last_boundary = $this->_rel_boundary; } @@ -1442,10 +1442,7 @@ protected function _build_message() $this->_header_str .= $hdr; } - if (strlen(body) > 0) - { - $body .= $this->newline.$this->newline; - } + strlen($body) && $body .= $this->newline.$this->newline; $body .= $this->_get_mime_message().$this->newline.$this->newline .'--'.$last_boundary.$this->newline @@ -1464,7 +1461,7 @@ protected function _build_message() $attachment_prepared = implode($this->newline.$this->newline, $prepared_attachment_parts); - break; + break; } $body .= $attachment_prepared; @@ -1487,11 +1484,8 @@ protected function _attachments_indexed_by_multipart() foreach ($this->_attachments as $attachment) { $multipart = $attachment['multipart']; - if (!isset($attachments_indexed[$multipart])) - { - $attachments_indexed[$multipart] = array(); - } - array_push($attachments_indexed[$multipart], $attachment); + isset($attachments_indexed[$multipart]) OR $attachments_indexed[$multipart] = array(); + $attachments_indexed[$multipart][] = $attachment; } return $attachments_indexed; @@ -1508,31 +1502,29 @@ protected function _attachments_indexed_by_multipart() */ protected function _prep_attachments($attachments, $boundary) { - if (!isset($attachments) OR count($attachments) === 0) + if (empty($attachments)) { return ''; } - $attachment_parts = array(); - foreach ($attachments as $attachment) + $attachment = array(); + for ($i = 0, $c = count($attachments), $z = 0; $i < $c; $i++) { - $filename = $attachment['name'][0]; - $basename = ($attachment['name'][1] === NULL) - ? basename($filename) : $attachment['name'][1]; + $filename = $attachments[$i]['name'][0]; + $basename = ($attachments[$i]['name'][1] === NULL) + ? basename($filename) : $attachments[$i]['name'][1]; + + $attachment[$z++] = '--'.$boundary.$this->newline + .'Content-type: '.$attachments[$i]['type'].'; ' + .'name="'.$basename.'"'.$this->newline + .'Content-Disposition: '.$attachments[$i]['disposition'].';'.$this->newline + .'Content-Transfer-Encoding: base64'.$this->newline + .(empty($attachments[$i]['cid']) ? '' : 'Content-ID: <'.$attachments[$i]['cid'].'>'.$this->newline); - array_push( - $attachment_parts, - '--'.$boundary.$this->newline - .'Content-type: '.$attachment['type'].'; ' - .'name="'.$basename.'"'.$this->newline - .'Content-Disposition: '.$attachment['disposition'].';'.$this->newline - .'Content-Transfer-Encoding: base64'.$this->newline - .(empty($attachment['cid']) ? '' : 'Content-ID: <'.$attachment['cid'].'>'.$this->newline), - $attachment['content'] - ); + $attachment[$z++] = $attachments[$i]['content']; } - return implode($this->newline, $attachment_parts).$this->newline.'--'.$boundary.'--'; + return implode($this->newline, $attachment).$this->newline.'--'.$boundary.'--'; } // -------------------------------------------------------------------- From 4ac24c201c673b52b39b7efc2235f1d84d1acd08 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 28 Apr 2016 14:28:07 +0300 Subject: [PATCH 4324/5397] Fix #4605 --- system/core/Config.php | 9 +++------ tests/codeigniter/core/Config_test.php | 2 ++ user_guide_src/source/changelog.rst | 1 + 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/system/core/Config.php b/system/core/Config.php index ca6fb379371..9fd3e4a7da4 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -319,7 +319,7 @@ public function base_url($uri = '', $protocol = NULL) } } - return $base_url.ltrim($this->_uri_string($uri), '/'); + return $base_url.$this->_uri_string($uri); } // ------------------------------------------------------------- @@ -337,11 +337,8 @@ protected function _uri_string($uri) { if ($this->item('enable_query_strings') === FALSE) { - if (is_array($uri)) - { - $uri = implode('/', $uri); - } - return trim($uri, '/'); + is_array($uri) && $uri = implode('/', $uri); + return ltrim($uri, '/'); } elseif (is_array($uri)) { diff --git a/tests/codeigniter/core/Config_test.php b/tests/codeigniter/core/Config_test.php index 26a5f32f568..b5c9e849d99 100644 --- a/tests/codeigniter/core/Config_test.php +++ b/tests/codeigniter/core/Config_test.php @@ -127,6 +127,8 @@ public function test_site_url() $this->assertEquals($index_page.'/'.$uri, $this->config->site_url($uri)); $this->assertEquals($index_page.'/'.$uri.'/'.$uri2, $this->config->site_url(array($uri, $uri2))); + $this->assertEquals($index_page.'/test/', $this->config->site_url('test/')); + $suffix = 'ing'; $this->config->set_item('url_suffix', $suffix); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 5a482208aa9..d50c0a05262 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -26,6 +26,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#861) - :doc:`Database Forge ` method ``create_table()`` incorrectly accepts field width constraints for MSSQL/SQLSRV integer-type columns. - Fixed a bug (#4562) - :doc:`Cache Library ` didn't check if ``Memcached::quit()`` is available before calling it. - Fixed a bug (#4563) - :doc:`Input Library ` method ``request_headers()`` ignores ``$xss_clean`` parameter value after first call. +- Fixed a bug (#4605) - :doc:`Config Library ` method ``site_url()`` stripped trailing slashes from relative URIs passed to it. Version 3.0.6 ============= From 5277583e7336675d02665ff77359b41e782853ce Mon Sep 17 00:00:00 2001 From: Robert Angyal Date: Wed, 4 May 2016 16:33:25 +0200 Subject: [PATCH 4325/5397] #4583 Refactor according to the suggestions commented on Pull Request Signed-off-by: Robert Angyal --- system/libraries/Email.php | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index e35c48ec46a..4fd1107c5c0 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1404,20 +1404,17 @@ protected function _build_message() .$this->newline .$this->_body.$this->newline.$this->newline; - $attachment_prepared = $this->_prep_attachments($this->_attachments, $this->_atc_boundary); + $body .= $this->_prep_attachments($this->_attachments, $this->_atc_boundary); break; case 'html-attach' : $attachments_indexed_by_multipart = $this->_attachments_indexed_by_multipart(); - $prepared_attachment_parts = array(); $last_boundary = NULL; if ( ! empty($attachments_indexed_by_multipart['mixed'])) { $hdr .= 'Content-Type: multipart/mixed; boundary="'.$this->_atc_boundary.'"'; - - $prepared_attachment_parts[] = $this->_prep_attachments($attachments_indexed_by_multipart['mixed'], $this->_atc_boundary); $last_boundary = $this->_atc_boundary; } @@ -1426,14 +1423,12 @@ protected function _build_message() $rel_boundary_header = 'Content-Type: multipart/related; boundary="'.$this->_rel_boundary.'"'; if (isset($last_boundary)) { - $body .= '--' . $last_boundary . $this->newline . $rel_boundary_header; + $body .= '--'.$last_boundary.$this->newline.$rel_boundary_header; } else { $hdr .= $rel_boundary_header; } - - array_unshift($prepared_attachment_parts, $this->_prep_attachments($attachments_indexed_by_multipart['related'], $this->_rel_boundary)); $last_boundary = $this->_rel_boundary; } @@ -1459,12 +1454,15 @@ protected function _build_message() .$this->_prep_quoted_printable($this->_body).$this->newline.$this->newline .'--'.$this->_alt_boundary.'--'.$this->newline.$this->newline; - $attachment_prepared = implode($this->newline.$this->newline, $prepared_attachment_parts); + ( ! empty($attachments_indexed_by_multipart['related'])) && $body .= $this->newline.$this->newline + .$this->_prep_attachments($attachments_indexed_by_multipart['related'], $this->_rel_boundary); + + ( ! empty($attachments_indexed_by_multipart['mixed'])) && $body .= $this->newline.$this->newline + .$this->_prep_attachments($attachments_indexed_by_multipart['mixed'], $this->_atc_boundary); break; } - $body .= $attachment_prepared; $this->_finalbody = ($this->_get_protocol() === 'mail') ? $body : $hdr.$this->newline.$this->newline.$body; From fd024c6fce2197b13520c1c53a5faa9f2704bdd2 Mon Sep 17 00:00:00 2001 From: kadoppe Date: Fri, 6 May 2016 17:25:18 +0900 Subject: [PATCH 4326/5397] Remove unnecessary backslash from user guide. Signed-off-by: kadoppe --- user_guide_src/source/tutorial/create_news_items.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/tutorial/create_news_items.rst b/user_guide_src/source/tutorial/create_news_items.rst index e10eebd3bdd..cde52fde864 100644 --- a/user_guide_src/source/tutorial/create_news_items.rst +++ b/user_guide_src/source/tutorial/create_news_items.rst @@ -76,7 +76,7 @@ validation <../libraries/form_validation>` library to do this. The code above adds a lot of functionality. The first few lines load the form helper and the form validation library. After that, rules for the -form validation are set. The ``set\_rules()`` method takes three arguments; +form validation are set. The ``set_rules()`` method takes three arguments; the name of the input field, the name to be used in error messages, and the rule. In this case the title and text fields are required. From f6dc21b2f57ad0f76de6e4e005cfe3d79a420d0a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 May 2016 11:24:55 +0300 Subject: [PATCH 4327/5397] [ci skip] Remove unnecessary backslash from user guide [ci skip] Remove unnecessary backslash from user guide --- user_guide_src/source/tutorial/create_news_items.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/tutorial/create_news_items.rst b/user_guide_src/source/tutorial/create_news_items.rst index e10eebd3bdd..cde52fde864 100644 --- a/user_guide_src/source/tutorial/create_news_items.rst +++ b/user_guide_src/source/tutorial/create_news_items.rst @@ -76,7 +76,7 @@ validation <../libraries/form_validation>` library to do this. The code above adds a lot of functionality. The first few lines load the form helper and the form validation library. After that, rules for the -form validation are set. The ``set\_rules()`` method takes three arguments; +form validation are set. The ``set_rules()`` method takes three arguments; the name of the input field, the name to be used in error messages, and the rule. In this case the title and text fields are required. From fd8349f0328cb6c0cd56fd19c931fd79a707faa8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 May 2016 12:10:24 +0300 Subject: [PATCH 4328/5397] Use 5.3.latest on Travis to fix the build errors 5.3.3 doesn't have ext/openssl ... Also, allow failures on 5.3 --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5a7eb11b9f8..e531f8d90c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: php php: - 5.2 - - 5.3.3 + - 5.3 - 5.4 - 5.5 - 5.6 @@ -31,6 +31,7 @@ script: phpunit -d zend.enable_gc=0 -d date.timezone=UTC --coverage-text --confi matrix: allow_failures: - php: 5.2 + - php: 5.3 - php: hhvm exclude: - php: hhvm From a380c69a71bcf2362e8cebe707994cc519a93bfd Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 May 2016 12:12:45 +0300 Subject: [PATCH 4329/5397] Stop testing 3.1.0-dev on PHP 5.2, 5.3 --- .travis.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5a7eb11b9f8..1e0ee65dbec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,6 @@ language: php php: - - 5.2 - - 5.3.3 - 5.4 - 5.5 - 5.6 @@ -21,7 +19,7 @@ env: sudo: false before_script: - - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.2' ]; then pear channel-discover pear.bovigo.org && pear install bovigo/vfsStream-beta; else composer install --dev --no-progress; fi" + - sh -c "composer install --dev --no-progress" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'mysqli' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi" @@ -30,7 +28,6 @@ script: phpunit -d zend.enable_gc=0 -d date.timezone=UTC --coverage-text --confi matrix: allow_failures: - - php: 5.2 - php: hhvm exclude: - php: hhvm @@ -39,10 +36,6 @@ matrix: env: DB=pdo/pgsql - php: 7 env: DB=mysql - - php: 5.2 - env: DB=sqlite - - php: 5.2 - env: DB=pdo/sqlite branches: only: From 8425319eb523ee50b11b06b97738c5a46def84e4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 May 2016 12:24:52 +0300 Subject: [PATCH 4330/5397] [ci skip] Fix #4613 --- system/libraries/Email.php | 5 +++++ user_guide_src/source/changelog.rst | 1 + 2 files changed, 6 insertions(+) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index ed6f737a1f9..cdfb43bb58c 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -2153,6 +2153,11 @@ protected function _smtp_authenticate() return FALSE; } + if ($this->smtp_keepalive) + { + $this->_smtp_auth = FALSE; + } + return TRUE; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d50c0a05262..567eb10a6ff 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -27,6 +27,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4562) - :doc:`Cache Library ` didn't check if ``Memcached::quit()`` is available before calling it. - Fixed a bug (#4563) - :doc:`Input Library ` method ``request_headers()`` ignores ``$xss_clean`` parameter value after first call. - Fixed a bug (#4605) - :doc:`Config Library ` method ``site_url()`` stripped trailing slashes from relative URIs passed to it. +- Fixed a bug (#4613) - :doc:`Email Library ` failed to send multiple emails via SMTP due to "already authenticated" errors when keep-alive is enabled. Version 3.0.6 ============= From 8c95c3d6d1b589771890e5383c3e0f78a58303e9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 9 May 2016 12:35:41 +0300 Subject: [PATCH 4331/5397] [ci skip] Minor optimizations to CI_Email --- system/libraries/Email.php | 50 +++++++++++++++----------------------- 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index cdfb43bb58c..6ff3efad970 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -147,7 +147,7 @@ class CI_Email { * * @var string */ - public $charset = 'utf-8'; + public $charset = 'UTF-8'; /** * Multipart message @@ -408,47 +408,24 @@ class CI_Email { public function __construct(array $config = array()) { $this->charset = config_item('charset'); - - if (count($config) > 0) - { - $this->initialize($config); - } - else - { - $this->_smtp_auth = ! ($this->smtp_user === '' && $this->smtp_pass === ''); - } - + $this->initialize($config); $this->_safe_mode = ( ! is_php('5.4') && ini_get('safe_mode')); - $this->charset = strtoupper($this->charset); log_message('info', 'Email Class Initialized'); } // -------------------------------------------------------------------- - /** - * Destructor - Releases Resources - * - * @return void - */ - public function __destruct() - { - if (is_resource($this->_smtp_connect)) - { - $this->_send_command('quit'); - } - } - - // -------------------------------------------------------------------- - /** * Initialize preferences * - * @param array + * @param array $config * @return CI_Email */ - public function initialize($config = array()) + public function initialize(array $config = array()) { + $this->clear(); + foreach ($config as $key => $val) { if (isset($this->$key)) @@ -465,9 +442,9 @@ public function initialize($config = array()) } } } - $this->clear(); - $this->_smtp_auth = ! ($this->smtp_user === '' && $this->smtp_pass === ''); + $this->charset = strtoupper($this->charset); + $this->_smtp_auth = isset($this->smtp_user[0], $this->smtp_pass[0]); return $this; } @@ -2347,4 +2324,15 @@ protected function _mime_types($ext = '') return 'application/x-unknown-content-type'; } + // -------------------------------------------------------------------- + + /** + * Destructor + * + * @return void + */ + public function __destruct() + { + is_resource($this->_smtp_connect) && $this->_send_command('quit'); + } } From 22f1545d986391e71682eba37ef60e56f3f8ca77 Mon Sep 17 00:00:00 2001 From: Master Yoda Date: Mon, 9 May 2016 13:07:38 -0700 Subject: [PATCH 4332/5397] Add favicon to user guide source (it was missing). This was mentioned in a tweet. The user guide currently has a configuraiton setting with a favicon link, but it referenced a non-existant file. Signed-off-by:Master Yoda --- .../sphinx_rtd_theme/static/images/ci-icon.ico | Bin 0 -> 1150 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 user_guide_src/source/_themes/sphinx_rtd_theme/static/images/ci-icon.ico diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/images/ci-icon.ico b/user_guide_src/source/_themes/sphinx_rtd_theme/static/images/ci-icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c4246f8bf585a0540c46ff253c328143327ca08b GIT binary patch literal 1150 zcmc&xyAHxI3_Ju9YbU0H82L0dKB3=M^#k|?1RF&Hi2(*gun8x*Rv%$Nq;fC0^Vy9H zjO58O$a{(P1egI>NeCrOATOR%VMk2k6DSp;b z^femVu{jH?ac_H*BU(-O<{9 literal 0 HcmV?d00001 From ae435f79ca958127b2d4ce2572bfd97e829df81f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 10 May 2016 10:21:19 +0300 Subject: [PATCH 4333/5397] Merge pull request #4620 from jim-parry/favicon [ci skip] Add missing favicon to user guide source --- .../sphinx_rtd_theme/static/images/ci-icon.ico | Bin 0 -> 1150 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 user_guide_src/source/_themes/sphinx_rtd_theme/static/images/ci-icon.ico diff --git a/user_guide_src/source/_themes/sphinx_rtd_theme/static/images/ci-icon.ico b/user_guide_src/source/_themes/sphinx_rtd_theme/static/images/ci-icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c4246f8bf585a0540c46ff253c328143327ca08b GIT binary patch literal 1150 zcmc&xyAHxI3_Ju9YbU0H82L0dKB3=M^#k|?1RF&Hi2(*gun8x*Rv%$Nq;fC0^Vy9H zjO58O$a{(P1egI>NeCrOATOR%VMk2k6DSp;b z^femVu{jH?ac_H*BU(-O<{9 literal 0 HcmV?d00001 From 4426e1d3bc627cc73d2454cba4bf9426c7dd0ce4 Mon Sep 17 00:00:00 2001 From: rochefort Date: Wed, 11 May 2016 02:52:22 +0900 Subject: [PATCH 4334/5397] Fix docs [ci skip] - Fix missing parenthesis of function - Fix incorrect place of a sentence - Fix a missing doc link --- user_guide_src/source/helpers/typography_helper.rst | 4 ++-- user_guide_src/source/helpers/url_helper.rst | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/user_guide_src/source/helpers/typography_helper.rst b/user_guide_src/source/helpers/typography_helper.rst index 7eb4fceece8..89730b03d53 100644 --- a/user_guide_src/source/helpers/typography_helper.rst +++ b/user_guide_src/source/helpers/typography_helper.rst @@ -35,7 +35,7 @@ The following functions are available: Formats text so that it is semantically and typographically correct HTML. - This function is an alias for ``CI_Typography::auto_typography``. + This function is an alias for ``CI_Typography::auto_typography()``. For more info, please see the :doc:`Typography Library <../libraries/typography>` documentation. @@ -45,7 +45,7 @@ The following functions are available: .. note:: Typographic formatting can be processor intensive, particularly if you have a lot of content being formatted. If you choose to use this - function you may want to consider `caching <../general/caching>` your + function you may want to consider :doc:`caching <../general/caching>` your pages. diff --git a/user_guide_src/source/helpers/url_helper.rst b/user_guide_src/source/helpers/url_helper.rst index 6fb0dd94260..435a21df45e 100644 --- a/user_guide_src/source/helpers/url_helper.rst +++ b/user_guide_src/source/helpers/url_helper.rst @@ -18,11 +18,11 @@ This helper is loaded using the following code:: $this->load->helper('url'); -The following functions are available: - Available Functions =================== +The following functions are available: + .. php:function:: site_url([$uri = ''[, $protocol = NULL]]) :param string $uri: URI string @@ -360,7 +360,7 @@ Available Functions is outputted to the browser since it utilizes server headers. .. note:: For very fine grained control over headers, you should use the - `Output Library ` ``set_header()`` method. + :doc:`Output Library ` ``set_header()`` method. .. note:: To IIS users: if you hide the `Server` HTTP header, the *auto* method won't detect IIS, in that case it is advised you explicitly From e0c566eeb1866764eaa865e42bb4769921137594 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 11 May 2016 16:05:23 +0300 Subject: [PATCH 4335/5397] Merge pull request #4625 from rochefort/missing_parenthesis [ci skip] Minor documentation fixes --- user_guide_src/source/helpers/typography_helper.rst | 4 ++-- user_guide_src/source/helpers/url_helper.rst | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/user_guide_src/source/helpers/typography_helper.rst b/user_guide_src/source/helpers/typography_helper.rst index 7eb4fceece8..89730b03d53 100644 --- a/user_guide_src/source/helpers/typography_helper.rst +++ b/user_guide_src/source/helpers/typography_helper.rst @@ -35,7 +35,7 @@ The following functions are available: Formats text so that it is semantically and typographically correct HTML. - This function is an alias for ``CI_Typography::auto_typography``. + This function is an alias for ``CI_Typography::auto_typography()``. For more info, please see the :doc:`Typography Library <../libraries/typography>` documentation. @@ -45,7 +45,7 @@ The following functions are available: .. note:: Typographic formatting can be processor intensive, particularly if you have a lot of content being formatted. If you choose to use this - function you may want to consider `caching <../general/caching>` your + function you may want to consider :doc:`caching <../general/caching>` your pages. diff --git a/user_guide_src/source/helpers/url_helper.rst b/user_guide_src/source/helpers/url_helper.rst index 6fb0dd94260..435a21df45e 100644 --- a/user_guide_src/source/helpers/url_helper.rst +++ b/user_guide_src/source/helpers/url_helper.rst @@ -18,11 +18,11 @@ This helper is loaded using the following code:: $this->load->helper('url'); -The following functions are available: - Available Functions =================== +The following functions are available: + .. php:function:: site_url([$uri = ''[, $protocol = NULL]]) :param string $uri: URI string @@ -360,7 +360,7 @@ Available Functions is outputted to the browser since it utilizes server headers. .. note:: For very fine grained control over headers, you should use the - `Output Library ` ``set_header()`` method. + :doc:`Output Library ` ``set_header()`` method. .. note:: To IIS users: if you hide the `Server` HTTP header, the *auto* method won't detect IIS, in that case it is advised you explicitly From 0a840c6768de97a489062307e72aa16a608d7942 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 16 May 2016 13:20:54 +0300 Subject: [PATCH 4336/5397] [ci skip] Correct an erroneous step in 2.0.3 to 2.1.0 upgrade instructions --- user_guide_src/source/installation/upgrade_210.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user_guide_src/source/installation/upgrade_210.rst b/user_guide_src/source/installation/upgrade_210.rst index 5874bfc8629..866dcf4aefa 100644 --- a/user_guide_src/source/installation/upgrade_210.rst +++ b/user_guide_src/source/installation/upgrade_210.rst @@ -13,11 +13,11 @@ Replace all files and directories in your "system" folder. .. note:: If you have any custom developed files in these folders please make copies of them first. -Step 2: Replace config/user_agents.php -====================================== +Step 2: Replace config/mimes.php +================================ This config file has been updated to contain more user agent types, -please copy it to _application/config/user_agents.php*. +please copy it to _application/config/mimes.php*. Step 3: Update your user guide ============================== From 0fae625de48885b565362fe5d62cd6ce4fd76faa Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 17 May 2016 13:46:55 +0300 Subject: [PATCH 4337/5397] Fix #4633 --- system/libraries/Form_validation.php | 132 ++++++++---------- .../libraries/Form_validation_test.php | 2 +- user_guide_src/source/changelog.rst | 1 + 3 files changed, 63 insertions(+), 72 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index e4a5189579a..f5b07a2058d 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -493,6 +493,63 @@ public function run($group = '') // -------------------------------------------------------------------- + /** + * Prepare rules + * + * Re-orders the provided rules in order of importance, so that + * they can easily be executed later without weird checks ... + * + * "Callbacks" are given the highest priority (always called), + * followed by 'required' (called if callbacks didn't fail), + * and then every next rule depends on the previous one passing. + * + * @param array $rules + * @return array + */ + protected function _prepare_rules($rules) + { + $new_rules = array(); + $callbacks = array(); + + foreach ($rules as &$rule) + { + // Let 'required' always be the first (non-callback) rule + if ($rule === 'required') + { + array_unshift($new_rules, 'required'); + } + // 'isset' is a kind of a weird alias for 'required' ... + elseif ($rule === 'isset' && (empty($new_rules) OR $new_rules[0] !== 'required')) + { + array_unshift($new_rules, 'isset'); + } + // The old/classic 'callback_'-prefixed rules + elseif (is_string($rule) && strncmp('callback_', $rule, 9) === 0) + { + $callbacks[] = $rule; + } + // Proper callables + elseif (is_callable($rule)) + { + $callbacks[] = $rule; + } + // "Named" callables; i.e. array('name' => $callable) + elseif (is_array($rule) && isset($rule[0], $rule[1]) && is_callable($rule[1])) + { + $callbacks[] = $rule; + } + // Everything else goes at the end of the queue + else + { + $new_rules[] = $rule; + } + } + + return array_merge($callbacks, $new_rules); + } + + // -------------------------------------------------------------------- + /** * Traverse a multidimensional $_POST array index until the data is found * @@ -580,70 +637,7 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) return; } - // If the field is blank, but NOT required, no further tests are necessary - $callback = FALSE; - if ( ! in_array('required', $rules) && ($postdata === NULL OR $postdata === '')) - { - // Before we bail out, does the rule contain a callback? - foreach ($rules as &$rule) - { - if (is_string($rule)) - { - if (strncmp($rule, 'callback_', 9) === 0) - { - $callback = TRUE; - $rules = array(1 => $rule); - break; - } - } - elseif (is_callable($rule)) - { - $callback = TRUE; - $rules = array(1 => $rule); - break; - } - elseif (is_array($rule) && isset($rule[0], $rule[1]) && is_callable($rule[1])) - { - $callback = TRUE; - $rules = array(array($rule[0], $rule[1])); - break; - } - } - - if ( ! $callback) - { - return; - } - } - - // Isset Test. Typically this rule will only apply to checkboxes. - if (($postdata === NULL OR $postdata === '') && ! $callback) - { - if (in_array('isset', $rules, TRUE) OR in_array('required', $rules)) - { - // Set the message type - $type = in_array('required', $rules) ? 'required' : 'isset'; - - $line = $this->_get_error_message($type, $row['field']); - - // Build the error message - $message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label'])); - - // Save the error message - $this->_field_data[$row['field']]['error'] = $message; - - if ( ! isset($this->_error_array[$row['field']])) - { - $this->_error_array[$row['field']] = $message; - } - } - - return; - } - - // -------------------------------------------------------------------- - - // Cycle through each rule and run it + $rules = $this->_prepare_rules($rules); foreach ($rules as $rule) { $_in_array = FALSE; @@ -740,12 +734,6 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) { $this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result; } - - // If the field isn't required and we just processed a callback we'll move on... - if ( ! in_array('required', $rules, TRUE) && $result !== FALSE) - { - continue; - } } elseif ( ! method_exists($this, $rule)) { @@ -1055,7 +1043,9 @@ public function set_checkbox($field = '', $value = '', $default = FALSE) */ public function required($str) { - return is_array($str) ? (bool) count($str) : (trim($str) !== ''); + return is_array($str) + ? (empty($str) === FALSE) + : (trim($str) !== ''); } // -------------------------------------------------------------------- diff --git a/tests/codeigniter/libraries/Form_validation_test.php b/tests/codeigniter/libraries/Form_validation_test.php index 3537eb3552a..d11d616ad74 100644 --- a/tests/codeigniter/libraries/Form_validation_test.php +++ b/tests/codeigniter/libraries/Form_validation_test.php @@ -55,9 +55,9 @@ public function test_rule_matches() ); $values_base = array('foo' => 'sample'); - $this->assertTrue($this->run_rules($rules, array_merge($values_base, array('bar' => '')))); $this->assertTrue($this->run_rules($rules, array_merge($values_base, array('bar' => 'sample')))); + $this->assertFalse($this->run_rules($rules, array_merge($values_base, array('bar' => '')))); $this->assertFalse($this->run_rules($rules, array_merge($values_base, array('bar' => 'Sample')))); $this->assertFalse($this->run_rules($rules, array_merge($values_base, array('bar' => ' sample')))); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 567eb10a6ff..eb36b0d1e82 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -28,6 +28,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4563) - :doc:`Input Library ` method ``request_headers()`` ignores ``$xss_clean`` parameter value after first call. - Fixed a bug (#4605) - :doc:`Config Library ` method ``site_url()`` stripped trailing slashes from relative URIs passed to it. - Fixed a bug (#4613) - :doc:`Email Library ` failed to send multiple emails via SMTP due to "already authenticated" errors when keep-alive is enabled. +- Fixed a bug (#4633) - :doc:`Form Validation Library ` ignored multiple "callback" rules for empty, non-required fields. Version 3.0.6 ============= From b3bac2497aaacb702921dfe89c5f43969257ff53 Mon Sep 17 00:00:00 2001 From: Master Yoda Date: Thu, 19 May 2016 01:12:33 -0700 Subject: [PATCH 4338/5397] Fix typo in inflector helper writeup. Reported by email from Jessie Rubi Signed-off-by:Master Yoda --- user_guide_src/source/helpers/inflector_helper.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/helpers/inflector_helper.rst b/user_guide_src/source/helpers/inflector_helper.rst index ed1e2b30fe5..17dab57bf8e 100644 --- a/user_guide_src/source/helpers/inflector_helper.rst +++ b/user_guide_src/source/helpers/inflector_helper.rst @@ -38,7 +38,7 @@ The following functions are available: .. php:function:: plural($str) :param string $str: Input string - :returns: A plular word + :returns: A plural word :rtype: string Changes a singular word to plural. Example:: From b076b5651c028e1c92f8d1bfad0f27a13839378a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 19 May 2016 12:11:55 +0300 Subject: [PATCH 4339/5397] Merge pull request #4635 from jim-parry/fix-userguide [ci skip] Fix a typo in inflector helper docs --- user_guide_src/source/helpers/inflector_helper.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/helpers/inflector_helper.rst b/user_guide_src/source/helpers/inflector_helper.rst index ed1e2b30fe5..17dab57bf8e 100644 --- a/user_guide_src/source/helpers/inflector_helper.rst +++ b/user_guide_src/source/helpers/inflector_helper.rst @@ -38,7 +38,7 @@ The following functions are available: .. php:function:: plural($str) :param string $str: Input string - :returns: A plular word + :returns: A plural word :rtype: string Changes a singular word to plural. Example:: From 45520a5a0b57490e1c8c5e031bce61e0dc4851e5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 19 May 2016 18:51:25 +0300 Subject: [PATCH 4340/5397] [ci skip] Fix #4637 --- system/database/drivers/oci8/oci8_driver.php | 20 +++++++++++++------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 59f0e8456c1..60fab757846 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -559,23 +559,29 @@ public function field_data($table) */ public function error() { - /* oci_error() returns an array that already contains the - * 'code' and 'message' keys, so we can just return it. - */ + // oci_error() returns an array that already contains + // 'code' and 'message' keys, but it can return false + // if there was no error .... if (is_resource($this->curs_id)) { - return oci_error($this->curs_id); + $error = oci_error($this->curs_id); } elseif (is_resource($this->stmt_id)) { - return oci_error($this->stmt_id); + $error = oci_error($this->stmt_id); } elseif (is_resource($this->conn_id)) { - return oci_error($this->conn_id); + $error = oci_error($this->conn_id); + } + else + { + $error = oci_error(); } - return oci_error(); + return is_array($error) + ? $error + : array('code' => '', 'message'); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index eb36b0d1e82..7d1d961c065 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -29,6 +29,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4605) - :doc:`Config Library ` method ``site_url()`` stripped trailing slashes from relative URIs passed to it. - Fixed a bug (#4613) - :doc:`Email Library ` failed to send multiple emails via SMTP due to "already authenticated" errors when keep-alive is enabled. - Fixed a bug (#4633) - :doc:`Form Validation Library ` ignored multiple "callback" rules for empty, non-required fields. +- Fixed a bug (#4637) - :doc:`Database ` method `error()` returned ``FALSE`` with the 'oci8' driver if there was no error. Version 3.0.6 ============= From cadcef85a218595b5999442d669086bdb5628947 Mon Sep 17 00:00:00 2001 From: Kasim Tan Date: Thu, 19 May 2016 12:06:07 -0700 Subject: [PATCH 4341/5397] Fixed PHPDoc parameter name and type discrepancies --- system/core/Loader.php | 2 +- system/core/Log.php | 2 +- system/core/Output.php | 2 +- system/core/compat/standard.php | 2 +- system/helpers/form_helper.php | 2 +- system/libraries/Cache/drivers/Cache_apc.php | 2 +- system/libraries/Session/Session.php | 2 +- system/libraries/Upload.php | 2 +- tests/mocks/database/drivers/mysql.php | 1 - tests/mocks/database/drivers/mysqli.php | 1 - tests/mocks/database/drivers/pdo.php | 1 - tests/mocks/database/drivers/postgre.php | 1 - tests/mocks/database/drivers/sqlite.php | 1 - 13 files changed, 8 insertions(+), 13 deletions(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index c742ae71a75..d2c35081698 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -1106,7 +1106,7 @@ protected function _ci_load_library($class, $params = NULL, $object_name = NULL) * @used-by CI_Loader::_ci_load_library() * @uses CI_Loader::_ci_init_library() * - * @param string $library Library name to load + * @param string $library_name Library name to load * @param string $file_path Path to the library filename, relative to libraries/ * @param mixed $params Optional parameters to pass to the class constructor * @param string $object_name Optional object name to assign to diff --git a/system/core/Log.php b/system/core/Log.php index 1abdaa00e85..986121526b2 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -237,7 +237,7 @@ public function write_log($level, $msg) * * @param string $level The error level * @param string $date Formatted date string - * @param string $msg The log message + * @param string $message The log message * @return string Formatted log line with a new line character '\n' at the end */ protected function _format_line($level, $date, $message) diff --git a/system/core/Output.php b/system/core/Output.php index 6e0b4e724ea..98db212a093 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -285,7 +285,7 @@ public function get_content_type() /** * Get Header * - * @param string $header_name + * @param string $header * @return string */ public function get_header($header) diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php index 47d47aeff88..c54cab95146 100644 --- a/system/core/compat/standard.php +++ b/system/core/compat/standard.php @@ -62,7 +62,7 @@ * array_column() * * @link http://php.net/array_column - * @param string $array + * @param array $array * @param mixed $column_key * @param mixed $index_key * @return array diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 3e103952560..dfb9ae2d261 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -568,7 +568,7 @@ function form_button($data = '', $content = '', $extra = '') * * @param string The text to appear onscreen * @param string The id the label applies to - * @param string Additional attributes + * @param array Additional attributes * @return string */ function form_label($label_text = '', $id = '', $attributes = array()) diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php index 07ea8f474f9..fb8df03a7ef 100644 --- a/system/libraries/Cache/drivers/Cache_apc.php +++ b/system/libraries/Cache/drivers/Cache_apc.php @@ -97,7 +97,7 @@ public function get($id) * * @param string $id Cache ID * @param mixed $data Data to store - * @param int $ttol Length of time (in seconds) to cache the data + * @param int $ttl Length of time (in seconds) to cache the data * @param bool $raw Whether to store the raw value * @return bool TRUE on success, FALSE on failure */ diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index c9d2e8adc07..dde84a775b7 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -729,7 +729,7 @@ public function set_userdata($data, $value = NULL) * * Legacy CI_Session compatibility method * - * @param mixed $data Session data key(s) + * @param mixed $key Session data key(s) * @return void */ public function unset_userdata($key) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index f2418378b03..fa365058c2f 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -286,7 +286,7 @@ class CI_Upload { /** * Constructor * - * @param array $props + * @param array $config * @return void */ public function __construct($config = array()) diff --git a/tests/mocks/database/drivers/mysql.php b/tests/mocks/database/drivers/mysql.php index e0c1fb06cef..b7718ebaf23 100644 --- a/tests/mocks/database/drivers/mysql.php +++ b/tests/mocks/database/drivers/mysql.php @@ -5,7 +5,6 @@ class Mock_Database_Drivers_Mysql extends Mock_Database_DB_Driver { /** * Instantiate the database driver * - * @param string DB Driver class name * @param array DB configuration to set * @return void */ diff --git a/tests/mocks/database/drivers/mysqli.php b/tests/mocks/database/drivers/mysqli.php index 73c35b6099e..f747aad46d4 100644 --- a/tests/mocks/database/drivers/mysqli.php +++ b/tests/mocks/database/drivers/mysqli.php @@ -5,7 +5,6 @@ class Mock_Database_Drivers_Mysqli extends Mock_Database_DB_Driver { /** * Instantiate the database driver * - * @param string DB Driver class name * @param array DB configuration to set * @return void */ diff --git a/tests/mocks/database/drivers/pdo.php b/tests/mocks/database/drivers/pdo.php index 17768eed712..af1958aea0b 100644 --- a/tests/mocks/database/drivers/pdo.php +++ b/tests/mocks/database/drivers/pdo.php @@ -5,7 +5,6 @@ class Mock_Database_Drivers_PDO extends Mock_Database_DB_Driver { /** * Instantiate the database driver * - * @param string DB Driver class name * @param array DB configuration to set * @return void */ diff --git a/tests/mocks/database/drivers/postgre.php b/tests/mocks/database/drivers/postgre.php index 5a45115fa6a..8c91e54a926 100644 --- a/tests/mocks/database/drivers/postgre.php +++ b/tests/mocks/database/drivers/postgre.php @@ -5,7 +5,6 @@ class Mock_Database_Drivers_Postgre extends Mock_Database_DB_Driver { /** * Instantiate the database driver * - * @param string DB Driver class name * @param array DB configuration to set * @return void */ diff --git a/tests/mocks/database/drivers/sqlite.php b/tests/mocks/database/drivers/sqlite.php index 512467520a3..b2aec28e6b1 100644 --- a/tests/mocks/database/drivers/sqlite.php +++ b/tests/mocks/database/drivers/sqlite.php @@ -5,7 +5,6 @@ class Mock_Database_Drivers_Sqlite extends Mock_Database_DB_Driver { /** * Instantiate the database driver * - * @param string DB Driver class name * @param array DB configuration to set * @return void */ From e1b9495b7b1b55c8dfd6b602e35b6d5c269c0a90 Mon Sep 17 00:00:00 2001 From: Kasim Tan Date: Fri, 20 May 2016 07:16:14 -0700 Subject: [PATCH 4342/5397] Removed an extra space char --- system/helpers/form_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index dfb9ae2d261..8825ecc2c4e 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -568,7 +568,7 @@ function form_button($data = '', $content = '', $extra = '') * * @param string The text to appear onscreen * @param string The id the label applies to - * @param array Additional attributes + * @param array Additional attributes * @return string */ function form_label($label_text = '', $id = '', $attributes = array()) From e13fa9fdb3f2e311bd7331e49b26889f24bc81cb Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 20 May 2016 17:30:07 +0300 Subject: [PATCH 4343/5397] Merge pull request #4638 from kasimtan/phpdoc_fixes [ci skip] Fixed PHPDoc parameter name and type discrepancies --- system/core/Loader.php | 2 +- system/core/Log.php | 2 +- system/core/Output.php | 2 +- system/core/compat/standard.php | 2 +- system/helpers/form_helper.php | 2 +- system/libraries/Cache/drivers/Cache_apc.php | 2 +- system/libraries/Session/Session.php | 2 +- system/libraries/Upload.php | 2 +- tests/mocks/database/drivers/mysql.php | 1 - tests/mocks/database/drivers/mysqli.php | 1 - tests/mocks/database/drivers/pdo.php | 1 - tests/mocks/database/drivers/postgre.php | 1 - tests/mocks/database/drivers/sqlite.php | 1 - 13 files changed, 8 insertions(+), 13 deletions(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index c742ae71a75..d2c35081698 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -1106,7 +1106,7 @@ protected function _ci_load_library($class, $params = NULL, $object_name = NULL) * @used-by CI_Loader::_ci_load_library() * @uses CI_Loader::_ci_init_library() * - * @param string $library Library name to load + * @param string $library_name Library name to load * @param string $file_path Path to the library filename, relative to libraries/ * @param mixed $params Optional parameters to pass to the class constructor * @param string $object_name Optional object name to assign to diff --git a/system/core/Log.php b/system/core/Log.php index 1abdaa00e85..986121526b2 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -237,7 +237,7 @@ public function write_log($level, $msg) * * @param string $level The error level * @param string $date Formatted date string - * @param string $msg The log message + * @param string $message The log message * @return string Formatted log line with a new line character '\n' at the end */ protected function _format_line($level, $date, $message) diff --git a/system/core/Output.php b/system/core/Output.php index ec9c21b9177..06ff1011ca5 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -285,7 +285,7 @@ public function get_content_type() /** * Get Header * - * @param string $header_name + * @param string $header * @return string */ public function get_header($header) diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php index 47d47aeff88..c54cab95146 100644 --- a/system/core/compat/standard.php +++ b/system/core/compat/standard.php @@ -62,7 +62,7 @@ * array_column() * * @link http://php.net/array_column - * @param string $array + * @param array $array * @param mixed $column_key * @param mixed $index_key * @return array diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 3e103952560..8825ecc2c4e 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -568,7 +568,7 @@ function form_button($data = '', $content = '', $extra = '') * * @param string The text to appear onscreen * @param string The id the label applies to - * @param string Additional attributes + * @param array Additional attributes * @return string */ function form_label($label_text = '', $id = '', $attributes = array()) diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php index 07ea8f474f9..fb8df03a7ef 100644 --- a/system/libraries/Cache/drivers/Cache_apc.php +++ b/system/libraries/Cache/drivers/Cache_apc.php @@ -97,7 +97,7 @@ public function get($id) * * @param string $id Cache ID * @param mixed $data Data to store - * @param int $ttol Length of time (in seconds) to cache the data + * @param int $ttl Length of time (in seconds) to cache the data * @param bool $raw Whether to store the raw value * @return bool TRUE on success, FALSE on failure */ diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index 1bdc6e5ccef..3b391a8eff0 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -730,7 +730,7 @@ public function set_userdata($data, $value = NULL) * * Legacy CI_Session compatibility method * - * @param mixed $data Session data key(s) + * @param mixed $key Session data key(s) * @return void */ public function unset_userdata($key) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index f2418378b03..fa365058c2f 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -286,7 +286,7 @@ class CI_Upload { /** * Constructor * - * @param array $props + * @param array $config * @return void */ public function __construct($config = array()) diff --git a/tests/mocks/database/drivers/mysql.php b/tests/mocks/database/drivers/mysql.php index e0c1fb06cef..b7718ebaf23 100644 --- a/tests/mocks/database/drivers/mysql.php +++ b/tests/mocks/database/drivers/mysql.php @@ -5,7 +5,6 @@ class Mock_Database_Drivers_Mysql extends Mock_Database_DB_Driver { /** * Instantiate the database driver * - * @param string DB Driver class name * @param array DB configuration to set * @return void */ diff --git a/tests/mocks/database/drivers/mysqli.php b/tests/mocks/database/drivers/mysqli.php index 73c35b6099e..f747aad46d4 100644 --- a/tests/mocks/database/drivers/mysqli.php +++ b/tests/mocks/database/drivers/mysqli.php @@ -5,7 +5,6 @@ class Mock_Database_Drivers_Mysqli extends Mock_Database_DB_Driver { /** * Instantiate the database driver * - * @param string DB Driver class name * @param array DB configuration to set * @return void */ diff --git a/tests/mocks/database/drivers/pdo.php b/tests/mocks/database/drivers/pdo.php index 17768eed712..af1958aea0b 100644 --- a/tests/mocks/database/drivers/pdo.php +++ b/tests/mocks/database/drivers/pdo.php @@ -5,7 +5,6 @@ class Mock_Database_Drivers_PDO extends Mock_Database_DB_Driver { /** * Instantiate the database driver * - * @param string DB Driver class name * @param array DB configuration to set * @return void */ diff --git a/tests/mocks/database/drivers/postgre.php b/tests/mocks/database/drivers/postgre.php index 5a45115fa6a..8c91e54a926 100644 --- a/tests/mocks/database/drivers/postgre.php +++ b/tests/mocks/database/drivers/postgre.php @@ -5,7 +5,6 @@ class Mock_Database_Drivers_Postgre extends Mock_Database_DB_Driver { /** * Instantiate the database driver * - * @param string DB Driver class name * @param array DB configuration to set * @return void */ diff --git a/tests/mocks/database/drivers/sqlite.php b/tests/mocks/database/drivers/sqlite.php index 512467520a3..b2aec28e6b1 100644 --- a/tests/mocks/database/drivers/sqlite.php +++ b/tests/mocks/database/drivers/sqlite.php @@ -5,7 +5,6 @@ class Mock_Database_Drivers_Sqlite extends Mock_Database_DB_Driver { /** * Instantiate the database driver * - * @param string DB Driver class name * @param array DB configuration to set * @return void */ From ad20f71b0395d8fadd417b3a2b580b6c53a80000 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 25 May 2016 09:58:03 +0300 Subject: [PATCH 4344/5397] Amend fix for #4637 --- system/database/drivers/oci8/oci8_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 60fab757846..df7e0848a4d 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -581,7 +581,7 @@ public function error() return is_array($error) ? $error - : array('code' => '', 'message'); + : array('code' => '', 'message' => ''); } // -------------------------------------------------------------------- From 9e78be0d736ed0caab396f58109ce1db7169d727 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 25 May 2016 10:54:36 +0300 Subject: [PATCH 4345/5397] Fix #4639 Really fix #4633 --- system/libraries/Form_validation.php | 11 +++++++++++ .../libraries/Form_validation_test.php | 15 +++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index f5b07a2058d..04445f5b799 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -696,6 +696,17 @@ protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) $param = $match[2]; } + // Ignore empty, non-required inputs with a few exceptions ... + if ( + ($postdata === NULL OR $postdata === '') + && $callback === FALSE + && $callable === FALSE + && ! in_array($rule, array('required', 'isset', 'matches'), TRUE) + ) + { + continue; + } + // Call the function that corresponds to the rule if ($callback OR $callable !== FALSE) { diff --git a/tests/codeigniter/libraries/Form_validation_test.php b/tests/codeigniter/libraries/Form_validation_test.php index d11d616ad74..b87ca65fffb 100644 --- a/tests/codeigniter/libraries/Form_validation_test.php +++ b/tests/codeigniter/libraries/Form_validation_test.php @@ -40,11 +40,22 @@ public function test_empty_array_input() public function test_rule_required() { - $rules = array(array('field' => 'foo', 'label' => 'foo_label', 'rules' => 'required')); - $this->assertTrue($this->run_rules($rules, array('foo' => 'bar'))); + $rules = array(array('field' => 'foo', 'label' => 'Foo', 'rules' => 'is_numeric')); + // Empty, not required + $this->assertTrue($this->run_rules($rules, array('foo' => ''))); + + + // Not required, but also not empty + $this->assertTrue($this->run_rules($rules, array('foo' => '123'))); + $this->assertFalse($this->run_rules($rules, array('foo' => 'bar'))); + + // Required variations + $rules[0]['rules'] .= '|required'; + $this->assertTrue($this->run_rules($rules, array('foo' => '123'))); $this->assertFalse($this->run_rules($rules, array('foo' => ''))); $this->assertFalse($this->run_rules($rules, array('foo' => ' '))); + $this->assertFalse($this->run_rules($rules, array('foo' => 'bar'))); } public function test_rule_matches() From 75794bccae31233bb7f8e12915f42562ac4eb295 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 25 May 2016 12:58:30 +0300 Subject: [PATCH 4346/5397] [ci skip] Add 'LONGTEXT' to 'STRING' alias to CUBRID drivers for DBForge Requested in #4640 --- system/database/drivers/cubrid/cubrid_forge.php | 3 +++ system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php | 3 +++ user_guide_src/source/changelog.rst | 1 + 3 files changed, 7 insertions(+) diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php index 8262beb6b41..46a3b2185e5 100644 --- a/system/database/drivers/cubrid/cubrid_forge.php +++ b/system/database/drivers/cubrid/cubrid_forge.php @@ -178,6 +178,9 @@ protected function _attr_type(&$attributes) $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; + case 'LONGTEXT': + $attributes['TYPE'] = 'STRING'; + return; default: return; } } diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php index 5f854061d0e..b5b95078e14 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php @@ -178,6 +178,9 @@ protected function _attr_type(&$attributes) $attributes['TYPE'] = 'INTEGER'; $attributes['UNSIGNED'] = FALSE; return; + case 'LONGTEXT': + $attributes['TYPE'] = 'STRING'; + return; default: return; } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 7d1d961c065..471e78f53db 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -12,6 +12,7 @@ Release Date: Not Released - Updated :doc:`Image Manipulation Library ` to validate *width* and *height* configuration values. - Updated :doc:`Encryption Library ` to always prefer ``random_bytes()`` when it is available. - Updated :doc:`Session Library ` to log 'debug' messages when using fallbacks to *session.save_path* (php.ini) or 'sess_use_database', 'sess_table_name' settings. + - Added a 'LONGTEXT' to 'STRING' alias to :doc:`Database Forge ` for the 'cubrid', 'pdo/cubrid' drivers. - :php:func:`password_hash()` :doc:`compatibility function ` changes: From 21a41ba37b9248291939cf4c801ac0f27982668e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 25 May 2016 15:27:39 +0300 Subject: [PATCH 4347/5397] [ci skip] Refactor changes from PR #4585 Related: #4583 --- system/libraries/Email.php | 165 ++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 95 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 4fd1107c5c0..21b62fea0c5 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -253,27 +253,6 @@ class CI_Email { */ protected $_finalbody = ''; - /** - * multipart/alternative boundary - * - * @var string - */ - protected $_alt_boundary = ''; - - /** - * Attachment boundary - * - * @var string - */ - protected $_atc_boundary = ''; - - /** - * Related Attachment boundary - * - * @var string - */ - protected $_rel_boundary = ''; - /** * Final headers to send * @@ -933,20 +912,6 @@ public function set_crlf($crlf = "\n") // -------------------------------------------------------------------- - /** - * Set Message Boundary - * - * @return void - */ - protected function _set_boundaries() - { - $this->_alt_boundary = 'B_ALT_'.uniqid(''); // multipart/alternative - $this->_atc_boundary = 'B_ATC_'.uniqid(''); // attachment boundary - $this->_rel_boundary = 'B_REL_'.uniqid(''); // related attachment boundary - } - - // -------------------------------------------------------------------- - /** * Get the Message ID * @@ -1014,9 +979,9 @@ protected function _get_content_type() { if ($this->mailtype === 'html') { - return (count($this->_attachments) === 0) ? 'html' : 'html-attach'; + return empty($this->_attachments) ? 'html' : 'html-attach'; } - elseif ($this->mailtype === 'text' && count($this->_attachments) > 0) + elseif ($this->mailtype === 'text' && ! empty($this->_attachments)) { return 'plain-attach'; } @@ -1322,7 +1287,6 @@ protected function _build_message() $this->_body = $this->word_wrap($this->_body); } - $this->_set_boundaries(); $this->_write_headers(); $hdr = ($this->_get_protocol() === 'mail') ? $this->newline : ''; @@ -1330,7 +1294,7 @@ protected function _build_message() switch ($this->_get_content_type()) { - case 'plain' : + case 'plain': $hdr .= 'Content-Type: text/plain; charset='.$this->charset.$this->newline .'Content-Transfer-Encoding: '.$this->_get_encoding(); @@ -1347,7 +1311,7 @@ protected function _build_message() return; - case 'html' : + case 'html': if ($this->send_multipart === FALSE) { @@ -1356,14 +1320,16 @@ protected function _build_message() } else { - $hdr .= 'Content-Type: multipart/alternative; boundary="'.$this->_alt_boundary.'"'; + $boundary = uniqid('B_ALT_'); + $hdr .= 'Content-Type: multipart/alternative; boundary="'.$boundary.'"'; $body .= $this->_get_mime_message().$this->newline.$this->newline - .'--'.$this->_alt_boundary.$this->newline + .'--'.$boundary.$this->newline .'Content-Type: text/plain; charset='.$this->charset.$this->newline .'Content-Transfer-Encoding: '.$this->_get_encoding().$this->newline.$this->newline - .$this->_get_alt_message().$this->newline.$this->newline.'--'.$this->_alt_boundary.$this->newline + .$this->_get_alt_message().$this->newline.$this->newline + .'--'.$boundary.$this->newline .'Content-Type: text/html; charset='.$this->charset.$this->newline .'Content-Transfer-Encoding: quoted-printable'.$this->newline.$this->newline; @@ -1382,14 +1348,15 @@ protected function _build_message() if ($this->send_multipart !== FALSE) { - $this->_finalbody .= '--'.$this->_alt_boundary.'--'; + $this->_finalbody .= '--'.$boundary.'--'; } return; - case 'plain-attach' : + case 'plain-attach': - $hdr .= 'Content-Type: multipart/mixed; boundary="'.$this->_atc_boundary.'"'; + $boundary = uniqid('B_ATC_'); + $hdr .= 'Content-Type: multipart/mixed; boundary="'.$boundary.'"'; if ($this->_get_protocol() === 'mail') { @@ -1398,29 +1365,32 @@ protected function _build_message() $body .= $this->_get_mime_message().$this->newline .$this->newline - .'--'.$this->_atc_boundary.$this->newline + .'--'.$boundary.$this->newline .'Content-Type: text/plain; charset='.$this->charset.$this->newline .'Content-Transfer-Encoding: '.$this->_get_encoding().$this->newline .$this->newline .$this->_body.$this->newline.$this->newline; - $body .= $this->_prep_attachments($this->_attachments, $this->_atc_boundary); + $this->_append_attachments($body, $boundary); break; - case 'html-attach' : + case 'html-attach': - $attachments_indexed_by_multipart = $this->_attachments_indexed_by_multipart(); + $alt_boundary = uniqid('B_ALT_'); $last_boundary = NULL; - if ( ! empty($attachments_indexed_by_multipart['mixed'])) + if ($this->_attachments_have_multipart('mixed')) { - $hdr .= 'Content-Type: multipart/mixed; boundary="'.$this->_atc_boundary.'"'; - $last_boundary = $this->_atc_boundary; + $atc_boundary = uniqid('B_ATC_'); + $hdr .= 'Content-Type: multipart/mixed; boundary="'.$atc_boundary.'"'; + $last_boundary = $atc_boundary; } - if ( ! empty($attachments_indexed_by_multipart['related'])) + if ($this->_attachments_have_multipart('related')) { - $rel_boundary_header = 'Content-Type: multipart/related; boundary="'.$this->_rel_boundary.'"'; + $rel_boundary = uniqid('B_REL_'); + $rel_boundary_header = 'Content-Type: multipart/related; boundary="'.$rel_boundary.'"'; + if (isset($last_boundary)) { $body .= '--'.$last_boundary.$this->newline.$rel_boundary_header; @@ -1429,7 +1399,8 @@ protected function _build_message() { $hdr .= $rel_boundary_header; } - $last_boundary = $this->_rel_boundary; + + $last_boundary = $rel_boundary; } if ($this->_get_protocol() === 'mail') @@ -1441,24 +1412,32 @@ protected function _build_message() $body .= $this->_get_mime_message().$this->newline.$this->newline .'--'.$last_boundary.$this->newline - .'Content-Type: multipart/alternative; boundary="'.$this->_alt_boundary.'"'.$this->newline.$this->newline - .'--'.$this->_alt_boundary.$this->newline + .'Content-Type: multipart/alternative; boundary="'.$alt_boundary.'"'.$this->newline.$this->newline + .'--'.$alt_boundary.$this->newline .'Content-Type: text/plain; charset='.$this->charset.$this->newline .'Content-Transfer-Encoding: '.$this->_get_encoding().$this->newline.$this->newline - .$this->_get_alt_message().$this->newline.$this->newline.'--'.$this->_alt_boundary.$this->newline + .$this->_get_alt_message().$this->newline.$this->newline + .'--'.$alt_boundary.$this->newline .'Content-Type: text/html; charset='.$this->charset.$this->newline .'Content-Transfer-Encoding: quoted-printable'.$this->newline.$this->newline .$this->_prep_quoted_printable($this->_body).$this->newline.$this->newline - .'--'.$this->_alt_boundary.'--'.$this->newline.$this->newline; + .'--'.$alt_boundary.'--'.$this->newline.$this->newline; - ( ! empty($attachments_indexed_by_multipart['related'])) && $body .= $this->newline.$this->newline - .$this->_prep_attachments($attachments_indexed_by_multipart['related'], $this->_rel_boundary); + // multipart/mixed attachments + if ( ! empty($atc_boundary)) + { + $body .= $this->newline.$this->newline; + $this->_append_attachments($body, $atc_boundary, 'mixed'); + } - ( ! empty($attachments_indexed_by_multipart['mixed'])) && $body .= $this->newline.$this->newline - .$this->_prep_attachments($attachments_indexed_by_multipart['mixed'], $this->_atc_boundary); + if ( ! empty($rel_boundary)) + { + $body .= $this->newline.$this->newline; + $this->_append_attachments($body, $rel_boundary, 'related'); + } break; } @@ -1472,21 +1451,17 @@ protected function _build_message() // -------------------------------------------------------------------- - /** - * Returns attachments mapped by multipart type - * - * @return array - */ - protected function _attachments_indexed_by_multipart() + protected function _attachments_have_multipart($type) { - foreach ($this->_attachments as $attachment) + foreach ($this->_attachments as &$attachment) { - $multipart = $attachment['multipart']; - isset($attachments_indexed[$multipart]) OR $attachments_indexed[$multipart] = array(); - $attachments_indexed[$multipart][] = $attachment; + if ($attachment[$i]['multipart'] === $type) + { + return TRUE; + } } - return $attachments_indexed; + return FALSE; } // -------------------------------------------------------------------- @@ -1494,35 +1469,35 @@ protected function _attachments_indexed_by_multipart() /** * Prepares attachment string * - * @param array $attachments - * @param string $boundary Multipart boundary string + * @param string $body Message body to append to + * @param string $boundary Multipart boundary + * @param string $multipart When provided, only attachments of this type will be processed * @return string */ - protected function _prep_attachments($attachments, $boundary) + protected function _append_attachments(&$body, $boundary, $multipart = null) { - if (empty($attachments)) + for ($i = 0, $c = count($this->_attachments); $i < $c; $i++) { - return ''; - } + if (isset($multipart) && $this->_attachments[$i]['multipart'] !== $multipart) + { + continue; + } - $attachment = array(); - for ($i = 0, $c = count($attachments), $z = 0; $i < $c; $i++) - { - $filename = $attachments[$i]['name'][0]; - $basename = ($attachments[$i]['name'][1] === NULL) - ? basename($filename) : $attachments[$i]['name'][1]; + $name = isset($this->_attachments[$i]['name'][1]) + ? $this->_attachments[$i]['name'][1] + : basename($this->_attachments[$i]['name'][0]); - $attachment[$z++] = '--'.$boundary.$this->newline - .'Content-type: '.$attachments[$i]['type'].'; ' - .'name="'.$basename.'"'.$this->newline - .'Content-Disposition: '.$attachments[$i]['disposition'].';'.$this->newline + $body .= '--'.$boundary.$this->newline + .'Content-Type: '.$this->_attachments[$i]['type'].'; name="'.$name.'"'.$this->newline + .'Content-Disposition: '.$this->_attachments[$i]['disposition'].';'.$this->newline .'Content-Transfer-Encoding: base64'.$this->newline - .(empty($attachments[$i]['cid']) ? '' : 'Content-ID: <'.$attachments[$i]['cid'].'>'.$this->newline); - - $attachment[$z++] = $attachments[$i]['content']; + .(empty($this->_attachments[$i]['cid']) ? '' : 'Content-ID: <'.$this->_attachments[$i]['cid'].'>'.$this->newline.$this->newline) + .$this->_attachments[$i]['content'].$this->newline; } - return implode($this->newline, $attachment).$this->newline.'--'.$boundary.'--'; + // $name won't be set if no attachments were appended, + // and therefore a boundary wouldn't be necessary + empty($name) OR $body .= '--'.$boundary.'--'; } // -------------------------------------------------------------------- From df70014e4be5b7d45c123adecd194b457ffb971b Mon Sep 17 00:00:00 2001 From: el-ma Date: Wed, 25 May 2016 18:03:28 +0300 Subject: [PATCH 4348/5397] added "Alexa Crawler" --- application/config/user_agents.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/application/config/user_agents.php b/application/config/user_agents.php index 721ec08d3a9..f520df9bd3b 100644 --- a/application/config/user_agents.php +++ b/application/config/user_agents.php @@ -208,5 +208,6 @@ 'CRAZYWEBCRAWLER' => 'Crazy Webcrawler', 'adsbot-google' => 'AdsBot Google', 'feedfetcher-google' => 'Feedfetcher Google', - 'curious george' => 'Curious George' + 'curious george' => 'Curious George', + 'ia_archiver' => 'Alexa Crawler' ); From c0d1b651fb44742711180465a6b677b1cf538137 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 25 May 2016 18:12:46 +0300 Subject: [PATCH 4349/5397] Merge pull request #4646 from el-ma/develop [ci skip] Add "Alexa Crawler" to robots --- application/config/user_agents.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/application/config/user_agents.php b/application/config/user_agents.php index 1129dbacd48..e5954e988c7 100644 --- a/application/config/user_agents.php +++ b/application/config/user_agents.php @@ -207,5 +207,6 @@ 'CRAZYWEBCRAWLER' => 'Crazy Webcrawler', 'adsbot-google' => 'AdsBot Google', 'feedfetcher-google' => 'Feedfetcher Google', - 'curious george' => 'Curious George' + 'curious george' => 'Curious George', + 'ia_archiver' => 'Alexa Crawler' ); From 5bdcdd1f6c263ecdccabeb20f313215fb8532b88 Mon Sep 17 00:00:00 2001 From: el-ma Date: Thu, 26 May 2016 09:34:16 +0300 Subject: [PATCH 4350/5397] Update robots in config/user_agents.php Added Majestic-12 and Uptimebot --- application/config/user_agents.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/application/config/user_agents.php b/application/config/user_agents.php index f520df9bd3b..1359bbea923 100644 --- a/application/config/user_agents.php +++ b/application/config/user_agents.php @@ -209,5 +209,7 @@ 'adsbot-google' => 'AdsBot Google', 'feedfetcher-google' => 'Feedfetcher Google', 'curious george' => 'Curious George', - 'ia_archiver' => 'Alexa Crawler' + 'ia_archiver' => 'Alexa Crawler', + 'MJ12bot' => 'Majestic-12', + 'Uptimebot' => 'Uptimebot' ); From e84a1f5814cc1c6dcfb20ab768e394720d42741b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 26 May 2016 10:09:37 +0300 Subject: [PATCH 4351/5397] Fix #4647 --- system/database/DB_query_builder.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index c862d937de2..84346a6edd1 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1395,7 +1395,7 @@ public function count_all_results($table = '', $reset = TRUE) $this->qb_orderby = NULL; } - $result = ($this->qb_distinct === TRUE) + $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby)) ? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results") : $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 471e78f53db..27b49f9156b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -31,6 +31,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4613) - :doc:`Email Library ` failed to send multiple emails via SMTP due to "already authenticated" errors when keep-alive is enabled. - Fixed a bug (#4633) - :doc:`Form Validation Library ` ignored multiple "callback" rules for empty, non-required fields. - Fixed a bug (#4637) - :doc:`Database ` method `error()` returned ``FALSE`` with the 'oci8' driver if there was no error. +- Fixed a bug (#4647) - :doc:`Query Builder ` method ``count_all_results()`` doesn't take into account ``GROUP BY`` clauses while deciding whether to do a subquery or not. Version 3.0.6 ============= From c6b01c8b602a8bb458f2817494f54c414ef40c8a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 26 May 2016 10:24:32 +0300 Subject: [PATCH 4352/5397] Merge pull request #4648 from el-ma/develop [ci skip] Add two more robots to config/user_agents.php --- application/config/user_agents.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/application/config/user_agents.php b/application/config/user_agents.php index e5954e988c7..798086b65cd 100644 --- a/application/config/user_agents.php +++ b/application/config/user_agents.php @@ -208,5 +208,7 @@ 'adsbot-google' => 'AdsBot Google', 'feedfetcher-google' => 'Feedfetcher Google', 'curious george' => 'Curious George', - 'ia_archiver' => 'Alexa Crawler' + 'ia_archiver' => 'Alexa Crawler', + 'MJ12bot' => 'Majestic-12', + 'Uptimebot' => 'Uptimebot' ); From d680779debb08d1e50fb234ceb63a75b1a2710ed Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 26 May 2016 10:28:04 +0300 Subject: [PATCH 4353/5397] [ci skip] Fix a minor Redis Session bug --- system/libraries/Session/drivers/Session_redis_driver.php | 2 +- user_guide_src/source/changelog.rst | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index e4e09fe0dda..8db74c0ca66 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -255,7 +255,7 @@ public function close() if ($this->_redis->ping() === '+PONG') { $this->_release_lock(); - if ($this->_redis->close() === $this->_failure) + if ($this->_redis->close() === FALSE) { return $this->_fail(); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 27b49f9156b..c86693d329d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -11,7 +11,7 @@ Release Date: Not Released - Updated :doc:`Image Manipulation Library ` to validate *width* and *height* configuration values. - Updated :doc:`Encryption Library ` to always prefer ``random_bytes()`` when it is available. - - Updated :doc:`Session Library ` to log 'debug' messages when using fallbacks to *session.save_path* (php.ini) or 'sess_use_database', 'sess_table_name' settings. + - Updated :doc:`Session Library ` to log 'debug' messages when using fallbacks to *session.save_path* (php.ini) or 'sess_use_database', 'sess_table_name' settings. - Added a 'LONGTEXT' to 'STRING' alias to :doc:`Database Forge ` for the 'cubrid', 'pdo/cubrid' drivers. - :php:func:`password_hash()` :doc:`compatibility function ` changes: @@ -32,6 +32,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4633) - :doc:`Form Validation Library ` ignored multiple "callback" rules for empty, non-required fields. - Fixed a bug (#4637) - :doc:`Database ` method `error()` returned ``FALSE`` with the 'oci8' driver if there was no error. - Fixed a bug (#4647) - :doc:`Query Builder ` method ``count_all_results()`` doesn't take into account ``GROUP BY`` clauses while deciding whether to do a subquery or not. +- Fixed a bug where :doc:`Session Library ` 'redis' driver didn't properly detect if a connection is properly closed on PHP 5.x. Version 3.0.6 ============= From e341601efed83a2c9cdca72de30de43a7ae12e1d Mon Sep 17 00:00:00 2001 From: Robert Angyal Date: Sat, 4 Jun 2016 12:12:28 +0200 Subject: [PATCH 4354/5397] Update Email.php --- system/libraries/Email.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 21b62fea0c5..0a55e184121 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1426,17 +1426,17 @@ protected function _build_message() .$this->_prep_quoted_printable($this->_body).$this->newline.$this->newline .'--'.$alt_boundary.'--'.$this->newline.$this->newline; - // multipart/mixed attachments - if ( ! empty($atc_boundary)) + if ( ! empty($rel_boundary)) { $body .= $this->newline.$this->newline; - $this->_append_attachments($body, $atc_boundary, 'mixed'); + $this->_append_attachments($body, $rel_boundary, 'related'); } - if ( ! empty($rel_boundary)) + // multipart/mixed attachments + if ( ! empty($atc_boundary)) { $body .= $this->newline.$this->newline; - $this->_append_attachments($body, $rel_boundary, 'related'); + $this->_append_attachments($body, $atc_boundary, 'mixed'); } break; @@ -1455,7 +1455,7 @@ protected function _attachments_have_multipart($type) { foreach ($this->_attachments as &$attachment) { - if ($attachment[$i]['multipart'] === $type) + if ($attachment['multipart'] === $type) { return TRUE; } From 3c42279598dfdd4832b1411f4a94355f2025db4b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 6 Jun 2016 09:44:50 +0300 Subject: [PATCH 4355/5397] Merge branch 'feature/email-attachments' into develop --- system/libraries/Email.php | 194 ++++++++++++++++++++++--------------- 1 file changed, 117 insertions(+), 77 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 6ff3efad970..f8772c6566f 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -149,13 +149,6 @@ class CI_Email { */ public $charset = 'UTF-8'; - /** - * Multipart message - * - * @var string 'mixed' (in the body) or 'related' (separate) - */ - public $multipart = 'mixed'; // "mixed" (in the body) or "related" (separate) - /** * Alternative message (for HTML messages only) * @@ -260,20 +253,6 @@ class CI_Email { */ protected $_finalbody = ''; - /** - * multipart/alternative boundary - * - * @var string - */ - protected $_alt_boundary = ''; - - /** - * Attachment boundary - * - * @var string - */ - protected $_atc_boundary = ''; - /** * Final headers to send * @@ -743,7 +722,8 @@ public function attach($file, $disposition = '', $newname = NULL, $mime = '') 'name' => array($file, $newname), 'disposition' => empty($disposition) ? 'attachment' : $disposition, // Can also be 'inline' Not sure if it matters 'type' => $mime, - 'content' => chunk_split(base64_encode($file_content)) + 'content' => chunk_split(base64_encode($file_content)), + 'multipart' => 'mixed' ); return $this; @@ -761,15 +741,11 @@ public function attach($file, $disposition = '', $newname = NULL, $mime = '') */ public function attachment_cid($filename) { - if ($this->multipart !== 'related') - { - $this->multipart = 'related'; // Thunderbird need this for inline images - } - for ($i = 0, $c = count($this->_attachments); $i < $c; $i++) { if ($this->_attachments[$i]['name'][0] === $filename) { + $this->_attachments[$i]['multipart'] = 'related'; $this->_attachments[$i]['cid'] = uniqid(basename($this->_attachments[$i]['name'][0]).'@'); return $this->_attachments[$i]['cid']; } @@ -913,19 +889,6 @@ public function set_crlf($crlf = "\n") // -------------------------------------------------------------------- - /** - * Set Message Boundary - * - * @return void - */ - protected function _set_boundaries() - { - $this->_alt_boundary = 'B_ALT_'.uniqid(''); // multipart/alternative - $this->_atc_boundary = 'B_ATC_'.uniqid(''); // attachment boundary - } - - // -------------------------------------------------------------------- - /** * Get the Message ID * @@ -993,9 +956,9 @@ protected function _get_content_type() { if ($this->mailtype === 'html') { - return (count($this->_attachments) === 0) ? 'html' : 'html-attach'; + return empty($this->_attachments) ? 'html' : 'html-attach'; } - elseif ($this->mailtype === 'text' && count($this->_attachments) > 0) + elseif ($this->mailtype === 'text' && ! empty($this->_attachments)) { return 'plain-attach'; } @@ -1301,7 +1264,6 @@ protected function _build_message() $this->_body = $this->word_wrap($this->_body); } - $this->_set_boundaries(); $this->_write_headers(); $hdr = ($this->_get_protocol() === 'mail') ? $this->newline : ''; @@ -1309,7 +1271,7 @@ protected function _build_message() switch ($this->_get_content_type()) { - case 'plain' : + case 'plain': $hdr .= 'Content-Type: text/plain; charset='.$this->charset.$this->newline .'Content-Transfer-Encoding: '.$this->_get_encoding(); @@ -1326,7 +1288,7 @@ protected function _build_message() return; - case 'html' : + case 'html': if ($this->send_multipart === FALSE) { @@ -1335,14 +1297,16 @@ protected function _build_message() } else { - $hdr .= 'Content-Type: multipart/alternative; boundary="'.$this->_alt_boundary.'"'; + $boundary = uniqid('B_ALT_'); + $hdr .= 'Content-Type: multipart/alternative; boundary="'.$boundary.'"'; $body .= $this->_get_mime_message().$this->newline.$this->newline - .'--'.$this->_alt_boundary.$this->newline + .'--'.$boundary.$this->newline .'Content-Type: text/plain; charset='.$this->charset.$this->newline .'Content-Transfer-Encoding: '.$this->_get_encoding().$this->newline.$this->newline - .$this->_get_alt_message().$this->newline.$this->newline.'--'.$this->_alt_boundary.$this->newline + .$this->_get_alt_message().$this->newline.$this->newline + .'--'.$boundary.$this->newline .'Content-Type: text/html; charset='.$this->charset.$this->newline .'Content-Transfer-Encoding: quoted-printable'.$this->newline.$this->newline; @@ -1361,14 +1325,15 @@ protected function _build_message() if ($this->send_multipart !== FALSE) { - $this->_finalbody .= '--'.$this->_alt_boundary.'--'; + $this->_finalbody .= '--'.$boundary.'--'; } return; - case 'plain-attach' : + case 'plain-attach': - $hdr .= 'Content-Type: multipart/'.$this->multipart.'; boundary="'.$this->_atc_boundary.'"'; + $boundary = uniqid('B_ATC_'); + $hdr .= 'Content-Type: multipart/mixed; boundary="'.$boundary.'"'; if ($this->_get_protocol() === 'mail') { @@ -1377,59 +1342,83 @@ protected function _build_message() $body .= $this->_get_mime_message().$this->newline .$this->newline - .'--'.$this->_atc_boundary.$this->newline + .'--'.$boundary.$this->newline .'Content-Type: text/plain; charset='.$this->charset.$this->newline .'Content-Transfer-Encoding: '.$this->_get_encoding().$this->newline .$this->newline .$this->_body.$this->newline.$this->newline; - break; - case 'html-attach' : + $this->_append_attachments($body, $boundary); - $hdr .= 'Content-Type: multipart/'.$this->multipart.'; boundary="'.$this->_atc_boundary.'"'; + break; + case 'html-attach': + + $alt_boundary = uniqid('B_ALT_'); + $last_boundary = NULL; + + if ($this->_attachments_have_multipart('mixed')) + { + $atc_boundary = uniqid('B_ATC_'); + $hdr .= 'Content-Type: multipart/mixed; boundary="'.$atc_boundary.'"'; + $last_boundary = $atc_boundary; + } + + if ($this->_attachments_have_multipart('related')) + { + $rel_boundary = uniqid('B_REL_'); + $rel_boundary_header = 'Content-Type: multipart/related; boundary="'.$rel_boundary.'"'; + + if (isset($last_boundary)) + { + $body .= '--'.$last_boundary.$this->newline.$rel_boundary_header; + } + else + { + $hdr .= $rel_boundary_header; + } + + $last_boundary = $rel_boundary; + } if ($this->_get_protocol() === 'mail') { $this->_header_str .= $hdr; } + strlen($body) && $body .= $this->newline.$this->newline; $body .= $this->_get_mime_message().$this->newline.$this->newline - .'--'.$this->_atc_boundary.$this->newline + .'--'.$last_boundary.$this->newline - .'Content-Type: multipart/alternative; boundary="'.$this->_alt_boundary.'"'.$this->newline.$this->newline - .'--'.$this->_alt_boundary.$this->newline + .'Content-Type: multipart/alternative; boundary="'.$alt_boundary.'"'.$this->newline.$this->newline + .'--'.$alt_boundary.$this->newline .'Content-Type: text/plain; charset='.$this->charset.$this->newline .'Content-Transfer-Encoding: '.$this->_get_encoding().$this->newline.$this->newline - .$this->_get_alt_message().$this->newline.$this->newline.'--'.$this->_alt_boundary.$this->newline + .$this->_get_alt_message().$this->newline.$this->newline + .'--'.$alt_boundary.$this->newline .'Content-Type: text/html; charset='.$this->charset.$this->newline .'Content-Transfer-Encoding: quoted-printable'.$this->newline.$this->newline .$this->_prep_quoted_printable($this->_body).$this->newline.$this->newline - .'--'.$this->_alt_boundary.'--'.$this->newline.$this->newline; + .'--'.$alt_boundary.'--'.$this->newline.$this->newline; - break; - } - - $attachment = array(); - for ($i = 0, $c = count($this->_attachments), $z = 0; $i < $c; $i++) - { - $filename = $this->_attachments[$i]['name'][0]; - $basename = ($this->_attachments[$i]['name'][1] === NULL) - ? basename($filename) : $this->_attachments[$i]['name'][1]; + if ( ! empty($rel_boundary)) + { + $body .= $this->newline.$this->newline; + $this->_append_attachments($body, $rel_boundary, 'related'); + } - $attachment[$z++] = '--'.$this->_atc_boundary.$this->newline - .'Content-type: '.$this->_attachments[$i]['type'].'; ' - .'name="'.$basename.'"'.$this->newline - .'Content-Disposition: '.$this->_attachments[$i]['disposition'].';'.$this->newline - .'Content-Transfer-Encoding: base64'.$this->newline - .(empty($this->_attachments[$i]['cid']) ? '' : 'Content-ID: <'.$this->_attachments[$i]['cid'].'>'.$this->newline); + // multipart/mixed attachments + if ( ! empty($atc_boundary)) + { + $body .= $this->newline.$this->newline; + $this->_append_attachments($body, $atc_boundary, 'mixed'); + } - $attachment[$z++] = $this->_attachments[$i]['content']; + break; } - $body .= implode($this->newline, $attachment).$this->newline.'--'.$this->_atc_boundary.'--'; $this->_finalbody = ($this->_get_protocol() === 'mail') ? $body : $hdr.$this->newline.$this->newline.$body; @@ -1439,6 +1428,57 @@ protected function _build_message() // -------------------------------------------------------------------- + protected function _attachments_have_multipart($type) + { + foreach ($this->_attachments as &$attachment) + { + if ($attachment['multipart'] === $type) + { + return TRUE; + } + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Prepares attachment string + * + * @param string $body Message body to append to + * @param string $boundary Multipart boundary + * @param string $multipart When provided, only attachments of this type will be processed + * @return string + */ + protected function _append_attachments(&$body, $boundary, $multipart = null) + { + for ($i = 0, $c = count($this->_attachments); $i < $c; $i++) + { + if (isset($multipart) && $this->_attachments[$i]['multipart'] !== $multipart) + { + continue; + } + + $name = isset($this->_attachments[$i]['name'][1]) + ? $this->_attachments[$i]['name'][1] + : basename($this->_attachments[$i]['name'][0]); + + $body .= '--'.$boundary.$this->newline + .'Content-Type: '.$this->_attachments[$i]['type'].'; name="'.$name.'"'.$this->newline + .'Content-Disposition: '.$this->_attachments[$i]['disposition'].';'.$this->newline + .'Content-Transfer-Encoding: base64'.$this->newline + .(empty($this->_attachments[$i]['cid']) ? '' : 'Content-ID: <'.$this->_attachments[$i]['cid'].'>'.$this->newline.$this->newline) + .$this->_attachments[$i]['content'].$this->newline; + } + + // $name won't be set if no attachments were appended, + // and therefore a boundary wouldn't be necessary + empty($name) OR $body .= '--'.$boundary.'--'; + } + + // -------------------------------------------------------------------- + /** * Prep Quoted Printable * From 83630055ab671867b14f02d45370eb0bc41a0cb0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 6 Jun 2016 09:52:58 +0300 Subject: [PATCH 4356/5397] [ci skip] Add changelog entry for issue #4583, PR #4585 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index c86693d329d..0647f6dbb6e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -33,6 +33,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4637) - :doc:`Database ` method `error()` returned ``FALSE`` with the 'oci8' driver if there was no error. - Fixed a bug (#4647) - :doc:`Query Builder ` method ``count_all_results()`` doesn't take into account ``GROUP BY`` clauses while deciding whether to do a subquery or not. - Fixed a bug where :doc:`Session Library ` 'redis' driver didn't properly detect if a connection is properly closed on PHP 5.x. +- Fixed a bug (#4583) - :doc:`Email Library ` didn't properly handle inline attachments in HTML emails. Version 3.0.6 ============= From ed6f01077abb8946b54413d383fa1b7b46cd3d1f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 8 Jun 2016 11:06:59 +0300 Subject: [PATCH 4357/5397] Make db_select() clear cached database metadata --- system/database/drivers/mssql/mssql_driver.php | 1 + system/database/drivers/mysql/mysql_driver.php | 1 + system/database/drivers/mysqli/mysqli_driver.php | 1 + system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php | 1 + system/database/drivers/sqlsrv/sqlsrv_driver.php | 1 + user_guide_src/source/changelog.rst | 1 + 6 files changed, 6 insertions(+) diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index d40d67a0b34..66d7572e49f 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -158,6 +158,7 @@ public function db_select($database = '') if (mssql_select_db('['.$database.']', $this->conn_id)) { $this->database = $database; + $this->data_cache = array(); return TRUE; } diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 78b1d703a18..7804dda5838 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -208,6 +208,7 @@ public function db_select($database = '') if (mysql_select_db($database, $this->conn_id)) { $this->database = $database; + $this->data_cache = array(); return TRUE; } diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 06c34187f4a..f52163c2d1e 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -256,6 +256,7 @@ public function db_select($database = '') if ($this->conn_id->select_db($database)) { $this->database = $database; + $this->data_cache = array(); return TRUE; } diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php index 70f2bfd4ed7..38a5a8affb5 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -218,6 +218,7 @@ public function db_select($database = '') if (FALSE !== $this->simple_query('USE '.$this->escape_identifiers($database))) { $this->database = $database; + $this->data_cache = array(); return TRUE; } diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index 0cd9ce16df5..c55d5f7b757 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -171,6 +171,7 @@ public function db_select($database = '') if ($this->_execute('USE '.$this->escape_identifiers($database))) { $this->database = $database; + $this->data_cache = array(); return TRUE; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 0647f6dbb6e..8774d4b844d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -34,6 +34,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4647) - :doc:`Query Builder ` method ``count_all_results()`` doesn't take into account ``GROUP BY`` clauses while deciding whether to do a subquery or not. - Fixed a bug where :doc:`Session Library ` 'redis' driver didn't properly detect if a connection is properly closed on PHP 5.x. - Fixed a bug (#4583) - :doc:`Email Library ` didn't properly handle inline attachments in HTML emails. +- Fixed a bug where :doc:`Database ` method `db_select()` didn't clear metadata cached for the previously used database. Version 3.0.6 ============= From 343163624e2527df9ce0c22a6e4ccfebf5b9f48b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 20 Jun 2016 13:32:45 +0300 Subject: [PATCH 4358/5397] [ci skip] Remove non-existent parameter from log_message() docs Reported in #4671 --- user_guide_src/source/general/errors.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/user_guide_src/source/general/errors.rst b/user_guide_src/source/general/errors.rst index 9c190feb1f1..a1cc3517a3a 100644 --- a/user_guide_src/source/general/errors.rst +++ b/user_guide_src/source/general/errors.rst @@ -78,11 +78,10 @@ The following functions let you generate errors: CodeIgniter automatically logs any ``show_404()`` calls. Setting the optional second parameter to FALSE will skip logging. -.. php:function:: log_message($level, $message, $php_error = FALSE) +.. php:function:: log_message($level, $message) :param string $level: Log level: 'error', 'debug' or 'info' :param string $message: Message to log - :param bool $php_error: Whether we're logging a native PHP error message :rtype: void This function lets you write messages to your log files. You must From f7b028bf6db9c298db99cf800777ad3691b206b5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 22 Jun 2016 12:42:44 +0300 Subject: [PATCH 4359/5397] Fix #4675 --- system/helpers/file_helper.php | 8 +++++--- user_guide_src/source/changelog.rst | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php index 0d8d1d0d94f..3cb36a551f0 100644 --- a/system/helpers/file_helper.php +++ b/system/helpers/file_helper.php @@ -138,13 +138,15 @@ function delete_files($path, $del_dir = FALSE, $htdocs = FALSE, $_level = 0) { if ($filename !== '.' && $filename !== '..') { - if (is_dir($path.DIRECTORY_SEPARATOR.$filename) && $filename[0] !== '.') + $filepath = $path.DIRECTORY_SEPARATOR.$filename; + + if (is_dir($filepath) && $filename[0] !== '.' && ! is_link($filepath)) { - delete_files($path.DIRECTORY_SEPARATOR.$filename, $del_dir, $htdocs, $_level + 1); + delete_files($filepath, $del_dir, $htdocs, $_level + 1); } elseif ($htdocs !== TRUE OR ! preg_match('/^(\.htaccess|index\.(html|htm|php)|web\.config)$/i', $filename)) { - @unlink($path.DIRECTORY_SEPARATOR.$filename); + @unlink($filepath); } } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8774d4b844d..da96b009e01 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -35,6 +35,7 @@ Bug fixes for 3.0.7 - Fixed a bug where :doc:`Session Library ` 'redis' driver didn't properly detect if a connection is properly closed on PHP 5.x. - Fixed a bug (#4583) - :doc:`Email Library ` didn't properly handle inline attachments in HTML emails. - Fixed a bug where :doc:`Database ` method `db_select()` didn't clear metadata cached for the previously used database. +- Fixed a bug (#4675) - :doc:`File Helper ` function :php:func:`delete_files()` treated symbolic links as regular directories. Version 3.0.6 ============= From ac718628e8b486f8016ac775829a32cfbc9fa3da Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 22 Jun 2016 13:01:51 +0300 Subject: [PATCH 4360/5397] Fix #4674 --- system/database/drivers/pdo/pdo_driver.php | 5 ++++- .../database/drivers/pdo/subdrivers/pdo_dblib_driver.php | 7 ++++++- user_guide_src/source/changelog.rst | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index c6f84e0f937..c27607e5527 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -126,7 +126,10 @@ public function __construct($params) */ public function db_connect($persistent = FALSE) { - $this->options[PDO::ATTR_PERSISTENT] = $persistent; + if ($persistent === TRUE) + { + $this->options[PDO::ATTR_PERSISTENT] = TRUE; + } try { diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php index 84695ee9b40..9a1cbcaf4be 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php @@ -126,7 +126,12 @@ public function __construct($params) */ public function db_connect($persistent = FALSE) { - $this->conn_id = parent::db_connect($persistent); + if ($persistent === TRUE) + { + log_message('debug', "dblib driver doesn't support persistent connections"); + } + + $this->conn_id = parent::db_connect(FALSE); if ( ! is_object($this->conn_id)) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index da96b009e01..ec7239649bb 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -36,6 +36,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4583) - :doc:`Email Library ` didn't properly handle inline attachments in HTML emails. - Fixed a bug where :doc:`Database ` method `db_select()` didn't clear metadata cached for the previously used database. - Fixed a bug (#4675) - :doc:`File Helper ` function :php:func:`delete_files()` treated symbolic links as regular directories. +- Fixed a bug (#4674) - :doc:`Database ` driver 'dblib' triggered E_WARNING messages while connecting. Version 3.0.6 ============= From e947ff5e84e46cef404c7403e0d94b206c1a6404 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sun, 26 Jun 2016 20:49:07 +0900 Subject: [PATCH 4361/5397] Fix oci8_forge * Oracle does not have `create table if exists` * Oracle has only NUMBER for integer Signed-off-by: Kenji Suzuki --- system/database/drivers/oci8/oci8_forge.php | 37 +++++++++++++++++++ .../drivers/pdo/subdrivers/pdo_oci_forge.php | 35 ++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index 1ca559a32b7..989c7a8b72f 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -53,6 +53,13 @@ class CI_DB_oci8_forge extends CI_DB_forge { */ protected $_create_database = FALSE; + /** + * CREATE TABLE IF statement + * + * @var string + */ + protected $_create_table_if = FALSE; + /** * DROP DATABASE statement * @@ -146,4 +153,34 @@ protected function _attr_auto_increment(&$attributes, &$field) // Not supported - sequences and triggers must be used instead } + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'INT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'BIGINT': + $attributes['TYPE'] = 'NUMBER'; + return; + default: return; + } + } + } diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php index d0b7be8f257..f7b7f8f5a94 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php @@ -53,6 +53,13 @@ class CI_DB_pdo_oci_forge extends CI_DB_pdo_forge { */ protected $_create_database = FALSE; + /** + * CREATE TABLE IF statement + * + * @var string + */ + protected $_create_table_if = FALSE; + /** * DROP DATABASE statement * @@ -146,4 +153,32 @@ protected function _attr_auto_increment(&$attributes, &$field) // Not supported - sequences and triggers must be used instead } + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'INT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'BIGINT': + $attributes['TYPE'] = 'NUMBER'; + return; + default: return; + } + } + } From 4b933ad9d24daf67e28d804b95a231a707afede3 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 28 Jun 2016 11:20:35 +0900 Subject: [PATCH 4362/5397] Remove duplicated $_create_table_if Signed-off-by: Kenji Suzuki --- system/database/drivers/pdo/subdrivers/pdo_oci_forge.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php index f7b7f8f5a94..94a52ffc809 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php @@ -67,13 +67,6 @@ class CI_DB_pdo_oci_forge extends CI_DB_pdo_forge { */ protected $_drop_database = FALSE; - /** - * CREATE TABLE IF statement - * - * @var string - */ - protected $_create_table_if = 'CREATE TABLE IF NOT EXISTS'; - /** * UNSIGNED support * From a09b96900af8615f4bb0b50046588fb3d5e5db84 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 28 Jun 2016 11:06:47 +0300 Subject: [PATCH 4363/5397] Merge pull request #4678 from kenjis/fix-oci8_forge DBForge adjustments for Oracle --- system/database/drivers/oci8/oci8_forge.php | 37 +++++++++++++++++++ .../drivers/pdo/subdrivers/pdo_oci_forge.php | 36 ++++++++++++++++-- 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index 1ca559a32b7..989c7a8b72f 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -53,6 +53,13 @@ class CI_DB_oci8_forge extends CI_DB_forge { */ protected $_create_database = FALSE; + /** + * CREATE TABLE IF statement + * + * @var string + */ + protected $_create_table_if = FALSE; + /** * DROP DATABASE statement * @@ -146,4 +153,34 @@ protected function _attr_auto_increment(&$attributes, &$field) // Not supported - sequences and triggers must be used instead } + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'INT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'BIGINT': + $attributes['TYPE'] = 'NUMBER'; + return; + default: return; + } + } + } diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php index d0b7be8f257..94a52ffc809 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php @@ -54,18 +54,18 @@ class CI_DB_pdo_oci_forge extends CI_DB_pdo_forge { protected $_create_database = FALSE; /** - * DROP DATABASE statement + * CREATE TABLE IF statement * * @var string */ - protected $_drop_database = FALSE; + protected $_create_table_if = FALSE; /** - * CREATE TABLE IF statement + * DROP DATABASE statement * * @var string */ - protected $_create_table_if = 'CREATE TABLE IF NOT EXISTS'; + protected $_drop_database = FALSE; /** * UNSIGNED support @@ -146,4 +146,32 @@ protected function _attr_auto_increment(&$attributes, &$field) // Not supported - sequences and triggers must be used instead } + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'INT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'BIGINT': + $attributes['TYPE'] = 'NUMBER'; + return; + default: return; + } + } + } From 9a7f19c08d98aeb1331cf19327fe8e4560415c91 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 28 Jun 2016 11:12:07 +0300 Subject: [PATCH 4364/5397] [ci skip] Add changelog entries for PR #4678 --- system/database/drivers/oci8/oci8_forge.php | 1 - system/database/drivers/pdo/subdrivers/pdo_oci_forge.php | 1 - user_guide_src/source/changelog.rst | 2 ++ 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index 989c7a8b72f..23e0257574f 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -182,5 +182,4 @@ protected function _attr_type(&$attributes) default: return; } } - } diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php index 94a52ffc809..705b1c711c9 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php @@ -173,5 +173,4 @@ protected function _attr_type(&$attributes) default: return; } } - } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ec7239649bb..22302ab0943 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -13,6 +13,7 @@ Release Date: Not Released - Updated :doc:`Encryption Library ` to always prefer ``random_bytes()`` when it is available. - Updated :doc:`Session Library ` to log 'debug' messages when using fallbacks to *session.save_path* (php.ini) or 'sess_use_database', 'sess_table_name' settings. - Added a 'LONGTEXT' to 'STRING' alias to :doc:`Database Forge ` for the 'cubrid', 'pdo/cubrid' drivers. + - Added 'TINYINT', 'MEDIUMINT', 'INT' and 'BIGINT' aliases to 'NUMBER' to :doc:`Database Forge ` for the 'oci8', 'pdo/oci' drivers. - :php:func:`password_hash()` :doc:`compatibility function ` changes: @@ -37,6 +38,7 @@ Bug fixes for 3.0.7 - Fixed a bug where :doc:`Database ` method `db_select()` didn't clear metadata cached for the previously used database. - Fixed a bug (#4675) - :doc:`File Helper ` function :php:func:`delete_files()` treated symbolic links as regular directories. - Fixed a bug (#4674) - :doc:`Database ` driver 'dblib' triggered E_WARNING messages while connecting. +- Fixed a bug (#4678) - :doc:`Database Forge ` tried to use unsupported `IF NOT EXISTS` clause when creating tables on Oracle. Version 3.0.6 ============= From 2761c4c4e801098fddfa97e156c485bd8f84f675 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 4 Jul 2016 17:25:56 +0300 Subject: [PATCH 4365/5397] [ci skip] Make the ZIP library's doc 'Next' button point to DB Suggested in #4682 --- user_guide_src/source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/index.rst b/user_guide_src/source/index.rst index a13ec983e11..615c27f3c5d 100644 --- a/user_guide_src/source/index.rst +++ b/user_guide_src/source/index.rst @@ -116,7 +116,7 @@ Helper Reference installation/index general/index libraries/index - helpers/index database/index + helpers/index tutorial/index general/credits From abfa962e7ed45b5dbc5ac2a9ef99be42008504d6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 4 Jul 2016 17:26:33 +0300 Subject: [PATCH 4366/5397] [ci skip] Fix a changelog entry reference --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 22302ab0943..cfa28aea0fe 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -37,7 +37,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4583) - :doc:`Email Library ` didn't properly handle inline attachments in HTML emails. - Fixed a bug where :doc:`Database ` method `db_select()` didn't clear metadata cached for the previously used database. - Fixed a bug (#4675) - :doc:`File Helper ` function :php:func:`delete_files()` treated symbolic links as regular directories. -- Fixed a bug (#4674) - :doc:`Database ` driver 'dblib' triggered E_WARNING messages while connecting. +- Fixed a bug (#4674) - :doc:`Database ` driver 'dblib' triggered E_WARNING messages while connecting. - Fixed a bug (#4678) - :doc:`Database Forge ` tried to use unsupported `IF NOT EXISTS` clause when creating tables on Oracle. Version 3.0.6 From 87f7634117c34a7667b1eb13c39bf8e53bdb1b87 Mon Sep 17 00:00:00 2001 From: chestnutprog Date: Wed, 6 Jul 2016 21:13:22 +0800 Subject: [PATCH 4367/5397] Update Upload.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 特殊文件名可能会引起bug --- system/libraries/Upload.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index fa365058c2f..7b94a230c96 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -601,7 +601,7 @@ public function data($index = NULL) 'file_type' => $this->file_type, 'file_path' => $this->upload_path, 'full_path' => $this->upload_path.$this->file_name, - 'raw_name' => str_replace($this->file_ext, '', $this->file_name), + 'raw_name' => substr($this->file_name, 0, strlen($this->file_name) - strlen($this->file_ext)), 'orig_name' => $this->orig_name, 'client_name' => $this->client_name, 'file_ext' => $this->file_ext, From 7a6ae33b3d457a1f86bc20ef78426ada3f37f899 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 6 Jul 2016 16:36:40 +0300 Subject: [PATCH 4368/5397] Merge pull request #4691 from chestnutprog/develop [ci skip] Fix a bug in CI_Upload::data() --- system/libraries/Upload.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index fa365058c2f..7b94a230c96 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -601,7 +601,7 @@ public function data($index = NULL) 'file_type' => $this->file_type, 'file_path' => $this->upload_path, 'full_path' => $this->upload_path.$this->file_name, - 'raw_name' => str_replace($this->file_ext, '', $this->file_name), + 'raw_name' => substr($this->file_name, 0, strlen($this->file_name) - strlen($this->file_ext)), 'orig_name' => $this->orig_name, 'client_name' => $this->client_name, 'file_ext' => $this->file_ext, From 17fa8defc1b580df4395200f6536498918bc6ea6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 6 Jul 2016 16:48:15 +0300 Subject: [PATCH 4369/5397] [ci skip] Add a changelog entry for PR #4691 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index cfa28aea0fe..d39900c675e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -39,6 +39,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4675) - :doc:`File Helper ` function :php:func:`delete_files()` treated symbolic links as regular directories. - Fixed a bug (#4674) - :doc:`Database ` driver 'dblib' triggered E_WARNING messages while connecting. - Fixed a bug (#4678) - :doc:`Database Forge ` tried to use unsupported `IF NOT EXISTS` clause when creating tables on Oracle. +- Fixed a bug (#4691) - :doc:`File Uploading Library ` method ``data()`` returns wrong 'raw_name' when the filename extension is also contained in the raw filename. Version 3.0.6 ============= From 64d9d1ec12be9f02459a5e5c8a9124fc97686529 Mon Sep 17 00:00:00 2001 From: nopesled Date: Thu, 7 Jul 2016 17:40:47 +0100 Subject: [PATCH 4370/5397] Update path_helper.php Protect against RFI via php:// wrapper --- system/helpers/path_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/path_helper.php b/system/helpers/path_helper.php index 838ece9e975..f3757affb37 100644 --- a/system/helpers/path_helper.php +++ b/system/helpers/path_helper.php @@ -61,7 +61,7 @@ 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)#i', $path) OR filter_var($path, FILTER_VALIDATE_IP) === $path ) + if (preg_match('#^(http:\/\/|https:\/\/|www\.|ftp|php)#i', $path) OR filter_var($path, FILTER_VALIDATE_IP) === $path ) { show_error('The path you submitted must be a local server path, not a URL'); } From 85eaa0bff12574b8a1c08b68942ff070e6bb341c Mon Sep 17 00:00:00 2001 From: nopesled Date: Thu, 7 Jul 2016 17:48:22 +0100 Subject: [PATCH 4371/5397] Update path_helper.php --- system/helpers/path_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/path_helper.php b/system/helpers/path_helper.php index f3757affb37..18e17509337 100644 --- a/system/helpers/path_helper.php +++ b/system/helpers/path_helper.php @@ -61,7 +61,7 @@ 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|php)#i', $path) OR filter_var($path, FILTER_VALIDATE_IP) === $path ) + if (preg_match('#^(http:\/\/|https:\/\/|www\.|ftp|php:\/\/)#i', $path) OR filter_var($path, FILTER_VALIDATE_IP) === $path ) { show_error('The path you submitted must be a local server path, not a URL'); } From a1b0c7e3e5e7c63defbb58bae77b50370df30524 Mon Sep 17 00:00:00 2001 From: Claudio Galdiolo Date: Thu, 7 Jul 2016 15:32:12 -0400 Subject: [PATCH 4372/5397] recommend PHP >= 5.6 PHP 5.5 end of life is July 10, 2016 --- readme.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.rst b/readme.rst index 84ecc67f94e..7a376322d4d 100644 --- a/readme.rst +++ b/readme.rst @@ -29,7 +29,7 @@ guide change log Date: Mon, 11 Jul 2016 18:01:54 +0800 Subject: [PATCH 4373/5397] Use negative length for speeding up. Signed-off-by: tianhe1986 --- system/libraries/Upload.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 7b94a230c96..056f6de1ef0 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -601,7 +601,7 @@ public function data($index = NULL) 'file_type' => $this->file_type, 'file_path' => $this->upload_path, 'full_path' => $this->upload_path.$this->file_name, - 'raw_name' => substr($this->file_name, 0, strlen($this->file_name) - strlen($this->file_ext)), + 'raw_name' => substr($this->file_name, 0, -strlen($this->file_ext)), 'orig_name' => $this->orig_name, 'client_name' => $this->client_name, 'file_ext' => $this->file_ext, From e12fcec770d7bc03f746c291e96cc75b51475f74 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 19 Jul 2016 13:37:40 +0300 Subject: [PATCH 4374/5397] [ci skip] Fix an undefined index for 'timeout' in Redis session driver http://forum.codeigniter.com/thread-64219.html --- system/libraries/Session/drivers/Session_redis_driver.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index ad14cbfdcca..d3a265958f7 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -99,8 +99,9 @@ public function __construct(&$params) elseif (preg_match('#(?:tcp://)?([^:?]+)(?:\:(\d+))?(?\?.+)?#', $this->_config['save_path'], $matches)) { $save_path = array( - 'host' => $matches[1], - 'port' => empty($matches[2]) ? NULL : $matches[2] + 'host' => $matches[1], + 'port' => empty($matches[2]) ? NULL : $matches[2], + 'timeout' => NULL // We always pass this to Redis::connect(), so it needs to exist ); } else From 9fd9248a2d712d5ae95bf2e6c6cd036e6b522cbb Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 19 Jul 2016 14:04:17 +0300 Subject: [PATCH 4375/5397] Fix #4679 --- system/core/Input.php | 4 ++-- tests/codeigniter/core/Input_test.php | 6 ++++++ user_guide_src/source/changelog.rst | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index 50ca047e8d2..b81d51ebff9 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -519,9 +519,9 @@ public function ip_address() if ($separator === ':') { $netaddr = explode(':', str_replace('::', str_repeat(':', 9 - substr_count($netaddr, ':')), $netaddr)); - for ($i = 0; $i < 8; $i++) + for ($j = 0; $j < 8; $j++) { - $netaddr[$i] = intval($netaddr[$i], 16); + $netaddr[$i] = intval($netaddr[$j], 16); } } else diff --git a/tests/codeigniter/core/Input_test.php b/tests/codeigniter/core/Input_test.php index c56900d2205..e1f4011b57e 100644 --- a/tests/codeigniter/core/Input_test.php +++ b/tests/codeigniter/core/Input_test.php @@ -261,6 +261,12 @@ public function test_ip_address() $_SERVER['REMOTE_ADDR'] = 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329'; $this->assertEquals('FE80:0000:0000:0000:0202:B3FF:FE1E:8300', $this->input->ip_address()); + $this->input->ip_address = FALSE; + $this->ci_set_config('proxy_ips', '0::/32'); + $_SERVER['HTTP_CLIENT_IP'] = '127.0.0.7'; + $_SERVER['REMOTE_ADDR'] = '0000:0000:0000:0000:0000:0000:0000:0001'; + $this->assertEquals('127.0.0.7', $this->input->ip_address()); + $this->input->ip_address = FALSE; $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; // back to reality } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d39900c675e..ef8b5d6cecb 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -40,6 +40,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4674) - :doc:`Database ` driver 'dblib' triggered E_WARNING messages while connecting. - Fixed a bug (#4678) - :doc:`Database Forge ` tried to use unsupported `IF NOT EXISTS` clause when creating tables on Oracle. - Fixed a bug (#4691) - :doc:`File Uploading Library ` method ``data()`` returns wrong 'raw_name' when the filename extension is also contained in the raw filename. +- Fixed a bug (#4679) - :doc:`Input Library ` method ``ip_address()`` errors with a matching ``$config['proxy_ips']`` IPv6 address. Version 3.0.6 ============= From 79b9923634cdb69f746ffcd4b288f738988b1367 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 19 Jul 2016 14:12:46 +0300 Subject: [PATCH 4376/5397] [ci skip] Consistent changelog syntax --- user_guide_src/source/changelog.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ef8b5d6cecb..a9cb450c862 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -31,14 +31,14 @@ Bug fixes for 3.0.7 - Fixed a bug (#4605) - :doc:`Config Library ` method ``site_url()`` stripped trailing slashes from relative URIs passed to it. - Fixed a bug (#4613) - :doc:`Email Library ` failed to send multiple emails via SMTP due to "already authenticated" errors when keep-alive is enabled. - Fixed a bug (#4633) - :doc:`Form Validation Library ` ignored multiple "callback" rules for empty, non-required fields. -- Fixed a bug (#4637) - :doc:`Database ` method `error()` returned ``FALSE`` with the 'oci8' driver if there was no error. +- Fixed a bug (#4637) - :doc:`Database ` method ``error()`` returned ``FALSE`` with the 'oci8' driver if there was no error. - Fixed a bug (#4647) - :doc:`Query Builder ` method ``count_all_results()`` doesn't take into account ``GROUP BY`` clauses while deciding whether to do a subquery or not. - Fixed a bug where :doc:`Session Library ` 'redis' driver didn't properly detect if a connection is properly closed on PHP 5.x. - Fixed a bug (#4583) - :doc:`Email Library ` didn't properly handle inline attachments in HTML emails. -- Fixed a bug where :doc:`Database ` method `db_select()` didn't clear metadata cached for the previously used database. +- Fixed a bug where :doc:`Database ` method ``db_select()`` didn't clear metadata cached for the previously used database. - Fixed a bug (#4675) - :doc:`File Helper ` function :php:func:`delete_files()` treated symbolic links as regular directories. - Fixed a bug (#4674) - :doc:`Database ` driver 'dblib' triggered E_WARNING messages while connecting. -- Fixed a bug (#4678) - :doc:`Database Forge ` tried to use unsupported `IF NOT EXISTS` clause when creating tables on Oracle. +- Fixed a bug (#4678) - :doc:`Database Forge ` tried to use unsupported ``IF NOT EXISTS`` clause when creating tables on Oracle. - Fixed a bug (#4691) - :doc:`File Uploading Library ` method ``data()`` returns wrong 'raw_name' when the filename extension is also contained in the raw filename. - Fixed a bug (#4679) - :doc:`Input Library ` method ``ip_address()`` errors with a matching ``$config['proxy_ips']`` IPv6 address. From fc6f444f74b54a3c7ff3c53ba7fdf83378a86bcc Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 19 Jul 2016 14:15:49 +0300 Subject: [PATCH 4377/5397] [ci skip] Clarify lang() helper docs As requested in #4693 --- user_guide_src/source/helpers/language_helper.rst | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/user_guide_src/source/helpers/language_helper.rst b/user_guide_src/source/helpers/language_helper.rst index cadf3c0cee2..cfbd6c05723 100644 --- a/user_guide_src/source/helpers/language_helper.rst +++ b/user_guide_src/source/helpers/language_helper.rst @@ -27,17 +27,20 @@ The following functions are available: .. php:function:: lang($line[, $for = ''[, $attributes = array()]]) - :param string $line: Language line key - :param string $for: HTML "for" attribute (ID of the element we're creating a label for) - :param array $attributes: Any additional HTML attributes - :returns: HTML-formatted language line label + :param string $line: Language line key + :param string $for: HTML "for" attribute (ID of the element we're creating a label for) + :param array $attributes: Any additional HTML attributes + :returns: The language line; in an HTML label tag, if the ``$for`` parameter is not empty :rtype: string This function returns a line of text from a loaded language file with simplified syntax that may be more desirable for view files than ``CI_Lang::line()``. - Example:: + Examples:: + + echo lang('language_key'); + // Outputs: Language line echo lang('language_key', 'form_item_id', array('class' => 'myClass')); // Outputs: \ No newline at end of file From b01047570608a976d4721147bbb8710ffd674551 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 19 Jul 2016 14:36:20 +0300 Subject: [PATCH 4378/5397] Fix #4695 --- system/libraries/User_agent.php | 6 ++---- user_guide_src/source/changelog.rst | 1 + 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/system/libraries/User_agent.php b/system/libraries/User_agent.php index c4e11592d98..60d1599668a 100644 --- a/system/libraries/User_agent.php +++ b/system/libraries/User_agent.php @@ -173,13 +173,11 @@ class CI_User_agent { */ public function __construct() { + $this->_load_agent_file(); + if (isset($_SERVER['HTTP_USER_AGENT'])) { $this->agent = trim($_SERVER['HTTP_USER_AGENT']); - } - - if ($this->agent !== NULL && $this->_load_agent_file()) - { $this->_compile_data(); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a9cb450c862..ed6446bb42e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -41,6 +41,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4678) - :doc:`Database Forge ` tried to use unsupported ``IF NOT EXISTS`` clause when creating tables on Oracle. - Fixed a bug (#4691) - :doc:`File Uploading Library ` method ``data()`` returns wrong 'raw_name' when the filename extension is also contained in the raw filename. - Fixed a bug (#4679) - :doc:`Input Library ` method ``ip_address()`` errors with a matching ``$config['proxy_ips']`` IPv6 address. +- Fixed a bug (#4695) - :doc:`User Agent Library ` didn't load the *config/user_agents.php* file when there's no ``User-Agent`` HTTP request header. Version 3.0.6 ============= From 11bdddcf2290dcd8f782de9727673070c78317ff Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 19 Jul 2016 14:53:50 +0300 Subject: [PATCH 4379/5397] Close #4692 --- user_guide_src/source/helpers/inflector_helper.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/helpers/inflector_helper.rst b/user_guide_src/source/helpers/inflector_helper.rst index 17dab57bf8e..df0c568c0d7 100644 --- a/user_guide_src/source/helpers/inflector_helper.rst +++ b/user_guide_src/source/helpers/inflector_helper.rst @@ -3,7 +3,7 @@ Inflector Helper ################ The Inflector Helper file contains functions that permits you to change -words to plural, singular, camel case, etc. +**English** words to plural, singular, camel case, etc. .. contents:: :local: From 81b13ba41f00da46ab23c10e9d625b8fe45b4349 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 19 Jul 2016 15:45:37 +0300 Subject: [PATCH 4380/5397] Merge pull request #4705 from tianhe1986/develop_upload_raw_name Improve #4691 --- system/libraries/Upload.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 7b94a230c96..056f6de1ef0 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -601,7 +601,7 @@ public function data($index = NULL) 'file_type' => $this->file_type, 'file_path' => $this->upload_path, 'full_path' => $this->upload_path.$this->file_name, - 'raw_name' => substr($this->file_name, 0, strlen($this->file_name) - strlen($this->file_ext)), + 'raw_name' => substr($this->file_name, 0, -strlen($this->file_ext)), 'orig_name' => $this->orig_name, 'client_name' => $this->client_name, 'file_ext' => $this->file_ext, From ac86263d83eea14f346e358cf7666d6ad21f0dfc Mon Sep 17 00:00:00 2001 From: Harrison Emmanuel Date: Thu, 21 Jul 2016 01:39:55 +0100 Subject: [PATCH 4381/5397] Fixed typos Changed umark_flash() and umark_temp() to unmark_flash() and unmark_temp() to match with their respective methods in the Session class. --- user_guide_src/source/libraries/sessions.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/libraries/sessions.rst b/user_guide_src/source/libraries/sessions.rst index 9c9761bbf59..082828c4eb6 100644 --- a/user_guide_src/source/libraries/sessions.rst +++ b/user_guide_src/source/libraries/sessions.rst @@ -906,7 +906,7 @@ Class Reference Gets a list of all ``$_SESSION`` that have been marked as "flashdata". - .. php:method:: umark_flash($key) + .. php:method:: unmark_flash($key) :param mixed $key: Key to be un-marked as flashdata, or an array of multiple keys :rtype: void @@ -971,7 +971,7 @@ Class Reference Gets a list of all ``$_SESSION`` that have been marked as "tempdata". - .. php:method:: umark_temp($key) + .. php:method:: unmark_temp($key) :param mixed $key: Key to be un-marked as tempdata, or an array of multiple keys :rtype: void From 71789ce7bb345a9d32bfa9cbf1334876647ea7e1 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 21 Jul 2016 12:45:58 +0300 Subject: [PATCH 4382/5397] Merge pull request #4716 from Ema4rl/patch-1 [ci skip] Fix Session userguide typos --- user_guide_src/source/libraries/sessions.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/libraries/sessions.rst b/user_guide_src/source/libraries/sessions.rst index 9c9761bbf59..082828c4eb6 100644 --- a/user_guide_src/source/libraries/sessions.rst +++ b/user_guide_src/source/libraries/sessions.rst @@ -906,7 +906,7 @@ Class Reference Gets a list of all ``$_SESSION`` that have been marked as "flashdata". - .. php:method:: umark_flash($key) + .. php:method:: unmark_flash($key) :param mixed $key: Key to be un-marked as flashdata, or an array of multiple keys :rtype: void @@ -971,7 +971,7 @@ Class Reference Gets a list of all ``$_SESSION`` that have been marked as "tempdata". - .. php:method:: umark_temp($key) + .. php:method:: unmark_temp($key) :param mixed $key: Key to be un-marked as tempdata, or an array of multiple keys :rtype: void From d9a4063f87d82836e7d7fe340c5c962e0332e2e5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 22 Jul 2016 15:49:08 +0300 Subject: [PATCH 4383/5397] Fix #4713 --- system/database/DB_query_builder.php | 13 +++++++++---- user_guide_src/source/changelog.rst | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 84346a6edd1..713bf18f310 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1498,8 +1498,10 @@ public function insert_batch($table, $set = NULL, $escape = NULL, $batch_size = $affected_rows = 0; for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) { - $this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size))); - $affected_rows += $this->affected_rows(); + if ($this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size)))) + { + $affected_rows += $this->affected_rows(); + } } $this->_reset_write(); @@ -1913,8 +1915,11 @@ public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 1 $affected_rows = 0; for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) { - $this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, $batch_size), $this->protect_identifiers($index))); - $affected_rows += $this->affected_rows(); + if ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, $batch_size), $this->protect_identifiers($index)))) + { + $affected_rows += $this->affected_rows(); + } + $this->qb_where = array(); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ed6446bb42e..419859f5c68 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -42,6 +42,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4691) - :doc:`File Uploading Library ` method ``data()`` returns wrong 'raw_name' when the filename extension is also contained in the raw filename. - Fixed a bug (#4679) - :doc:`Input Library ` method ``ip_address()`` errors with a matching ``$config['proxy_ips']`` IPv6 address. - Fixed a bug (#4695) - :doc:`User Agent Library ` didn't load the *config/user_agents.php* file when there's no ``User-Agent`` HTTP request header. +- Fixed a bug (#4713) - :doc:`Query Builder ` methods ``insert_batch()``, ``update_batch()`` could return wrong affected rows count. Version 3.0.6 ============= From 19ca6442222a316ca2400252a8917426046a3eda Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 22 Jul 2016 15:56:10 +0300 Subject: [PATCH 4384/5397] [ci skip] Add affected_rows() to db reference docs --- user_guide_src/source/database/db_driver_reference.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/user_guide_src/source/database/db_driver_reference.rst b/user_guide_src/source/database/db_driver_reference.rst index 1ecd389688a..aaca90840f6 100644 --- a/user_guide_src/source/database/db_driver_reference.rst +++ b/user_guide_src/source/database/db_driver_reference.rst @@ -116,6 +116,15 @@ This article is intended to be a reference for them. for use when you don't need to get a result object or to just send a query to the database and not care for the result. + .. php:method:: affected_rows() + :returns: Number of rows affected + :rtype: int + + Returns the number of rows *changed* by the last executed query. + + Useful for checking how much rows were created, updated or deleted + during the last executed query. + .. php:method:: trans_strict([$mode = TRUE]) :param bool $mode: Strict mode flag From 0c821bbeb549077eb5c0550e6de6df0adba3d4fa Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 19 Jul 2016 16:04:02 +0300 Subject: [PATCH 4385/5397] Fix #4712 --- system/libraries/Email.php | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index f8772c6566f..be89d65695a 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1919,6 +1919,7 @@ protected function _send_with_smtp() if ( ! $this->_send_command('from', $this->clean_email($this->_headers['From']))) { + $this->_smtp_end(); return FALSE; } @@ -1926,6 +1927,7 @@ protected function _send_with_smtp() { if ( ! $this->_send_command('to', $val)) { + $this->_smtp_end(); return FALSE; } } @@ -1936,6 +1938,7 @@ protected function _send_with_smtp() { if ($val !== '' && ! $this->_send_command('to', $val)) { + $this->_smtp_end(); return FALSE; } } @@ -1947,6 +1950,7 @@ protected function _send_with_smtp() { if ($val !== '' && ! $this->_send_command('to', $val)) { + $this->_smtp_end(); return FALSE; } } @@ -1954,6 +1958,7 @@ protected function _send_with_smtp() if ( ! $this->_send_command('data')) { + $this->_smtp_end(); return FALSE; } @@ -1963,29 +1968,37 @@ protected function _send_with_smtp() $this->_send_data('.'); $reply = $this->_get_smtp_data(); - $this->_set_error_message($reply); + $this->_smtp_end(); + if (strpos($reply, '250') !== 0) { $this->_set_error_message('lang:email_smtp_error', $reply); return FALSE; } - if ($this->smtp_keepalive) - { - $this->_send_command('reset'); - } - else - { - $this->_send_command('quit'); - } - return TRUE; } // -------------------------------------------------------------------- + /** + * SMTP End + * + * Shortcut to send RSET or QUIT depending on keep-alive + * + * @return void + */ + protected function _smtp_end() + { + ($this->smtp_keepalive) + ? $this->_send_command('reset') + : $this->_send_command('quit'); + } + + // -------------------------------------------------------------------- + /** * SMTP Connect * From fd128d536fa08cf7668a232aaa2fd8fce30b8ea2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 22 Jul 2016 16:21:06 +0300 Subject: [PATCH 4386/5397] [ci skip] Add changelog entry for #4712 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 419859f5c68..1a0af5a9198 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -43,6 +43,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4679) - :doc:`Input Library ` method ``ip_address()`` errors with a matching ``$config['proxy_ips']`` IPv6 address. - Fixed a bug (#4695) - :doc:`User Agent Library ` didn't load the *config/user_agents.php* file when there's no ``User-Agent`` HTTP request header. - Fixed a bug (#4713) - :doc:`Query Builder ` methods ``insert_batch()``, ``update_batch()`` could return wrong affected rows count. +- Fixed a bug (#4712) - :doc:`Email Library ` doesn't sent ``RSET`` to SMTP servers after a failure and while using keep-alive. Version 3.0.6 ============= From 1dbe93713f138ce24f971b18ac49f6cc627be1ea Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Sat, 23 Jul 2016 00:19:00 +0800 Subject: [PATCH 4387/5397] Call strtolower before comparing $_SERVER['HTTP_X_FORWARDED_PROTO']. Signed-off-by: tianhe1986 --- system/core/Common.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Common.php b/system/core/Common.php index b87ce4d626f..85e18e406c5 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -355,7 +355,7 @@ function is_https() { return TRUE; } - elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') + elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https') { return TRUE; } From 5afba5a8c444d608712174665288aa10237e8b27 Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Sat, 23 Jul 2016 01:02:01 +0800 Subject: [PATCH 4388/5397] Replace url_encoded invisible characters case-insensitively. Signed-off-by: tianhe1986 --- system/core/Common.php | 4 ++-- tests/codeigniter/core/Common_test.php | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index b87ce4d626f..e0d011db7a0 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -716,8 +716,8 @@ function remove_invisible_characters($str, $url_encoded = TRUE) // 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[] = '/%0[0-8bcef]/i'; // url encoded 00-08, 11, 12, 14, 15 + $non_displayables[] = '/%1[0-9a-f]/i'; // url encoded 16-31 } $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 diff --git a/tests/codeigniter/core/Common_test.php b/tests/codeigniter/core/Common_test.php index 81a185eafb4..ca19e5de043 100644 --- a/tests/codeigniter/core/Common_test.php +++ b/tests/codeigniter/core/Common_test.php @@ -54,4 +54,16 @@ public function test_html_escape() ); } + // ------------------------------------------------------------------------ + + public function test_remove_invisible_characters() + { + $raw_string = 'Here is a string containing invisible'.chr(0x08).' text %0e.'; + $removed_string = 'Here is a string containing invisible text %0e.'; + $this->assertEquals($removed_string, remove_invisible_characters($raw_string, FALSE)); + + $raw_string = 'Here is a string %0econtaining url_encoded invisible%1F text.'; + $removed_string = 'Here is a string containing url_encoded invisible text.'; + $this->assertEquals($removed_string, remove_invisible_characters($raw_string)); + } } \ No newline at end of file From 85f3d1ae7fb2da9e0dd364cc91d623040f8b3666 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 25 Jul 2016 10:28:21 +0300 Subject: [PATCH 4389/5397] Merge pull request #4724 from tianhe1986/develop_is_https_strtolower Compare X-Forwarded-Proto case-insensitively --- system/core/Common.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Common.php b/system/core/Common.php index b87ce4d626f..85e18e406c5 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -355,7 +355,7 @@ function is_https() { return TRUE; } - elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') + elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https') { return TRUE; } From 384a46150d3014e914c4780a550513395d4bed83 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 25 Jul 2016 10:30:04 +0300 Subject: [PATCH 4390/5397] Merge pull request #4725 from tianhe1986/develop_url_encode_case_insensitive Fix remove_invisible_characters() for URL-encoded characters in upper case --- system/core/Common.php | 4 ++-- tests/codeigniter/core/Common_test.php | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 85e18e406c5..d66649f590d 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -716,8 +716,8 @@ function remove_invisible_characters($str, $url_encoded = TRUE) // 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[] = '/%0[0-8bcef]/i'; // url encoded 00-08, 11, 12, 14, 15 + $non_displayables[] = '/%1[0-9a-f]/i'; // url encoded 16-31 } $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 diff --git a/tests/codeigniter/core/Common_test.php b/tests/codeigniter/core/Common_test.php index 81a185eafb4..ca19e5de043 100644 --- a/tests/codeigniter/core/Common_test.php +++ b/tests/codeigniter/core/Common_test.php @@ -54,4 +54,16 @@ public function test_html_escape() ); } + // ------------------------------------------------------------------------ + + public function test_remove_invisible_characters() + { + $raw_string = 'Here is a string containing invisible'.chr(0x08).' text %0e.'; + $removed_string = 'Here is a string containing invisible text %0e.'; + $this->assertEquals($removed_string, remove_invisible_characters($raw_string, FALSE)); + + $raw_string = 'Here is a string %0econtaining url_encoded invisible%1F text.'; + $removed_string = 'Here is a string containing url_encoded invisible text.'; + $this->assertEquals($removed_string, remove_invisible_characters($raw_string)); + } } \ No newline at end of file From a8a6bc7f8f65be83abeb9d00e1a94f080d8749ca Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 25 Jul 2016 10:33:35 +0300 Subject: [PATCH 4391/5397] [ci skip] Add changelog entries for PRs #4724, #4725 --- user_guide_src/source/changelog.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1a0af5a9198..a91893ba0c5 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -44,6 +44,8 @@ Bug fixes for 3.0.7 - Fixed a bug (#4695) - :doc:`User Agent Library ` didn't load the *config/user_agents.php* file when there's no ``User-Agent`` HTTP request header. - Fixed a bug (#4713) - :doc:`Query Builder ` methods ``insert_batch()``, ``update_batch()`` could return wrong affected rows count. - Fixed a bug (#4712) - :doc:`Email Library ` doesn't sent ``RSET`` to SMTP servers after a failure and while using keep-alive. +- Fixed a bug (#4724) - :doc:`Common function ` :php:func:`is_https()` compared the ``X-Forwarded-Proto`` HTTP header case-sensitively. +- Fixed a bug (#4725) - :doc:`Common function ` :php:func:`remove_invisible_characters()`` searched case-sensitively for URL-encoded characters. Version 3.0.6 ============= From c3a6bfdc30fdba41f4cded7c5ecd4b98f65af02d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 25 Jul 2016 10:41:31 +0300 Subject: [PATCH 4392/5397] [ci skip] Fix a changelog entry from last commit --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a91893ba0c5..7842136f30b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -45,7 +45,7 @@ Bug fixes for 3.0.7 - Fixed a bug (#4713) - :doc:`Query Builder ` methods ``insert_batch()``, ``update_batch()`` could return wrong affected rows count. - Fixed a bug (#4712) - :doc:`Email Library ` doesn't sent ``RSET`` to SMTP servers after a failure and while using keep-alive. - Fixed a bug (#4724) - :doc:`Common function ` :php:func:`is_https()` compared the ``X-Forwarded-Proto`` HTTP header case-sensitively. -- Fixed a bug (#4725) - :doc:`Common function ` :php:func:`remove_invisible_characters()`` searched case-sensitively for URL-encoded characters. +- Fixed a bug (#4725) - :doc:`Common function ` :php:func:`remove_invisible_characters()` searched case-sensitively for URL-encoded characters. Version 3.0.6 ============= From 0e49b7879f5c40074d77e6aefc4d924cb527abbf Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 26 Jul 2016 19:37:23 +0300 Subject: [PATCH 4393/5397] Merge pull request #4709 from nopesled/develop Filter php:// wrappers in set_realpath() helper --- system/helpers/path_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/path_helper.php b/system/helpers/path_helper.php index 838ece9e975..18e17509337 100644 --- a/system/helpers/path_helper.php +++ b/system/helpers/path_helper.php @@ -61,7 +61,7 @@ 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)#i', $path) OR filter_var($path, FILTER_VALIDATE_IP) === $path ) + if (preg_match('#^(http:\/\/|https:\/\/|www\.|ftp|php:\/\/)#i', $path) OR filter_var($path, FILTER_VALIDATE_IP) === $path ) { show_error('The path you submitted must be a local server path, not a URL'); } From 3d10ffa77854044570a1809a884776fd4bbd8b70 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 26 Jul 2016 19:42:05 +0300 Subject: [PATCH 4394/5397] Fix SQLi in ODBC drivers --- system/database/drivers/odbc/odbc_driver.php | 161 ++++++++++++------ .../pdo/subdrivers/pdo_odbc_driver.php | 81 ++------- 2 files changed, 118 insertions(+), 124 deletions(-) diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 19b7b744bf9..63df2963de9 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -50,7 +50,7 @@ * @author EllisLab Dev Team * @link https://codeigniter.com/user_guide/database/ */ -class CI_DB_odbc_driver extends CI_DB { +class CI_DB_odbc_driver extends CI_DB_driver { /** * Database driver @@ -93,6 +93,22 @@ class CI_DB_odbc_driver extends CI_DB { // -------------------------------------------------------------------- + /** + * ODBC result ID resource returned from odbc_prepare() + * + * @var resource + */ + private $odbc_result; + + /** + * Values to use with odbc_execute() for prepared statements + * + * @var array + */ + private $binds = array(); + + // -------------------------------------------------------------------- + /** * Class constructor * @@ -127,6 +143,74 @@ public function db_connect($persistent = FALSE) // -------------------------------------------------------------------- + /** + * Compile Bindings + * + * @param string $sql SQL statement + * @param array $binds An array of values to bind + * @return string + */ + public function compile_binds($sql, $binds) + { + if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) + { + return $sql; + } + elseif ( ! is_array($binds)) + { + $binds = array($binds); + $bind_count = 1; + } + else + { + // Make sure we're using numeric keys + $binds = array_values($binds); + $bind_count = count($binds); + } + + // We'll need the marker length later + $ml = strlen($this->bind_marker); + + // Make sure not to replace a chunk inside a string that happens to match the bind marker + if ($c = preg_match_all("/'[^']*'/i", $sql, $matches)) + { + $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', + str_replace($matches[0], + str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]), + $sql, $c), + $matches, PREG_OFFSET_CAPTURE); + + // Bind values' count must match the count of markers in the query + if ($bind_count !== $c) + { + return $sql; + } + } + elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count) + { + return $sql; + } + + if ($this->bind_marker !== '?') + { + do + { + $c--; + $sql = substr_replace($sql, '?', $matches[0][$c][1], $ml); + } + while ($c !== 0); + } + + if (FALSE !== ($this->odbc_result = odbc_prepare($this->conn_id, $sql))) + { + $this->binds = array_values($binds); + } + + return $sql; + } + + // -------------------------------------------------------------------- + /** * Execute the query * @@ -135,7 +219,25 @@ public function db_connect($persistent = FALSE) */ protected function _execute($sql) { - return odbc_exec($this->conn_id, $sql); + if ( ! isset($this->odbc_result)) + { + return odbc_exec($this->conn_id, $sql); + } + elseif ($this->odbc_result === FALSE) + { + return FALSE; + } + + if (TRUE === ($success = odbc_execute($this->odbc_result, $this->binds))) + { + // For queries that return result sets, return the result_id resource on success + $this->is_write_type($sql) OR $success = $this->odbc_result; + } + + $this->odbc_result = NULL; + $this->binds = array(); + + return $success; } // -------------------------------------------------------------------- @@ -214,7 +316,7 @@ public function is_write_type($sql) */ protected function _escape_str($str) { - return remove_invisible_characters($str); + $this->db->display_error('db_unsupported_feature'); } // -------------------------------------------------------------------- @@ -311,58 +413,6 @@ public function error() // -------------------------------------------------------------------- - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - /** * Close DB Connection * @@ -372,5 +422,4 @@ protected function _close() { odbc_close($this->conn_id); } - } diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php index 333448838e7..82554ec8029 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php @@ -160,6 +160,19 @@ public function __construct($params) // -------------------------------------------------------------------- + /** + * Platform-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + $this->db->display_error('db_unsupported_feature'); + } + + // -------------------------------------------------------------------- + /** * Determines if a query is a "write" type. * @@ -213,72 +226,4 @@ protected function _list_columns($table = '') { return 'SELECT column_name FROM information_schema.columns WHERE table_name = '.$this->escape($table); } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string the table name - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$this->qb_limit.' ', $sql); - } - } From 287b795b0e423d356427405d04d0c4d3a6c3ab13 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 26 Jul 2016 19:42:41 +0300 Subject: [PATCH 4395/5397] [ci skip] Whitespace --- system/helpers/path_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/path_helper.php b/system/helpers/path_helper.php index 18e17509337..6c846a2116e 100644 --- a/system/helpers/path_helper.php +++ b/system/helpers/path_helper.php @@ -61,7 +61,7 @@ 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|php:\/\/)#i', $path) OR filter_var($path, FILTER_VALIDATE_IP) === $path ) + if (preg_match('#^(http:\/\/|https:\/\/|www\.|ftp|php:\/\/)#i', $path) OR filter_var($path, FILTER_VALIDATE_IP) === $path) { show_error('The path you submitted must be a local server path, not a URL'); } From edd347fa069d39b9684fd61a3d6befa6ef59dab3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 26 Jul 2016 19:45:17 +0300 Subject: [PATCH 4396/5397] [ci skip] Add changelog entries for security patches --- user_guide_src/source/changelog.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 7842136f30b..156b6be564e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,11 @@ Version 3.0.7 Release Date: Not Released +- **Security** + + - Fixed an SQL injection in the 'odbc' database driver. + - Updated :php:func:`set_realpath()` :doc:`Path Helpr ` function to filter-out ``php://`` wrapper inputs. + - General Changes - Updated :doc:`Image Manipulation Library ` to validate *width* and *height* configuration values. From 606ad654dcbc9f0fc30f00ce6574918790ee0d1e Mon Sep 17 00:00:00 2001 From: Claudio Galdiolo Date: Thu, 7 Jul 2016 15:32:12 -0400 Subject: [PATCH 4397/5397] Prepare for 3.1.0 release --- readme.rst | 4 +-- system/core/CodeIgniter.php | 2 +- user_guide_src/source/changelog.rst | 6 ++--- user_guide_src/source/conf.py | 4 +-- .../source/installation/downloads.rst | 2 +- .../source/installation/upgrade_307.rst | 14 ---------- .../source/installation/upgrade_310.rst | 27 +++++++++++++++++++ .../source/installation/upgrading.rst | 2 +- 8 files changed, 37 insertions(+), 24 deletions(-) delete mode 100644 user_guide_src/source/installation/upgrade_307.rst create mode 100644 user_guide_src/source/installation/upgrade_310.rst diff --git a/readme.rst b/readme.rst index 526950e679a..7a376322d4d 100644 --- a/readme.rst +++ b/readme.rst @@ -29,7 +29,7 @@ guide change log ` didn't escape image source paths passed to ImageMagick as shell arguments. diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 26f854d85af..9e78d242d48 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.0.7-dev' +version = '3.1.0' # The full version, including alpha/beta/rc tags. -release = '3.0.7-dev' +release = '3.1.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 22c63b873d0..80d2412cd8a 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,7 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.0.7-dev (Current version) `_ +- `CodeIgniter v3.1.0 (Current version) `_ - `CodeIgniter v3.0.6 `_ - `CodeIgniter v3.0.5 `_ - `CodeIgniter v3.0.4 `_ diff --git a/user_guide_src/source/installation/upgrade_307.rst b/user_guide_src/source/installation/upgrade_307.rst deleted file mode 100644 index ee957aabf96..00000000000 --- a/user_guide_src/source/installation/upgrade_307.rst +++ /dev/null @@ -1,14 +0,0 @@ -############################# -Upgrading from 3.0.6 to 3.0.7 -############################# - -Before performing an update you should take your site offline by -replacing the index.php file with a static one. - -Step 1: Update your CodeIgniter files -===================================== - -Replace all files and directories in your *system/* directory. - -.. note:: If you have any custom developed files in these directories, - please make copies of them first. diff --git a/user_guide_src/source/installation/upgrade_310.rst b/user_guide_src/source/installation/upgrade_310.rst new file mode 100644 index 00000000000..1dc71a58c54 --- /dev/null +++ b/user_guide_src/source/installation/upgrade_310.rst @@ -0,0 +1,27 @@ +############################# +Upgrading from 3.0.6 to 3.1.0 +############################# + +Before performing an update you should take your site offline by +replacing the index.php file with a static one. + +Step 1: Update your CodeIgniter files +===================================== + +Replace all files and directories in your *system/* directory. + +.. note:: If you have any custom developed files in these directories, + please make copies of them first. + +Step 2: If you're using the 'odbc' database driver, check for usage of Query Builder +==================================================================================== + +:doc:`Query Builder <../database/query_builder>` functionality and ``escape()`` can +no longer be used with the 'odbc' database driver. + +This is because, due to its nature, the `ODBC extension for PHP `_ +does not provide a function that allows to safely escape user-supplied strings for usage +inside an SQL query (which our :doc:`Query Builder ` relies on). + +Thus, user inputs MUST be bound, as shown in :doc:`Running Queries <../database/queries>`, +under the "Query Bindings" section. \ No newline at end of file diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index 5beca65865e..f0cf8c9030e 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -8,7 +8,7 @@ upgrading from. .. toctree:: :titlesonly: - Upgrading from 3.0.6 to 3.0.7 + Upgrading from 3.0.6 to 3.1.0 Upgrading from 3.0.5 to 3.0.6 Upgrading from 3.0.4 to 3.0.5 Upgrading from 3.0.3 to 3.0.4 From 850a3c91a191256967d6fc81dda26a7c8ff258c0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 26 Jul 2016 20:12:06 +0300 Subject: [PATCH 4398/5397] [ci skip] Minor documentation fixes --- user_guide_src/source/database/db_driver_reference.rst | 1 + user_guide_src/source/installation/upgrade_310.rst | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/database/db_driver_reference.rst b/user_guide_src/source/database/db_driver_reference.rst index aaca90840f6..1f036cd775f 100644 --- a/user_guide_src/source/database/db_driver_reference.rst +++ b/user_guide_src/source/database/db_driver_reference.rst @@ -117,6 +117,7 @@ This article is intended to be a reference for them. just send a query to the database and not care for the result. .. php:method:: affected_rows() + :returns: Number of rows affected :rtype: int diff --git a/user_guide_src/source/installation/upgrade_310.rst b/user_guide_src/source/installation/upgrade_310.rst index 1dc71a58c54..812162308de 100644 --- a/user_guide_src/source/installation/upgrade_310.rst +++ b/user_guide_src/source/installation/upgrade_310.rst @@ -21,7 +21,7 @@ no longer be used with the 'odbc' database driver. This is because, due to its nature, the `ODBC extension for PHP `_ does not provide a function that allows to safely escape user-supplied strings for usage -inside an SQL query (which our :doc:`Query Builder ` relies on). +inside an SQL query (which our :doc:`Query Builder <../database/query_builder>` relies on). Thus, user inputs MUST be bound, as shown in :doc:`Running Queries <../database/queries>`, under the "Query Bindings" section. \ No newline at end of file From 54f6a09e22a0d564317fc84ea32a9c7072bebe0f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 26 Jul 2016 20:21:39 +0300 Subject: [PATCH 4399/5397] [ci skip] Officially drop PHP 5.2.x --- .travis.yml | 3 --- readme.rst | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index e531f8d90c8..b32390dfbdc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: php php: - - 5.2 - 5.3 - 5.4 - 5.5 @@ -21,7 +20,6 @@ env: sudo: false before_script: - - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.2' ]; then pear channel-discover pear.bovigo.org && pear install bovigo/vfsStream-beta; else composer install --dev --no-progress; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'mysqli' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi" @@ -30,7 +28,6 @@ script: phpunit -d zend.enable_gc=0 -d date.timezone=UTC --coverage-text --confi matrix: allow_failures: - - php: 5.2 - php: 5.3 - php: hhvm exclude: diff --git a/readme.rst b/readme.rst index 7a376322d4d..f5d73702892 100644 --- a/readme.rst +++ b/readme.rst @@ -31,7 +31,7 @@ Server Requirements PHP version 5.6 or newer is recommended. -It should work on 5.2.4 as well, but we strongly advise you NOT to run +It should work on 5.3.7 as well, but we strongly advise you NOT to run such old versions of PHP, because of potential security and performance issues, as well as missing features. From bcfe461f69c29805229c60d5643604edbae997aa Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 26 Jul 2016 20:34:30 +0300 Subject: [PATCH 4400/5397] [ci skip] More on dropping 5.2.x --- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/contributing/index.rst | 8 ++++---- user_guide_src/source/general/requirements.rst | 4 ++-- user_guide_src/source/general/styleguide.rst | 4 ++-- user_guide_src/source/installation/upgrade_310.rst | 13 ++++++++++++- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 76aeecbcb81..058eb275f81 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -11,6 +11,7 @@ Release Date: July 26, 2016 - Fixed an SQL injection in the 'odbc' database driver. - Updated :php:func:`set_realpath()` :doc:`Path Helpr ` function to filter-out ``php://`` wrapper inputs. + - Officially dropped any kind of support for PHP 5.2.x and anything under 5.3.7. - General Changes diff --git a/user_guide_src/source/contributing/index.rst b/user_guide_src/source/contributing/index.rst index 739d436a0fb..be776ec1fb6 100644 --- a/user_guide_src/source/contributing/index.rst +++ b/user_guide_src/source/contributing/index.rst @@ -103,10 +103,10 @@ must also be updated for every change. Also PHPDoc blocks must be maintained. Compatibility ============= -CodeIgniter recommends PHP 5.4 or newer to be used, but it should be -compatible with PHP 5.2.4 so all code supplied must stick to this -requirement. If PHP 5.3 (and above) functions or features are used then -there must be a fallback for PHP 5.2.4. +CodeIgniter recommends PHP 5.6 or newer to be used, but it should be +compatible with PHP 5.3.7 so all code supplied must stick to this +requirement. If PHP 5.4 (and above) functions or features are used then +there must be a fallback for PHP 5.3.7. Branching ========= diff --git a/user_guide_src/source/general/requirements.rst b/user_guide_src/source/general/requirements.rst index f90cdd30d84..f2729f3d50d 100644 --- a/user_guide_src/source/general/requirements.rst +++ b/user_guide_src/source/general/requirements.rst @@ -2,9 +2,9 @@ Server Requirements ################### -`PHP `_ version 5.4 or newer is recommended. +`PHP `_ version 5.6 or newer is recommended. -It should work on 5.2.4 as well, but we strongly advise you NOT to run +It should work on 5.3.7 as well, but we strongly advise you NOT to run such old versions of PHP, because of potential security and performance issues, as well as missing features. diff --git a/user_guide_src/source/general/styleguide.rst b/user_guide_src/source/general/styleguide.rst index 7704a59c5bd..9b4a84e1422 100644 --- a/user_guide_src/source/general/styleguide.rst +++ b/user_guide_src/source/general/styleguide.rst @@ -345,8 +345,8 @@ inability for CodeIgniter to send proper headers. Compatibility ============= -CodeIgniter recommends PHP 5.4 or newer to be used, but it should be -compatible with PHP 5.2.4. Your code must either be compatible with this +CodeIgniter recommends PHP 5.6 or newer to be used, but it should be +compatible with PHP 5.3.7. Your code must either be compatible with this requirement, provide a suitable fallback, or be an optional feature that dies quietly without affecting a user's application. diff --git a/user_guide_src/source/installation/upgrade_310.rst b/user_guide_src/source/installation/upgrade_310.rst index 812162308de..9e0108691ec 100644 --- a/user_guide_src/source/installation/upgrade_310.rst +++ b/user_guide_src/source/installation/upgrade_310.rst @@ -13,7 +13,18 @@ Replace all files and directories in your *system/* directory. .. note:: If you have any custom developed files in these directories, please make copies of them first. -Step 2: If you're using the 'odbc' database driver, check for usage of Query Builder +Step 2: Check your PHP version +============================== + +We recommend always running versions that are `currently supported +`_, which right now is at least PHP 5.6. + +PHP 5.2.x versions are now officially not supported by CodeIgniter, and while 5.3.7+ +may be at least runnable, we strongly discourage you from using any PHP versions below +the ones listed on the `PHP.net Supported Versions `_ +page. + +Step 3: If you're using the 'odbc' database driver, check for usage of Query Builder ==================================================================================== :doc:`Query Builder <../database/query_builder>` functionality and ``escape()`` can From 0b9540209499fbd0515e13fdc66e85dea4b6baad Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 26 Jul 2016 20:52:30 +0300 Subject: [PATCH 4401/5397] [ci skip] Mark the start of 3.1.1 development --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/changelog.rst | 13 +++++++++++++ user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/installation/downloads.rst | 3 ++- user_guide_src/source/installation/upgrade_311.rst | 14 ++++++++++++++ user_guide_src/source/installation/upgrading.rst | 1 + 6 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 user_guide_src/source/installation/upgrade_311.rst diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 2525edae20e..70f33d5eda4 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - define('CI_VERSION', '3.1.0'); + define('CI_VERSION', '3.1.1-dev'); /* * ------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 058eb275f81..c09c1b592bd 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -2,6 +2,19 @@ Change Log ########## +Version 3.1.1 +============= + +Release Date: Not Released + + + +Bug fixes for 3.1.1 +------------------- + + + + Version 3.1.0 ============= diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 9e78d242d48..0c4901d8fb0 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.1.0' +version = '3.1.1-dev' # The full version, including alpha/beta/rc tags. -release = '3.1.0' +release = '3.1.1-dev' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 80d2412cd8a..7380dcb2868 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,8 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.1.0 (Current version) `_ +- `CodeIgniter v3.1.1 (Current version) `_ +- `CodeIgniter v3.1.0 `_ - `CodeIgniter v3.0.6 `_ - `CodeIgniter v3.0.5 `_ - `CodeIgniter v3.0.4 `_ diff --git a/user_guide_src/source/installation/upgrade_311.rst b/user_guide_src/source/installation/upgrade_311.rst new file mode 100644 index 00000000000..a36e723230c --- /dev/null +++ b/user_guide_src/source/installation/upgrade_311.rst @@ -0,0 +1,14 @@ +############################# +Upgrading from 3.1.0 to 3.1.1 +############################# + +Before performing an update you should take your site offline by +replacing the index.php file with a static one. + +Step 1: Update your CodeIgniter files +===================================== + +Replace all files and directories in your *system/* directory. + +.. note:: If you have any custom developed files in these directories, + please make copies of them first. diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index f0cf8c9030e..727d054d1b1 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -8,6 +8,7 @@ upgrading from. .. toctree:: :titlesonly: + Upgrading from 3.1.0 to 3.1.1 Upgrading from 3.0.6 to 3.1.0 Upgrading from 3.0.5 to 3.0.6 Upgrading from 3.0.4 to 3.0.5 From d293fdd18125f393b196360f963c39cfd73e8521 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 26 Jul 2016 21:04:01 +0300 Subject: [PATCH 4402/5397] Add 3.1-stable to tested branches list --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index b32390dfbdc..5815c957750 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,4 +46,5 @@ branches: only: - develop - 3.0-stable + - 3.1-stable - /^feature\/.+$/ From 005ca972ba5056111354d3af6203cc7af047fb39 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 26 Jul 2016 21:17:41 +0300 Subject: [PATCH 4403/5397] Fix Travis builds --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 5815c957750..54647689b53 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,7 @@ env: sudo: false before_script: + - sh -c "composer install --dev --no-progress" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'mysqli' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi" From 12117be8293eff1a56b575ccc2e5d11c68c8cfcf Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 26 Jul 2016 21:19:58 +0300 Subject: [PATCH 4404/5397] Fix Travis builds --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4680d2ac693..22c3b6e1860 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,10 +19,7 @@ env: sudo: false before_script: -<<<<<<< HEAD - sh -c "composer install --dev --no-progress" -======= ->>>>>>> 3.1-stable - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'mysqli' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi" From 1748567f5442409d6a8c1e795f56599caff8296e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 28 Jul 2016 15:16:38 +0300 Subject: [PATCH 4405/5397] [ci skip] Fix #3919, #4732 --- .../Session/drivers/Session_memcached_driver.php | 8 ++------ user_guide_src/source/changelog.rst | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index 88eb4b3a6f8..99b4d1baab7 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -209,10 +209,7 @@ public function write($session_id, $session_data) $this->_memcached->replace($this->_lock_key, time(), 300); if ($this->_fingerprint !== ($fingerprint = md5($session_data))) { - if ( - $this->_memcached->replace($key, $session_data, $this->_config['expiration']) - OR ($this->_memcached->getResultCode() === Memcached::RES_NOTFOUND && $this->_memcached->set($key, $session_data, $this->_config['expiration'])) - ) + if ($this->_memcached->set($key, $session_data, $this->_config['expiration'])) { $this->_fingerprint = $fingerprint; return $this->_success; @@ -220,8 +217,7 @@ public function write($session_id, $session_data) return $this->_fail(); } - - if ( + elseif ( $this->_memcached->touch($key, $this->_config['expiration']) OR ($this->_memcached->getResultCode() === Memcached::RES_NOTFOUND && $this->_memcached->set($key, $session_data, $this->_config['expiration'])) ) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index c09c1b592bd..400b36e09ce 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -12,7 +12,7 @@ Release Date: Not Released Bug fixes for 3.1.1 ------------------- - +- Fixed a bug (#4732) - :doc:`Session Library ` triggered errors while writing data for a newly-created sessions with the 'memcached' driver. Version 3.1.0 From a838279625becfba98ccb7635d35c67297129c42 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 28 Jul 2016 16:40:12 +0300 Subject: [PATCH 4406/5397] Remove dead code written for PHP 5.2 --- system/core/CodeIgniter.php | 6 +- system/core/Security.php | 7 +- system/core/compat/password.php | 2 +- system/core/compat/standard.php | 207 ------------------ .../database/drivers/mysqli/mysqli_driver.php | 7 +- system/database/drivers/oci8/oci8_driver.php | 2 +- .../pdo/subdrivers/pdo_mysql_driver.php | 16 +- system/helpers/date_helper.php | 79 +------ system/libraries/Email.php | 9 +- system/libraries/Encryption.php | 6 +- system/libraries/Form_validation.php | 13 +- system/libraries/Migration.php | 5 +- .../Session/drivers/Session_files_driver.php | 15 +- system/libraries/Upload.php | 41 ++-- tests/Bootstrap.php | 6 - tests/codeigniter/core/Log_test.php | 10 - .../codeigniter/core/compat/password_test.php | 5 - .../codeigniter/core/compat/standard_test.php | 202 ----------------- tests/codeigniter/libraries/Upload_test.php | 12 +- .../general/compatibility_functions.rst | 32 --- user_guide_src/source/general/hooks.rst | 4 +- user_guide_src/source/general/routing.rst | 4 +- user_guide_src/source/general/security.rst | 7 +- .../source/libraries/encryption.rst | 2 +- .../source/libraries/form_validation.rst | 5 +- 25 files changed, 55 insertions(+), 649 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 70f33d5eda4..22072e983f1 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -416,11 +416,7 @@ function &get_instance() $params = array($method, array_slice($URI->rsegments, 2)); $method = '_remap'; } - // WARNING: It appears that there are issues with is_callable() even in PHP 5.2! - // Furthermore, there are bug reports and feature/change requests related to it - // that make it unreliable to use in this context. Please, DO NOT change this - // work-around until a better alternative is available. - elseif ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($class)), TRUE)) + elseif ( ! is_callable(array($class, $method))) { $e404 = TRUE; } diff --git a/system/core/Security.php b/system/core/Security.php index d5305d1ca0b..a2907009550 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -678,12 +678,7 @@ public function entity_decode($str, $charset = NULL) { if ( ! isset($_entities)) { - $_entities = array_map( - 'strtolower', - is_php('5.3.4') - ? get_html_translation_table(HTML_ENTITIES, $flag, $charset) - : get_html_translation_table(HTML_ENTITIES, $flag) - ); + $_entities = array_map('strtolower', get_html_translation_table(HTML_ENTITIES, $flag, $charset)); // If we're not on PHP 5.4+, add the possibly dangerous HTML 5 // entities to the array manually diff --git a/system/core/compat/password.php b/system/core/compat/password.php index 76dd2cf0a1d..1b5219e7b1d 100644 --- a/system/core/compat/password.php +++ b/system/core/compat/password.php @@ -50,7 +50,7 @@ // ------------------------------------------------------------------------ -if (is_php('5.5') OR ! is_php('5.3.7') OR ! defined('CRYPT_BLOWFISH') OR CRYPT_BLOWFISH !== 1 OR defined('HHVM_VERSION')) +if (is_php('5.5') OR ! defined('CRYPT_BLOWFISH') OR CRYPT_BLOWFISH !== 1 OR defined('HHVM_VERSION')) { return; } diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php index c54cab95146..c839c9bc939 100644 --- a/system/core/compat/standard.php +++ b/system/core/compat/standard.php @@ -180,210 +180,3 @@ function hex2bin($data) return pack('H*', $data); } } - -// ------------------------------------------------------------------------ - -if (is_php('5.3')) -{ - return; -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('array_replace')) -{ - /** - * array_replace() - * - * @link http://php.net/array_replace - * @return array - */ - function array_replace() - { - $arrays = func_get_args(); - - if (($c = count($arrays)) === 0) - { - trigger_error('array_replace() expects at least 1 parameter, 0 given', E_USER_WARNING); - return NULL; - } - elseif ($c === 1) - { - if ( ! is_array($arrays[0])) - { - trigger_error('array_replace(): Argument #1 is not an array', E_USER_WARNING); - return NULL; - } - - return $arrays[0]; - } - - $array = array_shift($arrays); - $c--; - - for ($i = 0; $i < $c; $i++) - { - if ( ! is_array($arrays[$i])) - { - trigger_error('array_replace(): Argument #'.($i + 2).' is not an array', E_USER_WARNING); - return NULL; - } - elseif (empty($arrays[$i])) - { - continue; - } - - foreach (array_keys($arrays[$i]) as $key) - { - $array[$key] = $arrays[$i][$key]; - } - } - - return $array; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('array_replace_recursive')) -{ - /** - * array_replace_recursive() - * - * @link http://php.net/array_replace_recursive - * @return array - */ - function array_replace_recursive() - { - $arrays = func_get_args(); - - if (($c = count($arrays)) === 0) - { - trigger_error('array_replace_recursive() expects at least 1 parameter, 0 given', E_USER_WARNING); - return NULL; - } - elseif ($c === 1) - { - if ( ! is_array($arrays[0])) - { - trigger_error('array_replace_recursive(): Argument #1 is not an array', E_USER_WARNING); - return NULL; - } - - return $arrays[0]; - } - - $array = array_shift($arrays); - $c--; - - for ($i = 0; $i < $c; $i++) - { - if ( ! is_array($arrays[$i])) - { - trigger_error('array_replace_recursive(): Argument #'.($i + 2).' is not an array', E_USER_WARNING); - return NULL; - } - elseif (empty($arrays[$i])) - { - continue; - } - - foreach (array_keys($arrays[$i]) as $key) - { - $array[$key] = (is_array($arrays[$i][$key]) && isset($array[$key]) && is_array($array[$key])) - ? array_replace_recursive($array[$key], $arrays[$i][$key]) - : $arrays[$i][$key]; - } - } - - return $array; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('quoted_printable_encode')) -{ - /** - * quoted_printable_encode() - * - * @link http://php.net/quoted_printable_encode - * @param string $str - * @return string - */ - function quoted_printable_encode($str) - { - if (strlen($str) === 0) - { - return ''; - } - elseif (in_array($type = gettype($str), array('array', 'object'), TRUE)) - { - if ($type === 'object' && method_exists($str, '__toString')) - { - $str = (string) $str; - } - else - { - trigger_error('quoted_printable_encode() expects parameter 1 to be string, '.$type.' given', E_USER_WARNING); - return NULL; - } - } - - if (function_exists('imap_8bit')) - { - return imap_8bit($str); - } - - $i = $lp = 0; - $output = ''; - $hex = '0123456789ABCDEF'; - $length = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')) - ? mb_strlen($str, '8bit') - : strlen($str); - - while ($length--) - { - if ((($c = $str[$i++]) === "\015") && isset($str[$i]) && ($str[$i] === "\012") && $length > 0) - { - $output .= "\015".$str[$i++]; - $length--; - $lp = 0; - continue; - } - - if ( - ctype_cntrl($c) - OR (ord($c) === 0x7f) - OR (ord($c) & 0x80) - OR ($c === '=') - OR ($c === ' ' && isset($str[$i]) && $str[$i] === "\015") - ) - { - if ( - (($lp += 3) > 75 && ord($c) <= 0x7f) - OR (ord($c) > 0x7f && ord($c) <= 0xdf && ($lp + 3) > 75) - OR (ord($c) > 0xdf && ord($c) <= 0xef && ($lp + 6) > 75) - OR (ord($c) > 0xef && ord($c) <= 0xf4 && ($lp + 9) > 75) - ) - { - $output .= "=\015\012"; - $lp = 3; - } - - $output .= '='.$hex[ord($c) >> 4].$hex[ord($c) & 0xf]; - continue; - } - - if ((++$lp) > 75) - { - $output .= "=\015\012"; - $lp = 1; - } - - $output .= $c; - } - - return $output; - } -} diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index f52163c2d1e..f4597c74636 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -125,8 +125,7 @@ public function db_connect($persistent = FALSE) } else { - // Persistent connection support was added in PHP 5.3.0 - $hostname = ($persistent === TRUE && is_php('5.3')) + $hostname = ($persistent === TRUE) ? 'p:'.$this->hostname : $this->hostname; $port = empty($this->port) ? NULL : $this->port; $socket = NULL; @@ -502,8 +501,8 @@ public function error() if ( ! empty($this->_mysqli->connect_errno)) { return array( - 'code' => $this->_mysqli->connect_errno, - 'message' => is_php('5.2.9') ? $this->_mysqli->connect_error : mysqli_connect_error() + 'code' => $this->_mysqli->connect_errno, + 'message' => $this->_mysqli->connect_error ); } diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index df7e0848a4d..56fdf32cf43 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -386,7 +386,7 @@ protected function _bind_params($params) */ protected function _trans_begin() { - $this->commit_mode = is_php('5.3.2') ? OCI_NO_AUTO_COMMIT : OCI_DEFAULT; + $this->commit_mode = OCI_NO_AUTO_COMMIT; return TRUE; } diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php index 38a5a8affb5..3631cdf7a61 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -106,7 +106,7 @@ public function __construct($params) empty($this->database) OR $this->dsn .= ';dbname='.$this->database; empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; } - elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE && is_php('5.3.6')) + elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE) { $this->dsn .= ';charset='.$this->char_set; } @@ -122,17 +122,6 @@ public function __construct($params) */ public function db_connect($persistent = FALSE) { - /* Prior to PHP 5.3.6, even if the charset was supplied in the DSN - * on connect - it was ignored. This is a work-around for the issue. - * - * Reference: http://www.php.net/manual/en/ref.pdo-mysql.connection.php - */ - if ( ! is_php('5.3.6') && ! empty($this->char_set)) - { - $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES '.$this->char_set - .(empty($this->dbcollat) ? '' : ' COLLATE '.$this->dbcollat); - } - if (isset($this->stricton)) { if ($this->stricton) @@ -169,8 +158,7 @@ public function db_connect($persistent = FALSE) $this->options[PDO::MYSQL_ATTR_COMPRESS] = TRUE; } - // SSL support was added to PDO_MYSQL in PHP 5.3.7 - if (is_array($this->encrypt) && is_php('5.3.7')) + if (is_array($this->encrypt)) { $ssl = array(); empty($this->encrypt['ssl_key']) OR $ssl[PDO::MYSQL_ATTR_SSL_KEY] = $this->encrypt['ssl_key']; diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index c43209f0570..5f1fcf07ea9 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -707,87 +707,32 @@ function date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y $range = array(); - /* NOTE: Even though the DateTime object has many useful features, it appears that - * it doesn't always handle properly timezones, when timestamps are passed - * directly to its constructor. Neither of the following gave proper results: - * - * new DateTime('') - * new DateTime('', '') - * - * --- available in PHP 5.3: - * - * DateTime::createFromFormat('', '') - * DateTime::createFromFormat('', '', 'setTimestamp($unix_start); - if (is_php('5.3')) - { - $from->setTimestamp($unix_start); - if ($is_unix) - { - $arg = new DateTime(); - $arg->setTimestamp($mixed); - } - else - { - $arg = (int) $mixed; - } - - $period = new DatePeriod($from, new DateInterval('P1D'), $arg); - foreach ($period as $date) - { - $range[] = $date->format($format); - } - - /* If a period end date was passed to the DatePeriod constructor, it might not - * be in our results. Not sure if this is a bug or it's just possible because - * the end date might actually be less than 24 hours away from the previously - * generated DateTime object, but either way - we have to append it manually. - */ - if ( ! is_int($arg) && $range[count($range) - 1] !== $arg->format($format)) - { - $range[] = $arg->format($format); - } - - return $range; - } - - $from->setDate(date('Y', $unix_start), date('n', $unix_start), date('j', $unix_start)); - $from->setTime(date('G', $unix_start), date('i', $unix_start), date('s', $unix_start)); if ($is_unix) { $arg = new DateTime(); - $arg->setDate(date('Y', $mixed), date('n', $mixed), date('j', $mixed)); - $arg->setTime(date('G', $mixed), date('i', $mixed), date('s', $mixed)); + $arg->setTimestamp($mixed); } else { $arg = (int) $mixed; } - $range[] = $from->format($format); - if (is_int($arg)) // Day intervals + $period = new DatePeriod($from, new DateInterval('P1D'), $arg); + foreach ($period as $date) { - do - { - $from->modify('+1 day'); - $range[] = $from->format($format); - } - while (--$arg > 0); + $range[] = $date->format($format); } - else // end date UNIX timestamp - { - for ($from->modify('+1 day'), $end_check = $arg->format('Ymd'); $from->format('Ymd') < $end_check; $from->modify('+1 day')) - { - $range[] = $from->format($format); - } - // Our loop only appended dates prior to our end date + /* If a period end date was passed to the DatePeriod constructor, it might not + * be in our results. Not sure if this is a bug or it's just possible because + * the end date might actually be less than 24 hours away from the previously + * generated DateTime object, but either way - we have to append it manually. + */ + if ( ! is_int($arg) && $range[count($range) - 1] !== $arg->format($format)) + { $range[] = $arg->format($format); } diff --git a/system/libraries/Email.php b/system/libraries/Email.php index be89d65695a..5049578ed78 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1514,14 +1514,7 @@ protected function _prep_quoted_printable($str) // which only works with "\n". if ($this->crlf === "\r\n") { - if (is_php('5.3')) - { - return quoted_printable_encode($str); - } - elseif (function_exists('imap_8bit')) - { - return imap_8bit($str); - } + return quoted_printable_encode($str); } // Reduce multiple spaces & remove nulls diff --git a/system/libraries/Encryption.php b/system/libraries/Encryption.php index a10a5c20ccc..06284c2ed49 100644 --- a/system/libraries/Encryption.php +++ b/system/libraries/Encryption.php @@ -152,10 +152,8 @@ class CI_Encryption { public function __construct(array $params = array()) { $this->_drivers = array( - 'mcrypt' => defined('MCRYPT_DEV_URANDOM'), - // While OpenSSL is available for PHP 5.3.0, an IV parameter - // for the encrypt/decrypt functions is only available since 5.3.3 - 'openssl' => (is_php('5.3.3') && extension_loaded('openssl')) + 'mcrypt' => defined('MCRYPT_DEV_URANDOM'), + 'openssl' => extension_loaded('openssl') ); if ( ! $this->_drivers['mcrypt'] && ! $this->_drivers['openssl']) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 04445f5b799..25dc0d41ecf 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1216,18 +1216,7 @@ public function valid_url($str) $str = 'ipv6.host'.substr($str, strlen($matches[1]) + 2); } - $str = 'http://'.$str; - - // There's a bug affecting PHP 5.2.13, 5.3.2 that considers the - // underscore to be a valid hostname character instead of a dash. - // Reference: https://bugs.php.net/bug.php?id=51192 - if (version_compare(PHP_VERSION, '5.2.13', '==') OR version_compare(PHP_VERSION, '5.3.2', '==')) - { - sscanf($str, 'http://%[^/]', $host); - $str = substr_replace($str, strtr($host, array('_' => '-', '-' => '_')), 7, strlen($host)); - } - - return (filter_var($str, FILTER_VALIDATE_URL) !== FALSE); + return (filter_var('http://'.$str, FILTER_VALIDATE_URL) !== FALSE); } // -------------------------------------------------------------------- diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index 316c94ae3a2..3e2107e83c0 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -288,10 +288,7 @@ public function version($target_version) $this->_error_string = sprintf($this->lang->line('migration_class_doesnt_exist'), $class); return FALSE; } - // method_exists() returns true for non-public methods, - // while is_callable() can't be used without instantiating. - // Only get_class_methods() satisfies both conditions. - elseif ( ! in_array($method, array_map('strtolower', get_class_methods($class)))) + elseif ( ! is_callable(array($class, $method))) { $this->_error_string = sprintf($this->lang->line('migration_missing_'.$method.'_method'), $class); return FALSE; diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index 57c3777a2a5..bf4df8b208f 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -149,18 +149,9 @@ public function read($session_id) // which re-reads session data if ($this->_file_handle === NULL) { - // Just using fopen() with 'c+b' mode would be perfect, but it is only - // available since PHP 5.2.6 and we have to set permissions for new files, - // so we'd have to hack around this ... - if (($this->_file_new = ! file_exists($this->_file_path.$session_id)) === TRUE) - { - if (($this->_file_handle = fopen($this->_file_path.$session_id, 'w+b')) === FALSE) - { - log_message('error', "Session: File '".$this->_file_path.$session_id."' doesn't exist and cannot be created."); - return $this->_failure; - } - } - elseif (($this->_file_handle = fopen($this->_file_path.$session_id, 'r+b')) === FALSE) + $this->_file_new = ! file_exists($this->_file_path.$session_id); + + if (($this->_file_handle = fopen($this->_file_path.$session_id, 'c+b')) === FALSE) { log_message('error', "Session: Unable to open file '".$this->_file_path.$session_id."'."); return $this->_failure; diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 056f6de1ef0..a8cf7526407 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1086,13 +1086,7 @@ public function do_xss_clean() if (memory_get_usage() && ($memory_limit = ini_get('memory_limit'))) { $memory_limit *= 1024 * 1024; - - // There was a bug/behavioural change in PHP 5.2, where numbers over one million get output - // into scientific notation. number_format() ensures this number is an integer - // http://bugs.php.net/bug.php?id=43053 - - $memory_limit = number_format(ceil(filesize($file) + $memory_limit), 0, '.', ''); - + $memory_limit = (int) ceil(filesize($file) + $memory_limit); ini_set('memory_limit', $memory_limit); // When an integer is used, the value is measured in bytes. - PHP.net } @@ -1207,28 +1201,21 @@ protected function _file_mime_type($file) // We'll need this to validate the MIME info string (e.g. text/plain; charset=us-ascii) $regexp = '/^([a-z\-]+\/[a-z0-9\-\.\+]+)(;\s.+)?$/'; - /* Fileinfo extension - most reliable method - * - * Unfortunately, prior to PHP 5.3 - it's only available as a PECL extension and the - * more convenient FILEINFO_MIME_TYPE flag doesn't exist. - */ - if (function_exists('finfo_file')) + // Fileinfo extension - most reliable method + $finfo = @finfo_open(FILEINFO_MIME); + if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system { - $finfo = @finfo_open(FILEINFO_MIME); - if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system + $mime = @finfo_file($finfo, $file['tmp_name']); + finfo_close($finfo); + + /* According to the comments section of the PHP manual page, + * it is possible that this function returns an empty string + * for some files (e.g. if they don't exist in the magic MIME database) + */ + if (is_string($mime) && preg_match($regexp, $mime, $matches)) { - $mime = @finfo_file($finfo, $file['tmp_name']); - finfo_close($finfo); - - /* According to the comments section of the PHP manual page, - * it is possible that this function returns an empty string - * for some files (e.g. if they don't exist in the magic MIME database) - */ - if (is_string($mime) && preg_match($regexp, $mime, $matches)) - { - $this->file_type = $matches[1]; - return; - } + $this->file_type = $matches[1]; + return; } } diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index 8240d23401a..b4e56bdae8e 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -1,10 +1,4 @@ markTestSkipped("PHP 5.2 doesn't have ReflectionProperty::setAccessible() and can't run this test"); - } - $path = new ReflectionProperty('CI_Log', '_log_path'); $path->setAccessible(TRUE); $threshold = new ReflectionProperty('CI_Log', '_threshold'); @@ -54,11 +49,6 @@ public function test_configuration() public function test_format_line() { - if ( ! is_php('5.3')) - { - return $this->markTestSkipped("PHP 5.2 doesn't have ReflectionProperty::setAccessible() and can't run this test"); - } - $this->ci_set_config('log_path', ''); $this->ci_set_config('log_threshold', 0); $instance = new CI_Log(); diff --git a/tests/codeigniter/core/compat/password_test.php b/tests/codeigniter/core/compat/password_test.php index 8a507d14a2d..77f5eba4e56 100644 --- a/tests/codeigniter/core/compat/password_test.php +++ b/tests/codeigniter/core/compat/password_test.php @@ -8,11 +8,6 @@ public function test_bootstrap() { return $this->markTestSkipped('ext/standard/password is available on PHP 5.5'); } - elseif ( ! is_php('5.3.7')) - { - $this->assertFalse(defined('PASSWORD_BCRYPT')); - return $this->markTestSkipped("PHP versions prior to 5.3.7 don't have the '2y' Blowfish version"); - } // defined as of HHVM 2.3.0, which is also when they introduce password_*() as well // Note: Do NOT move this after the CRYPT_BLOWFISH check elseif (defined('HHVM_VERSION')) diff --git a/tests/codeigniter/core/compat/standard_test.php b/tests/codeigniter/core/compat/standard_test.php index 4077a5c7c72..a9846012978 100644 --- a/tests/codeigniter/core/compat/standard_test.php +++ b/tests/codeigniter/core/compat/standard_test.php @@ -15,13 +15,6 @@ public function test_bootstrap() { $this->assertTrue(function_exists('hex2bin')); } - - if ( ! is_php('5.3')) - { - $this->assertTrue(function_exists('array_replace')); - $this->assertTrue(function_exists('array_replace_recursive')); - $this->assertTrue(function_exists('quoted_printable_encode')); - } } // ------------------------------------------------------------------------ @@ -356,193 +349,6 @@ public function test_hex2bin() $this->assertEquals('', hex2bin('')); $this->assertEquals("\x01\x02\x03", hex2bin(new FooHex())); } - - // ------------------------------------------------------------------------ - - /** - * array_replace(), array_replace_recursive() tests - * - * Borrowed from PHP's own tests - * - * @depends test_bootstrap - */ - public function test_array_replace_recursive() - { - if (is_php('5.3')) - { - return $this->markTestSkipped('array_replace() and array_replace_recursive() are already available on PHP 5.3'); - } - - $array1 = array( - 0 => 'dontclobber', - '1' => 'unclobbered', - 'test2' => 0.0, - 'test3' => array( - 'testarray2' => TRUE, - 1 => array( - 'testsubarray1' => 'dontclobber2', - 'testsubarray2' => 'dontclobber3' - ) - ) - ); - - $array2 = array( - 1 => 'clobbered', - 'test3' => array( - 'testarray2' => FALSE - ), - 'test4' => array( - 'clobbered3' => array(0, 1, 2) - ) - ); - - // array_replace() - $this->assertEquals( - array( - 0 => 'dontclobber', - 1 => 'clobbered', - 'test2' => 0.0, - 'test3' => array( - 'testarray2' => FALSE - ), - 'test4' => array( - 'clobbered3' => array(0, 1, 2) - ) - ), - array_replace($array1, $array2) - ); - - // array_replace_recursive() - $this->assertEquals( - array( - 0 => 'dontclobber', - 1 => 'clobbered', - 'test2' => 0.0, - 'test3' => array( - 'testarray2' => FALSE, - 1 => array( - 'testsubarray1' => 'dontclobber2', - 'testsubarray2' => 'dontclobber3' - ) - ), - 'test4' => array( - 'clobbered3' => array(0, 1, 2) - ) - ), - array_replace_recursive($array1, $array2) - ); - } - - // ------------------------------------------------------------------------ - - /** - * quoted_printable_encode() tests - * - * Borrowed from PHP's own tests - * - * @depends test_bootstrap - */ - public function test_quoted_printable_encode() - { - if (is_php('5.3')) - { - return $this->markTestSkipped('quoted_printable_encode() is already available on PHP 5.3'); - } - - // These are actually imap_8bit() tests: - $this->assertEquals("String with CRLF at end=20\r\n", quoted_printable_encode("String with CRLF at end \r\n")); - // ext/imap/tests/imap_8bit_basic.phpt says for this line: - // NB this appears to be a bug in cclient; a space at end of string should be encoded as =20 - $this->assertEquals("String with space at end ", quoted_printable_encode("String with space at end ")); - $this->assertEquals("String with tabs =09=09 in middle", quoted_printable_encode("String with tabs \t\t in middle")); - $this->assertEquals("String with tab at end =09", quoted_printable_encode("String with tab at end \t")); - $this->assertEquals("=00=01=02=03=04=FE=FF=0A=0D", quoted_printable_encode("\x00\x01\x02\x03\x04\xfe\xff\x0a\x0d")); - - if (function_exists('imap_8bit')) - { - return $this->markTestIncomplete('imap_8bit() exists and is called as an alias for quoted_printable_encode()'); - } - - // And these are from ext/standard/tests/strings/quoted_printable_encode_002.phpt: - $this->assertEquals( - "=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n" - ."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n" - ."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n" - ."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n" - ."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n" - ."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n" - ."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n" - ."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00", - $d = quoted_printable_encode(str_repeat("\0", 200)) - ); - $this->assertEquals(str_repeat("\x0", 200), quoted_printable_decode($d)); - $this->assertEquals( - "=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=\r\n" - ."=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=\r\n" - ."=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=\r\n" - ."=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=\r\n" - ."=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=\r\n" - ."=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=\r\n" - ."=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=\r\n" - ."=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=\r\n" - ."=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =\r\n" - ."=D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=\r\n" - ."=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=\r\n" - ."=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=\r\n" - ."=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=\r\n" - ."=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=\r\n" - ."=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=\r\n" - ."=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=\r\n" - ."=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=\r\n" - ."=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=\r\n" - ."=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=\r\n" - ."=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =\r\n" - ."=D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=\r\n" - ."=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=\r\n" - ."=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=\r\n" - ."=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=\r\n" - ."=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=\r\n" - ."=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=\r\n" - ."=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=\r\n" - ."=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=\r\n" - ."=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=\r\n" - ."=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=\r\n" - ."=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=\r\n" - ."=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =\r\n" - ."=D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=\r\n" - ."=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=\r\n" - ."=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=\r\n" - ."=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=\r\n" - ."=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=\r\n" - ."=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=\r\n" - ."=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=\r\n" - ."=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=\r\n" - ."=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=\r\n" - ."=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=\r\n" - ."=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =\r\n" - ."=D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=\r\n" - ."=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=\r\n" - ."=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=\r\n" - ."=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=\r\n" - ."=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=\r\n" - ."=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=\r\n" - ."=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=\r\n" - ."=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=\r\n" - ."=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=\r\n" - ."=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=\r\n" - ."=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=\r\n" - ."=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =\r\n" - ."=D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=\r\n" - ."=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=\r\n" - ."=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=\r\n" - ."=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=\r\n" - ."=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=\r\n" - ."=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5", - $d = quoted_printable_encode(str_repeat('строка в юникоде', 50)) - ); - $this->assertEquals(str_repeat('строка в юникоде', 50), quoted_printable_decode($d)); - $this->assertEquals('this is a foo', quoted_printable_encode(new FooObject())); - } } // ------------------------------------------------------------------------ @@ -570,11 +376,3 @@ public function __toString() return '010203'; } } - -class FooObject -{ - public function __toString() - { - return 'this is a foo'; - } -} \ No newline at end of file diff --git a/tests/codeigniter/libraries/Upload_test.php b/tests/codeigniter/libraries/Upload_test.php index 4fbc11ef00b..820bd37e242 100644 --- a/tests/codeigniter/libraries/Upload_test.php +++ b/tests/codeigniter/libraries/Upload_test.php @@ -25,14 +25,10 @@ public function test___construct_initialize() ) ); - // ReflectionProperty::setAccessible() is not available in PHP 5.2.x - if (is_php('5.3')) - { - $reflection = new ReflectionClass($upload); - $reflection = $reflection->getProperty('_file_name_override'); - $reflection->setAccessible(TRUE); - $this->assertEquals('foo', $reflection->getValue($upload)); - } + $reflection = new ReflectionClass($upload); + $reflection = $reflection->getProperty('_file_name_override'); + $reflection->setAccessible(TRUE); + $this->assertEquals('foo', $reflection->getValue($upload)); $this->assertTrue($upload->file_ext_tolower); diff --git a/user_guide_src/source/general/compatibility_functions.rst b/user_guide_src/source/general/compatibility_functions.rst index 434b0982fd8..936f2a24b93 100644 --- a/user_guide_src/source/general/compatibility_functions.rst +++ b/user_guide_src/source/general/compatibility_functions.rst @@ -222,29 +222,6 @@ Function reference For more information, please refer to the `PHP manual for array_column() `_. -.. php:function:: array_replace(array $array1[, ...]) - - :param array $array1: Array in which to replace elements - :param array ...: Array (or multiple ones) from which to extract elements - :returns: Modified array - :rtype: array - - For more information, please refer to the `PHP manual for - array_replace() `_. - -.. php:function:: array_replace_recursive(array $array1[, ...]) - - :param array $array1: Array in which to replace elements - :param array ...: Array (or multiple ones) from which to extract elements - :returns: Modified array - :rtype: array - - For more information, please refer to the `PHP manual for - array_replace_recursive() `_. - - .. important:: Only PHP's native function can detect endless recursion. - Unless you are running PHP 5.3+, be careful with references! - .. php:function:: hex2bin($data) :param array $data: Hexadecimal representation of data @@ -253,12 +230,3 @@ Function reference For more information, please refer to the `PHP manual for hex2bin() `_. - -.. php:function:: quoted_printable_encode($str) - - :param string $str: Input string - :returns: 8bit-encoded string - :rtype: string - - For more information, please refer to the `PHP manual for - quoted_printable_encode() `_. \ No newline at end of file diff --git a/user_guide_src/source/general/hooks.rst b/user_guide_src/source/general/hooks.rst index ffe3fef3983..6cc3407a379 100644 --- a/user_guide_src/source/general/hooks.rst +++ b/user_guide_src/source/general/hooks.rst @@ -56,8 +56,8 @@ defined in your associative hook array: - **params** Any parameters you wish to pass to your script. This item is optional. -If you're running PHP 5.3+, you can also use lambda/anoymous functions -(or closures) as hooks, with a simpler syntax:: +You can also use lambda/anoymous functions (or closures) as hooks, with +a simpler syntax:: $hook['post_controller'] = function() { diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst index 51536809922..b53a85d314e 100644 --- a/user_guide_src/source/general/routing.rst +++ b/user_guide_src/source/general/routing.rst @@ -133,8 +133,8 @@ might be a good starting point. Callbacks ========= -If you are using PHP >= 5.3 you can use callbacks in place of the normal -routing rules to process the back-references. Example:: +You can also use callbacks in place of the normal routing rules to process +the back-references. Example:: $route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id) { diff --git a/user_guide_src/source/general/security.rst b/user_guide_src/source/general/security.rst index 8afdaca3151..744a2c934e9 100644 --- a/user_guide_src/source/general/security.rst +++ b/user_guide_src/source/general/security.rst @@ -133,12 +133,7 @@ with that. Please read below. in PHP's own `Password Hashing `_ functions. Please use them, even if you're not running PHP 5.5+, CodeIgniter - provides them for you as long as you're running at least PHP version - 5.3.7 (and if you don't meet that requirement - please, upgrade). - - If you're one of the really unlucky people who can't even upgrade to a - more recent PHP version, use `hash_pbkdf() `, - which we also provide in our compatibility layer. + provides them for you. - DO NOT ever display or send a password in plain-text format! diff --git a/user_guide_src/source/libraries/encryption.rst b/user_guide_src/source/libraries/encryption.rst index cac4b79211b..377e650a9ab 100644 --- a/user_guide_src/source/libraries/encryption.rst +++ b/user_guide_src/source/libraries/encryption.rst @@ -13,7 +13,7 @@ unfortunately not always available on all systems. You must meet one of the following dependencies in order to use this library: -- `OpenSSL `_ (and PHP 5.3.3) +- `OpenSSL `_ - `MCrypt `_ (and `MCRYPT_DEV_URANDOM` availability) If neither of the above dependencies is met, we simply cannot offer diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index b03b544e2fb..5b9a7427307 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -495,8 +495,7 @@ The above code would use the ``valid_username()`` method from your This is just an example of course, and callbacks aren't limited to models. You can use any object/method that accepts the field value as its' first -parameter. Or if you're running PHP 5.3+, you can also use an anonymous -function:: +parameter. You can also use an anonymous function:: $this->form_validation->set_rules( 'username', 'Username', @@ -522,7 +521,7 @@ the second element of an array, with the first one being the rule name:: ) ); -Anonymous function (PHP 5.3+) version:: +Anonymous function version:: $this->form_validation->set_rules( 'username', 'Username', From ca102a05b1403c573f03c4cdb7fbba15ab99fe87 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 28 Jul 2016 17:22:21 +0300 Subject: [PATCH 4407/5397] [ci skip] Use const keyword to define CI_VERSION Because. --- system/core/CodeIgniter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 22072e983f1..804c6856df5 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - define('CI_VERSION', '3.1.1-dev'); + const CI_VERSION = '3.1.1-dev'; /* * ------------------------------------------------------ From b9f53a8d7a96bad5c6f1ff7e41a075fcb5d8fb5c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 29 Jul 2016 11:31:05 +0300 Subject: [PATCH 4408/5397] [ci skip] Fix #4736 --- system/libraries/Image_lib.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 24fe8c68dfb..7ec8ba365dd 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -886,7 +886,7 @@ public function image_process_imagemagick($action = 'resize') } } - $cmd .= ' "'.escapeshellarg($this->full_src_path).'" "'.escapeshellarg($this->full_dst_path).'" 2>&1'; + $cmd .= escapeshellarg($this->full_src_path).' '.escapeshellarg($this->full_dst_path).' 2>&1'; $retval = 1; // exec() might be disabled diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 400b36e09ce..0fc3138b7b7 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -13,6 +13,7 @@ Bug fixes for 3.1.1 ------------------- - Fixed a bug (#4732) - :doc:`Session Library ` triggered errors while writing data for a newly-created sessions with the 'memcached' driver. +- Fixed a regression (#4736) - :doc:`Image Manipulation Library ` processing via ImageMagick didn't work. Version 3.1.0 From acc6481807fc9cac56b7c1de16239d98af711575 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 29 Jul 2016 11:42:28 +0300 Subject: [PATCH 4409/5397] Fix #4737 --- system/database/DB_query_builder.php | 4 ++-- user_guide_src/source/changelog.rst | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 713bf18f310..7a008eeb8e8 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1271,7 +1271,7 @@ public function offset($offset) */ protected function _limit($sql) { - return $sql.' LIMIT '.($this->qb_offset ? $this->qb_offset.', ' : '').$this->qb_limit; + return $sql.' LIMIT '.($this->qb_offset ? $this->qb_offset.', ' : '').(int) $this->qb_limit; } // -------------------------------------------------------------------- @@ -2340,7 +2340,7 @@ protected function _compile_select($select_override = FALSE) .$this->_compile_order_by(); // ORDER BY // LIMIT - if ($this->qb_limit) + if ($this->qb_limit OR $this->qb_offset) { return $this->_limit($sql."\n"); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 0fc3138b7b7..4f04d4b8bd4 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -14,6 +14,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4732) - :doc:`Session Library ` triggered errors while writing data for a newly-created sessions with the 'memcached' driver. - Fixed a regression (#4736) - :doc:`Image Manipulation Library ` processing via ImageMagick didn't work. +- Fixed a bug (#4737) - :doc:`Query Builder ` didn't add an ``OFFSET`` when ``LIMIT`` is zero or unused. Version 3.1.0 From 4a0ed97e26101bb5346972d2486668e1b5dfa561 Mon Sep 17 00:00:00 2001 From: Masterklavi Date: Sun, 31 Jul 2016 03:25:56 +0500 Subject: [PATCH 4410/5397] Changed the return value of CI_DB_result::_fetch_object(..) to object --- system/database/DB_result.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_result.php b/system/database/DB_result.php index d9d1fccc7b6..4e2429376e0 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -660,7 +660,7 @@ protected function _fetch_assoc() */ protected function _fetch_object($class_name = 'stdClass') { - return array(); + return new $class_name(); } } From ac8541b99be74c2870699221efbe898f132217e3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 1 Aug 2016 11:37:04 +0300 Subject: [PATCH 4411/5397] Merge pull request #4742 from masterklavi/db_fetch_object Change ... for the sake of change --- system/database/DB_result.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_result.php b/system/database/DB_result.php index d9d1fccc7b6..4e2429376e0 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -660,7 +660,7 @@ protected function _fetch_assoc() */ protected function _fetch_object($class_name = 'stdClass') { - return array(); + return new $class_name(); } } From 9b0f5fa0339eb1f74ff06e769d71e5911ba2be06 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 1 Aug 2016 13:54:06 +0300 Subject: [PATCH 4412/5397] [ci skip] Fix #4739 --- system/libraries/Email.php | 3 ++- user_guide_src/source/changelog.rst | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 5049578ed78..315200344fa 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1468,7 +1468,8 @@ protected function _append_attachments(&$body, $boundary, $multipart = null) .'Content-Type: '.$this->_attachments[$i]['type'].'; name="'.$name.'"'.$this->newline .'Content-Disposition: '.$this->_attachments[$i]['disposition'].';'.$this->newline .'Content-Transfer-Encoding: base64'.$this->newline - .(empty($this->_attachments[$i]['cid']) ? '' : 'Content-ID: <'.$this->_attachments[$i]['cid'].'>'.$this->newline.$this->newline) + .(empty($this->_attachments[$i]['cid']) ? '' : 'Content-ID: <'.$this->_attachments[$i]['cid'].'>'.$this->newline) + .$this->newline .$this->_attachments[$i]['content'].$this->newline; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4f04d4b8bd4..8e047953db6 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -15,7 +15,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4732) - :doc:`Session Library ` triggered errors while writing data for a newly-created sessions with the 'memcached' driver. - Fixed a regression (#4736) - :doc:`Image Manipulation Library ` processing via ImageMagick didn't work. - Fixed a bug (#4737) - :doc:`Query Builder ` didn't add an ``OFFSET`` when ``LIMIT`` is zero or unused. - +- Fixed a regression (#4739) - :doc:`Email Library ` doesn't properly separate attachment bodies from headers. Version 3.1.0 ============= From de4686ab2cb4d8de9995eeba62a12f632c2e3324 Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Tue, 9 Aug 2016 19:07:47 +0800 Subject: [PATCH 4413/5397] CI_Unit_test: Fix name of visible test items. Signed-off-by: tianhe1986 --- system/libraries/Unit_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php index 3ac6af78ed9..ea78e0d98c0 100644 --- a/system/libraries/Unit_test.php +++ b/system/libraries/Unit_test.php @@ -291,7 +291,7 @@ public function result($results = array()) { continue; } - elseif (in_array($key, array('test_name', 'test_datatype', 'test_res_datatype', 'result'), TRUE)) + elseif (in_array($key, array('test_name', 'test_datatype', 'res_datatype', 'result'), TRUE)) { if (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$val), FALSE))) { From a40418b794843f9ab37c30a909f3118a5c1c63af Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Tue, 9 Aug 2016 19:25:07 +0800 Subject: [PATCH 4414/5397] CI_Unit_test: Do not replace "is_double" with "is_float". Signed-off-by: tianhe1986 --- system/libraries/Unit_test.php | 1 - 1 file changed, 1 deletion(-) diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php index 3ac6af78ed9..eee0723a15c 100644 --- a/system/libraries/Unit_test.php +++ b/system/libraries/Unit_test.php @@ -154,7 +154,6 @@ public function run($test, $expected = TRUE, $test_name = 'undefined', $notes = if (in_array($expected, array('is_object', 'is_string', 'is_bool', 'is_true', 'is_false', 'is_int', 'is_numeric', 'is_float', 'is_double', 'is_array', 'is_null', 'is_resource'), TRUE)) { - $expected = str_replace('is_double', 'is_float', $expected); $result = $expected($test); $extype = str_replace(array('true', 'false'), 'bool', str_replace('is_', '', $expected)); } From 4e239a3913d161f560de9e20a3ef291ebf1c16fb Mon Sep 17 00:00:00 2001 From: Vivek Dinesh Date: Tue, 9 Aug 2016 22:34:42 +0530 Subject: [PATCH 4415/5397] URI schemes are not case sensitive Signed-off-by: Vivek Dinesh --- system/libraries/Form_validation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 04445f5b799..d5f67d1dafb 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1200,7 +1200,7 @@ public function valid_url($str) { return FALSE; } - elseif ( ! in_array($matches[1], array('http', 'https'), TRUE)) + elseif ( ! in_array(strtolower($matches[1]), array('http', 'https'), TRUE)) { return FALSE; } From fba242cf6bc99833c21fc3600fdff2691244e243 Mon Sep 17 00:00:00 2001 From: Vivek Dinesh Date: Tue, 9 Aug 2016 22:43:52 +0530 Subject: [PATCH 4416/5397] URI schemes are not case sensitive Signed-off-by: Vivek Dinesh --- system/libraries/Trackback.php | 2 +- system/libraries/Xmlrpc.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index a9b256464b2..848f5b3c994 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -370,7 +370,7 @@ public function validate_url(&$url) { $url = trim($url); - if (strpos($url, 'http') !== 0) + if (strpos(strtolower($url), 'http') !== 0) { $url = 'http://'.$url; } diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index f965858e2e7..b01691ac221 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -352,7 +352,7 @@ public function initialize($config = array()) */ public function server($url, $port = 80, $proxy = FALSE, $proxy_port = 8080) { - if (strpos($url, 'http') !== 0) + if (strpos(strtolower($url), 'http') !== 0) { $url = 'http://'.$url; } From b5e2410c54f867307fb88647729794a1ded7e552 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 10 Aug 2016 13:21:15 +0300 Subject: [PATCH 4417/5397] Merge pull request #4754 from tianhe1986/develop_fix_unit_test_name CI_Unit_test: Fix translation of result datatype --- system/libraries/Unit_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php index 3ac6af78ed9..ea78e0d98c0 100644 --- a/system/libraries/Unit_test.php +++ b/system/libraries/Unit_test.php @@ -291,7 +291,7 @@ public function result($results = array()) { continue; } - elseif (in_array($key, array('test_name', 'test_datatype', 'test_res_datatype', 'result'), TRUE)) + elseif (in_array($key, array('test_name', 'test_datatype', 'res_datatype', 'result'), TRUE)) { if (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$val), FALSE))) { From 7e6db8ef0dd87c11a77f674e77d8b47489eef8a5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 10 Aug 2016 13:23:58 +0300 Subject: [PATCH 4418/5397] [ci skip] Add changelog entry for #4754 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8e047953db6..75270489ef8 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -16,6 +16,7 @@ Bug fixes for 3.1.1 - Fixed a regression (#4736) - :doc:`Image Manipulation Library ` processing via ImageMagick didn't work. - Fixed a bug (#4737) - :doc:`Query Builder ` didn't add an ``OFFSET`` when ``LIMIT`` is zero or unused. - Fixed a regression (#4739) - :doc:`Email Library ` doesn't properly separate attachment bodies from headers. +- Fixed a bug (#4754) - :doc:`Unit Testing Library ` method ``result()`` didn't translate ``res_datatype``. Version 3.1.0 ============= From 353f7483c61e7e4d375d4637f1e97406669648ac Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 10 Aug 2016 14:18:19 +0300 Subject: [PATCH 4419/5397] Merge pull request #4755 from tianhe1986/develop_not_replace_is_double CI_Unit_test: Do not replace "is_double" with "is_float". --- system/libraries/Unit_test.php | 1 - 1 file changed, 1 deletion(-) diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php index ea78e0d98c0..3122ed624b1 100644 --- a/system/libraries/Unit_test.php +++ b/system/libraries/Unit_test.php @@ -154,7 +154,6 @@ public function run($test, $expected = TRUE, $test_name = 'undefined', $notes = if (in_array($expected, array('is_object', 'is_string', 'is_bool', 'is_true', 'is_false', 'is_int', 'is_numeric', 'is_float', 'is_double', 'is_array', 'is_null', 'is_resource'), TRUE)) { - $expected = str_replace('is_double', 'is_float', $expected); $result = $expected($test); $extype = str_replace(array('true', 'false'), 'bool', str_replace('is_', '', $expected)); } From 656fd7eef9624c3c07918b2d573d9ccb6f971c57 Mon Sep 17 00:00:00 2001 From: Vivek Dinesh Date: Wed, 10 Aug 2016 17:36:49 +0530 Subject: [PATCH 4420/5397] Better usage Based on GitHub discussion. Signed-off-by: Vivek Dinesh --- system/libraries/Trackback.php | 2 +- system/libraries/Xmlrpc.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index 848f5b3c994..7222c00c210 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -370,7 +370,7 @@ public function validate_url(&$url) { $url = trim($url); - if (strpos(strtolower($url), 'http') !== 0) + if (stripos($url, 'http') !== 0) { $url = 'http://'.$url; } diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index b01691ac221..181a104d0e6 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -352,7 +352,7 @@ public function initialize($config = array()) */ public function server($url, $port = 80, $proxy = FALSE, $proxy_port = 8080) { - if (strpos(strtolower($url), 'http') !== 0) + if (stripos($url, 'http') !== 0) { $url = 'http://'.$url; } From 878e23f8883b2510d573850deb7dca5761cc1848 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 10 Aug 2016 15:15:49 +0300 Subject: [PATCH 4421/5397] Use getMockBuilder() in PHPUnit instead of the deprecated getMock() --- tests/codeigniter/core/Loader_test.php | 4 ++-- tests/codeigniter/helpers/date_helper_test.php | 4 ++-- tests/codeigniter/helpers/language_helper_test.php | 4 ++-- tests/codeigniter/helpers/number_helper_test.php | 4 ++-- tests/codeigniter/libraries/Calendar_test.php | 6 +++--- tests/codeigniter/libraries/Driver_test.php | 4 ++-- tests/codeigniter/libraries/Form_validation_test.php | 4 ++-- tests/codeigniter/libraries/Upload_test.php | 4 ++-- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/codeigniter/core/Loader_test.php b/tests/codeigniter/core/Loader_test.php index db5088d8068..c1c4997c4cc 100644 --- a/tests/codeigniter/core/Loader_test.php +++ b/tests/codeigniter/core/Loader_test.php @@ -291,7 +291,7 @@ public function test_load_view() $this->assertEquals($content.$value, $out); // Mock output class - $output = $this->getMock('CI_Output', array('append_output')); + $output = $this->getMockBuilder('CI_Output')->setMethods(array('append_output'))->getMock(); $output->expects($this->once())->method('append_output')->with($content.$value); $this->ci_instance_var('output', $output); @@ -441,7 +441,7 @@ public function test_language() { // Mock lang class and test load call $file = 'test'; - $lang = $this->getMock('CI_Lang', array('load')); + $lang = $this->getMockBuilder('CI_Lang')->setMethods(array('load'))->getMock(); $lang->expects($this->once())->method('load')->with($file); $this->ci_instance_var('lang', $lang); $this->assertInstanceOf('CI_Loader', $this->load->language($file)); diff --git a/tests/codeigniter/helpers/date_helper_test.php b/tests/codeigniter/helpers/date_helper_test.php index c80e92cd04f..c4f99a97c3d 100644 --- a/tests/codeigniter/helpers/date_helper_test.php +++ b/tests/codeigniter/helpers/date_helper_test.php @@ -15,7 +15,7 @@ public function test_now_local() /* // This stub job, is simply to cater $config['time_reference'] - $config = $this->getMock('CI_Config'); + $config = $this->getMockBuilder('CI_Config')->getMock(); $config->expects($this->any()) ->method('item') ->will($this->returnValue('local')); @@ -37,7 +37,7 @@ public function test_now_utc() /* // This stub job, is simply to cater $config['time_reference'] - $config = $this->getMock('CI_Config'); + $config = $this->getMockBuilder('CI_Config')->getMock(); $config->expects($this->any()) ->method('item') ->will($this->returnValue('UTC')); diff --git a/tests/codeigniter/helpers/language_helper_test.php b/tests/codeigniter/helpers/language_helper_test.php index 176da689a04..1ddabea3d6b 100644 --- a/tests/codeigniter/helpers/language_helper_test.php +++ b/tests/codeigniter/helpers/language_helper_test.php @@ -5,7 +5,7 @@ class Language_helper_test extends CI_TestCase { public function test_lang() { $this->helper('language'); - $lang = $this->getMock('CI_Lang', array('line')); + $lang = $this->getMockBuilder('CI_Lang')->setMethods(array('line'))->getMock(); $lang->expects($this->any())->method('line')->will($this->returnValue(FALSE)); $this->ci_instance_var('lang', $lang); @@ -13,4 +13,4 @@ public function test_lang() $this->assertEquals('', lang(1, 'foo', array('class' => 'bar'))); } -} \ No newline at end of file +} diff --git a/tests/codeigniter/helpers/number_helper_test.php b/tests/codeigniter/helpers/number_helper_test.php index 817db2c7e91..663e354fef3 100644 --- a/tests/codeigniter/helpers/number_helper_test.php +++ b/tests/codeigniter/helpers/number_helper_test.php @@ -11,7 +11,7 @@ public function set_up() // Mock away load, too much going on in there, // we'll just check for the expected parameter - $lang = $this->getMock($lang_cls, array('load')); + $lang = $this->getMockBuilder('CI_Lang')->setMethods(array('load'))->getMock(); $lang->expects($this->once()) ->method('load') ->with($this->equalTo('number')); @@ -60,4 +60,4 @@ public function test_tb_format() $this->assertEquals('112,283.3 TB', byte_format(123456789123456789)); } -} \ No newline at end of file +} diff --git a/tests/codeigniter/libraries/Calendar_test.php b/tests/codeigniter/libraries/Calendar_test.php index 54879fec90d..ad1f45e8c77 100644 --- a/tests/codeigniter/libraries/Calendar_test.php +++ b/tests/codeigniter/libraries/Calendar_test.php @@ -5,9 +5,9 @@ class Calendar_test extends CI_TestCase { public function set_up() { // Required for get_total_days() - $this->ci_instance_var('load', $this->getMock('CI_Loader', array('helper'))); + $this->ci_instance_var('load', $this->getMockBuilder('CI_Loader')->setMethods(array('helper'))->getMock()); - $lang = $this->getMock('CI_Lang', array('load', 'line')); + $lang = $this->getMockBuilder('CI_Lang')->setMethods(array('load', 'line'))->getMock(); $lang->expects($this->any())->method('line')->will($this->returnValue(FALSE)); $this->ci_instance_var('lang', $lang); @@ -219,4 +219,4 @@ public function test_default_template() $this->assertEquals($array, $this->calendar->default_template()); } -} \ No newline at end of file +} diff --git a/tests/codeigniter/libraries/Driver_test.php b/tests/codeigniter/libraries/Driver_test.php index c62cbee450a..e4401e6885f 100644 --- a/tests/codeigniter/libraries/Driver_test.php +++ b/tests/codeigniter/libraries/Driver_test.php @@ -16,7 +16,7 @@ public function set_up() // Mock Loader->get_package_paths $paths = 'get_package_paths'; - $ldr = $this->getMock('CI_Loader', array($paths)); + $ldr = $this->getMockBuilder('CI_Loader')->setMethods(array($paths))->getMock(); $ldr->expects($this->any())->method($paths)->will($this->returnValue(array(APPPATH, BASEPATH))); $this->ci_instance_var('load', $ldr); @@ -175,4 +175,4 @@ public function test_decorate() $this->assertEquals($return, $child->$method()); } -} \ No newline at end of file +} diff --git a/tests/codeigniter/libraries/Form_validation_test.php b/tests/codeigniter/libraries/Form_validation_test.php index b87ca65fffb..905f663e23c 100644 --- a/tests/codeigniter/libraries/Form_validation_test.php +++ b/tests/codeigniter/libraries/Form_validation_test.php @@ -8,10 +8,10 @@ public function set_up() // Create a mock loader since load->helper() looks in the wrong directories for unit tests, // We'll use CI_TestCase->helper() instead - $loader = $this->getMock('CI_Loader', array('helper')); + $loader = $this->getMockBuilder('CI_Loader')->setMethods(array('helper'))->getMock(); // Same applies for lang - $lang = $this->getMock('CI_Lang', array('load')); + $lang = $this->getMockBuilder('CI_Lang')->setMethods(array('load'))->getMock(); $this->ci_set_config('charset', 'UTF-8'); $utf8 = new Mock_Core_Utf8(); diff --git a/tests/codeigniter/libraries/Upload_test.php b/tests/codeigniter/libraries/Upload_test.php index 820bd37e242..8bac597b3da 100644 --- a/tests/codeigniter/libraries/Upload_test.php +++ b/tests/codeigniter/libraries/Upload_test.php @@ -7,7 +7,7 @@ public function set_up() $ci = $this->ci_instance(); $ci->upload = new CI_Upload(); $ci->security = new Mock_Core_Security(); - $ci->lang = $this->getMock('CI_Lang', array('load', 'line')); + $ci->lang = $this->getMockBuilder('CI_Lang')->setMethods(array('load', 'line'))->getMock(); $ci->lang->expects($this->any())->method('line')->will($this->returnValue(FALSE)); $this->upload = $ci->upload; } @@ -296,4 +296,4 @@ function test_display_errors() $this->assertEquals('

    Error test

    ', $this->upload->display_errors()); } -} \ No newline at end of file +} From e33c82d62e5a56b2fe46096420de838eb74553e8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 10 Aug 2016 15:18:31 +0300 Subject: [PATCH 4422/5397] Merge pull request #4758 from butane/uri_scheme_case URI schemes are not case-sensitive --- system/libraries/Form_validation.php | 2 +- system/libraries/Trackback.php | 2 +- system/libraries/Xmlrpc.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 25dc0d41ecf..61f0298fdb7 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1200,7 +1200,7 @@ public function valid_url($str) { return FALSE; } - elseif ( ! in_array($matches[1], array('http', 'https'), TRUE)) + elseif ( ! in_array(strtolower($matches[1]), array('http', 'https'), TRUE)) { return FALSE; } diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index a9b256464b2..7222c00c210 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -370,7 +370,7 @@ public function validate_url(&$url) { $url = trim($url); - if (strpos($url, 'http') !== 0) + if (stripos($url, 'http') !== 0) { $url = 'http://'.$url; } diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index f965858e2e7..181a104d0e6 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -352,7 +352,7 @@ public function initialize($config = array()) */ public function server($url, $port = 80, $proxy = FALSE, $proxy_port = 8080) { - if (strpos($url, 'http') !== 0) + if (stripos($url, 'http') !== 0) { $url = 'http://'.$url; } From 9180a1264dc536c34e5cc8a0e44bb399a8ba484f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 10 Aug 2016 15:23:42 +0300 Subject: [PATCH 4423/5397] Add changelog entry and a test case for #4758 --- tests/codeigniter/libraries/Form_validation_test.php | 3 +++ user_guide_src/source/changelog.rst | 1 + 2 files changed, 4 insertions(+) diff --git a/tests/codeigniter/libraries/Form_validation_test.php b/tests/codeigniter/libraries/Form_validation_test.php index 905f663e23c..0815300e6be 100644 --- a/tests/codeigniter/libraries/Form_validation_test.php +++ b/tests/codeigniter/libraries/Form_validation_test.php @@ -259,6 +259,9 @@ public function test_rule_valid_url() // https://github.com/bcit-ci/CodeIgniter/issues/4415 $this->assertTrue($this->form_validation->valid_url('http://[::1]/ipv6')); + // URI scheme case-sensitivity: https://github.com/bcit-ci/CodeIgniter/pull/4758 + $this->assertTrue($this->form_validation->valid_url('HtTp://127.0.0.1/')); + $this->assertFalse($this->form_validation->valid_url('htt://www.codeIgniter.com')); $this->assertFalse($this->form_validation->valid_url('')); $this->assertFalse($this->form_validation->valid_url('code igniter')); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 75270489ef8..e95d509f79a 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -17,6 +17,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4737) - :doc:`Query Builder ` didn't add an ``OFFSET`` when ``LIMIT`` is zero or unused. - Fixed a regression (#4739) - :doc:`Email Library ` doesn't properly separate attachment bodies from headers. - Fixed a bug (#4754) - :doc:`Unit Testing Library ` method ``result()`` didn't translate ``res_datatype``. +- Fixed a bug (#4759) - :doc:`Form Validation `, :doc:`Trackback ` and `XML-RPC ` libraries treated URI schemes in a case-sensitive manner. Version 3.1.0 ============= From e1f76634b6c658680c2ea869dc1bcc38828c7da0 Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Thu, 11 Aug 2016 12:40:47 +0800 Subject: [PATCH 4424/5397] Cache_file: use is_file() for checking instead of file_exists(). Signed-off-by: tianhe1986 --- system/libraries/Cache/drivers/Cache_file.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index e1ce16a5a4e..f579eaae4a4 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -120,7 +120,7 @@ public function save($id, $data, $ttl = 60, $raw = FALSE) */ public function delete($id) { - return file_exists($this->_cache_path.$id) ? unlink($this->_cache_path.$id) : FALSE; + return is_file($this->_cache_path.$id) ? unlink($this->_cache_path.$id) : FALSE; } // ------------------------------------------------------------------------ @@ -216,7 +216,7 @@ public function cache_info($type = NULL) */ public function get_metadata($id) { - if ( ! file_exists($this->_cache_path.$id)) + if ( ! is_file($this->_cache_path.$id)) { return FALSE; } From 4c8a0eb32c2aa94eb621171a89084f1388e3c4c5 Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Thu, 11 Aug 2016 12:54:15 +0800 Subject: [PATCH 4425/5397] Cache_file: use $data['time'] for calculating expired time. Signed-off-by: tianhe1986 --- system/libraries/Cache/drivers/Cache_file.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index e1ce16a5a4e..c46de2f958c 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -233,7 +233,7 @@ public function get_metadata($id) } return array( - 'expire' => $mtime + $data['ttl'], + 'expire' => $data['time'] + $data['ttl'], 'mtime' => $mtime ); } From 04649d9dd5fbdf2d032eb3e4b969a4788d9451f0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 11 Aug 2016 14:13:11 +0300 Subject: [PATCH 4426/5397] Merge pull request #4761 from tianhe1986/develop_cache_file_check Cache_file: use is_file() for checking instead of file_exists(). --- system/libraries/Cache/drivers/Cache_file.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index e1ce16a5a4e..f579eaae4a4 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -120,7 +120,7 @@ public function save($id, $data, $ttl = 60, $raw = FALSE) */ public function delete($id) { - return file_exists($this->_cache_path.$id) ? unlink($this->_cache_path.$id) : FALSE; + return is_file($this->_cache_path.$id) ? unlink($this->_cache_path.$id) : FALSE; } // ------------------------------------------------------------------------ @@ -216,7 +216,7 @@ public function cache_info($type = NULL) */ public function get_metadata($id) { - if ( ! file_exists($this->_cache_path.$id)) + if ( ! is_file($this->_cache_path.$id)) { return FALSE; } From 87c50228998440b86f1ee4233ea8c6aacb0a8a3c Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Thu, 11 Aug 2016 20:03:34 +0800 Subject: [PATCH 4427/5397] Checking for $data['time']. Signed-off-by: tianhe1986 --- system/libraries/Cache/drivers/Cache_file.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index c46de2f958c..e5614f8bdd0 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -227,7 +227,7 @@ public function get_metadata($id) { $mtime = filemtime($this->_cache_path.$id); - if ( ! isset($data['ttl'])) + if ( ! isset($data['ttl']) OR ! isset($data['time'])) { return FALSE; } From b6ed3d102dc7c8e2a591405e56aa780d64d385d6 Mon Sep 17 00:00:00 2001 From: Vivek Dinesh Date: Thu, 11 Aug 2016 17:40:45 +0530 Subject: [PATCH 4428/5397] URI schemes are not case-sensitive Signed-off-by: Vivek Dinesh --- system/helpers/url_helper.php | 2 +- system/libraries/Form_validation.php | 4 ++-- system/libraries/Javascript.php | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index fd7b5e116f3..82b9e02afd7 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -443,7 +443,7 @@ function auto_link($str, $type = 'both', $popup = FALSE) */ function prep_url($str = '') { - if ($str === 'http://' OR $str === '') + if (strtolower($str) === 'http://' OR $str === '') { return ''; } diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 61f0298fdb7..fa28a6207b6 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1523,12 +1523,12 @@ public function prep_for_form($data) */ public function prep_url($str = '') { - if ($str === 'http://' OR $str === '') + if (strtolower($str) === 'http://' OR $str === '') { return ''; } - if (strpos($str, 'http://') !== 0 && strpos($str, 'https://') !== 0) + if (stripos($str, 'http://') !== 0 && stripos($str, 'https://') !== 0) { return 'http://'.$str; } diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php index dcf9337794d..2ddab38ee54 100644 --- a/system/libraries/Javascript.php +++ b/system/libraries/Javascript.php @@ -650,11 +650,11 @@ public function external($external_file = '', $relative = FALSE) $this->_javascript_location = $this->CI->config->item('javascript_location'); } - if ($relative === TRUE OR strpos($external_file, 'http://') === 0 OR strpos($external_file, 'https://') === 0) + if ($relative === TRUE OR stripos($external_file, 'http://') === 0 OR stripos($external_file, 'https://') === 0) { $str = $this->_open_script($external_file); } - elseif (strpos($this->_javascript_location, 'http://') !== FALSE) + elseif (stripos($this->_javascript_location, 'http://') !== FALSE) { $str = $this->_open_script($this->_javascript_location.$external_file); } From ae31a918a3c0eff331f3ae2f03afca25158e93ff Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Thu, 11 Aug 2016 20:13:06 +0800 Subject: [PATCH 4429/5397] =?UTF-8?q?Using=20"!=20isset($a,=20$b,=20?= =?UTF-8?q?=E2=80=A6=E2=80=A6)"=20instead=20of=20"!=20isset($a)=20OR=20!?= =?UTF-8?q?=20isset($b)=20OR=20=E2=80=A6=E2=80=A6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tianhe1986 --- system/libraries/Cache/drivers/Cache_file.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index e5614f8bdd0..554f10b957e 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -227,7 +227,7 @@ public function get_metadata($id) { $mtime = filemtime($this->_cache_path.$id); - if ( ! isset($data['ttl']) OR ! isset($data['time'])) + if ( ! isset($data['ttl'], $data['time'])) { return FALSE; } From 9514dc35154cdfd5e3380976a37c8a3640413e48 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 11 Aug 2016 15:14:33 +0300 Subject: [PATCH 4430/5397] Merge pull request #4762 from tianhe1986/develop_cache_file_metadata Cache_file: use $data['time'] for calculating expired time. --- system/libraries/Cache/drivers/Cache_file.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index f579eaae4a4..93932d4cf95 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -227,13 +227,13 @@ public function get_metadata($id) { $mtime = filemtime($this->_cache_path.$id); - if ( ! isset($data['ttl'])) + if ( ! isset($data['ttl'], $data['time'])) { return FALSE; } return array( - 'expire' => $mtime + $data['ttl'], + 'expire' => $data['time'] + $data['ttl'], 'mtime' => $mtime ); } From 15a5e0db1fc00ad26516bd92f3c476bcc77fe5fe Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 11 Aug 2016 15:17:43 +0300 Subject: [PATCH 4431/5397] [ci skip] Add changelog entry for #4762 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e95d509f79a..64ea521ddaf 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -18,6 +18,7 @@ Bug fixes for 3.1.1 - Fixed a regression (#4739) - :doc:`Email Library ` doesn't properly separate attachment bodies from headers. - Fixed a bug (#4754) - :doc:`Unit Testing Library ` method ``result()`` didn't translate ``res_datatype``. - Fixed a bug (#4759) - :doc:`Form Validation `, :doc:`Trackback ` and `XML-RPC ` libraries treated URI schemes in a case-sensitive manner. +- Fixed a bug (#4762) - :doc:`Cache Library ` 'file' driver method ``get_metadata()`` checked TTL time against ``mtime`` instead of the cache item's creation time. Version 3.1.0 ============= From 669cc5f881970ec3cc19b57f4da0382c7d8f5542 Mon Sep 17 00:00:00 2001 From: Vivek Dinesh Date: Thu, 11 Aug 2016 18:21:11 +0530 Subject: [PATCH 4432/5397] Removed useless checks Based on GitHub discussion. Signed-off-by: Vivek Dinesh --- system/helpers/url_helper.php | 2 +- system/libraries/Form_validation.php | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index 82b9e02afd7..8a5a75c449f 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -443,7 +443,7 @@ function auto_link($str, $type = 'both', $popup = FALSE) */ function prep_url($str = '') { - if (strtolower($str) === 'http://' OR $str === '') + if ($str === '') { return ''; } diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index fa28a6207b6..86a569cedc6 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1523,12 +1523,7 @@ public function prep_for_form($data) */ public function prep_url($str = '') { - if (strtolower($str) === 'http://' OR $str === '') - { - return ''; - } - - if (stripos($str, 'http://') !== 0 && stripos($str, 'https://') !== 0) + if ($str !== '' && stripos($str, 'http://') !== 0 && stripos($str, 'https://') !== 0) { return 'http://'.$str; } From a309badf3a73f427af030e790e5080347da67372 Mon Sep 17 00:00:00 2001 From: Kristaps V Date: Fri, 12 Aug 2016 17:55:36 +0300 Subject: [PATCH 4433/5397] Fix custom user agent not working Signed-off-by: Kristaps V --- system/libraries/Email.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 50d0cd04e73..426731135e0 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1206,6 +1206,7 @@ public function word_wrap($str, $charlim = NULL) */ protected function _build_headers() { + $this->set_header('User-Agent', $this->useragent); $this->set_header('X-Sender', $this->clean_email($this->_headers['From'])); $this->set_header('X-Mailer', $this->useragent); $this->set_header('X-Priority', $this->_priorities[$this->priority]); From abd7e295e65a27ae431641a7bbcbdc9b1fddedf5 Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Fri, 19 Aug 2016 14:31:52 +0800 Subject: [PATCH 4434/5397] Common: Adding E_PARSE in error judgment. Signed-off-by: tianhe1986 --- system/core/Common.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Common.php b/system/core/Common.php index d66649f590d..2c7651943c1 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -598,7 +598,7 @@ function set_status_header($code = 200, $text = '') */ function _error_handler($severity, $message, $filepath, $line) { - $is_error = (((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); + $is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); // When an error occurred, set the status header to '500 Internal Server Error' // to indicate to the client something went wrong. From c114deba71fdbbb0b7087696960f15e5ae0a08c5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 19 Aug 2016 19:17:59 +0300 Subject: [PATCH 4435/5397] Merge pull request #4777 from tianhe1986/develop_error_handler Add E_PARSE to errors detected by shutdown handler --- system/core/Common.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Common.php b/system/core/Common.php index d66649f590d..2c7651943c1 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -598,7 +598,7 @@ function set_status_header($code = 200, $text = '') */ function _error_handler($severity, $message, $filepath, $line) { - $is_error = (((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); + $is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); // When an error occurred, set the status header to '500 Internal Server Error' // to indicate to the client something went wrong. From 69070510fb62887e5d06e446b50d3a941ee1e4f9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 19 Aug 2016 19:21:36 +0300 Subject: [PATCH 4436/5397] [ci skip] Add changelog entry for PR #4777 --- user_guide_src/source/changelog.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 64ea521ddaf..4870cb1a853 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,7 +7,9 @@ Version 3.1.1 Release Date: Not Released +- General Changes + - Added ``E_PARSE`` to the list of error levels detected by the shutdown handler. Bug fixes for 3.1.1 ------------------- From 2fb1551fe8eb73164d341909054cabe6c33a6fa8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 19 Aug 2016 19:26:27 +0300 Subject: [PATCH 4437/5397] Travis builds on PHP 7.1 (beta) --- .travis.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 54647689b53..ba2d6b31dfb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,8 @@ php: - 5.4 - 5.5 - 5.6 - - 7 + - 7.0 + - 7.1 - hhvm env: @@ -31,17 +32,16 @@ matrix: allow_failures: - php: 5.3 - php: hhvm + - php: 7.1 exclude: - php: hhvm env: DB=pgsql - php: hhvm env: DB=pdo/pgsql - - php: 7 + - php: 7.0 + env: DB=mysql + - php: 7.1 env: DB=mysql - - php: 5.2 - env: DB=sqlite - - php: 5.2 - env: DB=pdo/sqlite branches: only: From b52ae04ae36b8d02b04b275cf34a73bf39bd5dff Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 19 Aug 2016 19:26:27 +0300 Subject: [PATCH 4438/5397] Travis builds on PHP 7.1 (beta) --- .travis.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 22c3b6e1860..334cb614fea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,8 @@ php: - 5.4 - 5.5 - 5.6 - - 7 + - 7.0 + - 7.1 - hhvm env: @@ -29,12 +30,15 @@ script: phpunit -d zend.enable_gc=0 -d date.timezone=UTC --coverage-text --confi matrix: allow_failures: - php: hhvm + - php: 7.1 exclude: - php: hhvm env: DB=pgsql - php: hhvm env: DB=pdo/pgsql - - php: 7 + - php: 7.0 + env: DB=mysql + - php: 7.1 env: DB=mysql branches: From 50e87ec848f27bb5e40093ade2b67dc104679fb9 Mon Sep 17 00:00:00 2001 From: Igor Ostapchuk Date: Sun, 21 Aug 2016 16:28:28 +0300 Subject: [PATCH 4439/5397] return fix --- system/libraries/Email.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 50d0cd04e73..6a7e2b3a70a 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1202,7 +1202,7 @@ public function word_wrap($str, $charlim = NULL) /** * Build final headers * - * @return string + * @return void */ protected function _build_headers() { @@ -2046,7 +2046,7 @@ protected function _smtp_connect() * * @param string * @param string - * @return string + * @return bool */ protected function _send_command($cmd, $data = '') { From 1927709235ed11f51b700abcb390b660e2762053 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 22 Aug 2016 11:34:56 +0300 Subject: [PATCH 4440/5397] Merge pull request #4778 from antydemant/patch-1 [ci skip] Docblock return type corrections --- system/libraries/Email.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 315200344fa..7f49c1b3d89 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1202,7 +1202,7 @@ public function word_wrap($str, $charlim = NULL) /** * Build final headers * - * @return string + * @return void */ protected function _build_headers() { @@ -2046,7 +2046,7 @@ protected function _smtp_connect() * * @param string * @param string - * @return string + * @return bool */ protected function _send_command($cmd, $data = '') { From 549a601bac3b1467168e0bb7b5642ba7fc59c35e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 22 Aug 2016 13:18:36 +0300 Subject: [PATCH 4441/5397] Fix CI_Upload errors on PHP 7.1 --- system/libraries/Upload.php | 23 ++++++++++++++++++++--- user_guide_src/source/changelog.rst | 1 + 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index a8cf7526407..23fd02ead1b 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1083,10 +1083,27 @@ public function do_xss_clean() return FALSE; } - if (memory_get_usage() && ($memory_limit = ini_get('memory_limit'))) + if (memory_get_usage() && ($memory_limit = ini_get('memory_limit')) > 0) { - $memory_limit *= 1024 * 1024; - $memory_limit = (int) ceil(filesize($file) + $memory_limit); + $memory_limit = str_split($memory_limit, strspn($memory_limit, '1234567890')); + if ( ! empty($memory_limit[1])) + { + switch ($memory_limit[1][0]) + { + case 'g': + case 'G': + $memory_limit[0] *= 1024 * 1024 * 1024; + break; + case 'm': + case 'M': + $memory_limit[0] *= 1024 * 1024; + break; + default: + break; + } + } + + $memory_limit = (int) ceil(filesize($file) + $memory_limit[0]); ini_set('memory_limit', $memory_limit); // When an integer is used, the value is measured in bytes. - PHP.net } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4870cb1a853..97b4d254d76 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -21,6 +21,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4754) - :doc:`Unit Testing Library ` method ``result()`` didn't translate ``res_datatype``. - Fixed a bug (#4759) - :doc:`Form Validation `, :doc:`Trackback ` and `XML-RPC ` libraries treated URI schemes in a case-sensitive manner. - Fixed a bug (#4762) - :doc:`Cache Library ` 'file' driver method ``get_metadata()`` checked TTL time against ``mtime`` instead of the cache item's creation time. +- Fixed a bug where :doc:`File Uploading Library ` generated error messages on PHP 7.1. Version 3.1.0 ============= From c95df51c90dc9506ec9a37a43d87238965210550 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 22 Aug 2016 13:19:24 +0300 Subject: [PATCH 4442/5397] Skip mcrypt-related testcases on PHP 7.1 ext/mcrypt is deprecated and the test cases in question trigger E_DEPRECATED messages as a result. --- tests/codeigniter/libraries/Encrypt_test.php | 6 +++++- tests/codeigniter/libraries/Encryption_test.php | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/codeigniter/libraries/Encrypt_test.php b/tests/codeigniter/libraries/Encrypt_test.php index ced7633017f..adbca31b24f 100644 --- a/tests/codeigniter/libraries/Encrypt_test.php +++ b/tests/codeigniter/libraries/Encrypt_test.php @@ -10,6 +10,10 @@ public function set_up() { return; } + elseif (version_compare(PHP_VERSION, '7.1.0-alpha', '>=')) + { + return $this->markTestSkipped('ext/mcrypt is deprecated since PHP 7.1 and will generate notices here.'); + } $this->encrypt = new Mock_Libraries_Encrypt(); $this->ci_instance_var('encrypt', $this->encrypt); @@ -72,4 +76,4 @@ public function test_set_mode() $this->assertEquals('cfb', $this->encrypt->get_mode()); } -} \ No newline at end of file +} diff --git a/tests/codeigniter/libraries/Encryption_test.php b/tests/codeigniter/libraries/Encryption_test.php index cbcae3133e6..96e52ada838 100644 --- a/tests/codeigniter/libraries/Encryption_test.php +++ b/tests/codeigniter/libraries/Encryption_test.php @@ -240,6 +240,10 @@ public function test__mcrypt_get_handle() { return $this->markTestSkipped('Cannot test MCrypt because it is not available.'); } + elseif (version_compare(PHP_VERSION, '7.1.0-alpha', '>=')) + { + return $this->markTestSkipped('ext/mcrypt is deprecated since PHP 7.1 and will generate notices here.'); + } $this->assertTrue(is_resource($this->encryption->__driver_get_handle('mcrypt', 'rijndael-128', 'cbc'))); } @@ -274,6 +278,10 @@ public function test_portability() $this->markTestSkipped('Both MCrypt and OpenSSL support are required for portability tests.'); return; } + elseif (version_compare(PHP_VERSION, '7.1.0-alpha', '>=')) + { + return $this->markTestSkipped('ext/mcrypt is deprecated since PHP 7.1 and will generate notices here.'); + } $message = 'This is a message encrypted via MCrypt and decrypted via OpenSSL, or vice-versa.'; @@ -377,4 +385,4 @@ public function test_magic_get() $this->assertEquals('stream', $this->encryption->mode); } -} \ No newline at end of file +} From aed367157d396c8320e278d74227664e0af43d51 Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Mon, 22 Aug 2016 19:04:27 +0800 Subject: [PATCH 4443/5397] Standard: filtering "resource" type in hex2bin() Signed-off-by: tianhe1986 --- system/core/compat/standard.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php index c839c9bc939..6b7caa48524 100644 --- a/system/core/compat/standard.php +++ b/system/core/compat/standard.php @@ -153,7 +153,7 @@ function array_column(array $array, $column_key, $index_key = NULL) */ function hex2bin($data) { - if (in_array($type = gettype($data), array('array', 'double', 'object'), TRUE)) + if (in_array($type = gettype($data), array('array', 'double', 'object', 'resource'), TRUE)) { if ($type === 'object' && method_exists($data, '__toString')) { From fa1ca8bdee7021a67f58a5278900266c16ef7cd7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 22 Aug 2016 14:13:54 +0300 Subject: [PATCH 4444/5397] Merge pull request #4780 from tianhe1986/develop_standard_hex2bin [ci skip] Trigger error for "resource" type in hex2bin() inputs --- system/core/compat/standard.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php index c839c9bc939..6b7caa48524 100644 --- a/system/core/compat/standard.php +++ b/system/core/compat/standard.php @@ -153,7 +153,7 @@ function array_column(array $array, $column_key, $index_key = NULL) */ function hex2bin($data) { - if (in_array($type = gettype($data), array('array', 'double', 'object'), TRUE)) + if (in_array($type = gettype($data), array('array', 'double', 'object', 'resource'), TRUE)) { if ($type === 'object' && method_exists($data, '__toString')) { From 5ecf4f91caba105128405b784ceac93c1af69362 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 22 Aug 2016 14:16:33 +0300 Subject: [PATCH 4445/5397] [ci skip] Add changelog entry for PR #4780 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 97b4d254d76..aa9af21b671 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -22,6 +22,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4759) - :doc:`Form Validation `, :doc:`Trackback ` and `XML-RPC ` libraries treated URI schemes in a case-sensitive manner. - Fixed a bug (#4762) - :doc:`Cache Library ` 'file' driver method ``get_metadata()`` checked TTL time against ``mtime`` instead of the cache item's creation time. - Fixed a bug where :doc:`File Uploading Library ` generated error messages on PHP 7.1. +- Fixed a bug (#4780) - :doc:`compatibility function ` ``hex2bin()`` didn't reject inputs of type "resource". Version 3.1.0 ============= From 24ad2dd11ed66bafe3a8a9224b310d7e4b005446 Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Tue, 23 Aug 2016 17:44:21 +0800 Subject: [PATCH 4446/5397] Hash: processing algorithm name case-insensitively in hash_pbkdf2(): Signed-off-by: tianhe1986 --- system/core/compat/hash.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/core/compat/hash.php b/system/core/compat/hash.php index 6854e4c2689..6d4a0c19a1f 100644 --- a/system/core/compat/hash.php +++ b/system/core/compat/hash.php @@ -119,6 +119,7 @@ function hash_equals($known_string, $user_string) */ function hash_pbkdf2($algo, $password, $salt, $iterations, $length = 0, $raw_output = FALSE) { + $algo = strtolower($algo); if ( ! in_array($algo, hash_algos(), TRUE)) { trigger_error('hash_pbkdf2(): Unknown hashing algorithm: '.$algo, E_USER_WARNING); From 1de09516123b4ca1caeef667d58261105d854ffe Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Tue, 23 Aug 2016 18:21:35 +0800 Subject: [PATCH 4447/5397] Move strtolower() inside the is_array() check, Signed-off-by: tianhe1986 --- system/core/compat/hash.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/system/core/compat/hash.php b/system/core/compat/hash.php index 6d4a0c19a1f..d567d0f80e3 100644 --- a/system/core/compat/hash.php +++ b/system/core/compat/hash.php @@ -119,8 +119,7 @@ function hash_equals($known_string, $user_string) */ function hash_pbkdf2($algo, $password, $salt, $iterations, $length = 0, $raw_output = FALSE) { - $algo = strtolower($algo); - if ( ! in_array($algo, hash_algos(), TRUE)) + if ( ! in_array(strtolower($algo), hash_algos(), TRUE)) { trigger_error('hash_pbkdf2(): Unknown hashing algorithm: '.$algo, E_USER_WARNING); return FALSE; From a9d83fb0ddef91f0fb386cbe8bdb9cef69ca2af3 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 23 Aug 2016 14:07:11 +0300 Subject: [PATCH 4448/5397] Merge pull request #4781 from tianhe1986/develop_hash_pbkdf2 Hash: processing algorithm name case-insensitively in hash_pbkdf2() --- system/core/compat/hash.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/compat/hash.php b/system/core/compat/hash.php index 6854e4c2689..d567d0f80e3 100644 --- a/system/core/compat/hash.php +++ b/system/core/compat/hash.php @@ -119,7 +119,7 @@ function hash_equals($known_string, $user_string) */ function hash_pbkdf2($algo, $password, $salt, $iterations, $length = 0, $raw_output = FALSE) { - if ( ! in_array($algo, hash_algos(), TRUE)) + if ( ! in_array(strtolower($algo), hash_algos(), TRUE)) { trigger_error('hash_pbkdf2(): Unknown hashing algorithm: '.$algo, E_USER_WARNING); return FALSE; From 27210ea42f3aea0d2e52b2738181f3fb1170775e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B4nio?= Date: Fri, 26 Aug 2016 17:00:23 -0300 Subject: [PATCH 4449/5397] fix typo --- system/core/Security.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Security.php b/system/core/Security.php index a2907009550..3a5da4fde3c 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -230,7 +230,7 @@ public function csrf_verify() $this->csrf_show_error(); } - // We kill this since we're done and we don't want to polute the _POST array + // We kill this since we're done and we don't want to pollute the _POST array unset($_POST[$this->_csrf_token_name]); // Regenerate on every submission? From 1d0bd83d0f4b9f133bf9657113fc50d57d767762 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 29 Aug 2016 14:14:54 +0300 Subject: [PATCH 4450/5397] Merge pull request #4785 from guitarrist/develop [ci skip] Fix a comment typo --- system/core/Security.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/Security.php b/system/core/Security.php index a2907009550..3a5da4fde3c 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -230,7 +230,7 @@ public function csrf_verify() $this->csrf_show_error(); } - // We kill this since we're done and we don't want to polute the _POST array + // We kill this since we're done and we don't want to pollute the _POST array unset($_POST[$this->_csrf_token_name]); // Regenerate on every submission? From 0abc0dfca3c4e9e17da07edc864e009c13222174 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 29 Aug 2016 15:15:49 +0300 Subject: [PATCH 4451/5397] Fix #4787 --- system/libraries/Form_validation.php | 4 ++-- user_guide_src/source/changelog.rst | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 61f0298fdb7..c39b65d8924 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1229,9 +1229,9 @@ public function valid_url($str) */ public function valid_email($str) { - if (function_exists('idn_to_ascii') && $atpos = strpos($str, '@')) + if (function_exists('idn_to_ascii') && sscanf($str, '%[^@]@%s', $name, $domain) === 2) { - $str = substr($str, 0, ++$atpos).idn_to_ascii(substr($str, $atpos)); + $str = $name.'@'.idn_to_ascii($domain); } return (bool) filter_var($str, FILTER_VALIDATE_EMAIL); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index aa9af21b671..5bdcda93465 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -23,6 +23,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4762) - :doc:`Cache Library ` 'file' driver method ``get_metadata()`` checked TTL time against ``mtime`` instead of the cache item's creation time. - Fixed a bug where :doc:`File Uploading Library ` generated error messages on PHP 7.1. - Fixed a bug (#4780) - :doc:`compatibility function ` ``hex2bin()`` didn't reject inputs of type "resource". +- Fixed a bug (#4787) - :doc:`Form Validation Library ` method ``valid_email()`` triggered ``E_WARNING`` when input emails have empty domain names. Version 3.1.0 ============= From 19d033c5e32b0ab61041381c76b34f972513e525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89derson=20T=2E=20Szlachta?= Date: Mon, 29 Aug 2016 19:04:34 -0300 Subject: [PATCH 4452/5397] OpenOffice mime-types According to IANA media types : http://www.iana.org/assignments/media-types/media-types.xhtml --- application/config/mimes.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index 8bac8725111..01765333512 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -163,5 +163,21 @@ 'vcf' => 'text/x-vcard', 'srt' => array('text/srt', 'text/plain'), 'vtt' => array('text/vtt', 'text/plain'), - 'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon') + 'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'), + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'otf' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web' ); From a70b9614e71c0060700ab99bfa752fa2b9fafaed Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 30 Aug 2016 10:58:19 +0300 Subject: [PATCH 4453/5397] Merge pull request #4788 from edtsz/patch-2 Add OpenOffice mime-types to config/mimes.php --- application/config/mimes.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/application/config/mimes.php b/application/config/mimes.php index 8bac8725111..01765333512 100644 --- a/application/config/mimes.php +++ b/application/config/mimes.php @@ -163,5 +163,21 @@ 'vcf' => 'text/x-vcard', 'srt' => array('text/srt', 'text/plain'), 'vtt' => array('text/vtt', 'text/plain'), - 'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon') + 'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'), + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'otf' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web' ); From 9dc8cacf71ed228452da451b2cf216a4fa6c1cd1 Mon Sep 17 00:00:00 2001 From: intekhab Date: Fri, 9 Sep 2016 15:53:40 +0530 Subject: [PATCH 4454/5397] supplied flag to turn off mysqli SSL verification if ssl_verify passed as false --- system/database/drivers/mysqli/mysqli_driver.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index c26f975c409..2dc2a97102b 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -184,6 +184,7 @@ public function db_connect($persistent = FALSE) elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT')) { $this->_mysqli->options(MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT, TRUE); + $client_flags |= MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT; } } From 24bd981e2fdbb22064f3d89c81367f69f9e52f6a Mon Sep 17 00:00:00 2001 From: intekhab Date: Fri, 9 Sep 2016 17:45:02 +0530 Subject: [PATCH 4455/5397] Removed mysqli options function for ssl certificate verification false --- system/database/drivers/mysqli/mysqli_driver.php | 1 - 1 file changed, 1 deletion(-) diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 2dc2a97102b..cf931a35130 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -183,7 +183,6 @@ public function db_connect($persistent = FALSE) // https://bugs.php.net/bug.php?id=68344 elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT')) { - $this->_mysqli->options(MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT, TRUE); $client_flags |= MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT; } } From 676072ea1a1d5806c19cd0f76aaf9b6bf48d2741 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 9 Sep 2016 15:33:09 +0300 Subject: [PATCH 4456/5397] Merge pull request #4805 from intekhabrizvi/develop Use MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT as a connection flag instead of option --- system/database/drivers/mysqli/mysqli_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index f4597c74636..4a14eea9314 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -183,7 +183,7 @@ public function db_connect($persistent = FALSE) // https://bugs.php.net/bug.php?id=68344 elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT')) { - $this->_mysqli->options(MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT, TRUE); + $client_flags |= MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT; } } From 8c61ec2fb48dc75a19a594c5c704e6f8e186357d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 9 Sep 2016 15:35:26 +0300 Subject: [PATCH 4457/5397] [ci skip] Add changelog entry for PR #4805 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 5bdcda93465..51de7b7abec 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -24,6 +24,7 @@ Bug fixes for 3.1.1 - Fixed a bug where :doc:`File Uploading Library ` generated error messages on PHP 7.1. - Fixed a bug (#4780) - :doc:`compatibility function ` ``hex2bin()`` didn't reject inputs of type "resource". - Fixed a bug (#4787) - :doc:`Form Validation Library ` method ``valid_email()`` triggered ``E_WARNING`` when input emails have empty domain names. +- Fixed a bug (#4805) - :doc:`Database ` driver 'mysqli' didn't use the ``MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT`` flag properly. Version 3.1.0 ============= From c771ea6e0dd663e95ccbb9792a5dc82f0eb67939 Mon Sep 17 00:00:00 2001 From: Hex Date: Mon, 12 Sep 2016 14:30:56 +0800 Subject: [PATCH 4458/5397] Fix small doc problem. --- user_guide_src/source/installation/upgrade_210.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/installation/upgrade_210.rst b/user_guide_src/source/installation/upgrade_210.rst index 866dcf4aefa..42143545239 100644 --- a/user_guide_src/source/installation/upgrade_210.rst +++ b/user_guide_src/source/installation/upgrade_210.rst @@ -17,10 +17,10 @@ Step 2: Replace config/mimes.php ================================ This config file has been updated to contain more user agent types, -please copy it to _application/config/mimes.php*. +please copy it to *application/config/mimes.php*. Step 3: Update your user guide ============================== Please also replace your local copy of the user guide with the new -version. \ No newline at end of file +version. From 5f693cb38769b973f89cb8a40b43bb15ef3cd9cf Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 12 Sep 2016 12:35:57 +0300 Subject: [PATCH 4459/5397] Merge pull request #4806 from hex-ci/patch-1 [ci skip] Fix formatting in 2.1.0 upgrade instructions --- user_guide_src/source/installation/upgrade_210.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/installation/upgrade_210.rst b/user_guide_src/source/installation/upgrade_210.rst index 866dcf4aefa..42143545239 100644 --- a/user_guide_src/source/installation/upgrade_210.rst +++ b/user_guide_src/source/installation/upgrade_210.rst @@ -17,10 +17,10 @@ Step 2: Replace config/mimes.php ================================ This config file has been updated to contain more user agent types, -please copy it to _application/config/mimes.php*. +please copy it to *application/config/mimes.php*. Step 3: Update your user guide ============================== Please also replace your local copy of the user guide with the new -version. \ No newline at end of file +version. From 442ea6861a5fdfb9780e79b00875e55cdab3f6ff Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 16 Sep 2016 11:51:25 +0300 Subject: [PATCH 4460/5397] [ci skip] Fix #4808 --- system/database/drivers/odbc/odbc_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php | 2 +- system/database/drivers/postgre/postgre_driver.php | 2 +- user_guide_src/source/changelog.rst | 1 + 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 63df2963de9..dbce1cf79ff 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -298,7 +298,7 @@ protected function _trans_rollback() */ public function is_write_type($sql) { - if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) { return FALSE; } diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php index 82554ec8029..ebe1ed6f0b0 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php @@ -181,7 +181,7 @@ protected function _escape_str($str) */ public function is_write_type($sql) { - if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) { return FALSE; } diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php index ee8f76348cb..9483d24571c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php @@ -154,7 +154,7 @@ public function insert_id($name = NULL) */ public function is_write_type($sql) { - if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) { return FALSE; } diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 58d4451874e..dfd87f95ad6 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -288,7 +288,7 @@ protected function _trans_rollback() */ public function is_write_type($sql) { - if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#i', $sql)) + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) { return FALSE; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 51de7b7abec..2c8a131ff33 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -25,6 +25,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4780) - :doc:`compatibility function ` ``hex2bin()`` didn't reject inputs of type "resource". - Fixed a bug (#4787) - :doc:`Form Validation Library ` method ``valid_email()`` triggered ``E_WARNING`` when input emails have empty domain names. - Fixed a bug (#4805) - :doc:`Database ` driver 'mysqli' didn't use the ``MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT`` flag properly. +- Fixed a bug (#4808) - :doc:`Database ` method ``is_write_type()`` only looked at the first line of a queries using ``RETURNING`` with the 'postgre', 'pdo/pgsql', 'odbc' and 'pdo/odbc' drivers. Version 3.1.0 ============= From 0a4dd844b8a3d6edb7712d3bb4edf1b4f0e9dc4c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 16 Sep 2016 12:06:40 +0300 Subject: [PATCH 4461/5397] [ci skip] Don't try to insert_batch() when we know it's not supported on Firebird --- system/database/drivers/ibase/ibase_driver.php | 17 +++++++++++++++++ .../pdo/subdrivers/pdo_firebird_driver.php | 16 ++++++++++++++++ user_guide_src/source/changelog.rst | 1 + 3 files changed, 34 insertions(+) diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php index c1055c1e6a8..671a353bc1e 100644 --- a/system/database/drivers/ibase/ibase_driver.php +++ b/system/database/drivers/ibase/ibase_driver.php @@ -383,6 +383,23 @@ protected function _limit($sql) // -------------------------------------------------------------------- + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string|bool + */ + protected function _insert_batch($table, $keys, $values) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + // -------------------------------------------------------------------- + /** * Close DB Connection * diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php index 96dcc5ec172..7811d3da4f8 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php @@ -260,4 +260,20 @@ protected function _limit($sql) return preg_replace('`SELECT`i', 'SELECT '.$select, $sql); } + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string|bool + */ + protected function _insert_batch($table, $keys, $values) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2c8a131ff33..d99e4427622 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -26,6 +26,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4787) - :doc:`Form Validation Library ` method ``valid_email()`` triggered ``E_WARNING`` when input emails have empty domain names. - Fixed a bug (#4805) - :doc:`Database ` driver 'mysqli' didn't use the ``MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT`` flag properly. - Fixed a bug (#4808) - :doc:`Database ` method ``is_write_type()`` only looked at the first line of a queries using ``RETURNING`` with the 'postgre', 'pdo/pgsql', 'odbc' and 'pdo/odbc' drivers. +- Fixed a bug where :doc:`Query Builder ` method ``insert_batch()`` tried to execute an unsupported SQL query with the 'ibase' and 'pdo/firebird' drivers. Version 3.1.0 ============= From fd8d3987226bcde81db0682eee9c9acca0beb9a1 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Sun, 25 Sep 2016 19:52:58 +0300 Subject: [PATCH 4462/5397] - captcha helper uses now filemtime to get file timestamp - captcha generated files are a sha1 of current timestamp and word - changed the usage of microtime to time, as this is a more realistic approach Signed-off-by: George Petculescu --- system/helpers/captcha_helper.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 3c1e006f8b5..c2a1dcfbd17 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -105,12 +105,13 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = // Remove old images // ----------------------------------- - $now = microtime(TRUE); + $now = time(); $current_dir = @opendir($img_path); while ($filename = @readdir($current_dir)) { - if (substr($filename, -4) === '.jpg' && (str_replace('.jpg', '', $filename) + $expiration) < $now) + if (in_array(substr($filename, -4), array('.jpg', '.png')) + && (filemtime($img_path.$filename) + $expiration) < $now) { @unlink($img_path.$filename); } @@ -319,12 +320,12 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = if (function_exists('imagejpeg')) { - $img_filename = $now.'.jpg'; + $img_filename = sha1($now.$word).'.jpg'; imagejpeg($im, $img_path.$img_filename); } elseif (function_exists('imagepng')) { - $img_filename = $now.'.png'; + $img_filename = sha1($now.$word).'.png'; imagepng($im, $img_path.$img_filename); } else From 8d684c23364f2fd28700e0a5ae2e90dd7fab61fe Mon Sep 17 00:00:00 2001 From: Edwin Smulders Date: Tue, 27 Sep 2016 11:02:39 +0200 Subject: [PATCH 4463/5397] Remove inline styles from hidden form input This change fixes console errors when using a CSP header that disables inline styles. --- system/helpers/form_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 8825ecc2c4e..aa7379f77bf 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -100,7 +100,7 @@ function form_open($action = '', $attributes = array(), $hidden = array()) { foreach ($hidden as $name => $value) { - $form .= ''."\n"; + $form .= ''."\n"; } } From 7a49c0b0f12121be39001a13a97bd608f6a30a7a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 27 Sep 2016 14:00:26 +0300 Subject: [PATCH 4464/5397] Merge pull request #4810 from Dutchy-/patch-1 Remove inline style from form_open() hidden fields --- system/helpers/form_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 8825ecc2c4e..aa7379f77bf 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -100,7 +100,7 @@ function form_open($action = '', $attributes = array(), $hidden = array()) { foreach ($hidden as $name => $value) { - $form .= ''."\n"; + $form .= ''."\n"; } } From 8a15f5af819424087b6676709d98de6fa5fc6115 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 27 Sep 2016 14:12:05 +0300 Subject: [PATCH 4465/5397] Fix #4809 --- .../pdo/subdrivers/pdo_mysql_driver.php | 49 +++++++++++++++++++ user_guide_src/source/changelog.rst | 1 + 2 files changed, 50 insertions(+) diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php index 3631cdf7a61..6452b787bfd 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -215,6 +215,55 @@ public function db_select($database = '') // -------------------------------------------------------------------- + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE); + return $this->conn_id->beginTransaction(); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + if ($this->conn_id->commit()) + { + $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + if ($this->conn_id->rollBack()) + { + $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + /** * Show table query * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d99e4427622..d41e79945e4 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -27,6 +27,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4805) - :doc:`Database ` driver 'mysqli' didn't use the ``MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT`` flag properly. - Fixed a bug (#4808) - :doc:`Database ` method ``is_write_type()`` only looked at the first line of a queries using ``RETURNING`` with the 'postgre', 'pdo/pgsql', 'odbc' and 'pdo/odbc' drivers. - Fixed a bug where :doc:`Query Builder ` method ``insert_batch()`` tried to execute an unsupported SQL query with the 'ibase' and 'pdo/firebird' drivers. +- Fixed a bug (#4809) - :doc:`Database ` driver 'pdo/mysql' didn't turn off ``AUTOCOMMIT`` when starting a transaction. Version 3.1.0 ============= From eea02de557834006c5d6a0bfccca7f39e75bf3a8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 27 Sep 2016 14:59:37 +0300 Subject: [PATCH 4466/5397] Fix entity_decode() issue --- system/core/Security.php | 39 +++++++++++++----------- tests/codeigniter/core/Security_test.php | 6 ++++ user_guide_src/source/changelog.rst | 4 +++ 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/system/core/Security.php b/system/core/Security.php index 3a5da4fde3c..4a69daa181b 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -669,6 +669,22 @@ public function entity_decode($str, $charset = NULL) ? ENT_COMPAT | ENT_HTML5 : ENT_COMPAT; + if ( ! isset($_entities)) + { + $_entities = array_map('strtolower', get_html_translation_table(HTML_ENTITIES, $flag, $charset)); + + // If we're not on PHP 5.4+, add the possibly dangerous HTML 5 + // entities to the array manually + if ($flag === ENT_COMPAT) + { + $_entities[':'] = ':'; + $_entities['('] = '('; + $_entities[')'] = ')'; + $_entities["\n"] = ' '; + $_entities["\t"] = ' '; + } + } + do { $str_compare = $str; @@ -676,22 +692,6 @@ public function entity_decode($str, $charset = NULL) // Decode standard entities, avoiding false positives if (preg_match_all('/&[a-z]{2,}(?![a-z;])/i', $str, $matches)) { - if ( ! isset($_entities)) - { - $_entities = array_map('strtolower', get_html_translation_table(HTML_ENTITIES, $flag, $charset)); - - // If we're not on PHP 5.4+, add the possibly dangerous HTML 5 - // entities to the array manually - if ($flag === ENT_COMPAT) - { - $_entities[':'] = ':'; - $_entities['('] = '('; - $_entities[')'] = ')'; - $_entities["\n"] = '&newline;'; - $_entities["\t"] = '&tab;'; - } - } - $replace = array(); $matches = array_unique(array_map('strtolower', $matches[0])); foreach ($matches as &$match) @@ -702,7 +702,7 @@ public function entity_decode($str, $charset = NULL) } } - $str = str_ireplace(array_keys($replace), array_values($replace), $str); + $str = str_replace(array_keys($replace), array_values($replace), $str); } // Decode numeric & UTF16 two byte entities @@ -711,6 +711,11 @@ public function entity_decode($str, $charset = NULL) $flag, $charset ); + + if ($flag === ENT_COMPAT) + { + $str = str_replace(array_values($_entities), array_keys($_entities), $str); + } } while ($str_compare !== $str); return $str; diff --git a/tests/codeigniter/core/Security_test.php b/tests/codeigniter/core/Security_test.php index 8328c37cbc9..cbf0285ecd9 100644 --- a/tests/codeigniter/core/Security_test.php +++ b/tests/codeigniter/core/Security_test.php @@ -270,6 +270,12 @@ public function test_entity_decode() $this->assertEquals('
    Hello Booya
    ', $decoded); + $this->assertEquals('colon:', $this->security->entity_decode('colon:')); + $this->assertEquals("NewLine\n", $this->security->entity_decode('NewLine ')); + $this->assertEquals("Tab\t", $this->security->entity_decode('Tab ')); + $this->assertEquals("lpar(", $this->security->entity_decode('lpar(')); + $this->assertEquals("rpar)", $this->security->entity_decode('rpar)')); + // Issue #3057 (https://github.com/bcit-ci/CodeIgniter/issues/3057) $this->assertEquals( '&foo should not include a semicolon', diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d41e79945e4..a0ed34a2f03 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,10 @@ Version 3.1.1 Release Date: Not Released +- **Security** + + - Fixed a flaw in :doc:`Security Library ` method ``entity_decode()`` (used by ``xss_clean()``) that affects HTML 5 entities when using PHP 5.3. + - General Changes - Added ``E_PARSE`` to the list of error levels detected by the shutdown handler. From 7ed227b9075498e307c91a3ae0345755f935a520 Mon Sep 17 00:00:00 2001 From: logach Date: Tue, 27 Sep 2016 15:56:22 +0300 Subject: [PATCH 4467/5397] Add database index by default Select database if exists --- system/libraries/Cache/drivers/Cache_redis.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index ec443243791..2d1ead45213 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -58,7 +58,8 @@ class CI_Cache_redis extends CI_Driver 'host' => '127.0.0.1', 'password' => NULL, 'port' => 6379, - 'timeout' => 0 + 'timeout' => 0, + 'database' => 0 ); /** @@ -113,6 +114,11 @@ public function __construct() { log_message('error', 'Cache: Redis authentication failed.'); } + + if (isset($config['database']) && $config['database'] > 0 && ! $this->_redis->select($config['database'])) + { + log_message('error', 'Cache: Redis select database failed.'); + } } catch (RedisException $e) { From 49ef8402ffed15fd7d6cbf18f0dd5b04352344dd Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 27 Sep 2016 16:36:37 +0300 Subject: [PATCH 4468/5397] [ci skip] Add changelog entry for PR #4821 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 35dc7647624..484e6a13b90 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -18,6 +18,7 @@ Release Date: Not Released - :doc:`Cache Library ` changes include: - Added UNIX socket connection support to the 'memcached' driver. + - Added 'database' configuration option to the 'redis' driver, allowing to auto-select another database. - Changed the 'memcached' driver to ignore configurations that don't specify a hostname. - Removed the *socket_type* configuration setting from the 'redis' driver. - Changed data serialization logic in 'redis' driver for better performance. From 6ed047335d216a74162aab488002239235dfe95e Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Tue, 27 Sep 2016 20:07:58 +0300 Subject: [PATCH 4469/5397] - revert --- system/helpers/captcha_helper.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index c2a1dcfbd17..3c1e006f8b5 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -105,13 +105,12 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = // Remove old images // ----------------------------------- - $now = time(); + $now = microtime(TRUE); $current_dir = @opendir($img_path); while ($filename = @readdir($current_dir)) { - if (in_array(substr($filename, -4), array('.jpg', '.png')) - && (filemtime($img_path.$filename) + $expiration) < $now) + if (substr($filename, -4) === '.jpg' && (str_replace('.jpg', '', $filename) + $expiration) < $now) { @unlink($img_path.$filename); } @@ -320,12 +319,12 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = if (function_exists('imagejpeg')) { - $img_filename = sha1($now.$word).'.jpg'; + $img_filename = $now.'.jpg'; imagejpeg($im, $img_path.$img_filename); } elseif (function_exists('imagepng')) { - $img_filename = sha1($now.$word).'.png'; + $img_filename = $now.'.png'; imagepng($im, $img_path.$img_filename); } else From 89eb04b5f09f4d7fb2d319e417bc188f0ed915d0 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Tue, 27 Sep 2016 20:25:43 +0300 Subject: [PATCH 4470/5397] - captcha helper will now look for .png files too when deleting old files --- system/helpers/captcha_helper.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 3c1e006f8b5..f6c42b4f707 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -110,7 +110,8 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = $current_dir = @opendir($img_path); while ($filename = @readdir($current_dir)) { - if (substr($filename, -4) === '.jpg' && (str_replace('.jpg', '', $filename) + $expiration) < $now) + if (in_array(substr($filename, -4), array('.jpg', '.png')) + && (str_replace(array('.jpg', '.png'), '', $filename) + $expiration) < $now) { @unlink($img_path.$filename); } From f394b9e0a764d47532363cae8f3e491718fcf8fa Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Tue, 27 Sep 2016 20:28:24 +0300 Subject: [PATCH 4471/5397] - fixed identation --- system/helpers/captcha_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index f6c42b4f707..f2ff4dccf14 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -111,7 +111,7 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = while ($filename = @readdir($current_dir)) { if (in_array(substr($filename, -4), array('.jpg', '.png')) - && (str_replace(array('.jpg', '.png'), '', $filename) + $expiration) < $now) + && (str_replace(array('.jpg', '.png'), '', $filename) + $expiration) < $now) { @unlink($img_path.$filename); } From e36664c07896a9a9ef69daad5dc9f880ea08e5c4 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Thu, 29 Sep 2016 00:01:59 +0300 Subject: [PATCH 4472/5397] - download helper uses better file buffering when the content of a local file is output'd --- system/helpers/download_helper.php | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index a6463dfd754..3701e0b8b95 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -121,11 +121,6 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) $filename = implode('.', $x); } - if ($data === NULL && ($fp = @fopen($filepath, 'rb')) === FALSE) - { - return; - } - // Clean output buffer if (ob_get_level() !== 0 && @ob_end_clean() === FALSE) { @@ -146,13 +141,12 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) exit($data); } - // Flush 1MB chunks of data - while ( ! feof($fp) && ($data = fread($fp, 1048576)) !== FALSE) - { - echo $data; - } + // Flush the file + if (@readfile($filepath) === FALSE) + { + return; + } - fclose($fp); exit; } } From bdf21c4e4cae0c232661f783c2f7070a03a7a912 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Thu, 29 Sep 2016 00:26:46 +0300 Subject: [PATCH 4473/5397] - reverting changes, wrong branch selected. --- system/helpers/download_helper.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 3701e0b8b95..a6463dfd754 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -121,6 +121,11 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) $filename = implode('.', $x); } + if ($data === NULL && ($fp = @fopen($filepath, 'rb')) === FALSE) + { + return; + } + // Clean output buffer if (ob_get_level() !== 0 && @ob_end_clean() === FALSE) { @@ -141,12 +146,13 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) exit($data); } - // Flush the file - if (@readfile($filepath) === FALSE) - { - return; - } + // Flush 1MB chunks of data + while ( ! feof($fp) && ($data = fread($fp, 1048576)) !== FALSE) + { + echo $data; + } + fclose($fp); exit; } } From 7e669e67636a1d5cb10fa4288cdb9b0c39ad2124 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 30 Sep 2016 12:23:03 +0300 Subject: [PATCH 4474/5397] Merge pull request #4822 from gxgpet/develop Fix PNG file deletion on captcha helper --- system/helpers/captcha_helper.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index 3c1e006f8b5..f2ff4dccf14 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -110,7 +110,8 @@ function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = $current_dir = @opendir($img_path); while ($filename = @readdir($current_dir)) { - if (substr($filename, -4) === '.jpg' && (str_replace('.jpg', '', $filename) + $expiration) < $now) + if (in_array(substr($filename, -4), array('.jpg', '.png')) + && (str_replace(array('.jpg', '.png'), '', $filename) + $expiration) < $now) { @unlink($img_path.$filename); } From 386e8e0356a50b0f5ef18632533b9410613b9f65 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 30 Sep 2016 12:26:27 +0300 Subject: [PATCH 4475/5397] [ci skip] Add a changelog entry for #4822 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d41e79945e4..2f08de07236 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -28,6 +28,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4808) - :doc:`Database ` method ``is_write_type()`` only looked at the first line of a queries using ``RETURNING`` with the 'postgre', 'pdo/pgsql', 'odbc' and 'pdo/odbc' drivers. - Fixed a bug where :doc:`Query Builder ` method ``insert_batch()`` tried to execute an unsupported SQL query with the 'ibase' and 'pdo/firebird' drivers. - Fixed a bug (#4809) - :doc:`Database ` driver 'pdo/mysql' didn't turn off ``AUTOCOMMIT`` when starting a transaction. +- Fixed a bug (#4822) - :doc:`CAPTCHA Helper ` didn't clear expired PNG images. Version 3.1.0 ============= From 826b6196b748c2c1ccca0dbb5703fd50c600afa5 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Fri, 30 Sep 2016 21:34:44 +0300 Subject: [PATCH 4476/5397] - download helper uses better file buffering when the content of a local file is output'd --- system/helpers/download_helper.php | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index a6463dfd754..7f5c2397a85 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -121,11 +121,6 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) $filename = implode('.', $x); } - if ($data === NULL && ($fp = @fopen($filepath, 'rb')) === FALSE) - { - return; - } - // Clean output buffer if (ob_get_level() !== 0 && @ob_end_clean() === FALSE) { @@ -146,13 +141,12 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) exit($data); } - // Flush 1MB chunks of data - while ( ! feof($fp) && ($data = fread($fp, 1048576)) !== FALSE) + // Flush the file + if (@readfile($filepath) === FALSE) { - echo $data; + return; } - fclose($fp); exit; } } From 8800fedd37be6fe4267ed7635fc536ff91a94c62 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Sat, 1 Oct 2016 10:10:04 +0300 Subject: [PATCH 4477/5397] - small fix for HTML Table library: caption is not clearing properly and method chaining has been fixed for set_caption method. --- system/libraries/Table.php | 2 ++ user_guide_src/source/libraries/table.rst | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/system/libraries/Table.php b/system/libraries/Table.php index 3bce294d8c4..37a639d1db5 100644 --- a/system/libraries/Table.php +++ b/system/libraries/Table.php @@ -277,6 +277,7 @@ protected function _prep_args($args) public function set_caption($caption) { $this->caption = $caption; + return $this; } // -------------------------------------------------------------------- @@ -426,6 +427,7 @@ public function clear() $this->rows = array(); $this->heading = array(); $this->auto_heading = TRUE; + $this->caption = NULL; return $this; } diff --git a/user_guide_src/source/libraries/table.rst b/user_guide_src/source/libraries/table.rst index 91ae1ae8dbd..fb6fefadbce 100644 --- a/user_guide_src/source/libraries/table.rst +++ b/user_guide_src/source/libraries/table.rst @@ -275,11 +275,12 @@ Class Reference :returns: CI_Table instance (method chaining) :rtype: CI_Table - Lets you clear the table heading and row data. If you need to show multiple tables with different data you should to call this method + Lets you clear the table heading, row data, and the caption. If you need to show multiple tables with different data you should to call this method after each table has been generated to clear the previous table information. Example:: $this->load->library('table'); + $this->table->set_caption('Preferences'); $this->table->set_heading('Name', 'Color', 'Size'); $this->table->add_row('Fred', 'Blue', 'Small'); $this->table->add_row('Mary', 'Red', 'Large'); @@ -289,6 +290,7 @@ Class Reference $this->table->clear(); + $this->table->set_caption('Shipping'); $this->table->set_heading('Name', 'Day', 'Delivery'); $this->table->add_row('Fred', 'Wednesday', 'Express'); $this->table->add_row('Mary', 'Monday', 'Air'); From 4cf8d4d4b2e4a5cb09b65a8ab4f6f4c2f59b4b1e Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Sat, 1 Oct 2016 10:11:33 +0300 Subject: [PATCH 4478/5397] - fixed codingstyle --- system/libraries/Table.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Table.php b/system/libraries/Table.php index 37a639d1db5..08e530800b9 100644 --- a/system/libraries/Table.php +++ b/system/libraries/Table.php @@ -427,7 +427,7 @@ public function clear() $this->rows = array(); $this->heading = array(); $this->auto_heading = TRUE; - $this->caption = NULL; + $this->caption = NULL; return $this; } From e67855fffea9496e2aaf8bdd1bdcc9a891986186 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Sat, 1 Oct 2016 10:13:08 +0300 Subject: [PATCH 4479/5397] - fixed codingstyle (2) ... --- system/libraries/Table.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Table.php b/system/libraries/Table.php index 08e530800b9..2f1b3b41404 100644 --- a/system/libraries/Table.php +++ b/system/libraries/Table.php @@ -277,7 +277,7 @@ protected function _prep_args($args) public function set_caption($caption) { $this->caption = $caption; - return $this; + return $this; } // -------------------------------------------------------------------- From 103a4263fe8c2715f622355ee7d76114d015f242 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 3 Oct 2016 11:19:11 +0300 Subject: [PATCH 4480/5397] Fix #4823 --- .../Session/drivers/Session_files_driver.php | 27 +++++++++++++++++-- user_guide_src/source/changelog.rst | 1 + 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index bf4df8b208f..5f05396c0cf 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -76,6 +76,13 @@ class CI_Session_files_driver extends CI_Session_driver implements SessionHandle */ protected $_file_new; + /** + * mbstring.func_override flag + * + * @var bool + */ + protected static $func_override; + // ------------------------------------------------------------------------ /** @@ -98,6 +105,8 @@ public function __construct(&$params) log_message('debug', 'Session: "sess_save_path" is empty; using "session.save_path" value from php.ini.'); $this->_config['save_path'] = rtrim(ini_get('session.save_path'), '/\\'); } + + isset(self::$func_override) OR self::$func_override = (extension_loaded('mbstring') && ini_get('mbstring.func_override')); } // ------------------------------------------------------------------------ @@ -187,7 +196,7 @@ public function read($session_id) } $session_data = ''; - for ($read = 0, $length = filesize($this->_file_path.$session_id); $read < $length; $read += strlen($buffer)) + for ($read = 0, $length = filesize($this->_file_path.$session_id); $read < $length; $read += self::strlen($buffer)) { if (($buffer = fread($this->_file_handle, $length - $read)) === FALSE) { @@ -368,4 +377,18 @@ public function gc($maxlifetime) return $this->_success; } -} \ No newline at end of file + // -------------------------------------------------------------------- + + /** + * Byte-safe strlen() + * + * @param string $str + * @return int + */ + protected static function strlen($str) + { + return (self::$func_override) + ? mb_strlen($str, '8bit') + : strlen($str); + } +} diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2f08de07236..080b51c68f9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -29,6 +29,7 @@ Bug fixes for 3.1.1 - Fixed a bug where :doc:`Query Builder ` method ``insert_batch()`` tried to execute an unsupported SQL query with the 'ibase' and 'pdo/firebird' drivers. - Fixed a bug (#4809) - :doc:`Database ` driver 'pdo/mysql' didn't turn off ``AUTOCOMMIT`` when starting a transaction. - Fixed a bug (#4822) - :doc:`CAPTCHA Helper ` didn't clear expired PNG images. +- Fixed a bug (#4823) - :doc:`Session Library ` 'files' driver could enter an infinite loop if ``mbstring.func_override`` is enabled. Version 3.1.0 ============= From 8dc32005f0364a07a0d472106e350826c651ea8d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 3 Oct 2016 11:19:49 +0300 Subject: [PATCH 4481/5397] [ci skip] Alter a docblock --- system/libraries/Encryption.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Encryption.php b/system/libraries/Encryption.php index 06284c2ed49..545081b3b76 100644 --- a/system/libraries/Encryption.php +++ b/system/libraries/Encryption.php @@ -907,7 +907,7 @@ public function __get($key) * Byte-safe strlen() * * @param string $str - * @return integer + * @return int */ protected static function strlen($str) { From bc838a9b08d6dae677ba036c2f640358843b14b2 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Fri, 7 Oct 2016 17:56:31 +0300 Subject: [PATCH 4482/5397] - fixed small typo --- user_guide_src/source/libraries/table.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/table.rst b/user_guide_src/source/libraries/table.rst index fb6fefadbce..3cd120f953c 100644 --- a/user_guide_src/source/libraries/table.rst +++ b/user_guide_src/source/libraries/table.rst @@ -275,7 +275,7 @@ Class Reference :returns: CI_Table instance (method chaining) :rtype: CI_Table - Lets you clear the table heading, row data, and the caption. If you need to show multiple tables with different data you should to call this method + Lets you clear the table heading, row data and the caption. If you need to show multiple tables with different data you should to call this method after each table has been generated to clear the previous table information. Example:: $this->load->library('table'); From 7e302394b21ea16b2dce9c42d4431a180c4a58aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20de=20Kat?= Date: Mon, 10 Oct 2016 14:46:23 +0100 Subject: [PATCH 4483/5397] Updated list of words that aren't countable Updated list of words that are the same in plural and singular form in English. --- system/helpers/inflector_helper.php | 33 +++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index c064d8de470..6dc3b50308c 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -238,8 +238,37 @@ function is_countable($word) return ! in_array( strtolower($word), array( - 'equipment', 'information', 'rice', 'money', - 'species', 'series', 'fish', 'meta' + 'audio', + 'bison', + 'chassis', + 'compensation', + 'coreopsis', + 'data', + 'deer', + 'education', + 'emoji', + 'equipment', + 'fish', + 'furniture', + 'gold', + 'information', + 'knowledge', + 'love', + 'rain', + 'money', + 'moose', + 'nutrition', + 'offspring', + 'plankton', + 'pokemon', + 'police', + 'rice', + 'series', + 'sheep', + 'species', + 'swine', + 'traffic', + 'wheat', ) ); } From 6b33b232aa21f4db38ead696321287768751cfd1 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Mon, 10 Oct 2016 19:25:25 +0300 Subject: [PATCH 4484/5397] - revert: set_caption method chaining will be fixed lately. --- system/libraries/Table.php | 1 - 1 file changed, 1 deletion(-) diff --git a/system/libraries/Table.php b/system/libraries/Table.php index 2f1b3b41404..c9851813a7b 100644 --- a/system/libraries/Table.php +++ b/system/libraries/Table.php @@ -277,7 +277,6 @@ protected function _prep_args($args) public function set_caption($caption) { $this->caption = $caption; - return $this; } // -------------------------------------------------------------------- From 727051267a83f6781745316ea4b749af09c8737f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 11 Oct 2016 15:18:40 +0300 Subject: [PATCH 4485/5397] Merge pull request #4834 from renedekat/patch-1 Updated list of words that aren't countable in is_countable() inflector helper --- system/helpers/inflector_helper.php | 33 +++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index c064d8de470..6dc3b50308c 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -238,8 +238,37 @@ function is_countable($word) return ! in_array( strtolower($word), array( - 'equipment', 'information', 'rice', 'money', - 'species', 'series', 'fish', 'meta' + 'audio', + 'bison', + 'chassis', + 'compensation', + 'coreopsis', + 'data', + 'deer', + 'education', + 'emoji', + 'equipment', + 'fish', + 'furniture', + 'gold', + 'information', + 'knowledge', + 'love', + 'rain', + 'money', + 'moose', + 'nutrition', + 'offspring', + 'plankton', + 'pokemon', + 'police', + 'rice', + 'series', + 'sheep', + 'species', + 'swine', + 'traffic', + 'wheat', ) ); } From 5e22caa8d00165a63999cd828739f71758fba4e2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 11 Oct 2016 15:20:27 +0300 Subject: [PATCH 4486/5397] [ci skip] Add changelog entry for PR #4834 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 080b51c68f9..07815e85154 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -10,6 +10,7 @@ Release Date: Not Released - General Changes - Added ``E_PARSE`` to the list of error levels detected by the shutdown handler. + - Updated :doc:`Inflector Helper ` function ``is_countable()`` with more words. Bug fixes for 3.1.1 ------------------- From f2f6d8a70ca35930da798c1e2da134c810a17158 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 11 Oct 2016 16:00:57 +0300 Subject: [PATCH 4487/5397] [ci skip] Add new HTTP status codes https://tools.ietf.org/html/rfc2817 https://tools.ietf.org/html/rfc6585 Requested in #4835 --- system/core/Common.php | 7 ++++++- user_guide_src/source/changelog.rst | 7 +++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/system/core/Common.php b/system/core/Common.php index 2c7651943c1..257763dd330 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -544,13 +544,18 @@ function set_status_header($code = 200, $text = '') 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 422 => 'Unprocessable Entity', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported' + 505 => 'HTTP Version Not Supported', + 511 => 'Network Authentication Required', ); if (isset($stati[$code])) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 07815e85154..019adad91a4 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -10,7 +10,10 @@ Release Date: Not Released - General Changes - Added ``E_PARSE`` to the list of error levels detected by the shutdown handler. - - Updated :doc:`Inflector Helper ` function ``is_countable()`` with more words. + - Updated :doc:`Inflector Helper ` :php:func:`is_countable()` with more words. + - Updated :doc:`common function ` :php:func:`set_status_header()` with new status codes from IETF RFCs + `2817 https://tools.ietf.org/html/rfc2817>`_ (426) + and `6585 `_ (428, 429, 431, 511). Bug fixes for 3.1.1 ------------------- @@ -40,7 +43,7 @@ Release Date: July 26, 2016 - **Security** - Fixed an SQL injection in the 'odbc' database driver. - - Updated :php:func:`set_realpath()` :doc:`Path Helpr ` function to filter-out ``php://`` wrapper inputs. + - Updated :php:func:`set_realpath()` :doc:`Path Helper ` function to filter-out ``php://`` wrapper inputs. - Officially dropped any kind of support for PHP 5.2.x and anything under 5.3.7. - General Changes From af88d57cf07e54f996d84da1926f252e963fa49b Mon Sep 17 00:00:00 2001 From: ihatehandles Date: Wed, 12 Oct 2016 05:25:24 +0200 Subject: [PATCH 4488/5397] Fixed typos --- user_guide_src/source/general/cli.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user_guide_src/source/general/cli.rst b/user_guide_src/source/general/cli.rst index b45be1aa8d0..764a6b8350d 100644 --- a/user_guide_src/source/general/cli.rst +++ b/user_guide_src/source/general/cli.rst @@ -47,11 +47,11 @@ in it:: Then save the file to your *application/controllers/* folder. -Now normally you would visit the your site using a URL similar to this:: +Now normally you would visit the site using a URL similar to this:: example.com/index.php/tools/message/to -Instead, we are going to open Terminal in Mac/Linux or go to Run > "cmd" +Instead, we are going to open the terminal in Mac/Linux or go to Run > "cmd" in Windows and navigate to our CodeIgniter project. .. code-block:: bash @@ -75,4 +75,4 @@ That's it! That, in a nutshell, is all there is to know about controllers on the command line. Remember that this is just a normal controller, so routing -and ``_remap()`` works fine. \ No newline at end of file +and ``_remap()`` works fine. From c34a3d6d052d2b7ba7955ea2bc70039ce0405b68 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 14 Oct 2016 14:23:10 +0300 Subject: [PATCH 4489/5397] Merge pull request #4840 from ihatehandles/patch-2 [ci skip] Fixed some typos --- user_guide_src/source/general/cli.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user_guide_src/source/general/cli.rst b/user_guide_src/source/general/cli.rst index b45be1aa8d0..764a6b8350d 100644 --- a/user_guide_src/source/general/cli.rst +++ b/user_guide_src/source/general/cli.rst @@ -47,11 +47,11 @@ in it:: Then save the file to your *application/controllers/* folder. -Now normally you would visit the your site using a URL similar to this:: +Now normally you would visit the site using a URL similar to this:: example.com/index.php/tools/message/to -Instead, we are going to open Terminal in Mac/Linux or go to Run > "cmd" +Instead, we are going to open the terminal in Mac/Linux or go to Run > "cmd" in Windows and navigate to our CodeIgniter project. .. code-block:: bash @@ -75,4 +75,4 @@ That's it! That, in a nutshell, is all there is to know about controllers on the command line. Remember that this is just a normal controller, so routing -and ``_remap()`` works fine. \ No newline at end of file +and ``_remap()`` works fine. From da270b26d7cb9c55385150659ecfb7d2d97b4c63 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 17 Oct 2016 18:22:43 +0300 Subject: [PATCH 4490/5397] Fix #4851 --- system/database/DB_forge.php | 4 ++-- system/database/drivers/ibase/ibase_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php | 2 +- system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php | 4 ++-- system/database/drivers/sqlite/sqlite_forge.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_forge.php | 4 ++-- user_guide_src/source/changelog.rst | 1 + 7 files changed, 11 insertions(+), 10 deletions(-) diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index 826aa1ebfe4..ed6f4b672bc 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -184,7 +184,7 @@ public function create_database($db_name) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } - elseif ( ! $this->db->query(sprintf($this->_create_database, $db_name, $this->db->char_set, $this->db->dbcollat))) + elseif ( ! $this->db->query(sprintf($this->_create_database, $this->db->escape_identifiers($db_name), $this->db->char_set, $this->db->dbcollat))) { return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; } @@ -211,7 +211,7 @@ public function drop_database($db_name) { return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; } - elseif ( ! $this->db->query(sprintf($this->_drop_database, $db_name))) + elseif ( ! $this->db->query(sprintf($this->_drop_database, $this->db->escape_identifiers($db_name)))) { return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; } diff --git a/system/database/drivers/ibase/ibase_forge.php b/system/database/drivers/ibase/ibase_forge.php index 9c358c36537..b35cc3749fa 100644 --- a/system/database/drivers/ibase/ibase_forge.php +++ b/system/database/drivers/ibase/ibase_forge.php @@ -111,7 +111,7 @@ public function create_database($db_name) * @param string $db_name (ignored) * @return bool */ - public function drop_database($db_name = '') + public function drop_database($db_name) { if ( ! ibase_drop_db($this->conn_id)) { diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php index 256fa1413c6..50df76905f3 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php @@ -97,7 +97,7 @@ public function create_database($db_name) * @param string $db_name (ignored) * @return bool */ - public function drop_database($db_name = '') + public function drop_database($db_name) { if ( ! ibase_drop_db($this->conn_id)) { diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php index f6f9bb4813e..b124bcad16a 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php @@ -101,7 +101,7 @@ public function __construct(&$db) * @param string $db_name (ignored) * @return bool */ - public function create_database($db_name = '') + public function create_database($db_name) { // In SQLite, a database is created when you connect to the database. // We'll return TRUE so that an error isn't generated @@ -116,7 +116,7 @@ public function create_database($db_name = '') * @param string $db_name (ignored) * @return bool */ - public function drop_database($db_name = '') + public function drop_database($db_name) { // In SQLite, a database is dropped when we delete a file if (file_exists($this->db->database)) diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php index 8a16594300f..3ad3477e478 100644 --- a/system/database/drivers/sqlite/sqlite_forge.php +++ b/system/database/drivers/sqlite/sqlite_forge.php @@ -75,7 +75,7 @@ class CI_DB_sqlite_forge extends CI_DB_forge { * @param string $db_name (ignored) * @return bool */ - public function create_database($db_name = '') + public function create_database($db_name) { // In SQLite, a database is created when you connect to the database. // We'll return TRUE so that an error isn't generated @@ -90,7 +90,7 @@ public function create_database($db_name = '') * @param string $db_name (ignored) * @return bool */ - public function drop_database($db_name = '') + public function drop_database($db_name) { if ( ! file_exists($this->db->database) OR ! @unlink($this->db->database)) { diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php index 43cbe33e5d9..c45472f548b 100644 --- a/system/database/drivers/sqlite3/sqlite3_forge.php +++ b/system/database/drivers/sqlite3/sqlite3_forge.php @@ -87,7 +87,7 @@ public function __construct(&$db) * @param string $db_name * @return bool */ - public function create_database($db_name = '') + public function create_database($db_name) { // In SQLite, a database is created when you connect to the database. // We'll return TRUE so that an error isn't generated @@ -102,7 +102,7 @@ public function create_database($db_name = '') * @param string $db_name (ignored) * @return bool */ - public function drop_database($db_name = '') + public function drop_database($db_name) { // In SQLite, a database is dropped when we delete a file if (file_exists($this->db->database)) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 019adad91a4..9aa716c892b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -34,6 +34,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4809) - :doc:`Database ` driver 'pdo/mysql' didn't turn off ``AUTOCOMMIT`` when starting a transaction. - Fixed a bug (#4822) - :doc:`CAPTCHA Helper ` didn't clear expired PNG images. - Fixed a bug (#4823) - :doc:`Session Library ` 'files' driver could enter an infinite loop if ``mbstring.func_override`` is enabled. +- Fixed a bug (#4851) - :doc:`Database Forge ` didn't quote schema names passed to its ``create_database()`` method. Version 3.1.0 ============= From 2e57058329d6b8a76db8d6f04ff7467ff204a637 Mon Sep 17 00:00:00 2001 From: Master Yoda Date: Tue, 18 Oct 2016 14:06:22 -0700 Subject: [PATCH 4491/5397] Fix xmlrpc timeout, #4843 Signed-off-by:Master Yoda --- system/libraries/Xmlrpc.php | 5 ++--- user_guide_src/source/libraries/xmlrpc.rst | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index 181a104d0e6..4be926f0edc 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -734,6 +734,8 @@ public function sendPayload($msg) .'User-Agent: '.$this->xmlrpcName.$r .'Content-Length: '.strlen($msg->payload).$r.$r .$msg->payload; + + stream_set_timeout($fp,$this->timeout); // set timeout for subsequent operations for ($written = $timestamp = 0, $length = strlen($op); $written < $length; $written += $result) { @@ -753,9 +755,6 @@ public function sendPayload($msg) $result = FALSE; break; } - - usleep(250000); - continue; } else { diff --git a/user_guide_src/source/libraries/xmlrpc.rst b/user_guide_src/source/libraries/xmlrpc.rst index 4d7ed66d537..04be8d52dcd 100644 --- a/user_guide_src/source/libraries/xmlrpc.rst +++ b/user_guide_src/source/libraries/xmlrpc.rst @@ -490,6 +490,10 @@ Class Reference $this->xmlrpc->timeout(6); + This timeout period will be used both for an initial connection to + the remote server, as well as for getting a response from it. + Make sure you set the timeout before calling `send_request`. + .. php:method:: method($function) :param string $function: Method name From d933c9eb04752496124ef4a5f5df6ffbaf0a1d87 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Thu, 20 Oct 2016 00:52:50 +0300 Subject: [PATCH 4492/5397] added ordinal_format() to Number helper; added to docs the info. --- system/helpers/number_helper.php | 29 +++++++++++++++++++ .../source/helpers/number_helper.rst | 17 ++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index e7810c70672..8e77c91ab6a 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -92,3 +92,32 @@ function byte_format($num, $precision = 1) return number_format($num, $precision).' '.$unit; } } + +// ------------------------------------------------------------------------ + +if ( ! function_exists('ordinal_format')) +{ + /** + * Returns the English ordinal numeral for a given number + * + * @param int $number + * @return string + */ + function ordinal_format($number) + { + if ( ! is_int($number) OR $number < 1) + { + return FALSE; + } + + $ends = array('th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'); + if ((($number % 100) >= 11) && (($number % 100) <= 13)) + { + return $number.'th'; + } + else + { + return $number.$ends[$number % 10]; + } + } +} diff --git a/user_guide_src/source/helpers/number_helper.rst b/user_guide_src/source/helpers/number_helper.rst index 9d5e98cfb5e..20acdec180f 100644 --- a/user_guide_src/source/helpers/number_helper.rst +++ b/user_guide_src/source/helpers/number_helper.rst @@ -49,4 +49,19 @@ The following functions are available: echo byte_format(45678, 2); // Returns 44.61 KB .. note:: The text generated by this function is found in the following - language file: *language//number_lang.php* \ No newline at end of file + language file: *language//number_lang.php* + +.. php:function:: ordinal_format($number) + + :param int $number: Non-negative natural number to be converted + :returns: Ordinal numeral for given number or FALSE on failure + :rtype: string + + Returns the ordinal numeral (1st, 2nd, 3rd etc.) for a + non-negative natural number. If the input is not a natural number + greater than 0, the function will return boolean FALSE. Examples:: + + echo ordinal_format(1); // Returns 1st + echo ordinal_format(3); // Returns 3rd + echo ordinal_format(21); // Returns 21st + echo ordinal_format(102); // Returns 102nd From 85e6be1fea7970b39971dc3bd12587d4f032c65a Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Thu, 20 Oct 2016 01:02:17 +0300 Subject: [PATCH 4493/5397] - fixed method chaining for set_caption in Table helper. --- system/libraries/Table.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/libraries/Table.php b/system/libraries/Table.php index 3bce294d8c4..f2fa434d98c 100644 --- a/system/libraries/Table.php +++ b/system/libraries/Table.php @@ -277,6 +277,7 @@ protected function _prep_args($args) public function set_caption($caption) { $this->caption = $caption; + return $this; } // -------------------------------------------------------------------- From fb4cec2f9184af60791eaaae612e1ffcb9a4ee4f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 20 Oct 2016 11:47:58 +0300 Subject: [PATCH 4494/5397] Merge pull request #4863 from gxgpet/develop4 Add missing method chaining support to CI_Table::set_caption() --- system/libraries/Table.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/libraries/Table.php b/system/libraries/Table.php index 3bce294d8c4..f2fa434d98c 100644 --- a/system/libraries/Table.php +++ b/system/libraries/Table.php @@ -277,6 +277,7 @@ protected function _prep_args($args) public function set_caption($caption) { $this->caption = $caption; + return $this; } // -------------------------------------------------------------------- From a9e57732f000e4c90e4cdfbe9e747f6dc416d28c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 20 Oct 2016 11:51:50 +0300 Subject: [PATCH 4495/5397] [ci skip] Add changelog entry for #4863 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 9aa716c892b..61a982a4c84 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -35,6 +35,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4822) - :doc:`CAPTCHA Helper ` didn't clear expired PNG images. - Fixed a bug (#4823) - :doc:`Session Library ` 'files' driver could enter an infinite loop if ``mbstring.func_override`` is enabled. - Fixed a bug (#4851) - :doc:`Database Forge ` didn't quote schema names passed to its ``create_database()`` method. +- Fixed a bug (#4863) - :doc:`HTML Table Library ` method ``set_caption()`` was missing method chaining support. Version 3.1.0 ============= From a09ffbc3bc91acd60735c6f1289b97125dae5ed6 Mon Sep 17 00:00:00 2001 From: "Instructor, Computer Systems Technology" Date: Tue, 18 Oct 2016 15:28:05 -0700 Subject: [PATCH 4496/5397] Merge pull request #4855 from jim-parry/fix/xmlrpc-timeout Fix xmlrpc timeout, #4843 --- system/libraries/Xmlrpc.php | 5 ++--- user_guide_src/source/libraries/xmlrpc.rst | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index 181a104d0e6..4be926f0edc 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -734,6 +734,8 @@ public function sendPayload($msg) .'User-Agent: '.$this->xmlrpcName.$r .'Content-Length: '.strlen($msg->payload).$r.$r .$msg->payload; + + stream_set_timeout($fp,$this->timeout); // set timeout for subsequent operations for ($written = $timestamp = 0, $length = strlen($op); $written < $length; $written += $result) { @@ -753,9 +755,6 @@ public function sendPayload($msg) $result = FALSE; break; } - - usleep(250000); - continue; } else { diff --git a/user_guide_src/source/libraries/xmlrpc.rst b/user_guide_src/source/libraries/xmlrpc.rst index 4d7ed66d537..04be8d52dcd 100644 --- a/user_guide_src/source/libraries/xmlrpc.rst +++ b/user_guide_src/source/libraries/xmlrpc.rst @@ -490,6 +490,10 @@ Class Reference $this->xmlrpc->timeout(6); + This timeout period will be used both for an initial connection to + the remote server, as well as for getting a response from it. + Make sure you set the timeout before calling `send_request`. + .. php:method:: method($function) :param string $function: Method name From 433ebc5814cda44a93664812f28e030f61732564 Mon Sep 17 00:00:00 2001 From: gxgpet Date: Thu, 20 Oct 2016 11:54:19 +0300 Subject: [PATCH 4497/5397] Accepting strings too, 0 allowed. --- system/helpers/number_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index 8e77c91ab6a..d7b96c32223 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -105,7 +105,7 @@ function byte_format($num, $precision = 1) */ function ordinal_format($number) { - if ( ! is_int($number) OR $number < 1) + if ( ! is_numeric($number) OR $number < 0) { return FALSE; } From 4b2b27199025d3c5a6f9b1eee19340c45ec7f2a2 Mon Sep 17 00:00:00 2001 From: gxgpet Date: Thu, 20 Oct 2016 11:56:03 +0300 Subject: [PATCH 4498/5397] - fixed docs --- user_guide_src/source/helpers/number_helper.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user_guide_src/source/helpers/number_helper.rst b/user_guide_src/source/helpers/number_helper.rst index 20acdec180f..47f6166901b 100644 --- a/user_guide_src/source/helpers/number_helper.rst +++ b/user_guide_src/source/helpers/number_helper.rst @@ -53,13 +53,13 @@ The following functions are available: .. php:function:: ordinal_format($number) - :param int $number: Non-negative natural number to be converted + :param int $number: natural number to be converted :returns: Ordinal numeral for given number or FALSE on failure :rtype: string - Returns the ordinal numeral (1st, 2nd, 3rd etc.) for a - non-negative natural number. If the input is not a natural number - greater than 0, the function will return boolean FALSE. Examples:: + Returns the ordinal numeral (0th, 1st, 2nd, 3rd etc.) for a + natural number. If the input is not a natural number, the + function will return boolean FALSE. Examples:: echo ordinal_format(1); // Returns 1st echo ordinal_format(3); // Returns 3rd From dc44b922dfda28d72879f6e5d2ef509e8bb51275 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 20 Oct 2016 11:56:20 +0300 Subject: [PATCH 4499/5397] [ci skip] Polish changes and add a changelog entry for PR #4855 --- system/libraries/Xmlrpc.php | 4 ++-- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/libraries/xmlrpc.rst | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index 4be926f0edc..7186646dac9 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -734,8 +734,8 @@ public function sendPayload($msg) .'User-Agent: '.$this->xmlrpcName.$r .'Content-Length: '.strlen($msg->payload).$r.$r .$msg->payload; - - stream_set_timeout($fp,$this->timeout); // set timeout for subsequent operations + + stream_set_timeout($fp, $this->timeout); // set timeout for subsequent operations for ($written = $timestamp = 0, $length = strlen($op); $written < $length; $written += $result) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 61a982a4c84..4d2cad662d6 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -36,6 +36,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4823) - :doc:`Session Library ` 'files' driver could enter an infinite loop if ``mbstring.func_override`` is enabled. - Fixed a bug (#4851) - :doc:`Database Forge ` didn't quote schema names passed to its ``create_database()`` method. - Fixed a bug (#4863) - :doc:`HTML Table Library ` method ``set_caption()`` was missing method chaining support. +- Fixed a bug (#4843) - :doc:`XML-RPC Library ` client class didn't set a read/write socket timeout. Version 3.1.0 ============= diff --git a/user_guide_src/source/libraries/xmlrpc.rst b/user_guide_src/source/libraries/xmlrpc.rst index 04be8d52dcd..2fe07c49def 100644 --- a/user_guide_src/source/libraries/xmlrpc.rst +++ b/user_guide_src/source/libraries/xmlrpc.rst @@ -492,7 +492,7 @@ Class Reference This timeout period will be used both for an initial connection to the remote server, as well as for getting a response from it. - Make sure you set the timeout before calling `send_request`. + Make sure you set the timeout before calling ``send_request()``. .. php:method:: method($function) @@ -579,4 +579,4 @@ Class Reference 'struct' ); - return $this->xmlrpc->send_response($response); \ No newline at end of file + return $this->xmlrpc->send_response($response); From 020ede13e33e6c91d27ee2468ad26e98fe711100 Mon Sep 17 00:00:00 2001 From: "Instructor, Computer Systems Technology" Date: Thu, 20 Oct 2016 01:57:38 -0700 Subject: [PATCH 4500/5397] Update Xmlrpc.php Fix style --- system/libraries/Xmlrpc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index 4be926f0edc..5435bde8de5 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -735,7 +735,7 @@ public function sendPayload($msg) .'Content-Length: '.strlen($msg->payload).$r.$r .$msg->payload; - stream_set_timeout($fp,$this->timeout); // set timeout for subsequent operations + stream_set_timeout($fp, $this->timeout); // set timeout for subsequent operations for ($written = $timestamp = 0, $length = strlen($op); $written < $length; $written += $result) { From d958ee1590e6d4e1cfc6030ff735e0be5a8685ca Mon Sep 17 00:00:00 2001 From: "Instructor, Computer Systems Technology" Date: Thu, 20 Oct 2016 01:58:33 -0700 Subject: [PATCH 4501/5397] Update xmlrpc.rst Fix markdown notation --- user_guide_src/source/libraries/xmlrpc.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/libraries/xmlrpc.rst b/user_guide_src/source/libraries/xmlrpc.rst index 04be8d52dcd..4460bb53e41 100644 --- a/user_guide_src/source/libraries/xmlrpc.rst +++ b/user_guide_src/source/libraries/xmlrpc.rst @@ -492,7 +492,7 @@ Class Reference This timeout period will be used both for an initial connection to the remote server, as well as for getting a response from it. - Make sure you set the timeout before calling `send_request`. + Make sure you set the timeout before calling ``send_request``. .. php:method:: method($function) @@ -579,4 +579,4 @@ Class Reference 'struct' ); - return $this->xmlrpc->send_response($response); \ No newline at end of file + return $this->xmlrpc->send_response($response); From 7534aa85c2c8a4359f6df0a6f421fb15ca981877 Mon Sep 17 00:00:00 2001 From: gxgpet Date: Thu, 20 Oct 2016 12:19:48 +0300 Subject: [PATCH 4502/5397] small refactorisations --- system/helpers/number_helper.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index d7b96c32223..e94a5ffbc5e 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -110,14 +110,24 @@ function ordinal_format($number) return FALSE; } - $ends = array('th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'); + $last_digit = array( + 0 => 'th', + 1 => 'st', + 2 => 'nd', + 3 => 'rd', + 4 => 'th', + 5 => 'th', + 6 => 'th', + 7 => 'th', + 8 => 'th', + 9 => 'th'); if ((($number % 100) >= 11) && (($number % 100) <= 13)) { return $number.'th'; } else { - return $number.$ends[$number % 10]; + return $number.$last_digit[$number % 10]; } } } From 1ff88001bead0ff4187a5b121d9d36a25a45c313 Mon Sep 17 00:00:00 2001 From: gxgpet Date: Thu, 20 Oct 2016 12:21:05 +0300 Subject: [PATCH 4503/5397] fixed floating for ordinal_format() --- system/helpers/number_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index e94a5ffbc5e..af8b70f86dd 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -105,7 +105,7 @@ function byte_format($num, $precision = 1) */ function ordinal_format($number) { - if ( ! is_numeric($number) OR $number < 0) + if ( ! ctype_digit((string) $number) OR $number < 0) { return FALSE; } From 7de46d4d99017b42ba172cebff8998163ee6295f Mon Sep 17 00:00:00 2001 From: gxgpet Date: Thu, 20 Oct 2016 12:31:44 +0300 Subject: [PATCH 4504/5397] fixed coding style + removal of extra paranthesis --- system/helpers/number_helper.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index af8b70f86dd..20e262e6696 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -120,8 +120,9 @@ function ordinal_format($number) 6 => 'th', 7 => 'th', 8 => 'th', - 9 => 'th'); - if ((($number % 100) >= 11) && (($number % 100) <= 13)) + 9 => 'th' + ); + if (($number % 100) >= 11 && ($number % 100) <= 13) { return $number.'th'; } From 6513701f21e72fadbbadc4bfea501dd871fa5149 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 20 Oct 2016 12:36:06 +0300 Subject: [PATCH 4505/5397] [ci skip] Document FV set_rules() fourth parameter --- user_guide_src/source/libraries/form_validation.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 5b9a7427307..7792369b2e1 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -1027,11 +1027,12 @@ Class Reference .. php:class:: CI_Form_validation - .. php:method:: set_rules($field[, $label = ''[, $rules = '']]) + .. php:method:: set_rules($field[, $label = ''[, $rules = ''[, $errors = array()]]]) :param string $field: Field name :param string $label: Field label :param mixed $rules: Validation rules, as a string list separated by a pipe "|", or as an array or rules + :param array $errors: A list of custom error messages :returns: CI_Form_validation instance (method chaining) :rtype: CI_Form_validation From 2bd99a68fc253bd7dfad94aa0575b4dcbeec89d9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 20 Oct 2016 11:56:20 +0300 Subject: [PATCH 4506/5397] [ci skip] Polish changes and add a changelog entry for PR #4855 --- system/libraries/Xmlrpc.php | 2 +- user_guide_src/source/changelog.rst | 11 +++++++++++ user_guide_src/source/libraries/xmlrpc.rst | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index 5435bde8de5..7186646dac9 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -734,7 +734,7 @@ public function sendPayload($msg) .'User-Agent: '.$this->xmlrpcName.$r .'Content-Length: '.strlen($msg->payload).$r.$r .$msg->payload; - + stream_set_timeout($fp, $this->timeout); // set timeout for subsequent operations for ($written = $timestamp = 0, $length = strlen($op); $written < $length; $written += $result) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 484e6a13b90..3e7749f5b9c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -59,6 +59,17 @@ Bug fixes for 3.1.1 - Fixed a bug (#4759) - :doc:`Form Validation `, :doc:`Trackback ` and `XML-RPC ` libraries treated URI schemes in a case-sensitive manner. - Fixed a bug (#4762) - :doc:`Cache Library ` 'file' driver method ``get_metadata()`` checked TTL time against ``mtime`` instead of the cache item's creation time. - Fixed a bug where :doc:`File Uploading Library ` generated error messages on PHP 7.1. +- Fixed a bug (#4780) - :doc:`compatibility function ` ``hex2bin()`` didn't reject inputs of type "resource". +- Fixed a bug (#4787) - :doc:`Form Validation Library ` method ``valid_email()`` triggered ``E_WARNING`` when input emails have empty domain names. +- Fixed a bug (#4805) - :doc:`Database ` driver 'mysqli' didn't use the ``MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT`` flag properly. +- Fixed a bug (#4808) - :doc:`Database ` method ``is_write_type()`` only looked at the first line of a queries using ``RETURNING`` with the 'postgre', 'pdo/pgsql', 'odbc' and 'pdo/odbc' drivers. +- Fixed a bug where :doc:`Query Builder ` method ``insert_batch()`` tried to execute an unsupported SQL query with the 'ibase' and 'pdo/firebird' drivers. +- Fixed a bug (#4809) - :doc:`Database ` driver 'pdo/mysql' didn't turn off ``AUTOCOMMIT`` when starting a transaction. +- Fixed a bug (#4822) - :doc:`CAPTCHA Helper ` didn't clear expired PNG images. +- Fixed a bug (#4823) - :doc:`Session Library ` 'files' driver could enter an infinite loop if ``mbstring.func_override`` is enabled. +- Fixed a bug (#4851) - :doc:`Database Forge ` didn't quote schema names passed to its ``create_database()`` method. +- Fixed a bug (#4863) - :doc:`HTML Table Library ` method ``set_caption()`` was missing method chaining support. +- Fixed a bug (#4843) - :doc:`XML-RPC Library ` client class didn't set a read/write socket timeout. Version 3.1.0 ============= diff --git a/user_guide_src/source/libraries/xmlrpc.rst b/user_guide_src/source/libraries/xmlrpc.rst index 4460bb53e41..2fe07c49def 100644 --- a/user_guide_src/source/libraries/xmlrpc.rst +++ b/user_guide_src/source/libraries/xmlrpc.rst @@ -492,7 +492,7 @@ Class Reference This timeout period will be used both for an initial connection to the remote server, as well as for getting a response from it. - Make sure you set the timeout before calling ``send_request``. + Make sure you set the timeout before calling ``send_request()``. .. php:method:: method($function) From 34fe402ea28e928865ec15242e8f20f760b7a334 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 20 Oct 2016 12:36:06 +0300 Subject: [PATCH 4507/5397] [ci skip] Document FV set_rules() fourth parameter --- user_guide_src/source/libraries/form_validation.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 5b9a7427307..7792369b2e1 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -1027,11 +1027,12 @@ Class Reference .. php:class:: CI_Form_validation - .. php:method:: set_rules($field[, $label = ''[, $rules = '']]) + .. php:method:: set_rules($field[, $label = ''[, $rules = ''[, $errors = array()]]]) :param string $field: Field name :param string $label: Field label :param mixed $rules: Validation rules, as a string list separated by a pipe "|", or as an array or rules + :param array $errors: A list of custom error messages :returns: CI_Form_validation instance (method chaining) :rtype: CI_Form_validation From 5d05372f4f59d27fdd93249d813970fcf181a4af Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 20 Oct 2016 13:40:57 +0300 Subject: [PATCH 4508/5397] FV: throw BadMethodCallException when set_rules() called without --- system/libraries/Form_validation.php | 6 +++++- tests/codeigniter/libraries/Form_validation_test.php | 6 ++++++ user_guide_src/source/changelog.rst | 4 ++++ user_guide_src/source/libraries/form_validation.rst | 3 ++- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 86a569cedc6..4380dd2768d 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -164,7 +164,7 @@ public function __construct($rules = array()) * @param array $errors * @return CI_Form_validation */ - public function set_rules($field, $label = '', $rules = array(), $errors = array()) + public function set_rules($field, $label = null, $rules = null, $errors = array()) { // No reason to set rules if we have no POST data // or a validation array has not been specified @@ -197,6 +197,10 @@ public function set_rules($field, $label = '', $rules = array(), $errors = array return $this; } + elseif ( ! isset($rules)) + { + throw new BadMethodCallException('Form_validation: set_rules() called without a $rules parameter'); + } // No fields or no rules? Nothing to do... if ( ! is_string($field) OR $field === '' OR empty($rules)) diff --git a/tests/codeigniter/libraries/Form_validation_test.php b/tests/codeigniter/libraries/Form_validation_test.php index 0815300e6be..5f4bb931647 100644 --- a/tests/codeigniter/libraries/Form_validation_test.php +++ b/tests/codeigniter/libraries/Form_validation_test.php @@ -435,6 +435,12 @@ public function test_run() $this->assertFalse($form_validation->run('fail')); } + public function test_set_rules_exception() + { + $this->setExpectedException('BadMethodCallException'); + $this->form_validation->set_rules('foo', 'bar'); + } + public function test_has_rule() { $this->form_validation->reset_validation(); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 3e7749f5b9c..4bff51a938c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -23,6 +23,10 @@ Release Date: Not Released - Removed the *socket_type* configuration setting from the 'redis' driver. - Changed data serialization logic in 'redis' driver for better performance. + - :doc:`Form Validation Library ` changes include: + + - Changed method ``set_rules()`` to throw a ``BadMethodCallException`` when its first parameter is not an array and the ``$rules`` one is unused. + - Database - Changed method ``initialize()`` to return void and instead throw a ``RuntimeException`` in case of failure. diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index 7792369b2e1..b503b9be03f 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -1027,13 +1027,14 @@ Class Reference .. php:class:: CI_Form_validation - .. php:method:: set_rules($field[, $label = ''[, $rules = ''[, $errors = array()]]]) + .. php:method:: set_rules($field[, $label = null[, $rules = null[, $errors = array()]]]) :param string $field: Field name :param string $label: Field label :param mixed $rules: Validation rules, as a string list separated by a pipe "|", or as an array or rules :param array $errors: A list of custom error messages :returns: CI_Form_validation instance (method chaining) + :throws: BadMethodCallException If $field is not an array and $rules was not used :rtype: CI_Form_validation Permits you to set validation rules, as described in the tutorial From 11954d2521475f6964bfa9c65dcd2f3e53a65af5 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Thu, 20 Oct 2016 20:53:11 +0300 Subject: [PATCH 4509/5397] moved ordinal_format() helper function from Number helper to Inflector helper --- system/helpers/inflector_helper.php | 40 ++++++++++++++++++ system/helpers/number_helper.php | 42 +------------------ .../source/helpers/inflector_helper.rst | 17 +++++++- .../source/helpers/number_helper.rst | 17 +------- 4 files changed, 58 insertions(+), 58 deletions(-) diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index 6dc3b50308c..c71516564ce 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -273,3 +273,43 @@ function is_countable($word) ); } } + +// ------------------------------------------------------------------------ + +if ( ! function_exists('ordinal_format')) +{ + /** + * Returns the English ordinal numeral for a given number + * + * @param int $number + * @return string + */ + function ordinal_format($number) + { + if ( ! ctype_digit((string) $number) OR $number < 0) + { + return FALSE; + } + + $last_digit = array( + 0 => 'th', + 1 => 'st', + 2 => 'nd', + 3 => 'rd', + 4 => 'th', + 5 => 'th', + 6 => 'th', + 7 => 'th', + 8 => 'th', + 9 => 'th' + ); + if (($number % 100) >= 11 && ($number % 100) <= 13) + { + return $number.'th'; + } + else + { + return $number.$last_digit[$number % 10]; + } + } +} \ No newline at end of file diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index 20e262e6696..219124cb5ae 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -91,44 +91,4 @@ function byte_format($num, $precision = 1) return number_format($num, $precision).' '.$unit; } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('ordinal_format')) -{ - /** - * Returns the English ordinal numeral for a given number - * - * @param int $number - * @return string - */ - function ordinal_format($number) - { - if ( ! ctype_digit((string) $number) OR $number < 0) - { - return FALSE; - } - - $last_digit = array( - 0 => 'th', - 1 => 'st', - 2 => 'nd', - 3 => 'rd', - 4 => 'th', - 5 => 'th', - 6 => 'th', - 7 => 'th', - 8 => 'th', - 9 => 'th' - ); - if (($number % 100) >= 11 && ($number % 100) <= 13) - { - return $number.'th'; - } - else - { - return $number.$last_digit[$number % 10]; - } - } -} +} \ No newline at end of file diff --git a/user_guide_src/source/helpers/inflector_helper.rst b/user_guide_src/source/helpers/inflector_helper.rst index df0c568c0d7..8a6ca7a9281 100644 --- a/user_guide_src/source/helpers/inflector_helper.rst +++ b/user_guide_src/source/helpers/inflector_helper.rst @@ -93,4 +93,19 @@ The following functions are available: Checks if the given word has a plural version. Example:: - is_countable('equipment'); // Returns FALSE \ No newline at end of file + is_countable('equipment'); // Returns FALSE + +.. php:function:: ordinal_format($number) + + :param int $number: natural number to be converted + :returns: Ordinal numeral for given number or FALSE on failure + :rtype: string + + Returns the ordinal numeral (0th, 1st, 2nd, 3rd etc.) for a + natural number. If the input is not a natural number, the + function will return boolean FALSE. Examples:: + + echo ordinal_format(1); // Returns 1st + echo ordinal_format(3); // Returns 3rd + echo ordinal_format(21); // Returns 21st + echo ordinal_format(102); // Returns 102nd diff --git a/user_guide_src/source/helpers/number_helper.rst b/user_guide_src/source/helpers/number_helper.rst index 47f6166901b..9d5e98cfb5e 100644 --- a/user_guide_src/source/helpers/number_helper.rst +++ b/user_guide_src/source/helpers/number_helper.rst @@ -49,19 +49,4 @@ The following functions are available: echo byte_format(45678, 2); // Returns 44.61 KB .. note:: The text generated by this function is found in the following - language file: *language//number_lang.php* - -.. php:function:: ordinal_format($number) - - :param int $number: natural number to be converted - :returns: Ordinal numeral for given number or FALSE on failure - :rtype: string - - Returns the ordinal numeral (0th, 1st, 2nd, 3rd etc.) for a - natural number. If the input is not a natural number, the - function will return boolean FALSE. Examples:: - - echo ordinal_format(1); // Returns 1st - echo ordinal_format(3); // Returns 3rd - echo ordinal_format(21); // Returns 21st - echo ordinal_format(102); // Returns 102nd + language file: *language//number_lang.php* \ No newline at end of file From 4fe5e99f437fe79cc40cebd08277eb319d8a6095 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Thu, 20 Oct 2016 20:58:10 +0300 Subject: [PATCH 4510/5397] fixed unnecessary file termination for Number helper --- system/helpers/number_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index 219124cb5ae..e7810c70672 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -91,4 +91,4 @@ function byte_format($num, $precision = 1) return number_format($num, $precision).' '.$unit; } -} \ No newline at end of file +} From 03a1eac3b7bed8ed6df59109364a3eebe3f1cceb Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Thu, 20 Oct 2016 21:03:38 +0300 Subject: [PATCH 4511/5397] ordinal_format will accept only non-negative natural numbers and return original value on failure + docs update regarding this. --- system/helpers/inflector_helper.php | 4 ++-- user_guide_src/source/helpers/inflector_helper.rst | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index c71516564ce..04e178aecb2 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -286,9 +286,9 @@ function is_countable($word) */ function ordinal_format($number) { - if ( ! ctype_digit((string) $number) OR $number < 0) + if ( ! ctype_digit((string) $number) OR $number < 1) { - return FALSE; + return $number; } $last_digit = array( diff --git a/user_guide_src/source/helpers/inflector_helper.rst b/user_guide_src/source/helpers/inflector_helper.rst index 8a6ca7a9281..76cce6f4d95 100644 --- a/user_guide_src/source/helpers/inflector_helper.rst +++ b/user_guide_src/source/helpers/inflector_helper.rst @@ -97,15 +97,16 @@ The following functions are available: .. php:function:: ordinal_format($number) - :param int $number: natural number to be converted - :returns: Ordinal numeral for given number or FALSE on failure + :param int $number: non-negative natural number to be converted + :returns: Ordinal numeral for given number or original value on failure :rtype: string - Returns the ordinal numeral (0th, 1st, 2nd, 3rd etc.) for a - natural number. If the input is not a natural number, the - function will return boolean FALSE. Examples:: + Returns the ordinal numeral (1st, 2nd, 3rd etc.) for a + non-negative natural number. If the input is not a natural number + greater than 0, the function will return the original value. Examples:: echo ordinal_format(1); // Returns 1st echo ordinal_format(3); // Returns 3rd echo ordinal_format(21); // Returns 21st echo ordinal_format(102); // Returns 102nd + echo ordinal_format(-5); // Invalid input, will return -5 From 4ffe6345690f81872d0937e562faaf75f3185b6a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 21 Oct 2016 16:30:31 +0300 Subject: [PATCH 4512/5397] Fix #4865 --- system/core/Common.php | 1 + system/core/Exceptions.php | 1 - user_guide_src/source/changelog.rst | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/core/Common.php b/system/core/Common.php index 257763dd330..91c585f7dcd 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -661,6 +661,7 @@ function _exception_handler($exception) $_error =& load_class('Exceptions', 'core'); $_error->log_exception('error', 'Exception: '.$exception->getMessage(), $exception->getFile(), $exception->getLine()); + is_cli() OR set_status_header(500); // Should we display the error? if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))) { diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php index a1c6a19709e..4e10f28310c 100644 --- a/system/core/Exceptions.php +++ b/system/core/Exceptions.php @@ -207,7 +207,6 @@ public function show_exception($exception) } else { - set_status_header(500); $templates_path .= 'html'.DIRECTORY_SEPARATOR; } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4d2cad662d6..1b3820cb03c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -37,6 +37,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4851) - :doc:`Database Forge ` didn't quote schema names passed to its ``create_database()`` method. - Fixed a bug (#4863) - :doc:`HTML Table Library ` method ``set_caption()`` was missing method chaining support. - Fixed a bug (#4843) - :doc:`XML-RPC Library ` client class didn't set a read/write socket timeout. +- Fixed a bug (#4865) - uncaught exceptions didn't set the HTTP Response status code to 500 unless ``display_errors`` was turned On. Version 3.1.0 ============= From 25dc0937dd27c6d3c9f4d4483a857c218d6a9dad Mon Sep 17 00:00:00 2001 From: gxgpet Date: Fri, 21 Oct 2016 17:44:03 +0300 Subject: [PATCH 4513/5397] fixed small coding style issues --- system/helpers/inflector_helper.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index 04e178aecb2..83bf2809815 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -303,13 +303,12 @@ function ordinal_format($number) 8 => 'th', 9 => 'th' ); + if (($number % 100) >= 11 && ($number % 100) <= 13) { return $number.'th'; } - else - { - return $number.$last_digit[$number % 10]; - } + + return $number.$last_digit[$number % 10]; } -} \ No newline at end of file +} From e7e70c3532f06ac008cfc038791fcb46d4a551ed Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 21 Oct 2016 18:06:26 +0300 Subject: [PATCH 4514/5397] [ci skip] Add changelog entry for PR #4862 --- system/helpers/inflector_helper.php | 6 +++--- user_guide_src/source/changelog.rst | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index 83bf2809815..f14f57c54a8 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -268,7 +268,7 @@ function is_countable($word) 'species', 'swine', 'traffic', - 'wheat', + 'wheat' ) ); } @@ -303,12 +303,12 @@ function ordinal_format($number) 8 => 'th', 9 => 'th' ); - + if (($number % 100) >= 11 && ($number % 100) <= 13) { return $number.'th'; } - + return $number.$last_digit[$number % 10]; } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4bff51a938c..f60387cd5ba 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -35,6 +35,7 @@ Release Date: Not Released - Helpers + - Added new function :php:func:`ordinal_format()` to :doc:`Inflector Helper `. - Updated :doc:`HTML Helper ` function :php:func:`meta()` with support for "charset" and "property" properties. - Changed :doc:`HTML Helper ` function :php:func:`doctype()` default document type to HTML 5. From dae08b59fd808c3baf838161223fdba2a80f1610 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 22 Oct 2016 15:37:15 +0300 Subject: [PATCH 4515/5397] Allow binding 0, null out of array in query() --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 848516adc54..7ae52a307dc 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -980,7 +980,7 @@ public function trans_rollback() */ public function compile_binds($sql, $binds) { - if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) + if (empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) { return $sql; } From 6c6ee1a1e73b3f8a93ca031107bec35e56272a0a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 22 Oct 2016 16:33:06 +0300 Subject: [PATCH 4516/5397] Close #4830, #3649 --- system/libraries/Session/Session.php | 36 +++++++++++++++++-- .../Session/drivers/Session_files_driver.php | 18 ++++++++-- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/libraries/sessions.rst | 4 +-- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index 3b391a8eff0..5aac12f36e9 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -57,6 +57,7 @@ class CI_Session { protected $_driver = 'files'; protected $_config; + protected $_sid_regexp; // ------------------------------------------------------------------------ @@ -99,6 +100,7 @@ public function __construct(array $params = array()) // Configuration ... $this->_configure($params); + $this->_config['_sid_regexp'] = $this->_sid_regexp; $class = new $class($this->_config); if ($class instanceof SessionHandlerInterface) @@ -131,7 +133,7 @@ public function __construct(array $params = array()) if (isset($_COOKIE[$this->_config['cookie_name']]) && ( ! is_string($_COOKIE[$this->_config['cookie_name']]) - OR ! preg_match('/^[0-9a-f]{40}$/', $_COOKIE[$this->_config['cookie_name']]) + OR ! preg_match('#\A'.$this->_sid_regexp.'\z#', $_COOKIE[$this->_config['cookie_name']]) ) ) { @@ -315,8 +317,36 @@ protected function _configure(&$params) ini_set('session.use_strict_mode', 1); ini_set('session.use_cookies', 1); ini_set('session.use_only_cookies', 1); - ini_set('session.hash_function', 1); - ini_set('session.hash_bits_per_character', 4); + + if (PHP_VERSION_ID < 70100) + { + if ((int) ini_get('session.hash_function') === 0) + { + ini_set('session.hash_function', 1); + ini_set('session.hash_bits_per_character', $bits_per_character = 4); + } + else + { + $bits_per_character = (int) ini_get('session.hash_bits_per_character'); + } + } + elseif ((int) ini_get('session.sid_length') < 40 && ($bits_per_character = (int) ini_get('session.sid_bits_per_character')) === 4) + { + ini_set('session.sid_length', 40); + } + + switch ($bits_per_character) + { + case 4: + $this->_sid_regexp = '[0-9a-f]{40,}'; + break; + case 5: + $this->_sid_regexp = '[0-9a-v]{40,}'; + break; + case 6: + $this->_sid_regexp = '[0-9a-zA-Z,-]{40,}'; + break; + } } // ------------------------------------------------------------------------ diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index 5f05396c0cf..37315d3cd07 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -76,6 +76,13 @@ class CI_Session_files_driver extends CI_Session_driver implements SessionHandle */ protected $_file_new; + /** + * Validate SID regular expression + * + * @var string + */ + protected $_sid_regexp; + /** * mbstring.func_override flag * @@ -106,6 +113,8 @@ public function __construct(&$params) $this->_config['save_path'] = rtrim(ini_get('session.save_path'), '/\\'); } + $this->_sid_regexp = $this->_config['_sid_regexp']; + isset(self::$func_override) OR self::$func_override = (extension_loaded('mbstring') && ini_get('mbstring.func_override')); } @@ -352,10 +361,13 @@ public function gc($maxlifetime) $ts = time() - $maxlifetime; + $pattern = ($this->_config['match_ip'] === TRUE) + ? '[0-9a-f]{32}' + : ''; + $pattern = sprintf( - '/^%s[0-9a-f]{%d}$/', - preg_quote($this->_config['cookie_name'], '/'), - ($this->_config['match_ip'] === TRUE ? 72 : 40) + '#\A%s'.$pattern.$this->_sid_regexp.'\z#', + preg_quote($this->_config['cookie_name']) ); while (($file = readdir($directory)) !== FALSE) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1b3820cb03c..d025d52f112 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -38,6 +38,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4863) - :doc:`HTML Table Library ` method ``set_caption()`` was missing method chaining support. - Fixed a bug (#4843) - :doc:`XML-RPC Library ` client class didn't set a read/write socket timeout. - Fixed a bug (#4865) - uncaught exceptions didn't set the HTTP Response status code to 500 unless ``display_errors`` was turned On. +- Fixed a bug (#4830) - :doc:`Session Library ` didn't take into account the new session INI settings in PHP 7.1. Version 3.1.0 ============= diff --git a/user_guide_src/source/libraries/sessions.rst b/user_guide_src/source/libraries/sessions.rst index 082828c4eb6..a95cd5a1938 100644 --- a/user_guide_src/source/libraries/sessions.rst +++ b/user_guide_src/source/libraries/sessions.rst @@ -594,7 +594,7 @@ And then of course, create the database table ... For MySQL:: CREATE TABLE IF NOT EXISTS `ci_sessions` ( - `id` varchar(40) NOT NULL, + `id` varchar(128) NOT NULL, `ip_address` varchar(45) NOT NULL, `timestamp` int(10) unsigned DEFAULT 0 NOT NULL, `data` blob NOT NULL, @@ -604,7 +604,7 @@ For MySQL:: For PostgreSQL:: CREATE TABLE "ci_sessions" ( - "id" varchar(40) NOT NULL, + "id" varchar(128) NOT NULL, "ip_address" varchar(45) NOT NULL, "timestamp" bigint DEFAULT 0 NOT NULL, "data" text DEFAULT '' NOT NULL From 378627bb0e0cfb433299a6d832c18099e5c1dc9c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 22 Oct 2016 16:48:35 +0300 Subject: [PATCH 4517/5397] [ci skip] Prepare for 3.1.1 release --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/changelog.rst | 2 +- user_guide_src/source/conf.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 804c6856df5..c5d26e52bd1 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - const CI_VERSION = '3.1.1-dev'; + const CI_VERSION = '3.1.1'; /* * ------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1e59d4ca251..c7bd5024054 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -5,7 +5,7 @@ Change Log Version 3.1.1 ============= -Release Date: Not Released +Release Date: Oct 22, 2016 - **Security** diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 0c4901d8fb0..a685c444235 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.1.1-dev' +version = '3.1.1' # The full version, including alpha/beta/rc tags. -release = '3.1.1-dev' +release = '3.1.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 6c33f22983a60a046c7de580bebb9b95c4ea106a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Sat, 22 Oct 2016 17:08:13 +0300 Subject: [PATCH 4518/5397] [ci skip] Fix a changelog link --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index c7bd5024054..559c1288493 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -16,7 +16,7 @@ Release Date: Oct 22, 2016 - Added ``E_PARSE`` to the list of error levels detected by the shutdown handler. - Updated :doc:`Inflector Helper ` :php:func:`is_countable()` with more words. - Updated :doc:`common function ` :php:func:`set_status_header()` with new status codes from IETF RFCs - `2817 https://tools.ietf.org/html/rfc2817>`_ (426) + `2817 `_ (426) and `6585 `_ (428, 429, 431, 511). Bug fixes for 3.1.1 From 255e4c073fcd82f4c35ef0789aa2f98a16ee8092 Mon Sep 17 00:00:00 2001 From: vkeranov Date: Sun, 23 Oct 2016 20:47:32 +0300 Subject: [PATCH 4519/5397] Small Changelog Fix --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 559c1288493..2d9ef69b578 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -27,7 +27,7 @@ Bug fixes for 3.1.1 - Fixed a bug (#4737) - :doc:`Query Builder ` didn't add an ``OFFSET`` when ``LIMIT`` is zero or unused. - Fixed a regression (#4739) - :doc:`Email Library ` doesn't properly separate attachment bodies from headers. - Fixed a bug (#4754) - :doc:`Unit Testing Library ` method ``result()`` didn't translate ``res_datatype``. -- Fixed a bug (#4759) - :doc:`Form Validation `, :doc:`Trackback ` and `XML-RPC ` libraries treated URI schemes in a case-sensitive manner. +- Fixed a bug (#4759) - :doc:`Form Validation `, :doc:`Trackback ` and :doc:`XML-RPC ` libraries treated URI schemes in a case-sensitive manner. - Fixed a bug (#4762) - :doc:`Cache Library ` 'file' driver method ``get_metadata()`` checked TTL time against ``mtime`` instead of the cache item's creation time. - Fixed a bug where :doc:`File Uploading Library ` generated error messages on PHP 7.1. - Fixed a bug (#4780) - :doc:`compatibility function ` ``hex2bin()`` didn't reject inputs of type "resource". From 75b812f85b266dbe77518e56a4ad754a0d09eaff Mon Sep 17 00:00:00 2001 From: Hex Date: Mon, 24 Oct 2016 14:21:44 +0800 Subject: [PATCH 4520/5397] Fix small doc problem. --- user_guide_src/source/general/compatibility_functions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/general/compatibility_functions.rst b/user_guide_src/source/general/compatibility_functions.rst index 936f2a24b93..584968663a7 100644 --- a/user_guide_src/source/general/compatibility_functions.rst +++ b/user_guide_src/source/general/compatibility_functions.rst @@ -10,7 +10,7 @@ Being custom implementations, these functions will also have some set of dependencies on their own, but are still useful if your PHP setup doesn't offer them natively. -.. note:: Much like the `common functions `, the +.. note:: Much like the :doc:`common functions `, the compatibility functions are always available, as long as their dependencies are met. From b6359a6edc03e4959ab7ae0918b89e49b4b39b8d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 24 Oct 2016 09:41:29 +0300 Subject: [PATCH 4521/5397] Merge pull request #4868 from hex-ci/patch-2 [ci skip] Fix a doc link --- user_guide_src/source/general/compatibility_functions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/general/compatibility_functions.rst b/user_guide_src/source/general/compatibility_functions.rst index 936f2a24b93..584968663a7 100644 --- a/user_guide_src/source/general/compatibility_functions.rst +++ b/user_guide_src/source/general/compatibility_functions.rst @@ -10,7 +10,7 @@ Being custom implementations, these functions will also have some set of dependencies on their own, but are still useful if your PHP setup doesn't offer them natively. -.. note:: Much like the `common functions `, the +.. note:: Much like the :doc:`common functions `, the compatibility functions are always available, as long as their dependencies are met. From d81b59ef02dab9072e44eec2dec519e5178e7759 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 24 Oct 2016 09:45:54 +0300 Subject: [PATCH 4522/5397] [ci skip] Fix 3.1.1 download link --- user_guide_src/source/installation/downloads.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 7380dcb2868..d04bccb7cb1 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,7 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.1.1 (Current version) `_ +- `CodeIgniter v3.1.1 (Current version) `_ - `CodeIgniter v3.1.0 `_ - `CodeIgniter v3.0.6 `_ - `CodeIgniter v3.0.5 `_ @@ -32,4 +32,4 @@ Please note that while every effort is made to keep this code base functional, we cannot guarantee the functionality of code taken from the develop branch. -Beginning with version 2.0.3, stable versions are also available via `GitHub Releases `_. \ No newline at end of file +Beginning with version 2.0.3, stable versions are also available via `GitHub Releases `_. From 777bb986d9e252dcc4dde3c76c03b0e0c7c1f8ef Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 24 Oct 2016 10:11:22 +0300 Subject: [PATCH 4523/5397] [ci skip] Update docs on trans_off() --- user_guide_src/source/database/transactions.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/user_guide_src/source/database/transactions.rst b/user_guide_src/source/database/transactions.rst index 2e6d4b47717..e25b8ed1401 100644 --- a/user_guide_src/source/database/transactions.rst +++ b/user_guide_src/source/database/transactions.rst @@ -75,12 +75,11 @@ debugging is turned off, you can manage your own errors like this:: // generate an error... or use the log_message() function to log your error } -Enabling Transactions -===================== +Disabling Transactions +====================== -Transactions are enabled automatically the moment you use -$this->db->trans_start(). If you would like to disable transactions you -can do so using $this->db->trans_off():: +If you would like to disable transactions you can do so using +``$this->db->trans_off()``:: $this->db->trans_off(); @@ -88,8 +87,9 @@ can do so using $this->db->trans_off():: $this->db->query('AN SQL QUERY...'); $this->db->trans_complete(); -When transactions are disabled, your queries will be auto-commited, just -as they are when running queries without transactions. +When transactions are disabled, your queries will be auto-commited, just as +they are when running queries without transactions, practically ignoring +any calls to ``trans_start()``, ``trans_complete()``, etc. Test Mode ========= From 40282340cd7de02cbe8297f557b7d3e23cbc652a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 26 Oct 2016 17:41:18 +0300 Subject: [PATCH 4524/5397] Fix #4877 --- system/core/Security.php | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/system/core/Security.php b/system/core/Security.php index 4a69daa181b..b9160a252b2 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -371,11 +371,17 @@ public function xss_clean($str, $is_image = FALSE) * * Note: Use rawurldecode() so it does not remove plus signs */ - do + if (stripos($str, '%') !== false) { - $str = rawurldecode($str); + do + { + $oldstr = $str; + $str = rawurldecode($str); + $str = preg_replace_callback('#%(?:\s*[0-9a-f]){2,}#i', array($this, '_urldecodespaces'), $str); + } + while ($oldstr !== $str); + unset($oldstr); } - while (preg_match('/%[0-9a-f]{2,}/i', $str)); /* * Convert character entities to ASCII @@ -466,7 +472,7 @@ public function xss_clean($str, $is_image = FALSE) if (preg_match('/
    ]+([^>]*?)(?:>|$)#si', array($this, '_js_link_removal'), $str); + $str = preg_replace_callback('#]+([^>]*?)(?:>|$)#si', array($this, '_js_link_removal'), $str); } if (preg_match('/ Date: Thu, 27 Oct 2016 15:06:46 +0300 Subject: [PATCH 4525/5397] [ci skip] This is 3.1.2-dev --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/installation/downloads.rst | 3 ++- user_guide_src/source/installation/upgrade_312.rst | 14 ++++++++++++++ user_guide_src/source/installation/upgrading.rst | 3 ++- 5 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 user_guide_src/source/installation/upgrade_312.rst diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index c5d26e52bd1..6562e99a2f8 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - const CI_VERSION = '3.1.1'; + const CI_VERSION = '3.1.2-dev'; /* * ------------------------------------------------------ diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index a685c444235..17771fa9e80 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.1.1' +version = '3.1.2-dev' # The full version, including alpha/beta/rc tags. -release = '3.1.1' +release = '3.1.2-dev' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index d04bccb7cb1..1eacd4d335a 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,8 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.1.1 (Current version) `_ +- `CodeIgniter v3.1.2-dev (Current version) `_ +- `CodeIgniter v3.1.1 `_ - `CodeIgniter v3.1.0 `_ - `CodeIgniter v3.0.6 `_ - `CodeIgniter v3.0.5 `_ diff --git a/user_guide_src/source/installation/upgrade_312.rst b/user_guide_src/source/installation/upgrade_312.rst new file mode 100644 index 00000000000..91467233e3b --- /dev/null +++ b/user_guide_src/source/installation/upgrade_312.rst @@ -0,0 +1,14 @@ +############################# +Upgrading from 3.1.1 to 3.1.2 +############################# + +Before performing an update you should take your site offline by +replacing the index.php file with a static one. + +Step 1: Update your CodeIgniter files +===================================== + +Replace all files and directories in your *system/* directory. + +.. note:: If you have any custom developed files in these directories, + please make copies of them first. diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index 727d054d1b1..61b16e038fc 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -8,8 +8,9 @@ upgrading from. .. toctree:: :titlesonly: + Upgrading from 3.1.2 to 3.1.2 Upgrading from 3.1.0 to 3.1.1 - Upgrading from 3.0.6 to 3.1.0 + Upgrading from 3.0.6 to 3.1.x Upgrading from 3.0.5 to 3.0.6 Upgrading from 3.0.4 to 3.0.5 Upgrading from 3.0.3 to 3.0.4 From 098412502a966597631470a2f0cf935d9ecfe16d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 27 Oct 2016 15:10:30 +0300 Subject: [PATCH 4526/5397] [ci skip] Add changelog entry for #4877 --- user_guide_src/source/changelog.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2d9ef69b578..ee66cc0a428 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -2,6 +2,15 @@ Change Log ########## +Version 3.1.2 +============= + +Release Date: Not Released + +- **Security** + + - Fixed a new URL-encoding attack vector in :doc:`Security Library ` method ``xss_clean()`` affecting Firefox. + Version 3.1.1 ============= From 7bc882384ef4c442fb4edd699c8dd15bbd22e429 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 27 Oct 2016 15:41:23 +0300 Subject: [PATCH 4527/5397] Close #4875 --- system/core/CodeIgniter.php | 21 ++++++++++++++++++++- user_guide_src/source/changelog.rst | 4 ++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 6562e99a2f8..32ad6189981 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -416,10 +416,29 @@ function &get_instance() $params = array($method, array_slice($URI->rsegments, 2)); $method = '_remap'; } - elseif ( ! is_callable(array($class, $method))) + elseif ( ! method_exists($class, $method)) { $e404 = TRUE; } + /** + * DO NOT CHANGE THIS, NOTHING ELSE WORKS! + * + * - method_exists() returns true for non-public methods, which passes the previous elseif + * - is_callable() returns false for PHP 4-style constructors, even if there's a __construct() + * - method_exists($class, '__construct') won't work because CI_Controller::__construct() is inherited + * - People will only complain if this doesn't work, even though it is documented that it shouldn't. + * + * ReflectionMethod::isConstructor() is the ONLY reliable check, + * knowing which method will be executed as a constructor. + */ + elseif ( ! is_callable(array($class, $method)) && strcasecmp($class, $method) === 0) + { + $reflection = new ReflectionMethod($class, $method); + if ( ! $reflection->isPublic() OR $reflection->isConstructor()) + { + $e404 = TRUE; + } + } } if ($e404) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ee66cc0a428..b7be0866f8e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -11,6 +11,10 @@ Release Date: Not Released - Fixed a new URL-encoding attack vector in :doc:`Security Library ` method ``xss_clean()`` affecting Firefox. +- General Changes + + - Allowed PHP 4-style constructors (``Mathching_name::Matching_name()`` methods) to be used as routes, if there's a ``__construct()`` to override them. + Version 3.1.1 ============= From 2f760877c313871e5066b93b0b1aa76428c09fb6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 27 Oct 2016 16:39:12 +0300 Subject: [PATCH 4528/5397] Fix #4874 --- system/libraries/Session/Session.php | 63 ++++++++++++++++++++++++---- user_guide_src/source/changelog.rst | 5 +++ 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index 5aac12f36e9..ea7853108eb 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -318,35 +318,80 @@ protected function _configure(&$params) ini_set('session.use_cookies', 1); ini_set('session.use_only_cookies', 1); + $this->_configure_sid_length(); + } + + // ------------------------------------------------------------------------ + + /** + * Configure session ID length + * + * To make life easier, we used to force SHA-1 and 4 bits per + * character on everyone. And of course, someone was unhappy. + * + * Then PHP 7.1 broke backwards-compatibility because ext/session + * is such a mess that nobody wants to touch it with a pole stick, + * and the one guy who does, nobody has the energy to argue with. + * + * So we were forced to make changes, and OF COURSE something was + * going to break and now we have this pile of shit. -- Narf + * + * @return void + */ + protected function _configure_sid_length() + { if (PHP_VERSION_ID < 70100) { - if ((int) ini_get('session.hash_function') === 0) + $hash_function = ini_get('session.hash_function'); + if (ctype_digit($hash_function)) + { + if ($hash_function !== '1') + { + ini_set('session.hash_function', 1); + $bits = 160; + } + } + elseif ( ! in_array($hash_function, hash_algos(), TRUE)) { ini_set('session.hash_function', 1); - ini_set('session.hash_bits_per_character', $bits_per_character = 4); + $bits = 160; } - else + elseif (($bits = strlen(hash($hash_function, 'dummy', false)) * 4) < 160) { - $bits_per_character = (int) ini_get('session.hash_bits_per_character'); + ini_set('session.hash_function', 1); + $bits = 160; } + + $bits_per_character = (int) ini_get('session.hash_bits_per_character'); + $sid_length = $bits * $bits_per_character; } - elseif ((int) ini_get('session.sid_length') < 40 && ($bits_per_character = (int) ini_get('session.sid_bits_per_character')) === 4) + else { - ini_set('session.sid_length', 40); + $bits_per_character = (int) ini_get('session.sid_bits_per_character'); + $sid_length = (int) ini_get('session.sid_length'); + if (($bits = $sid_length * $bits_per_character) < 160) + { + // Add as many more characters as necessary to reach at least 160 bits + $sid_length += (int) ceil((160 % $bits) / $bits_per_character); + ini_set('session.sid_length', $sid_length); + } } + // Yes, 4,5,6 are the only known possible values as of 2016-10-27 switch ($bits_per_character) { case 4: - $this->_sid_regexp = '[0-9a-f]{40,}'; + $this->_sid_regexp = '[0-9a-f]'; break; case 5: - $this->_sid_regexp = '[0-9a-v]{40,}'; + $this->_sid_regexp = '[0-9a-v]'; break; case 6: - $this->_sid_regexp = '[0-9a-zA-Z,-]{40,}'; + $this->_sid_regexp = '[0-9a-zA-Z,-]'; break; } + + $this->_sid_regexp .= '{'.$sid_length.'}'; } // ------------------------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b7be0866f8e..4c6143c5989 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -15,6 +15,11 @@ Release Date: Not Released - Allowed PHP 4-style constructors (``Mathching_name::Matching_name()`` methods) to be used as routes, if there's a ``__construct()`` to override them. +Bug fixes for 3.1.2 +------------------- + +- Fixed a regression (#4874) - :doc:`Session Library ` didn't take into account `session.hash_bits_per_character` when validating session IDs. + Version 3.1.1 ============= From 2b9d88c3fe78218bb9d8bcbb6ea114d190bc0d0e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 27 Oct 2016 16:47:57 +0300 Subject: [PATCH 4529/5397] [ci skip] Fix changelog entry formatting from last commit --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4c6143c5989..51242efa32d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -18,7 +18,7 @@ Release Date: Not Released Bug fixes for 3.1.2 ------------------- -- Fixed a regression (#4874) - :doc:`Session Library ` didn't take into account `session.hash_bits_per_character` when validating session IDs. +- Fixed a regression (#4874) - :doc:`Session Library ` didn't take into account ``session.hash_bits_per_character`` when validating session IDs. Version 3.1.1 ============= From 0c23e9122666a30797079bea9415da135d4f7e12 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 27 Oct 2016 16:55:19 +0300 Subject: [PATCH 4530/5397] Fix #4871 --- system/database/DB_query_builder.php | 8 +++++--- user_guide_src/source/changelog.rst | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 7a008eeb8e8..5491b20005a 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1915,7 +1915,7 @@ public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 1 $affected_rows = 0; for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) { - if ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, $batch_size), $this->protect_identifiers($index)))) + if ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, $batch_size), $index))) { $affected_rows += $this->affected_rows(); } @@ -1941,6 +1941,8 @@ public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 1 */ protected function _update_batch($table, $values, $index) { + $index_escaped = $this->protect_identifiers($index); + $ids = array(); foreach ($values as $key => $val) { @@ -1950,7 +1952,7 @@ protected function _update_batch($table, $values, $index) { if ($field !== $index) { - $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; + $final[$field][] = 'WHEN '.$index_escaped.' = '.$val[$index].' THEN '.$val[$field]; } } } @@ -1963,7 +1965,7 @@ protected function _update_batch($table, $values, $index) .'ELSE '.$k.' END, '; } - $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); + $this->where($index_escaped.' IN('.implode(',', $ids).')', NULL, FALSE); return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 51242efa32d..58ca20ee9c4 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -19,6 +19,7 @@ Bug fixes for 3.1.2 ------------------- - Fixed a regression (#4874) - :doc:`Session Library ` didn't take into account ``session.hash_bits_per_character`` when validating session IDs. +- Fixed a bug (#4871) - :doc:`Query Builder ` method ``update_batch()`` didn't properly handle identifier escaping. Version 3.1.1 ============= From dbc025b6c2c9b0b085bb79dc126bc58fb2a8c2a8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 27 Oct 2016 17:37:25 +0300 Subject: [PATCH 4531/5397] [ci skip] Another attempt at #4874 --- system/libraries/Session/Session.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index ea7853108eb..01989d2d71b 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -348,8 +348,9 @@ protected function _configure_sid_length() if ($hash_function !== '1') { ini_set('session.hash_function', 1); - $bits = 160; } + + $bits = 160; } elseif ( ! in_array($hash_function, hash_algos(), TRUE)) { @@ -363,7 +364,7 @@ protected function _configure_sid_length() } $bits_per_character = (int) ini_get('session.hash_bits_per_character'); - $sid_length = $bits * $bits_per_character; + $sid_length = (int) ceil($bits / $bits_per_character); } else { From be4bab99fc8165858568e0278492aaebecee68f0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 12:50:03 +0300 Subject: [PATCH 4532/5397] Fix #4884 --- system/database/DB_query_builder.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 5491b20005a..5a86ce50f41 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -679,7 +679,7 @@ protected function _wh($qb_key, $key, $value = NULL, $type = 'AND ', $escape = N // value appears not to have been set, assign the test to IS NULL $k .= ' IS NULL'; } - elseif (preg_match('/\s*(!?=|<>|IS(?:\s+NOT)?)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE)) + elseif (preg_match('/\s*(!?=|<>|\sIS(?:\s+NOT)?\s)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE)) { $k = substr($k, 0, $match[0][1]).($match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL'); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 58ca20ee9c4..0a8160acb6d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -20,6 +20,7 @@ Bug fixes for 3.1.2 - Fixed a regression (#4874) - :doc:`Session Library ` didn't take into account ``session.hash_bits_per_character`` when validating session IDs. - Fixed a bug (#4871) - :doc:`Query Builder ` method ``update_batch()`` didn't properly handle identifier escaping. +- Fixed a bug (#4884) - :doc:`Query Builder ` didn't properly parse field names ending in 'is' when used inside WHERE and HAVING statements. Version 3.1.1 ============= From 8bb7f7f50e99407c5f4def6e2f8e429245bd8613 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 13:16:38 +0300 Subject: [PATCH 4533/5397] [ci skip] Add upgrade instructions for CI_Sessions --- .../source/installation/upgrade_312.rst | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/user_guide_src/source/installation/upgrade_312.rst b/user_guide_src/source/installation/upgrade_312.rst index 91467233e3b..e0b2191dd37 100644 --- a/user_guide_src/source/installation/upgrade_312.rst +++ b/user_guide_src/source/installation/upgrade_312.rst @@ -12,3 +12,29 @@ Replace all files and directories in your *system/* directory. .. note:: If you have any custom developed files in these directories, please make copies of them first. + +Step 2: Update your "ci_sessions" database table +================================================ + +If you're using the :doc:`Session Library ` with the +'database' driver, you may have to ``ALTER`` your sessions table for your +sessions to continue to work. + +.. note:: The table in question is not necessarily named "ci_sessions". + It is what you've set as your ``$config['sess_save_path']``. + +This will only affect you if you've changed your ``session.hash_function`` +*php.ini* setting to something like 'sha512'. Or if you've been running +an older CodeIgniter version on PHP 7.1+. + +It is recommended that you do this anyway, just to avoid potential issues +in the future if you do change your configuration. + +Just execute the one of the following SQL queries, depending on your +database:: + + // MySQL: + ALTER TABLE ci_sessions CHANGE id id varchar(128) NOT NULL; + + // PostgreSQL + ALTER TABLE ci_sessions ALTER COLUMN id SET DATA TYPE varchar(128); From 4c7323e2e0ff8f39e4b14233903c3bba878240b7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 13:18:17 +0300 Subject: [PATCH 4534/5397] [ci skip] Clear trailing whitespace from PR #4834 --- system/helpers/inflector_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index 6dc3b50308c..f54dac019e9 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -268,7 +268,7 @@ function is_countable($word) 'species', 'swine', 'traffic', - 'wheat', + 'wheat' ) ); } From c274a8fc7f8f0a012e8c535eab976af01d6e106b Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Fri, 28 Oct 2016 18:43:30 +0800 Subject: [PATCH 4535/5397] Match both single and double quote in compile_binds(). Signed-off-by: tianhe1986 --- system/database/DB_driver.php | 2 +- system/database/drivers/odbc/odbc_driver.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 43e8eeac660..465d8db7bee 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -938,7 +938,7 @@ public function compile_binds($sql, $binds) $ml = strlen($this->bind_marker); // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/'[^']*'/i", $sql, $matches)) + if ($c = preg_match_all("/(['\"])[^\\1]*\\1/i", $sql, $matches)) { $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', str_replace($matches[0], diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 63df2963de9..3a893ace423 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -172,7 +172,7 @@ public function compile_binds($sql, $binds) $ml = strlen($this->bind_marker); // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/'[^']*'/i", $sql, $matches)) + if ($c = preg_match_all("/(['\"])[^\\1]*\\1/i", $sql, $matches)) { $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', str_replace($matches[0], From eef5951ae313c2c4080e94b8c1aa743a6d6c93b7 Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Fri, 28 Oct 2016 18:48:35 +0800 Subject: [PATCH 4536/5397] Match single quote in is_write_type(). Signed-off-by: tianhe1986 --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 465d8db7bee..a9a3f29e530 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -982,7 +982,7 @@ public function compile_binds($sql, $binds) */ public function is_write_type($sql) { - return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', $sql); + return (bool) preg_match('/^\s*["\']?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', $sql); } // -------------------------------------------------------------------- From 4e2cdec6ff4b4af5f994be4c348ad3b9a9a2942f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 14:19:08 +0300 Subject: [PATCH 4537/5397] Improve byte-safety --- system/core/Log.php | 53 +++++++++++++++++- system/core/Output.php | 62 +++++++++++++++++--- system/libraries/Email.php | 87 ++++++++++++++++++++++------- system/libraries/Zip.php | 74 +++++++++++++++++++----- user_guide_src/source/changelog.rst | 1 + 5 files changed, 236 insertions(+), 41 deletions(-) diff --git a/system/core/Log.php b/system/core/Log.php index 986121526b2..cf6c75a950f 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -104,6 +104,13 @@ class CI_Log { */ protected $_levels = array('ERROR' => 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4); + /** + * mbstring.func_override flag + * + * @var bool + */ + protected static $func_override; + // -------------------------------------------------------------------- /** @@ -115,6 +122,8 @@ public function __construct() { $config =& get_config(); + isset(self::$func_override) OR self::$func_override = (extension_loaded('mbstring') && ini_get('mbstring.func_override')); + $this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/'; $this->_file_ext = (isset($config['log_file_extension']) && $config['log_file_extension'] !== '') ? ltrim($config['log_file_extension'], '.') : 'php'; @@ -208,9 +217,9 @@ public function write_log($level, $msg) $message .= $this->_format_line($level, $date, $msg); - for ($written = 0, $length = strlen($message); $written < $length; $written += $result) + for ($written = 0, $length = self::strlen($message); $written < $length; $written += $result) { - if (($result = fwrite($fp, substr($message, $written))) === FALSE) + if (($result = fwrite($fp, self::substr($message, $written))) === FALSE) { break; } @@ -244,4 +253,44 @@ protected function _format_line($level, $date, $message) { return $level.' - '.$date.' --> '.$message."\n"; } + + // -------------------------------------------------------------------- + + /** + * Byte-safe strlen() + * + * @param string $str + * @return int + */ + protected static function strlen($str) + { + return (self::$func_override) + ? mb_strlen($str, '8bit') + : strlen($str); + } + + // -------------------------------------------------------------------- + + /** + * Byte-safe substr() + * + * @param string $str + * @param int $start + * @param int $length + * @return string + */ + protected static function substr($str, $start, $length = NULL) + { + if (self::$func_override) + { + // mb_substr($str, $start, null, '8bit') returns an empty + // string on PHP 5.3 + isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); + return mb_substr($str, $start, $length, '8bit'); + } + + return isset($length) + ? substr($str, $start, $length) + : substr($str, $start); + } } diff --git a/system/core/Output.php b/system/core/Output.php index 06ff1011ca5..cf6510ff16a 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -122,6 +122,13 @@ class CI_Output { */ public $parse_exec_vars = TRUE; + /** + * mbstring.func_override flag + * + * @var bool + */ + protected static $func_override; + /** * Class constructor * @@ -138,6 +145,8 @@ public function __construct() && extension_loaded('zlib') ); + isset(self::$func_override) OR self::$func_override = (extension_loaded('mbstring') && ini_get('mbstring.func_override')); + // Get mime types for later $this->mimes =& get_mimes(); @@ -304,9 +313,9 @@ public function get_header($header) for ($i = 0, $c = count($headers); $i < $c; $i++) { - if (strncasecmp($header, $headers[$i], $l = strlen($header)) === 0) + if (strncasecmp($header, $headers[$i], $l = self::strlen($header)) === 0) { - return trim(substr($headers[$i], $l+1)); + return trim(self::substr($headers[$i], $l+1)); } } @@ -480,13 +489,13 @@ public function _display($output = '') if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) { header('Content-Encoding: gzip'); - header('Content-Length: '.strlen($output)); + header('Content-Length: '.self::strlen($output)); } else { // User agent doesn't support gzip compression, // so we'll have to decompress our cache - $output = gzinflate(substr($output, 10, -8)); + $output = gzinflate(self::substr($output, 10, -8)); } } @@ -601,9 +610,9 @@ public function _write_cache($output) $output = $cache_info.'ENDCI--->'.$output; - for ($written = 0, $length = strlen($output); $written < $length; $written += $result) + for ($written = 0, $length = self::strlen($output); $written < $length; $written += $result) { - if (($result = fwrite($fp, substr($output, $written))) === FALSE) + if (($result = fwrite($fp, self::substr($output, $written))) === FALSE) { break; } @@ -711,7 +720,7 @@ public function _display_cache(&$CFG, &$URI) } // Display the cache - $this->_display(substr($cache, strlen($match[0]))); + $this->_display(self::substr($cache, self::strlen($match[0]))); log_message('debug', 'Cache file is current. Sending it to browser.'); return TRUE; } @@ -797,4 +806,43 @@ public function set_cache_header($last_modified, $expiration) } } + // -------------------------------------------------------------------- + + /** + * Byte-safe strlen() + * + * @param string $str + * @return int + */ + protected static function strlen($str) + { + return (self::$func_override) + ? mb_strlen($str, '8bit') + : strlen($str); + } + + // -------------------------------------------------------------------- + + /** + * Byte-safe substr() + * + * @param string $str + * @param int $start + * @param int $length + * @return string + */ + protected static function substr($str, $start, $length = NULL) + { + if (self::$func_override) + { + // mb_substr($str, $start, null, '8bit') returns an empty + // string on PHP 5.3 + isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); + return mb_substr($str, $start, $length, '8bit'); + } + + return isset($length) + ? substr($str, $start, $length) + : substr($str, $start); + } } diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 7f49c1b3d89..676bbcafb56 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -374,6 +374,13 @@ class CI_Email { 5 => '5 (Lowest)' ); + /** + * mbstring.func_override flag + * + * @var bool + */ + protected static $func_override; + // -------------------------------------------------------------------- /** @@ -390,6 +397,8 @@ public function __construct(array $config = array()) $this->initialize($config); $this->_safe_mode = ( ! is_php('5.4') && ini_get('safe_mode')); + isset(self::$func_override) OR self::$func_override = (extension_loaded('mbstring') && ini_get('mbstring.func_override')); + log_message('info', 'Email Class Initialized'); } @@ -1037,7 +1046,7 @@ public function valid_email($email) { if (function_exists('idn_to_ascii') && $atpos = strpos($email, '@')) { - $email = substr($email, 0, ++$atpos).idn_to_ascii(substr($email, $atpos)); + $email = self::substr($email, 0, ++$atpos).idn_to_ascii(self::substr($email, $atpos)); } return (bool) filter_var($email, FILTER_VALIDATE_EMAIL); @@ -1154,7 +1163,7 @@ public function word_wrap($str, $charlim = NULL) { // Is the line within the allowed character count? // If so we'll join it to the output and continue - if (mb_strlen($line) <= $charlim) + if (self::strlen($line) <= $charlim) { $output .= $line.$this->newline; continue; @@ -1170,10 +1179,10 @@ public function word_wrap($str, $charlim = NULL) } // Trim the word down - $temp .= mb_substr($line, 0, $charlim - 1); - $line = mb_substr($line, $charlim - 1); + $temp .= self::substr($line, 0, $charlim - 1); + $line = self::substr($line, $charlim - 1); } - while (mb_strlen($line) > $charlim); + while (self::strlen($line) > $charlim); // 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 @@ -1385,7 +1394,7 @@ protected function _build_message() $this->_header_str .= $hdr; } - strlen($body) && $body .= $this->newline.$this->newline; + self::strlen($body) && $body .= $this->newline.$this->newline; $body .= $this->_get_mime_message().$this->newline.$this->newline .'--'.$last_boundary.$this->newline @@ -1532,7 +1541,7 @@ protected function _prep_quoted_printable($str) foreach (explode("\n", $str) as $line) { - $length = strlen($line); + $length = self::strlen($line); $temp = ''; // Loop through each character in the line to add soft-wrap @@ -1567,7 +1576,7 @@ protected function _prep_quoted_printable($str) // If we're at the character limit, add the line to the output, // reset our temp variable, and keep on chuggin' - if ((strlen($temp) + strlen($char)) >= 76) + if ((self::strlen($temp) + self::strlen($char)) >= 76) { $output .= $temp.$escape.$this->crlf; $temp = ''; @@ -1582,7 +1591,7 @@ protected function _prep_quoted_printable($str) } // get rid of extra CRLF tacked onto the end - return substr($output, 0, strlen($this->crlf) * -1); + return self::substr($output, 0, self::strlen($this->crlf) * -1); } // -------------------------------------------------------------------- @@ -1624,7 +1633,7 @@ protected function _prep_q_encoding($str) // iconv_mime_encode() will always put a header field name. // We've passed it an empty one, but it still prepends our // encoded string with ': ', so we need to strip it. - return substr($output, 2); + return self::substr($output, 2); } $chars = iconv_strlen($str, 'UTF-8'); @@ -1636,10 +1645,10 @@ protected function _prep_q_encoding($str) } // We might already have this set for UTF-8 - isset($chars) OR $chars = strlen($str); + isset($chars) OR $chars = self::strlen($str); $output = '=?'.$this->charset.'?Q?'; - for ($i = 0, $length = strlen($output); $i < $chars; $i++) + for ($i = 0, $length = self::strlen($output); $i < $chars; $i++) { $chr = ($this->charset === 'UTF-8' && ICONV_ENABLED === TRUE) ? '='.implode('=', str_split(strtoupper(bin2hex(iconv_substr($str, $i, 1, $this->charset))), 2)) @@ -1647,11 +1656,11 @@ protected function _prep_q_encoding($str) // RFC 2045 sets a limit of 76 characters per line. // We'll append ?= to the end of each line though. - if ($length + ($l = strlen($chr)) > 74) + if ($length + ($l = self::strlen($chr)) > 74) { $output .= '?='.$this->crlf // EOL .' =?'.$this->charset.'?Q?'.$chr; // New line - $length = 6 + strlen($this->charset) + $l; // Reset the length for the new line + $length = 6 + self::strlen($this->charset) + $l; // Reset the length for the new line } else { @@ -1744,14 +1753,14 @@ public function batch_bcc_send() if ($i === $float) { - $chunk[] = substr($set, 1); + $chunk[] = self::substr($set, 1); $float += $this->bcc_batch_size; $set = ''; } if ($i === $c-1) { - $chunk[] = substr($set, 1); + $chunk[] = self::substr($set, 1); } } @@ -2109,7 +2118,7 @@ protected function _send_command($cmd, $data = '') $this->_debug_msg[] = '
    '.$cmd.': '.$reply.'
    '; - if ((int) substr($reply, 0, 3) !== $resp) + if ((int) self::substr($reply, 0, 3) !== $resp) { $this->_set_error_message('lang:email_smtp_error', $reply); return FALSE; @@ -2196,9 +2205,9 @@ protected function _smtp_authenticate() protected function _send_data($data) { $data .= $this->newline; - for ($written = $timestamp = 0, $length = strlen($data); $written < $length; $written += $result) + for ($written = $timestamp = 0, $length = self::strlen($data); $written < $length; $written += $result) { - if (($result = fwrite($this->_smtp_connect, substr($data, $written))) === FALSE) + if (($result = fwrite($this->_smtp_connect, self::substr($data, $written))) === FALSE) { break; } @@ -2382,4 +2391,44 @@ public function __destruct() { is_resource($this->_smtp_connect) && $this->_send_command('quit'); } + + // -------------------------------------------------------------------- + + /** + * Byte-safe strlen() + * + * @param string $str + * @return int + */ + protected static function strlen($str) + { + return (self::$func_override) + ? mb_strlen($str, '8bit') + : strlen($str); + } + + // -------------------------------------------------------------------- + + /** + * Byte-safe substr() + * + * @param string $str + * @param int $start + * @param int $length + * @return string + */ + protected static function substr($str, $start, $length = NULL) + { + if (self::$func_override) + { + // mb_substr($str, $start, null, '8bit') returns an empty + // string on PHP 5.3 + isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); + return mb_substr($str, $start, $length, '8bit'); + } + + return isset($length) + ? substr($str, $start, $length) + : substr($str, $start); + } } diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index 140ad72123c..25315c92e67 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -105,6 +105,13 @@ class CI_Zip { */ public $compression_level = 2; + /** + * mbstring.func_override flag + * + * @var bool + */ + protected static $func_override; + /** * Initialize zip compression class * @@ -112,6 +119,8 @@ class CI_Zip { */ public function __construct() { + isset(self::$func_override) OR self::$func_override = (extension_loaded('mbstring') && ini_get('mbstring.func_override')); + $this->now = time(); log_message('info', 'Zip Compression Class Initialized'); } @@ -182,7 +191,7 @@ protected function _add_dir($dir, $file_mtime, $file_mdate) .pack('V', 0) // crc32 .pack('V', 0) // compressed filesize .pack('V', 0) // uncompressed filesize - .pack('v', strlen($dir)) // length of pathname + .pack('v', self::strlen($dir)) // length of pathname .pack('v', 0) // extra field length .$dir // below is "data descriptor" segment @@ -197,7 +206,7 @@ protected function _add_dir($dir, $file_mtime, $file_mdate) .pack('V',0) // crc32 .pack('V',0) // compressed filesize .pack('V',0) // uncompressed filesize - .pack('v', strlen($dir)) // length of pathname + .pack('v', self::strlen($dir)) // length of pathname .pack('v', 0) // extra field length .pack('v', 0) // file comment length .pack('v', 0) // disk number start @@ -206,7 +215,7 @@ protected function _add_dir($dir, $file_mtime, $file_mdate) .pack('V', $this->offset) // relative offset of local header .$dir; - $this->offset = strlen($this->zipdata); + $this->offset = self::strlen($this->zipdata); $this->entries++; } @@ -255,10 +264,10 @@ protected function _add_data($filepath, $data, $file_mtime, $file_mdate) { $filepath = str_replace('\\', '/', $filepath); - $uncompressed_size = strlen($data); + $uncompressed_size = self::strlen($data); $crc32 = crc32($data); - $gzdata = substr(gzcompress($data, $this->compression_level), 2, -4); - $compressed_size = strlen($gzdata); + $gzdata = self::substr(gzcompress($data, $this->compression_level), 2, -4); + $compressed_size = self::strlen($gzdata); $this->zipdata .= "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00" @@ -267,7 +276,7 @@ protected function _add_data($filepath, $data, $file_mtime, $file_mdate) .pack('V', $crc32) .pack('V', $compressed_size) .pack('V', $uncompressed_size) - .pack('v', strlen($filepath)) // length of filename + .pack('v', self::strlen($filepath)) // length of filename .pack('v', 0) // extra field length .$filepath .$gzdata; // "file data" segment @@ -279,7 +288,7 @@ protected function _add_data($filepath, $data, $file_mtime, $file_mdate) .pack('V', $crc32) .pack('V', $compressed_size) .pack('V', $uncompressed_size) - .pack('v', strlen($filepath)) // length of filename + .pack('v', self::strlen($filepath)) // length of filename .pack('v', 0) // extra field length .pack('v', 0) // file comment length .pack('v', 0) // disk number start @@ -288,7 +297,7 @@ protected function _add_data($filepath, $data, $file_mtime, $file_mdate) .pack('V', $this->offset) // relative offset of local header .$filepath; - $this->offset = strlen($this->zipdata); + $this->offset = self::strlen($this->zipdata); $this->entries++; $this->file_num++; } @@ -401,8 +410,8 @@ public function get_zip() .$this->directory."\x50\x4b\x05\x06\x00\x00\x00\x00" .pack('v', $this->entries) // total # of entries "on this disk" .pack('v', $this->entries) // total # of entries overall - .pack('V', strlen($this->directory)) // size of central dir - .pack('V', strlen($this->zipdata)) // offset to start of central dir + .pack('V', self::strlen($this->directory)) // size of central dir + .pack('V', self::strlen($this->zipdata)) // offset to start of central dir ."\x00\x00"; // .zip file comment length } @@ -425,9 +434,9 @@ public function archive($filepath) flock($fp, LOCK_EX); - for ($result = $written = 0, $data = $this->get_zip(), $length = strlen($data); $written < $length; $written += $result) + for ($result = $written = 0, $data = $this->get_zip(), $length = self::strlen($data); $written < $length; $written += $result) { - if (($result = fwrite($fp, substr($data, $written))) === FALSE) + if (($result = fwrite($fp, self::substr($data, $written))) === FALSE) { break; } @@ -481,4 +490,43 @@ public function clear_data() return $this; } + // -------------------------------------------------------------------- + + /** + * Byte-safe strlen() + * + * @param string $str + * @return int + */ + protected static function strlen($str) + { + return (self::$func_override) + ? mb_strlen($str, '8bit') + : strlen($str); + } + + // -------------------------------------------------------------------- + + /** + * Byte-safe substr() + * + * @param string $str + * @param int $start + * @param int $length + * @return string + */ + protected static function substr($str, $start, $length = NULL) + { + if (self::$func_override) + { + // mb_substr($str, $start, null, '8bit') returns an empty + // string on PHP 5.3 + isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); + return mb_substr($str, $start, $length, '8bit'); + } + + return isset($length) + ? substr($str, $start, $length) + : substr($str, $start); + } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 0a8160acb6d..4be0b31d368 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -21,6 +21,7 @@ Bug fixes for 3.1.2 - Fixed a regression (#4874) - :doc:`Session Library ` didn't take into account ``session.hash_bits_per_character`` when validating session IDs. - Fixed a bug (#4871) - :doc:`Query Builder ` method ``update_batch()`` didn't properly handle identifier escaping. - Fixed a bug (#4884) - :doc:`Query Builder ` didn't properly parse field names ending in 'is' when used inside WHERE and HAVING statements. +- Fixed a bug where ``CI_Log``, ``CI_Output``, ``CI_Email`` and ``CI_Zip`` didn't handle strings in a byte-safe manner when ``mbstring.func_override`` is enabled. Version 3.1.1 ============= From df34b547c97ba1ce1ddb819495d299cb845a87de Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 14:47:20 +0300 Subject: [PATCH 4538/5397] [ci skip] Add changelog entry for & polish doc changes from PR #4826 --- user_guide_src/source/changelog.rst | 4 ++++ user_guide_src/source/libraries/table.rst | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f60387cd5ba..518569097f4 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -27,6 +27,10 @@ Release Date: Not Released - Changed method ``set_rules()`` to throw a ``BadMethodCallException`` when its first parameter is not an array and the ``$rules`` one is unused. + - :doc:`HTML Table Library ` changes include: + + - Changed method ``clear()`` to also reset captions. + - Database - Changed method ``initialize()`` to return void and instead throw a ``RuntimeException`` in case of failure. diff --git a/user_guide_src/source/libraries/table.rst b/user_guide_src/source/libraries/table.rst index 3cd120f953c..06dfe59de09 100644 --- a/user_guide_src/source/libraries/table.rst +++ b/user_guide_src/source/libraries/table.rst @@ -275,8 +275,12 @@ Class Reference :returns: CI_Table instance (method chaining) :rtype: CI_Table - Lets you clear the table heading, row data and the caption. If you need to show multiple tables with different data you should to call this method - after each table has been generated to clear the previous table information. Example:: + Lets you clear the table heading, row data and caption. If + you need to show multiple tables with different data you + should to call this method after each table has been + generated to clear the previous table information. + + Example :: $this->load->library('table'); From e02ebabb19242e1cfc6b37217bc799ff7591e941 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 16:35:12 +0300 Subject: [PATCH 4539/5397] [ci skip] Add a bash script to help with releases --- build-release.sh | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100755 build-release.sh diff --git a/build-release.sh b/build-release.sh new file mode 100755 index 00000000000..490680e7916 --- /dev/null +++ b/build-release.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash + +cd $(dirname $BASH_SOURCE) + +if [ $# -eq 0 ]; then + echo 'Usage: '$BASH_SOURCE' ' + exit 1 +fi + +version_number=$1 + +if [ ${#version_number} -lt 5 ] +then + echo "Provided version number is too short" + exit 1 +elif [ ${version_number: -4} == "-dev" ] +then + echo "'-dev' releases are not allowed" + exit 1 +fi + +version_id=${version_number:0:5} +version_id=${version_id//./} +upgrade_rst='user_guide_src/source/installation/upgrade_'$version_id'.rst' + +if [ ${#version_id} -ne 3 ] +then + echo "Invalid version number format" + exit 1 +elif [ `grep -c -F --regexp="'$version_number'" system/core/CodeIgniter.php` -ne 1 ] +then + echo "Provided version number doesn't match in system/core/CodeIgniter.php" + exit 1 +elif [ `grep -c -F --regexp="'$version_number'" user_guide_src/source/conf.py` -ne 2 ] +then + echo "Provided version number doesn't match in user_guide_src/source/conf.py" + exit 1 +elif [ ! -f "$upgrade_rst" ] +then + echo "${upgrade_rst} doesn't exist" + exit 1 +fi + +echo "Running tests ..." + +cd tests/ +phpunit + +if [ $? -ne 0 ] +then + echo "Build FAILED!" + exit 1 +fi + +cd .. +cd user_guide_src/ + +echo "" +echo "Building HTML docs; please check output for warnings ..." +echo "" + +make html + +echo "" + +if [ $? -ne 0 ] +then + echo "Build FAILED!" + exit 1 +fi + +echo "Building EPUB docs; please check output for warnings ..." +echo "" + +make epub + +echo "" + +if [ $? -ne 0 ] +then + echo "Build FAILED!" + exit 1 +fi + +cd .. + +if [ -d user_guide/ ] +then + rm -r user_guide/ +fi + +cp -r user_guide_src/build/html/ user_guide/ +cp user_guide_src/build/epub/CodeIgniter.epub "CodeIgniter ${version_number}.epub" + +echo "Build complete." From 57fa143448577b670d8dd0e02b6e4cf31c4a7cff Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 17:46:31 +0300 Subject: [PATCH 4540/5397] [ci skip] xss_clean() hardening - percent-sign tag (IE) - data: URI scheme inclinding whitespace (Chrome) --- system/core/Security.php | 21 +++++++++++---------- user_guide_src/source/changelog.rst | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/system/core/Security.php b/system/core/Security.php index b9160a252b2..d0308c5f95b 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -133,15 +133,16 @@ class CI_Security { * @var array */ protected $_never_allowed_str = array( - 'document.cookie' => '[removed]', - 'document.write' => '[removed]', - '.parentNode' => '[removed]', - '.innerHTML' => '[removed]', - '-moz-binding' => '[removed]', - '' => '-->', - ' '<![CDATA[', - '' => '<comment>' + 'document.cookie' => '[removed]', + 'document.write' => '[removed]', + '.parentNode' => '[removed]', + '.innerHTML' => '[removed]', + '-moz-binding' => '[removed]', + '' => '-->', + ' '<![CDATA[', + '' => '<comment>', + '<%' => '<%' ); /** @@ -924,7 +925,7 @@ protected function _js_link_removal($match) return str_replace( $match[1], preg_replace( - '#href=.*?(?:(?:alert|prompt|confirm)(?:\(|&\#40;)|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|_filter_attributes($match[1]) ), diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4be0b31d368..2482c493cd1 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -9,7 +9,7 @@ Release Date: Not Released - **Security** - - Fixed a new URL-encoding attack vector in :doc:`Security Library ` method ``xss_clean()`` affecting Firefox. + - Fixed a number of new vulnerabilities in :doc:`Security Library ` method ``xss_clean()``. - General Changes From f52ad7a1a6340ea9d0e63dbf5fbf054b082fa3e9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 17:56:50 +0300 Subject: [PATCH 4541/5397] [ci skip] Add download link check to build-release.sh --- build-release.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build-release.sh b/build-release.sh index 490680e7916..6b3b31d1228 100755 --- a/build-release.sh +++ b/build-release.sh @@ -35,6 +35,10 @@ elif [ `grep -c -F --regexp="'$version_number'" user_guide_src/source/conf.py` - then echo "Provided version number doesn't match in user_guide_src/source/conf.py" exit 1 +elif [ `grep -c -F --regexp="$version_number (Current version) " user_guide_src/source/installation/downloads.rst` -ne 1 ] +then + echo "user_guide_src/source/installation/downloads.rst doesn't appear to contain a link for this version" + exit 1 elif [ ! -f "$upgrade_rst" ] then echo "${upgrade_rst} doesn't exist" From c877ac5d961831a087242ff780731c7372f84b6f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 17:56:50 +0300 Subject: [PATCH 4542/5397] [ci skip] Add download link check to build-release.sh --- build-release.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build-release.sh b/build-release.sh index 490680e7916..6b3b31d1228 100755 --- a/build-release.sh +++ b/build-release.sh @@ -35,6 +35,10 @@ elif [ `grep -c -F --regexp="'$version_number'" user_guide_src/source/conf.py` - then echo "Provided version number doesn't match in user_guide_src/source/conf.py" exit 1 +elif [ `grep -c -F --regexp="$version_number (Current version) " user_guide_src/source/installation/downloads.rst` -ne 1 ] +then + echo "user_guide_src/source/installation/downloads.rst doesn't appear to contain a link for this version" + exit 1 elif [ ! -f "$upgrade_rst" ] then echo "${upgrade_rst} doesn't exist" From a1f830dedc53e31a48c8722ed11e3e645526bdcc Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 17:59:47 +0300 Subject: [PATCH 4543/5397] [ci skip] Prepare for 3.1.2 release --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/changelog.rst | 2 +- user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/installation/downloads.rst | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 32ad6189981..a2067fb1008 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - const CI_VERSION = '3.1.2-dev'; + const CI_VERSION = '3.1.2'; /* * ------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2482c493cd1..437fdbabedb 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -5,7 +5,7 @@ Change Log Version 3.1.2 ============= -Release Date: Not Released +Release Date: Oct 28, 2016 - **Security** diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 17771fa9e80..2f44e0cbe0f 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.1.2-dev' +version = '3.1.2' # The full version, including alpha/beta/rc tags. -release = '3.1.2-dev' +release = '3.1.2' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 1eacd4d335a..6c1f007e36f 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,7 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.1.2-dev (Current version) `_ +- `CodeIgniter v3.1.2 (Current version) `_ - `CodeIgniter v3.1.1 `_ - `CodeIgniter v3.1.0 `_ - `CodeIgniter v3.0.6 `_ From b6995a6a1bdfb2275b3befb89d51da0a1769771e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 18:05:24 +0300 Subject: [PATCH 4544/5397] [ci skip] Fix upgrading instruction link titles --- user_guide_src/source/installation/upgrading.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index 61b16e038fc..4e0b0453d1a 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -8,9 +8,9 @@ upgrading from. .. toctree:: :titlesonly: - Upgrading from 3.1.2 to 3.1.2 + Upgrading from 3.1.1 to 3.1.2 Upgrading from 3.1.0 to 3.1.1 - Upgrading from 3.0.6 to 3.1.x + Upgrading from 3.0.6 to 3.1.0 Upgrading from 3.0.5 to 3.0.6 Upgrading from 3.0.4 to 3.0.5 Upgrading from 3.0.3 to 3.0.4 From 014be1e8726ebce6dd19284ae3deaee866d6b0e5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 18:05:24 +0300 Subject: [PATCH 4545/5397] [ci skip] Fix upgrading instruction link titles --- user_guide_src/source/installation/upgrading.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index 61b16e038fc..4e0b0453d1a 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -8,9 +8,9 @@ upgrading from. .. toctree:: :titlesonly: - Upgrading from 3.1.2 to 3.1.2 + Upgrading from 3.1.1 to 3.1.2 Upgrading from 3.1.0 to 3.1.1 - Upgrading from 3.0.6 to 3.1.x + Upgrading from 3.0.6 to 3.1.0 Upgrading from 3.0.5 to 3.0.6 Upgrading from 3.0.4 to 3.0.5 Upgrading from 3.0.3 to 3.0.4 From 499c6080cd41927df088206155e4055d4da3e58e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 28 Oct 2016 18:28:34 +0300 Subject: [PATCH 4546/5397] [ci skip] Mark the start of 3.1.3-dev --- system/core/CodeIgniter.php | 2 +- user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/installation/downloads.rst | 3 ++- user_guide_src/source/installation/upgrade_313.rst | 14 ++++++++++++++ user_guide_src/source/installation/upgrading.rst | 1 + 5 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 user_guide_src/source/installation/upgrade_313.rst diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index a2067fb1008..71656be2916 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -55,7 +55,7 @@ * @var string * */ - const CI_VERSION = '3.1.2'; + const CI_VERSION = '3.1.3-dev'; /* * ------------------------------------------------------ diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 2f44e0cbe0f..4d2edbe604d 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '3.1.2' +version = '3.1.3-dev' # The full version, including alpha/beta/rc tags. -release = '3.1.2' +release = '3.1.3-dev' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst index 6c1f007e36f..5992ba2911f 100644 --- a/user_guide_src/source/installation/downloads.rst +++ b/user_guide_src/source/installation/downloads.rst @@ -2,7 +2,8 @@ Downloading CodeIgniter ####################### -- `CodeIgniter v3.1.2 (Current version) `_ +- `CodeIgniter v3.1.3 (Current version) `_ +- `CodeIgniter v3.1.2 `_ - `CodeIgniter v3.1.1 `_ - `CodeIgniter v3.1.0 `_ - `CodeIgniter v3.0.6 `_ diff --git a/user_guide_src/source/installation/upgrade_313.rst b/user_guide_src/source/installation/upgrade_313.rst new file mode 100644 index 00000000000..71afc6f6acd --- /dev/null +++ b/user_guide_src/source/installation/upgrade_313.rst @@ -0,0 +1,14 @@ +############################# +Upgrading from 3.1.2 to 3.1.3 +############################# + +Before performing an update you should take your site offline by +replacing the index.php file with a static one. + +Step 1: Update your CodeIgniter files +===================================== + +Replace all files and directories in your *system/* directory. + +.. note:: If you have any custom developed files in these directories, + please make copies of them first. diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index 4e0b0453d1a..bc96e209f16 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -8,6 +8,7 @@ upgrading from. .. toctree:: :titlesonly: + Upgrading from 3.1.2 to 3.1.3 Upgrading from 3.1.1 to 3.1.2 Upgrading from 3.1.0 to 3.1.1 Upgrading from 3.0.6 to 3.1.0 From e791c2dd5112594d423342ceb29d6586acdffba3 Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Sat, 29 Oct 2016 01:47:23 +0800 Subject: [PATCH 4547/5397] Revert "Match single quote in is_write_type()." This reverts commit eef5951ae313c2c4080e94b8c1aa743a6d6c93b7. Signed-off-by: tianhe1986 --- system/database/DB_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index a9a3f29e530..465d8db7bee 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -982,7 +982,7 @@ public function compile_binds($sql, $binds) */ public function is_write_type($sql) { - return (bool) preg_match('/^\s*["\']?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', $sql); + return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', $sql); } // -------------------------------------------------------------------- From c867754cbb2260efeaa25ff9c339989807e8c713 Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Mon, 31 Oct 2016 01:38:18 +0200 Subject: [PATCH 4548/5397] download helper should be able to offer a download by reading a local file and also a custom destination filename. --- system/helpers/download_helper.php | 28 ++++++++++++++----- .../source/helpers/download_helper.rst | 14 ++++++++-- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index a6463dfd754..289ea199a4d 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -56,7 +56,7 @@ * * Generates headers that force a download to happen * - * @param string filename + * @param mixed filename (or an array of local file path => destination filename) * @param mixed the data to be downloaded * @param bool whether to try and send the actual file MIME type * @return void @@ -69,14 +69,28 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) } elseif ($data === NULL) { - if ( ! @is_file($filename) OR ($filesize = @filesize($filename)) === FALSE) + // Is $filename an array as ['local source path' => 'destination filename']? + if(is_array($filename)) { - return; - } + $filepath = key($filename); + $filename = current($filename); - $filepath = $filename; - $filename = explode('/', str_replace(DIRECTORY_SEPARATOR, '/', $filename)); - $filename = end($filename); + if ( ! @is_file($filepath) OR ($filesize = @filesize($filepath)) === FALSE) + { + return; + } + } + else + { + if ( ! @is_file($filename) OR ($filesize = @filesize($filename)) === FALSE) + { + return; + } + + $filepath = $filename; + $filename = explode('/', str_replace(DIRECTORY_SEPARATOR, '/', $filename)); + $filename = end($filename); + } } else { diff --git a/user_guide_src/source/helpers/download_helper.rst b/user_guide_src/source/helpers/download_helper.rst index 1a406507310..83182a256e3 100644 --- a/user_guide_src/source/helpers/download_helper.rst +++ b/user_guide_src/source/helpers/download_helper.rst @@ -26,7 +26,7 @@ The following functions are available: .. php:function:: force_download([$filename = ''[, $data = ''[, $set_mime = FALSE]]]) - :param string $filename: Filename + :param mixed $filename: Filename :param mixed $data: File contents :param bool $set_mime: Whether to try to send the actual MIME type :rtype: void @@ -37,7 +37,9 @@ The following functions are available: file data. If you set the second parameter to NULL and ``$filename`` is an existing, readable - file path, then its content will be read instead. + file path, then its content will be read instead. You may also set ``$filename`` + as an array containing a single entry, the key being the existing, readable file path + and the value as the downloading file name. If you set the third parameter to boolean TRUE, then the actual file MIME type (based on the filename extension) will be sent, so that if your browser has a @@ -53,4 +55,10 @@ The following functions are available: do the following:: // Contents of photo.jpg will be automatically read - force_download('/path/to/photo.jpg', NULL); \ No newline at end of file + force_download('/path/to/photo.jpg', NULL); + + If you want to download an existing file from your server, but change the name + of the actual file sent to browser, you will need this:: + + // Contents of photo.jpg will be automatically read and sent as my-photo.jpg + force_download(array('/path/to/photo.jpg' => 'my-photo.jpg'), NULL); \ No newline at end of file From 214a537e4df19f3885943604c1b8a49c3f64993d Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Mon, 31 Oct 2016 01:42:41 +0200 Subject: [PATCH 4549/5397] single entry restriction if $filename is an array --- system/helpers/download_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 289ea199a4d..a1d149f91dc 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -70,7 +70,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) elseif ($data === NULL) { // Is $filename an array as ['local source path' => 'destination filename']? - if(is_array($filename)) + if(is_array($filename) && count($filename) === 1) { $filepath = key($filename); $filename = current($filename); From 31d28fda8bd01ff0c7a2f196bf072bf9d84a83fe Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 31 Oct 2016 09:35:29 +0200 Subject: [PATCH 4550/5397] Merge pull request #4886 from tianhe1986/develop_dbdriver_quote Detect double-quoted strings in DB::compile_binds() --- system/database/DB_driver.php | 2 +- system/database/drivers/odbc/odbc_driver.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 7ae52a307dc..fcc15eee5ee 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1000,7 +1000,7 @@ public function compile_binds($sql, $binds) $ml = strlen($this->bind_marker); // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/'[^']*'/i", $sql, $matches)) + if ($c = preg_match_all("/(['\"])[^\\1]*\\1/i", $sql, $matches)) { $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', str_replace($matches[0], diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index dbce1cf79ff..b5512fd76de 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -172,7 +172,7 @@ public function compile_binds($sql, $binds) $ml = strlen($this->bind_marker); // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/'[^']*'/i", $sql, $matches)) + if ($c = preg_match_all("/(['\"])[^\\1]*\\1/i", $sql, $matches)) { $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', str_replace($matches[0], From 6488fc75567b93b4ad1a9ec9ff153c646c379da2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 31 Oct 2016 09:38:25 +0200 Subject: [PATCH 4551/5397] [ci skip] Add changelog entry for #4886 --- user_guide_src/source/changelog.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 437fdbabedb..47b8fecf2b6 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -2,6 +2,16 @@ Change Log ########## +Version 3.1.3 +============= + +Release Date: Not Released + +Bug fixes for 3.1.3 +------------------- + +- Fixed a bug (#4886) - :doc:`Database Library ` didn't differentiate bind markers inside double-quoted strings in queries. + Version 3.1.2 ============= From 14a6c2e2925724b5bf814dc895e14535dfa0aa09 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 31 Oct 2016 10:04:17 +0200 Subject: [PATCH 4552/5397] Fix #4890 --- system/libraries/Xmlrpcs.php | 8 ++++---- user_guide_src/source/changelog.rst | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php index afcdbe68c35..f343a7ec06c 100644 --- a/system/libraries/Xmlrpcs.php +++ b/system/libraries/Xmlrpcs.php @@ -339,11 +339,11 @@ protected function _execute($m) //------------------------------------- $method_parts = explode('.', $this->methods[$methName]['function']); - $objectCall = (isset($method_parts[1]) && $method_parts[1] !== ''); + $objectCall = ! empty($method_parts[1]); if ($system_call === TRUE) { - if ( ! is_callable(array($this,$method_parts[1]))) + if ( ! is_callable(array($this, $method_parts[1]))) { return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); } @@ -400,11 +400,11 @@ protected function _execute($m) } elseif ($this->object === FALSE) { - return get_instance()->$method_parts[1]($m); + return get_instance()->{$method_parts[1]}($m); } else { - return $this->object->$method_parts[1]($m); + return $this->object->{$method_parts[1]}($m); } } else diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 47b8fecf2b6..4a1ce3461b2 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -11,6 +11,7 @@ Bug fixes for 3.1.3 ------------------- - Fixed a bug (#4886) - :doc:`Database Library ` didn't differentiate bind markers inside double-quoted strings in queries. +- Fixed a bug (#4890) - :doc:`XML-RPC Library ` didn't work on PHP 7. Version 3.1.2 ============= From 17e662951c25ae2c83328508e90b9a0b99d49603 Mon Sep 17 00:00:00 2001 From: tianhe1986 Date: Mon, 31 Oct 2016 18:56:59 +0800 Subject: [PATCH 4553/5397] Fix compile_binds: do not use back references inside a character class. Signed-off-by: tianhe1986 --- system/database/DB_driver.php | 2 +- system/database/drivers/odbc/odbc_driver.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 064d4070e72..c142a1354ba 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -938,7 +938,7 @@ public function compile_binds($sql, $binds) $ml = strlen($this->bind_marker); // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/(['\"])[^\\1]*\\1/i", $sql, $matches)) + if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches)) { $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', str_replace($matches[0], diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index b5512fd76de..82efa498c9c 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -172,7 +172,7 @@ public function compile_binds($sql, $binds) $ml = strlen($this->bind_marker); // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/(['\"])[^\\1]*\\1/i", $sql, $matches)) + if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches)) { $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', str_replace($matches[0], From 6b5464c5b8a97268aab3814b56a1413a9463a97f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 31 Oct 2016 13:09:33 +0200 Subject: [PATCH 4554/5397] Merge pull request #4893 from tianhe1986/develop_fix_dbdriver_quote Fix compile_binds: do not use back references inside a character class. --- system/database/DB_driver.php | 2 +- system/database/drivers/odbc/odbc_driver.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index fcc15eee5ee..151340596de 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -1000,7 +1000,7 @@ public function compile_binds($sql, $binds) $ml = strlen($this->bind_marker); // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/(['\"])[^\\1]*\\1/i", $sql, $matches)) + if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches)) { $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', str_replace($matches[0], diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index b5512fd76de..82efa498c9c 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -172,7 +172,7 @@ public function compile_binds($sql, $binds) $ml = strlen($this->bind_marker); // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/(['\"])[^\\1]*\\1/i", $sql, $matches)) + if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches)) { $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', str_replace($matches[0], From c953c128649e06bb1a3594e56459cf14bdb6e048 Mon Sep 17 00:00:00 2001 From: George PETCULESCU Date: Mon, 31 Oct 2016 14:06:48 +0200 Subject: [PATCH 4555/5397] fixed coding style --- system/helpers/download_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index a1d149f91dc..32ee773bb40 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -70,7 +70,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) elseif ($data === NULL) { // Is $filename an array as ['local source path' => 'destination filename']? - if(is_array($filename) && count($filename) === 1) + if(is_array($filename) && count($filename)) { $filepath = key($filename); $filename = current($filename); From b907c8ad41dfb4a9394b3a73182f0abf7fe14f94 Mon Sep 17 00:00:00 2001 From: George PETCULESCU Date: Mon, 31 Oct 2016 14:08:36 +0200 Subject: [PATCH 4556/5397] fixed coding style (2) --- system/helpers/download_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 32ee773bb40..9158272ef40 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -70,7 +70,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) elseif ($data === NULL) { // Is $filename an array as ['local source path' => 'destination filename']? - if(is_array($filename) && count($filename)) + if(is_array($filename) && count($filename) == 1) { $filepath = key($filename); $filename = current($filename); From 5d1c2123fdc575d70e9db38ce30b34d4b291469c Mon Sep 17 00:00:00 2001 From: George PETCULESCU Date: Mon, 31 Oct 2016 14:16:35 +0200 Subject: [PATCH 4557/5397] refactorised Docs (parts) of Download helper. --- user_guide_src/source/helpers/download_helper.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/user_guide_src/source/helpers/download_helper.rst b/user_guide_src/source/helpers/download_helper.rst index 83182a256e3..e11d92a1449 100644 --- a/user_guide_src/source/helpers/download_helper.rst +++ b/user_guide_src/source/helpers/download_helper.rst @@ -38,9 +38,10 @@ The following functions are available: If you set the second parameter to NULL and ``$filename`` is an existing, readable file path, then its content will be read instead. You may also set ``$filename`` - as an array containing a single entry, the key being the existing, readable file path - and the value as the downloading file name. - + as an associative array with a single element, where the key of that element would be + the local file you are trying to read and where the value is the name of the downloadable + file that will be sent to browser. An example of this is provided below. + If you set the third parameter to boolean TRUE, then the actual file MIME type (based on the filename extension) will be sent, so that if your browser has a handler for that type - it can use it. From 7cc08237c2a15daf283e2bc61501bdc086740311 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 31 Oct 2016 16:19:46 +0200 Subject: [PATCH 4558/5397] [ci skip] Fix #4887 --- system/libraries/Upload.php | 36 ++++++++++++++++++----------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 23fd02ead1b..778ed6892dd 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1218,21 +1218,31 @@ protected function _file_mime_type($file) // We'll need this to validate the MIME info string (e.g. text/plain; charset=us-ascii) $regexp = '/^([a-z\-]+\/[a-z0-9\-\.\+]+)(;\s.+)?$/'; - // Fileinfo extension - most reliable method - $finfo = @finfo_open(FILEINFO_MIME); - if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system + /** + * Fileinfo extension - most reliable method + * + * Apparently XAMPP, CentOS, cPanel and who knows what + * other PHP distribution channels EXPLICITLY DISABLE + * ext/fileinfo, which is otherwise enabled by default + * since PHP 5.3 ... + */ + if (function_exists('finfo_file')) { - $mime = @finfo_file($finfo, $file['tmp_name']); - finfo_close($finfo); - - /* According to the comments section of the PHP manual page, - * it is possible that this function returns an empty string - * for some files (e.g. if they don't exist in the magic MIME database) - */ - if (is_string($mime) && preg_match($regexp, $mime, $matches)) + $finfo = @finfo_open(FILEINFO_MIME); + if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system { - $this->file_type = $matches[1]; - return; + $mime = @finfo_file($finfo, $file['tmp_name']); + finfo_close($finfo); + + /* According to the comments section of the PHP manual page, + * it is possible that this function returns an empty string + * for some files (e.g. if they don't exist in the magic MIME database) + */ + if (is_string($mime) && preg_match($regexp, $mime, $matches)) + { + $this->file_type = $matches[1]; + return; + } } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4a1ce3461b2..ffa0597b709 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -12,6 +12,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4886) - :doc:`Database Library ` didn't differentiate bind markers inside double-quoted strings in queries. - Fixed a bug (#4890) - :doc:`XML-RPC Library ` didn't work on PHP 7. +- Fixed a regression (#4887) - :doc:`File Uploading Library ` triggered fatal errors due to numerous PHP distribution channels (XAMPP and cPanel confirmed) explicitly disabling ext/fileinfo by default. Version 3.1.2 ============= From 627b050e89ea3e9794e7ad03c28aeb770417357a Mon Sep 17 00:00:00 2001 From: George Petculescu Date: Tue, 1 Nov 2016 08:16:47 +0200 Subject: [PATCH 4559/5397] if download helper receives a numeric array now it won't work --- system/helpers/download_helper.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 9158272ef40..4bab69005da 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -75,6 +75,11 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) $filepath = key($filename); $filename = current($filename); + if(is_int($filepath)) + { + return; + } + if ( ! @is_file($filepath) OR ($filesize = @filesize($filepath)) === FALSE) { return; From 54a1138a864a9d2d3ce7ef6d4b9d22df86440bb5 Mon Sep 17 00:00:00 2001 From: gxgpet Date: Tue, 1 Nov 2016 10:44:32 +0200 Subject: [PATCH 4560/5397] Fixed coding style (this time for real) --- system/helpers/download_helper.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 4bab69005da..eb714c1ff68 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -70,12 +70,12 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) elseif ($data === NULL) { // Is $filename an array as ['local source path' => 'destination filename']? - if(is_array($filename) && count($filename) == 1) + if (is_array($filename) && count($filename) == 1) { $filepath = key($filename); $filename = current($filename); - if(is_int($filepath)) + if (is_int($filepath)) { return; } From b18492be397373de452999f34a200cc24fb751ed Mon Sep 17 00:00:00 2001 From: George PETCULESCU Date: Tue, 1 Nov 2016 11:19:24 +0200 Subject: [PATCH 4561/5397] added tests for ordinal_format() helper function (Inflector helper) --- .../helpers/inflector_helper_test.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/codeigniter/helpers/inflector_helper_test.php b/tests/codeigniter/helpers/inflector_helper_test.php index 81ce5e394da..a5bb80532d2 100644 --- a/tests/codeigniter/helpers/inflector_helper_test.php +++ b/tests/codeigniter/helpers/inflector_helper_test.php @@ -93,4 +93,23 @@ public function test_humanize() } } + // -------------------------------------------------------------------- + + public function test_ordinal_format() + { + $strs = array( + 1 => '1st', + 2 => '2nd', + 4 => '4th', + 11 => '1th', + 12 => '12th', + 13 => '13th', + 'something else' => 'something else', + ); + + foreach ($strs as $str => $expect) + { + $this->assertEquals($expect, ordinal_format($str)); + } + } } \ No newline at end of file From b2c3a0063d02edfec79ab9aa5619c9f40cdd21d0 Mon Sep 17 00:00:00 2001 From: George PETCULESCU Date: Tue, 1 Nov 2016 11:22:38 +0200 Subject: [PATCH 4562/5397] small typo --- tests/codeigniter/helpers/inflector_helper_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/codeigniter/helpers/inflector_helper_test.php b/tests/codeigniter/helpers/inflector_helper_test.php index a5bb80532d2..4a1e64fae0e 100644 --- a/tests/codeigniter/helpers/inflector_helper_test.php +++ b/tests/codeigniter/helpers/inflector_helper_test.php @@ -101,7 +101,7 @@ public function test_ordinal_format() 1 => '1st', 2 => '2nd', 4 => '4th', - 11 => '1th', + 11 => '11th', 12 => '12th', 13 => '13th', 'something else' => 'something else', From 3e86cc27d531e15c7d7dc7c606f87e1694272f92 Mon Sep 17 00:00:00 2001 From: George PETCULESCU Date: Tue, 1 Nov 2016 14:02:46 +0200 Subject: [PATCH 4563/5397] fixed when $filename is an array with a different count than 1. --- system/helpers/download_helper.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index eb714c1ff68..43c3924a343 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -70,8 +70,13 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) elseif ($data === NULL) { // Is $filename an array as ['local source path' => 'destination filename']? - if (is_array($filename) && count($filename) == 1) + if (is_array($filename)) { + if (count($filename) != 1) + { + return; + } + $filepath = key($filename); $filename = current($filename); From 49407be71a80d67151a296be25fff2468c68ab55 Mon Sep 17 00:00:00 2001 From: George PETCULESCU Date: Tue, 1 Nov 2016 16:10:59 +0200 Subject: [PATCH 4564/5397] strict comparison of 1. --- system/helpers/download_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 43c3924a343..9619c61b108 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -72,7 +72,7 @@ function force_download($filename = '', $data = '', $set_mime = FALSE) // Is $filename an array as ['local source path' => 'destination filename']? if (is_array($filename)) { - if (count($filename) != 1) + if (count($filename) !== 1) { return; } From 8d11232616fdf984ff8b9bb295693bdea91d7d8e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 1 Nov 2016 16:14:35 +0200 Subject: [PATCH 4565/5397] [ci skip] Add changelog entry for PR #4891 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 618dd604a63..9c3058ce5ed 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -40,6 +40,7 @@ Release Date: Not Released - Helpers - Added new function :php:func:`ordinal_format()` to :doc:`Inflector Helper `. + - Updated :doc:`Download Helper ` :php:func:`force_download()` to allow existing files to be renamed for download. - Updated :doc:`HTML Helper ` function :php:func:`meta()` with support for "charset" and "property" properties. - Changed :doc:`HTML Helper ` function :php:func:`doctype()` default document type to HTML 5. From 3a89d3c05303d25486576de3d056f39585decfe4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 3 Nov 2016 16:26:31 +0200 Subject: [PATCH 4566/5397] Fix #4679, for real --- system/core/Input.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/core/Input.php b/system/core/Input.php index b81d51ebff9..24fe8a9cc2f 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -521,7 +521,7 @@ public function ip_address() $netaddr = explode(':', str_replace('::', str_repeat(':', 9 - substr_count($netaddr, ':')), $netaddr)); for ($j = 0; $j < 8; $j++) { - $netaddr[$i] = intval($netaddr[$j], 16); + $netaddr[$j] = intval($netaddr[$j], 16); } } else diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ffa0597b709..e5c5ae050e6 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -13,6 +13,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4886) - :doc:`Database Library ` didn't differentiate bind markers inside double-quoted strings in queries. - Fixed a bug (#4890) - :doc:`XML-RPC Library ` didn't work on PHP 7. - Fixed a regression (#4887) - :doc:`File Uploading Library ` triggered fatal errors due to numerous PHP distribution channels (XAMPP and cPanel confirmed) explicitly disabling ext/fileinfo by default. +- Fixed a bug (#4679) - :doc:`Input Library ` method ``ip_address()`` didn't properly resolve ``$config['proxy_ips']`` IPv6 addresses. Version 3.1.2 ============= From be8bd923329cf233fb3828afab5c3b4ceef296ec Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 7 Nov 2016 12:31:31 +0200 Subject: [PATCH 4567/5397] Fix #4902 --- system/libraries/Image_lib.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 7ec8ba365dd..06cdde0b890 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -886,7 +886,7 @@ public function image_process_imagemagick($action = 'resize') } } - $cmd .= escapeshellarg($this->full_src_path).' '.escapeshellarg($this->full_dst_path).' 2>&1'; + $cmd .= ' '.escapeshellarg($this->full_src_path).' '.escapeshellarg($this->full_dst_path).' 2>&1'; $retval = 1; // exec() might be disabled diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e5c5ae050e6..e3183204c53 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -14,6 +14,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4890) - :doc:`XML-RPC Library ` didn't work on PHP 7. - Fixed a regression (#4887) - :doc:`File Uploading Library ` triggered fatal errors due to numerous PHP distribution channels (XAMPP and cPanel confirmed) explicitly disabling ext/fileinfo by default. - Fixed a bug (#4679) - :doc:`Input Library ` method ``ip_address()`` didn't properly resolve ``$config['proxy_ips']`` IPv6 addresses. +- Fixed a bug (#4902) - :doc:`Image Manipulation Library ` processing via ImageMagick didn't work. Version 3.1.2 ============= From 4015f9bd8342ad9e05ceae517967719907997434 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 14 Nov 2016 10:22:59 +0200 Subject: [PATCH 4568/5397] Fix #4905 --- system/core/Loader.php | 40 ++++++----------------------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 9 insertions(+), 32 deletions(-) diff --git a/system/core/Loader.php b/system/core/Loader.php index d2c35081698..1111481b776 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -591,15 +591,21 @@ public function get_vars() */ public function helper($helpers = array()) { - foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper) + is_array($helpers) OR $helpers = array($helpers); + foreach ($helpers as &$helper) { + $filename = basename($helper); + $filepath = ($filename === $helper) ? '' : substr($helper, 0, strlen($helper) - strlen($filename)); + $filename = strtolower(preg_replace('#(_helper)?(.php)?$#i', '', $filename)).'_helper'; + $helper = $filepath.$filename; + if (isset($this->_ci_helpers[$helper])) { continue; } // Is this a helper extension request? - $ext_helper = config_item('subclass_prefix').$helper; + $ext_helper = config_item('subclass_prefix').$filename; $ext_loaded = FALSE; foreach ($this->_ci_helper_paths as $path) { @@ -1404,34 +1410,4 @@ protected function &_ci_get_component($component) $CI =& get_instance(); return $CI->$component; } - - // -------------------------------------------------------------------- - - /** - * Prep filename - * - * This function prepares filenames of various items to - * make their loading more reliable. - * - * @param string|string[] $filename Filename(s) - * @param string $extension Filename extension - * @return array - */ - protected function _ci_prep_filename($filename, $extension) - { - if ( ! is_array($filename)) - { - return array(strtolower(str_replace(array($extension, '.php'), '', $filename).$extension)); - } - else - { - foreach ($filename as $key => $val) - { - $filename[$key] = strtolower(str_replace(array($extension, '.php'), '', $val).$extension); - } - - return $filename; - } - } - } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e3183204c53..ab230960857 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -15,6 +15,7 @@ Bug fixes for 3.1.3 - Fixed a regression (#4887) - :doc:`File Uploading Library ` triggered fatal errors due to numerous PHP distribution channels (XAMPP and cPanel confirmed) explicitly disabling ext/fileinfo by default. - Fixed a bug (#4679) - :doc:`Input Library ` method ``ip_address()`` didn't properly resolve ``$config['proxy_ips']`` IPv6 addresses. - Fixed a bug (#4902) - :doc:`Image Manipulation Library ` processing via ImageMagick didn't work. +- Fixed a bug (#4905) - :doc:`Loader Library ` didn't take into account possible user-provided directory paths when loading helpers. Version 3.1.2 ============= From 2c9fa80e413388fa68fecfcf8120d6161f1920d6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 21 Nov 2016 11:53:53 +0200 Subject: [PATCH 4569/5397] [ci skip] Fix a changelog entry link --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ab230960857..e8498b452c3 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -10,7 +10,7 @@ Release Date: Not Released Bug fixes for 3.1.3 ------------------- -- Fixed a bug (#4886) - :doc:`Database Library ` didn't differentiate bind markers inside double-quoted strings in queries. +- Fixed a bug (#4886) - :doc:`Database Library ` didn't differentiate bind markers inside double-quoted strings in queries. - Fixed a bug (#4890) - :doc:`XML-RPC Library ` didn't work on PHP 7. - Fixed a regression (#4887) - :doc:`File Uploading Library ` triggered fatal errors due to numerous PHP distribution channels (XAMPP and cPanel confirmed) explicitly disabling ext/fileinfo by default. - Fixed a bug (#4679) - :doc:`Input Library ` method ``ip_address()`` didn't properly resolve ``$config['proxy_ips']`` IPv6 addresses. From 7622ec6b06221b767c6e99251fb8f0f881e48c8f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 21 Nov 2016 11:56:21 +0200 Subject: [PATCH 4570/5397] [ci skip] Specify sphinxcontrib-phpdomain 0.1.3.post1 version Our Sphinx dependencies suck --- user_guide_src/README.rst | 4 ++-- user_guide_src/source/documentation/index.rst | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/user_guide_src/README.rst b/user_guide_src/README.rst index 188b42e885b..d645adb73e6 100644 --- a/user_guide_src/README.rst +++ b/user_guide_src/README.rst @@ -24,7 +24,7 @@ Installation 1. Install `easy_install `_ 2. ``easy_install "sphinx==1.2.3"`` -3. ``easy_install sphinxcontrib-phpdomain`` +3. ``easy_install "sphinxcontrib-phpdomain==0.1.3.post1"`` 4. Install the CI Lexer which allows PHP, HTML, CSS, and JavaScript syntax highlighting in code examples (see *cilexer/README*) 5. ``cd user_guide_src`` 6. ``make html`` @@ -60,4 +60,4 @@ Style Guideline *************** Please refer to source/documentation/index.rst for general guidelines for -using Sphinx to document CodeIgniter. \ No newline at end of file +using Sphinx to document CodeIgniter. diff --git a/user_guide_src/source/documentation/index.rst b/user_guide_src/source/documentation/index.rst index 60c6b4ed654..aaac33ecbb4 100644 --- a/user_guide_src/source/documentation/index.rst +++ b/user_guide_src/source/documentation/index.rst @@ -18,7 +18,7 @@ It is created automatically by inserting the following: .. raw:: html -
    +
    .. contents:: :local: @@ -43,7 +43,7 @@ Pygments, so that code blocks can be properly highlighted. .. code-block:: bash easy_install "sphinx==1.2.3" - easy_install sphinxcontrib-phpdomain + easy_install "sphinxcontrib-phpdomain==0.1.3.post1" Then follow the directions in the README file in the :samp:`cilexer` folder inside the documentation repository to install the CI Lexer. @@ -199,4 +199,4 @@ It creates the following display: .. php:method:: should_do_something() :returns: Whether or not something should be done - :rtype: bool \ No newline at end of file + :rtype: bool From e49aa1f1cb63ad90d6c2d204439f538dcc282243 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 22 Nov 2016 12:02:55 +0200 Subject: [PATCH 4571/5397] Fix #4916 --- system/libraries/Session/drivers/Session_database_driver.php | 4 ++-- user_guide_src/source/changelog.rst | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index cb152f91fa7..6a7282b23a7 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -354,7 +354,7 @@ protected function _get_lock($session_id) { if ($this->_platform === 'mysql') { - $arg = $session_id.($this->_config['match_ip'] ? '_'.$_SERVER['REMOTE_ADDR'] : ''); + $arg = md5($session_id.($this->_config['match_ip'] ? '_'.$_SERVER['REMOTE_ADDR'] : '')); if ($this->_db->query("SELECT GET_LOCK('".$arg."', 300) AS ci_session_lock")->row()->ci_session_lock) { $this->_lock = $arg; @@ -417,4 +417,4 @@ protected function _release_lock() return parent::_release_lock(); } -} \ No newline at end of file +} diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index e8498b452c3..36b5d51e484 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -16,6 +16,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4679) - :doc:`Input Library ` method ``ip_address()`` didn't properly resolve ``$config['proxy_ips']`` IPv6 addresses. - Fixed a bug (#4902) - :doc:`Image Manipulation Library ` processing via ImageMagick didn't work. - Fixed a bug (#4905) - :doc:`Loader Library ` didn't take into account possible user-provided directory paths when loading helpers. +- Fixed a bug (#4916) - :doc:`Session Library ` with ``sess_match_ip`` enabled was unusable for IPv6 clients when using the 'database' driver on MySQL 5.7.5+. Version 3.1.2 ============= From 21b7a2a2d00bd5645b2ca1afcfa4098e207292a4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 22 Nov 2016 13:23:33 +0200 Subject: [PATCH 4572/5397] Add support for CURRENT_TIMESTAMP (and similar) defaults to date/time fields in DB Forge As requested in #4852 --- system/database/DB_forge.php | 36 +++++++++++++++++++---------- user_guide_src/source/changelog.rst | 6 ++++- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index ed6f4b672bc..fe81d0510c3 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -894,21 +894,33 @@ protected function _attr_default(&$attributes, &$field) return; } - if (array_key_exists('DEFAULT', $attributes)) + if ( ! array_key_exists('DEFAULT', $attributes)) { - if ($attributes['DEFAULT'] === NULL) - { - $field['default'] = empty($this->_null) ? '' : $this->_default.$this->_null; + return; + } - // Override the NULL attribute if that's our default - $attributes['NULL'] = TRUE; - $field['null'] = empty($this->_null) ? '' : ' '.$this->_null; - } - else - { - $field['default'] = $this->_default.$this->db->escape($attributes['DEFAULT']); - } + if ($attributes['DEFAULT'] === NULL) + { + $field['default'] = empty($this->_null) ? '' : $this->_default.$this->_null; + + // Override the NULL attribute if that's our default + $attributes['NULL'] = TRUE; + $field['null'] = empty($this->_null) ? '' : ' '.$this->_null; + return; } + + // White-list CURRENT_TIMESTAMP & similar (e.g. Oracle has stuff like SYSTIMESTAMP) defaults for date/time fields + if ( + isset($attributes['TYPE']) + && (stripos($attributes['TYPE'], 'time') !== FALSE || stripos($attributes['TYPE'], 'date') !== FALSE) + && (stripos($attributes['DEFAULT'], 'time') !== FALSE || stripos($attributes['DEFAULT'], 'date') !== FALSE) + ) + { + $field['default'] = $this->_default.$attributes['DEFAULT']; + return; + } + + $field['default'] = $this->_default.$this->db->escape($attributes['DEFAULT']); } // -------------------------------------------------------------------- diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 9c3058ce5ed..692d06833ce 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -31,12 +31,16 @@ Release Date: Not Released - Changed method ``clear()`` to also reset captions. -- Database +- :doc:`Database ` - Changed method ``initialize()`` to return void and instead throw a ``RuntimeException`` in case of failure. - Changed method ``db_connect()`` to always set the connection character set (if supported by the driver) and to fail if it can't. - Removed method ``db_set_charset()`` and the ability to change a connection character set at runtime. + - :doc:`Database Forge `: + + - Added support for declaring date/time type fields default values as ``CURRENT_TIMESTAMP`` and similar. + - Helpers - Added new function :php:func:`ordinal_format()` to :doc:`Inflector Helper `. From efd856edce0b952c8a7a62ec953ae1baee77ff34 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 23 Nov 2016 12:37:23 +0200 Subject: [PATCH 4573/5397] [ci skip] Styling change after 21b7a2a2d00bd5645b2ca1afcfa4098e207292a4 --- system/database/DB_forge.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index fe81d0510c3..9add5cab7a1 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -912,8 +912,8 @@ protected function _attr_default(&$attributes, &$field) // White-list CURRENT_TIMESTAMP & similar (e.g. Oracle has stuff like SYSTIMESTAMP) defaults for date/time fields if ( isset($attributes['TYPE']) - && (stripos($attributes['TYPE'], 'time') !== FALSE || stripos($attributes['TYPE'], 'date') !== FALSE) - && (stripos($attributes['DEFAULT'], 'time') !== FALSE || stripos($attributes['DEFAULT'], 'date') !== FALSE) + && (stripos($attributes['TYPE'], 'time') !== FALSE OR stripos($attributes['TYPE'], 'date') !== FALSE) + && (stripos($attributes['DEFAULT'], 'time') !== FALSE OR stripos($attributes['DEFAULT'], 'date') !== FALSE) ) { $field['default'] = $this->_default.$attributes['DEFAULT']; From 820d9cdaac9a9c0371404ce82b60a26ed3ac938f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 23 Nov 2016 13:27:42 +0200 Subject: [PATCH 4574/5397] Fix #4917 --- system/helpers/date_helper.php | 4 ++-- tests/codeigniter/helpers/date_helper_test.php | 8 ++++++++ user_guide_src/source/changelog.rst | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 5f1fcf07ea9..7f072acfad0 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -529,9 +529,9 @@ function nice_date($bad_date = '', $format = FALSE) } // Date Like: YYYYMMDD - if (preg_match('/^(\d{2})\d{2}(\d{4})$/i', $bad_date, $matches)) + if (preg_match('/^\d{8}$/i', $bad_date, $matches)) { - return date($format, strtotime($matches[1].'/01/'.$matches[2])); + return DateTime::createFromFormat('Ymd', $bad_date)->format($format); } // Date Like: MM-DD-YYYY __or__ M-D-YYYY (or anything in between) diff --git a/tests/codeigniter/helpers/date_helper_test.php b/tests/codeigniter/helpers/date_helper_test.php index c4f99a97c3d..8a3502280eb 100644 --- a/tests/codeigniter/helpers/date_helper_test.php +++ b/tests/codeigniter/helpers/date_helper_test.php @@ -10,6 +10,14 @@ public function set_up() // ------------------------------------------------------------------------ + public function test_nice_date() + { + $this->assertEquals('2016-11-01', nice_date('201611', 'Y-m-d')); + $this->assertEquals('2016-11-23', nice_date('20161123', 'Y-m-d')); + } + + // ------------------------------------------------------------------------ + public function test_now_local() { /* diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 36b5d51e484..fd3f668cf78 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -17,6 +17,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4902) - :doc:`Image Manipulation Library ` processing via ImageMagick didn't work. - Fixed a bug (#4905) - :doc:`Loader Library ` didn't take into account possible user-provided directory paths when loading helpers. - Fixed a bug (#4916) - :doc:`Session Library ` with ``sess_match_ip`` enabled was unusable for IPv6 clients when using the 'database' driver on MySQL 5.7.5+. +- Fixed a bug (#4917) - :doc:`Date Helper ` function :php:func:`nice_date()` didn't handle YYYYMMDD inputs properly. Version 3.1.2 ============= From 610be9dc25bcfd06f30d70139701e86b8c3ad400 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 23 Nov 2016 13:40:16 +0200 Subject: [PATCH 4575/5397] [ci skip] Deprecate nice_date() --- system/helpers/date_helper.php | 1 + user_guide_src/source/changelog.rst | 4 ++++ user_guide_src/source/helpers/date_helper.rst | 7 +++++-- .../source/installation/upgrade_313.rst | 18 ++++++++++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 7f072acfad0..0606a45623a 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -496,6 +496,7 @@ function human_to_unix($datestr = '') * Turns many "reasonably-date-like" strings into something * that is actually useful. This only works for dates after unix epoch. * + * @deprecated 3.1.3 Use DateTime::createFromFormat($input_format, $input)->format($output_format); * @param string The terribly formatted date-like string * @param string Date format to return (same as php date function) * @return string diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index fd3f668cf78..af556a50a2d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,10 @@ Version 3.1.3 Release Date: Not Released +- General Changes + + - Deprecated :doc:`Date Helper ` function :php:func:`nice_date()`. + Bug fixes for 3.1.3 ------------------- diff --git a/user_guide_src/source/helpers/date_helper.rst b/user_guide_src/source/helpers/date_helper.rst index a85da26a41d..600a0757402 100644 --- a/user_guide_src/source/helpers/date_helper.rst +++ b/user_guide_src/source/helpers/date_helper.rst @@ -84,7 +84,7 @@ The following functions are available: .. note:: This function is DEPRECATED. Use the native ``date()`` combined with `DateTime's format constants - `_ + `_ instead:: echo date(DATE_RFC822, time()); @@ -220,6 +220,9 @@ The following functions are available: // Should Produce: 2001-09-11 $better_date = nice_date($bad_date, 'Y-m-d'); + .. note:: This function is DEPRECATED. Use PHP's native `DateTime class + `_ instead. + .. php:function:: timespan([$seconds = 1[, $time = ''[, $units = '']]]) :param int $seconds: Number of seconds @@ -434,4 +437,4 @@ UP12 (UTC +12:00) Fiji, Gilbert Islands, Kamchatka, New Zealand UP1275 (UTC +12:45) Chatham Islands Standard Time UP13 (UTC +13:00) Phoenix Islands Time, Tonga UP14 (UTC +14:00) Line Islands -=========== ===================================================================== \ No newline at end of file +=========== ===================================================================== diff --git a/user_guide_src/source/installation/upgrade_313.rst b/user_guide_src/source/installation/upgrade_313.rst index 71afc6f6acd..ebce7ab9b10 100644 --- a/user_guide_src/source/installation/upgrade_313.rst +++ b/user_guide_src/source/installation/upgrade_313.rst @@ -12,3 +12,21 @@ Replace all files and directories in your *system/* directory. .. note:: If you have any custom developed files in these directories, please make copies of them first. + +Step 2: Remove usage of nice_date() helper (deprecation) +======================================================== + +The :doc:`Date Helper <../helpers/date_helper>` function ``nice_date()`` is +no longer useful since the introduction of PHP's `DateTime classes +`_ + +You can replace it with the following: +:: + + DateTime::createFromFormat($input_format, $input_date)->format($desired_output_format); + +Thus, ``nice_date()`` is now deprecated and scheduled for removal in +CodeIgniter 3.2+. + +.. note:: The function is still available, but you're strongly encouraged + to remove its usage sooner rather than later. From 45023e555e762baf22b94b0e9ca353548205efb4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 23 Nov 2016 13:40:52 +0200 Subject: [PATCH 4576/5397] [ci skip] Fix a changelog entry reference --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index af556a50a2d..1fe2d4616ca 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -20,7 +20,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4679) - :doc:`Input Library ` method ``ip_address()`` didn't properly resolve ``$config['proxy_ips']`` IPv6 addresses. - Fixed a bug (#4902) - :doc:`Image Manipulation Library ` processing via ImageMagick didn't work. - Fixed a bug (#4905) - :doc:`Loader Library ` didn't take into account possible user-provided directory paths when loading helpers. -- Fixed a bug (#4916) - :doc:`Session Library ` with ``sess_match_ip`` enabled was unusable for IPv6 clients when using the 'database' driver on MySQL 5.7.5+. +- Fixed a bug (#4916) - :doc:`Session Library ` with ``sess_match_ip`` enabled was unusable for IPv6 clients when using the 'database' driver on MySQL 5.7.5+. - Fixed a bug (#4917) - :doc:`Date Helper ` function :php:func:`nice_date()` didn't handle YYYYMMDD inputs properly. Version 3.1.2 From 6276926c6dcdf976a5f4de34d62f501852e2f84b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 29 Nov 2016 15:30:30 +0200 Subject: [PATCH 4577/5397] Fix #4923 --- .../drivers/Session_database_driver.php | 10 ++--- .../drivers/Session_memcached_driver.php | 37 +++++++++---------- .../Session/drivers/Session_redis_driver.php | 27 ++++++-------- user_guide_src/source/changelog.rst | 1 + 4 files changed, 34 insertions(+), 41 deletions(-) diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index 6a7282b23a7..2f524125643 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -208,8 +208,12 @@ public function write($session_id, $session_data) // Prevent previous QB calls from messing with our queries $this->_db->reset_query(); + if ($this->_lock === FALSE) + { + return $this->_fail(); + } // Was the ID regenerated? - if ($session_id !== $this->_session_id) + elseif ($session_id !== $this->_session_id) { if ( ! $this->_release_lock() OR ! $this->_get_lock($session_id)) { @@ -219,10 +223,6 @@ public function write($session_id, $session_data) $this->_row_exists = FALSE; $this->_session_id = $session_id; } - elseif ($this->_lock === FALSE) - { - return $this->_fail(); - } if ($this->_row_exists === FALSE) { diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index 99b4d1baab7..eb1dcd3d8e3 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -186,7 +186,7 @@ public function read($session_id) */ public function write($session_id, $session_data) { - if ( ! isset($this->_memcached)) + if ( ! isset($this->_memcached, $this->_lock_key)) { return $this->_fail(); } @@ -202,28 +202,25 @@ public function write($session_id, $session_data) $this->_session_id = $session_id; } - if (isset($this->_lock_key)) - { - $key = $this->_key_prefix.$session_id; - - $this->_memcached->replace($this->_lock_key, time(), 300); - if ($this->_fingerprint !== ($fingerprint = md5($session_data))) - { - if ($this->_memcached->set($key, $session_data, $this->_config['expiration'])) - { - $this->_fingerprint = $fingerprint; - return $this->_success; - } + $key = $this->_key_prefix.$session_id; - return $this->_fail(); - } - elseif ( - $this->_memcached->touch($key, $this->_config['expiration']) - OR ($this->_memcached->getResultCode() === Memcached::RES_NOTFOUND && $this->_memcached->set($key, $session_data, $this->_config['expiration'])) - ) + $this->_memcached->replace($this->_lock_key, time(), 300); + if ($this->_fingerprint !== ($fingerprint = md5($session_data))) + { + if ($this->_memcached->set($key, $session_data, $this->_config['expiration'])) { + $this->_fingerprint = $fingerprint; return $this->_success; } + + return $this->_fail(); + } + elseif ( + $this->_memcached->touch($key, $this->_config['expiration']) + OR ($this->_memcached->getResultCode() === Memcached::RES_NOTFOUND && $this->_memcached->set($key, $session_data, $this->_config['expiration'])) + ) + { + return $this->_success; } return $this->_fail(); @@ -375,4 +372,4 @@ protected function _release_lock() return TRUE; } -} \ No newline at end of file +} diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index 8db74c0ca66..a780100b122 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -199,7 +199,7 @@ public function read($session_id) */ public function write($session_id, $session_data) { - if ( ! isset($this->_redis)) + if ( ! isset($this->_redis, $this->_lock_key)) { return $this->_fail(); } @@ -215,27 +215,22 @@ public function write($session_id, $session_data) $this->_session_id = $session_id; } - if (isset($this->_lock_key)) + $this->_redis->setTimeout($this->_lock_key, 300); + if ($this->_fingerprint !== ($fingerprint = md5($session_data)) OR $this->_key_exists === FALSE) { - $this->_redis->setTimeout($this->_lock_key, 300); - if ($this->_fingerprint !== ($fingerprint = md5($session_data)) OR $this->_key_exists === FALSE) + if ($this->_redis->set($this->_key_prefix.$session_id, $session_data, $this->_config['expiration'])) { - if ($this->_redis->set($this->_key_prefix.$session_id, $session_data, $this->_config['expiration'])) - { - $this->_fingerprint = $fingerprint; - $this->_key_exists = TRUE; - return $this->_success; - } - - return $this->_fail(); + $this->_fingerprint = $fingerprint; + $this->_key_exists = TRUE; + return $this->_success; } - return ($this->_redis->setTimeout($this->_key_prefix.$session_id, $this->_config['expiration'])) - ? $this->_success - : $this->_fail(); + return $this->_fail(); } - return $this->_fail(); + return ($this->_redis->setTimeout($this->_key_prefix.$session_id, $this->_config['expiration'])) + ? $this->_success + : $this->_fail(); } // ------------------------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1fe2d4616ca..cb95d173b7a 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -22,6 +22,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4905) - :doc:`Loader Library ` didn't take into account possible user-provided directory paths when loading helpers. - Fixed a bug (#4916) - :doc:`Session Library ` with ``sess_match_ip`` enabled was unusable for IPv6 clients when using the 'database' driver on MySQL 5.7.5+. - Fixed a bug (#4917) - :doc:`Date Helper ` function :php:func:`nice_date()` didn't handle YYYYMMDD inputs properly. +- Fixed a bug (#4923) - :doc:`Session Library ` could execute an erroneous SQL query with the 'database' driver, if the lock attempt times out. Version 3.1.2 ============= From e377910ccf826b448203513bf63bd5721bbd1375 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 13:48:58 +0200 Subject: [PATCH 4578/5397] Fix #4927 --- system/core/Output.php | 7 ++++--- user_guide_src/source/changelog.rst | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/system/core/Output.php b/system/core/Output.php index cf6510ff16a..57c78ab1943 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -311,11 +311,12 @@ public function get_header($header) return NULL; } - for ($i = 0, $c = count($headers); $i < $c; $i++) + // Count backwards, in order to get the last matching header + for ($c = count($headers) - 1; $c > -1; $c--) { - if (strncasecmp($header, $headers[$i], $l = self::strlen($header)) === 0) + if (strncasecmp($header, $headers[$c], $l = self::strlen($header)) === 0) { - return trim(self::substr($headers[$i], $l+1)); + return trim(self::substr($headers[$c], $l+1)); } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index cb95d173b7a..0d8a93b54d7 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -23,6 +23,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4916) - :doc:`Session Library ` with ``sess_match_ip`` enabled was unusable for IPv6 clients when using the 'database' driver on MySQL 5.7.5+. - Fixed a bug (#4917) - :doc:`Date Helper ` function :php:func:`nice_date()` didn't handle YYYYMMDD inputs properly. - Fixed a bug (#4923) - :doc:`Session Library ` could execute an erroneous SQL query with the 'database' driver, if the lock attempt times out. +- Fixed a bug (#4927) - :doc:`Output Library ` method ``get_header()`` returned the first matching header, regardless of whether it would be replaced by a second ``set_header()`` call. Version 3.1.2 ============= From 8db01f13809a92bac7bc95b02893175d7654d627 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 14:06:57 +0200 Subject: [PATCH 4579/5397] Fix #4844 --- system/libraries/Email.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 676bbcafb56..2e6f5be90df 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -1878,7 +1878,7 @@ protected function _send_with_sendmail() // is popen() enabled? if ( ! function_usable('popen') OR FALSE === ($fp = @popen( - $this->mailpath.' -oi -f '.$this->clean_email($this->_headers['From']).' -t' + $this->mailpath.' -oi -f '.escapeshellarg($this->clean_email($this->_headers['From'])).' -t' , 'w')) ) // server probably has popen disabled, so nothing we can do to get a verbose error. { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 0d8a93b54d7..4f5efe2767f 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -24,6 +24,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4917) - :doc:`Date Helper ` function :php:func:`nice_date()` didn't handle YYYYMMDD inputs properly. - Fixed a bug (#4923) - :doc:`Session Library ` could execute an erroneous SQL query with the 'database' driver, if the lock attempt times out. - Fixed a bug (#4927) - :doc:`Output Library ` method ``get_header()`` returned the first matching header, regardless of whether it would be replaced by a second ``set_header()`` call. +- Fixed a bug (#4844) - :doc:`Email Library ` didn't apply ``escapeshellarg()`` to the while passing the Sendmail ``-f`` parameter through ``popen()``. Version 3.1.2 ============= From d76431db46e04d650c1c538493021cdf336d1301 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 14:23:40 +0200 Subject: [PATCH 4580/5397] Switch CI_Email::$validate to On by default Relevant: #4844 --- system/libraries/Email.php | 2 +- user_guide_src/source/changelog.rst | 4 ++++ user_guide_src/source/installation/upgrade_320.rst | 14 ++++++++++++++ user_guide_src/source/libraries/email.rst | 4 ++-- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 162cc7777a3..90a68f12900 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -161,7 +161,7 @@ class CI_Email { * * @var bool */ - public $validate = FALSE; + public $validate = TRUE; /** * X-Priority header value. diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d63f15f673d..8a40c8d806f 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -31,6 +31,10 @@ Release Date: Not Released - Changed method ``clear()`` to also reset captions. + - :doc:`Email Library ` changes include: + + - Changed the default value of the **validate** option to ``TRUE``. + - :doc:`Database ` - Changed method ``initialize()`` to return void and instead throw a ``RuntimeException`` in case of failure. diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 942a8a3b5a4..352f85f7193 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -98,6 +98,20 @@ value (previously, it just set the host to the default '127.0.0.1'). Therefore, if you've added a configuration that only sets e.g. a ``port``, you will now have to explicitly set the ``host`` to '127.0.0.1' as well. +Step 6: Check usage of the Email library +======================================== + +The :doc:`Email Library <../libraries/email>` will now by default check the +validity of all e-mail addresses passed to it. This check used to be Off by +default, and required explicitly setting the **validate** option to ``TRUE`` +in order to enable it. + +Naturally, a validity check should not result in any problems, but this is +technically a backwards-compability break and you should check that +everything works fine. +If something indeed goes wrong with that, please report it as a bug to us, +and you can disable the **validate** option to revert to the old behavior. + Step 5: Check usage of doctype() HTML helper ============================================ diff --git a/user_guide_src/source/libraries/email.rst b/user_guide_src/source/libraries/email.rst index 0b38737f10f..253d85c71bd 100644 --- a/user_guide_src/source/libraries/email.rst +++ b/user_guide_src/source/libraries/email.rst @@ -108,7 +108,7 @@ Preference Default Value Options Descript page. Make sure you don't have any relative links or relative image paths otherwise they will not work. **charset** ``$config['charset']`` Character set (utf-8, iso-8859-1, etc.). -**validate** FALSE TRUE or FALSE (boolean) Whether to validate the email address. +**validate** TRUE TRUE or FALSE (boolean) Whether to validate the email address. **priority** 3 1, 2, 3, 4, 5 Email Priority. 1 = highest. 5 = lowest. 3 = normal. **crlf** \\n "\\r\\n" or "\\n" or "\\r" Newline character. (Use "\\r\\n" to comply with RFC 822). **newline** \\n "\\r\\n" or "\\n" or "\\r" Newline character. (Use "\\r\\n" to comply with RFC 822). @@ -402,4 +402,4 @@ Class Reference // Will only print the email headers, excluding the message subject and body $this->email->print_debugger(array('headers')); - .. note:: By default, all of the raw data will be printed. \ No newline at end of file + .. note:: By default, all of the raw data will be printed. From efaf5aa28ddded9f9e43cfd0afa91fda09c4ff2f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 14:27:32 +0200 Subject: [PATCH 4581/5397] Remove a function_exists('escapeshellarg') check from CI_Upload This didn't originally exist, but was changed due to #1494. We no longer tolerate such broken environments --- system/libraries/Upload.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 778ed6892dd..490421af9ce 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -1259,9 +1259,7 @@ protected function _file_mime_type($file) */ if (DIRECTORY_SEPARATOR !== '\\') { - $cmd = function_exists('escapeshellarg') - ? 'file --brief --mime '.escapeshellarg($file['tmp_name']).' 2>&1' - : 'file --brief --mime '.$file['tmp_name'].' 2>&1'; + $cmd = 'file --brief --mime '.escapeshellarg($file['tmp_name']).' 2>&1'; if (function_usable('exec')) { From 57c98d820b38493eee5b3ba71cf5b6952b25ae06 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 14:33:56 +0200 Subject: [PATCH 4582/5397] Fix steps numbering in 3.2.0 upgrade instructions Broken in d76431db46e04d650c1c538493021cdf336d1301 --- user_guide_src/source/installation/upgrade_320.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 352f85f7193..86eba701c9d 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -98,7 +98,7 @@ value (previously, it just set the host to the default '127.0.0.1'). Therefore, if you've added a configuration that only sets e.g. a ``port``, you will now have to explicitly set the ``host`` to '127.0.0.1' as well. -Step 6: Check usage of the Email library +Step 5: Check usage of the Email library ======================================== The :doc:`Email Library <../libraries/email>` will now by default check the @@ -112,7 +112,7 @@ everything works fine. If something indeed goes wrong with that, please report it as a bug to us, and you can disable the **validate** option to revert to the old behavior. -Step 5: Check usage of doctype() HTML helper +Step 6: Check usage of doctype() HTML helper ============================================ The :doc:`HTML Helper <../helpers/html_helper>` function From 9687441bc9b77514e847a5e3c56cf7e051f14be4 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 14:36:44 +0200 Subject: [PATCH 4583/5397] Remove previously deprecated CI_Input::is_cli_request() --- system/core/Input.php | 15 --------------- user_guide_src/source/changelog.rst | 1 + .../source/installation/upgrade_320.rst | 8 ++++++++ user_guide_src/source/libraries/input.rst | 19 ------------------- 4 files changed, 9 insertions(+), 34 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index cbb185a8d66..2e38e450182 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -840,21 +840,6 @@ public function is_ajax_request() // -------------------------------------------------------------------- - /** - * Is CLI request? - * - * Test to see if a request was made from the command line. - * - * @deprecated 3.0.0 Use is_cli() instead - * @return bool - */ - public function is_cli_request() - { - return is_cli(); - } - - // -------------------------------------------------------------------- - /** * Get Request Method * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8a40c8d806f..035255166eb 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -10,6 +10,7 @@ Release Date: Not Released - Core - Changed :doc:`URI Library ` to ignore the ``$config['url_suffix']``, ``$config['permitted_uri_chars']`` configuration settings for CLI requests. + - Removed previously deprecated method ``is_cli_request()`` from the :doc:`Input Library ` (use :php:func:`is_cli()` instead). - Libraries diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 86eba701c9d..469aa34295c 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -124,3 +124,11 @@ Nothing should be really broken by this change, but if your application relies on the default value, you should double-check it and either explicitly set the desired format, or adapt your front-end to use proper HTML 5 formatting. + +Step 7: Remove usage of previously deprecated functionalities +============================================================= + +The following is a list of functionalities deprecated in CodeIgniter +version 3.0.0, that have been removed in 3.2.0: + +- ``CI_Input::is_cli_request()`` (use :php:func:`is_cli()` instead) diff --git a/user_guide_src/source/libraries/input.rst b/user_guide_src/source/libraries/input.rst index d9c6c2dd1fa..899070ef418 100644 --- a/user_guide_src/source/libraries/input.rst +++ b/user_guide_src/source/libraries/input.rst @@ -440,25 +440,6 @@ Class Reference Checks to see if the HTTP_X_REQUESTED_WITH server header has been set, and returns boolean TRUE if it is or FALSE if not. - .. php:method:: is_cli_request() - - :returns: TRUE if it is a CLI request, FALSE if not - :rtype: bool - - Checks to see if the application was run from the command-line - interface. - - .. note:: This method checks both the PHP SAPI name currently in use - and if the ``STDIN`` constant is defined, which is usually a - failsafe way to see if PHP is being run via the command line. - - :: - - $this->input->is_cli_request() - - .. note:: This method is DEPRECATED and is now just an alias for the - :func:`is_cli()` function. - .. php:method:: method([$upper = FALSE]) :param bool $upper: Whether to return the request method name in upper or lower case From dd2dcde50355c85466991caa9630a66a46626e46 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 14:45:07 +0200 Subject: [PATCH 4584/5397] Remove previously deprecated fetch_*() methods from CI_Router --- system/core/Router.php | 43 ------------------- user_guide_src/source/changelog.rst | 3 +- .../source/installation/upgrade_320.rst | 3 ++ 3 files changed, 5 insertions(+), 44 deletions(-) diff --git a/system/core/Router.php b/system/core/Router.php index 045d3668754..42d0e295227 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -438,19 +438,6 @@ public function set_class($class) // -------------------------------------------------------------------- - /** - * Fetch the current class - * - * @deprecated 3.0.0 Read the 'class' property instead - * @return string - */ - public function fetch_class() - { - return $this->class; - } - - // -------------------------------------------------------------------- - /** * Set method name * @@ -464,19 +451,6 @@ public function set_method($method) // -------------------------------------------------------------------- - /** - * Fetch the current method - * - * @deprecated 3.0.0 Read the 'method' property instead - * @return string - */ - public function fetch_method() - { - return $this->method; - } - - // -------------------------------------------------------------------- - /** * Set directory name * @@ -495,21 +469,4 @@ public function set_directory($dir, $append = FALSE) $this->directory .= str_replace('.', '', trim($dir, '/')).'/'; } } - - // -------------------------------------------------------------------- - - /** - * Fetch directory - * - * Feches the sub-directory (if any) that contains the requested - * controller class. - * - * @deprecated 3.0.0 Read the 'directory' property instead - * @return string - */ - public function fetch_directory() - { - return $this->directory; - } - } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 035255166eb..3d6d3e392eb 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -10,7 +10,8 @@ Release Date: Not Released - Core - Changed :doc:`URI Library ` to ignore the ``$config['url_suffix']``, ``$config['permitted_uri_chars']`` configuration settings for CLI requests. - - Removed previously deprecated method ``is_cli_request()`` from the :doc:`Input Library ` (use :php:func:`is_cli()` instead). + - Removed previously deprecated :doc:`Input Library ` method ``is_cli_request()`` (use :php:func:`is_cli()` instead). + - Removed previously deprecated :doc:`Routing Class ` methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` (use the respective class properties instead). - Libraries diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 469aa34295c..02c78d3735f 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -132,3 +132,6 @@ The following is a list of functionalities deprecated in CodeIgniter version 3.0.0, that have been removed in 3.2.0: - ``CI_Input::is_cli_request()`` (use :php:func:`is_cli()` instead) +- ``CI_Router::fetch_directory()`` (use ``CI_Router::$directory instead) +- ``CI_Router::fetch_class()`` (use ``CI_Router::$class`` instead) +- ``CI_Router::fetch_method()`` (use ``CI_Router::$method`` instead) From edbbc7dfc01ce05a1c37629df0e1b4c8d00c435f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 14:49:08 +0200 Subject: [PATCH 4585/5397] Remove previously deprecated CI_Config::system_url() --- system/core/Config.php | 14 -------------- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/installation/upgrade_320.rst | 1 + user_guide_src/source/libraries/config.rst | 11 ----------- 4 files changed, 2 insertions(+), 25 deletions(-) diff --git a/system/core/Config.php b/system/core/Config.php index e7475163904..6704a0a7e36 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -350,20 +350,6 @@ protected function _uri_string($uri) // -------------------------------------------------------------------- - /** - * System URL - * - * @deprecated 3.0.0 Encourages insecure practices - * @return string - */ - public function system_url() - { - $x = explode('/', preg_replace('|/*(.+?)/*$|', '\\1', BASEPATH)); - return $this->slash_item('base_url').end($x).'/'; - } - - // -------------------------------------------------------------------- - /** * Set a config file item * diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 3d6d3e392eb..3adf4d6e605 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -12,6 +12,7 @@ Release Date: Not Released - Changed :doc:`URI Library ` to ignore the ``$config['url_suffix']``, ``$config['permitted_uri_chars']`` configuration settings for CLI requests. - Removed previously deprecated :doc:`Input Library ` method ``is_cli_request()`` (use :php:func:`is_cli()` instead). - Removed previously deprecated :doc:`Routing Class ` methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` (use the respective class properties instead). + - Removed previously deprecated :doc:`Config Library ` method ``system_url()`` (encourages insecure practices). - Libraries diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 02c78d3735f..b8e990e3c64 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -135,3 +135,4 @@ version 3.0.0, that have been removed in 3.2.0: - ``CI_Router::fetch_directory()`` (use ``CI_Router::$directory instead) - ``CI_Router::fetch_class()`` (use ``CI_Router::$class`` instead) - ``CI_Router::fetch_method()`` (use ``CI_Router::$method`` instead) +- ``CI_Config::system_url()`` (encourages insecure practices) diff --git a/user_guide_src/source/libraries/config.rst b/user_guide_src/source/libraries/config.rst index a45cacdf552..7398329c3f1 100644 --- a/user_guide_src/source/libraries/config.rst +++ b/user_guide_src/source/libraries/config.rst @@ -239,14 +239,3 @@ Class Reference This method is normally accessed via the corresponding functions in the :doc:`URL Helper `. - - .. php:method:: system_url() - - :returns: URL pointing at your CI system/ directory - :rtype: string - - This method retrieves the URL to your CodeIgniter system/ directory. - - .. note:: This method is DEPRECATED because it encourages usage of - insecure coding practices. Your *system/* directory shouldn't - be publicly accessible. \ No newline at end of file From b226bccb2f748e252b75595c497ab4b3accfe21e Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 15:00:02 +0200 Subject: [PATCH 4586/5397] Remove previously deprecated Email Helper --- system/helpers/email_helper.php | 84 ------------------- user_guide_src/source/changelog.rst | 6 +- .../source/helpers/email_helper.rst | 75 ----------------- .../source/installation/upgrade_300.rst | 9 +- .../source/installation/upgrade_320.rst | 5 ++ 5 files changed, 12 insertions(+), 167 deletions(-) delete mode 100644 system/helpers/email_helper.php delete mode 100644 user_guide_src/source/helpers/email_helper.rst diff --git a/system/helpers/email_helper.php b/system/helpers/email_helper.php deleted file mode 100644 index 35944fc7b56..00000000000 --- a/system/helpers/email_helper.php +++ /dev/null @@ -1,84 +0,0 @@ -` method ``is_cli_request()`` (use :php:func:`is_cli()` instead). - Removed previously deprecated :doc:`Routing Class ` methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` (use the respective class properties instead). - Removed previously deprecated :doc:`Config Library ` method ``system_url()`` (encourages insecure practices). + - Removed previously deprecated *Email Helper* (had only two functions, aliases for PHP's native ``filter_var()`` and ``mail()``). - Libraries @@ -588,7 +589,7 @@ Release Date: March 30, 2015 - :doc:`Directory Helper ` :php:func:`directory_map()` will now append ``DIRECTORY_SEPARATOR`` to directory names in the returned array. - :doc:`Array Helper ` :php:func:`element()` and :php:func:`elements()` now return NULL instead of FALSE when the required elements don't exist. - :doc:`Language Helper ` :php:func:`lang()` now accepts an optional list of additional HTML attributes. - - Deprecated the :doc:`Email Helper ` as its ``valid_email()``, ``send_email()`` functions are now only aliases for PHP native functions ``filter_var()`` and ``mail()`` respectively. + - Deprecated the *Email Helper* as its ``valid_email()``, ``send_email()`` functions are now only aliases for PHP native functions ``filter_var()`` and ``mail()`` respectively. - Database @@ -2764,8 +2765,7 @@ Release Date: January 30, 2008 helper. <./helpers/html_helper>` - Added img() to the :doc:`HTML helper. <./helpers/html_helper>` - Added ability to :doc:`"extend" Helpers <./general/helpers>`. - - Added an :doc:`email helper <./helpers/email_helper>` into core - helpers. + - Added an *Email Helper* into core helpers. - Added strip_quotes() function to :doc:`string helper <./helpers/string_helper>`. - Added reduce_multiples() function to :doc:`string diff --git a/user_guide_src/source/helpers/email_helper.rst b/user_guide_src/source/helpers/email_helper.rst deleted file mode 100644 index 1ee97d90298..00000000000 --- a/user_guide_src/source/helpers/email_helper.rst +++ /dev/null @@ -1,75 +0,0 @@ -############ -Email Helper -############ - -The Email Helper provides some assistive functions for working with -Email. For a more robust email solution, see CodeIgniter's :doc:`Email -Class <../libraries/email>`. - -.. important:: The Email helper is DEPRECATED and is currently - only kept for backwards compatibility. - -.. contents:: - :local: - -.. raw:: html - -
    - -Loading this Helper -=================== - -This helper is loaded using the following code:: - - $this->load->helper('email'); - -Available Functions -=================== - -The following functions are available: - - -.. php:function:: valid_email($email) - - :param string $email: E-mail address - :returns: TRUE if a valid email is supplied, FALSE otherwise - :rtype: bool - - Checks if the input is a correctly formatted e-mail address. Note that is - doesn't actually prove that the address will be able recieve mail, but - simply that it is a validly formed address. - - Example:: - - if (valid_email('email@somesite.com')) - { - echo 'email is valid'; - } - else - { - echo 'email is not valid'; - } - - .. note:: All that this function does is to use PHP's native ``filter_var()``:: - - (bool) filter_var($email, FILTER_VALIDATE_EMAIL); - -.. php:function:: send_email($recipient, $subject, $message) - - :param string $recipient: E-mail address - :param string $subject: Mail subject - :param string $message: Message body - :returns: TRUE if the mail was successfully sent, FALSE in case of an error - :rtype: bool - - Sends an email using PHP's native `mail() `_ - function. - - .. note:: All that this function does is to use PHP's native ``mail`` - - :: - - mail($recipient, $subject, $message); - - For a more robust email solution, see CodeIgniter's :doc:`Email Library - <../libraries/email>`. \ No newline at end of file diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 0fc211f893f..9d0d0dc1e64 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -655,14 +655,13 @@ Please use :php:func:`html_escape()` instead. Email helper functions ====================== -:doc:`Email Helper <../helpers/email_helper>` only has two functions +The *Email Helper* only has two functions: - - :php:func:`valid_email()` - - :php:func:`send_email()` + - ``valid_email()`` + - ``send_email()`` Both of them are now aliases for PHP's native ``filter_var()`` and ``mail()`` functions, respectively. -Therefore the :doc:`Email Helper <../helpers/email_helper>` altogether is being deprecated and -is scheduled for removal in CodeIgniter 3.1+. +Therefore, the *Email Helper* altogether is being deprecated and is scheduled for removal in CodeIgniter 3.1+. .. note:: These functions are still available, but you're strongly encouraged to remove their usage sooner rather than later. diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index b8e990e3c64..51b2a369351 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -136,3 +136,8 @@ version 3.0.0, that have been removed in 3.2.0: - ``CI_Router::fetch_class()`` (use ``CI_Router::$class`` instead) - ``CI_Router::fetch_method()`` (use ``CI_Router::$method`` instead) - ``CI_Config::system_url()`` (encourages insecure practices) + +- The entire *Email Helper*, which only had two functions: + + - ``valid_email()`` (use ``filter_var($email, FILTER_VALIDATE_EMAIL)`` instead) + - ``send_email()`` (use ``mail()`` instead) From bd3b4d158110634ec54d026f2852a649711edefc Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 15:07:19 +0200 Subject: [PATCH 4587/5397] Remove tests broken by the func removals from last few commits --- tests/codeigniter/core/Config_test.php | 9 +------ .../codeigniter/helpers/email_helper_test.php | 24 ------------------- 2 files changed, 1 insertion(+), 32 deletions(-) delete mode 100644 tests/codeigniter/helpers/email_helper_test.php diff --git a/tests/codeigniter/core/Config_test.php b/tests/codeigniter/core/Config_test.php index b5c9e849d99..5201d46dcdd 100644 --- a/tests/codeigniter/core/Config_test.php +++ b/tests/codeigniter/core/Config_test.php @@ -152,13 +152,6 @@ public function test_site_url() // -------------------------------------------------------------------- - public function test_system_url() - { - $this->assertEquals($this->cfg['base_url'].'system/', $this->config->system_url()); - } - - // -------------------------------------------------------------------- - public function test_load() { // Test regular load @@ -237,4 +230,4 @@ public function test_load_nonexistent() $this->assertNull($this->config->load($file)); } -} \ No newline at end of file +} diff --git a/tests/codeigniter/helpers/email_helper_test.php b/tests/codeigniter/helpers/email_helper_test.php deleted file mode 100644 index 529e969108e..00000000000 --- a/tests/codeigniter/helpers/email_helper_test.php +++ /dev/null @@ -1,24 +0,0 @@ -helper('email'); - } - - public function test_valid_email() - { - $this->assertEquals(FALSE, valid_email('test')); - $this->assertEquals(FALSE, valid_email('test@test@test.com')); - $this->assertEquals(TRUE, valid_email('test@test.com')); - $this->assertEquals(TRUE, valid_email('my.test@test.com')); - $this->assertEquals(TRUE, valid_email('my.test@subdomain.test.com')); - } - - public function test_send_mail() - { - $this->markTestSkipped("Can't test"); - } - -} \ No newline at end of file From ecc9a5f2102d8221f9783fd77d8a4b7bb03a3e4a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 15:08:11 +0200 Subject: [PATCH 4588/5397] Remove previously deprecated Date Helper function standard_date() --- system/helpers/date_helper.php | 40 ------- .../codeigniter/helpers/date_helper_test.php | 100 ------------------ user_guide_src/source/changelog.rst | 6 +- user_guide_src/source/helpers/date_helper.rst | 39 ------- .../source/installation/upgrade_320.rst | 2 + 5 files changed, 5 insertions(+), 182 deletions(-) diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 0606a45623a..1f8e319caec 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -122,46 +122,6 @@ function mdate($datestr = '', $time = '') // ------------------------------------------------------------------------ -if ( ! function_exists('standard_date')) -{ - /** - * Standard Date - * - * Returns a date formatted according to the submitted standard. - * - * As of PHP 5.2, the DateTime extension provides constants that - * serve for the exact same purpose and are used with date(). - * - * @todo Remove in version 3.1+. - * @deprecated 3.0.0 Use PHP's native date() instead. - * @link http://www.php.net/manual/en/class.datetime.php#datetime.constants.types - * - * @example date(DATE_RFC822, now()); // default - * @example date(DATE_W3C, $time); // a different format and time - * - * @param string $fmt = 'DATE_RFC822' the chosen format - * @param int $time = NULL Unix timestamp - * @return string - */ - function standard_date($fmt = 'DATE_RFC822', $time = NULL) - { - if (empty($time)) - { - $time = now(); - } - - // Procedural style pre-defined constants from the DateTime extension - if (strpos($fmt, 'DATE_') !== 0 OR defined($fmt) === FALSE) - { - return FALSE; - } - - return date(constant($fmt), $time); - } -} - -// ------------------------------------------------------------------------ - if ( ! function_exists('timespan')) { /** diff --git a/tests/codeigniter/helpers/date_helper_test.php b/tests/codeigniter/helpers/date_helper_test.php index 8a3502280eb..00139de5c19 100644 --- a/tests/codeigniter/helpers/date_helper_test.php +++ b/tests/codeigniter/helpers/date_helper_test.php @@ -73,106 +73,6 @@ public function test_mdate() // ------------------------------------------------------------------------ - public function test_standard_date_rfc822() - { - $this->assertEquals( - date(DATE_RFC822, $this->time), - standard_date('DATE_RFC822', $this->time) - ); - } - - // ------------------------------------------------------------------------ - - public function test_standard_date_atom() - { - $this->assertEquals( - date(DATE_ATOM, $this->time), - standard_date('DATE_ATOM', $this->time) - ); - } - - // ------------------------------------------------------------------------ - - public function test_standard_date_cookie() - { - $this->assertEquals( - date(DATE_COOKIE, $this->time), - standard_date('DATE_COOKIE', $this->time) - ); - } - - // ------------------------------------------------------------------------ - - public function test_standard_date_iso8601() - { - $this->assertEquals( - date(DATE_ISO8601, $this->time), - standard_date('DATE_ISO8601', $this->time) - ); - } - - // ------------------------------------------------------------------------ - - public function test_standard_date_rfc850() - { - $this->assertEquals( - date(DATE_RFC850, $this->time), - standard_date('DATE_RFC850', $this->time) - ); - } - - // ------------------------------------------------------------------------ - - public function test_standard_date_rfc1036() - { - $this->assertEquals( - date(DATE_RFC1036, $this->time), - standard_date('DATE_RFC1036', $this->time) - ); - } - - // ------------------------------------------------------------------------ - - public function test_standard_date_rfc1123() - { - $this->assertEquals( - date(DATE_RFC1123, $this->time), - standard_date('DATE_RFC1123', $this->time) - ); - } - - // ------------------------------------------------------------------------ - - public function test_standard_date_rfc2822() - { - $this->assertEquals( - date(DATE_RFC2822, $this->time), - standard_date('DATE_RFC2822', $this->time) - ); - } - - // ------------------------------------------------------------------------ - - public function test_standard_date_rss() - { - $this->assertEquals( - date(DATE_RSS, $this->time), - standard_date('DATE_RSS', $this->time) - ); - } - - // ------------------------------------------------------------------------ - - public function test_standard_date_w3c() - { - $this->assertEquals( - date(DATE_W3C, $this->time), - standard_date('DATE_W3C', $this->time) - ); - } - - // ------------------------------------------------------------------------ - public function test_timespan() { $this->ci_vfs_clone('system/language/english/date_lang.php'); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d109c3b468d..62c1ef0e1d8 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -13,6 +13,7 @@ Release Date: Not Released - Removed previously deprecated :doc:`Input Library ` method ``is_cli_request()`` (use :php:func:`is_cli()` instead). - Removed previously deprecated :doc:`Routing Class ` methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` (use the respective class properties instead). - Removed previously deprecated :doc:`Config Library ` method ``system_url()`` (encourages insecure practices). + - Removed previously deprecated :doc:`Date Helper ` function ``standard_date()`` (use PHP's native ``date()`` instead). - Removed previously deprecated *Email Helper* (had only two functions, aliases for PHP's native ``filter_var()`` and ``mail()``). - Libraries @@ -1115,7 +1116,7 @@ Bug fixes for 3.0 - Fixed a bug (#79) - :doc:`Form Validation Library ` didn't properly validate array fields that use associative keys or have custom indexes. - Fixed a bug (#427) - :doc:`Form Validation Library ` method ``strip_image_tags()`` was an alias to a non-existent method. - Fixed a bug (#1545) - :doc:`Query Builder ` method ``limit()`` wasn't executed properly under Oracle. -- Fixed a bug (#1551) - :doc:`Date Helper ` function :php:func:`standard_date()` didn't properly format *W3C* and *ATOM* standard dates. +- Fixed a bug (#1551) - :doc:`Date Helper ` function ``standard_date()`` didn't properly format *W3C* and *ATOM* standard dates. - Fixed a bug where :doc:`Query Builder ` method ``join()`` escaped literal values as if they were fields. - Fixed a bug (#135) - PHP Error logging was impossible without the errors being displayed. - Fixed a bug (#1613) - :doc:`Form Helper ` functions :php:func:`form_multiselect()`, :php:func:`form_dropdown()` didn't properly handle empty array option groups. @@ -3096,8 +3097,7 @@ Release Date: October 30, 2006 - Added :doc:`Download Helper <./helpers/download_helper>`. - Added :doc:`simple_query() <./database/queries>` function to the database classes -- Added :doc:`standard_date() <./helpers/date_helper>` function to - the Date Helper. +- Added ``standard_date()`` function function to the :doc:`Date Helper `. - Added :doc:`$query->free_result() <./database/results>` to database class. - Added :doc:`$query->list_fields() <./database/metadata>` function to diff --git a/user_guide_src/source/helpers/date_helper.rst b/user_guide_src/source/helpers/date_helper.rst index 600a0757402..90952885561 100644 --- a/user_guide_src/source/helpers/date_helper.rst +++ b/user_guide_src/source/helpers/date_helper.rst @@ -67,45 +67,6 @@ The following functions are available: If a timestamp is not included in the second parameter the current time will be used. -.. php:function:: standard_date([$fmt = 'DATE_RFC822'[, $time = NULL]]) - - :param string $fmt: Date format - :param int $time: UNIX timestamp - :returns: Formatted date or FALSE on invalid format - :rtype: string - - Lets you generate a date string in one of several standardized formats. - - Example:: - - $format = 'DATE_RFC822'; - $time = time(); - echo standard_date($format, $time); - - .. note:: This function is DEPRECATED. Use the native ``date()`` combined with - `DateTime's format constants - `_ - instead:: - - echo date(DATE_RFC822, time()); - - **Supported formats:** - - =============== ======================= ====================================== - Constant Description Example - =============== ======================= ====================================== - DATE_ATOM Atom 2005-08-15T16:13:03+0000 - DATE_COOKIE HTTP Cookies Sun, 14 Aug 2005 16:13:03 UTC - DATE_ISO8601 ISO-8601 2005-08-14T16:13:03+00:00 - DATE_RFC822 RFC 822 Sun, 14 Aug 05 16:13:03 UTC - DATE_RFC850 RFC 850 Sunday, 14-Aug-05 16:13:03 UTC - DATE_RFC1036 RFC 1036 Sunday, 14-Aug-05 16:13:03 UTC - DATE_RFC1123 RFC 1123 Sun, 14 Aug 2005 16:13:03 UTC - DATE_RFC2822 RFC 2822 Sun, 14 Aug 2005 16:13:03 +0000 - DATE_RSS RSS Sun, 14 Aug 2005 16:13:03 UTC - DATE_W3C W3C 2005-08-14T16:13:03+0000 - =============== ======================= ====================================== - .. php:function:: local_to_gmt([$time = '']) :param int $time: UNIX timestamp diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 51b2a369351..d6602e825bf 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -137,6 +137,8 @@ version 3.0.0, that have been removed in 3.2.0: - ``CI_Router::fetch_method()`` (use ``CI_Router::$method`` instead) - ``CI_Config::system_url()`` (encourages insecure practices) +- ``standard_date()`` :doc:`Date Helper <../helpers/date_helper>` function (use ``date()`` instead) + - The entire *Email Helper*, which only had two functions: - ``valid_email()`` (use ``filter_var($email, FILTER_VALIDATE_EMAIL)`` instead) From 0c84ef9a33d18d758e36447fd18a240a458ae2bc Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 15:12:35 +0200 Subject: [PATCH 4589/5397] Remove previously deprecated Security Helper function do_hash() --- system/helpers/security_helper.php | 24 ----------------- .../helpers/security_helper_test.php | 26 +----------------- user_guide_src/source/changelog.rst | 9 ++++--- .../source/helpers/security_helper.rst | 27 +------------------ .../source/installation/upgrade_320.rst | 1 + 5 files changed, 8 insertions(+), 79 deletions(-) diff --git a/system/helpers/security_helper.php b/system/helpers/security_helper.php index 4eb63883daa..048f06b6805 100644 --- a/system/helpers/security_helper.php +++ b/system/helpers/security_helper.php @@ -80,30 +80,6 @@ function sanitize_filename($filename) } } -// -------------------------------------------------------------------- - -if ( ! function_exists('do_hash')) -{ - /** - * Hash encode a string - * - * @todo Remove in version 3.1+. - * @deprecated 3.0.0 Use PHP's native hash() instead. - * @param string $str - * @param string $type = 'sha1' - * @return string - */ - function do_hash($str, $type = 'sha1') - { - if ( ! in_array(strtolower($type), hash_algos())) - { - $type = 'md5'; - } - - return hash($type, $str); - } -} - // ------------------------------------------------------------------------ if ( ! function_exists('strip_image_tags')) diff --git a/tests/codeigniter/helpers/security_helper_test.php b/tests/codeigniter/helpers/security_helper_test.php index effd3ec0289..ab05d57baca 100644 --- a/tests/codeigniter/helpers/security_helper_test.php +++ b/tests/codeigniter/helpers/security_helper_test.php @@ -25,30 +25,6 @@ function test_sanitize_filename() $this->assertEquals('foo', sanitize_filename($filename)); } - function test_do_hash() - { - $md5 = md5('foo'); - $sha1 = sha1('foo'); - - $algos = hash_algos(); - $algo_results = array(); - foreach ($algos as $k => $v) - { - $algo_results[$v] = hash($v, 'foo'); - } - - $this->assertEquals($sha1, do_hash('foo')); - $this->assertEquals($sha1, do_hash('foo', 'sha1')); - $this->assertEquals($md5, do_hash('foo', 'md5')); - $this->assertEquals($md5, do_hash('foo', 'foobar')); - - // Test each algorithm available to PHP - foreach ($algo_results as $algo => $result) - { - $this->assertEquals($result, do_hash('foo', $algo)); - } - } - function test_strip_image_tags() { $this->assertEquals('http://example.com/spacer.gif', strip_image_tags('http://example.com/spacer.gif')); @@ -61,4 +37,4 @@ function test_encode_php_tags() $this->assertEquals('<? echo $foo; ?>', encode_php_tags('')); } -} \ No newline at end of file +} diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 62c1ef0e1d8..ba11fe1c81e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -14,6 +14,7 @@ Release Date: Not Released - Removed previously deprecated :doc:`Routing Class ` methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` (use the respective class properties instead). - Removed previously deprecated :doc:`Config Library ` method ``system_url()`` (encourages insecure practices). - Removed previously deprecated :doc:`Date Helper ` function ``standard_date()`` (use PHP's native ``date()`` instead). + - Removed previously deprecated :doc:`Security Helper ` function ``do_hash()`` (use PHP's native ``hash()`` instead). - Removed previously deprecated *Email Helper* (had only two functions, aliases for PHP's native ``filter_var()`` and ``mail()``). - Libraries @@ -551,7 +552,7 @@ Release Date: March 30, 2015 - :doc:`Security Helper ` changes include: - - :php:func:`do_hash()` now uses PHP's native ``hash()`` function (supporting more algorithms) and is deprecated. + - ``do_hash()`` now uses PHP's native ``hash()`` function (supporting more algorithms) and is deprecated. - :php:func:`strip_image_tags()` is now an alias for the same method in the :doc:`Security Library `. - :doc:`Smiley Helper ` changes include: @@ -1580,8 +1581,8 @@ Hg Tag: v2.0.2 - Helpers - - Removed the previously deprecated dohash() from the :doc:`Security - helper <./helpers/security_helper>`; use do_hash() instead. + - Removed the previously deprecated ``dohash()`` from the :doc:`Security + helper <./helpers/security_helper>`; use ``do_hash()`` instead. - Changed the 'plural' function so that it doesn't ruin the captalization of your string. It also take into consideration acronyms which are all caps. @@ -1823,7 +1824,7 @@ Hg Tag: v2.0.0 helper <./helpers/text_helper>`. - Added accept-charset to the list of inserted attributes of form_open() in the :doc:`Form Helper `. - - Deprecated the dohash() function in favour of do_hash() for + - Deprecated the ``dohash()`` function in favour of ``do_hash()`` for naming consistency. - Non-backwards compatible change made to get_dir_file_info() in the :doc:`File Helper `. No longer recurses diff --git a/user_guide_src/source/helpers/security_helper.rst b/user_guide_src/source/helpers/security_helper.rst index 103880cf9cc..e981bc6b652 100644 --- a/user_guide_src/source/helpers/security_helper.rst +++ b/user_guide_src/source/helpers/security_helper.rst @@ -48,31 +48,6 @@ The following functions are available: For more info, please see the :doc:`Security Library <../libraries/security>` documentation. - -.. php:function:: do_hash($str[, $type = 'sha1']) - - :param string $str: Input - :param string $type: Algorithm - :returns: Hex-formatted hash - :rtype: string - - Permits you to create one way hashes suitable for encrypting - passwords. Will use SHA1 by default. - - See `hash_algos() `_ - for a full list of supported algorithms. - - Examples:: - - $str = do_hash($str); // SHA1 - $str = do_hash($str, 'md5'); // MD5 - - .. note:: This function was formerly named ``dohash()``, which has been - removed in favor of ``do_hash()``. - - .. note:: This function is DEPRECATED. Use the native ``hash()`` instead. - - .. php:function:: strip_image_tags($str) :param string $str: Input string @@ -103,4 +78,4 @@ The following functions are available: Example:: - $string = encode_php_tags($string); \ No newline at end of file + $string = encode_php_tags($string); diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index d6602e825bf..080a02895cf 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -138,6 +138,7 @@ version 3.0.0, that have been removed in 3.2.0: - ``CI_Config::system_url()`` (encourages insecure practices) - ``standard_date()`` :doc:`Date Helper <../helpers/date_helper>` function (use ``date()`` instead) +- ``do_hash()`` :doc:`Security Helper <../helpers/security_helper>` function (use ``hash()`` instead) - The entire *Email Helper*, which only had two functions: From 5e47aa3d87b44627bd79850536bfacd8d39a92a6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 15:18:46 +0200 Subject: [PATCH 4590/5397] Remove previously deprecated HTML helper functions br(), nbs() --- system/helpers/html_helper.php | 34 ---------------- .../codeigniter/helpers/html_helper_test.php | 16 +------- user_guide_src/source/changelog.rst | 3 +- user_guide_src/source/helpers/html_helper.rst | 40 ------------------- .../source/installation/upgrade_320.rst | 2 + 5 files changed, 5 insertions(+), 90 deletions(-) diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index 696f0eee27e..22ef39c2e1d 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -389,37 +389,3 @@ function meta($name = '', $content = '', $type = 'name', $newline = "\n") return $str; } } - -// ------------------------------------------------------------------------ - -if ( ! function_exists('br')) -{ - /** - * Generates HTML BR tags based on number supplied - * - * @deprecated 3.0.0 Use str_repeat() instead - * @param int $count Number of times to repeat the tag - * @return string - */ - function br($count = 1) - { - return str_repeat('
    ', $count); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('nbs')) -{ - /** - * Generates non-breaking space entities based on number supplied - * - * @deprecated 3.0.0 Use str_repeat() instead - * @param int - * @return string - */ - function nbs($num = 1) - { - return str_repeat(' ', $num); - } -} diff --git a/tests/codeigniter/helpers/html_helper_test.php b/tests/codeigniter/helpers/html_helper_test.php index 029f3f4cd8a..5565e011b69 100644 --- a/tests/codeigniter/helpers/html_helper_test.php +++ b/tests/codeigniter/helpers/html_helper_test.php @@ -9,13 +9,6 @@ public function set_up() // ------------------------------------------------------------------------ - public function test_br() - { - $this->assertEquals('

    ', br(2)); - } - - // ------------------------------------------------------------------------ - public function test_heading() { $this->assertEquals('

    foobar

    ', heading('foobar')); @@ -72,13 +65,6 @@ public function test_Ul() // ------------------------------------------------------------------------ - public function test_NBS() - { - $this->assertEquals('   ', nbs(3)); - } - - // ------------------------------------------------------------------------ - public function test_meta() { $this->assertEquals( @@ -101,4 +87,4 @@ public function test_meta() meta(array('name' => 'foo', 'type' => 'charset')) ); } -} \ No newline at end of file +} diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ba11fe1c81e..33f25db5143 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -15,6 +15,7 @@ Release Date: Not Released - Removed previously deprecated :doc:`Config Library ` method ``system_url()`` (encourages insecure practices). - Removed previously deprecated :doc:`Date Helper ` function ``standard_date()`` (use PHP's native ``date()`` instead). - Removed previously deprecated :doc:`Security Helper ` function ``do_hash()`` (use PHP's native ``hash()`` instead). + - Removed previously deprecated :doc:`HTML Helper ` functions ``br()`` and ``nbs()`` (use PHP's native ``str_repeat()`` with ``'
    '`` and ``' '`` respectively). - Removed previously deprecated *Email Helper* (had only two functions, aliases for PHP's native ``filter_var()`` and ``mail()``). - Libraries @@ -3501,7 +3502,7 @@ Release Date: March 10, 2006 - Fixed a pagination problem in the scaffolding. - Fixed a bug in the mysql class "where" function. - Fixed a regex problem in some code that trimmed duplicate slashes. -- Fixed a bug in the br() function in the HTML helper +- Fixed a bug in the ``br()`` function in the HTML helper - Fixed a syntax mistake in the form_dropdown function in the Form Helper. - Removed the "style" attributes form the form helpers. diff --git a/user_guide_src/source/helpers/html_helper.rst b/user_guide_src/source/helpers/html_helper.rst index b4e56fdca47..734b4465c1f 100644 --- a/user_guide_src/source/helpers/html_helper.rst +++ b/user_guide_src/source/helpers/html_helper.rst @@ -371,43 +371,3 @@ The following functions are available: XHTML+RDFa 1.0 xhtml-rdfa-1 XHTML+RDFa 1.1 xhtml-rdfa-2 =============================== =================== ================================================================================================================================================== - -.. php:function:: br([$count = 1]) - - :param int $count: Number of times to repeat the tag - :returns: HTML line break tag - :rtype: string - - Generates line break tags (
    ) based on the number you submit. - Example:: - - echo br(3); - - The above would produce: - - .. code-block:: html - -


    - - .. note:: This function is DEPRECATED. Use the native ``str_repeat()`` - in combination with ``
    `` instead. - -.. php:function:: nbs([$num = 1]) - - :param int $num: Number of space entities to produce - :returns: A sequence of non-breaking space HTML entities - :rtype: string - - Generates non-breaking spaces ( ) based on the number you submit. - Example:: - - echo nbs(3); - - The above would produce: - - .. code-block:: html - -     - - .. note:: This function is DEPRECATED. Use the native ``str_repeat()`` - in combination with `` `` instead. diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 080a02895cf..a357e20ef79 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -139,6 +139,8 @@ version 3.0.0, that have been removed in 3.2.0: - ``standard_date()`` :doc:`Date Helper <../helpers/date_helper>` function (use ``date()`` instead) - ``do_hash()`` :doc:`Security Helper <../helpers/security_helper>` function (use ``hash()`` instead) +- ``br()`` :doc:`HTML Helper <../helpers/html_helper>` function (use ``str_repeat()`` with ``'
    '`` instead) +- ``nbs()`` :doc:`HTML Helper <../helpers/html_helper>` function (use ``str_repeat()`` with ``' '`` instead) - The entire *Email Helper*, which only had two functions: From 41091ba2fd3005d4a387ee17bfd7520475028627 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 15:25:25 +0200 Subject: [PATCH 4591/5397] Remove previously deprecates String Helper functions trim_slashes(), repeater() --- system/helpers/string_helper.php | 47 ------------------- .../helpers/string_helper_test.php | 32 +------------ user_guide_src/source/changelog.rst | 5 +- .../source/helpers/string_helper.rst | 37 +-------------- .../source/installation/upgrade_300.rst | 4 +- .../source/installation/upgrade_320.rst | 2 + 6 files changed, 9 insertions(+), 118 deletions(-) diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php index db531fa9aab..62b1a18e07e 100644 --- a/system/helpers/string_helper.php +++ b/system/helpers/string_helper.php @@ -49,33 +49,6 @@ // ------------------------------------------------------------------------ -if ( ! function_exists('trim_slashes')) -{ - /** - * Trim Slashes - * - * Removes any leading/trailing slashes from a string: - * - * /this/that/theother/ - * - * becomes: - * - * this/that/theother - * - * @todo Remove in version 3.1+. - * @deprecated 3.0.0 This is just an alias for PHP's native trim() - * - * @param string - * @return string - */ - function trim_slashes($str) - { - return trim($str, '/'); - } -} - -// ------------------------------------------------------------------------ - if ( ! function_exists('strip_slashes')) { /** @@ -284,23 +257,3 @@ function alternator() return $args[($i++ % count($args))]; } } - -// ------------------------------------------------------------------------ - -if ( ! function_exists('repeater')) -{ - /** - * Repeater function - * - * @todo Remove in version 3.1+. - * @deprecated 3.0.0 This is just an alias for PHP's native str_repeat() - * - * @param string $data String to repeat - * @param int $num Number of repeats - * @return string - */ - function repeater($data, $num = 1) - { - return ($num > 0) ? str_repeat($data, $num) : ''; - } -} diff --git a/tests/codeigniter/helpers/string_helper_test.php b/tests/codeigniter/helpers/string_helper_test.php index 75701ec1392..6de336b01d1 100644 --- a/tests/codeigniter/helpers/string_helper_test.php +++ b/tests/codeigniter/helpers/string_helper_test.php @@ -22,19 +22,6 @@ public function test_strip_slashes() $this->assertEquals($expected, strip_slashes($str)); } - public function test_trim_slashes() - { - $strs = array( - '//Slashes//\/' => 'Slashes//\\', - '/var/www/html/' => 'var/www/html' - ); - - foreach ($strs as $str => $expect) - { - $this->assertEquals($expect, trim_slashes($str)); - } - } - // -------------------------------------------------------------------- public function test_strip_quotes() @@ -108,23 +95,6 @@ public function test_reduce_multiples() // -------------------------------------------------------------------- - public function test_repeater() - { - $strs = array( - 'a' => 'aaaaaaaaaa', - ' ' => '          ', - '
    ' => '









    ' - - ); - - foreach ($strs as $str => $expect) - { - $this->assertEquals($expect, repeater($str, 10)); - } - } - - // -------------------------------------------------------------------- - public function test_random_string() { $this->assertEquals(16, strlen(random_string('alnum', 16))); @@ -145,4 +115,4 @@ public function test_increment_string() $this->assertEquals(124, increment_string('123', '')); } -} \ No newline at end of file +} diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 33f25db5143..8be737b6f88 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -16,6 +16,7 @@ Release Date: Not Released - Removed previously deprecated :doc:`Date Helper ` function ``standard_date()`` (use PHP's native ``date()`` instead). - Removed previously deprecated :doc:`Security Helper ` function ``do_hash()`` (use PHP's native ``hash()`` instead). - Removed previously deprecated :doc:`HTML Helper ` functions ``br()`` and ``nbs()`` (use PHP's native ``str_repeat()`` with ``'
    '`` and ``' '`` respectively). + - Removed previously deprecated :doc:`String Helper ` functions ``trim_slashes()`` and ``repeater()`` (use PHP's native ``trim()`` with ``'/'`` and ``str_repeat()`` respectively). - Removed previously deprecated *Email Helper* (had only two functions, aliases for PHP's native ``filter_var()`` and ``mail()``). - Libraries @@ -2969,7 +2970,7 @@ Release Date: July 12, 2007 - Fixed various doc typos. - Documented two functions from the :doc:`String helper <./helpers/string_helper>` that were missing from the - user guide: trim_slashes() and reduce_double_slashes(). + user guide: ``trim_slashes()`` and ``reduce_double_slashes()``. - Docs now validate to XHTML 1 transitional - Updated the XSS Filtering to take into account the IE expression() ability and improved certain deletions to prevent possible exploits @@ -3000,7 +3001,7 @@ Release Date: April 15, 2007 - Added array to string into the profiler - Code Igniter references updated to CodeIgniter - pMachine references updated to EllisLab -- Fixed a bug in the repeater function of :doc:`string +- Fixed a bug in the ``repeater()`` function of :doc:`string helper <./helpers/string_helper>`. - Fixed a bug in ODBC driver - Fixed a bug in result_array() that was returning an empty array when diff --git a/user_guide_src/source/helpers/string_helper.rst b/user_guide_src/source/helpers/string_helper.rst index 53052557edc..d697d824b51 100644 --- a/user_guide_src/source/helpers/string_helper.rst +++ b/user_guide_src/source/helpers/string_helper.rst @@ -27,7 +27,6 @@ Available Functions The following functions are available: - .. php:function:: random_string([$type = 'alnum'[, $len = 8]]) :param string $type: Randomization type @@ -102,24 +101,6 @@ The following functions are available: .. note:: To use multiple separate calls to this function simply call the function with no arguments to re-initialize. -.. php:function:: repeater($data[, $num = 1]) - - :param string $data: Input - :param int $num: Number of times to repeat - :returns: Repeated string - :rtype: string - - Generates repeating copies of the data you submit. Example:: - - $string = "\n"; - echo repeater($string, 30); - - The above would generate 30 newlines. - - .. note:: This function is DEPRECATED. Use the native ``str_repeat()`` - instead. - - .. php:function:: reduce_double_slashes($str) :param string $str: Input string @@ -134,7 +115,6 @@ The following functions are available: $string = "http://example.com//index.php"; echo reduce_double_slashes($string); // results in "http://example.com/index.php" - .. php:function:: strip_slashes($data) :param mixed $data: Input string or an array of strings @@ -163,21 +143,6 @@ The following functions are available: and handle string inputs. This however makes it just an alias for ``stripslashes()``. -.. php:function:: trim_slashes($str) - - :param string $str: Input string - :returns: Slash-trimmed string - :rtype: string - - Removes any leading/trailing slashes from a string. Example:: - - $string = "/this/that/theother/"; - echo trim_slashes($string); // results in this/that/theother - - .. note:: This function is DEPRECATED. Use the native ``trim()`` instead: - | - | trim($str, '/'); - .. php:function:: reduce_multiples($str[, $character = ''[, $trim = FALSE]]) :param string $str: Text to search in @@ -220,4 +185,4 @@ The following functions are available: Removes single and double quotes from a string. Example:: $string = "Joe's \"dinner\""; - $string = strip_quotes($string); //results in "Joes dinner" \ No newline at end of file + $string = strip_quotes($string); //results in "Joes dinner" diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 9d0d0dc1e64..c7c2b948a78 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -624,7 +624,7 @@ CodeIgniter 3.1+. String helper repeater() ======================== -:doc:`String Helper <../helpers/string_helper>` function :php:func:`repeater()` is now just an alias for +:doc:`String Helper <../helpers/string_helper>` function ``repeater()`` is now just an alias for PHP's native ``str_repeat()`` function. It is deprecated and scheduled for removal in CodeIgniter 3.1+. .. note:: This function is still available, but you're strongly encouraged to remove its usage sooner @@ -633,7 +633,7 @@ PHP's native ``str_repeat()`` function. It is deprecated and scheduled for remov String helper trim_slashes() ============================ -:doc:`String Helper <../helpers/string_helper>` function :php:func:`trim_slashes()` is now just an alias +:doc:`String Helper <../helpers/string_helper>` function ``trim_slashes()`` is now just an alias for PHP's native ``trim()`` function (with a slash passed as its second argument). It is deprecated and scheduled for removal in CodeIgniter 3.1+. diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index a357e20ef79..8a559c26804 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -141,6 +141,8 @@ version 3.0.0, that have been removed in 3.2.0: - ``do_hash()`` :doc:`Security Helper <../helpers/security_helper>` function (use ``hash()`` instead) - ``br()`` :doc:`HTML Helper <../helpers/html_helper>` function (use ``str_repeat()`` with ``'
    '`` instead) - ``nbs()`` :doc:`HTML Helper <../helpers/html_helper>` function (use ``str_repeat()`` with ``' '`` instead) +- ``trim_slashes()`` :doc:`String Helper <../helpers/string_helper>` function (use ``trim()`` with ``'/'`` instead) +- ``repeater()`` :doc:`String Helper <../helpers/string_helper>` function (use ``str_repeat()`` instead) - The entire *Email Helper*, which only had two functions: From 172f949370bb1498789c7d897fdaa4073388ebd5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 15:28:41 +0200 Subject: [PATCH 4592/5397] Remove previously deprecated File Helper function read_file() --- system/helpers/file_helper.php | 20 ------------- .../codeigniter/helpers/file_helper_test.php | 15 +--------- user_guide_src/source/changelog.rst | 1 + user_guide_src/source/helpers/file_helper.rst | 28 +------------------ .../source/installation/upgrade_320.rst | 1 + 5 files changed, 4 insertions(+), 61 deletions(-) diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php index 3cb36a551f0..484bf32285e 100644 --- a/system/helpers/file_helper.php +++ b/system/helpers/file_helper.php @@ -49,26 +49,6 @@ // ------------------------------------------------------------------------ -if ( ! function_exists('read_file')) -{ - /** - * Read File - * - * Opens the file specified in the path and returns it as a string. - * - * @todo Remove in version 3.1+. - * @deprecated 3.0.0 It is now just an alias for PHP's native file_get_contents(). - * @param string $file Path to file - * @return string File contents - */ - function read_file($file) - { - return @file_get_contents($file); - } -} - -// ------------------------------------------------------------------------ - if ( ! function_exists('write_file')) { /** diff --git a/tests/codeigniter/helpers/file_helper_test.php b/tests/codeigniter/helpers/file_helper_test.php index c3181759511..5ed8cb5c023 100644 --- a/tests/codeigniter/helpers/file_helper_test.php +++ b/tests/codeigniter/helpers/file_helper_test.php @@ -14,19 +14,6 @@ public function set_up() // -------------------------------------------------------------------- - public function test_read_file() - { - $this->assertFalse(read_file('does_not_exist')); - - $content = 'Jack and Jill went up the mountain to fight a billy goat.'; - - $file = vfsStream::newFile('my_file.txt')->withContent($content)->at($this->_test_dir); - - $this->assertEquals($content, read_file(vfsStream::url('my_file.txt'))); - } - - // -------------------------------------------------------------------- - public function test_octal_permissions() { $content = 'Jack and Jill went up the mountain to fight a billy goat.'; @@ -144,4 +131,4 @@ public function test_write_file() $this->assertTrue(write_file(vfsStream::url('write.txt'), $content)); } -} \ No newline at end of file +} diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 8be737b6f88..b6ef1db95df 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -17,6 +17,7 @@ Release Date: Not Released - Removed previously deprecated :doc:`Security Helper ` function ``do_hash()`` (use PHP's native ``hash()`` instead). - Removed previously deprecated :doc:`HTML Helper ` functions ``br()`` and ``nbs()`` (use PHP's native ``str_repeat()`` with ``'
    '`` and ``' '`` respectively). - Removed previously deprecated :doc:`String Helper ` functions ``trim_slashes()`` and ``repeater()`` (use PHP's native ``trim()`` with ``'/'`` and ``str_repeat()`` respectively). + - Removed previously deprecated :doc:`File Helper ` function ``read_file()`` (use PHP's native ``file_get_contents()`` instead). - Removed previously deprecated *Email Helper* (had only two functions, aliases for PHP's native ``filter_var()`` and ``mail()``). - Libraries diff --git a/user_guide_src/source/helpers/file_helper.rst b/user_guide_src/source/helpers/file_helper.rst index 833cddea44f..dcf3a2340b9 100644 --- a/user_guide_src/source/helpers/file_helper.rst +++ b/user_guide_src/source/helpers/file_helper.rst @@ -23,32 +23,6 @@ Available Functions The following functions are available: - -.. php:function:: read_file($file) - - :param string $file: File path - :returns: File contents or FALSE on failure - :rtype: string - - Returns the data contained in the file specified in the path. - - Example:: - - $string = read_file('./path/to/file.php'); - - The path can be a relative or full server path. Returns FALSE (boolean) on failure. - - .. note:: The path is relative to your main site index.php file, NOT your - controller or view files. CodeIgniter uses a front controller so paths - are always relative to the main site index. - - .. note:: This function is DEPRECATED. Use the native ``file_get_contents()`` - instead. - - .. important:: If your server is running an **open_basedir** restriction this - function might not work if you are trying to access a file above the - calling script. - .. php:function:: write_file($path, $data[, $mode = 'wb']) :param string $path: File path @@ -199,4 +173,4 @@ The following functions are available: :: - echo octal_permissions(fileperms('./index.php')); // 644 \ No newline at end of file + echo octal_permissions(fileperms('./index.php')); // 644 diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 8a559c26804..5cf2acd3b30 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -143,6 +143,7 @@ version 3.0.0, that have been removed in 3.2.0: - ``nbs()`` :doc:`HTML Helper <../helpers/html_helper>` function (use ``str_repeat()`` with ``' '`` instead) - ``trim_slashes()`` :doc:`String Helper <../helpers/string_helper>` function (use ``trim()`` with ``'/'`` instead) - ``repeater()`` :doc:`String Helper <../helpers/string_helper>` function (use ``str_repeat()`` instead) +- ``read_file()`` :doc:`File Helper <../helpers/file_helper>` function (use ``file_get_contents()`` instead) - The entire *Email Helper*, which only had two functions: From 37c4cc599698da0634d620665491fc27e9a36beb Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 15:33:42 +0200 Subject: [PATCH 4593/5397] Remove previously deprecated Form Helper function form_prep() --- system/helpers/form_helper.php | 19 ------------------- .../codeigniter/helpers/form_helper_test.php | 16 ---------------- user_guide_src/source/changelog.rst | 9 +++++---- user_guide_src/source/helpers/form_helper.rst | 17 ----------------- .../source/installation/upgrade_300.rst | 4 ++-- .../source/installation/upgrade_320.rst | 1 + 6 files changed, 8 insertions(+), 58 deletions(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index aa7379f77bf..9756437ae1b 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -653,25 +653,6 @@ function form_close($extra = '') // ------------------------------------------------------------------------ -if ( ! function_exists('form_prep')) -{ - /** - * Form Prep - * - * Formats text so that it can be safely placed in a form field in the event it has HTML tags. - * - * @deprecated 3.0.0 An alias for html_escape() - * @param string|string[] $str Value to escape - * @return string|string[] Escaped values - */ - function form_prep($str) - { - return html_escape($str, TRUE); - } -} - -// ------------------------------------------------------------------------ - if ( ! function_exists('set_value')) { /** diff --git a/tests/codeigniter/helpers/form_helper_test.php b/tests/codeigniter/helpers/form_helper_test.php index b5fe99b9672..4ecfaa5f70f 100644 --- a/tests/codeigniter/helpers/form_helper_test.php +++ b/tests/codeigniter/helpers/form_helper_test.php @@ -271,20 +271,4 @@ public function test_form_close() $this->assertEquals($expected, form_close('
    ')); } - - // ------------------------------------------------------------------------ - - public function test_form_prep() - { - $this->assertEquals( - 'Here is a string containing "quoted" text.', - form_prep('Here is a string containing "quoted" text.') - ); - - $this->assertEquals( - 'Here is a string containing a <tag>.', - form_prep('Here is a string containing a .', TRUE) - ); - } - } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b6ef1db95df..2dcb0b1afc5 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -18,6 +18,7 @@ Release Date: Not Released - Removed previously deprecated :doc:`HTML Helper ` functions ``br()`` and ``nbs()`` (use PHP's native ``str_repeat()`` with ``'
    '`` and ``' '`` respectively). - Removed previously deprecated :doc:`String Helper ` functions ``trim_slashes()`` and ``repeater()`` (use PHP's native ``trim()`` with ``'/'`` and ``str_repeat()`` respectively). - Removed previously deprecated :doc:`File Helper ` function ``read_file()`` (use PHP's native ``file_get_contents()`` instead). + - Removed previously deprecated :doc:`Form Helper ` function ``form_prep()`` (use :php:func:`html_escape()` instead). - Removed previously deprecated *Email Helper* (had only two functions, aliases for PHP's native ``filter_var()`` and ``mail()``). - Libraries @@ -550,7 +551,7 @@ Release Date: March 30, 2015 - :doc:`Form Helper ` changes include: - :php:func:`form_dropdown()` will now also take an array for unity with other form helpers. - - :php:func:`form_prep()` is now DEPRECATED and only acts as an alias for :doc:`common function ` :php:func:`html_escape()`. + - ``form_prep()`` is now DEPRECATED and only acts as an alias for :doc:`common function ` :php:func:`html_escape()`. - :php:func:`set_value()` will now also accept a third argument, allowing to turn off HTML escaping of the value. - :doc:`Security Helper ` changes include: @@ -1994,7 +1995,7 @@ Hg Tag: v1.7.2 - Modified form_hidden() in the :doc:`Form helper ` to accept multi-dimensional arrays. - - Modified form_prep() in the :doc:`Form + - Modified ``form_prep()`` in the :doc:`Form helper ` to keep track of prepped fields to avoid multiple prep/mutation from subsequent calls which can occur when using Form Validation and form helper functions to @@ -2053,7 +2054,7 @@ Bug fixes for 1.7.2 - Fixed a case sensitive string replacement in xss_clean() - Fixed a bug in form_textarea() where form data was not prepped correctly. -- Fixed a bug in form_prep() causing it to not preserve entities in +- Fixed a bug in ``form_prep()`` causing it to not preserve entities in the user's original input when called back into a form element - Fixed a bug in _protect_identifiers() where the swap prefix ($swap_pre) was not being observed. @@ -3142,7 +3143,7 @@ Release Date: October 30, 2006 - Fixed a bug in the validation class. - Fixed a bug in the typography helper that was incorrectly wrapping block level elements in paragraph tags. -- Fixed a problem in the form_prep() function that was double encoding +- Fixed a problem in the ``form_prep()`` function that was double encoding entities. - Fixed a bug that affects some versions of PHP when output buffering is nested. diff --git a/user_guide_src/source/helpers/form_helper.rst b/user_guide_src/source/helpers/form_helper.rst index bc30a0e9843..cf52cd5239b 100644 --- a/user_guide_src/source/helpers/form_helper.rst +++ b/user_guide_src/source/helpers/form_helper.rst @@ -724,20 +724,3 @@ The following functions are available: The "password" field doesn't match the "repeat_password" field! */ - -.. php:function:: form_prep($str) - - :param string $str: Value to escape - :returns: Escaped value - :rtype: string - - Allows you to safely use HTML and characters such as quotes within form - elements without breaking out of the form. - - .. note:: If you use any of the form helper functions listed in this page the form - values will be prepped automatically, so there is no need to call this - function. Use it only if you are creating your own form elements. - - .. note:: This function is DEPRECATED and is just an alias for - :doc:`common function <../general/common_functions>` - :func:`html_escape()` - please use that instead. diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index c7c2b948a78..35f5621cd8a 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -643,8 +643,8 @@ scheduled for removal in CodeIgniter 3.1+. Form helper form_prep() ======================= -:doc:`Form Helper <../helpers/form_helper>` function :php:func:`form_prep()` -is now just an alias for :doc:`common function ` +:doc:`Form Helper <../helpers/form_helper>` function ``form_prep()`` is now +just an alias for :doc:`common function ` :func:`html_escape()`. It is deprecated and will be removed in the future. Please use :php:func:`html_escape()` instead. diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 5cf2acd3b30..6107d084b9a 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -144,6 +144,7 @@ version 3.0.0, that have been removed in 3.2.0: - ``trim_slashes()`` :doc:`String Helper <../helpers/string_helper>` function (use ``trim()`` with ``'/'`` instead) - ``repeater()`` :doc:`String Helper <../helpers/string_helper>` function (use ``str_repeat()`` instead) - ``read_file()`` :doc:`File Helper <../helpers/file_helper>` function (use ``file_get_contents()`` instead) +- ``form_prep()`` :doc:`Form Helper <../helpers/form_helper>` function (use :php:func:`html_escape()` instead) - The entire *Email Helper*, which only had two functions: From fe58c1c633cdfc11efc22a4d9bd888fab4a2a15c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 15:40:01 +0200 Subject: [PATCH 4594/5397] Remove previously deprecated Javascript Library --- system/libraries/Javascript.php | 856 ------------- system/libraries/Javascript/Jquery.php | 1076 ----------------- system/libraries/Javascript/index.html | 11 - user_guide_src/source/changelog.rst | 1 + .../source/installation/upgrade_300.rst | 4 +- .../source/installation/upgrade_320.rst | 2 + .../source/libraries/javascript.rst | 322 ----- 7 files changed, 5 insertions(+), 2267 deletions(-) delete mode 100644 system/libraries/Javascript.php delete mode 100644 system/libraries/Javascript/Jquery.php delete mode 100644 system/libraries/Javascript/index.html delete mode 100644 user_guide_src/source/libraries/javascript.rst diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php deleted file mode 100644 index 2ddab38ee54..00000000000 --- a/system/libraries/Javascript.php +++ /dev/null @@ -1,856 +0,0 @@ - 'jquery', 'autoload' => TRUE); - - foreach ($defaults as $key => $val) - { - if (isset($params[$key]) && $params[$key] !== '') - { - $defaults[$key] = $params[$key]; - } - } - - extract($defaults); - - $this->CI =& get_instance(); - - // load the requested js library - $this->CI->load->library('Javascript/'.$js_library_driver, array('autoload' => $autoload)); - // make js to refer to current library - $this->js =& $this->CI->$js_library_driver; - - log_message('info', 'Javascript Class Initialized and loaded. Driver used: '.$js_library_driver); - } - - // -------------------------------------------------------------------- - // Event Code - // -------------------------------------------------------------------- - - /** - * Blur - * - * Outputs a javascript library blur event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function blur($element = 'this', $js = '') - { - return $this->js->_blur($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Change - * - * Outputs a javascript library change event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function change($element = 'this', $js = '') - { - return $this->js->_change($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Click - * - * Outputs a javascript library click event - * - * @param string The element to attach the event to - * @param string The code to execute - * @param bool whether or not to return false - * @return string - */ - public function click($element = 'this', $js = '', $ret_false = TRUE) - { - return $this->js->_click($element, $js, $ret_false); - } - - // -------------------------------------------------------------------- - - /** - * Double Click - * - * Outputs a javascript library dblclick event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function dblclick($element = 'this', $js = '') - { - return $this->js->_dblclick($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Outputs a javascript library error event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function error($element = 'this', $js = '') - { - return $this->js->_error($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Focus - * - * Outputs a javascript library focus event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function focus($element = 'this', $js = '') - { - return $this->js->_focus($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Hover - * - * Outputs a javascript library hover event - * - * @param string - element - * @param string - Javascript code for mouse over - * @param string - Javascript code for mouse out - * @return string - */ - public function hover($element = 'this', $over = '', $out = '') - { - return $this->js->_hover($element, $over, $out); - } - - // -------------------------------------------------------------------- - - /** - * Keydown - * - * Outputs a javascript library keydown event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function keydown($element = 'this', $js = '') - { - return $this->js->_keydown($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Keyup - * - * Outputs a javascript library keydown event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function keyup($element = 'this', $js = '') - { - return $this->js->_keyup($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Load - * - * Outputs a javascript library load event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function load($element = 'this', $js = '') - { - return $this->js->_load($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Mousedown - * - * Outputs a javascript library mousedown event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function mousedown($element = 'this', $js = '') - { - return $this->js->_mousedown($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Mouse Out - * - * Outputs a javascript library mouseout event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function mouseout($element = 'this', $js = '') - { - return $this->js->_mouseout($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Mouse Over - * - * Outputs a javascript library mouseover event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function mouseover($element = 'this', $js = '') - { - return $this->js->_mouseover($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Mouseup - * - * Outputs a javascript library mouseup event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function mouseup($element = 'this', $js = '') - { - return $this->js->_mouseup($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Output - * - * Outputs the called javascript to the screen - * - * @param string The code to output - * @return string - */ - public function output($js) - { - return $this->js->_output($js); - } - - // -------------------------------------------------------------------- - - /** - * Ready - * - * Outputs a javascript library mouseup event - * - * @param string $js Code to execute - * @return string - */ - public function ready($js) - { - return $this->js->_document_ready($js); - } - - // -------------------------------------------------------------------- - - /** - * Resize - * - * Outputs a javascript library resize event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function resize($element = 'this', $js = '') - { - return $this->js->_resize($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Scroll - * - * Outputs a javascript library scroll event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function scroll($element = 'this', $js = '') - { - return $this->js->_scroll($element, $js); - } - - // -------------------------------------------------------------------- - - /** - * Unload - * - * Outputs a javascript library unload event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - public function unload($element = 'this', $js = '') - { - return $this->js->_unload($element, $js); - } - - // -------------------------------------------------------------------- - // Effects - // -------------------------------------------------------------------- - - /** - * Add Class - * - * Outputs a javascript library addClass event - * - * @param string - element - * @param string - Class to add - * @return string - */ - public function addClass($element = 'this', $class = '') - { - return $this->js->_addClass($element, $class); - } - - // -------------------------------------------------------------------- - - /** - * Animate - * - * Outputs a javascript library animate event - * - * @param string $element = 'this' - * @param array $params = array() - * @param mixed $speed 'slow', 'normal', 'fast', or time in milliseconds - * @param string $extra - * @return string - */ - public function animate($element = 'this', $params = array(), $speed = '', $extra = '') - { - return $this->js->_animate($element, $params, $speed, $extra); - } - - // -------------------------------------------------------------------- - - /** - * Fade In - * - * Outputs a javascript library hide event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - public function fadeIn($element = 'this', $speed = '', $callback = '') - { - return $this->js->_fadeIn($element, $speed, $callback); - } - - // -------------------------------------------------------------------- - - /** - * Fade Out - * - * Outputs a javascript library hide event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - public function fadeOut($element = 'this', $speed = '', $callback = '') - { - return $this->js->_fadeOut($element, $speed, $callback); - } - // -------------------------------------------------------------------- - - /** - * Slide Up - * - * Outputs a javascript library slideUp event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - public function slideUp($element = 'this', $speed = '', $callback = '') - { - return $this->js->_slideUp($element, $speed, $callback); - - } - - // -------------------------------------------------------------------- - - /** - * Remove Class - * - * Outputs a javascript library removeClass event - * - * @param string - element - * @param string - Class to add - * @return string - */ - public function removeClass($element = 'this', $class = '') - { - return $this->js->_removeClass($element, $class); - } - - // -------------------------------------------------------------------- - - /** - * Slide Down - * - * Outputs a javascript library slideDown event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - public function slideDown($element = 'this', $speed = '', $callback = '') - { - return $this->js->_slideDown($element, $speed, $callback); - } - - // -------------------------------------------------------------------- - - /** - * Slide Toggle - * - * Outputs a javascript library slideToggle event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - public function slideToggle($element = 'this', $speed = '', $callback = '') - { - return $this->js->_slideToggle($element, $speed, $callback); - - } - - // -------------------------------------------------------------------- - - /** - * Hide - * - * Outputs a javascript library hide action - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - public function hide($element = 'this', $speed = '', $callback = '') - { - return $this->js->_hide($element, $speed, $callback); - } - - // -------------------------------------------------------------------- - - /** - * Toggle - * - * Outputs a javascript library toggle event - * - * @param string - element - * @return string - */ - public function toggle($element = 'this') - { - return $this->js->_toggle($element); - - } - - // -------------------------------------------------------------------- - - /** - * Toggle Class - * - * Outputs a javascript library toggle class event - * - * @param string $element = 'this' - * @param string $class = '' - * @return string - */ - public function toggleClass($element = 'this', $class = '') - { - return $this->js->_toggleClass($element, $class); - } - - // -------------------------------------------------------------------- - - /** - * Show - * - * Outputs a javascript library show event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - public function show($element = 'this', $speed = '', $callback = '') - { - return $this->js->_show($element, $speed, $callback); - } - - // -------------------------------------------------------------------- - - /** - * Compile - * - * gather together all script needing to be output - * - * @param string $view_var - * @param bool $script_tags - * @return string - */ - public function compile($view_var = 'script_foot', $script_tags = TRUE) - { - $this->js->_compile($view_var, $script_tags); - } - - // -------------------------------------------------------------------- - - /** - * Clear Compile - * - * Clears any previous javascript collected for output - * - * @return void - */ - public function clear_compile() - { - $this->js->_clear_compile(); - } - - // -------------------------------------------------------------------- - - /** - * External - * - * Outputs a - * - * @param string - * @return string - */ - protected function _close_script($extra = "\n") - { - return ''.$extra; - } - - // -------------------------------------------------------------------- - // AJAX-Y STUFF - still a testbed - // -------------------------------------------------------------------- - - /** - * Update - * - * Outputs a javascript library slideDown event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - public function update($element = 'this', $speed = '', $callback = '') - { - return $this->js->_updater($element, $speed, $callback); - } - - // -------------------------------------------------------------------- - - /** - * Generate JSON - * - * Can be passed a database result or associative array and returns a JSON formatted string - * - * @param mixed result set or array - * @param bool match array types (defaults to objects) - * @return string a json formatted string - */ - public function generate_json($result = NULL, $match_array_type = FALSE) - { - // JSON data can optionally be passed to this function - // either as a database result object or an array, or a user supplied array - if ($result !== NULL) - { - if (is_object($result)) - { - $json_result = is_callable(array($result, 'result_array')) ? $result->result_array() : (array) $result; - } - elseif (is_array($result)) - { - $json_result = $result; - } - else - { - return $this->_prep_args($result); - } - } - else - { - return 'null'; - } - - $json = array(); - $_is_assoc = TRUE; - - if ( ! is_array($json_result) && empty($json_result)) - { - show_error('Generate JSON Failed - Illegal key, value pair.'); - } - elseif ($match_array_type) - { - $_is_assoc = $this->_is_associative_array($json_result); - } - - foreach ($json_result as $k => $v) - { - if ($_is_assoc) - { - $json[] = $this->_prep_args($k, TRUE).':'.$this->generate_json($v, $match_array_type); - } - else - { - $json[] = $this->generate_json($v, $match_array_type); - } - } - - $json = implode(',', $json); - - return $_is_assoc ? '{'.$json.'}' : '['.$json.']'; - - } - - // -------------------------------------------------------------------- - - /** - * Is associative array - * - * Checks for an associative array - * - * @param array - * @return bool - */ - protected function _is_associative_array($arr) - { - foreach (array_keys($arr) as $key => $val) - { - if ($key !== $val) - { - return TRUE; - } - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Prep Args - * - * Ensures a standard json value and escapes values - * - * @param mixed $result - * @param bool $is_key = FALSE - * @return string - */ - protected function _prep_args($result, $is_key = FALSE) - { - if ($result === NULL) - { - return 'null'; - } - elseif (is_bool($result)) - { - return ($result === TRUE) ? 'true' : 'false'; - } - elseif (is_string($result) OR $is_key) - { - return '"'.str_replace(array('\\', "\t", "\n", "\r", '"', '/'), array('\\\\', '\\t', '\\n', "\\r", '\"', '\/'), $result).'"'; - } - elseif (is_scalar($result)) - { - return $result; - } - } - -} diff --git a/system/libraries/Javascript/Jquery.php b/system/libraries/Javascript/Jquery.php deleted file mode 100644 index 9df1be1c1f1..00000000000 --- a/system/libraries/Javascript/Jquery.php +++ /dev/null @@ -1,1076 +0,0 @@ -CI =& get_instance(); - extract($params); - - if ($autoload === TRUE) - { - $this->script(); - } - - log_message('info', 'Jquery Class Initialized'); - } - - // -------------------------------------------------------------------- - // Event Code - // -------------------------------------------------------------------- - - /** - * Blur - * - * Outputs a jQuery blur event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _blur($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'blur'); - } - - // -------------------------------------------------------------------- - - /** - * Change - * - * Outputs a jQuery change event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _change($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'change'); - } - - // -------------------------------------------------------------------- - - /** - * Click - * - * Outputs a jQuery click event - * - * @param string The element to attach the event to - * @param string The code to execute - * @param bool whether or not to return false - * @return string - */ - protected function _click($element = 'this', $js = '', $ret_false = TRUE) - { - is_array($js) OR $js = array($js); - - if ($ret_false) - { - $js[] = 'return false;'; - } - - return $this->_add_event($element, $js, 'click'); - } - - // -------------------------------------------------------------------- - - /** - * Double Click - * - * Outputs a jQuery dblclick event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _dblclick($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'dblclick'); - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Outputs a jQuery error event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _error($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'error'); - } - - // -------------------------------------------------------------------- - - /** - * Focus - * - * Outputs a jQuery focus event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _focus($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'focus'); - } - - // -------------------------------------------------------------------- - - /** - * Hover - * - * Outputs a jQuery hover event - * - * @param string - element - * @param string - Javascript code for mouse over - * @param string - Javascript code for mouse out - * @return string - */ - protected function _hover($element = 'this', $over = '', $out = '') - { - $event = "\n\t$(".$this->_prep_element($element).").hover(\n\t\tfunction()\n\t\t{\n\t\t\t{$over}\n\t\t}, \n\t\tfunction()\n\t\t{\n\t\t\t{$out}\n\t\t});\n"; - - $this->jquery_code_for_compile[] = $event; - - return $event; - } - - // -------------------------------------------------------------------- - - /** - * Keydown - * - * Outputs a jQuery keydown event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _keydown($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'keydown'); - } - - // -------------------------------------------------------------------- - - /** - * Keyup - * - * Outputs a jQuery keydown event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _keyup($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'keyup'); - } - - // -------------------------------------------------------------------- - - /** - * Load - * - * Outputs a jQuery load event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _load($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'load'); - } - - // -------------------------------------------------------------------- - - /** - * Mousedown - * - * Outputs a jQuery mousedown event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _mousedown($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'mousedown'); - } - - // -------------------------------------------------------------------- - - /** - * Mouse Out - * - * Outputs a jQuery mouseout event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _mouseout($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'mouseout'); - } - - // -------------------------------------------------------------------- - - /** - * Mouse Over - * - * Outputs a jQuery mouseover event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _mouseover($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'mouseover'); - } - - // -------------------------------------------------------------------- - - /** - * Mouseup - * - * Outputs a jQuery mouseup event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _mouseup($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'mouseup'); - } - - // -------------------------------------------------------------------- - - /** - * Output - * - * Outputs script directly - * - * @param array $array_js = array() - * @return void - */ - protected function _output($array_js = array()) - { - if ( ! is_array($array_js)) - { - $array_js = array($array_js); - } - - foreach ($array_js as $js) - { - $this->jquery_code_for_compile[] = "\t".$js."\n"; - } - } - - // -------------------------------------------------------------------- - - /** - * Resize - * - * Outputs a jQuery resize event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _resize($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'resize'); - } - - // -------------------------------------------------------------------- - - /** - * Scroll - * - * Outputs a jQuery scroll event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _scroll($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'scroll'); - } - - // -------------------------------------------------------------------- - - /** - * Unload - * - * Outputs a jQuery unload event - * - * @param string The element to attach the event to - * @param string The code to execute - * @return string - */ - protected function _unload($element = 'this', $js = '') - { - return $this->_add_event($element, $js, 'unload'); - } - - // -------------------------------------------------------------------- - // Effects - // -------------------------------------------------------------------- - - /** - * Add Class - * - * Outputs a jQuery addClass event - * - * @param string $element - * @param string $class - * @return string - */ - protected function _addClass($element = 'this', $class = '') - { - $element = $this->_prep_element($element); - return '$('.$element.').addClass("'.$class.'");'; - } - - // -------------------------------------------------------------------- - - /** - * Animate - * - * Outputs a jQuery animate event - * - * @param string $element - * @param array $params - * @param string $speed 'slow', 'normal', 'fast', or time in milliseconds - * @param string $extra - * @return string - */ - protected function _animate($element = 'this', $params = array(), $speed = '', $extra = '') - { - $element = $this->_prep_element($element); - $speed = $this->_validate_speed($speed); - - $animations = "\t\t\t"; - - foreach ($params as $param => $value) - { - $animations .= $param.": '".$value."', "; - } - - $animations = substr($animations, 0, -2); // remove the last ", " - - if ($speed !== '') - { - $speed = ', '.$speed; - } - - if ($extra !== '') - { - $extra = ', '.$extra; - } - - return "$({$element}).animate({\n$animations\n\t\t}".$speed.$extra.');'; - } - - // -------------------------------------------------------------------- - - /** - * Fade In - * - * Outputs a jQuery hide event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - protected function _fadeIn($element = 'this', $speed = '', $callback = '') - { - $element = $this->_prep_element($element); - $speed = $this->_validate_speed($speed); - - if ($callback !== '') - { - $callback = ", function(){\n{$callback}\n}"; - } - - return "$({$element}).fadeIn({$speed}{$callback});"; - } - - // -------------------------------------------------------------------- - - /** - * Fade Out - * - * Outputs a jQuery hide event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - protected function _fadeOut($element = 'this', $speed = '', $callback = '') - { - $element = $this->_prep_element($element); - $speed = $this->_validate_speed($speed); - - if ($callback !== '') - { - $callback = ", function(){\n{$callback}\n}"; - } - - return '$('.$element.').fadeOut('.$speed.$callback.');'; - } - - // -------------------------------------------------------------------- - - /** - * Hide - * - * Outputs a jQuery hide action - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - protected function _hide($element = 'this', $speed = '', $callback = '') - { - $element = $this->_prep_element($element); - $speed = $this->_validate_speed($speed); - - if ($callback !== '') - { - $callback = ", function(){\n{$callback}\n}"; - } - - return "$({$element}).hide({$speed}{$callback});"; - } - - // -------------------------------------------------------------------- - - /** - * Remove Class - * - * Outputs a jQuery remove class event - * - * @param string $element - * @param string $class - * @return string - */ - protected function _removeClass($element = 'this', $class = '') - { - $element = $this->_prep_element($element); - return '$('.$element.').removeClass("'.$class.'");'; - } - - // -------------------------------------------------------------------- - - /** - * Slide Up - * - * Outputs a jQuery slideUp event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - protected function _slideUp($element = 'this', $speed = '', $callback = '') - { - $element = $this->_prep_element($element); - $speed = $this->_validate_speed($speed); - - if ($callback !== '') - { - $callback = ", function(){\n{$callback}\n}"; - } - - return '$('.$element.').slideUp('.$speed.$callback.');'; - } - - // -------------------------------------------------------------------- - - /** - * Slide Down - * - * Outputs a jQuery slideDown event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - protected function _slideDown($element = 'this', $speed = '', $callback = '') - { - $element = $this->_prep_element($element); - $speed = $this->_validate_speed($speed); - - if ($callback !== '') - { - $callback = ", function(){\n{$callback}\n}"; - } - - return '$('.$element.').slideDown('.$speed.$callback.');'; - } - - // -------------------------------------------------------------------- - - /** - * Slide Toggle - * - * Outputs a jQuery slideToggle event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - protected function _slideToggle($element = 'this', $speed = '', $callback = '') - { - $element = $this->_prep_element($element); - $speed = $this->_validate_speed($speed); - - if ($callback !== '') - { - $callback = ", function(){\n{$callback}\n}"; - } - - return '$('.$element.').slideToggle('.$speed.$callback.');'; - } - - // -------------------------------------------------------------------- - - /** - * Toggle - * - * Outputs a jQuery toggle event - * - * @param string - element - * @return string - */ - protected function _toggle($element = 'this') - { - $element = $this->_prep_element($element); - return '$('.$element.').toggle();'; - } - - // -------------------------------------------------------------------- - - /** - * Toggle Class - * - * Outputs a jQuery toggle class event - * - * @param string $element - * @param string $class - * @return string - */ - protected function _toggleClass($element = 'this', $class = '') - { - $element = $this->_prep_element($element); - return '$('.$element.').toggleClass("'.$class.'");'; - } - - // -------------------------------------------------------------------- - - /** - * Show - * - * Outputs a jQuery show event - * - * @param string - element - * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds - * @param string - Javascript callback function - * @return string - */ - protected function _show($element = 'this', $speed = '', $callback = '') - { - $element = $this->_prep_element($element); - $speed = $this->_validate_speed($speed); - - if ($callback !== '') - { - $callback = ", function(){\n{$callback}\n}"; - } - - return '$('.$element.').show('.$speed.$callback.');'; - } - - // -------------------------------------------------------------------- - - /** - * Updater - * - * An Ajax call that populates the designated DOM node with - * returned content - * - * @param string The element to attach the event to - * @param string the controller to run the call against - * @param string optional parameters - * @return string - */ - - protected function _updater($container = 'this', $controller = '', $options = '') - { - $container = $this->_prep_element($container); - $controller = (strpos('://', $controller) === FALSE) ? $controller : $this->CI->config->site_url($controller); - - // ajaxStart and ajaxStop are better choices here... but this is a stop gap - if ($this->CI->config->item('javascript_ajax_img') === '') - { - $loading_notifier = 'Loading...'; - } - else - { - $loading_notifier = 'Loading'; - } - - $updater = '$('.$container.").empty();\n" // anything that was in... get it out - ."\t\t$(".$container.').prepend("'.$loading_notifier."\");\n"; // to replace with an image - - $request_options = ''; - if ($options !== '') - { - $request_options .= ', {' - .(is_array($options) ? "'".implode("', '", $options)."'" : "'".str_replace(':', "':'", $options)."'") - .'}'; - } - - return $updater."\t\t$($container).load('$controller'$request_options);"; - } - - // -------------------------------------------------------------------- - // Pre-written handy stuff - // -------------------------------------------------------------------- - - /** - * Zebra tables - * - * @param string $class - * @param string $odd - * @param string $hover - * @return string - */ - protected function _zebraTables($class = '', $odd = 'odd', $hover = '') - { - $class = ($class !== '') ? '.'.$class : ''; - $zebra = "\t\$(\"table{$class} tbody tr:nth-child(even)\").addClass(\"{$odd}\");"; - - $this->jquery_code_for_compile[] = $zebra; - - if ($hover !== '') - { - $hover = $this->hover("table{$class} tbody tr", "$(this).addClass('hover');", "$(this).removeClass('hover');"); - } - - return $zebra; - } - - // -------------------------------------------------------------------- - // Plugins - // -------------------------------------------------------------------- - - /** - * Corner Plugin - * - * @link http://www.malsup.com/jquery/corner/ - * @param string $element - * @param string $corner_style - * @return string - */ - public function corner($element = '', $corner_style = '') - { - // may want to make this configurable down the road - $corner_location = '/plugins/jquery.corner.js'; - - if ($corner_style !== '') - { - $corner_style = '"'.$corner_style.'"'; - } - - return '$('.$this->_prep_element($element).').corner('.$corner_style.');'; - } - - // -------------------------------------------------------------------- - - /** - * Modal window - * - * Load a thickbox modal window - * - * @param string $src - * @param bool $relative - * @return void - */ - public function modal($src, $relative = FALSE) - { - $this->jquery_code_for_load[] = $this->external($src, $relative); - } - - // -------------------------------------------------------------------- - - /** - * Effect - * - * Load an Effect library - * - * @param string $src - * @param bool $relative - * @return void - */ - public function effect($src, $relative = FALSE) - { - $this->jquery_code_for_load[] = $this->external($src, $relative); - } - - // -------------------------------------------------------------------- - - /** - * Plugin - * - * Load a plugin library - * - * @param string $src - * @param bool $relative - * @return void - */ - public function plugin($src, $relative = FALSE) - { - $this->jquery_code_for_load[] = $this->external($src, $relative); - } - - // -------------------------------------------------------------------- - - /** - * UI - * - * Load a user interface library - * - * @param string $src - * @param bool $relative - * @return void - */ - public function ui($src, $relative = FALSE) - { - $this->jquery_code_for_load[] = $this->external($src, $relative); - } - - // -------------------------------------------------------------------- - - /** - * Sortable - * - * Creates a jQuery sortable - * - * @param string $element - * @param array $options - * @return string - */ - public function sortable($element, $options = array()) - { - if (count($options) > 0) - { - $sort_options = array(); - foreach ($options as $k=>$v) - { - $sort_options[] = "\n\t\t".$k.': '.$v; - } - $sort_options = implode(',', $sort_options); - } - else - { - $sort_options = ''; - } - - return '$('.$this->_prep_element($element).').sortable({'.$sort_options."\n\t});"; - } - - // -------------------------------------------------------------------- - - /** - * Table Sorter Plugin - * - * @param string table name - * @param string plugin location - * @return string - */ - public function tablesorter($table = '', $options = '') - { - $this->jquery_code_for_compile[] = "\t$(".$this->_prep_element($table).').tablesorter('.$options.");\n"; - } - - // -------------------------------------------------------------------- - // Class functions - // -------------------------------------------------------------------- - - /** - * Add Event - * - * Constructs the syntax for an event, and adds to into the array for compilation - * - * @param string The element to attach the event to - * @param string The code to execute - * @param string The event to pass - * @return string - */ - protected function _add_event($element, $js, $event) - { - if (is_array($js)) - { - $js = implode("\n\t\t", $js); - } - - $event = "\n\t$(".$this->_prep_element($element).').'.$event."(function(){\n\t\t{$js}\n\t});\n"; - $this->jquery_code_for_compile[] = $event; - return $event; - } - - // -------------------------------------------------------------------- - - /** - * Compile - * - * As events are specified, they are stored in an array - * This function compiles them all for output on a page - * - * @param string $view_var - * @param bool $script_tags - * @return void - */ - protected function _compile($view_var = 'script_foot', $script_tags = TRUE) - { - // External references - $external_scripts = implode('', $this->jquery_code_for_load); - $this->CI->load->vars(array('library_src' => $external_scripts)); - - if (count($this->jquery_code_for_compile) === 0) - { - // no inline references, let's just return - return; - } - - // Inline references - $script = '$(document).ready(function() {'."\n" - .implode('', $this->jquery_code_for_compile) - .'});'; - - $output = ($script_tags === FALSE) ? $script : $this->inline($script); - - $this->CI->load->vars(array($view_var => $output)); - } - - // -------------------------------------------------------------------- - - /** - * Clear Compile - * - * Clears the array of script events collected for output - * - * @return void - */ - protected function _clear_compile() - { - $this->jquery_code_for_compile = array(); - } - - // -------------------------------------------------------------------- - - /** - * Document Ready - * - * A wrapper for writing document.ready() - * - * @param array $js - * @return void - */ - protected function _document_ready($js) - { - is_array($js) OR $js = array($js); - - foreach ($js as $script) - { - $this->jquery_code_for_compile[] = $script; - } - } - - // -------------------------------------------------------------------- - - /** - * Script Tag - * - * Outputs the script tag that loads the jquery.js file into an HTML document - * - * @param string $library_src - * @param bool $relative - * @return string - */ - public function script($library_src = '', $relative = FALSE) - { - $library_src = $this->external($library_src, $relative); - $this->jquery_code_for_load[] = $library_src; - return $library_src; - } - - // -------------------------------------------------------------------- - - /** - * Prep Element - * - * Puts HTML element in quotes for use in jQuery code - * unless the supplied element is the Javascript 'this' - * object, in which case no quotes are added - * - * @param string - * @return string - */ - protected function _prep_element($element) - { - if ($element !== 'this') - { - $element = '"'.$element.'"'; - } - - return $element; - } - - // -------------------------------------------------------------------- - - /** - * Validate Speed - * - * Ensures the speed parameter is valid for jQuery - * - * @param string - * @return string - */ - protected function _validate_speed($speed) - { - if (in_array($speed, array('slow', 'normal', 'fast'))) - { - return '"'.$speed.'"'; - } - elseif (preg_match('/[^0-9]/', $speed)) - { - return ''; - } - - return $speed; - } - -} diff --git a/system/libraries/Javascript/index.html b/system/libraries/Javascript/index.html deleted file mode 100644 index b702fbc3967..00000000000 --- a/system/libraries/Javascript/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2dcb0b1afc5..f6d39cbfe10 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -20,6 +20,7 @@ Release Date: Not Released - Removed previously deprecated :doc:`File Helper ` function ``read_file()`` (use PHP's native ``file_get_contents()`` instead). - Removed previously deprecated :doc:`Form Helper ` function ``form_prep()`` (use :php:func:`html_escape()` instead). - Removed previously deprecated *Email Helper* (had only two functions, aliases for PHP's native ``filter_var()`` and ``mail()``). + - Removed previously deprecated *Javascript Library* (it was always experimental in the first place). - Libraries diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 35f5621cd8a..f00a695123e 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -844,8 +844,8 @@ CodeIgniter 3.1+. The Javascript library ====================== -The :doc:`Javascript Library <../libraries/javascript>` has always had an -'experimental' status and was never really useful, nor a proper solution. +The *Javascript Library* has always had an 'experimental' status and was +never really useful, nor a proper solution. It is now deprecated and scheduled for removal in CodeIgniter 3.1+. diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 6107d084b9a..2bc4e53d309 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -146,6 +146,8 @@ version 3.0.0, that have been removed in 3.2.0: - ``read_file()`` :doc:`File Helper <../helpers/file_helper>` function (use ``file_get_contents()`` instead) - ``form_prep()`` :doc:`Form Helper <../helpers/form_helper>` function (use :php:func:`html_escape()` instead) +- The entire *Javascript Library* (it was always experimental in the first place) + - The entire *Email Helper*, which only had two functions: - ``valid_email()`` (use ``filter_var($email, FILTER_VALIDATE_EMAIL)`` instead) diff --git a/user_guide_src/source/libraries/javascript.rst b/user_guide_src/source/libraries/javascript.rst deleted file mode 100644 index e91b9ad7835..00000000000 --- a/user_guide_src/source/libraries/javascript.rst +++ /dev/null @@ -1,322 +0,0 @@ -################ -Javascript Class -################ - -CodeIgniter provides a library to help you with certain common functions -that you may want to use with Javascript. Please note that CodeIgniter -does not require the jQuery library to run, and that any scripting -library will work equally well. The jQuery library is simply presented -as a convenience if you choose to use it. - -.. important:: This library is DEPRECATED and should not be used. It has always - been with an 'experimental' status and is now no longer supported. - Currently only kept for backwards compatibility. - -.. contents:: - :local: - -.. raw:: html - -
    - -************************** -Using the Javascript Class -************************** - -Initializing the Class -====================== - -To initialize the Javascript class manually in your controller -constructor, use the ``$this->load->library()`` method. Currently, -the only available library is jQuery, which will automatically be -loaded like this:: - - $this->load->library('javascript'); - -The Javascript class also accepts parameters: - -- js_library_driver (string) *default: 'jquery'* -- autoload (bool) *default: TRUE* - -You may override the defaults by sending an associative array:: - - $this->load->library( - 'javascript', - array( - 'js_library_driver' => 'scripto', - 'autoload' => FALSE - ) - ); - -Again, presently only 'jquery' is available. You may wish to set -autoload to FALSE, though, if you do not want the jQuery library to -automatically include a script tag for the main jQuery script file. This -is useful if you are loading it from a location outside of CodeIgniter, -or already have the script tag in your markup. - -Once loaded, the jQuery library object will be available using: - - $this->javascript - -Setup and Configuration -======================= - -Set these variables in your view --------------------------------- - -As a Javascript library, your files must be available to your -application. - -As Javascript is a client side language, the library must be able to -write content into your final output. This generally means a view. -You'll need to include the following variables in the ```` -sections of your output. - -:: - - - - - -``$library_src``, is where the actual library file will be loaded, as -well as any subsequent plugin script calls; $script_head is where -specific events, functions and other commands will be rendered. - -Set the path to the librarys with config items ----------------------------------------------- - -There are some configuration items in Javascript library. These can -either be set in *application/config.php*, within its own -*config/javascript.php* file, or within any controller usings the -``set_item()`` function. - -An image to be used as an "ajax loader", or progress indicator. Without -one, the simple text message of "loading" will appear when Ajax calls -need to be made. - -:: - - $config['javascript_location'] = 'http://localhost/codeigniter/themes/js/jquery/'; - $config['javascript_ajax_img'] = 'images/ajax-loader.gif'; - -If you keep your files in the same directories they were downloaded -from, then you need not set this configuration items. - -The jQuery Class -================ - -To initialize the jQuery class manually in your controller constructor, -use the ``$this->load->library()`` method:: - - $this->load->library('javascript/jquery'); - -You may send an optional parameter to determine whether or not a script -tag for the main jQuery file will be automatically included when loading -the library. It will be created by default. To prevent this, load the -library as follows:: - - $this->load->library('javascript/jquery', FALSE); - -Once loaded, the jQuery library object will be available using: - - $this->jquery - -jQuery Events -============= - -Events are set using the following syntax. -:: - - $this->jquery->event('element_path', code_to_run()); - -In the above example: - -- "event" is any of blur, change, click, dblclick, error, focus, hover, - keydown, keyup, load, mousedown, mouseup, mouseover, mouseup, resize, - scroll, or unload. -- "element_path" is any valid `jQuery selector - `_. Due to jQuery's unique - selector syntax, this is usually an element id, or CSS selector. For - example "#notice_area" would effect ``
    ``, and - "#content a.notice" would effect all anchors with a class of "notice" - in the div with id "content". -- "``code_to_run()``" is script your write yourself, or an action such as - an effect from the jQuery library below. - -Effects -======= - -The query library supports a powerful -`Effects `_ repertoire. Before an effect -can be used, it must be loaded:: - - $this->jquery->effect([optional path] plugin name); // for example $this->jquery->effect('bounce'); - - -hide() / show() ---------------- - -Each of this functions will affect the visibility of an item on your -page. hide() will set an item invisible, show() will reveal it. - -:: - - $this->jquery->hide(target, optional speed, optional extra information); - $this->jquery->show(target, optional speed, optional extra information); - - -- "target" will be any valid jQuery selector or selectors. -- "speed" is optional, and is set to either slow, normal, fast, or - alternatively a number of milliseconds. -- "extra information" is optional, and could include a callback, or - other additional information. - -toggle() --------- - -toggle() will change the visibility of an item to the opposite of its -current state, hiding visible elements, and revealing hidden ones. - -:: - - $this->jquery->toggle(target); - - -- "target" will be any valid jQuery selector or selectors. - -animate() ---------- - -:: - - $this->jquery->animate(target, parameters, optional speed, optional extra information); - - -- "target" will be any valid jQuery selector or selectors. -- "parameters" in jQuery would generally include a series of CSS - properties that you wish to change. -- "speed" is optional, and is set to either slow, normal, fast, or - alternatively a number of milliseconds. -- "extra information" is optional, and could include a callback, or - other additional information. - -For a full summary, see -`http://api.jquery.com/animate/ `_ - -Here is an example of an animate() called on a div with an id of "note", -and triggered by a click using the jQuery library's click() event. - -:: - - $params = array( - 'height' => 80, - 'width' => '50%', - 'marginLeft' => 125 - ); - $this->jquery->click('#trigger', $this->jquery->animate('#note', $params, 'normal')); - -fadeIn() / fadeOut() --------------------- - -:: - - $this->jquery->fadeIn(target, optional speed, optional extra information); - $this->jquery->fadeOut(target, optional speed, optional extra information); - - -- "target" will be any valid jQuery selector or selectors. -- "speed" is optional, and is set to either slow, normal, fast, or - alternatively a number of milliseconds. -- "extra information" is optional, and could include a callback, or - other additional information. - -toggleClass() -------------- - -This function will add or remove a CSS class to its target. - -:: - - $this->jquery->toggleClass(target, class) - - -- "target" will be any valid jQuery selector or selectors. -- "class" is any CSS classname. Note that this class must be defined - and available in a CSS that is already loaded. - -fadeIn() / fadeOut() --------------------- - -These effects cause an element(s) to disappear or reappear over time. - -:: - - $this->jquery->fadeIn(target, optional speed, optional extra information); - $this->jquery->fadeOut(target, optional speed, optional extra information); - - -- "target" will be any valid jQuery selector or selectors. -- "speed" is optional, and is set to either slow, normal, fast, or - alternatively a number of milliseconds. -- "extra information" is optional, and could include a callback, or - other additional information. - -slideUp() / slideDown() / slideToggle() ---------------------------------------- - -These effects cause an element(s) to slide. - -:: - - $this->jquery->slideUp(target, optional speed, optional extra information); - $this->jquery->slideDown(target, optional speed, optional extra information); - $this->jquery->slideToggle(target, optional speed, optional extra information); - - -- "target" will be any valid jQuery selector or selectors. -- "speed" is optional, and is set to either slow, normal, fast, or - alternatively a number of milliseconds. -- "extra information" is optional, and could include a callback, or - other additional information. - -Plugins -======= - -Some select jQuery plugins are made available using this library. - -corner() --------- - -Used to add distinct corners to page elements. For full details see -`http://malsup.com/jquery/corner/ `_ - -:: - - $this->jquery->corner(target, corner_style); - - -- "target" will be any valid jQuery selector or selectors. -- "corner_style" is optional, and can be set to any valid style such - as round, sharp, bevel, bite, dog, etc. Individual corners can be set - by following the style with a space and using "tl" (top left), "tr" - (top right), "bl" (bottom left), or "br" (bottom right). - -:: - - $this->jquery->corner("#note", "cool tl br"); - - -tablesorter() -------------- - -description to come - -modal() -------- - -description to come - -calendar() ----------- - -description to come \ No newline at end of file From 9b5a84dfb0c8a4ba078beb516373e7bb7d8d3ed7 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 15:45:41 +0200 Subject: [PATCH 4595/5397] Remove previously deprecated FV Library method/rule prep_for_form() --- system/libraries/Form_validation.php | 32 ------------------- .../libraries/Form_validation_test.php | 14 -------- user_guide_src/source/changelog.rst | 3 +- .../source/installation/upgrade_320.rst | 3 +- .../source/libraries/form_validation.rst | 1 - 5 files changed, 4 insertions(+), 49 deletions(-) diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index 384caf0005e..c2bc22f954d 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -1487,38 +1487,6 @@ public function valid_base64($str) // -------------------------------------------------------------------- - /** - * Prep data for form - * - * This function allows HTML to be safely shown in a form. - * Special characters are converted. - * - * @deprecated 3.0.6 Not used anywhere within the framework and pretty much useless - * @param mixed $data Input data - * @return mixed - */ - public function prep_for_form($data) - { - if ($this->_safe_form_data === FALSE OR empty($data)) - { - return $data; - } - - if (is_array($data)) - { - foreach ($data as $key => $val) - { - $data[$key] = $this->prep_for_form($val); - } - - return $data; - } - - return str_replace(array("'", '"', '<', '>'), array(''', '"', '<', '>'), stripslashes($data)); - } - - // -------------------------------------------------------------------- - /** * Prep URL * diff --git a/tests/codeigniter/libraries/Form_validation_test.php b/tests/codeigniter/libraries/Form_validation_test.php index 5f4bb931647..4be080f9042 100644 --- a/tests/codeigniter/libraries/Form_validation_test.php +++ b/tests/codeigniter/libraries/Form_validation_test.php @@ -579,20 +579,6 @@ public function test_regex_match() $this->assertFalse($this->form_validation->regex_match('bar', $regex)); } - public function test_prep_for_form() - { - $this->form_validation->reset_validation(); - $error_msg_unprepped = ''; - $error_msg_prepped = '<error ='foobar'">'; - $this->form_validation->set_rules('foo', 'label', 'required', array('required' => $error_msg_unprepped)); - $_POST = array('foo' => ''); - $this->form_validation->run(); - $error_arr = $this->form_validation->error_array(); - - $this->assertEquals('', $this->form_validation->prep_for_form('')); - $this->assertEquals(array('foo' => $error_msg_prepped), $this->form_validation->prep_for_form($error_arr)); - } - public function test_prep_url() { $this->assertEquals('', $this->form_validation->prep_url('')); diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f6d39cbfe10..a61ad164b68 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -13,6 +13,7 @@ Release Date: Not Released - Removed previously deprecated :doc:`Input Library ` method ``is_cli_request()`` (use :php:func:`is_cli()` instead). - Removed previously deprecated :doc:`Routing Class ` methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` (use the respective class properties instead). - Removed previously deprecated :doc:`Config Library ` method ``system_url()`` (encourages insecure practices). + - Removed previously deprecated :doc:`Form Validation Library ` method ``prep_for_form()`` / rule *prep_for_form*. - Removed previously deprecated :doc:`Date Helper ` function ``standard_date()`` (use PHP's native ``date()`` instead). - Removed previously deprecated :doc:`Security Helper ` function ``do_hash()`` (use PHP's native ``hash()`` instead). - Removed previously deprecated :doc:`HTML Helper ` functions ``br()`` and ``nbs()`` (use PHP's native ``str_repeat()`` with ``'
    '`` and ``' '`` respectively). @@ -2748,7 +2749,7 @@ Release Date: January 30, 2008 class. <./libraries/sessions>` - Removed 'last_visit' from the Session class. - Added a language entry for valid_ip validation error. - - Modified prep_for_form() in the Validation class to accept + - Modified ``prep_for_form()`` in the Validation class to accept arrays, adding support for POST array validation (via callbacks only) - Added an "integer" rule into the Validation library. diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 2bc4e53d309..4e4a73b674f 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -129,13 +129,14 @@ Step 7: Remove usage of previously deprecated functionalities ============================================================= The following is a list of functionalities deprecated in CodeIgniter -version 3.0.0, that have been removed in 3.2.0: +version 3.0.x, that have been removed in 3.2.0: - ``CI_Input::is_cli_request()`` (use :php:func:`is_cli()` instead) - ``CI_Router::fetch_directory()`` (use ``CI_Router::$directory instead) - ``CI_Router::fetch_class()`` (use ``CI_Router::$class`` instead) - ``CI_Router::fetch_method()`` (use ``CI_Router::$method`` instead) - ``CI_Config::system_url()`` (encourages insecure practices) +- ``CI_Form_validation::prep_for_form()`` (the *prep_for_form* rule) - ``standard_date()`` :doc:`Date Helper <../helpers/date_helper>` function (use ``date()`` instead) - ``do_hash()`` :doc:`Security Helper <../helpers/security_helper>` function (use ``hash()`` instead) diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst index b503b9be03f..915ce876f56 100644 --- a/user_guide_src/source/libraries/form_validation.rst +++ b/user_guide_src/source/libraries/form_validation.rst @@ -1009,7 +1009,6 @@ to use: ==================== ========= ============================================================================================================== Name Parameter Description ==================== ========= ============================================================================================================== -**prep_for_form** No DEPRECATED: Converts special characters so that HTML data can be shown in a form field without breaking it. **prep_url** No Adds "\http://" to URLs if missing. **strip_image_tags** No Strips the HTML from image tags leaving the raw URL. **encode_php_tags** No Converts PHP tags to entities. From bed5e97d94154088b601fac02a24fa784c6d19b5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 15:48:00 +0200 Subject: [PATCH 4596/5397] [ci skip] Mark a historical docs note as written by EllisLab --- user_guide_src/source/libraries/image_lib.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/image_lib.rst b/user_guide_src/source/libraries/image_lib.rst index b25d2512f1a..442541bf675 100644 --- a/user_guide_src/source/libraries/image_lib.rst +++ b/user_guide_src/source/libraries/image_lib.rst @@ -408,7 +408,7 @@ Class Reference method is not very useful unless you intend to build such an interface. That's exactly what we did using for the photo gallery module in ExpressionEngine, the CMS we develop. We added a JavaScript UI that - lets the cropping area be selected. + lets the cropping area be selected. (from EllisLab) .. php:method:: rotate() From 5d6e77b092ca8f1700a7407bf59bcab6b0e30808 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Thu, 1 Dec 2016 17:14:35 +0200 Subject: [PATCH 4597/5397] [ci skip] Fix #4928 --- system/core/CodeIgniter.php | 5 ++++- user_guide_src/source/changelog.rst | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 71656be2916..c9cb5c89fad 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -67,7 +67,10 @@ require_once(APPPATH.'config/'.ENVIRONMENT.'/constants.php'); } - require_once(APPPATH.'config/constants.php'); + if (file_exists(APPPATH.'config/constants.php')) + { + require_once(APPPATH.'config/constants.php'); + } /* * ------------------------------------------------------ diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4f5efe2767f..1ce3f071f84 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -25,6 +25,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4923) - :doc:`Session Library ` could execute an erroneous SQL query with the 'database' driver, if the lock attempt times out. - Fixed a bug (#4927) - :doc:`Output Library ` method ``get_header()`` returned the first matching header, regardless of whether it would be replaced by a second ``set_header()`` call. - Fixed a bug (#4844) - :doc:`Email Library ` didn't apply ``escapeshellarg()`` to the while passing the Sendmail ``-f`` parameter through ``popen()``. +- Fixed a bug (#4928) - the bootstrap file didn't check if *config/constants.php* exists before trying to load it. Version 3.1.2 ============= From 83424f9284815e816015a9e3f8326e410601c011 Mon Sep 17 00:00:00 2001 From: Ryan McAllen Date: Wed, 7 Dec 2016 18:22:31 -0500 Subject: [PATCH 4598/5397] Spelling: convinient -> convenient --- tests/mocks/autoloader.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/mocks/autoloader.php b/tests/mocks/autoloader.php index 33942768d83..11825de2c90 100644 --- a/tests/mocks/autoloader.php +++ b/tests/mocks/autoloader.php @@ -1,6 +1,6 @@ Date: Thu, 8 Dec 2016 12:21:40 +0200 Subject: [PATCH 4599/5397] Merge pull request #4932 from rhynodesigns/patch-1 [ci skip] Fix a comment typo in unit tests --- tests/mocks/autoloader.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/mocks/autoloader.php b/tests/mocks/autoloader.php index 33942768d83..11825de2c90 100644 --- a/tests/mocks/autoloader.php +++ b/tests/mocks/autoloader.php @@ -1,6 +1,6 @@ Date: Fri, 9 Dec 2016 12:48:57 +0200 Subject: [PATCH 4600/5397] [ci skip] Fix #4937 --- system/libraries/Image_lib.php | 19 ++++++------------- user_guide_src/source/changelog.rst | 1 + 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 06cdde0b890..39a30f0f5a2 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -544,35 +544,28 @@ public function initialize($props = array()) */ if ($this->new_image === '') { - $this->dest_image = $this->source_image; + $this->dest_image = $this->source_image; $this->dest_folder = $this->source_folder; } - elseif (strpos($this->new_image, '/') === FALSE) + elseif (strpos($this->new_image, '/') === FALSE && strpos($this->new_image, '\\') === FALSE) { + $this->dest_image = $this->new_image; $this->dest_folder = $this->source_folder; - $this->dest_image = $this->new_image; } else { - if (strpos($this->new_image, '/') === FALSE && strpos($this->new_image, '\\') === FALSE) - { - $full_dest_path = str_replace('\\', '/', realpath($this->new_image)); - } - else - { - $full_dest_path = $this->new_image; - } + $full_dest_path = str_replace('\\', '/', realpath($this->new_image)); // Is there a file name? if ( ! preg_match('#\.(jpg|jpeg|gif|png)$#i', $full_dest_path)) { + $this->dest_image = $this->source_image; $this->dest_folder = $full_dest_path.'/'; - $this->dest_image = $this->source_image; } else { $x = explode('/', $full_dest_path); - $this->dest_image = end($x); + $this->dest_image = end($x); $this->dest_folder = str_replace($this->dest_image, '', $full_dest_path); } } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1ce3f071f84..2509c82978b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -26,6 +26,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4927) - :doc:`Output Library ` method ``get_header()`` returned the first matching header, regardless of whether it would be replaced by a second ``set_header()`` call. - Fixed a bug (#4844) - :doc:`Email Library ` didn't apply ``escapeshellarg()`` to the while passing the Sendmail ``-f`` parameter through ``popen()``. - Fixed a bug (#4928) - the bootstrap file didn't check if *config/constants.php* exists before trying to load it. +- Fixed a bug (#4937) - :doc:`Image Manipulation Library ` method ``initialize()`` didn't translate *new_image* inputs to absolute paths. Version 3.1.2 ============= From 4827811fd1e26bf33ca396eaf273cb2b4190ff38 Mon Sep 17 00:00:00 2001 From: aquilax Date: Sat, 10 Dec 2016 08:15:12 +0100 Subject: [PATCH 4601/5397] `_random_keyword` must be array Signed-off-by: aquilax --- system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php index 62690139c5c..cb06c2a9d08 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php @@ -66,7 +66,7 @@ class CI_DB_pdo_sqlite_driver extends CI_DB_pdo_driver { * * @var array */ - protected $_random_keyword = ' RANDOM()'; + protected $_random_keyword = array('RANDOM()', 'RANDOM()'); // -------------------------------------------------------------------- From d478bef9d2154d5ec8bef9329a01d4a7ce37a544 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 12 Dec 2016 11:29:04 +0200 Subject: [PATCH 4602/5397] Merge pull request #4941 from aquilax/fix-pdo-sqlite-order_by-rand Fix order_by() random for pdo/sqlite driver --- system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php index 62690139c5c..cb06c2a9d08 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php @@ -66,7 +66,7 @@ class CI_DB_pdo_sqlite_driver extends CI_DB_pdo_driver { * * @var array */ - protected $_random_keyword = ' RANDOM()'; + protected $_random_keyword = array('RANDOM()', 'RANDOM()'); // -------------------------------------------------------------------- From 4f52ca95781580164ea429643eb252f0c2607f9f Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 12 Dec 2016 11:31:39 +0200 Subject: [PATCH 4603/5397] [ci skip] Add changelog entry for PR #4941 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 2509c82978b..b6d74c2d88e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -27,6 +27,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4844) - :doc:`Email Library ` didn't apply ``escapeshellarg()`` to the while passing the Sendmail ``-f`` parameter through ``popen()``. - Fixed a bug (#4928) - the bootstrap file didn't check if *config/constants.php* exists before trying to load it. - Fixed a bug (#4937) - :doc:`Image Manipulation Library ` method ``initialize()`` didn't translate *new_image* inputs to absolute paths. +- Fixed a bug (#4941) - :doc:`Query Builder ` method ``order_by()`` didn't work with 'RANDOM' under the 'pdo/sqlite' driver. Version 3.1.2 ============= From f2a613d67c23ba253f35a73d208e0dcaf6080b40 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 12 Dec 2016 11:39:38 +0200 Subject: [PATCH 4604/5397] Really fix #4937 --- system/libraries/Image_lib.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 39a30f0f5a2..475649c462f 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -554,20 +554,20 @@ public function initialize($props = array()) } else { - $full_dest_path = str_replace('\\', '/', realpath($this->new_image)); - // Is there a file name? - if ( ! preg_match('#\.(jpg|jpeg|gif|png)$#i', $full_dest_path)) + if ( ! preg_match('#\.(jpg|jpeg|gif|png)$#i', $this->new_image)) { $this->dest_image = $this->source_image; - $this->dest_folder = $full_dest_path.'/'; + $this->dest_folder = $this->new_image; } else { - $x = explode('/', $full_dest_path); + $x = explode('/', str_replace('\\', '/', $this->new_image)); $this->dest_image = end($x); - $this->dest_folder = str_replace($this->dest_image, '', $full_dest_path); + $this->dest_folder = str_replace($this->dest_image, '', $this->new_image); } + + $this->dest_folder = realpath($this->dest_folder).'/'; } /* Compile the finalized filenames/paths From 8338bbb3586e31432caa503b6530dcea583dd8d8 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 12 Dec 2016 14:17:52 +0200 Subject: [PATCH 4605/5397] Fix #4892 - update_batch() Regression caused by 0c23e9122666a30797079bea9415da135d4f7e12 trying to fix #4871 Supersedes #4929 --- system/database/DB_query_builder.php | 29 ++++++++---- system/database/drivers/pdo/pdo_driver.php | 46 ------------------- .../pdo/subdrivers/pdo_cubrid_driver.php | 41 ----------------- .../pdo/subdrivers/pdo_pgsql_driver.php | 8 ++-- .../drivers/postgre/postgre_driver.php | 8 ++-- user_guide_src/source/changelog.rst | 1 + 6 files changed, 28 insertions(+), 105 deletions(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 5a86ce50f41..b88ec956ac5 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -149,6 +149,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver { */ protected $qb_set = array(); + /** + * QB data set for update_batch() + * + * @var array + */ + protected $qb_set_ub = array(); + /** * QB aliased tables list * @@ -1886,7 +1893,7 @@ public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 1 if ($set === NULL) { - if (empty($this->qb_set)) + if (empty($this->qb_set_ub)) { return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; } @@ -1913,9 +1920,9 @@ public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 1 // Batch this baby $affected_rows = 0; - for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) + for ($i = 0, $total = count($this->qb_set_ub); $i < $total; $i += $batch_size) { - if ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, $batch_size), $index))) + if ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set_ub, $i, $batch_size), $index))) { $affected_rows += $this->affected_rows(); } @@ -1941,18 +1948,16 @@ public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 1 */ protected function _update_batch($table, $values, $index) { - $index_escaped = $this->protect_identifiers($index); - $ids = array(); foreach ($values as $key => $val) { - $ids[] = $val[$index]; + $ids[] = $val[$index]['value']; foreach (array_keys($val) as $field) { if ($field !== $index) { - $final[$field][] = 'WHEN '.$index_escaped.' = '.$val[$index].' THEN '.$val[$field]; + $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['field'].' = '.$val[$index]['value'].' THEN '.$val[$field]['value']; } } } @@ -1965,7 +1970,7 @@ protected function _update_batch($table, $values, $index) .'ELSE '.$k.' END, '; } - $this->where($index_escaped.' IN('.implode(',', $ids).')', NULL, FALSE); + $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); } @@ -2002,7 +2007,10 @@ public function set_update_batch($key, $index = '', $escape = NULL) $index_set = TRUE; } - $clean[$this->protect_identifiers($k2, FALSE, $escape)] = ($escape === FALSE) ? $v2 : $this->escape($v2); + $clean[$k2] = array( + 'field' => $this->protect_identifiers($k2, FALSE, $escape), + 'value' => ($escape === FALSE ? $v2 : $this->escape($v2)) + ); } if ($index_set === FALSE) @@ -2010,7 +2018,7 @@ public function set_update_batch($key, $index = '', $escape = NULL) return $this->display_error('db_batch_missing_index'); } - $this->qb_set[] = $clean; + $this->qb_set_ub[] = $clean; } return $this; @@ -2777,6 +2785,7 @@ protected function _reset_write() { $this->_reset_run(array( 'qb_set' => array(), + 'qb_set_ub' => array(), 'qb_from' => array(), 'qb_join' => array(), 'qb_where' => array(), diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index c27607e5527..2da9cf38f94 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -310,52 +310,6 @@ public function error() // -------------------------------------------------------------------- - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * @return string - */ - protected function _update_batch($table, $values, $index) - { - $ids = array(); - foreach ($values as $key => $val) - { - $ids[] = $val[$index]; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k.' = CASE '."\n"; - - foreach ($v as $row) - { - $cases .= $row."\n"; - } - - $cases .= 'ELSE '.$k.' END, '; - } - - $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); - - return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); - } - - // -------------------------------------------------------------------- - /** * Truncate statement * diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php index 8377798045a..4eb7f0ba67f 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php @@ -170,47 +170,6 @@ public function field_data($table) // -------------------------------------------------------------------- - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * @return string - */ - protected function _update_batch($table, $values, $index) - { - $ids = array(); - foreach ($values as $key => $val) - { - $ids[] = $val[$index]; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k." = CASE \n" - .implode("\n", $v)."\n" - .'ELSE '.$k.' END), '; - } - - $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); - - return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); - } - - // -------------------------------------------------------------------- - /** * Truncate statement * diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php index 9483d24571c..05b8350d1c2 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php @@ -326,13 +326,13 @@ protected function _update_batch($table, $values, $index) $ids = array(); foreach ($values as $key => $val) { - $ids[] = $val[$index]; + $ids[] = $val[$index]['value']; foreach (array_keys($val) as $field) { if ($field !== $index) { - $final[$field][] = 'WHEN '.$val[$index].' THEN '.$val[$field]; + $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value']; } } } @@ -340,12 +340,12 @@ protected function _update_batch($table, $values, $index) $cases = ''; foreach ($final as $k => $v) { - $cases .= $k.' = (CASE '.$index."\n" + $cases .= $k.' = (CASE '.$val[$index]['field']."\n" .implode("\n", $v)."\n" .'ELSE '.$k.' END), '; } - $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); + $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); } diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index dfd87f95ad6..51916fcc128 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -550,13 +550,13 @@ protected function _update_batch($table, $values, $index) $ids = array(); foreach ($values as $key => $val) { - $ids[] = $val[$index]; + $ids[] = $val[$index]['value']; foreach (array_keys($val) as $field) { if ($field !== $index) { - $final[$field][] = 'WHEN '.$val[$index].' THEN '.$val[$field]; + $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value']; } } } @@ -564,12 +564,12 @@ protected function _update_batch($table, $values, $index) $cases = ''; foreach ($final as $k => $v) { - $cases .= $k.' = (CASE '.$index."\n" + $cases .= $k.' = (CASE '.$val[$index]['field']."\n" .implode("\n", $v)."\n" .'ELSE '.$k.' END), '; } - $this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE); + $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b6d74c2d88e..93aabebda52 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -28,6 +28,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4928) - the bootstrap file didn't check if *config/constants.php* exists before trying to load it. - Fixed a bug (#4937) - :doc:`Image Manipulation Library ` method ``initialize()`` didn't translate *new_image* inputs to absolute paths. - Fixed a bug (#4941) - :doc:`Query Builder ` method ``order_by()`` didn't work with 'RANDOM' under the 'pdo/sqlite' driver. +- Fixed a regression (#4892) - :doc:`Query Builder ` method ``update_batch()`` didn't properly handle identifier escaping. Version 3.1.2 ============= From d2e4ccfe3bba903227c3686b9390d8b9525b197d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 12 Dec 2016 15:15:39 +0200 Subject: [PATCH 4606/5397] Remove previously deprecated Smiley Helper --- application/config/smileys.php | 64 ----- system/helpers/smiley_helper.php | 255 ------------------ user_guide_src/source/changelog.rst | 9 +- .../source/helpers/smiley_helper.rst | 169 ------------ user_guide_src/source/images/smile.gif | Bin 1156 -> 0 bytes .../source/installation/upgrade_300.rst | 12 +- .../source/installation/upgrade_320.rst | 4 +- 7 files changed, 14 insertions(+), 499 deletions(-) delete mode 100644 application/config/smileys.php delete mode 100644 system/helpers/smiley_helper.php delete mode 100644 user_guide_src/source/helpers/smiley_helper.rst delete mode 100644 user_guide_src/source/images/smile.gif diff --git a/application/config/smileys.php b/application/config/smileys.php deleted file mode 100644 index abf9a898dde..00000000000 --- a/application/config/smileys.php +++ /dev/null @@ -1,64 +0,0 @@ - array('grin.gif', '19', '19', 'grin'), - ':lol:' => array('lol.gif', '19', '19', 'LOL'), - ':cheese:' => array('cheese.gif', '19', '19', 'cheese'), - ':)' => array('smile.gif', '19', '19', 'smile'), - ';-)' => array('wink.gif', '19', '19', 'wink'), - ';)' => array('wink.gif', '19', '19', 'wink'), - ':smirk:' => array('smirk.gif', '19', '19', 'smirk'), - ':roll:' => array('rolleyes.gif', '19', '19', 'rolleyes'), - ':-S' => array('confused.gif', '19', '19', 'confused'), - ':wow:' => array('surprise.gif', '19', '19', 'surprised'), - ':bug:' => array('bigsurprise.gif', '19', '19', 'big surprise'), - ':-P' => array('tongue_laugh.gif', '19', '19', 'tongue laugh'), - '%-P' => array('tongue_rolleye.gif', '19', '19', 'tongue rolleye'), - ';-P' => array('tongue_wink.gif', '19', '19', 'tongue wink'), - ':P' => array('raspberry.gif', '19', '19', 'raspberry'), - ':blank:' => array('blank.gif', '19', '19', 'blank stare'), - ':long:' => array('longface.gif', '19', '19', 'long face'), - ':ohh:' => array('ohh.gif', '19', '19', 'ohh'), - ':grrr:' => array('grrr.gif', '19', '19', 'grrr'), - ':gulp:' => array('gulp.gif', '19', '19', 'gulp'), - '8-/' => array('ohoh.gif', '19', '19', 'oh oh'), - ':down:' => array('downer.gif', '19', '19', 'downer'), - ':red:' => array('embarrassed.gif', '19', '19', 'red face'), - ':sick:' => array('sick.gif', '19', '19', 'sick'), - ':shut:' => array('shuteye.gif', '19', '19', 'shut eye'), - ':-/' => array('hmm.gif', '19', '19', 'hmmm'), - '>:(' => array('mad.gif', '19', '19', 'mad'), - ':mad:' => array('mad.gif', '19', '19', 'mad'), - '>:-(' => array('angry.gif', '19', '19', 'angry'), - ':angry:' => array('angry.gif', '19', '19', 'angry'), - ':zip:' => array('zip.gif', '19', '19', 'zipper'), - ':kiss:' => array('kiss.gif', '19', '19', 'kiss'), - ':ahhh:' => array('shock.gif', '19', '19', 'shock'), - ':coolsmile:' => array('shade_smile.gif', '19', '19', 'cool smile'), - ':coolsmirk:' => array('shade_smirk.gif', '19', '19', 'cool smirk'), - ':coolgrin:' => array('shade_grin.gif', '19', '19', 'cool grin'), - ':coolhmm:' => array('shade_hmm.gif', '19', '19', 'cool hmm'), - ':coolmad:' => array('shade_mad.gif', '19', '19', 'cool mad'), - ':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'), - ':vampire:' => array('vampire.gif', '19', '19', 'vampire'), - ':snake:' => array('snake.gif', '19', '19', 'snake'), - ':exclaim:' => array('exclaim.gif', '19', '19', 'exclaim'), - ':question:' => array('question.gif', '19', '19', 'question') - -); diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php deleted file mode 100644 index 688ca24c21b..00000000000 --- a/system/helpers/smiley_helper.php +++ /dev/null @@ -1,255 +0,0 @@ -field_id pairs - * @param string field_id if alias name was passed in - * @param bool - * @return array - */ - 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 .= << $id) - { - $r .= 'smiley_map["'.$name.'"] = "'.$id."\";\n"; - } - } - - return ($inline) - ? '' - : $r; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('get_clickable_smileys')) -{ - /** - * Get Clickable Smileys - * - * Returns an array of image tag links that can be clicked to be inserted - * into a form field. - * - * @param string the URL to the folder containing the smiley images - * @param array - * @return array - */ - function get_clickable_smileys($image_url, $alias = '') - { - // For backward compatibility with js_insert_smiley - if (is_array($alias)) - { - $smileys = $alias; - } - elseif (FALSE === ($smileys = _get_smiley_array())) - { - return FALSE; - } - - // 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[] = '
    '.$smileys[$key][3].''; - $used[$smileys[$key][0]] = TRUE; - } - - return $link; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('parse_smileys')) -{ - /** - * Parse Smileys - * - * Takes a string as input and swaps any contained smileys for the actual image - * - * @param string the text to be parsed - * @param string the URL to the folder containing the smiley images - * @param array - * @return string - */ - function parse_smileys($str = '', $image_url = '', $smileys = NULL) - { - if ($image_url === '' OR ( ! is_array($smileys) && FALSE === ($smileys = _get_smiley_array()))) - { - return $str; - } - - // Add a trailing slash to the file path if needed - $image_url = rtrim($image_url, '/').'/'; - - foreach ($smileys as $key => $val) - { - $str = str_replace($key, ''.$smileys[$key][3].'', $str); - } - - return $str; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('_get_smiley_array')) -{ - /** - * Get Smiley Array - * - * Fetches the config/smiley.php file - * - * @return mixed - */ - function _get_smiley_array() - { - static $_smileys; - - if ( ! is_array($_smileys)) - { - if (file_exists(APPPATH.'config/smileys.php')) - { - include(APPPATH.'config/smileys.php'); - } - - if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/smileys.php')) - { - include(APPPATH.'config/'.ENVIRONMENT.'/smileys.php'); - } - - if (empty($smileys) OR ! is_array($smileys)) - { - $_smileys = array(); - return FALSE; - } - - $_smileys = $smileys; - } - - return $_smileys; - } -} diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a61ad164b68..4d0b4cf4dd3 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -21,6 +21,7 @@ Release Date: Not Released - Removed previously deprecated :doc:`File Helper ` function ``read_file()`` (use PHP's native ``file_get_contents()`` instead). - Removed previously deprecated :doc:`Form Helper ` function ``form_prep()`` (use :php:func:`html_escape()` instead). - Removed previously deprecated *Email Helper* (had only two functions, aliases for PHP's native ``filter_var()`` and ``mail()``). + - Removed previously deprecated *Smiley Helper*. - Removed previously deprecated *Javascript Library* (it was always experimental in the first place). - Libraries @@ -561,7 +562,7 @@ Release Date: March 30, 2015 - ``do_hash()`` now uses PHP's native ``hash()`` function (supporting more algorithms) and is deprecated. - :php:func:`strip_image_tags()` is now an alias for the same method in the :doc:`Security Library `. - - :doc:`Smiley Helper ` changes include: + - *Smiley Helper* changes include: - Deprecated the whole helper as too specific for CodeIgniter. - Removed previously deprecated function ``js_insert_smiley()``. @@ -1850,7 +1851,7 @@ Hg Tag: v2.0.0 string already has a scheme. - Modified get_file_info in the file helper, changing filectime() to filemtime() for dates. - - Modified smiley_js() to add optional third parameter to return + - Modified ``smiley_js()`` to add optional third parameter to return only the javascript with no script tags. - The img() function of the :doc:`HTML helper <./helpers/html_helper>` will now generate an empty @@ -2005,7 +2006,7 @@ Hg Tag: v1.7.2 - Modified directory_map() in the :doc:`Directory helper ` to allow the inclusion of hidden files, and to return FALSE on failure to read directory. - - Modified the :doc:`Smiley helper ` to work + - Modified the *Smiley helper* to work with multiple fields and insert the smiley at the last known cursor position. @@ -3112,7 +3113,7 @@ Release Date: October 30, 2006 - Added :doc:`$this->db->platform() <./database/helpers>` function - Added new :doc:`File Helper <./helpers/file_helper>`: get_filenames() -- Added new helper: :doc:`Smiley Helper <./helpers/smiley_helper>` +- Added new helper: *Smiley Helper* - Added support for
      and
        lists in the :doc:`HTML Helper <./helpers/html_helper>` - Added the ability to rewrite :doc:`short diff --git a/user_guide_src/source/helpers/smiley_helper.rst b/user_guide_src/source/helpers/smiley_helper.rst deleted file mode 100644 index 3e766994204..00000000000 --- a/user_guide_src/source/helpers/smiley_helper.rst +++ /dev/null @@ -1,169 +0,0 @@ -############# -Smiley Helper -############# - -The Smiley Helper file contains functions that let you manage smileys -(emoticons). - -.. important:: The Smiley helper is DEPRECATED and should not be used. - It is currently only kept for backwards compatibility. - -.. contents:: - :local: - -.. raw:: html - -
        - -Loading this Helper -=================== - -This helper is loaded using the following code:: - - $this->load->helper('smiley'); - -Overview -======== - -The Smiley helper has a renderer that takes plain text smileys, like -:-) and turns them into a image representation, like |smile!| - -It also lets you display a set of smiley images that when clicked will -be inserted into a form field. For example, if you have a blog that -allows user commenting you can show the smileys next to the comment -form. Your users can click a desired smiley and with the help of some -JavaScript it will be placed into the form field. - -Clickable Smileys Tutorial -========================== - -Here is an example demonstrating how you might create a set of clickable -smileys next to a form field. This example requires that you first -download and install the smiley images, then create a controller and the -View as described. - -.. important:: Before you begin, please `download the smiley images - `_ - and put them in a publicly accessible place on your server. - This helper also assumes you have the smiley replacement array - located at `application/config/smileys.php` - -The Controller --------------- - -In your **application/controllers/** directory, create a file called -Smileys.php and place the code below in it. - -.. important:: Change the URL in the :php:func:`get_clickable_smileys()` - function below so that it points to your smiley folder. - -You'll notice that in addition to the smiley helper, we are also using -the :doc:`Table Class <../libraries/table>`:: - - load->helper('smiley'); - $this->load->library('table'); - - $image_array = get_clickable_smileys('http://example.com/images/smileys/', 'comments'); - $col_array = $this->table->make_columns($image_array, 8); - - $data['smiley_table'] = $this->table->generate($col_array); - $this->load->view('smiley_view', $data); - } - - } - -In your **application/views/** directory, create a file called **smiley_view.php** -and place this code in it:: - - - - Smileys - - - -
        - -
        -

        Click to insert a smiley!

        - - When you have created the above controller and view, load it by visiting http://www.example.com/index.php/smileys/ - - - -Field Aliases -------------- - -When making changes to a view it can be inconvenient to have the field -id in the controller. To work around this, you can give your smiley -links a generic name that will be tied to a specific id in your view. - -:: - - $image_array = get_smiley_links("http://example.com/images/smileys/", "comment_textarea_alias"); - -To map the alias to the field id, pass them both into the -:func:`smiley_js()` function:: - - $image_array = smiley_js("comment_textarea_alias", "comments"); - -Available Functions -=================== - -.. php:function:: get_clickable_smileys($image_url[, $alias = ''[, $smileys = NULL]]) - - :param string $image_url: URL path to the smileys directory - :param string $alias: Field alias - :returns: An array of ready to use smileys - :rtype: array - - Returns an array containing your smiley images wrapped in a clickable - link. You must supply the URL to your smiley folder and a field id or - field alias. - - Example:: - - $image_array = get_clickable_smileys('http://example.com/images/smileys/', 'comment'); - -.. php:function:: smiley_js([$alias = ''[, $field_id = ''[, $inline = TRUE]]]) - - :param string $alias: Field alias - :param string $field_id: Field ID - :param bool $inline: Whether we're inserting an inline smiley - :returns: Smiley-enabling JavaScript code - :rtype: string - - Generates the JavaScript that allows the images to be clicked and - inserted into a form field. If you supplied an alias instead of an id - when generating your smiley links, you need to pass the alias and - corresponding form id into the function. This function is designed to be - placed into the area of your web page. - - Example:: - - - -.. php:function:: parse_smileys([$str = ''[, $image_url = ''[, $smileys = NULL]]]) - - :param string $str: Text containing smiley codes - :param string $image_url: URL path to the smileys directory - :param array $smileys: An array of smileys - :returns: Parsed smileys - :rtype: string - - Takes a string of text as input and replaces any contained plain text - smileys into the image equivalent. The first parameter must contain your - string, the second must contain the URL to your smiley folder - - Example:: - - $str = 'Here are some smileys: :-) ;-)'; - $str = parse_smileys($str, 'http://example.com/images/smileys/'); - echo $str; - -.. |smile!| image:: ../images/smile.gif \ No newline at end of file diff --git a/user_guide_src/source/images/smile.gif b/user_guide_src/source/images/smile.gif deleted file mode 100644 index bf0922504edcbda115512c88240d215c18241f15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1156 zcmd6m{WIGK0LH)d(hIj2M{HToZP$o2Z%6CK8Rn&4+Gy7*uB(gF3N^3Sp_62*i6N`z zw9%>}#@O82&aGH?Go4E7ZS-WQqgp~}5b{m(%~$h%O)UP4JUG^gR9fPm7G?Q|O?#7#mB6k?`K+?a)% zvk*fTYPg7k*@z(mxKy2V?GMzBVd8ea*2e$B+L#L5l|5cmDu2~ zY;dW4M?#oIxLHJ)B?u_8S*{S!75h#(34e>3%Lup}ha8cjCPykTa}@#0P?OC5rk31M z;Fg=@PP5(GYSo>@HWJazL|mVQZJfdMNpExxCS&>(Y%2xXNVXZz5{7e#{w%hYif^Y` zRt4Dhc>)yLp*$SShjhi5u^iURtcDsJe2awZNy}~2c#GWm$+FdI)gHHM`RM8iRCfYh zJBesNLv^RtXOm5wqbq!5i4QK7 z8kZ}K%W}i(KI3E{{5*7NFxWT~2CBp0x#)$_0=?#*UUT2PH35zXZjT2VCxW2K5Y6bt zh2g@@mo4k_ExNxM>jSLqr#$@=?s6Xo90{1~bKj|;J zd>4BH)(3*8J3bt|{ZXTYIo$T~q>`rj^{`UR7-|e?6#F$vn2jQ4llV}h?Sd{zuJ4TgZ-+FGxkH=!lSaadr?aY*3+us z{!4y6=jp#^G6u4Fs$BoU9RHpS?gIfMmF<3|5>wU+_ z?DoB_0ski*#9a0Pz!bpSE4B9tfU*m;yZNwKijIT^s`i6_6dCk@{C@Iy$%wjL=Ip$r z?d|-&ffwHO@NUw^>6oaT%ZuF=L$cZfoOr3~g3L1}C^+k9dXRj-+}kgrB{YbuRwYEF zi#gdmfa4XI8zk5-on_>R)rPBeoTfmaH&i?&y|&N;bXwDTtNg~^I-_<97mR4Xt3Kzv zdVg!keR>~_omhXfIxoh>%{$!H0|30+PS>aPg+$Y1Wp3}b#hn6^=qkVsj=SD^ zwDLevo@-%}r|(d3O~ygE`W>IhuPsr4Jo?^Nt#YA^!Y_VEN%^g!%P=it zKB1Jzxm7PL&*(Poj0d-lCZzCG9?#_gk1jY}tEBxg!)M+&+)H6LNt2$H)83wS=RTOV Nxce^#Q9XdL{{R50L}~y4 diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index f00a695123e..54f635cc07c 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -532,9 +532,9 @@ the ``EXT`` constant has been removed. Use just '.php' instead. Smiley helper ============= -The :doc:`Smiley Helper <../helpers/smiley_helper>` is a legacy feature from EllisLab's -ExpressionEngine product. However, it is too specific for a general purpose framework like -CodeIgniter and as such it is now deprecated. +The *Smiley Helper* is a legacy feature from EllisLab's ExpressionEngine product. +However, it is too specific for a general purpose framework like CodeIgniter +and as such it is now deprecated. Also, the previously deprecated ``js_insert_smiley()`` (since version 1.7.2) is now removed. @@ -559,9 +559,9 @@ implemented cryptographic functions. The Cart library ================ -The :doc:`Cart Library <../libraries/cart>`, similarly to the :doc:`Smiley Helper -<../helpers/smiley_helper>` is too specific for CodeIgniter. It is now deprecated -and scheduled for removal in CodeIgniter 3.1+. +The :doc:`Cart Library <../libraries/cart>`, similarly to the *Smiley Helper* +is too specific for CodeIgniter. It is now deprecated and scheduled for +removal in CodeIgniter 3.1+. .. note:: The library is still available, but you're strongly encouraged to remove its usage sooner rather than later. diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 4e4a73b674f..597e1ecf259 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -132,7 +132,7 @@ The following is a list of functionalities deprecated in CodeIgniter version 3.0.x, that have been removed in 3.2.0: - ``CI_Input::is_cli_request()`` (use :php:func:`is_cli()` instead) -- ``CI_Router::fetch_directory()`` (use ``CI_Router::$directory instead) +- ``CI_Router::fetch_directory()`` (use ``CI_Router::$directory`` instead) - ``CI_Router::fetch_class()`` (use ``CI_Router::$class`` instead) - ``CI_Router::fetch_method()`` (use ``CI_Router::$method`` instead) - ``CI_Config::system_url()`` (encourages insecure practices) @@ -153,3 +153,5 @@ version 3.0.x, that have been removed in 3.2.0: - ``valid_email()`` (use ``filter_var($email, FILTER_VALIDATE_EMAIL)`` instead) - ``send_email()`` (use ``mail()`` instead) + +- The entire *Smiley Helper* (an archived version is available on GitHub: `bcit-ci/ci3-smiley-helper `_) From 9be93ba78585e8256e25b3c4f43eed500d49d8e2 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Mon, 12 Dec 2016 15:27:13 +0200 Subject: [PATCH 4607/5397] Remove previously deprecated Cart Library --- system/libraries/Cart.php | 567 ------------------ tests/mocks/autoloader.php | 1 - user_guide_src/source/changelog.rst | 23 +- .../source/installation/upgrade_300.rst | 10 +- .../source/installation/upgrade_320.rst | 1 + user_guide_src/source/libraries/cart.rst | 398 ------------ 6 files changed, 17 insertions(+), 983 deletions(-) delete mode 100644 system/libraries/Cart.php delete mode 100644 user_guide_src/source/libraries/cart.rst diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php deleted file mode 100644 index 44d87e0bf66..00000000000 --- a/system/libraries/Cart.php +++ /dev/null @@ -1,567 +0,0 @@ -CI =& get_instance(); - - // Are any config settings being passed manually? If so, set them - $config = is_array($params) ? $params : array(); - - // Load the Sessions class - $this->CI->load->driver('session', $config); - - // Grab the shopping cart array from the session table - $this->_cart_contents = $this->CI->session->userdata('cart_contents'); - if ($this->_cart_contents === NULL) - { - // No cart exists so we'll set some base values - $this->_cart_contents = array('cart_total' => 0, 'total_items' => 0); - } - - log_message('info', 'Cart Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Insert items into the cart and save it to the session table - * - * @param array - * @return bool - */ - public function insert($items = array()) - { - // Was any cart data passed? No? Bah... - if ( ! is_array($items) OR count($items) === 0) - { - log_message('error', 'The insert method must be passed an array containing data.'); - return FALSE; - } - - // You can either insert a single product using a one-dimensional array, - // or multiple products using a multi-dimensional one. The way we - // determine the array type is by looking for a required array key named "id" - // at the top level. If it's not found, we will assume it's a multi-dimensional array. - - $save_cart = FALSE; - if (isset($items['id'])) - { - if (($rowid = $this->_insert($items))) - { - $save_cart = TRUE; - } - } - else - { - foreach ($items as $val) - { - if (is_array($val) && isset($val['id'])) - { - if ($this->_insert($val)) - { - $save_cart = TRUE; - } - } - } - } - - // Save the cart data if the insert was successful - if ($save_cart === TRUE) - { - $this->_save_cart(); - return isset($rowid) ? $rowid : TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Insert - * - * @param array - * @return bool - */ - protected function _insert($items = array()) - { - // Was any cart data passed? No? Bah... - if ( ! is_array($items) OR count($items) === 0) - { - log_message('error', 'The insert method must be passed an array containing data.'); - return FALSE; - } - - // -------------------------------------------------------------------- - - // Does the $items array contain an id, quantity, price, and name? These are required - if ( ! isset($items['id'], $items['qty'], $items['price'], $items['name'])) - { - log_message('error', 'The cart array must contain a product ID, quantity, price, and name.'); - return FALSE; - } - - // -------------------------------------------------------------------- - - // Prep the quantity. It can only be a number. Duh... also trim any leading zeros - $items['qty'] = (float) $items['qty']; - - // If the quantity is zero or blank there's nothing for us to do - if ($items['qty'] == 0) - { - return FALSE; - } - - // -------------------------------------------------------------------- - - // Validate the product ID. It can only be alpha-numeric, dashes, underscores or periods - // Not totally sure we should impose this rule, but it seems prudent to standardize IDs. - // Note: These can be user-specified by setting the $this->product_id_rules variable. - if ( ! preg_match('/^['.$this->product_id_rules.']+$/i', $items['id'])) - { - log_message('error', 'Invalid product ID. The product ID can only contain alpha-numeric characters, dashes, and underscores'); - return FALSE; - } - - // -------------------------------------------------------------------- - - // Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods. - // Note: These can be user-specified by setting the $this->product_name_rules variable. - if ($this->product_name_safe && ! preg_match('/^['.$this->product_name_rules.']+$/i'.(UTF8_ENABLED ? 'u' : ''), $items['name'])) - { - log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces'); - return FALSE; - } - - // -------------------------------------------------------------------- - - // Prep the price. Remove leading zeros and anything that isn't a number or decimal point. - $items['price'] = (float) $items['price']; - - // We now need to create a unique identifier for the item being inserted into the cart. - // Every time something is added to the cart it is stored in the master cart array. - // Each row in the cart array, however, must have a unique index that identifies not only - // a particular product, but makes it possible to store identical products with different options. - // For example, what if someone buys two identical t-shirts (same product ID), but in - // different sizes? The product ID (and other attributes, like the name) will be identical for - // both sizes because it's the same shirt. The only difference will be the size. - // Internally, we need to treat identical submissions, but with different options, as a unique product. - // Our solution is to convert the options array to a string and MD5 it along with the product ID. - // This becomes the unique "row ID" - if (isset($items['options']) && count($items['options']) > 0) - { - $rowid = md5($items['id'].serialize($items['options'])); - } - else - { - // No options were submitted so we simply MD5 the product ID. - // Technically, we don't need to MD5 the ID in this case, but it makes - // sense to standardize the format of array indexes for both conditions - $rowid = md5($items['id']); - } - - // -------------------------------------------------------------------- - - // Now that we have our unique "row ID", we'll add our cart items to the master array - // grab quantity if it's already there and add it on - $old_quantity = isset($this->_cart_contents[$rowid]['qty']) ? (int) $this->_cart_contents[$rowid]['qty'] : 0; - - // Re-create the entry, just to make sure our index contains only the data from this submission - $items['rowid'] = $rowid; - $items['qty'] += $old_quantity; - $this->_cart_contents[$rowid] = $items; - - return $rowid; - } - - // -------------------------------------------------------------------- - - /** - * Update the cart - * - * This function permits the quantity of a given item to be changed. - * Typically it is called from the "view cart" page if a user makes - * changes to the quantity before checkout. That array must contain the - * product ID and quantity for each item. - * - * @param array - * @return bool - */ - public function update($items = array()) - { - // Was any cart data passed? - if ( ! is_array($items) OR count($items) === 0) - { - return FALSE; - } - - // You can either update a single product using a one-dimensional array, - // or multiple products using a multi-dimensional one. The way we - // determine the array type is by looking for a required array key named "rowid". - // If it's not found we assume it's a multi-dimensional array - $save_cart = FALSE; - if (isset($items['rowid'])) - { - if ($this->_update($items) === TRUE) - { - $save_cart = TRUE; - } - } - else - { - foreach ($items as $val) - { - if (is_array($val) && isset($val['rowid'])) - { - if ($this->_update($val) === TRUE) - { - $save_cart = TRUE; - } - } - } - } - - // Save the cart data if the insert was successful - if ($save_cart === TRUE) - { - $this->_save_cart(); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Update the cart - * - * This function permits changing item properties. - * Typically it is called from the "view cart" page if a user makes - * changes to the quantity before checkout. That array must contain the - * rowid and quantity for each item. - * - * @param array - * @return bool - */ - protected function _update($items = array()) - { - // Without these array indexes there is nothing we can do - if ( ! isset($items['rowid'], $this->_cart_contents[$items['rowid']])) - { - return FALSE; - } - - // Prep the quantity - if (isset($items['qty'])) - { - $items['qty'] = (float) $items['qty']; - // Is the quantity zero? If so we will remove the item from the cart. - // If the quantity is greater than zero we are updating - if ($items['qty'] == 0) - { - unset($this->_cart_contents[$items['rowid']]); - return TRUE; - } - } - - // find updatable keys - $keys = array_intersect(array_keys($this->_cart_contents[$items['rowid']]), array_keys($items)); - // if a price was passed, make sure it contains valid data - if (isset($items['price'])) - { - $items['price'] = (float) $items['price']; - } - - // product id & name shouldn't be changed - foreach (array_diff($keys, array('id', 'name')) as $key) - { - $this->_cart_contents[$items['rowid']][$key] = $items[$key]; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Save the cart array to the session DB - * - * @return bool - */ - protected function _save_cart() - { - // Let's add up the individual prices and set the cart sub-total - $this->_cart_contents['total_items'] = $this->_cart_contents['cart_total'] = 0; - foreach ($this->_cart_contents as $key => $val) - { - // We make sure the array contains the proper indexes - if ( ! is_array($val) OR ! isset($val['price'], $val['qty'])) - { - continue; - } - - $this->_cart_contents['cart_total'] += ($val['price'] * $val['qty']); - $this->_cart_contents['total_items'] += $val['qty']; - $this->_cart_contents[$key]['subtotal'] = ($this->_cart_contents[$key]['price'] * $this->_cart_contents[$key]['qty']); - } - - // Is our cart empty? If so we delete it from the session - if (count($this->_cart_contents) <= 2) - { - $this->CI->session->unset_userdata('cart_contents'); - - // Nothing more to do... coffee time! - return FALSE; - } - - // If we made it this far it means that our cart has data. - // Let's pass it to the Session class so it can be stored - $this->CI->session->set_userdata(array('cart_contents' => $this->_cart_contents)); - - // Woot! - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Cart Total - * - * @return int - */ - public function total() - { - return $this->_cart_contents['cart_total']; - } - - // -------------------------------------------------------------------- - - /** - * Remove Item - * - * Removes an item from the cart - * - * @param int - * @return bool - */ - public function remove($rowid) - { - // unset & save - unset($this->_cart_contents[$rowid]); - $this->_save_cart(); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Total Items - * - * Returns the total item count - * - * @return int - */ - public function total_items() - { - return $this->_cart_contents['total_items']; - } - - // -------------------------------------------------------------------- - - /** - * Cart Contents - * - * Returns the entire cart array - * - * @param bool - * @return array - */ - public function contents($newest_first = FALSE) - { - // do we want the newest first? - $cart = ($newest_first) ? array_reverse($this->_cart_contents) : $this->_cart_contents; - - // Remove these so they don't create a problem when showing the cart table - unset($cart['total_items']); - unset($cart['cart_total']); - - return $cart; - } - - // -------------------------------------------------------------------- - - /** - * Get cart item - * - * Returns the details of a specific item in the cart - * - * @param string $row_id - * @return array - */ - public function get_item($row_id) - { - return (in_array($row_id, array('total_items', 'cart_total'), TRUE) OR ! isset($this->_cart_contents[$row_id])) - ? FALSE - : $this->_cart_contents[$row_id]; - } - - // -------------------------------------------------------------------- - - /** - * Has options - * - * Returns TRUE if the rowid passed to this function correlates to an item - * that has options associated with it. - * - * @param string $row_id = '' - * @return bool - */ - public function has_options($row_id = '') - { - return (isset($this->_cart_contents[$row_id]['options']) && count($this->_cart_contents[$row_id]['options']) !== 0); - } - - // -------------------------------------------------------------------- - - /** - * Product options - * - * Returns the an array of options, for a particular product row ID - * - * @param string $row_id = '' - * @return array - */ - public function product_options($row_id = '') - { - return isset($this->_cart_contents[$row_id]['options']) ? $this->_cart_contents[$row_id]['options'] : array(); - } - - // -------------------------------------------------------------------- - - /** - * Format Number - * - * Returns the supplied number with commas and a decimal point. - * - * @param float - * @return string - */ - public function format_number($n = '') - { - return ($n === '') ? '' : number_format( (float) $n, 2, '.', ','); - } - - // -------------------------------------------------------------------- - - /** - * Destroy the cart - * - * Empties the cart and kills the session - * - * @return void - */ - public function destroy() - { - $this->_cart_contents = array('cart_total' => 0, 'total_items' => 0); - $this->CI->session->unset_userdata('cart_contents'); - } - -} diff --git a/tests/mocks/autoloader.php b/tests/mocks/autoloader.php index 11825de2c90..a912327ca5a 100644 --- a/tests/mocks/autoloader.php +++ b/tests/mocks/autoloader.php @@ -33,7 +33,6 @@ function autoload($class) $ci_libraries = array( 'Calendar', - 'Cart', 'Driver_Library', 'Email', 'Encrypt', diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 4d0b4cf4dd3..6a0b827aeb0 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -22,6 +22,7 @@ Release Date: Not Released - Removed previously deprecated :doc:`Form Helper ` function ``form_prep()`` (use :php:func:`html_escape()` instead). - Removed previously deprecated *Email Helper* (had only two functions, aliases for PHP's native ``filter_var()`` and ``mail()``). - Removed previously deprecated *Smiley Helper*. + - Removed previously deprecated *Cart Library*. - Removed previously deprecated *Javascript Library* (it was always experimental in the first place). - Libraries @@ -773,7 +774,7 @@ Release Date: March 30, 2015 - Added support for templating via an array in addition to the encoded string. - Changed method ``get_total_days()`` to be an alias for :doc:`Date Helper ` :php:func:`days_in_month()`. - - :doc:`Cart Library ` changes include: + - *Cart Library* changes include: - Deprecated the library as too specific for CodeIgniter. - Added method ``remove()`` to remove a cart item, updating with quantity of 0 seemed like a hack but has remained to retain compatibility. @@ -1042,7 +1043,7 @@ Bug fixes for 3.0 - Fixed a bug where :doc:`Database Forge ` method ``create_table()`` with PostgreSQL database could lead to fetching the whole table. - Fixed a bug (#795) - :doc:`Form Helper ` :php:func:`form_open()` didn't add the default form *method* and *accept-charset* when an empty array is passed to it. - Fixed a bug (#797) - :doc:`Date Helper ` :php:func:`timespan()` was using incorrect seconds for year and month. -- Fixed a bug in :doc:`Cart Library ` method ``contents()`` where if called without a TRUE (or equal) parameter, it would fail due to a typo. +- Fixed a bug in *Cart Library* method ``contents()`` where if called without a TRUE (or equal) parameter, it would fail due to a typo. - Fixed a bug (#406) - SQLSRV DB driver not returning resource on ``db_pconnect()``. - Fixed a bug in :doc:`Image Manipulation Library ` method ``gd_loaded()`` where it was possible for the script execution to end or a PHP E_WARNING message to be emitted. - Fixed a bug in the :doc:`Pagination library ` where when use_page_numbers=TRUE previous link and page 1 link did not have the same url. @@ -1179,7 +1180,7 @@ Bug fixes for 3.0 - Fixed a bug (#2298) - :doc:`Database Results ` method ``next_row()`` kept returning the last row, allowing for infinite loops. - Fixed a bug (#2236, #2639) - :doc:`Form Helper ` functions :php:func:`set_value()`, :php:func:`set_select()`, :php:func:`set_radio()`, :php:func:`set_checkbox()` didn't parse array notation for keys if the rule was not present in the :doc:`Form Validation Library `. - Fixed a bug (#2353) - :doc:`Query Builder ` erroneously prefixed literal strings with **dbprefix**. -- Fixed a bug (#78) - :doc:`Cart Library ` didn't allow non-English letters in product names. +- Fixed a bug (#78) - *Cart Library* didn't allow non-English letters in product names. - Fixed a bug (#77) - :doc:`Database Class ` didn't properly handle the transaction "test mode" flag. - Fixed a bug (#2380) - :doc:`URI Routing ` method ``fetch_method()`` returned 'index' if the requested method name matches its controller name. - Fixed a bug (#2388) - :doc:`Email Library ` used to ignore attachment errors, resulting in broken emails being sent. @@ -1414,9 +1415,8 @@ Release Date: November 14, 2011 - Libraries - - Changed ``$this->cart->insert()`` in the :doc:`Cart - Library ` to return the Row ID if a single - item was inserted successfully. + - Changed ``$this->cart->insert()`` in the *Cart Library* + to return the Row ID if a single item was inserted successfully. - Added support to set an optional parameter in your callback rules of validation using the :doc:`Form Validation Library `. @@ -1524,9 +1524,8 @@ Release Date: August 20, 2011 string. See upgrade notes if using database sessions. - Added $this->db->set_dbprefix() to the :doc:`Database Driver `. - - Changed $this->cart->insert() in the :doc:`Cart - Library ` to return the Row ID if a single - item was inserted successfully. + - Changed ``$this->cart->insert()`` in the *Cart Library* + to return the Row ID if a single item was inserted successfully. - Added $this->load->get_var() to the :doc:`Loader library ` to retrieve global vars set with $this->load->view() and $this->load->vars(). @@ -1551,8 +1550,8 @@ Bug fixes for 2.0.3 properly escaped. - Fixed issue #199 - Attributes passed as string does not include a space between it and the opening tag. -- Fixed a bug where the method $this->cart->total_items() from :doc:`Cart - Library ` now returns the sum of the quantity +- Fixed a bug where the method ``$this->cart->total_items()`` from + *Cart Library* now returns the sum of the quantity of all items in the cart instead of your total count. - Fixed a bug where not setting 'null' when adding fields in db_forge for mysql and mysqli drivers would default to NULL instead of NOT @@ -1971,7 +1970,7 @@ Hg Tag: v1.7.2 - Libraries - - Added a new :doc:`Cart Class `. + - Added a new *Cart Class*. - Added the ability to pass $config['file_name'] for the :doc:`File Uploading Class ` and rename the uploaded file. diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst index 54f635cc07c..7b90826790a 100644 --- a/user_guide_src/source/installation/upgrade_300.rst +++ b/user_guide_src/source/installation/upgrade_300.rst @@ -559,12 +559,12 @@ implemented cryptographic functions. The Cart library ================ -The :doc:`Cart Library <../libraries/cart>`, similarly to the *Smiley Helper* -is too specific for CodeIgniter. It is now deprecated and scheduled for -removal in CodeIgniter 3.1+. +The *Cart Library*, similarly to the *Smiley Helper* is too specific for +CodeIgniter. It is now deprecated and scheduled for removal in +CodeIgniter 3.1+. -.. note:: The library is still available, but you're strongly encouraged to remove its usage sooner - rather than later. +.. note:: The library is still available, but you're strongly encouraged to + remove its usage sooner rather than later. Database drivers 'mysql', 'sqlite', 'mssql', 'pdo/dblib' ======================================================== diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 597e1ecf259..b587470f262 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -147,6 +147,7 @@ version 3.0.x, that have been removed in 3.2.0: - ``read_file()`` :doc:`File Helper <../helpers/file_helper>` function (use ``file_get_contents()`` instead) - ``form_prep()`` :doc:`Form Helper <../helpers/form_helper>` function (use :php:func:`html_escape()` instead) +- The entire *Cart Library* (an archived version is available on GitHub: `bcit-ci/ci3-cart-library `_) - The entire *Javascript Library* (it was always experimental in the first place) - The entire *Email Helper*, which only had two functions: diff --git a/user_guide_src/source/libraries/cart.rst b/user_guide_src/source/libraries/cart.rst deleted file mode 100644 index be343320db8..00000000000 --- a/user_guide_src/source/libraries/cart.rst +++ /dev/null @@ -1,398 +0,0 @@ -################### -Shopping Cart Class -################### - -The Cart Class permits items to be added to a session that stays active -while a user is browsing your site. These items can be retrieved and -displayed in a standard "shopping cart" format, allowing the user to -update the quantity or remove items from the cart. - -.. important:: The Cart library is DEPRECATED and should not be used. - It is currently only kept for backwards compatibility. - -Please note that the Cart Class ONLY provides the core "cart" -functionality. It does not provide shipping, credit card authorization, -or other processing components. - -.. contents:: - :local: - -.. raw:: html - -
        - -******************** -Using the Cart Class -******************** - -Initializing the Shopping Cart Class -==================================== - -.. important:: The Cart class utilizes CodeIgniter's :doc:`Session - Class ` to save the cart information to a database, so - before using the Cart class you must set up a database table as - indicated in the :doc:`Session Documentation `, and set the - session preferences in your application/config/config.php file to - utilize a database. - -To initialize the Shopping Cart Class in your controller constructor, -use the ``$this->load->library()`` method:: - - $this->load->library('cart'); - -Once loaded, the Cart object will be available using:: - - $this->cart - -.. note:: The Cart Class will load and initialize the Session Class - automatically, so unless you are using sessions elsewhere in your - application, you do not need to load the Session class. - -Adding an Item to The Cart -========================== - -To add an item to the shopping cart, simply pass an array with the -product information to the ``$this->cart->insert()`` method, as shown -below:: - - $data = array( - 'id' => 'sku_123ABC', - 'qty' => 1, - 'price' => 39.95, - 'name' => 'T-Shirt', - 'options' => array('Size' => 'L', 'Color' => 'Red') - ); - - $this->cart->insert($data); - -.. important:: The first four array indexes above (id, qty, price, and - name) are **required**. If you omit any of them the data will not be - saved to the cart. The fifth index (options) is optional. It is intended - to be used in cases where your product has options associated with it. - Use an array for options, as shown above. - -The five reserved indexes are: - -- **id** - Each product in your store must have a unique identifier. - Typically this will be an "sku" or other such identifier. -- **qty** - The quantity being purchased. -- **price** - The price of the item. -- **name** - The name of the item. -- **options** - Any additional attributes that are needed to identify - the product. These must be passed via an array. - -In addition to the five indexes above, there are two reserved words: -rowid and subtotal. These are used internally by the Cart class, so -please do NOT use those words as index names when inserting data into -the cart. - -Your array may contain additional data. Anything you include in your -array will be stored in the session. However, it is best to standardize -your data among all your products in order to make displaying the -information in a table easier. - -:: - - $data = array( - 'id' => 'sku_123ABC', - 'qty' => 1, - 'price' => 39.95, - 'name' => 'T-Shirt', - 'coupon' => 'XMAS-50OFF' - ); - - $this->cart->insert($data); - -The ``insert()`` method will return the $rowid if you successfully insert a -single item. - -Adding Multiple Items to The Cart -================================= - -By using a multi-dimensional array, as shown below, it is possible to -add multiple products to the cart in one action. This is useful in cases -where you wish to allow people to select from among several items on the -same page. - -:: - - $data = array( - array( - 'id' => 'sku_123ABC', - 'qty' => 1, - 'price' => 39.95, - 'name' => 'T-Shirt', - 'options' => array('Size' => 'L', 'Color' => 'Red') - ), - array( - 'id' => 'sku_567ZYX', - 'qty' => 1, - 'price' => 9.95, - 'name' => 'Coffee Mug' - ), - array( - 'id' => 'sku_965QRS', - 'qty' => 1, - 'price' => 29.95, - 'name' => 'Shot Glass' - ) - ); - - $this->cart->insert($data); - -Displaying the Cart -=================== - -To display the cart you will create a :doc:`view -file
        ` with code similar to the one shown below. - -Please note that this example uses the :doc:`form -helper
        `. - -:: - - - - - - - - - - - - - - - cart->contents() as $items): ?> - - - - - - - - - - - - - - - - - - - - -
        QTYItem DescriptionItem PriceSub-Total
        $i.'[qty]', 'value' => $items['qty'], 'maxlength' => '3', 'size' => '5')); ?> - - - cart->has_options($items['rowid']) == TRUE): ?> - -

        - cart->product_options($items['rowid']) as $option_name => $option_value): ?> - - :
        - - -

        - - - -
        cart->format_number($items['price']); ?>$cart->format_number($items['subtotal']); ?>
         Total$cart->format_number($this->cart->total()); ?>
        - -

        - -Updating The Cart -================= - -To update the information in your cart, you must pass an array -containing the Row ID and one or more pre-defined properties to the -``$this->cart->update()`` method. - -.. note:: If the quantity is set to zero, the item will be removed from - the cart. - -:: - - $data = array( - 'rowid' => 'b99ccdf16028f015540f341130b6d8ec', - 'qty' => 3 - ); - - $this->cart->update($data); - - // Or a multi-dimensional array - - $data = array( - array( - 'rowid' => 'b99ccdf16028f015540f341130b6d8ec', - 'qty' => 3 - ), - array( - 'rowid' => 'xw82g9q3r495893iajdh473990rikw23', - 'qty' => 4 - ), - array( - 'rowid' => 'fh4kdkkkaoe30njgoe92rkdkkobec333', - 'qty' => 2 - ) - ); - - $this->cart->update($data); - -You may also update any property you have previously defined when -inserting the item such as options, price or other custom fields. - -:: - - $data = array( - 'rowid' => 'b99ccdf16028f015540f341130b6d8ec', - 'qty' => 1, - 'price' => 49.95, - 'coupon' => NULL - ); - - $this->cart->update($data); - -What is a Row ID? -***************** - -The row ID is a unique identifier that is generated by the cart code -when an item is added to the cart. The reason a unique ID is created -is so that identical products with different options can be managed -by the cart. - -For example, let's say someone buys two identical t-shirts (same product -ID), but in different sizes. The product ID (and other attributes) will -be identical for both sizes because it's the same shirt. The only -difference will be the size. The cart must therefore have a means of -identifying this difference so that the two sizes of shirts can be -managed independently. It does so by creating a unique "row ID" based on -the product ID and any options associated with it. - -In nearly all cases, updating the cart will be something the user does -via the "view cart" page, so as a developer, it is unlikely that you -will ever have to concern yourself with the "row ID", other than making -sure your "view cart" page contains this information in a hidden form -field, and making sure it gets passed to the ``update()`` method when -the update form is submitted. Please examine the construction of the -"view cart" page above for more information. - - -*************** -Class Reference -*************** - -.. php:class:: CI_Cart - - .. attribute:: $product_id_rules = '\.a-z0-9_-' - - These are the regular expression rules that we use to validate the product - ID - alpha-numeric, dashes, underscores, or periods by default - - .. attribute:: $product_name_rules = '\w \-\.\:' - - These are the regular expression rules that we use to validate the product ID and product name - alpha-numeric, dashes, underscores, colons or periods by - default - - .. attribute:: $product_name_safe = TRUE - - Whether or not to only allow safe product names. Default TRUE. - - - .. php:method:: insert([$items = array()]) - - :param array $items: Items to insert into the cart - :returns: TRUE on success, FALSE on failure - :rtype: bool - - Insert items into the cart and save it to the session table. Returns TRUE - on success and FALSE on failure. - - - .. php:method:: update([$items = array()]) - - :param array $items: Items to update in the cart - :returns: TRUE on success, FALSE on failure - :rtype: bool - - This method permits changing the properties of a given item. - Typically it is called from the "view cart" page if a user makes changes - to the quantity before checkout. That array must contain the rowid - for each item. - - .. php:method:: remove($rowid) - - :param int $rowid: ID of the item to remove from the cart - :returns: TRUE on success, FALSE on failure - :rtype: bool - - Allows you to remove an item from the shopping cart by passing it the - ``$rowid``. - - .. php:method:: total() - - :returns: Total amount - :rtype: int - - Displays the total amount in the cart. - - - .. php:method:: total_items() - - :returns: Total amount of items in the cart - :rtype: int - - Displays the total number of items in the cart. - - - .. php:method:: contents([$newest_first = FALSE]) - - :param bool $newest_first: Whether to order the array with newest items first - :returns: An array of cart contents - :rtype: array - - Returns an array containing everything in the cart. You can sort the - order by which the array is returned by passing it TRUE where the contents - will be sorted from newest to oldest, otherwise it is sorted from oldest - to newest. - - .. php:method:: get_item($row_id) - - :param int $row_id: Row ID to retrieve - :returns: Array of item data - :rtype: array - - Returns an array containing data for the item matching the specified row - ID, or FALSE if no such item exists. - - .. php:method:: has_options($row_id = '') - - :param int $row_id: Row ID to inspect - :returns: TRUE if options exist, FALSE otherwise - :rtype: bool - - Returns TRUE (boolean) if a particular row in the cart contains options. - This method is designed to be used in a loop with ``contents()``, since - you must pass the rowid to this method, as shown in the Displaying - the Cart example above. - - .. php:method:: product_options([$row_id = '']) - - :param int $row_id: Row ID - :returns: Array of product options - :rtype: array - - Returns an array of options for a particular product. This method is - designed to be used in a loop with ``contents()``, since you - must pass the rowid to this method, as shown in the Displaying the - Cart example above. - - .. php:method:: destroy() - - :rtype: void - - Permits you to destroy the cart. This method will likely be called - when you are finished processing the customer's order. \ No newline at end of file From 56d1efc5b14d7bd5a92800ba9394bf9201d48b61 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 12:32:32 +0200 Subject: [PATCH 4608/5397] Move 'standardize_newlines' proc out of CI_Input::_clean_input_data() Preparation for CI_Input::_sanitize_globals() removal. Also, WTF?! I'm deprecating this functionality in 3.1.next. --- system/core/Input.php | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index 2e38e450182..ec57cd44819 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -66,15 +66,6 @@ class CI_Input { */ protected $_allow_get_array = TRUE; - /** - * Standardize new lines flag - * - * If set to TRUE, then newlines are standardized. - * - * @var bool - */ - protected $_standardize_newlines; - /** * Enable XSS flag * @@ -140,7 +131,6 @@ public function __construct() $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); - $this->_standardize_newlines = (bool) config_item('standardize_newlines'); $this->security =& load_class('Security', 'core'); @@ -159,6 +149,13 @@ public function __construct() $this->security->csrf_verify(); } + if ( ! empty($_POST) && config_item('standardize_newlines') === TRUE) + { + array_walk_recursive($_POST, function(&$value) { + $value = preg_replace('/(?:\r\n|[\r\n])/', PHP_EOL, $value); + }); + } + log_message('info', 'Input Class Initialized'); } @@ -595,7 +592,6 @@ public function user_agent($xss_clean = NULL) * * - Unsets $_GET data, if query strings are not enabled * - Cleans POST, COOKIE and SERVER data - * - Standardizes newline characters to PHP_EOL * * @return void */ @@ -698,12 +694,6 @@ protected function _clean_input_data($str) // Remove control characters $str = remove_invisible_characters($str, FALSE); - // Standardize newlines if needed - if ($this->_standardize_newlines === TRUE) - { - return preg_replace('/(?:\r\n|[\r\n])/', PHP_EOL, $str); - } - return $str; } From 25aab832ff5b064166b5af4f5c4269407c56b338 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 13:04:40 +0200 Subject: [PATCH 4609/5397] [ci skip] Deprecate 'allow_get_array', 'standardize_newlines' --- application/config/config.php | 22 ++++++++++++++----- user_guide_src/source/changelog.rst | 2 ++ .../source/installation/upgrade_313.rst | 14 ++++++++++++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/application/config/config.php b/application/config/config.php index 23ef5a528c7..10315220e04 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -168,9 +168,6 @@ | By default CodeIgniter uses search-engine friendly segment based URLs: | example.com/who/what/where/ | -| By default CodeIgniter enables access to the $_GET array. If for some -| reason you would like to disable it, set 'allow_get_array' to FALSE. -| | You can optionally enable standard query string based URLs: | example.com?who=me&what=something&where=here | @@ -185,12 +182,25 @@ | use segment based URLs. | */ -$config['allow_get_array'] = TRUE; $config['enable_query_strings'] = FALSE; $config['controller_trigger'] = 'c'; $config['function_trigger'] = 'm'; $config['directory_trigger'] = 'd'; +/* +|-------------------------------------------------------------------------- +| Allow $_GET array +|-------------------------------------------------------------------------- +| +| By default CodeIgniter enables access to the $_GET array. If for some +| reason you would like to disable it, set 'allow_get_array' to FALSE. +| +| WARNING: This feature is DEPRECATED and currently available only +| for backwards compatibility purposes! +| +*/ +$config['allow_get_array'] = TRUE; + /* |-------------------------------------------------------------------------- | Error Logging Threshold @@ -404,8 +414,8 @@ | Determines whether to standardize newline characters in input data, | meaning to replace \r\n, \r, \n occurrences with the PHP_EOL value. | -| This is particularly useful for portability between UNIX-based OSes, -| (usually \n) and Windows (\r\n). +| WARNING: This feature is DEPRECATED and currently available only +| for backwards compatibility purposes! | */ $config['standardize_newlines'] = FALSE; diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 93aabebda52..25a30144052 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -9,6 +9,8 @@ Release Date: Not Released - General Changes + - Deprecated ``$config['allow_get_array']``. + - Deprecated ``$config['standardize_newlines']``. - Deprecated :doc:`Date Helper ` function :php:func:`nice_date()`. Bug fixes for 3.1.3 diff --git a/user_guide_src/source/installation/upgrade_313.rst b/user_guide_src/source/installation/upgrade_313.rst index ebce7ab9b10..76dd159e685 100644 --- a/user_guide_src/source/installation/upgrade_313.rst +++ b/user_guide_src/source/installation/upgrade_313.rst @@ -30,3 +30,17 @@ CodeIgniter 3.2+. .. note:: The function is still available, but you're strongly encouraged to remove its usage sooner rather than later. + +Step 3: Remove usage of $config['standardize_newlines'] +======================================================= + +The :doc:`Input Library <../libraries/input>` would optionally replace +occurences of `\r\n`, `\r`, `\n` in input data with whatever the ``PHP_EOL`` +value is on your system - if you've set ``$config['standardize_newlines']`` +to ``TRUE`` in your *application/config/config.php*. + +This functionality is now deprecated and scheduled for removal in +CodeIgniter 3.2.+. + +.. note:: The functionality is still available, but you're strongly + encouraged to remove its usage sooner rather than later. From 6e2e9e937f9b973e677a8dacae45eccdadc306f0 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 13:05:48 +0200 Subject: [PATCH 4610/5397] [ci skip] Fix a changelog entry typo --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 25a30144052..d7977f4ce21 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -43,7 +43,7 @@ Release Date: Oct 28, 2016 - General Changes - - Allowed PHP 4-style constructors (``Mathching_name::Matching_name()`` methods) to be used as routes, if there's a ``__construct()`` to override them. + - Allowed PHP 4-style constructors (``Matching_name::Matching_name()`` methods) to be used as routes, if there's a ``__construct()`` to override them. Bug fixes for 3.1.2 ------------------- From aecb9ff2b3dfb6e66f1e229fa5f6b7f7275fcd40 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 13:05:48 +0200 Subject: [PATCH 4611/5397] [ci skip] Fix a changelog entry typo --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 6adb5073a71..7e2d4a9caac 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -107,7 +107,7 @@ Release Date: Oct 28, 2016 - General Changes - - Allowed PHP 4-style constructors (``Mathching_name::Matching_name()`` methods) to be used as routes, if there's a ``__construct()`` to override them. + - Allowed PHP 4-style constructors (``Matching_name::Matching_name()`` methods) to be used as routes, if there's a ``__construct()`` to override them. Bug fixes for 3.1.2 ------------------- From 8e37b8560c75d3994e59f401be977dcf386bb210 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 13:13:05 +0200 Subject: [PATCH 4612/5397] Remove 'allow_get_array', 'standardize_newlines' config settings --- application/config/config.php | 28 ------------------- system/core/Input.php | 23 +-------------- user_guide_src/source/changelog.rst | 2 ++ .../source/installation/upgrade_320.rst | 7 +++-- user_guide_src/source/libraries/input.rst | 4 --- 5 files changed, 8 insertions(+), 56 deletions(-) diff --git a/application/config/config.php b/application/config/config.php index c088e80c05e..535f0f817f2 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -191,20 +191,6 @@ $config['function_trigger'] = 'm'; $config['directory_trigger'] = 'd'; -/* -|-------------------------------------------------------------------------- -| Allow $_GET array -|-------------------------------------------------------------------------- -| -| By default CodeIgniter enables access to the $_GET array. If for some -| reason you would like to disable it, set 'allow_get_array' to FALSE. -| -| WARNING: This feature is DEPRECATED and currently available only -| for backwards compatibility purposes! -| -*/ -$config['allow_get_array'] = TRUE; - /* |-------------------------------------------------------------------------- | Error Logging Threshold @@ -410,20 +396,6 @@ $config['cookie_secure'] = FALSE; $config['cookie_httponly'] = FALSE; -/* -|-------------------------------------------------------------------------- -| Standardize newlines -|-------------------------------------------------------------------------- -| -| Determines whether to standardize newline characters in input data, -| meaning to replace \r\n, \r, \n occurrences with the PHP_EOL value. -| -| WARNING: This feature is DEPRECATED and currently available only -| for backwards compatibility purposes! -| -*/ -$config['standardize_newlines'] = FALSE; - /* |-------------------------------------------------------------------------- | Global XSS Filtering diff --git a/system/core/Input.php b/system/core/Input.php index ec57cd44819..a6be7b51796 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -57,15 +57,6 @@ class CI_Input { */ protected $ip_address = FALSE; - /** - * Allow GET array flag - * - * If set to FALSE, then $_GET will be set to an empty array. - * - * @var bool - */ - protected $_allow_get_array = TRUE; - /** * Enable XSS flag * @@ -128,7 +119,6 @@ class CI_Input { */ public function __construct() { - $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); @@ -149,13 +139,6 @@ public function __construct() $this->security->csrf_verify(); } - if ( ! empty($_POST) && config_item('standardize_newlines') === TRUE) - { - array_walk_recursive($_POST, function(&$value) { - $value = preg_replace('/(?:\r\n|[\r\n])/', PHP_EOL, $value); - }); - } - log_message('info', 'Input Class Initialized'); } @@ -598,11 +581,7 @@ public function user_agent($xss_clean = NULL) protected function _sanitize_globals() { // Is $_GET data allowed? If not we'll set the $_GET to an empty array - if ($this->_allow_get_array === FALSE) - { - $_GET = array(); - } - elseif (is_array($_GET)) + if (is_array($_GET)) { foreach ($_GET as $key => $val) { diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 7e2d4a9caac..a0f91a14853 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -10,6 +10,8 @@ Release Date: Not Released - Core - Changed :doc:`URI Library ` to ignore the ``$config['url_suffix']``, ``$config['permitted_uri_chars']`` configuration settings for CLI requests. + - Removed previously deprecated ``$config['allow_get_array']``. + - Removed previously deprecated ``$config['standardize_newlines']``. - Removed previously deprecated :doc:`Input Library ` method ``is_cli_request()`` (use :php:func:`is_cli()` instead). - Removed previously deprecated :doc:`Routing Class ` methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` (use the respective class properties instead). - Removed previously deprecated :doc:`Config Library ` method ``system_url()`` (encourages insecure practices). diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index b587470f262..6501f40db38 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -128,8 +128,11 @@ HTML 5 formatting. Step 7: Remove usage of previously deprecated functionalities ============================================================= -The following is a list of functionalities deprecated in CodeIgniter -version 3.0.x, that have been removed in 3.2.0: +The following is a list of functionalities deprecated in previous +CodeIgniter versions that have been removed in 3.2.0: + +- ``$config['allow_get_array']`` (use ``$_GET = array();`` instead) +- ``$config['standardize_newlines']`` - ``CI_Input::is_cli_request()`` (use :php:func:`is_cli()` instead) - ``CI_Router::fetch_directory()`` (use ``CI_Router::$directory`` instead) diff --git a/user_guide_src/source/libraries/input.rst b/user_guide_src/source/libraries/input.rst index 899070ef418..8b816a567e9 100644 --- a/user_guide_src/source/libraries/input.rst +++ b/user_guide_src/source/libraries/input.rst @@ -28,16 +28,12 @@ The security filtering method is called automatically when a new :doc:`controller <../general/controllers>` is invoked. It does the following: -- If ``$config['allow_get_array']`` is FALSE (default is TRUE), destroys - the global GET array. - Destroys all global variables in the event register_globals is turned on. - Filters the GET/POST/COOKIE array keys, permitting only alpha-numeric (and a few other) characters. - Provides XSS (Cross-site Scripting Hacks) filtering. This can be enabled globally, or upon request. -- Standardizes newline characters to ``PHP_EOL`` (\\n in UNIX-based OSes, - \\r\\n under Windows). This is configurable. XSS Filtering ============= From 4e0c208f24b0755c47905e17b82854c538a0c530 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 13:23:06 +0200 Subject: [PATCH 4613/5397] Remove 'global_xss_filtering' config setting --- application/config/config.php | 14 ------- system/core/Input.php | 32 +++++----------- system/helpers/cookie_helper.php | 3 +- user_guide_src/source/changelog.rst | 1 + .../source/helpers/cookie_helper.rst | 2 +- user_guide_src/source/libraries/input.rst | 37 ++++--------------- 6 files changed, 20 insertions(+), 69 deletions(-) diff --git a/application/config/config.php b/application/config/config.php index 535f0f817f2..d37af34b787 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -396,20 +396,6 @@ $config['cookie_secure'] = FALSE; $config['cookie_httponly'] = FALSE; -/* -|-------------------------------------------------------------------------- -| Global XSS Filtering -|-------------------------------------------------------------------------- -| -| Determines whether the XSS filter is always active when GET, POST or -| COOKIE data is encountered -| -| WARNING: This feature is DEPRECATED and currently available only -| for backwards compatibility purposes! -| -*/ -$config['global_xss_filtering'] = FALSE; - /* |-------------------------------------------------------------------------- | Cross Site Request Forgery diff --git a/system/core/Input.php b/system/core/Input.php index a6be7b51796..d4f79ee685e 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -57,17 +57,6 @@ class CI_Input { */ protected $ip_address = FALSE; - /** - * Enable XSS flag - * - * Determines whether the XSS filter is always active when - * GET, POST or COOKIE data is encountered. - * Set automatically based on config setting. - * - * @var bool - */ - protected $_enable_xss = FALSE; - /** * Enable CSRF flag * @@ -119,7 +108,6 @@ class CI_Input { */ public function __construct() { - $this->_enable_xss = (config_item('global_xss_filtering') === TRUE); $this->_enable_csrf = (config_item('csrf_protection') === TRUE); $this->security =& load_class('Security', 'core'); @@ -154,10 +142,8 @@ public function __construct() * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ - protected function _fetch_from_array(&$array, $index = NULL, $xss_clean = NULL) + protected function _fetch_from_array(&$array, $index = NULL, $xss_clean = FALSE) { - is_bool($xss_clean) OR $xss_clean = $this->_enable_xss; - // If $index is NULL, it means that the whole $array is requested isset($index) OR $index = array_keys($array); @@ -217,7 +203,7 @@ protected function _fetch_from_array(&$array, $index = NULL, $xss_clean = NULL) * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ - public function get($index = NULL, $xss_clean = NULL) + public function get($index = NULL, $xss_clean = FALSE) { return $this->_fetch_from_array($_GET, $index, $xss_clean); } @@ -231,7 +217,7 @@ public function get($index = NULL, $xss_clean = NULL) * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ - public function post($index = NULL, $xss_clean = NULL) + public function post($index = NULL, $xss_clean = FALSE) { return $this->_fetch_from_array($_POST, $index, $xss_clean); } @@ -245,7 +231,7 @@ public function post($index = NULL, $xss_clean = NULL) * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ - public function post_get($index, $xss_clean = NULL) + public function post_get($index, $xss_clean = FALSE) { return isset($_POST[$index]) ? $this->post($index, $xss_clean) @@ -261,7 +247,7 @@ public function post_get($index, $xss_clean = NULL) * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ - public function get_post($index, $xss_clean = NULL) + public function get_post($index, $xss_clean = FALSE) { return isset($_GET[$index]) ? $this->get($index, $xss_clean) @@ -277,7 +263,7 @@ public function get_post($index, $xss_clean = NULL) * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ - public function cookie($index = NULL, $xss_clean = NULL) + public function cookie($index = NULL, $xss_clean = FALSE) { return $this->_fetch_from_array($_COOKIE, $index, $xss_clean); } @@ -291,7 +277,7 @@ public function cookie($index = NULL, $xss_clean = NULL) * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ - public function server($index, $xss_clean = NULL) + public function server($index, $xss_clean = FALSE) { return $this->_fetch_from_array($_SERVER, $index, $xss_clean); } @@ -307,7 +293,7 @@ public function server($index, $xss_clean = NULL) * @param bool $xss_clean Whether to apply XSS filtering * @return mixed */ - public function input_stream($index = NULL, $xss_clean = NULL) + public function input_stream($index = NULL, $xss_clean = FALSE) { // Prior to PHP 5.6, the input stream can only be read once, // so we'll need to check if we have already done that first. @@ -561,7 +547,7 @@ public function valid_ip($ip, $which = '') * * @return string|null User Agent string or NULL if it doesn't exist */ - public function user_agent($xss_clean = NULL) + public function user_agent($xss_clean = FALSE) { return $this->_fetch_from_array($_SERVER, 'HTTP_USER_AGENT', $xss_clean); } diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php index ca432449571..f8943fde34d 100644 --- a/system/helpers/cookie_helper.php +++ b/system/helpers/cookie_helper.php @@ -85,9 +85,8 @@ function set_cookie($name, $value = '', $expire = '', $domain = '', $path = '/', * @param bool * @return mixed */ - function get_cookie($index, $xss_clean = NULL) + function get_cookie($index, $xss_clean = FALSE) { - is_bool($xss_clean) OR $xss_clean = (config_item('global_xss_filtering') === TRUE); $prefix = isset($_COOKIE[$index]) ? '' : config_item('cookie_prefix'); return get_instance()->input->cookie($prefix.$index, $xss_clean); } diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index a0f91a14853..1a1b0d5374d 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -12,6 +12,7 @@ Release Date: Not Released - Changed :doc:`URI Library ` to ignore the ``$config['url_suffix']``, ``$config['permitted_uri_chars']`` configuration settings for CLI requests. - Removed previously deprecated ``$config['allow_get_array']``. - Removed previously deprecated ``$config['standardize_newlines']``. + - Removed previously deprecated ``$config['global_xss_filtering']``. - Removed previously deprecated :doc:`Input Library ` method ``is_cli_request()`` (use :php:func:`is_cli()` instead). - Removed previously deprecated :doc:`Routing Class ` methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` (use the respective class properties instead). - Removed previously deprecated :doc:`Config Library ` method ``system_url()`` (encourages insecure practices). diff --git a/user_guide_src/source/helpers/cookie_helper.rst b/user_guide_src/source/helpers/cookie_helper.rst index c9d2f419c52..71e40a33c41 100644 --- a/user_guide_src/source/helpers/cookie_helper.rst +++ b/user_guide_src/source/helpers/cookie_helper.rst @@ -42,7 +42,7 @@ The following functions are available: a description of its use, as this function is an alias for ``CI_Input::set_cookie()``. -.. php:function:: get_cookie($index[, $xss_clean = NULL]) +.. php:function:: get_cookie($index[, $xss_clean = FALSE]) :param string $index: Cookie name :param bool $xss_clean: Whether to apply XSS filtering to the returned value diff --git a/user_guide_src/source/libraries/input.rst b/user_guide_src/source/libraries/input.rst index 8b816a567e9..1961e3e5725 100644 --- a/user_guide_src/source/libraries/input.rst +++ b/user_guide_src/source/libraries/input.rst @@ -32,26 +32,6 @@ following: turned on. - Filters the GET/POST/COOKIE array keys, permitting only alpha-numeric (and a few other) characters. -- Provides XSS (Cross-site Scripting Hacks) filtering. This can be - enabled globally, or upon request. - -XSS Filtering -============= - -The Input class has the ability to filter input automatically to prevent -cross-site scripting attacks. If you want the filter to run -automatically every time it encounters POST or COOKIE data you can -enable it by opening your *application/config/config.php* file and setting -this:: - - $config['global_xss_filtering'] = TRUE; - -Please refer to the :doc:`Security class ` documentation for -information on using XSS Filtering in your application. - -.. important:: The 'global_xss_filtering' setting is DEPRECATED and kept - solely for backwards-compatibility purposes. XSS escaping should - be performed on *output*, not *input*! ******************* Accessing form data @@ -126,7 +106,7 @@ Class Reference The property can be read multiple times. - .. php:method:: post([$index = NULL[, $xss_clean = NULL]]) + .. php:method:: post([$index = NULL[, $xss_clean = FALSE]]) :param mixed $index: POST parameter name :param bool $xss_clean: Whether to apply XSS filtering @@ -143,7 +123,6 @@ Class Reference The second optional parameter lets you run the data through the XSS filter. It's enabled by setting the second parameter to boolean TRUE - or by setting your ``$config['global_xss_filtering']`` to TRUE. :: $this->input->post('some_data', TRUE); @@ -169,7 +148,7 @@ Class Reference $this->input->post(array('field1', 'field2'), TRUE); - .. php:method:: get([$index = NULL[, $xss_clean = NULL]]) + .. php:method:: get([$index = NULL[, $xss_clean = FALSE]]) :param mixed $index: GET parameter name :param bool $xss_clean: Whether to apply XSS filtering @@ -202,7 +181,7 @@ Class Reference $this->input->get(array('field1', 'field2'), TRUE); - .. php:method:: post_get($index[, $xss_clean = NULL]) + .. php:method:: post_get($index[, $xss_clean = FALSE]) :param string $index: POST/GET parameter name :param bool $xss_clean: Whether to apply XSS filtering @@ -215,7 +194,7 @@ Class Reference $this->input->post_get('some_data', TRUE); - .. php:method:: get_post($index[, $xss_clean = NULL]) + .. php:method:: get_post($index[, $xss_clean = FALSE]) :param string $index: GET/POST parameter name :param bool $xss_clean: Whether to apply XSS filtering @@ -230,7 +209,7 @@ Class Reference .. note:: This method used to act EXACTLY like ``post_get()``, but it's behavior has changed in CodeIgniter 3.0. - .. php:method:: cookie([$index = NULL[, $xss_clean = NULL]]) + .. php:method:: cookie([$index = NULL[, $xss_clean = FALSE]]) :param mixed $index: COOKIE name :param bool $xss_clean: Whether to apply XSS filtering @@ -253,7 +232,7 @@ Class Reference function :php:func:`get_cookie()`, this method does NOT prepend your configured ``$config['cookie_prefix']`` value. - .. php:method:: server($index[, $xss_clean = NULL]) + .. php:method:: server($index[, $xss_clean = FALSE]) :param mixed $index: Value name :param bool $xss_clean: Whether to apply XSS filtering @@ -271,7 +250,7 @@ Class Reference $this->input->server(array('SERVER_PROTOCOL', 'REQUEST_URI')); - .. php:method:: input_stream([$index = NULL[, $xss_clean = NULL]]) + .. php:method:: input_stream([$index = NULL[, $xss_clean = FALSE]]) :param mixed $index: Key name :param bool $xss_clean: Whether to apply XSS filtering @@ -386,7 +365,7 @@ Class Reference Accepts an optional second string parameter of 'ipv4' or 'ipv6' to specify an IP format. The default checks for both formats. - .. php:method:: user_agent([$xss_clean = NULL]) + .. php:method:: user_agent([$xss_clean = FALSE]) :returns: User agent string or NULL if not set :param bool $xss_clean: Whether to apply XSS filtering From ff773c059cb984920767dd6187c30a77e5bf78c9 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 13:45:45 +0200 Subject: [PATCH 4614/5397] Finally drop CI_Input::_sanitize_globals() Close #4101 --- system/core/Input.php | 168 +----------------- tests/mocks/core/input.php | 19 +- .../source/installation/upgrade_320.rst | 18 ++ user_guide_src/source/libraries/input.rst | 28 +-- 4 files changed, 32 insertions(+), 201 deletions(-) diff --git a/system/core/Input.php b/system/core/Input.php index d4f79ee685e..aefc3b7d8a1 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -93,8 +93,15 @@ class CI_Input { */ protected $_input_stream; + /** + * CI_Security instance + * + * Used for the optional $xss_filter parameter that most + * getter methods have here. + * + * @var CI_Security + */ protected $security; - protected $uni; // -------------------------------------------------------------------- @@ -112,15 +119,6 @@ public function __construct() $this->security =& load_class('Security', 'core'); - // Do we need the UTF-8 class? - if (UTF8_ENABLED === TRUE) - { - $this->uni =& load_class('Utf8', 'core'); - } - - // Sanitize global arrays - $this->_sanitize_globals(); - // CSRF Protection check if ($this->_enable_csrf === TRUE && ! is_cli()) { @@ -554,156 +552,6 @@ public function user_agent($xss_clean = FALSE) // -------------------------------------------------------------------- - /** - * Sanitize Globals - * - * Internal method serving for the following purposes: - * - * - Unsets $_GET data, if query strings are not enabled - * - Cleans POST, COOKIE and SERVER data - * - * @return void - */ - protected function _sanitize_globals() - { - // Is $_GET data allowed? If not we'll set the $_GET to an empty array - if (is_array($_GET)) - { - foreach ($_GET as $key => $val) - { - $_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); - } - } - - // Clean $_POST Data - if (is_array($_POST)) - { - foreach ($_POST as $key => $val) - { - $_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); - } - } - - // Clean $_COOKIE Data - if (is_array($_COOKIE)) - { - // 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'], - $_COOKIE['$Path'], - $_COOKIE['$Domain'] - ); - - foreach ($_COOKIE as $key => $val) - { - if (($cookie_key = $this->_clean_input_keys($key)) !== FALSE) - { - $_COOKIE[$cookie_key] = $this->_clean_input_data($val); - } - else - { - unset($_COOKIE[$key]); - } - } - } - - // Sanitize PHP_SELF - $_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); - - log_message('info', 'Global POST, GET and COOKIE data sanitized'); - } - - // -------------------------------------------------------------------- - - /** - * Clean Input Data - * - * Internal method that aids in escaping data and - * standardizing newline characters to PHP_EOL. - * - * @param string|string[] $str Input string(s) - * @return string - */ - protected function _clean_input_data($str) - { - if (is_array($str)) - { - $new_array = array(); - foreach (array_keys($str) as $key) - { - $new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($str[$key]); - } - 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, FALSE); - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Clean Keys - * - * Internal method that helps 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. - * - * @param string $str Input string - * @param bool $fatal Whether to terminate script exection - * or to return FALSE if an invalid - * key is encountered - * @return string|bool - */ - protected function _clean_input_keys($str, $fatal = TRUE) - { - if ( ! preg_match('/^[a-z0-9:_\/|-]+$/i', $str)) - { - if ($fatal === TRUE) - { - return FALSE; - } - else - { - set_status_header(503); - echo 'Disallowed Key Characters.'; - exit(7); // EXIT_USER_INPUT - } - } - - // Clean UTF-8 if supported - if (UTF8_ENABLED === TRUE) - { - return $this->uni->clean_string($str); - } - - return $str; - } - - // -------------------------------------------------------------------- - /** * Request Headers * diff --git a/tests/mocks/core/input.php b/tests/mocks/core/input.php index 40e27441f47..4d217a252c8 100644 --- a/tests/mocks/core/input.php +++ b/tests/mocks/core/input.php @@ -11,16 +11,10 @@ class Mock_Core_Input extends CI_Input { */ public function __construct($security, $utf8) { - $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); // Assign Security and Utf8 classes $this->security = $security; - $this->uni = $utf8; - - // Sanitize global arrays - $this->_sanitize_globals(); } public function fetch_from_array($array, $index = '', $xss_clean = FALSE) @@ -28,16 +22,6 @@ public function fetch_from_array($array, $index = '', $xss_clean = FALSE) return parent::_fetch_from_array($array, $index, $xss_clean); } - /** - * Lie about being a CLI request - * - * We take advantage of this in libraries/Session_test - */ - public function is_cli_request() - { - return FALSE; - } - public function __set($name, $value) { if ($name === 'ip_address') @@ -45,5 +29,4 @@ public function __set($name, $value) $this->ip_address = $value; } } - -} \ No newline at end of file +} diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 6501f40db38..8434172e71b 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -159,3 +159,21 @@ CodeIgniter versions that have been removed in 3.2.0: - ``send_email()`` (use ``mail()`` instead) - The entire *Smiley Helper* (an archived version is available on GitHub: `bcit-ci/ci3-smiley-helper `_) + +Step 8: Make sure you're validating all user inputs +=================================================== + +The :doc:`Input Library <../libraries/input>` used to (often +unconditionally) filter and/or sanitize user input in the ``$_GET``, +``$_POST`` and ``$_COOKIE`` superglobals. + +This was a legacy feature from older times, when things like +`register_globals `_ and +`magic_quotes_gpc `_ existed in +PHP. +It was a necessity back then, but this is no longer the case and reliance +on global filters is a bad practice, giving you a false sense of security. + +This functionality is now removed, and so if you've relied on it for +whatever reasons, you should double-check that you are properly validating +all user inputs in your application (as you always should do). diff --git a/user_guide_src/source/libraries/input.rst b/user_guide_src/source/libraries/input.rst index 1961e3e5725..97460c2c527 100644 --- a/user_guide_src/source/libraries/input.rst +++ b/user_guide_src/source/libraries/input.rst @@ -2,10 +2,8 @@ Input Class ########### -The Input Class serves two purposes: - -#. It pre-processes global input data for security. -#. It provides some helper methods for fetching input data and pre-processing it. +The Input Class provides some helper methods for accessing input data +and pre-processing it. .. note:: This class is initialized automatically by the system so there is no need to do it manually. @@ -17,25 +15,9 @@ The Input Class serves two purposes:
        -*************** -Input Filtering -*************** - -Security Filtering -================== - -The security filtering method is called automatically when a new -:doc:`controller <../general/controllers>` is invoked. It does the -following: - -- Destroys all global variables in the event register_globals is - turned on. -- Filters the GET/POST/COOKIE array keys, permitting only alpha-numeric - (and a few other) characters. - -******************* -Accessing form data -******************* +******************** +Accessing input data +******************** Using POST, GET, COOKIE, or SERVER Data ======================================= From a299f56629c764afd8909c90ca3bb36625e84109 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 14:09:27 +0200 Subject: [PATCH 4615/5397] Remove dead parameter from form_upload() Close #3558 --- system/helpers/form_helper.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 9756437ae1b..496fc105579 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -244,11 +244,10 @@ function form_password($data = '', $value = '', $extra = '') * Identical to the input function but adds the "file" type * * @param mixed - * @param string * @param mixed * @return string */ - function form_upload($data = '', $value = '', $extra = '') + function form_upload($data = '', $extra = '') { $defaults = array('type' => 'file', 'name' => ''); is_array($data) OR $data = array('name' => $data); From af2edc36bf5e19aeda3f408a0a4019b63ed2d849 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 14:10:15 +0200 Subject: [PATCH 4616/5397] [ci skip] Update changelog; add an entry & upgrade instructions for last commit --- user_guide_src/source/changelog.rst | 52 ++++++++++++------- user_guide_src/source/helpers/form_helper.rst | 3 +- .../source/installation/upgrade_320.rst | 17 ++++++ 3 files changed, 52 insertions(+), 20 deletions(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1a1b0d5374d..b0b23987060 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -9,27 +9,21 @@ Release Date: Not Released - Core - - Changed :doc:`URI Library ` to ignore the ``$config['url_suffix']``, ``$config['permitted_uri_chars']`` configuration settings for CLI requests. - - Removed previously deprecated ``$config['allow_get_array']``. - - Removed previously deprecated ``$config['standardize_newlines']``. - Removed previously deprecated ``$config['global_xss_filtering']``. - - Removed previously deprecated :doc:`Input Library ` method ``is_cli_request()`` (use :php:func:`is_cli()` instead). - Removed previously deprecated :doc:`Routing Class ` methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` (use the respective class properties instead). - Removed previously deprecated :doc:`Config Library ` method ``system_url()`` (encourages insecure practices). - - Removed previously deprecated :doc:`Form Validation Library ` method ``prep_for_form()`` / rule *prep_for_form*. - - Removed previously deprecated :doc:`Date Helper ` function ``standard_date()`` (use PHP's native ``date()`` instead). - - Removed previously deprecated :doc:`Security Helper ` function ``do_hash()`` (use PHP's native ``hash()`` instead). - - Removed previously deprecated :doc:`HTML Helper ` functions ``br()`` and ``nbs()`` (use PHP's native ``str_repeat()`` with ``'
        '`` and ``' '`` respectively). - - Removed previously deprecated :doc:`String Helper ` functions ``trim_slashes()`` and ``repeater()`` (use PHP's native ``trim()`` with ``'/'`` and ``str_repeat()`` respectively). - - Removed previously deprecated :doc:`File Helper ` function ``read_file()`` (use PHP's native ``file_get_contents()`` instead). - - Removed previously deprecated :doc:`Form Helper ` function ``form_prep()`` (use :php:func:`html_escape()` instead). - - Removed previously deprecated *Email Helper* (had only two functions, aliases for PHP's native ``filter_var()`` and ``mail()``). - - Removed previously deprecated *Smiley Helper*. - - Removed previously deprecated *Cart Library*. - - Removed previously deprecated *Javascript Library* (it was always experimental in the first place). + - Changed :doc:`URI Library ` to ignore the ``$config['url_suffix']``, ``$config['permitted_uri_chars']`` configuration settings for CLI requests. + + - :doc:`Input Library ` changes include: + + - Removed previously deprecated ``$config['allow_get_array']``. + - Removed previously deprecated ``$config['standardize_newlines']``. + - Removed previously deprecated method ``is_cli_request()`` (use :php:func:`is_cli()` instead). - Libraries + - Removed previously deprecated *Cart Library*. + - Removed previously deprecated *Javascript Library* (it was always experimental in the first place). - Added UNIX socket connection support to :doc:`Session Library ` 'redis' driver. - :doc:`Cache Library ` changes include: @@ -42,6 +36,7 @@ Release Date: Not Released - :doc:`Form Validation Library ` changes include: + - Removed previously deprecated method ``prep_for_form()`` / rule *prep_for_form*. - Changed method ``set_rules()`` to throw a ``BadMethodCallException`` when its first parameter is not an array and the ``$rules`` one is unused. - :doc:`HTML Table Library ` changes include: @@ -52,7 +47,7 @@ Release Date: Not Released - Changed the default value of the **validate** option to ``TRUE``. -- :doc:`Database ` +- :doc:`Database ` changes include: - Changed method ``initialize()`` to return void and instead throw a ``RuntimeException`` in case of failure. - Changed method ``db_connect()`` to always set the connection character set (if supported by the driver) and to fail if it can't. @@ -64,10 +59,31 @@ Release Date: Not Released - Helpers + - Removed previously deprecated *Email Helper* (had only two functions, aliases for PHP's native ``filter_var()`` and ``mail()``). + - Removed previously deprecated *Smiley Helper*. + - Removed previously deprecated :doc:`Date Helper ` function ``standard_date()`` (use PHP's native ``date()`` instead). + - Removed previously deprecated :doc:`Security Helper ` function ``do_hash()`` (use PHP's native ``hash()`` instead). + - Removed previously deprecated :doc:`File Helper ` function ``read_file()`` (use PHP's native ``file_get_contents()`` instead). - Added new function :php:func:`ordinal_format()` to :doc:`Inflector Helper `. - Updated :doc:`Download Helper ` :php:func:`force_download()` to allow existing files to be renamed for download. - - Updated :doc:`HTML Helper ` function :php:func:`meta()` with support for "charset" and "property" properties. - - Changed :doc:`HTML Helper ` function :php:func:`doctype()` default document type to HTML 5. + + - :doc:`String Helper ` changes include: + + - Removed previously deprecated function ``trim_slashes()`` (use PHP's native ``trim()`` with ``'/'`` instead). + - Removed previously deprecated function ``repeater()`` (use PHP's native ``str_repeat()`` instead). + + - :doc:`HTML Helper ` changes include: + + - Removed previously deprecated function ``br()`` (use PHP's native ``str_repeat()`` with ``'
        '`` instead). + - Removed previously deprecated function ``nbs()`` (use PHP's native ``str_repeat()`` with ``' '`` instead). + - Updated function :php:func:`meta()` with support for "charset" and "property" properties. + - Changed function :php:func:`doctype()` default document type to HTML 5. + + - :doc:`Form Helper ` changes include: + + - Removed previously deprecated function ``form_prep()`` (use :php:func:`html_escape()` instead). + - Removed the second (out of three) parameter from the :php:func:`form_upload()` function (it was never used). + Version 3.1.3 ============= diff --git a/user_guide_src/source/helpers/form_helper.rst b/user_guide_src/source/helpers/form_helper.rst index cf52cd5239b..97595c90bc5 100644 --- a/user_guide_src/source/helpers/form_helper.rst +++ b/user_guide_src/source/helpers/form_helper.rst @@ -243,10 +243,9 @@ The following functions are available: function above except that it uses the "password" input type. -.. php:function:: form_upload([$data = ''[, $value = ''[, $extra = '']]]) +.. php:function:: form_upload([$data = '', $extra = '']]) :param array $data: Field attributes data - :param string $value: Field value :param mixed $extra: Extra attributes to be added to the tag either as an array or a literal string :returns: An HTML file upload input field tag :rtype: string diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 8434172e71b..0cf3110282c 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -125,6 +125,23 @@ relies on the default value, you should double-check it and either explicitly set the desired format, or adapt your front-end to use proper HTML 5 formatting. +Step 6: Check usage of form_upload() Form helper +================================================ + +The :doc:`Form Helper <../helpers/form_helper>` function +:php:func:`form_upload()` used to have 3 parameters, the second of which +(``$value``) was never used, as it doesn't make sense for an HTML ``input`` +tag of the "file" type. + +That dead parameter is now removed, and so if you've used the third one +(``$extra``), having code like this:: + + form_upload('name', 'irrelevant value', $extra); + +You should change it to:: + + form_upload('name', $extra); + Step 7: Remove usage of previously deprecated functionalities ============================================================= From 6bbd097269aa0e4ec5308ce506f840e5e214b298 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 14:57:11 +0200 Subject: [PATCH 4617/5397] Don't allow failures with PHP 7.1 on Travis-CI --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 334cb614fea..3d0691e5086 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,7 +30,6 @@ script: phpunit -d zend.enable_gc=0 -d date.timezone=UTC --coverage-text --confi matrix: allow_failures: - php: hhvm - - php: 7.1 exclude: - php: hhvm env: DB=pgsql From 88303fd3af7e1347fb2ceeb80a4a898980f98677 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 14:58:16 +0200 Subject: [PATCH 4618/5397] [ci skip] Require PHP 5.4.8 as the absolute minimum We stopped testing this branch on 5.3 long ago --- readme.rst | 2 +- user_guide_src/source/changelog.rst | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/readme.rst b/readme.rst index f5d73702892..a2537b3936f 100644 --- a/readme.rst +++ b/readme.rst @@ -31,7 +31,7 @@ Server Requirements PHP version 5.6 or newer is recommended. -It should work on 5.3.7 as well, but we strongly advise you NOT to run +It should work on 5.4.8 as well, but we strongly advise you NOT to run such old versions of PHP, because of potential security and performance issues, as well as missing features. diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index b0b23987060..84ed718cd8e 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -7,6 +7,10 @@ Version 3.2.0 Release Date: Not Released +- General Changes + + - Officially dropped any kind of support for anything under PHP 5.4.8. + - Core - Removed previously deprecated ``$config['global_xss_filtering']``. From 26313bddee1fb67af10141671a47bbe703a025fd Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 15:15:03 +0200 Subject: [PATCH 4619/5397] [ci skip] More doc changes related to PHP 5.4.8 requirement --- user_guide_src/source/contributing/index.rst | 6 ++-- .../source/general/common_functions.rst | 6 ++-- .../general/compatibility_functions.rst | 1 - .../source/general/requirements.rst | 4 +-- user_guide_src/source/general/styleguide.rst | 4 +-- .../source/installation/upgrade_320.rst | 29 +++++++++++++------ 6 files changed, 30 insertions(+), 20 deletions(-) diff --git a/user_guide_src/source/contributing/index.rst b/user_guide_src/source/contributing/index.rst index be776ec1fb6..e102b88487a 100644 --- a/user_guide_src/source/contributing/index.rst +++ b/user_guide_src/source/contributing/index.rst @@ -104,9 +104,9 @@ Compatibility ============= CodeIgniter recommends PHP 5.6 or newer to be used, but it should be -compatible with PHP 5.3.7 so all code supplied must stick to this -requirement. If PHP 5.4 (and above) functions or features are used then -there must be a fallback for PHP 5.3.7. +compatible with PHP 5.4.8 so all code supplied must stick to this +requirement. If PHP 5.5 (and above) functions or features are used then +there must be a fallback for PHP 5.4.8. Branching ========= diff --git a/user_guide_src/source/general/common_functions.rst b/user_guide_src/source/general/common_functions.rst index 6d6744cf733..602a6c7631f 100644 --- a/user_guide_src/source/general/common_functions.rst +++ b/user_guide_src/source/general/common_functions.rst @@ -24,9 +24,9 @@ loading any libraries or helpers. Example:: - if (is_php('5.3')) + if (is_php('5.5')) { - $str = quoted_printable_encode($str); + echo json_last_error_msg(); } Returns boolean TRUE if the installed version of PHP is equal to or @@ -185,4 +185,4 @@ loading any libraries or helpers. .. note:: This function was introduced because Suhosin terminated script execution, but this turned out to be a bug. A fix has been available for some time (version 0.9.34), but is - unfortunately not released yet. \ No newline at end of file + unfortunately not released yet. diff --git a/user_guide_src/source/general/compatibility_functions.rst b/user_guide_src/source/general/compatibility_functions.rst index 584968663a7..71559d0be0b 100644 --- a/user_guide_src/source/general/compatibility_functions.rst +++ b/user_guide_src/source/general/compatibility_functions.rst @@ -32,7 +32,6 @@ that is otherwise available only since PHP 5.5. Dependencies ============ -- PHP 5.3.7 - ``CRYPT_BLOWFISH`` support for ``crypt()`` Constants diff --git a/user_guide_src/source/general/requirements.rst b/user_guide_src/source/general/requirements.rst index f2729f3d50d..2e24d6d0386 100644 --- a/user_guide_src/source/general/requirements.rst +++ b/user_guide_src/source/general/requirements.rst @@ -4,7 +4,7 @@ Server Requirements `PHP `_ version 5.6 or newer is recommended. -It should work on 5.3.7 as well, but we strongly advise you NOT to run +It should work on 5.4.8 as well, but we strongly advise you NOT to run such old versions of PHP, because of potential security and performance issues, as well as missing features. @@ -18,4 +18,4 @@ Currently supported databases are: - SQLite via the *sqlite* (version 2), *sqlite3* (version 3) and *pdo* drivers - CUBRID via the *cubrid* and *pdo* drivers - Interbase/Firebird via the *ibase* and *pdo* drivers - - ODBC via the *odbc* and *pdo* drivers (you should know that ODBC is actually an abstraction layer) \ No newline at end of file + - ODBC via the *odbc* and *pdo* drivers (you should know that ODBC is actually an abstraction layer) diff --git a/user_guide_src/source/general/styleguide.rst b/user_guide_src/source/general/styleguide.rst index 9b4a84e1422..5f25a5ae41e 100644 --- a/user_guide_src/source/general/styleguide.rst +++ b/user_guide_src/source/general/styleguide.rst @@ -346,7 +346,7 @@ Compatibility ============= CodeIgniter recommends PHP 5.6 or newer to be used, but it should be -compatible with PHP 5.3.7. Your code must either be compatible with this +compatible with PHP 5.4.8. Your code must either be compatible with this requirement, provide a suitable fallback, or be an optional feature that dies quietly without affecting a user's application. @@ -633,4 +633,4 @@ Whenever appropriate, provide function argument defaults, which helps prevent PHP errors with mistaken calls and provides common fallback values which can save a few lines of code. Example:: - function foo($bar = '', $baz = FALSE) \ No newline at end of file + function foo($bar = '', $baz = FALSE) diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index 0cf3110282c..a2772e10ccd 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -13,7 +13,18 @@ Replace all files and directories in your *system/* directory. .. note:: If you have any custom developed files in these directories, please make copies of them first. -Step 2: Change database connection handling +Step 2: Check your PHP version +============================== + +We recommend always running versions that are `currently supported +`_, which right now is at least PHP 5.6. + +PHP 5.3.x versions are now officially not supported by CodeIgniter, and while 5.4.8+ +may be at least runnable, we strongly discourage you from using any PHP versions below +the ones listed on the `PHP.net Supported Versions `_ +page. + +Step 3: Change database connection handling =========================================== "Loading" a database, whether by using the *config/autoload.php* settings @@ -58,7 +69,7 @@ That doesn't make sense and that's the reason why most database drivers don't support it at all. Thus, ``db_set_charset()`` is no longer necessary and is removed. -Step 3: Check logic related to URI parsing of CLI requests +Step 4: Check logic related to URI parsing of CLI requests ========================================================== When running a CodeIgniter application from the CLI, the @@ -71,7 +82,7 @@ this change was made) and therefore you shouldn't be affected by this, but if you've relied on them for some reason, you'd probably have to make some changes to your code. -Step 4: Check Cache Library configurations for Redis, Memcache(d) +Step 5: Check Cache Library configurations for Redis, Memcache(d) ================================================================= The new improvements for the 'redis' and 'memcached' drivers of the @@ -98,7 +109,7 @@ value (previously, it just set the host to the default '127.0.0.1'). Therefore, if you've added a configuration that only sets e.g. a ``port``, you will now have to explicitly set the ``host`` to '127.0.0.1' as well. -Step 5: Check usage of the Email library +Step 6: Check usage of the Email library ======================================== The :doc:`Email Library <../libraries/email>` will now by default check the @@ -112,7 +123,7 @@ everything works fine. If something indeed goes wrong with that, please report it as a bug to us, and you can disable the **validate** option to revert to the old behavior. -Step 6: Check usage of doctype() HTML helper +Step 7: Check usage of doctype() HTML helper ============================================ The :doc:`HTML Helper <../helpers/html_helper>` function @@ -125,7 +136,7 @@ relies on the default value, you should double-check it and either explicitly set the desired format, or adapt your front-end to use proper HTML 5 formatting. -Step 6: Check usage of form_upload() Form helper +Step 8: Check usage of form_upload() Form helper ================================================ The :doc:`Form Helper <../helpers/form_helper>` function @@ -142,7 +153,7 @@ You should change it to:: form_upload('name', $extra); -Step 7: Remove usage of previously deprecated functionalities +Step 9: Remove usage of previously deprecated functionalities ============================================================= The following is a list of functionalities deprecated in previous @@ -177,8 +188,8 @@ CodeIgniter versions that have been removed in 3.2.0: - The entire *Smiley Helper* (an archived version is available on GitHub: `bcit-ci/ci3-smiley-helper `_) -Step 8: Make sure you're validating all user inputs -=================================================== +Step 10: Make sure you're validating all user inputs +==================================================== The :doc:`Input Library <../libraries/input>` used to (often unconditionally) filter and/or sanitize user input in the ``$_GET``, From 24c866628d0ce5463d7e8b4eba512fa9e7752dfd Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 16:14:13 +0200 Subject: [PATCH 4620/5397] Drop all PHP 5.3-related code --- application/config/config.php | 14 - application/config/database.php | 2 +- index.php | 9 +- system/core/CodeIgniter.php | 51 --- system/core/Common.php | 7 +- system/core/Loader.php | 15 +- system/core/Log.php | 3 - system/core/Output.php | 3 - system/core/Security.php | 32 +- system/core/compat/hash.php | 2 - system/core/compat/password.php | 2 +- system/core/compat/standard.php | 48 --- .../drivers/postgre/postgre_driver.php | 2 +- system/database/drivers/sqlite/index.html | 11 - .../database/drivers/sqlite/sqlite_driver.php | 330 ------------------ .../database/drivers/sqlite/sqlite_forge.php | 205 ----------- .../database/drivers/sqlite/sqlite_result.php | 164 --------- .../drivers/sqlite/sqlite_utility.php | 61 ---- system/libraries/Email.php | 36 +- system/libraries/Encryption.php | 7 +- system/libraries/Session/Session.php | 21 +- .../Session/SessionHandlerInterface.php | 59 ---- system/libraries/Upload.php | 2 +- system/libraries/Xmlrpc.php | 4 +- system/libraries/Zip.php | 3 - .../codeigniter/core/compat/standard_test.php | 32 -- user_guide_src/source/changelog.rst | 4 +- .../general/compatibility_functions.rst | 9 - .../source/general/requirements.rst | 2 +- .../source/installation/upgrade_320.rst | 3 + 30 files changed, 28 insertions(+), 1115 deletions(-) delete mode 100644 system/database/drivers/sqlite/index.html delete mode 100644 system/database/drivers/sqlite/sqlite_driver.php delete mode 100644 system/database/drivers/sqlite/sqlite_forge.php delete mode 100644 system/database/drivers/sqlite/sqlite_result.php delete mode 100644 system/database/drivers/sqlite/sqlite_utility.php delete mode 100644 system/libraries/Session/SessionHandlerInterface.php diff --git a/application/config/config.php b/application/config/config.php index d37af34b787..c6e1a7af5f6 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -452,20 +452,6 @@ */ $config['time_reference'] = 'local'; -/* -|-------------------------------------------------------------------------- -| Rewrite PHP Short Tags -|-------------------------------------------------------------------------- -| -| If your PHP installation does not have short tag support enabled CI -| can rewrite the tags on-the-fly, enabling you to utilize that syntax -| in your view files. Options are TRUE or FALSE (boolean) -| -| Note: You need to have eval() enabled for this to work. -| -*/ -$config['rewrite_short_tags'] = FALSE; - /* |-------------------------------------------------------------------------- | Reverse Proxy IPs diff --git a/application/config/database.php b/application/config/database.php index bf9857fffb5..b4d8a6a3ed6 100644 --- a/application/config/database.php +++ b/application/config/database.php @@ -22,7 +22,7 @@ | ['dbdriver'] The database driver. e.g.: mysqli. | Currently supported: | cubrid, ibase, mssql, mysql, mysqli, oci8, -| odbc, pdo, postgre, sqlite, sqlite3, sqlsrv +| odbc, pdo, postgre, sqlite3, sqlsrv | ['dbprefix'] You can add an optional prefix, which will be added | to the table name when using the Query Builder class | ['pconnect'] TRUE/FALSE - Whether to use a persistent connection diff --git a/index.php b/index.php index d02b6bb3899..8015672f322 100755 --- a/index.php +++ b/index.php @@ -73,14 +73,7 @@ case 'testing': case 'production': ini_set('display_errors', 0); - if (version_compare(PHP_VERSION, '5.3', '>=')) - { - error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED); - } - else - { - error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE); - } + error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED); break; default: diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 97cac90add9..dfc90af2a69 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -79,57 +79,6 @@ */ require_once(BASEPATH.'core/Common.php'); - -/* - * ------------------------------------------------------ - * Security procedures - * ------------------------------------------------------ - */ - -if ( ! is_php('5.4')) -{ - ini_set('magic_quotes_runtime', 0); - - if ((bool) ini_get('register_globals')) - { - $_protected = array( - '_SERVER', - '_GET', - '_POST', - '_FILES', - '_REQUEST', - '_SESSION', - '_ENV', - '_COOKIE', - 'GLOBALS', - 'HTTP_RAW_POST_DATA', - 'system_path', - 'application_folder', - 'view_folder', - '_protected', - '_registered' - ); - - $_registered = ini_get('variables_order'); - foreach (array('E' => '_ENV', 'G' => '_GET', 'P' => '_POST', 'C' => '_COOKIE', 'S' => '_SERVER') as $key => $superglobal) - { - if (strpos($_registered, $key) === FALSE) - { - continue; - } - - foreach (array_keys($$superglobal) as $var) - { - if (isset($GLOBALS[$var]) && ! in_array($var, $_protected, TRUE)) - { - $GLOBALS[$var] = NULL; - } - } - } - } -} - - /* * ------------------------------------------------------ * Define a custom error handler so we can log PHP errors diff --git a/system/core/Common.php b/system/core/Common.php index 91c585f7dcd..48eb233c2a4 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -81,8 +81,7 @@ function 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. + * the file, based on the read-only attribute. * * @link https://bugs.php.net/bug.php?id=54709 * @param string @@ -90,8 +89,8 @@ function is_php($version) */ function is_really_writable($file) { - // If we're on a Unix server with safe_mode off we call is_writable - if (DIRECTORY_SEPARATOR === '/' && (is_php('5.4') OR ! ini_get('safe_mode'))) + // If we're on a UNIX-like server, just is_writable() + if (DIRECTORY_SEPARATOR === '/') { return is_writable($file); } diff --git a/system/core/Loader.php b/system/core/Loader.php index 1111481b776..b52296499de 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -954,7 +954,7 @@ protected function _ci_load($_ci_data) } extract($this->_ci_cached_vars); - /* + /** * Buffer the output * * We buffer the output for two reasons: @@ -967,18 +967,7 @@ protected function _ci_load($_ci_data) */ ob_start(); - // If the PHP installation does not support short tags we'll - // do a little string replacement, changing the short tags - // to standard PHP echo statements. - if ( ! is_php('5.4') && ! ini_get('short_open_tag') && config_item('rewrite_short_tags') === TRUE) - { - echo eval('?>'.preg_replace('/;*\s*\?>/', '; ?>', str_replace('= 0 ? self::strlen($str) - $start : -$start); return mb_substr($str, $start, $length, '8bit'); } diff --git a/system/core/Output.php b/system/core/Output.php index 94a6340e7dc..febccdaefb8 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -836,9 +836,6 @@ protected static function substr($str, $start, $length = NULL) { if (self::$func_override) { - // mb_substr($str, $start, null, '8bit') returns an empty - // string on PHP 5.3 - isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); return mb_substr($str, $start, $length, '8bit'); } diff --git a/system/core/Security.php b/system/core/Security.php index d0308c5f95b..a80b52fd1c4 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -626,7 +626,7 @@ public function get_random_bytes($length) if (is_readable('/dev/urandom') && ($fp = fopen('/dev/urandom', 'rb')) !== FALSE) { // Try not to waste entropy ... - is_php('5.4') && stream_set_chunk_size($fp, $length); + stream_set_chunk_size($fp, $length); $output = fread($fp, $length); fclose($fp); if ($output !== FALSE) @@ -671,26 +671,8 @@ public function entity_decode($str, $charset = NULL) static $_entities; - isset($charset) OR $charset = $this->charset; - $flag = is_php('5.4') - ? ENT_COMPAT | ENT_HTML5 - : ENT_COMPAT; - - if ( ! isset($_entities)) - { - $_entities = array_map('strtolower', get_html_translation_table(HTML_ENTITIES, $flag, $charset)); - - // If we're not on PHP 5.4+, add the possibly dangerous HTML 5 - // entities to the array manually - if ($flag === ENT_COMPAT) - { - $_entities[':'] = ':'; - $_entities['('] = '('; - $_entities[')'] = ')'; - $_entities["\n"] = ' '; - $_entities["\t"] = ' '; - } - } + isset($charset) OR $charset = $this->charset; + isset($_entities) OR $_entities = array_map('strtolower', get_html_translation_table(HTML_ENTITIES, ENT_COMPAT | ENT_HTML5, $charset)); do { @@ -715,14 +697,9 @@ public function entity_decode($str, $charset = NULL) // Decode numeric & UTF16 two byte entities $str = html_entity_decode( preg_replace('/(&#(?:x0*[0-9a-f]{2,5}(?![0-9a-f;])|(?:0*\d{2,4}(?![0-9;]))))/iS', '$1;', $str), - $flag, + ENT_COMPAT | ENT_HTML5, $charset ); - - if ($flag === ENT_COMPAT) - { - $str = str_replace(array_values($_entities), array_keys($_entities), $str); - } } while ($str_compare !== $str); return $str; @@ -1074,5 +1051,4 @@ protected function _csrf_set_hash() return $this->_csrf_hash; } - } diff --git a/system/core/compat/hash.php b/system/core/compat/hash.php index d567d0f80e3..5fec4cc6748 100644 --- a/system/core/compat/hash.php +++ b/system/core/compat/hash.php @@ -203,8 +203,6 @@ function hash_pbkdf2($algo, $password, $salt, $iterations, $length = 0, $raw_out 'ripemd160' => 64, 'ripemd256' => 64, 'ripemd320' => 64, - 'salsa10' => 64, - 'salsa20' => 64, 'sha1' => 64, 'sha224' => 64, 'sha256' => 64, diff --git a/system/core/compat/password.php b/system/core/compat/password.php index 1b5219e7b1d..e5842255704 100644 --- a/system/core/compat/password.php +++ b/system/core/compat/password.php @@ -141,7 +141,7 @@ function password_hash($password, $algo, array $options = array()) } // Try not to waste entropy ... - is_php('5.4') && stream_set_chunk_size($fp, 16); + stream_set_chunk_size($fp, 16); $options['salt'] = ''; for ($read = 0; $read < 16; $read = ($func_override) ? mb_strlen($options['salt'], '8bit') : strlen($options['salt'])) diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php index 6b7caa48524..ca5046e56c0 100644 --- a/system/core/compat/standard.php +++ b/system/core/compat/standard.php @@ -132,51 +132,3 @@ function array_column(array $array, $column_key, $index_key = NULL) return $result; } } - -// ------------------------------------------------------------------------ - -if (is_php('5.4')) -{ - return; -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('hex2bin')) -{ - /** - * hex2bin() - * - * @link http://php.net/hex2bin - * @param string $data - * @return string - */ - function hex2bin($data) - { - if (in_array($type = gettype($data), array('array', 'double', 'object', 'resource'), TRUE)) - { - if ($type === 'object' && method_exists($data, '__toString')) - { - $data = (string) $data; - } - else - { - trigger_error('hex2bin() expects parameter 1 to be string, '.$type.' given', E_USER_WARNING); - return NULL; - } - } - - if (strlen($data) % 2 !== 0) - { - trigger_error('Hexadecimal input string must have an even length', E_USER_WARNING); - return FALSE; - } - elseif ( ! preg_match('/^[0-9a-f]*$/i', $data)) - { - trigger_error('Input string must be hexadecimal string', E_USER_WARNING); - return FALSE; - } - - return pack('H*', $data); - } -} diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 5cc6a421cdd..9f794a12ef0 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -315,7 +315,7 @@ protected function _escape_str($str) */ public function escape($str) { - if (is_php('5.4.4') && (is_string($str) OR (is_object($str) && method_exists($str, '__toString')))) + if (is_string($str) OR (is_object($str) && method_exists($str, '__toString'))) { return pg_escape_literal($this->conn_id, $str); } diff --git a/system/database/drivers/sqlite/index.html b/system/database/drivers/sqlite/index.html deleted file mode 100644 index b702fbc3967..00000000000 --- a/system/database/drivers/sqlite/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

        Directory access is forbidden.

        - - - diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php deleted file mode 100644 index 16b8c29c369..00000000000 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ /dev/null @@ -1,330 +0,0 @@ -database, 0666, $error) - : sqlite_open($this->database, 0666, $error); - - isset($error) && log_message('error', $error); - - return $conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - return isset($this->data_cache['version']) - ? $this->data_cache['version'] - : $this->data_cache['version'] = sqlite_libversion(); - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - return $this->is_write_type($sql) - ? sqlite_exec($this->conn_id, $sql) - : sqlite_query($this->conn_id, $sql); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return $this->simple_query('BEGIN TRANSACTION'); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return $this->simple_query('COMMIT'); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return $this->simple_query('ROLLBACK'); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependant string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return sqlite_escape_string($str); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return sqlite_changes($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - return sqlite_last_insert_rowid($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = "SELECT name FROM sqlite_master WHERE type='table'"; - - if ($prefix_limit !== FALSE && $this->dbprefix != '') - { - return $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 - * - * @param string $table - * @return bool - */ - protected function _list_columns($table = '') - { - // Not supported - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) - { - return FALSE; - } - - $query = $query->result_array(); - if (empty($query)) - { - return FALSE; - } - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]['name']; - $retval[$i]->type = $query[$i]['type']; - $retval[$i]->max_length = NULL; - $retval[$i]->default = $query[$i]['dflt_value']; - $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occured. - * - * @return array - */ - public function error() - { - $error = array('code' => sqlite_last_error($this->conn_id)); - $error['message'] = sqlite_error_string($error['code']); - return $error; - } - - // -------------------------------------------------------------------- - - /** - * Replace statement - * - * Generates a platform-specific replace string from the supplied data - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _replace($table, $keys, $values) - { - return 'INSERT OR '.parent::_replace($table, $keys, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this function maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - sqlite_close($this->conn_id); - } - -} diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php deleted file mode 100644 index 3ad3477e478..00000000000 --- a/system/database/drivers/sqlite/sqlite_forge.php +++ /dev/null @@ -1,205 +0,0 @@ -db->database) OR ! @unlink($this->db->database)) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - elseif ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @todo implement drop_column(), modify_column() - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') - { - // drop_column(): - // BEGIN TRANSACTION; - // CREATE TEMPORARY TABLE t1_backup(a,b); - // INSERT INTO t1_backup SELECT a,b FROM t1; - // DROP TABLE t1; - // CREATE TABLE t1(a,b); - // INSERT INTO t1 SELECT a,b FROM t1_backup; - // DROP TABLE t1_backup; - // COMMIT; - - return FALSE; - } - - return parent::_alter_table($alter_type, $table, $field); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'] - .$field['auto_increment'] - .$field['null'] - .$field['unique'] - .$field['default']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'ENUM': - case 'SET': - $attributes['TYPE'] = 'TEXT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['type'] = 'INTEGER PRIMARY KEY'; - $field['default'] = ''; - $field['null'] = ''; - $field['unique'] = ''; - $field['auto_increment'] = ' AUTOINCREMENT'; - - $this->primary_keys = array(); - } - } - -} diff --git a/system/database/drivers/sqlite/sqlite_result.php b/system/database/drivers/sqlite/sqlite_result.php deleted file mode 100644 index d40b98aab94..00000000000 --- a/system/database/drivers/sqlite/sqlite_result.php +++ /dev/null @@ -1,164 +0,0 @@ -num_rows) - ? $this->num_rows - : $this->num_rows = @sqlite_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return @sqlite_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $field_names[$i] = sqlite_field_name($this->result_id, $i); - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = sqlite_field_name($this->result_id, $i); - $retval[$i]->type = NULL; - $retval[$i]->max_length = NULL; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * 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. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return sqlite_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return sqlite_fetch_array($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return sqlite_fetch_object($this->result_id, $class_name); - } - -} diff --git a/system/database/drivers/sqlite/sqlite_utility.php b/system/database/drivers/sqlite/sqlite_utility.php deleted file mode 100644 index 59c46f9ef1c..00000000000 --- a/system/database/drivers/sqlite/sqlite_utility.php +++ /dev/null @@ -1,61 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 90a68f12900..1191e2350bb 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -225,13 +225,6 @@ class CI_Email { // -------------------------------------------------------------------- - /** - * Whether PHP is running in safe mode. Initialized by the class constructor. - * - * @var bool - */ - protected $_safe_mode = FALSE; - /** * Subject header * @@ -395,7 +388,6 @@ public function __construct(array $config = array()) { $this->charset = config_item('charset'); $this->initialize($config); - $this->_safe_mode = ( ! is_php('5.4') && ini_get('safe_mode')); isset(self::$func_override) OR self::$func_override = (extension_loaded('mbstring') && ini_get('mbstring.func_override')); @@ -676,18 +668,6 @@ public function subject($subject) public function message($body) { $this->_body = rtrim(str_replace("\r", '', $body)); - - /* strip slashes only if magic quotes is ON - if we do it with magic quotes OFF, it strips real, user-inputted chars. - - 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()) - { - $this->_body = stripslashes($this->_body); - } - return $this; } @@ -1854,16 +1834,9 @@ protected function _send_with_mail() $this->_recipients = implode(', ', $this->_recipients); } - if ($this->_safe_mode === TRUE) - { - return mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str); - } - else - { - // most documentation of sendmail using the "-f" flag lacks a space after it, however - // we've encountered servers that seem to require it to be in place. - return mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, '-f '.$this->clean_email($this->_headers['Return-Path'])); - } + // most documentation of sendmail using the "-f" flag lacks a space after it, however + // we've encountered servers that seem to require it to be in place. + return mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, '-f '.$this->clean_email($this->_headers['Return-Path'])); } // -------------------------------------------------------------------- @@ -2421,9 +2394,6 @@ protected static function substr($str, $start, $length = NULL) { if (self::$func_override) { - // mb_substr($str, $start, null, '8bit') returns an empty - // string on PHP 5.3 - isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); return mb_substr($str, $start, $length, '8bit'); } diff --git a/system/libraries/Encryption.php b/system/libraries/Encryption.php index 545081b3b76..c68ee25848a 100644 --- a/system/libraries/Encryption.php +++ b/system/libraries/Encryption.php @@ -482,7 +482,7 @@ protected function _openssl_encrypt($data, $params) $data, $params['handle'], $params['key'], - 1, // DO NOT TOUCH! + OPENSSL_RAW_DATA, $iv ); @@ -641,7 +641,7 @@ protected function _openssl_decrypt($data, $params) $data, $params['handle'], $params['key'], - 1, // DO NOT TOUCH! + OPENSSL_RAW_DATA, $iv ); } @@ -930,9 +930,6 @@ protected static function substr($str, $start, $length = NULL) { if (self::$func_override) { - // mb_substr($str, $start, null, '8bit') returns an empty - // string on PHP 5.3 - isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); return mb_substr($str, $start, $length, '8bit'); } diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index 01989d2d71b..9d3bd7a2f06 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -105,23 +105,7 @@ public function __construct(array $params = array()) $class = new $class($this->_config); if ($class instanceof SessionHandlerInterface) { - if (is_php('5.4')) - { - session_set_save_handler($class, TRUE); - } - else - { - session_set_save_handler( - array($class, 'open'), - array($class, 'close'), - array($class, 'read'), - array($class, 'write'), - array($class, 'destroy'), - array($class, 'gc') - ); - - register_shutdown_function('session_write_close'); - } + session_set_save_handler($class, TRUE); } else { @@ -190,9 +174,6 @@ public function __construct(array $params = array()) */ protected function _ci_load_classes($driver) { - // PHP 5.4 compatibility - interface_exists('SessionHandlerInterface', FALSE) OR require_once(BASEPATH.'libraries/Session/SessionHandlerInterface.php'); - $prefix = config_item('subclass_prefix'); if ( ! class_exists('CI_Session_driver', FALSE)) diff --git a/system/libraries/Session/SessionHandlerInterface.php b/system/libraries/Session/SessionHandlerInterface.php deleted file mode 100644 index b3533dd1eae..00000000000 --- a/system/libraries/Session/SessionHandlerInterface.php +++ /dev/null @@ -1,59 +0,0 @@ - 0) diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index 7186646dac9..87f609e8dad 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -836,9 +836,7 @@ public function __construct($val, $code = 0, $fstr = '') { // error $this->errno = $code; - $this->errstr = htmlspecialchars($fstr, - (is_php('5.4') ? ENT_XML1 | ENT_NOQUOTES : ENT_NOQUOTES), - 'UTF-8'); + $this->errstr = htmlspecialchars($fstr, ENT_XML1 | ENT_NOQUOTES, 'UTF-8'); } elseif ( ! is_object($val)) { diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index 25315c92e67..82a43e9c972 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -519,9 +519,6 @@ protected static function substr($str, $start, $length = NULL) { if (self::$func_override) { - // mb_substr($str, $start, null, '8bit') returns an empty - // string on PHP 5.3 - isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); return mb_substr($str, $start, $length, '8bit'); } diff --git a/tests/codeigniter/core/compat/standard_test.php b/tests/codeigniter/core/compat/standard_test.php index a9846012978..54424bb9b99 100644 --- a/tests/codeigniter/core/compat/standard_test.php +++ b/tests/codeigniter/core/compat/standard_test.php @@ -10,11 +10,6 @@ public function test_bootstrap() } $this->assertTrue(function_exists('array_column')); - - if ( ! is_php('5.4')) - { - $this->assertTrue(function_exists('hex2bin')); - } } // ------------------------------------------------------------------------ @@ -330,25 +325,6 @@ public function test_array_column() array_column($input, 'b', 'a') ); } - - // ------------------------------------------------------------------------ - - /** - * hex2bin() tests - * - * @depends test_bootstrap - */ - public function test_hex2bin() - { - if (is_php('5.4')) - { - return $this->markTestSkipped('hex2bin() is already available on PHP 5.4'); - } - - $this->assertEquals("\x03\x04", hex2bin("0304")); - $this->assertEquals('', hex2bin('')); - $this->assertEquals("\x01\x02\x03", hex2bin(new FooHex())); - } } // ------------------------------------------------------------------------ @@ -368,11 +344,3 @@ public function __toString() return 'first_name'; } } - -class FooHex { - - public function __toString() - { - return '010203'; - } -} diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 84ed718cd8e..74fb157982c 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -13,6 +13,7 @@ Release Date: Not Released - Core + - Removed ``$config['rewrite_short_tags']`` (irrelevant on PHP 5.4+). - Removed previously deprecated ``$config['global_xss_filtering']``. - Removed previously deprecated :doc:`Routing Class ` methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` (use the respective class properties instead). - Removed previously deprecated :doc:`Config Library ` method ``system_url()`` (encourages insecure practices). @@ -53,9 +54,10 @@ Release Date: Not Released - :doc:`Database ` changes include: + - Removed previously deprecated 'sqlite' driver (used for SQLite version 2; no longer shipped with PHP 5.4+). + - Removed method ``db_set_charset()`` and the ability to change a connection character set at runtime. - Changed method ``initialize()`` to return void and instead throw a ``RuntimeException`` in case of failure. - Changed method ``db_connect()`` to always set the connection character set (if supported by the driver) and to fail if it can't. - - Removed method ``db_set_charset()`` and the ability to change a connection character set at runtime. - :doc:`Database Forge `: diff --git a/user_guide_src/source/general/compatibility_functions.rst b/user_guide_src/source/general/compatibility_functions.rst index 71559d0be0b..522e43f6023 100644 --- a/user_guide_src/source/general/compatibility_functions.rst +++ b/user_guide_src/source/general/compatibility_functions.rst @@ -220,12 +220,3 @@ Function reference For more information, please refer to the `PHP manual for array_column() `_. - -.. php:function:: hex2bin($data) - - :param array $data: Hexadecimal representation of data - :returns: Binary representation of the given data - :rtype: string - - For more information, please refer to the `PHP manual for hex2bin() - `_. diff --git a/user_guide_src/source/general/requirements.rst b/user_guide_src/source/general/requirements.rst index 2e24d6d0386..982a6014ffe 100644 --- a/user_guide_src/source/general/requirements.rst +++ b/user_guide_src/source/general/requirements.rst @@ -15,7 +15,7 @@ Currently supported databases are: - Oracle via the *oci8* and *pdo* drivers - PostgreSQL via the *postgre* and *pdo* drivers - MS SQL via the *mssql*, *sqlsrv* (version 2005 and above only) and *pdo* drivers - - SQLite via the *sqlite* (version 2), *sqlite3* (version 3) and *pdo* drivers + - SQLite via the *sqlite3* and *pdo* drivers - CUBRID via the *cubrid* and *pdo* drivers - Interbase/Firebird via the *ibase* and *pdo* drivers - ODBC via the *odbc* and *pdo* drivers (you should know that ODBC is actually an abstraction layer) diff --git a/user_guide_src/source/installation/upgrade_320.rst b/user_guide_src/source/installation/upgrade_320.rst index a2772e10ccd..95d9aab4da0 100644 --- a/user_guide_src/source/installation/upgrade_320.rst +++ b/user_guide_src/source/installation/upgrade_320.rst @@ -161,6 +161,9 @@ CodeIgniter versions that have been removed in 3.2.0: - ``$config['allow_get_array']`` (use ``$_GET = array();`` instead) - ``$config['standardize_newlines']`` +- ``$config['rewrite_short_tags']`` (no impact; irrelevant on PHP 5.4+) + +- 'sqlite' database driver (no longer shipped with PHP 5.4+; 'sqlite3' is still available) - ``CI_Input::is_cli_request()`` (use :php:func:`is_cli()` instead) - ``CI_Router::fetch_directory()`` (use ``CI_Router::$directory`` instead) From dcd6f5153b7e7e6d798d5a77af65b7460f152e5c Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 14 Dec 2016 18:14:35 +0200 Subject: [PATCH 4621/5397] Isolate CI_Security instantiation from CI_Input; improve tests --- system/core/CodeIgniter.php | 4 +- system/core/Input.php | 7 ++- system/core/Utf8.php | 10 ++-- tests/codeigniter/core/Input_test.php | 4 +- tests/codeigniter/core/URI_test.php | 9 ++++ tests/codeigniter/core/Utf8_test.php | 53 +++++++++---------- .../helpers/cookie_helper_test.php | 5 +- .../codeigniter/helpers/text_helper_test.php | 23 ++++---- tests/codeigniter/helpers/url_helper_test.php | 12 ++++- .../libraries/Form_validation_test.php | 4 +- tests/mocks/ci_testcase.php | 4 +- tests/mocks/core/input.php | 8 ++- tests/mocks/core/utf8.php | 19 ------- 13 files changed, 79 insertions(+), 83 deletions(-) delete mode 100644 tests/mocks/core/utf8.php diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index dfc90af2a69..410b9613bd2 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -243,7 +243,7 @@ * Instantiate the UTF-8 class * ------------------------------------------------------ */ - $UNI =& load_class('Utf8', 'core'); + $UNI =& load_class('Utf8', 'core', $charset); /* * ------------------------------------------------------ @@ -288,7 +288,7 @@ * Load the Input class and sanitize globals * ------------------------------------------------------ */ - $IN =& load_class('Input', 'core'); + $IN =& load_class('Input', 'core', $SEC); /* * ------------------------------------------------------ diff --git a/system/core/Input.php b/system/core/Input.php index aefc3b7d8a1..d881e253db5 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -113,11 +113,10 @@ class CI_Input { * * @return void */ - public function __construct() + public function __construct(CI_Security &$security) { - $this->_enable_csrf = (config_item('csrf_protection') === TRUE); - - $this->security =& load_class('Security', 'core'); + $this->_enable_csrf = (config_item('csrf_protection') === TRUE); + $this->security = $security; // CSRF Protection check if ($this->_enable_csrf === TRUE && ! is_cli()) diff --git a/system/core/Utf8.php b/system/core/Utf8.php index 93c61167501..042ca43167f 100644 --- a/system/core/Utf8.php +++ b/system/core/Utf8.php @@ -57,13 +57,13 @@ class CI_Utf8 { * * @return void */ - public function __construct() + public function __construct($charset) { if ( - defined('PREG_BAD_UTF8_ERROR') // PCRE must support UTF-8 - && (ICONV_ENABLED === TRUE OR MB_ENABLED === TRUE) // iconv or mbstring must be installed - && strtoupper(config_item('charset')) === 'UTF-8' // Application charset must be UTF-8 - ) + defined('PREG_BAD_UTF8_ERROR') // PCRE must support UTF-8 + && (ICONV_ENABLED === TRUE OR MB_ENABLED === TRUE) // iconv or mbstring must be installed + && $charset === 'UTF-8' // Application charset must be UTF-8 + ) { define('UTF8_ENABLED', TRUE); log_message('info', 'UTF-8 Support Enabled'); diff --git a/tests/codeigniter/core/Input_test.php b/tests/codeigniter/core/Input_test.php index e1f4011b57e..78b6596918e 100644 --- a/tests/codeigniter/core/Input_test.php +++ b/tests/codeigniter/core/Input_test.php @@ -15,9 +15,7 @@ public function set_up() $security = new Mock_Core_Security(); $this->ci_set_config('charset', 'UTF-8'); - $utf8 = new Mock_Core_Utf8(); - - $this->input = new Mock_Core_Input($security, $utf8); + $this->input = new Mock_Core_Input($security); } // -------------------------------------------------------------------- diff --git a/tests/codeigniter/core/URI_test.php b/tests/codeigniter/core/URI_test.php index 42dff3639eb..f862c666ef9 100644 --- a/tests/codeigniter/core/URI_test.php +++ b/tests/codeigniter/core/URI_test.php @@ -119,8 +119,13 @@ public function test_explode_segments() */ // -------------------------------------------------------------------- + /** + * @runInSeparateProcess + */ public function test_filter_uri_passing() { + define('UTF8_ENABLED', FALSE); + $this->uri->_set_permitted_uri_chars('a-z 0-9~%.:_\-'); $str = 'abc01239~%.:_-'; @@ -129,8 +134,12 @@ public function test_filter_uri_passing() // -------------------------------------------------------------------- + /** + * @runInSeparateProcess + */ public function test_filter_uri_throws_error() { + define('UTF8_ENABLED', FALSE); $this->setExpectedException('RuntimeException'); $this->uri->config->set_item('enable_query_strings', FALSE); diff --git a/tests/codeigniter/core/Utf8_test.php b/tests/codeigniter/core/Utf8_test.php index 7e6ffd930c6..f40bb9848ce 100644 --- a/tests/codeigniter/core/Utf8_test.php +++ b/tests/codeigniter/core/Utf8_test.php @@ -1,31 +1,27 @@ ci_set_config('charset', 'UTF-8'); - $this->utf8 = new Mock_Core_Utf8(); - $this->ci_instance_var('utf8', $this->utf8); + if ( ! defined('PREG_BAD_UTF8_ERROR') OR (ICONV_ENABLED === FALSE && MB_ENABLED === FALSE)) + { + return $this->markTestSkipped('PCRE_UTF8 and/or both ext/mbstring & ext/iconv are unavailable'); + } + + new CI_Utf8('UTF-8'); + $this->assertTrue(UTF8_ENABLED); } // -------------------------------------------------------------------- - /** - * __construct() test - * - * @covers CI_Utf8::__construct - */ - public function test___construct() + public function test__constructUTF8_DISABLED() { - if (defined('PREG_BAD_UTF8_ERROR') && (ICONV_ENABLED === TRUE OR MB_ENABLED === TRUE) && strtoupper(config_item('charset')) === 'UTF-8') - { - $this->assertTrue(UTF8_ENABLED); - } - else - { - $this->assertFalse(UTF8_ENABLED); - } + new CI_Utf8('WINDOWS-1251'); + $this->assertFalse(UTF8_ENABLED); } // -------------------------------------------------------------------- @@ -37,8 +33,9 @@ public function test___construct() */ public function test_is_ascii() { - $this->assertTrue($this->utf8->is_ascii('foo bar')); - $this->assertFalse($this->utf8->is_ascii('тест')); + $utf8 = new CI_Utf8('UTF-8'); + $this->assertTrue($utf8->is_ascii('foo bar')); + $this->assertFalse($utf8->is_ascii('тест')); } // -------------------------------------------------------------------- @@ -51,21 +48,22 @@ public function test_is_ascii() */ public function test_clean_string() { - $this->assertEquals('foo bar', $this->utf8->clean_string('foo bar')); + $utf8 = new CI_Utf8('UTF-8'); + $this->assertEquals('foo bar', $utf8->clean_string('foo bar')); $illegal_utf8 = "\xc0тест"; if (MB_ENABLED) { - $this->assertEquals('тест', $this->utf8->clean_string($illegal_utf8)); + $this->assertEquals('тест', $utf8->clean_string($illegal_utf8)); } elseif (ICONV_ENABLED) { // This is a known issue, iconv doesn't always work with //IGNORE - $this->assertTrue(in_array($this->utf8->clean_string($illegal_utf8), array('тест', ''), TRUE)); + $this->assertTrue(in_array($utf8->clean_string($illegal_utf8), array('тест', ''), TRUE)); } else { - $this->assertEquals($illegal_utf8, $this->utf8->clean_string($illegal_utf8)); + $this->assertEquals($illegal_utf8, $utf8->clean_string($illegal_utf8)); } } @@ -78,14 +76,15 @@ public function test_clean_string() */ public function test_convert_to_utf8() { + $utf8 = new CI_Utf8('UTF-8'); if (MB_ENABLED OR ICONV_ENABLED) { - $this->assertEquals('тест', $this->utf8->convert_to_utf8('òåñò', 'WINDOWS-1251')); + $this->assertEquals('тест', $utf8->convert_to_utf8('òåñò', 'WINDOWS-1251')); } else { - $this->assertFalse($this->utf8->convert_to_utf8('òåñò', 'WINDOWS-1251')); + $this->assertFalse($utf8->convert_to_utf8('òåñò', 'WINDOWS-1251')); } } -} \ No newline at end of file +} diff --git a/tests/codeigniter/helpers/cookie_helper_test.php b/tests/codeigniter/helpers/cookie_helper_test.php index fba68f20fae..1fbb57f67c6 100644 --- a/tests/codeigniter/helpers/cookie_helper_test.php +++ b/tests/codeigniter/helpers/cookie_helper_test.php @@ -29,9 +29,8 @@ function test_get_cookie() $_COOKIE['foo'] = 'bar'; $security = new Mock_Core_Security(); - $utf8 = new Mock_Core_Utf8(); $input_cls = $this->ci_core_class('input'); - $this->ci_instance_var('input', new Mock_Core_Input($security, $utf8)); + $this->ci_instance_var('input', new Mock_Core_Input($security)); $this->assertEquals('bar', get_cookie('foo', FALSE)); $this->assertEquals('bar', get_cookie('foo', TRUE)); @@ -56,4 +55,4 @@ function test_delete_cookie() $this->markTestSkipped('Need to find a way to overcome a headers already set exception'); } -} \ No newline at end of file +} diff --git a/tests/codeigniter/helpers/text_helper_test.php b/tests/codeigniter/helpers/text_helper_test.php index 7a7dc0a124b..36465f203f2 100644 --- a/tests/codeigniter/helpers/text_helper_test.php +++ b/tests/codeigniter/helpers/text_helper_test.php @@ -2,21 +2,19 @@ class Text_helper_test extends CI_TestCase { - private $_long_string; - public function set_up() { $this->helper('text'); - - $this->_long_string = 'Once upon a time, a framework had no tests. It sad. So some nice people began to write tests. The more time that went on, the happier it became. Everyone was happy.'; } // ------------------------------------------------------------------------ public function test_word_limiter() { - $this->assertEquals('Once upon a time,…', word_limiter($this->_long_string, 4)); - $this->assertEquals('Once upon a time,…', word_limiter($this->_long_string, 4, '…')); + $long_string = 'Once upon a time, a framework had no tests. It sad. So some nice people began to write tests. The more time that went on, the happier it became. Everyone was happy.'; + + $this->assertEquals('Once upon a time,…', word_limiter($long_string, 4)); + $this->assertEquals('Once upon a time,…', word_limiter($long_string, 4, '…')); $this->assertEquals('', word_limiter('', 4)); } @@ -24,8 +22,10 @@ public function test_word_limiter() public function test_character_limiter() { - $this->assertEquals('Once upon a time, a…', character_limiter($this->_long_string, 20)); - $this->assertEquals('Once upon a time, a…', character_limiter($this->_long_string, 20, '…')); + $long_string = 'Once upon a time, a framework had no tests. It sad. So some nice people began to write tests. The more time that went on, the happier it became. Everyone was happy.'; + + $this->assertEquals('Once upon a time, a…', character_limiter($long_string, 20)); + $this->assertEquals('Once upon a time, a…', character_limiter($long_string, 20, '…')); $this->assertEquals('Short', character_limiter('Short', 20)); $this->assertEquals('Short', character_limiter('Short', 5)); } @@ -103,8 +103,13 @@ public function test_highlight_code() // ------------------------------------------------------------------------ + /** + * @runInSeparateProcess + */ public function test_highlight_phrase() { + define('UTF8_ENABLED', FALSE); + $strs = array( 'this is a phrase' => 'this is a phrase', 'this is another' => 'this is another', @@ -171,4 +176,4 @@ public function test_default_word_wrap_charlim() $this->assertEquals(strpos(word_wrap($string), "\n"), 73); } -} \ No newline at end of file +} diff --git a/tests/codeigniter/helpers/url_helper_test.php b/tests/codeigniter/helpers/url_helper_test.php index 24823a634e7..c5b0f80b760 100644 --- a/tests/codeigniter/helpers/url_helper_test.php +++ b/tests/codeigniter/helpers/url_helper_test.php @@ -7,8 +7,13 @@ public function set_up() $this->helper('url'); } + /** + * @runInSeparateProcess + */ public function test_url_title() { + define('UTF8_ENABLED', FALSE); + $words = array( 'foo bar /' => 'foo-bar', '\ testing 12' => 'testing-12' @@ -22,8 +27,13 @@ public function test_url_title() // -------------------------------------------------------------------- + /** + * @runInSeparateProcess + */ public function test_url_title_extra_dashes() { + define('UTF8_ENABLED', FALSE); + $words = array( '_foo bar_' => 'foo_bar', '_What\'s wrong with CSS?_' => 'Whats_wrong_with_CSS' @@ -76,4 +86,4 @@ public function test_pull_675() } } -} \ No newline at end of file +} diff --git a/tests/codeigniter/libraries/Form_validation_test.php b/tests/codeigniter/libraries/Form_validation_test.php index 4be080f9042..5b7830dd888 100644 --- a/tests/codeigniter/libraries/Form_validation_test.php +++ b/tests/codeigniter/libraries/Form_validation_test.php @@ -13,10 +13,8 @@ public function set_up() // Same applies for lang $lang = $this->getMockBuilder('CI_Lang')->setMethods(array('load'))->getMock(); - $this->ci_set_config('charset', 'UTF-8'); - $utf8 = new Mock_Core_Utf8(); $security = new Mock_Core_Security(); - $input = new Mock_Core_Input($security, $utf8); + $input = new Mock_Core_Input($security); $this->ci_instance_var('lang', $lang); $this->ci_instance_var('load', $loader); diff --git a/tests/mocks/ci_testcase.php b/tests/mocks/ci_testcase.php index a2c37b92e46..b320aab7425 100644 --- a/tests/mocks/ci_testcase.php +++ b/tests/mocks/ci_testcase.php @@ -24,9 +24,9 @@ class CI_TestCase extends PHPUnit_Framework_TestCase { // -------------------------------------------------------------------- - public function __construct() + public function __construct($name = null, array $data = [], $dataName = '') { - parent::__construct(); + parent::__construct($name, $data, $dataName); $this->ci_instance = new stdClass(); } diff --git a/tests/mocks/core/input.php b/tests/mocks/core/input.php index 4d217a252c8..6f6a91365ba 100644 --- a/tests/mocks/core/input.php +++ b/tests/mocks/core/input.php @@ -9,12 +9,10 @@ class Mock_Core_Input extends CI_Input { * * @covers CI_Input::__construct() */ - public function __construct($security, $utf8) + public function __construct($security) { - $this->_enable_csrf = (config_item('csrf_protection') === TRUE); - - // Assign Security and Utf8 classes - $this->security = $security; + $this->_enable_csrf = (config_item('csrf_protection') === TRUE); + $this->security = $security; } public function fetch_from_array($array, $index = '', $xss_clean = FALSE) diff --git a/tests/mocks/core/utf8.php b/tests/mocks/core/utf8.php deleted file mode 100644 index 3a6282e1d9a..00000000000 --- a/tests/mocks/core/utf8.php +++ /dev/null @@ -1,19 +0,0 @@ - Date: Wed, 14 Dec 2016 18:41:52 +0200 Subject: [PATCH 4622/5397] Move csrf_verify() call out of CI_Input --- system/core/CodeIgniter.php | 2 +- system/core/Input.php | 20 +--------- system/core/Security.php | 9 +++-- tests/codeigniter/core/Input_test.php | 40 ++++++++++--------- tests/codeigniter/core/Security_test.php | 5 ++- .../helpers/cookie_helper_test.php | 4 +- .../helpers/security_helper_test.php | 2 +- .../libraries/Form_validation_test.php | 4 +- tests/codeigniter/libraries/Session_test.php | 5 ++- tests/codeigniter/libraries/Upload_test.php | 2 +- tests/mocks/core/input.php | 30 -------------- 11 files changed, 41 insertions(+), 82 deletions(-) delete mode 100644 tests/mocks/core/input.php diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 410b9613bd2..977d1427d2d 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -281,7 +281,7 @@ * Load the security class for xss and csrf support * ----------------------------------------------------- */ - $SEC =& load_class('Security', 'core'); + $SEC =& load_class('Security', 'core', $charset); /* * ------------------------------------------------------ diff --git a/system/core/Input.php b/system/core/Input.php index d881e253db5..ab60e45c3a5 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -57,16 +57,6 @@ class CI_Input { */ protected $ip_address = FALSE; - /** - * Enable CSRF flag - * - * Enables a CSRF cookie token to be set. - * Set automatically based on config setting. - * - * @var bool - */ - protected $_enable_csrf = FALSE; - /** * List of all HTTP request headers * @@ -115,15 +105,7 @@ class CI_Input { */ public function __construct(CI_Security &$security) { - $this->_enable_csrf = (config_item('csrf_protection') === TRUE); - $this->security = $security; - - // CSRF Protection check - if ($this->_enable_csrf === TRUE && ! is_cli()) - { - $this->security->csrf_verify(); - } - + $this->security = $security; log_message('info', 'Input Class Initialized'); } diff --git a/system/core/Security.php b/system/core/Security.php index a80b52fd1c4..fb0ca3d4e0e 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -167,10 +167,12 @@ class CI_Security { * * @return void */ - public function __construct() + public function __construct($charset) { + $this->charset = $charset; + // Is CSRF protection enabled? - if (config_item('csrf_protection')) + if (config_item('csrf_protection') && ! is_cli()) { // CSRF config foreach (array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key) @@ -189,10 +191,9 @@ public function __construct() // Set the CSRF hash $this->_csrf_set_hash(); + $this->csrf_verify(); } - $this->charset = strtoupper(config_item('charset')); - log_message('info', 'Security Class Initialized'); } diff --git a/tests/codeigniter/core/Input_test.php b/tests/codeigniter/core/Input_test.php index 78b6596918e..e068a84be6f 100644 --- a/tests/codeigniter/core/Input_test.php +++ b/tests/codeigniter/core/Input_test.php @@ -12,10 +12,8 @@ public function set_up() $this->ci_set_config('global_xss_filtering', FALSE); $this->ci_set_config('csrf_protection', FALSE); - $security = new Mock_Core_Security(); - - $this->ci_set_config('charset', 'UTF-8'); - $this->input = new Mock_Core_Input($security); + $security = new Mock_Core_Security('UTF-8'); + $this->input = new CI_Input($security); } // -------------------------------------------------------------------- @@ -120,14 +118,17 @@ public function test_server() public function test_fetch_from_array() { + $reflection = new ReflectionMethod($this->input, '_fetch_from_array'); + $reflection->setAccessible(TRUE); + $data = array( 'foo' => 'bar', 'harm' => 'Hello, i try to your site', ); - $foo = $this->input->fetch_from_array($data, 'foo'); - $harm = $this->input->fetch_from_array($data, 'harm'); - $harmless = $this->input->fetch_from_array($data, 'harm', TRUE); + $foo = $reflection->invokeArgs($this->input, [&$data, 'foo']); + $harm = $reflection->invokeArgs($this->input, [&$data, 'harm']); + $harmless = $reflection->invokeArgs($this->input, [&$data, 'harm', TRUE]); $this->assertEquals('bar', $foo); $this->assertEquals("Hello, i try to your site", $harm); @@ -215,57 +216,60 @@ public function test_get_request_header() public function test_ip_address() { - $this->input->ip_address = '127.0.0.1'; + $reflection = new ReflectionProperty($this->input, 'ip_address'); + $reflection->setAccessible(TRUE); + + $reflection->setValue($this->input, '127.0.0.1'); $this->assertEquals('127.0.0.1', $this->input->ip_address()); // 127.0.0.1 is set in our Bootstrap file - $this->input->ip_address = FALSE; + $reflection->setValue($this->input, FALSE); $this->assertEquals('127.0.0.1', $this->input->ip_address()); // Invalid $_SERVER['REMOTE_ADDR'] = 'invalid_ip_address'; - $this->input->ip_address = FALSE; // reset cached value + $reflection->setValue($this->input, FALSE); // reset cached value $this->assertEquals('0.0.0.0', $this->input->ip_address()); $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; // Proxy_ips tests - $this->input->ip_address = FALSE; + $reflection->setValue($this->input, FALSE); $this->ci_set_config('proxy_ips', '127.0.0.3, 127.0.0.4, 127.0.0.2'); $_SERVER['HTTP_CLIENT_IP'] = '127.0.0.2'; $this->assertEquals('127.0.0.1', $this->input->ip_address()); // Invalid spoof - $this->input->ip_address = FALSE; + $reflection->setValue($this->input, FALSE); $this->ci_set_config('proxy_ips', 'invalid_ip_address'); $_SERVER['HTTP_CLIENT_IP'] = 'invalid_ip_address'; $this->assertEquals('127.0.0.1', $this->input->ip_address()); - $this->input->ip_address = FALSE; + $reflection->setValue($this->input, FALSE); $this->ci_set_config('proxy_ips', 'http://foo/bar/baz, 127.0.0.1/1'); $_SERVER['HTTP_CLIENT_IP'] = '127.0.0.1'; $this->assertEquals('127.0.0.1', $this->input->ip_address()); - $this->input->ip_address = FALSE; + $reflection->setValue($this->input, FALSE); $this->ci_set_config('proxy_ips', 'http://foo/bar/baz, 127.0.0.2'); $_SERVER['HTTP_CLIENT_IP'] = '127.0.0.2'; $_SERVER['REMOTE_ADDR'] = '127.0.0.2'; $this->assertEquals('127.0.0.2', $this->input->ip_address()); - //IPv6 - $this->input->ip_address = FALSE; + // IPv6 + $reflection->setValue($this->input, FALSE); $this->ci_set_config('proxy_ips', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329/1, FE80:0000:0000:0000:0202:B3FF:FE1E:8300/2'); $_SERVER['HTTP_CLIENT_IP'] = 'FE80:0000:0000:0000:0202:B3FF:FE1E:8300'; $_SERVER['REMOTE_ADDR'] = 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329'; $this->assertEquals('FE80:0000:0000:0000:0202:B3FF:FE1E:8300', $this->input->ip_address()); - $this->input->ip_address = FALSE; + $reflection->setValue($this->input, FALSE); $this->ci_set_config('proxy_ips', '0::/32'); $_SERVER['HTTP_CLIENT_IP'] = '127.0.0.7'; $_SERVER['REMOTE_ADDR'] = '0000:0000:0000:0000:0000:0000:0000:0001'; $this->assertEquals('127.0.0.7', $this->input->ip_address()); - $this->input->ip_address = FALSE; + $reflection->setValue($this->input, FALSE); $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; // back to reality } diff --git a/tests/codeigniter/core/Security_test.php b/tests/codeigniter/core/Security_test.php index cbf0285ecd9..2e1127f8774 100644 --- a/tests/codeigniter/core/Security_test.php +++ b/tests/codeigniter/core/Security_test.php @@ -12,7 +12,8 @@ public function set_up() $this->ci_set_config('csrf_token_name', 'ci_csrf_token'); $this->ci_set_config('csrf_cookie_name', 'ci_csrf_cookie'); - $this->security = new Mock_Core_Security(); + $_SERVER['REQUEST_METHOD'] = 'GET'; + $this->security = new Mock_Core_Security('UTF-8'); } // -------------------------------------------------------------------- @@ -341,7 +342,7 @@ public function test_csrf_set_hash() // leave csrf_cookie_name as blank to test _csrf_set_hash function $this->ci_set_config('csrf_cookie_name', ''); - $this->security = new Mock_Core_Security(); + $this->security = new Mock_Core_Security('UTF-8'); $this->assertNotEmpty($this->security->get_csrf_hash()); } diff --git a/tests/codeigniter/helpers/cookie_helper_test.php b/tests/codeigniter/helpers/cookie_helper_test.php index 1fbb57f67c6..e984be21ca8 100644 --- a/tests/codeigniter/helpers/cookie_helper_test.php +++ b/tests/codeigniter/helpers/cookie_helper_test.php @@ -28,9 +28,9 @@ function test_get_cookie() { $_COOKIE['foo'] = 'bar'; - $security = new Mock_Core_Security(); + $security = new Mock_Core_Security('UTF-8'); $input_cls = $this->ci_core_class('input'); - $this->ci_instance_var('input', new Mock_Core_Input($security)); + $this->ci_instance_var('input', new CI_Input($security)); $this->assertEquals('bar', get_cookie('foo', FALSE)); $this->assertEquals('bar', get_cookie('foo', TRUE)); diff --git a/tests/codeigniter/helpers/security_helper_test.php b/tests/codeigniter/helpers/security_helper_test.php index ab05d57baca..d7e3f47343c 100644 --- a/tests/codeigniter/helpers/security_helper_test.php +++ b/tests/codeigniter/helpers/security_helper_test.php @@ -6,7 +6,7 @@ function setUp() { $this->helper('security'); $obj = new stdClass; - $obj->security = new Mock_Core_Security(); + $obj->security = new Mock_Core_Security('UTF-8'); $this->ci_instance($obj); } diff --git a/tests/codeigniter/libraries/Form_validation_test.php b/tests/codeigniter/libraries/Form_validation_test.php index 5b7830dd888..edbe9da4a66 100644 --- a/tests/codeigniter/libraries/Form_validation_test.php +++ b/tests/codeigniter/libraries/Form_validation_test.php @@ -13,8 +13,8 @@ public function set_up() // Same applies for lang $lang = $this->getMockBuilder('CI_Lang')->setMethods(array('load'))->getMock(); - $security = new Mock_Core_Security(); - $input = new Mock_Core_Input($security); + $security = new Mock_Core_Security('UTF-8'); + $input = new CI_Input($security); $this->ci_instance_var('lang', $lang); $this->ci_instance_var('load', $loader); diff --git a/tests/codeigniter/libraries/Session_test.php b/tests/codeigniter/libraries/Session_test.php index 76a4fcc9803..840df076a5e 100644 --- a/tests/codeigniter/libraries/Session_test.php +++ b/tests/codeigniter/libraries/Session_test.php @@ -37,7 +37,8 @@ public function set_up() $ci = $this->ci_instance(); $ldr = $this->ci_core_class('load'); $ci->load = new $ldr(); - $ci->input = new Mock_Core_Input(NULL, NULL); + $security = new Mock_Core_Security('UTF-8'); + $ci->input = new CI_Input($security); // Make sure string helper is available $this->ci_vfs_clone('system/helpers/string_helper.php'); @@ -437,4 +438,4 @@ public function test_sess_destroy() $this->assertNull($this->session->native->userdata($key)); } -} \ No newline at end of file +} diff --git a/tests/codeigniter/libraries/Upload_test.php b/tests/codeigniter/libraries/Upload_test.php index 8bac597b3da..74a7d2c22df 100644 --- a/tests/codeigniter/libraries/Upload_test.php +++ b/tests/codeigniter/libraries/Upload_test.php @@ -6,7 +6,7 @@ public function set_up() { $ci = $this->ci_instance(); $ci->upload = new CI_Upload(); - $ci->security = new Mock_Core_Security(); + $ci->security = new Mock_Core_Security('UTF-8'); $ci->lang = $this->getMockBuilder('CI_Lang')->setMethods(array('load', 'line'))->getMock(); $ci->lang->expects($this->any())->method('line')->will($this->returnValue(FALSE)); $this->upload = $ci->upload; diff --git a/tests/mocks/core/input.php b/tests/mocks/core/input.php deleted file mode 100644 index 6f6a91365ba..00000000000 --- a/tests/mocks/core/input.php +++ /dev/null @@ -1,30 +0,0 @@ -_enable_csrf = (config_item('csrf_protection') === TRUE); - $this->security = $security; - } - - public function fetch_from_array($array, $index = '', $xss_clean = FALSE) - { - return parent::_fetch_from_array($array, $index, $xss_clean); - } - - public function __set($name, $value) - { - if ($name === 'ip_address') - { - $this->ip_address = $value; - } - } -} From 8d369209b9c1db8cf3fe06bba54441ca84a8d6e4 Mon Sep 17 00:00:00 2001 From: vlakoff Date: Thu, 15 Dec 2016 23:17:16 +0100 Subject: [PATCH 4623/5397] Small code simplification in character_limiter() --- system/helpers/text_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index 4f9210f2da1..e54ed04e149 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -102,7 +102,7 @@ function character_limiter($str, $n = 500, $end_char = '…') } // a bit complicated, but faster than preg_replace with \s+ - $str = preg_replace('/ {2,}/', ' ', str_replace(array("\r", "\n", "\t", "\x0B", "\x0C"), ' ', $str)); + $str = preg_replace('/ {2,}/', ' ', str_replace(array("\r", "\n", "\t", "\v", "\f"), ' ', $str)); if (mb_strlen($str) <= $n) { From 468d16a24f2ecd07e922e158f541e9f6831636f2 Mon Sep 17 00:00:00 2001 From: Tomaz Lovrec Date: Fri, 16 Dec 2016 12:00:19 +0000 Subject: [PATCH 4624/5397] Remove needless constructor in model documentation PHP will execute the parent constructor regardless if a constructor method is defined in the child class or not. Defining an empty constructor just to call the parents constructor can be considered bad practice. --- user_guide_src/source/general/models.rst | 6 ------ 1 file changed, 6 deletions(-) diff --git a/user_guide_src/source/general/models.rst b/user_guide_src/source/general/models.rst index 1cfe736de41..08e9f5b3085 100644 --- a/user_guide_src/source/general/models.rst +++ b/user_guide_src/source/general/models.rst @@ -22,12 +22,6 @@ model class might look like:: public $content; public $date; - public function __construct() - { - // Call the CI_Model constructor - parent::__construct(); - } - public function get_last_ten_entries() { $query = $this->db->get('entries', 10); From 1398b72b32e3fb9628be2e09ffe97bea88565868 Mon Sep 17 00:00:00 2001 From: Tomaz Lovrec Date: Fri, 16 Dec 2016 12:02:12 +0000 Subject: [PATCH 4625/5397] Add constructor comments to match controller docs Empty constructors are pointless and bad practice, but removing them from this part of the documentation makes it less readable, makes less of a point, and would be quite frankly weird. Added a comment that suggests that further user code should be put there, like it is in the controller documentation --- user_guide_src/source/general/core_classes.rst | 1 + user_guide_src/source/general/models.rst | 2 ++ 2 files changed, 3 insertions(+) diff --git a/user_guide_src/source/general/core_classes.rst b/user_guide_src/source/general/core_classes.rst index 07c0b00bac0..79f73ef06d3 100644 --- a/user_guide_src/source/general/core_classes.rst +++ b/user_guide_src/source/general/core_classes.rst @@ -101,6 +101,7 @@ your new class in your application controller's constructors. public function __construct() { parent::__construct(); + // Your own constructor code } public function index() diff --git a/user_guide_src/source/general/models.rst b/user_guide_src/source/general/models.rst index 08e9f5b3085..eb842e927b7 100644 --- a/user_guide_src/source/general/models.rst +++ b/user_guide_src/source/general/models.rst @@ -70,6 +70,7 @@ The basic prototype for a model class is this:: public function __construct() { parent::__construct(); + // Your own constructor code } } @@ -85,6 +86,7 @@ The file name must match the class name. For example, if this is your class:: public function __construct() { parent::__construct(); + // Your own constructor code } } From 0c48f3982196df8171bd6f17f2660077168a3864 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 16 Dec 2016 14:52:54 +0200 Subject: [PATCH 4626/5397] Merge pull request #4947 from slax0rr/develop [ci skip] Remove needless constructor in model general topics documentation --- user_guide_src/source/general/core_classes.rst | 1 + user_guide_src/source/general/models.rst | 8 ++------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/user_guide_src/source/general/core_classes.rst b/user_guide_src/source/general/core_classes.rst index 07c0b00bac0..79f73ef06d3 100644 --- a/user_guide_src/source/general/core_classes.rst +++ b/user_guide_src/source/general/core_classes.rst @@ -101,6 +101,7 @@ your new class in your application controller's constructors. public function __construct() { parent::__construct(); + // Your own constructor code } public function index() diff --git a/user_guide_src/source/general/models.rst b/user_guide_src/source/general/models.rst index 1cfe736de41..eb842e927b7 100644 --- a/user_guide_src/source/general/models.rst +++ b/user_guide_src/source/general/models.rst @@ -22,12 +22,6 @@ model class might look like:: public $content; public $date; - public function __construct() - { - // Call the CI_Model constructor - parent::__construct(); - } - public function get_last_ten_entries() { $query = $this->db->get('entries', 10); @@ -76,6 +70,7 @@ The basic prototype for a model class is this:: public function __construct() { parent::__construct(); + // Your own constructor code } } @@ -91,6 +86,7 @@ The file name must match the class name. For example, if this is your class:: public function __construct() { parent::__construct(); + // Your own constructor code } } From 2b26ccfe25708e23d5d87b56d6984c09157df2b5 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 16 Dec 2016 12:02:00 +0200 Subject: [PATCH 4627/5397] Merge pull request #4945 from vlakoff/text_helper Small code simplification in character_limiter() --- system/helpers/text_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index 4f9210f2da1..e54ed04e149 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -102,7 +102,7 @@ function character_limiter($str, $n = 500, $end_char = '…') } // a bit complicated, but faster than preg_replace with \s+ - $str = preg_replace('/ {2,}/', ' ', str_replace(array("\r", "\n", "\t", "\x0B", "\x0C"), ' ', $str)); + $str = preg_replace('/ {2,}/', ' ', str_replace(array("\r", "\n", "\t", "\v", "\f"), ' ', $str)); if (mb_strlen($str) <= $n) { From 62adbbd6cb2bc56258817efbc8f201250de6b64d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Fri, 16 Dec 2016 15:48:14 +0200 Subject: [PATCH 4628/5397] [ci skip] Remove a function_exists() call from CI_Image_lib We use this function elsewhere without checking for existence; nobody has complained --- system/libraries/Image_lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 475649c462f..884d0dcec8f 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -1194,7 +1194,7 @@ public function overlay_watermark() } // Build the finalized image - if ($wm_img_type === 3 && function_exists('imagealphablending')) + if ($wm_img_type === 3) { @imagealphablending($src_img, TRUE); } From a927ae4ee86fb6727ac340e7b96aee6f82b5542b Mon Sep 17 00:00:00 2001 From: Alex Fang Date: Thu, 22 Dec 2016 12:49:45 +0800 Subject: [PATCH 4629/5397] Fix bug: DB_query_builder do not add parenthesis for cached group_by --- system/database/DB_query_builder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index b88ec956ac5..6d165fc798f 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1402,7 +1402,7 @@ public function count_all_results($table = '', $reset = TRUE) $this->qb_orderby = NULL; } - $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby)) + $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby) OR in_array('groupby', $this->qb_cache_exists)) ? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results") : $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); From 8112b5341ec02d38e448e767ab95196df9a84a74 Mon Sep 17 00:00:00 2001 From: Alex Fang Date: Fri, 23 Dec 2016 10:38:11 +0800 Subject: [PATCH 4630/5397] 1. Updated last comit with comment for https://github.com/bcit-ci/CodeIgniter/pull/4955 --- system/database/DB_query_builder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 6d165fc798f..48c85712559 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1402,7 +1402,7 @@ public function count_all_results($table = '', $reset = TRUE) $this->qb_orderby = NULL; } - $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby) OR in_array('groupby', $this->qb_cache_exists)) + $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby) OR ! empty($this->qb_cache_groupby)) ? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results") : $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); From fced25f5728ce81fe810216fcaa4ccec7523f6c9 Mon Sep 17 00:00:00 2001 From: Master Yoda Date: Sat, 31 Dec 2016 08:46:18 -0800 Subject: [PATCH 4631/5397] Update copyright data to 2017 --- .gitignore | 1 + index.php | 4 ++-- license.txt | 2 +- system/core/Benchmark.php | 4 ++-- system/core/CodeIgniter.php | 4 ++-- system/core/Common.php | 4 ++-- system/core/Config.php | 4 ++-- system/core/Controller.php | 4 ++-- system/core/Exceptions.php | 4 ++-- system/core/Hooks.php | 4 ++-- system/core/Input.php | 4 ++-- system/core/Lang.php | 4 ++-- system/core/Loader.php | 4 ++-- system/core/Log.php | 4 ++-- system/core/Model.php | 4 ++-- system/core/Output.php | 4 ++-- system/core/Router.php | 4 ++-- system/core/Security.php | 4 ++-- system/core/URI.php | 4 ++-- system/core/Utf8.php | 4 ++-- system/core/compat/hash.php | 4 ++-- system/core/compat/mbstring.php | 4 ++-- system/core/compat/password.php | 4 ++-- system/core/compat/standard.php | 4 ++-- system/database/DB.php | 4 ++-- system/database/DB_cache.php | 4 ++-- system/database/DB_driver.php | 4 ++-- system/database/DB_forge.php | 4 ++-- system/database/DB_query_builder.php | 4 ++-- system/database/DB_result.php | 4 ++-- system/database/DB_utility.php | 4 ++-- system/database/drivers/cubrid/cubrid_driver.php | 4 ++-- system/database/drivers/cubrid/cubrid_forge.php | 4 ++-- system/database/drivers/cubrid/cubrid_result.php | 4 ++-- system/database/drivers/cubrid/cubrid_utility.php | 4 ++-- system/database/drivers/ibase/ibase_driver.php | 4 ++-- system/database/drivers/ibase/ibase_forge.php | 4 ++-- system/database/drivers/ibase/ibase_result.php | 4 ++-- system/database/drivers/ibase/ibase_utility.php | 4 ++-- system/database/drivers/mssql/mssql_driver.php | 4 ++-- system/database/drivers/mssql/mssql_forge.php | 4 ++-- system/database/drivers/mssql/mssql_result.php | 4 ++-- system/database/drivers/mssql/mssql_utility.php | 4 ++-- system/database/drivers/mysql/mysql_driver.php | 4 ++-- system/database/drivers/mysql/mysql_forge.php | 4 ++-- system/database/drivers/mysql/mysql_result.php | 4 ++-- system/database/drivers/mysql/mysql_utility.php | 4 ++-- system/database/drivers/mysqli/mysqli_driver.php | 4 ++-- system/database/drivers/mysqli/mysqli_forge.php | 4 ++-- system/database/drivers/mysqli/mysqli_result.php | 4 ++-- system/database/drivers/mysqli/mysqli_utility.php | 4 ++-- system/database/drivers/oci8/oci8_driver.php | 4 ++-- system/database/drivers/oci8/oci8_forge.php | 4 ++-- system/database/drivers/oci8/oci8_result.php | 4 ++-- system/database/drivers/oci8/oci8_utility.php | 4 ++-- system/database/drivers/odbc/odbc_driver.php | 4 ++-- system/database/drivers/odbc/odbc_forge.php | 4 ++-- system/database/drivers/odbc/odbc_result.php | 4 ++-- system/database/drivers/odbc/odbc_utility.php | 4 ++-- system/database/drivers/pdo/pdo_driver.php | 4 ++-- system/database/drivers/pdo/pdo_forge.php | 4 ++-- system/database/drivers/pdo/pdo_result.php | 4 ++-- system/database/drivers/pdo/pdo_utility.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_4d_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_4d_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php | 4 ++-- .../database/drivers/pdo/subdrivers/pdo_firebird_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php | 4 ++-- .../database/drivers/pdo/subdrivers/pdo_informix_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_informix_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_oci_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_oci_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php | 4 ++-- system/database/drivers/postgre/postgre_driver.php | 4 ++-- system/database/drivers/postgre/postgre_forge.php | 4 ++-- system/database/drivers/postgre/postgre_result.php | 4 ++-- system/database/drivers/postgre/postgre_utility.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_driver.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_forge.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_result.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_utility.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_driver.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_forge.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_result.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_utility.php | 4 ++-- system/helpers/array_helper.php | 4 ++-- system/helpers/captcha_helper.php | 4 ++-- system/helpers/cookie_helper.php | 4 ++-- system/helpers/date_helper.php | 4 ++-- system/helpers/directory_helper.php | 4 ++-- system/helpers/download_helper.php | 4 ++-- system/helpers/file_helper.php | 4 ++-- system/helpers/form_helper.php | 4 ++-- system/helpers/html_helper.php | 4 ++-- system/helpers/inflector_helper.php | 4 ++-- system/helpers/language_helper.php | 4 ++-- system/helpers/number_helper.php | 4 ++-- system/helpers/path_helper.php | 4 ++-- system/helpers/security_helper.php | 4 ++-- system/helpers/string_helper.php | 4 ++-- system/helpers/text_helper.php | 4 ++-- system/helpers/typography_helper.php | 4 ++-- system/helpers/url_helper.php | 4 ++-- system/helpers/xml_helper.php | 4 ++-- system/language/english/calendar_lang.php | 4 ++-- system/language/english/date_lang.php | 4 ++-- system/language/english/db_lang.php | 4 ++-- system/language/english/email_lang.php | 4 ++-- system/language/english/form_validation_lang.php | 4 ++-- system/language/english/ftp_lang.php | 4 ++-- system/language/english/imglib_lang.php | 4 ++-- system/language/english/migration_lang.php | 4 ++-- system/language/english/number_lang.php | 4 ++-- system/language/english/pagination_lang.php | 4 ++-- system/language/english/profiler_lang.php | 4 ++-- system/language/english/unit_test_lang.php | 4 ++-- system/language/english/upload_lang.php | 4 ++-- system/libraries/Cache/Cache.php | 4 ++-- system/libraries/Cache/drivers/Cache_apc.php | 4 ++-- system/libraries/Cache/drivers/Cache_dummy.php | 4 ++-- system/libraries/Cache/drivers/Cache_file.php | 4 ++-- system/libraries/Cache/drivers/Cache_memcached.php | 4 ++-- system/libraries/Cache/drivers/Cache_redis.php | 4 ++-- system/libraries/Cache/drivers/Cache_wincache.php | 4 ++-- system/libraries/Calendar.php | 4 ++-- system/libraries/Driver.php | 4 ++-- system/libraries/Email.php | 4 ++-- system/libraries/Encrypt.php | 4 ++-- system/libraries/Encryption.php | 4 ++-- system/libraries/Form_validation.php | 4 ++-- system/libraries/Ftp.php | 4 ++-- system/libraries/Image_lib.php | 4 ++-- system/libraries/Migration.php | 4 ++-- system/libraries/Pagination.php | 4 ++-- system/libraries/Parser.php | 4 ++-- system/libraries/Profiler.php | 4 ++-- system/libraries/Session/Session.php | 4 ++-- system/libraries/Session/Session_driver.php | 4 ++-- system/libraries/Session/drivers/Session_database_driver.php | 4 ++-- system/libraries/Session/drivers/Session_files_driver.php | 4 ++-- system/libraries/Session/drivers/Session_memcached_driver.php | 4 ++-- system/libraries/Session/drivers/Session_redis_driver.php | 4 ++-- system/libraries/Table.php | 4 ++-- system/libraries/Trackback.php | 4 ++-- system/libraries/Typography.php | 4 ++-- system/libraries/Unit_test.php | 4 ++-- system/libraries/Upload.php | 4 ++-- system/libraries/User_agent.php | 4 ++-- system/libraries/Xmlrpc.php | 4 ++-- system/libraries/Xmlrpcs.php | 4 ++-- system/libraries/Zip.php | 4 ++-- user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/license.rst | 2 +- 167 files changed, 331 insertions(+), 330 deletions(-) diff --git a/.gitignore b/.gitignore index 5982f9badab..97f1d31593e 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ user_guide_src/cilexer/pycilexer.egg-info/* *.stTheme.cache *.sublime-workspace *.sublime-project +/tests/tests/ \ No newline at end of file diff --git a/index.php b/index.php index 8015672f322..b4e1fb14625 100755 --- a/index.php +++ b/index.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/license.txt b/license.txt index 388eee33763..934e126ff18 100644 --- a/license.txt +++ b/license.txt @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 - 2016, British Columbia Institute of Technology +Copyright (c) 2014 - 2017, British Columbia Institute of Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php index b1d74f78f94..b3ac79c6262 100644 --- a/system/core/Benchmark.php +++ b/system/core/Benchmark.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index 977d1427d2d..8eed52eb7cb 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Common.php b/system/core/Common.php index 48eb233c2a4..d3ffaf0cd2e 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Config.php b/system/core/Config.php index 6704a0a7e36..d7236df1fa6 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Controller.php b/system/core/Controller.php index 83b3df26c88..59a9167344c 100644 --- a/system/core/Controller.php +++ b/system/core/Controller.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php index 4e10f28310c..47d153f49f4 100644 --- a/system/core/Exceptions.php +++ b/system/core/Exceptions.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Hooks.php b/system/core/Hooks.php index 856795cbad4..f2d6f21cafc 100644 --- a/system/core/Hooks.php +++ b/system/core/Hooks.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Input.php b/system/core/Input.php index ab60e45c3a5..a7918aefb8b 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Lang.php b/system/core/Lang.php index 1fcff078a61..569b0236865 100644 --- a/system/core/Lang.php +++ b/system/core/Lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Loader.php b/system/core/Loader.php index b52296499de..9876795507e 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Log.php b/system/core/Log.php index 9021626470f..5be7baea8f6 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Model.php b/system/core/Model.php index 941881a9f30..c809e7b8400 100644 --- a/system/core/Model.php +++ b/system/core/Model.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Output.php b/system/core/Output.php index febccdaefb8..0887717d94e 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Router.php b/system/core/Router.php index 42d0e295227..e92a8f54018 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Security.php b/system/core/Security.php index fb0ca3d4e0e..0c187e72f3d 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/URI.php b/system/core/URI.php index 7f07bfe1e4b..275c07900c7 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Utf8.php b/system/core/Utf8.php index 042ca43167f..1aafbf3a3a7 100644 --- a/system/core/Utf8.php +++ b/system/core/Utf8.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.0 diff --git a/system/core/compat/hash.php b/system/core/compat/hash.php index 5fec4cc6748..c0eab490981 100644 --- a/system/core/compat/hash.php +++ b/system/core/compat/hash.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/core/compat/mbstring.php b/system/core/compat/mbstring.php index 554d10040a9..f466e1c34a0 100644 --- a/system/core/compat/mbstring.php +++ b/system/core/compat/mbstring.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/core/compat/password.php b/system/core/compat/password.php index e5842255704..84be66738ff 100644 --- a/system/core/compat/password.php +++ b/system/core/compat/password.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php index ca5046e56c0..6fd292a2663 100644 --- a/system/core/compat/standard.php +++ b/system/core/compat/standard.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/DB.php b/system/database/DB.php index 37dfdd6322c..00903503231 100644 --- a/system/database/DB.php +++ b/system/database/DB.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_cache.php b/system/database/DB_cache.php index 8855cc1b196..b74c31924e8 100644 --- a/system/database/DB_cache.php +++ b/system/database/DB_cache.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index c142a1354ba..d6e9a7df339 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index 9add5cab7a1..83b646d6e4b 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index b88ec956ac5..661f5fe6970 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_result.php b/system/database/DB_result.php index 4e2429376e0..98d8876a7ee 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index 49cd301df54..944d458814a 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index 77f591ced31..257925d8889 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php index 46a3b2185e5..27bfc146604 100644 --- a/system/database/drivers/cubrid/cubrid_forge.php +++ b/system/database/drivers/cubrid/cubrid_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/cubrid/cubrid_result.php b/system/database/drivers/cubrid/cubrid_result.php index 9cccb257067..251b70a63eb 100644 --- a/system/database/drivers/cubrid/cubrid_result.php +++ b/system/database/drivers/cubrid/cubrid_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/cubrid/cubrid_utility.php b/system/database/drivers/cubrid/cubrid_utility.php index 942fa3b4e41..555ae7a9125 100644 --- a/system/database/drivers/cubrid/cubrid_utility.php +++ b/system/database/drivers/cubrid/cubrid_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php index 671a353bc1e..106d5efaced 100644 --- a/system/database/drivers/ibase/ibase_driver.php +++ b/system/database/drivers/ibase/ibase_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/ibase/ibase_forge.php b/system/database/drivers/ibase/ibase_forge.php index b35cc3749fa..44bb24e68b8 100644 --- a/system/database/drivers/ibase/ibase_forge.php +++ b/system/database/drivers/ibase/ibase_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/ibase/ibase_result.php b/system/database/drivers/ibase/ibase_result.php index f3c21fcec24..7d7dd79acab 100644 --- a/system/database/drivers/ibase/ibase_result.php +++ b/system/database/drivers/ibase/ibase_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/ibase/ibase_utility.php b/system/database/drivers/ibase/ibase_utility.php index 619ebad0161..3c152101af8 100644 --- a/system/database/drivers/ibase/ibase_utility.php +++ b/system/database/drivers/ibase/ibase_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 76f58564b14..7709c37bb92 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php index 91b5794bc04..6b6109868e0 100644 --- a/system/database/drivers/mssql/mssql_forge.php +++ b/system/database/drivers/mssql/mssql_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mssql/mssql_result.php b/system/database/drivers/mssql/mssql_result.php index b62bf75cbb6..38a0a0574b9 100644 --- a/system/database/drivers/mssql/mssql_result.php +++ b/system/database/drivers/mssql/mssql_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mssql/mssql_utility.php b/system/database/drivers/mssql/mssql_utility.php index cd23be828eb..95ce88f1367 100644 --- a/system/database/drivers/mssql/mssql_utility.php +++ b/system/database/drivers/mssql/mssql_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 70b4f68bac0..6e445cf728b 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php index fa84be37105..7ed8f8d389e 100644 --- a/system/database/drivers/mysql/mysql_forge.php +++ b/system/database/drivers/mysql/mysql_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php index 20cade2e1fc..7aa265ebbaa 100644 --- a/system/database/drivers/mysql/mysql_result.php +++ b/system/database/drivers/mysql/mysql_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/mysql/mysql_utility.php b/system/database/drivers/mysql/mysql_utility.php index 4c1f2391b5d..bc01fc58ddf 100644 --- a/system/database/drivers/mysql/mysql_utility.php +++ b/system/database/drivers/mysql/mysql_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index cf931a35130..8c1b99caa58 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php index c17f729c0fa..c5b23b6cacb 100644 --- a/system/database/drivers/mysqli/mysqli_forge.php +++ b/system/database/drivers/mysqli/mysqli_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php index 0ce07414fec..929c2b455a7 100644 --- a/system/database/drivers/mysqli/mysqli_result.php +++ b/system/database/drivers/mysqli/mysqli_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mysqli/mysqli_utility.php b/system/database/drivers/mysqli/mysqli_utility.php index 79d9f3670f7..4a3dad4d164 100644 --- a/system/database/drivers/mysqli/mysqli_utility.php +++ b/system/database/drivers/mysqli/mysqli_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 56fdf32cf43..c7f03301947 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.4.1 diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index 23e0257574f..ac33cde0ca6 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.4.1 diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index fc860ea1225..0c3543333e9 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.4.1 diff --git a/system/database/drivers/oci8/oci8_utility.php b/system/database/drivers/oci8/oci8_utility.php index ebe49c46357..ce0dfc5f8c9 100644 --- a/system/database/drivers/oci8/oci8_utility.php +++ b/system/database/drivers/oci8/oci8_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.4.1 diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 82efa498c9c..9f5a86fa09e 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php index bac30bedc16..77b2fdf62ca 100644 --- a/system/database/drivers/odbc/odbc_forge.php +++ b/system/database/drivers/odbc/odbc_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/odbc/odbc_result.php b/system/database/drivers/odbc/odbc_result.php index 110d6ab0f1e..845aa9c79a7 100644 --- a/system/database/drivers/odbc/odbc_result.php +++ b/system/database/drivers/odbc/odbc_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/odbc/odbc_utility.php b/system/database/drivers/odbc/odbc_utility.php index 2e344963d1d..643f6ec0cb6 100644 --- a/system/database/drivers/odbc/odbc_utility.php +++ b/system/database/drivers/odbc/odbc_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 2da9cf38f94..d816dcb6458 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/pdo/pdo_forge.php b/system/database/drivers/pdo/pdo_forge.php index 2595f7b6e84..685b6776d43 100644 --- a/system/database/drivers/pdo/pdo_forge.php +++ b/system/database/drivers/pdo/pdo_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/pdo/pdo_result.php b/system/database/drivers/pdo/pdo_result.php index d1809bef255..bbc2cdc5a3e 100644 --- a/system/database/drivers/pdo/pdo_result.php +++ b/system/database/drivers/pdo/pdo_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/pdo/pdo_utility.php b/system/database/drivers/pdo/pdo_utility.php index 384661bf02a..5029cac9474 100644 --- a/system/database/drivers/pdo/pdo_utility.php +++ b/system/database/drivers/pdo/pdo_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php index 3dedfd9b37d..7eaeaa1fdca 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php index 41994f9dbfe..3f636d3bd40 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php index 4eb7f0ba67f..fc49e0dd069 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php index b5b95078e14..276cbb6bc42 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php index 9a1cbcaf4be..3249a1d7f41 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php index 83020032545..d0cca38dd64 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php index 7811d3da4f8..aa5e7d6e772 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php index 50df76905f3..20c5a689732 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php index 2366c40362b..26b556a7817 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php index a2dbfc25ac2..4238ca082bc 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php index d40d17a8804..050171f64b6 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php index 5af39b18182..2ddc2a9332c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php index 6452b787bfd..66c15dac609 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php index 9d04a8a9a84..c7a92b826b2 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php index dd1d31c260c..abf9167d6c3 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php index 705b1c711c9..c8983ee56b1 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php index ebe1ed6f0b0..f4a2f08f3a7 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php index 7c65daa8450..a2a3bada30b 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php index 05b8350d1c2..9aed3a2fe89 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php index 214b6f5282c..18e399daca1 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php index cb06c2a9d08..9b70f3ea6f4 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php index b124bcad16a..18c475b173c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php index dfccb7d696f..1cf6c614de2 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php index 56bf87f3a4c..82a0d515d8c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 9f794a12ef0..058a8044c74 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php index 8d985ba7d85..f7bbf74413b 100644 --- a/system/database/drivers/postgre/postgre_forge.php +++ b/system/database/drivers/postgre/postgre_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/postgre/postgre_result.php b/system/database/drivers/postgre/postgre_result.php index 354bb08d5bc..57864a7f34b 100644 --- a/system/database/drivers/postgre/postgre_result.php +++ b/system/database/drivers/postgre/postgre_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php index bb5e6e04b75..5ca358da525 100644 --- a/system/database/drivers/postgre/postgre_utility.php +++ b/system/database/drivers/postgre/postgre_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index 9743499bdce..2d78a0f8a03 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php index c45472f548b..5ee6daae393 100644 --- a/system/database/drivers/sqlite3/sqlite3_forge.php +++ b/system/database/drivers/sqlite3/sqlite3_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php index aa559eef685..03751f0dcd7 100644 --- a/system/database/drivers/sqlite3/sqlite3_result.php +++ b/system/database/drivers/sqlite3/sqlite3_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/sqlite3/sqlite3_utility.php b/system/database/drivers/sqlite3/sqlite3_utility.php index b47c086f60d..20d562f96a7 100644 --- a/system/database/drivers/sqlite3/sqlite3_utility.php +++ b/system/database/drivers/sqlite3/sqlite3_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index c55d5f7b757..10aad115f90 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.3 diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php index 4f0ce9d6fa6..aa8490ee4bb 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.3 diff --git a/system/database/drivers/sqlsrv/sqlsrv_result.php b/system/database/drivers/sqlsrv/sqlsrv_result.php index fde7264b98a..f784ebea854 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_result.php +++ b/system/database/drivers/sqlsrv/sqlsrv_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.3 diff --git a/system/database/drivers/sqlsrv/sqlsrv_utility.php b/system/database/drivers/sqlsrv/sqlsrv_utility.php index 726fe3ea6cb..19c93d0c682 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_utility.php +++ b/system/database/drivers/sqlsrv/sqlsrv_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.3 diff --git a/system/helpers/array_helper.php b/system/helpers/array_helper.php index 3fdccf90991..74c7c15a84e 100644 --- a/system/helpers/array_helper.php +++ b/system/helpers/array_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index f2ff4dccf14..8f44806cc89 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php index f8943fde34d..30b475ce63f 100644 --- a/system/helpers/cookie_helper.php +++ b/system/helpers/cookie_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 1f8e319caec..799c9f6d2d6 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/directory_helper.php b/system/helpers/directory_helper.php index cdc4c16bcce..2785241e6c2 100644 --- a/system/helpers/directory_helper.php +++ b/system/helpers/directory_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index 9619c61b108..b9a0e6be985 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php index 484bf32285e..6af632b0758 100644 --- a/system/helpers/file_helper.php +++ b/system/helpers/file_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index 496fc105579..9844c752a73 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index 22ef39c2e1d..b5e8ed78341 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index f14f57c54a8..49e2a53db9d 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/language_helper.php b/system/helpers/language_helper.php index 3721164b775..d26cf5b8dca 100644 --- a/system/helpers/language_helper.php +++ b/system/helpers/language_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index e7810c70672..cc8a7760c87 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/path_helper.php b/system/helpers/path_helper.php index 6c846a2116e..6896cb97bb7 100644 --- a/system/helpers/path_helper.php +++ b/system/helpers/path_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/security_helper.php b/system/helpers/security_helper.php index 048f06b6805..72736fa7db0 100644 --- a/system/helpers/security_helper.php +++ b/system/helpers/security_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php index 62b1a18e07e..311f7a420e1 100644 --- a/system/helpers/string_helper.php +++ b/system/helpers/string_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index e54ed04e149..07c01c3afc2 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/typography_helper.php b/system/helpers/typography_helper.php index 928cb6d043d..183e117bf02 100644 --- a/system/helpers/typography_helper.php +++ b/system/helpers/typography_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index 8a5a75c449f..99e82ef9fc5 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/xml_helper.php b/system/helpers/xml_helper.php index 3489da91c9f..a12ee25dbb4 100644 --- a/system/helpers/xml_helper.php +++ b/system/helpers/xml_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/calendar_lang.php b/system/language/english/calendar_lang.php index 8af5e80561b..77911e983f9 100644 --- a/system/language/english/calendar_lang.php +++ b/system/language/english/calendar_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/date_lang.php b/system/language/english/date_lang.php index 39af5a23966..bb454edfb91 100644 --- a/system/language/english/date_lang.php +++ b/system/language/english/date_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/db_lang.php b/system/language/english/db_lang.php index ed93452b493..b44bda95136 100644 --- a/system/language/english/db_lang.php +++ b/system/language/english/db_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/email_lang.php b/system/language/english/email_lang.php index 84fb0910949..22dc0fa787e 100644 --- a/system/language/english/email_lang.php +++ b/system/language/english/email_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/form_validation_lang.php b/system/language/english/form_validation_lang.php index 92d6d5ebbc0..aa9ff330b68 100644 --- a/system/language/english/form_validation_lang.php +++ b/system/language/english/form_validation_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/ftp_lang.php b/system/language/english/ftp_lang.php index 9e72bce4210..eada3e5d566 100644 --- a/system/language/english/ftp_lang.php +++ b/system/language/english/ftp_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/imglib_lang.php b/system/language/english/imglib_lang.php index 7f23233b4f7..363b9007408 100644 --- a/system/language/english/imglib_lang.php +++ b/system/language/english/imglib_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/migration_lang.php b/system/language/english/migration_lang.php index bce9210d3bc..168496090cb 100644 --- a/system/language/english/migration_lang.php +++ b/system/language/english/migration_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/language/english/number_lang.php b/system/language/english/number_lang.php index 0aaf51e72e6..9723ce5ec48 100644 --- a/system/language/english/number_lang.php +++ b/system/language/english/number_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/pagination_lang.php b/system/language/english/pagination_lang.php index 4d36bdee862..d24dd047bcf 100644 --- a/system/language/english/pagination_lang.php +++ b/system/language/english/pagination_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/profiler_lang.php b/system/language/english/profiler_lang.php index 2d8fa51f461..20949a20a15 100644 --- a/system/language/english/profiler_lang.php +++ b/system/language/english/profiler_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/unit_test_lang.php b/system/language/english/unit_test_lang.php index 29a4137a537..a89cb2d93f3 100644 --- a/system/language/english/unit_test_lang.php +++ b/system/language/english/unit_test_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/upload_lang.php b/system/language/english/upload_lang.php index 058dca9939f..ec611f9ace8 100644 --- a/system/language/english/upload_lang.php +++ b/system/language/english/upload_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php index 349af15794e..267dffb0927 100644 --- a/system/libraries/Cache/Cache.php +++ b/system/libraries/Cache/Cache.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.0 diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php index fb8df03a7ef..f2b61adb157 100644 --- a/system/libraries/Cache/drivers/Cache_apc.php +++ b/system/libraries/Cache/drivers/Cache_apc.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.0 diff --git a/system/libraries/Cache/drivers/Cache_dummy.php b/system/libraries/Cache/drivers/Cache_dummy.php index 4323a68af24..c6d9a61f141 100644 --- a/system/libraries/Cache/drivers/Cache_dummy.php +++ b/system/libraries/Cache/drivers/Cache_dummy.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index 93932d4cf95..8a36e9d7994 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index ab8bfab8b98..73584278d22 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index 2d1ead45213..bb26b3b47f5 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Cache/drivers/Cache_wincache.php b/system/libraries/Cache/drivers/Cache_wincache.php index d6a0d4fb6b8..f296a5e26d6 100644 --- a/system/libraries/Cache/drivers/Cache_wincache.php +++ b/system/libraries/Cache/drivers/Cache_wincache.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php index 1f8ef814f7c..edb0fb4d904 100644 --- a/system/libraries/Calendar.php +++ b/system/libraries/Calendar.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index 38c6aefe696..00e8416f940 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 1191e2350bb..fbf0cb7dc04 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php index 1372a311fe2..46f3747262b 100644 --- a/system/libraries/Encrypt.php +++ b/system/libraries/Encrypt.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Encryption.php b/system/libraries/Encryption.php index c68ee25848a..6799d0fef6e 100644 --- a/system/libraries/Encryption.php +++ b/system/libraries/Encryption.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index c2bc22f954d..6f654deb4a7 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Ftp.php b/system/libraries/Ftp.php index 88f2658087b..ac960a419a3 100644 --- a/system/libraries/Ftp.php +++ b/system/libraries/Ftp.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 884d0dcec8f..0685692de86 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index 3e2107e83c0..2a87d9d7c2a 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index 44f848fe035..1df5f9cd550 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Parser.php b/system/libraries/Parser.php index 22cffb2c48a..fdd958b2279 100644 --- a/system/libraries/Parser.php +++ b/system/libraries/Parser.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index cf455d3dab9..e9e03cfe063 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index 9d3bd7a2f06..3e4865cd149 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.0 diff --git a/system/libraries/Session/Session_driver.php b/system/libraries/Session/Session_driver.php index 55ddb25e0cc..f32f14ae059 100644 --- a/system/libraries/Session/Session_driver.php +++ b/system/libraries/Session/Session_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index 2f524125643..31f5a46631b 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index 37315d3cd07..6016e094e27 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index eb1dcd3d8e3..2556bf0f7bf 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index 233b156192a..5313de04c13 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Table.php b/system/libraries/Table.php index 2f1b3b41404..dc309890ba4 100644 --- a/system/libraries/Table.php +++ b/system/libraries/Table.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.1 diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index 7222c00c210..55e9a0ee68a 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Typography.php b/system/libraries/Typography.php index c45398bdca4..ce31ba317f1 100644 --- a/system/libraries/Typography.php +++ b/system/libraries/Typography.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php index 3122ed624b1..38e0fbd2496 100644 --- a/system/libraries/Unit_test.php +++ b/system/libraries/Unit_test.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.1 diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index ac5c9e42d26..3a1731e58a1 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/User_agent.php b/system/libraries/User_agent.php index 60d1599668a..cda3ef0a0d7 100644 --- a/system/libraries/User_agent.php +++ b/system/libraries/User_agent.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index 87f609e8dad..7af96c23382 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php index f343a7ec06c..21de937c8b3 100644 --- a/system/libraries/Xmlrpcs.php +++ b/system/libraries/Xmlrpcs.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index 82a43e9c972..d6974b13ad2 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 4714b0d62a1..e0312d3c17c 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -41,7 +41,7 @@ # General information about the project. project = u'CodeIgniter' -copyright = u'2014 - 2016, British Columbia Institute of Technology' +copyright = u'2014 - 2017, British Columbia Institute of Technology' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -229,7 +229,7 @@ epub_title = u'CodeIgniter' epub_author = u'British Columbia Institute of Technology' epub_publisher = u'British Columbia Institute of Technology' -epub_copyright = u'2014 - 2016, British Columbia Institute of Technology' +epub_copyright = u'2014 - 2017, British Columbia Institute of Technology' # The language of the text. It defaults to the language option # or en if the language is not set. diff --git a/user_guide_src/source/license.rst b/user_guide_src/source/license.rst index 3f7b2f58bcb..c943c294a31 100644 --- a/user_guide_src/source/license.rst +++ b/user_guide_src/source/license.rst @@ -2,7 +2,7 @@ The MIT License (MIT) ##################### -Copyright (c) 2014 - 2016, British Columbia Institute of Technology +Copyright (c) 2014 - 2017, British Columbia Institute of Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From da60e9bc66ec90970fbd2dfd08b0a6e66b9f5f5f Mon Sep 17 00:00:00 2001 From: Master Yoda Date: Sat, 31 Dec 2016 08:46:18 -0800 Subject: [PATCH 4632/5397] Update copyright data to 2017 --- .gitignore | 1 + index.php | 4 ++-- license.txt | 2 +- system/core/Benchmark.php | 4 ++-- system/core/CodeIgniter.php | 4 ++-- system/core/Common.php | 4 ++-- system/core/Config.php | 4 ++-- system/core/Controller.php | 4 ++-- system/core/Exceptions.php | 4 ++-- system/core/Hooks.php | 4 ++-- system/core/Input.php | 4 ++-- system/core/Lang.php | 4 ++-- system/core/Loader.php | 4 ++-- system/core/Log.php | 4 ++-- system/core/Model.php | 4 ++-- system/core/Output.php | 4 ++-- system/core/Router.php | 4 ++-- system/core/Security.php | 4 ++-- system/core/URI.php | 4 ++-- system/core/Utf8.php | 4 ++-- system/core/compat/hash.php | 4 ++-- system/core/compat/mbstring.php | 4 ++-- system/core/compat/password.php | 4 ++-- system/core/compat/standard.php | 4 ++-- system/database/DB.php | 4 ++-- system/database/DB_cache.php | 4 ++-- system/database/DB_driver.php | 4 ++-- system/database/DB_forge.php | 4 ++-- system/database/DB_query_builder.php | 4 ++-- system/database/DB_result.php | 4 ++-- system/database/DB_utility.php | 4 ++-- system/database/drivers/cubrid/cubrid_driver.php | 4 ++-- system/database/drivers/cubrid/cubrid_forge.php | 4 ++-- system/database/drivers/cubrid/cubrid_result.php | 4 ++-- system/database/drivers/cubrid/cubrid_utility.php | 4 ++-- system/database/drivers/ibase/ibase_driver.php | 4 ++-- system/database/drivers/ibase/ibase_forge.php | 4 ++-- system/database/drivers/ibase/ibase_result.php | 4 ++-- system/database/drivers/ibase/ibase_utility.php | 4 ++-- system/database/drivers/mssql/mssql_driver.php | 4 ++-- system/database/drivers/mssql/mssql_forge.php | 4 ++-- system/database/drivers/mssql/mssql_result.php | 4 ++-- system/database/drivers/mssql/mssql_utility.php | 4 ++-- system/database/drivers/mysql/mysql_driver.php | 4 ++-- system/database/drivers/mysql/mysql_forge.php | 4 ++-- system/database/drivers/mysql/mysql_result.php | 4 ++-- system/database/drivers/mysql/mysql_utility.php | 4 ++-- system/database/drivers/mysqli/mysqli_driver.php | 4 ++-- system/database/drivers/mysqli/mysqli_forge.php | 4 ++-- system/database/drivers/mysqli/mysqli_result.php | 4 ++-- system/database/drivers/mysqli/mysqli_utility.php | 4 ++-- system/database/drivers/oci8/oci8_driver.php | 4 ++-- system/database/drivers/oci8/oci8_forge.php | 4 ++-- system/database/drivers/oci8/oci8_result.php | 4 ++-- system/database/drivers/oci8/oci8_utility.php | 4 ++-- system/database/drivers/odbc/odbc_driver.php | 4 ++-- system/database/drivers/odbc/odbc_forge.php | 4 ++-- system/database/drivers/odbc/odbc_result.php | 4 ++-- system/database/drivers/odbc/odbc_utility.php | 4 ++-- system/database/drivers/pdo/pdo_driver.php | 4 ++-- system/database/drivers/pdo/pdo_forge.php | 4 ++-- system/database/drivers/pdo/pdo_result.php | 4 ++-- system/database/drivers/pdo/pdo_utility.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_4d_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_4d_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php | 4 ++-- .../database/drivers/pdo/subdrivers/pdo_firebird_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php | 4 ++-- .../database/drivers/pdo/subdrivers/pdo_informix_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_informix_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_oci_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_oci_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php | 4 ++-- system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php | 4 ++-- system/database/drivers/postgre/postgre_driver.php | 4 ++-- system/database/drivers/postgre/postgre_forge.php | 4 ++-- system/database/drivers/postgre/postgre_result.php | 4 ++-- system/database/drivers/postgre/postgre_utility.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_driver.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_forge.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_result.php | 4 ++-- system/database/drivers/sqlite3/sqlite3_utility.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_driver.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_forge.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_result.php | 4 ++-- system/database/drivers/sqlsrv/sqlsrv_utility.php | 4 ++-- system/helpers/array_helper.php | 4 ++-- system/helpers/captcha_helper.php | 4 ++-- system/helpers/cookie_helper.php | 4 ++-- system/helpers/date_helper.php | 4 ++-- system/helpers/directory_helper.php | 4 ++-- system/helpers/download_helper.php | 4 ++-- system/helpers/file_helper.php | 4 ++-- system/helpers/form_helper.php | 4 ++-- system/helpers/html_helper.php | 4 ++-- system/helpers/inflector_helper.php | 4 ++-- system/helpers/language_helper.php | 4 ++-- system/helpers/number_helper.php | 4 ++-- system/helpers/path_helper.php | 4 ++-- system/helpers/security_helper.php | 4 ++-- system/helpers/string_helper.php | 4 ++-- system/helpers/text_helper.php | 4 ++-- system/helpers/typography_helper.php | 4 ++-- system/helpers/url_helper.php | 4 ++-- system/helpers/xml_helper.php | 4 ++-- system/language/english/calendar_lang.php | 4 ++-- system/language/english/date_lang.php | 4 ++-- system/language/english/db_lang.php | 4 ++-- system/language/english/email_lang.php | 4 ++-- system/language/english/form_validation_lang.php | 4 ++-- system/language/english/ftp_lang.php | 4 ++-- system/language/english/imglib_lang.php | 4 ++-- system/language/english/migration_lang.php | 4 ++-- system/language/english/number_lang.php | 4 ++-- system/language/english/pagination_lang.php | 4 ++-- system/language/english/profiler_lang.php | 4 ++-- system/language/english/unit_test_lang.php | 4 ++-- system/language/english/upload_lang.php | 4 ++-- system/libraries/Cache/Cache.php | 4 ++-- system/libraries/Cache/drivers/Cache_apc.php | 4 ++-- system/libraries/Cache/drivers/Cache_dummy.php | 4 ++-- system/libraries/Cache/drivers/Cache_file.php | 4 ++-- system/libraries/Cache/drivers/Cache_memcached.php | 4 ++-- system/libraries/Cache/drivers/Cache_redis.php | 4 ++-- system/libraries/Cache/drivers/Cache_wincache.php | 4 ++-- system/libraries/Calendar.php | 4 ++-- system/libraries/Driver.php | 4 ++-- system/libraries/Email.php | 4 ++-- system/libraries/Encrypt.php | 4 ++-- system/libraries/Encryption.php | 4 ++-- system/libraries/Form_validation.php | 4 ++-- system/libraries/Ftp.php | 4 ++-- system/libraries/Image_lib.php | 4 ++-- system/libraries/Migration.php | 4 ++-- system/libraries/Pagination.php | 4 ++-- system/libraries/Parser.php | 4 ++-- system/libraries/Profiler.php | 4 ++-- system/libraries/Session/Session.php | 4 ++-- system/libraries/Session/Session_driver.php | 4 ++-- system/libraries/Session/drivers/Session_database_driver.php | 4 ++-- system/libraries/Session/drivers/Session_files_driver.php | 4 ++-- system/libraries/Session/drivers/Session_memcached_driver.php | 4 ++-- system/libraries/Session/drivers/Session_redis_driver.php | 4 ++-- system/libraries/Table.php | 4 ++-- system/libraries/Trackback.php | 4 ++-- system/libraries/Typography.php | 4 ++-- system/libraries/Unit_test.php | 4 ++-- system/libraries/Upload.php | 4 ++-- system/libraries/User_agent.php | 4 ++-- system/libraries/Xmlrpc.php | 4 ++-- system/libraries/Xmlrpcs.php | 4 ++-- system/libraries/Zip.php | 4 ++-- user_guide_src/source/conf.py | 4 ++-- user_guide_src/source/license.rst | 2 +- 167 files changed, 331 insertions(+), 330 deletions(-) diff --git a/.gitignore b/.gitignore index 5982f9badab..97f1d31593e 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ user_guide_src/cilexer/pycilexer.egg-info/* *.stTheme.cache *.sublime-workspace *.sublime-project +/tests/tests/ \ No newline at end of file diff --git a/index.php b/index.php index d02b6bb3899..c27a78ea597 100755 --- a/index.php +++ b/index.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/license.txt b/license.txt index 388eee33763..934e126ff18 100644 --- a/license.txt +++ b/license.txt @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 - 2016, British Columbia Institute of Technology +Copyright (c) 2014 - 2017, British Columbia Institute of Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php index b1d74f78f94..b3ac79c6262 100644 --- a/system/core/Benchmark.php +++ b/system/core/Benchmark.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index c9cb5c89fad..77365b1c3ce 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Common.php b/system/core/Common.php index 91c585f7dcd..7b3eb6a4ec9 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Config.php b/system/core/Config.php index 9fd3e4a7da4..cda62241b2f 100644 --- a/system/core/Config.php +++ b/system/core/Config.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Controller.php b/system/core/Controller.php index 83b3df26c88..59a9167344c 100644 --- a/system/core/Controller.php +++ b/system/core/Controller.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php index 4e10f28310c..47d153f49f4 100644 --- a/system/core/Exceptions.php +++ b/system/core/Exceptions.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Hooks.php b/system/core/Hooks.php index 856795cbad4..f2d6f21cafc 100644 --- a/system/core/Hooks.php +++ b/system/core/Hooks.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Input.php b/system/core/Input.php index 24fe8a9cc2f..d7cd292619d 100644 --- a/system/core/Input.php +++ b/system/core/Input.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Lang.php b/system/core/Lang.php index 1fcff078a61..569b0236865 100644 --- a/system/core/Lang.php +++ b/system/core/Lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Loader.php b/system/core/Loader.php index 1111481b776..0515723b452 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Log.php b/system/core/Log.php index cf6c75a950f..3e11b35f586 100644 --- a/system/core/Log.php +++ b/system/core/Log.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Model.php b/system/core/Model.php index 941881a9f30..c809e7b8400 100644 --- a/system/core/Model.php +++ b/system/core/Model.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Output.php b/system/core/Output.php index 57c78ab1943..349955cd26b 100644 --- a/system/core/Output.php +++ b/system/core/Output.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Router.php b/system/core/Router.php index 045d3668754..1abe4c4e513 100644 --- a/system/core/Router.php +++ b/system/core/Router.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Security.php b/system/core/Security.php index d0308c5f95b..8b313a9a2f2 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/URI.php b/system/core/URI.php index 544f6c85f0d..3ccdfa7b049 100644 --- a/system/core/URI.php +++ b/system/core/URI.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/core/Utf8.php b/system/core/Utf8.php index f2f42e6ca6c..dfbbfff2c8a 100644 --- a/system/core/Utf8.php +++ b/system/core/Utf8.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.0 diff --git a/system/core/compat/hash.php b/system/core/compat/hash.php index d567d0f80e3..ba0198e104f 100644 --- a/system/core/compat/hash.php +++ b/system/core/compat/hash.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/core/compat/mbstring.php b/system/core/compat/mbstring.php index 554d10040a9..f466e1c34a0 100644 --- a/system/core/compat/mbstring.php +++ b/system/core/compat/mbstring.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/core/compat/password.php b/system/core/compat/password.php index 1b5219e7b1d..b209cbe7065 100644 --- a/system/core/compat/password.php +++ b/system/core/compat/password.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php index 6b7caa48524..7db2efb5747 100644 --- a/system/core/compat/standard.php +++ b/system/core/compat/standard.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/DB.php b/system/database/DB.php index b4b7767e8a7..c19eef72cfe 100644 --- a/system/database/DB.php +++ b/system/database/DB.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_cache.php b/system/database/DB_cache.php index 8855cc1b196..b74c31924e8 100644 --- a/system/database/DB_cache.php +++ b/system/database/DB_cache.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php index 151340596de..19afdd49235 100644 --- a/system/database/DB_driver.php +++ b/system/database/DB_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index ed6f4b672bc..2b2ff1c2400 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index b88ec956ac5..661f5fe6970 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_result.php b/system/database/DB_result.php index 4e2429376e0..98d8876a7ee 100644 --- a/system/database/DB_result.php +++ b/system/database/DB_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php index 70528286c9d..25d842c0994 100644 --- a/system/database/DB_utility.php +++ b/system/database/DB_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php index 77f591ced31..257925d8889 100644 --- a/system/database/drivers/cubrid/cubrid_driver.php +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php index 46a3b2185e5..27bfc146604 100644 --- a/system/database/drivers/cubrid/cubrid_forge.php +++ b/system/database/drivers/cubrid/cubrid_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/cubrid/cubrid_result.php b/system/database/drivers/cubrid/cubrid_result.php index 9cccb257067..251b70a63eb 100644 --- a/system/database/drivers/cubrid/cubrid_result.php +++ b/system/database/drivers/cubrid/cubrid_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/cubrid/cubrid_utility.php b/system/database/drivers/cubrid/cubrid_utility.php index 942fa3b4e41..555ae7a9125 100644 --- a/system/database/drivers/cubrid/cubrid_utility.php +++ b/system/database/drivers/cubrid/cubrid_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php index 671a353bc1e..106d5efaced 100644 --- a/system/database/drivers/ibase/ibase_driver.php +++ b/system/database/drivers/ibase/ibase_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/ibase/ibase_forge.php b/system/database/drivers/ibase/ibase_forge.php index b35cc3749fa..44bb24e68b8 100644 --- a/system/database/drivers/ibase/ibase_forge.php +++ b/system/database/drivers/ibase/ibase_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/ibase/ibase_result.php b/system/database/drivers/ibase/ibase_result.php index f3c21fcec24..7d7dd79acab 100644 --- a/system/database/drivers/ibase/ibase_result.php +++ b/system/database/drivers/ibase/ibase_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/ibase/ibase_utility.php b/system/database/drivers/ibase/ibase_utility.php index 619ebad0161..3c152101af8 100644 --- a/system/database/drivers/ibase/ibase_utility.php +++ b/system/database/drivers/ibase/ibase_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 66d7572e49f..f0cfb2ff95b 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php index 91b5794bc04..6b6109868e0 100644 --- a/system/database/drivers/mssql/mssql_forge.php +++ b/system/database/drivers/mssql/mssql_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mssql/mssql_result.php b/system/database/drivers/mssql/mssql_result.php index b62bf75cbb6..38a0a0574b9 100644 --- a/system/database/drivers/mssql/mssql_result.php +++ b/system/database/drivers/mssql/mssql_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mssql/mssql_utility.php b/system/database/drivers/mssql/mssql_utility.php index cd23be828eb..95ce88f1367 100644 --- a/system/database/drivers/mssql/mssql_utility.php +++ b/system/database/drivers/mssql/mssql_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php index 7804dda5838..8f2dd744d19 100644 --- a/system/database/drivers/mysql/mysql_driver.php +++ b/system/database/drivers/mysql/mysql_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php index fa84be37105..7ed8f8d389e 100644 --- a/system/database/drivers/mysql/mysql_forge.php +++ b/system/database/drivers/mysql/mysql_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php index 20cade2e1fc..7aa265ebbaa 100644 --- a/system/database/drivers/mysql/mysql_result.php +++ b/system/database/drivers/mysql/mysql_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/mysql/mysql_utility.php b/system/database/drivers/mysql/mysql_utility.php index 4c1f2391b5d..bc01fc58ddf 100644 --- a/system/database/drivers/mysql/mysql_utility.php +++ b/system/database/drivers/mysql/mysql_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 4a14eea9314..7e429047424 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php index c17f729c0fa..c5b23b6cacb 100644 --- a/system/database/drivers/mysqli/mysqli_forge.php +++ b/system/database/drivers/mysqli/mysqli_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php index 0ce07414fec..929c2b455a7 100644 --- a/system/database/drivers/mysqli/mysqli_result.php +++ b/system/database/drivers/mysqli/mysqli_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/mysqli/mysqli_utility.php b/system/database/drivers/mysqli/mysqli_utility.php index 79d9f3670f7..4a3dad4d164 100644 --- a/system/database/drivers/mysqli/mysqli_utility.php +++ b/system/database/drivers/mysqli/mysqli_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php index 56fdf32cf43..c7f03301947 100644 --- a/system/database/drivers/oci8/oci8_driver.php +++ b/system/database/drivers/oci8/oci8_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.4.1 diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php index 23e0257574f..ac33cde0ca6 100644 --- a/system/database/drivers/oci8/oci8_forge.php +++ b/system/database/drivers/oci8/oci8_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.4.1 diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php index fc860ea1225..0c3543333e9 100644 --- a/system/database/drivers/oci8/oci8_result.php +++ b/system/database/drivers/oci8/oci8_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.4.1 diff --git a/system/database/drivers/oci8/oci8_utility.php b/system/database/drivers/oci8/oci8_utility.php index ebe49c46357..ce0dfc5f8c9 100644 --- a/system/database/drivers/oci8/oci8_utility.php +++ b/system/database/drivers/oci8/oci8_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.4.1 diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php index 82efa498c9c..9f5a86fa09e 100644 --- a/system/database/drivers/odbc/odbc_driver.php +++ b/system/database/drivers/odbc/odbc_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php index bac30bedc16..77b2fdf62ca 100644 --- a/system/database/drivers/odbc/odbc_forge.php +++ b/system/database/drivers/odbc/odbc_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/odbc/odbc_result.php b/system/database/drivers/odbc/odbc_result.php index 110d6ab0f1e..845aa9c79a7 100644 --- a/system/database/drivers/odbc/odbc_result.php +++ b/system/database/drivers/odbc/odbc_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/odbc/odbc_utility.php b/system/database/drivers/odbc/odbc_utility.php index 2e344963d1d..643f6ec0cb6 100644 --- a/system/database/drivers/odbc/odbc_utility.php +++ b/system/database/drivers/odbc/odbc_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php index 2da9cf38f94..d816dcb6458 100644 --- a/system/database/drivers/pdo/pdo_driver.php +++ b/system/database/drivers/pdo/pdo_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/pdo/pdo_forge.php b/system/database/drivers/pdo/pdo_forge.php index 2595f7b6e84..685b6776d43 100644 --- a/system/database/drivers/pdo/pdo_forge.php +++ b/system/database/drivers/pdo/pdo_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/pdo/pdo_result.php b/system/database/drivers/pdo/pdo_result.php index d1809bef255..bbc2cdc5a3e 100644 --- a/system/database/drivers/pdo/pdo_result.php +++ b/system/database/drivers/pdo/pdo_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/pdo/pdo_utility.php b/system/database/drivers/pdo/pdo_utility.php index 384661bf02a..5029cac9474 100644 --- a/system/database/drivers/pdo/pdo_utility.php +++ b/system/database/drivers/pdo/pdo_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.1.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php index 3dedfd9b37d..7eaeaa1fdca 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php index 41994f9dbfe..3f636d3bd40 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php index 4eb7f0ba67f..fc49e0dd069 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php index b5b95078e14..276cbb6bc42 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php index 9a1cbcaf4be..3249a1d7f41 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php index 83020032545..d0cca38dd64 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php index 7811d3da4f8..aa5e7d6e772 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php index 50df76905f3..20c5a689732 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php index 2366c40362b..26b556a7817 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php index a2dbfc25ac2..4238ca082bc 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php index d40d17a8804..050171f64b6 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php index 5af39b18182..2ddc2a9332c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php index 6452b787bfd..66c15dac609 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php index 9d04a8a9a84..c7a92b826b2 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php index dd1d31c260c..abf9167d6c3 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php index 705b1c711c9..c8983ee56b1 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php index ebe1ed6f0b0..f4a2f08f3a7 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php index 7c65daa8450..a2a3bada30b 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php index 05b8350d1c2..9aed3a2fe89 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php index 214b6f5282c..18e399daca1 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php index cb06c2a9d08..9b70f3ea6f4 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php index b124bcad16a..18c475b173c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php index dfccb7d696f..1cf6c614de2 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php index 56bf87f3a4c..82a0d515d8c 100644 --- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php index 51916fcc128..cef464af4e6 100644 --- a/system/database/drivers/postgre/postgre_driver.php +++ b/system/database/drivers/postgre/postgre_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php index 8d985ba7d85..f7bbf74413b 100644 --- a/system/database/drivers/postgre/postgre_forge.php +++ b/system/database/drivers/postgre/postgre_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/postgre/postgre_result.php b/system/database/drivers/postgre/postgre_result.php index 354bb08d5bc..57864a7f34b 100644 --- a/system/database/drivers/postgre/postgre_result.php +++ b/system/database/drivers/postgre/postgre_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php index bb5e6e04b75..5ca358da525 100644 --- a/system/database/drivers/postgre/postgre_utility.php +++ b/system/database/drivers/postgre/postgre_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php index 9743499bdce..2d78a0f8a03 100644 --- a/system/database/drivers/sqlite3/sqlite3_driver.php +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php index c45472f548b..5ee6daae393 100644 --- a/system/database/drivers/sqlite3/sqlite3_forge.php +++ b/system/database/drivers/sqlite3/sqlite3_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php index aa559eef685..03751f0dcd7 100644 --- a/system/database/drivers/sqlite3/sqlite3_result.php +++ b/system/database/drivers/sqlite3/sqlite3_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/sqlite3/sqlite3_utility.php b/system/database/drivers/sqlite3/sqlite3_utility.php index b47c086f60d..20d562f96a7 100644 --- a/system/database/drivers/sqlite3/sqlite3_utility.php +++ b/system/database/drivers/sqlite3/sqlite3_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php index c55d5f7b757..10aad115f90 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.3 diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php index 4f0ce9d6fa6..aa8490ee4bb 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.3 diff --git a/system/database/drivers/sqlsrv/sqlsrv_result.php b/system/database/drivers/sqlsrv/sqlsrv_result.php index fde7264b98a..f784ebea854 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_result.php +++ b/system/database/drivers/sqlsrv/sqlsrv_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.3 diff --git a/system/database/drivers/sqlsrv/sqlsrv_utility.php b/system/database/drivers/sqlsrv/sqlsrv_utility.php index 726fe3ea6cb..19c93d0c682 100644 --- a/system/database/drivers/sqlsrv/sqlsrv_utility.php +++ b/system/database/drivers/sqlsrv/sqlsrv_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.3 diff --git a/system/helpers/array_helper.php b/system/helpers/array_helper.php index 3fdccf90991..74c7c15a84e 100644 --- a/system/helpers/array_helper.php +++ b/system/helpers/array_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php index f2ff4dccf14..8f44806cc89 100644 --- a/system/helpers/captcha_helper.php +++ b/system/helpers/captcha_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php index ca432449571..bb90cba1e4c 100644 --- a/system/helpers/cookie_helper.php +++ b/system/helpers/cookie_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php index 0606a45623a..bb150426024 100644 --- a/system/helpers/date_helper.php +++ b/system/helpers/date_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/directory_helper.php b/system/helpers/directory_helper.php index cdc4c16bcce..2785241e6c2 100644 --- a/system/helpers/directory_helper.php +++ b/system/helpers/directory_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php index a6463dfd754..b2a1458decc 100644 --- a/system/helpers/download_helper.php +++ b/system/helpers/download_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php index 3cb36a551f0..d227f4684af 100644 --- a/system/helpers/file_helper.php +++ b/system/helpers/file_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php index aa7379f77bf..fc7d2a6a092 100644 --- a/system/helpers/form_helper.php +++ b/system/helpers/form_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php index fdc463fcae1..de1b92cde50 100644 --- a/system/helpers/html_helper.php +++ b/system/helpers/html_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php index f54dac019e9..26a5a5ca91c 100644 --- a/system/helpers/inflector_helper.php +++ b/system/helpers/inflector_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/language_helper.php b/system/helpers/language_helper.php index 3721164b775..d26cf5b8dca 100644 --- a/system/helpers/language_helper.php +++ b/system/helpers/language_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php index e7810c70672..cc8a7760c87 100644 --- a/system/helpers/number_helper.php +++ b/system/helpers/number_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/path_helper.php b/system/helpers/path_helper.php index 6c846a2116e..6896cb97bb7 100644 --- a/system/helpers/path_helper.php +++ b/system/helpers/path_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/security_helper.php b/system/helpers/security_helper.php index 4eb63883daa..5e2970a5c4c 100644 --- a/system/helpers/security_helper.php +++ b/system/helpers/security_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php index db531fa9aab..23608e5f408 100644 --- a/system/helpers/string_helper.php +++ b/system/helpers/string_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php index e54ed04e149..07c01c3afc2 100644 --- a/system/helpers/text_helper.php +++ b/system/helpers/text_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/typography_helper.php b/system/helpers/typography_helper.php index 928cb6d043d..183e117bf02 100644 --- a/system/helpers/typography_helper.php +++ b/system/helpers/typography_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php index fd7b5e116f3..84023affdb6 100644 --- a/system/helpers/url_helper.php +++ b/system/helpers/url_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/xml_helper.php b/system/helpers/xml_helper.php index 3489da91c9f..a12ee25dbb4 100644 --- a/system/helpers/xml_helper.php +++ b/system/helpers/xml_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/calendar_lang.php b/system/language/english/calendar_lang.php index 8af5e80561b..77911e983f9 100644 --- a/system/language/english/calendar_lang.php +++ b/system/language/english/calendar_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/date_lang.php b/system/language/english/date_lang.php index 39af5a23966..bb454edfb91 100644 --- a/system/language/english/date_lang.php +++ b/system/language/english/date_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/db_lang.php b/system/language/english/db_lang.php index ed93452b493..b44bda95136 100644 --- a/system/language/english/db_lang.php +++ b/system/language/english/db_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/email_lang.php b/system/language/english/email_lang.php index 84fb0910949..22dc0fa787e 100644 --- a/system/language/english/email_lang.php +++ b/system/language/english/email_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/form_validation_lang.php b/system/language/english/form_validation_lang.php index 92d6d5ebbc0..aa9ff330b68 100644 --- a/system/language/english/form_validation_lang.php +++ b/system/language/english/form_validation_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/ftp_lang.php b/system/language/english/ftp_lang.php index 9e72bce4210..eada3e5d566 100644 --- a/system/language/english/ftp_lang.php +++ b/system/language/english/ftp_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/imglib_lang.php b/system/language/english/imglib_lang.php index 7f23233b4f7..363b9007408 100644 --- a/system/language/english/imglib_lang.php +++ b/system/language/english/imglib_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/migration_lang.php b/system/language/english/migration_lang.php index bce9210d3bc..168496090cb 100644 --- a/system/language/english/migration_lang.php +++ b/system/language/english/migration_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/language/english/number_lang.php b/system/language/english/number_lang.php index 0aaf51e72e6..9723ce5ec48 100644 --- a/system/language/english/number_lang.php +++ b/system/language/english/number_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/pagination_lang.php b/system/language/english/pagination_lang.php index 4d36bdee862..d24dd047bcf 100644 --- a/system/language/english/pagination_lang.php +++ b/system/language/english/pagination_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/profiler_lang.php b/system/language/english/profiler_lang.php index 2d8fa51f461..20949a20a15 100644 --- a/system/language/english/profiler_lang.php +++ b/system/language/english/profiler_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/unit_test_lang.php b/system/language/english/unit_test_lang.php index 29a4137a537..a89cb2d93f3 100644 --- a/system/language/english/unit_test_lang.php +++ b/system/language/english/unit_test_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/language/english/upload_lang.php b/system/language/english/upload_lang.php index 058dca9939f..ec611f9ace8 100644 --- a/system/language/english/upload_lang.php +++ b/system/language/english/upload_lang.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php index 349af15794e..267dffb0927 100644 --- a/system/libraries/Cache/Cache.php +++ b/system/libraries/Cache/Cache.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.0 diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php index fb8df03a7ef..f2b61adb157 100644 --- a/system/libraries/Cache/drivers/Cache_apc.php +++ b/system/libraries/Cache/drivers/Cache_apc.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.0 diff --git a/system/libraries/Cache/drivers/Cache_dummy.php b/system/libraries/Cache/drivers/Cache_dummy.php index 4323a68af24..c6d9a61f141 100644 --- a/system/libraries/Cache/drivers/Cache_dummy.php +++ b/system/libraries/Cache/drivers/Cache_dummy.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php index 93932d4cf95..8a36e9d7994 100644 --- a/system/libraries/Cache/drivers/Cache_file.php +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php index 836336d469d..17e361107df 100644 --- a/system/libraries/Cache/drivers/Cache_memcached.php +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0 diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php index d4d95ebb183..ac67be07788 100644 --- a/system/libraries/Cache/drivers/Cache_redis.php +++ b/system/libraries/Cache/drivers/Cache_redis.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Cache/drivers/Cache_wincache.php b/system/libraries/Cache/drivers/Cache_wincache.php index d6a0d4fb6b8..f296a5e26d6 100644 --- a/system/libraries/Cache/drivers/Cache_wincache.php +++ b/system/libraries/Cache/drivers/Cache_wincache.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php index 1f8ef814f7c..edb0fb4d904 100644 --- a/system/libraries/Calendar.php +++ b/system/libraries/Calendar.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php index 38c6aefe696..00e8416f940 100644 --- a/system/libraries/Driver.php +++ b/system/libraries/Driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Email.php b/system/libraries/Email.php index 2e6f5be90df..4ab873586c3 100644 --- a/system/libraries/Email.php +++ b/system/libraries/Email.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php index 1372a311fe2..46f3747262b 100644 --- a/system/libraries/Encrypt.php +++ b/system/libraries/Encrypt.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Encryption.php b/system/libraries/Encryption.php index 545081b3b76..74832ede6ec 100644 --- a/system/libraries/Encryption.php +++ b/system/libraries/Encryption.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php index c39b65d8924..4f679a17f34 100644 --- a/system/libraries/Form_validation.php +++ b/system/libraries/Form_validation.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Ftp.php b/system/libraries/Ftp.php index 88f2658087b..ac960a419a3 100644 --- a/system/libraries/Ftp.php +++ b/system/libraries/Ftp.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php index 475649c462f..3e45cb845c0 100644 --- a/system/libraries/Image_lib.php +++ b/system/libraries/Image_lib.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php index 3e2107e83c0..2a87d9d7c2a 100644 --- a/system/libraries/Migration.php +++ b/system/libraries/Migration.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php index 44f848fe035..1df5f9cd550 100644 --- a/system/libraries/Pagination.php +++ b/system/libraries/Pagination.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Parser.php b/system/libraries/Parser.php index 22cffb2c48a..fdd958b2279 100644 --- a/system/libraries/Parser.php +++ b/system/libraries/Parser.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php index cf455d3dab9..e9e03cfe063 100644 --- a/system/libraries/Profiler.php +++ b/system/libraries/Profiler.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php index 01989d2d71b..eb433de64de 100644 --- a/system/libraries/Session/Session.php +++ b/system/libraries/Session/Session.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 2.0.0 diff --git a/system/libraries/Session/Session_driver.php b/system/libraries/Session/Session_driver.php index 55ddb25e0cc..f32f14ae059 100644 --- a/system/libraries/Session/Session_driver.php +++ b/system/libraries/Session/Session_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php index 2f524125643..31f5a46631b 100644 --- a/system/libraries/Session/drivers/Session_database_driver.php +++ b/system/libraries/Session/drivers/Session_database_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php index 37315d3cd07..6016e094e27 100644 --- a/system/libraries/Session/drivers/Session_files_driver.php +++ b/system/libraries/Session/drivers/Session_files_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php index eb1dcd3d8e3..2556bf0f7bf 100644 --- a/system/libraries/Session/drivers/Session_memcached_driver.php +++ b/system/libraries/Session/drivers/Session_memcached_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php index a780100b122..d260f7b8281 100644 --- a/system/libraries/Session/drivers/Session_redis_driver.php +++ b/system/libraries/Session/drivers/Session_redis_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 diff --git a/system/libraries/Table.php b/system/libraries/Table.php index f2fa434d98c..fef9bb03931 100644 --- a/system/libraries/Table.php +++ b/system/libraries/Table.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.1 diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php index 7222c00c210..55e9a0ee68a 100644 --- a/system/libraries/Trackback.php +++ b/system/libraries/Trackback.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Typography.php b/system/libraries/Typography.php index c45398bdca4..ce31ba317f1 100644 --- a/system/libraries/Typography.php +++ b/system/libraries/Typography.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php index 3122ed624b1..38e0fbd2496 100644 --- a/system/libraries/Unit_test.php +++ b/system/libraries/Unit_test.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.1 diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php index 778ed6892dd..b37cc2f59b7 100644 --- a/system/libraries/Upload.php +++ b/system/libraries/Upload.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/User_agent.php b/system/libraries/User_agent.php index 60d1599668a..cda3ef0a0d7 100644 --- a/system/libraries/User_agent.php +++ b/system/libraries/User_agent.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php index 7186646dac9..f043e0f90f2 100644 --- a/system/libraries/Xmlrpc.php +++ b/system/libraries/Xmlrpc.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php index f343a7ec06c..21de937c8b3 100644 --- a/system/libraries/Xmlrpcs.php +++ b/system/libraries/Xmlrpcs.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php index 25315c92e67..46f6c145dba 100644 --- a/system/libraries/Zip.php +++ b/system/libraries/Zip.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index 4d2edbe604d..5c447b722d2 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -41,7 +41,7 @@ # General information about the project. project = u'CodeIgniter' -copyright = u'2014 - 2016, British Columbia Institute of Technology' +copyright = u'2014 - 2017, British Columbia Institute of Technology' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -229,7 +229,7 @@ epub_title = u'CodeIgniter' epub_author = u'British Columbia Institute of Technology' epub_publisher = u'British Columbia Institute of Technology' -epub_copyright = u'2014 - 2016, British Columbia Institute of Technology' +epub_copyright = u'2014 - 2017, British Columbia Institute of Technology' # The language of the text. It defaults to the language option # or en if the language is not set. diff --git a/user_guide_src/source/license.rst b/user_guide_src/source/license.rst index 3f7b2f58bcb..c943c294a31 100644 --- a/user_guide_src/source/license.rst +++ b/user_guide_src/source/license.rst @@ -2,7 +2,7 @@ The MIT License (MIT) ##################### -Copyright (c) 2014 - 2016, British Columbia Institute of Technology +Copyright (c) 2014 - 2017, British Columbia Institute of Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From d1896bc74e884c347c3ef02a55babace82a61d39 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 3 Jan 2017 12:28:07 +0200 Subject: [PATCH 4633/5397] [ci skip] Update year to 2017 in user_guide_src/cilexer --- user_guide_src/cilexer/cilexer/cilexer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user_guide_src/cilexer/cilexer/cilexer.py b/user_guide_src/cilexer/cilexer/cilexer.py index 40582f88aae..4ecfd0bc438 100644 --- a/user_guide_src/cilexer/cilexer/cilexer.py +++ b/user_guide_src/cilexer/cilexer/cilexer.py @@ -1,11 +1,11 @@ # CodeIgniter # https://codeigniter.com -# +# # An open source application development framework for PHP -# +# # This content is released under the MIT License (MIT) # -# Copyright (c) 2014 - 2016, British Columbia Institute of Technology +# Copyright (c) 2014 - 2017, British Columbia Institute of Technology # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 0642faa79669826603502239b8fc092d0f1a437a Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 3 Jan 2017 12:31:41 +0200 Subject: [PATCH 4634/5397] [ci skip] Update year number in remaining files that were recently deleted from develop --- system/database/drivers/sqlite/sqlite_driver.php | 4 ++-- system/database/drivers/sqlite/sqlite_forge.php | 4 ++-- system/database/drivers/sqlite/sqlite_result.php | 4 ++-- system/database/drivers/sqlite/sqlite_utility.php | 4 ++-- system/helpers/email_helper.php | 4 ++-- system/helpers/smiley_helper.php | 4 ++-- system/libraries/Cart.php | 4 ++-- system/libraries/Javascript.php | 4 ++-- system/libraries/Javascript/Jquery.php | 4 ++-- system/libraries/Session/SessionHandlerInterface.php | 4 ++-- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php index 16b8c29c369..03c96e4480b 100644 --- a/system/database/drivers/sqlite/sqlite_driver.php +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php index 3ad3477e478..a0fc0cdb00c 100644 --- a/system/database/drivers/sqlite/sqlite_forge.php +++ b/system/database/drivers/sqlite/sqlite_forge.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/sqlite/sqlite_result.php b/system/database/drivers/sqlite/sqlite_result.php index d40b98aab94..34d3ac3c1c4 100644 --- a/system/database/drivers/sqlite/sqlite_result.php +++ b/system/database/drivers/sqlite/sqlite_result.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/database/drivers/sqlite/sqlite_utility.php b/system/database/drivers/sqlite/sqlite_utility.php index 59c46f9ef1c..90ca4b161f5 100644 --- a/system/database/drivers/sqlite/sqlite_utility.php +++ b/system/database/drivers/sqlite/sqlite_utility.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.3.0 diff --git a/system/helpers/email_helper.php b/system/helpers/email_helper.php index 35944fc7b56..b3755d45325 100644 --- a/system/helpers/email_helper.php +++ b/system/helpers/email_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php index 688ca24c21b..2c9a3b4a686 100644 --- a/system/helpers/smiley_helper.php +++ b/system/helpers/smiley_helper.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php index 44d87e0bf66..734c4342014 100644 --- a/system/libraries/Cart.php +++ b/system/libraries/Cart.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php index dcf9337794d..7648526b474 100644 --- a/system/libraries/Javascript.php +++ b/system/libraries/Javascript.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Javascript/Jquery.php b/system/libraries/Javascript/Jquery.php index 9df1be1c1f1..ee5f9dea532 100644 --- a/system/libraries/Javascript/Jquery.php +++ b/system/libraries/Javascript/Jquery.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 1.0.0 diff --git a/system/libraries/Session/SessionHandlerInterface.php b/system/libraries/Session/SessionHandlerInterface.php index b3533dd1eae..2eef61db82d 100644 --- a/system/libraries/Session/SessionHandlerInterface.php +++ b/system/libraries/Session/SessionHandlerInterface.php @@ -6,7 +6,7 @@ * * This content is released under the MIT License (MIT) * - * Copyright (c) 2014 - 2016, British Columbia Institute of Technology + * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ * @package CodeIgniter * @author EllisLab Dev Team * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) - * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/) + * @copyright Copyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @license http://opensource.org/licenses/MIT MIT License * @link https://codeigniter.com * @since Version 3.0.0 From b3f2e9bcc34c2046a56f34d2bc67dc65dbb61185 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 3 Jan 2017 12:28:07 +0200 Subject: [PATCH 4635/5397] [ci skip] Update year to 2017 in user_guide_src/cilexer --- user_guide_src/cilexer/cilexer/cilexer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user_guide_src/cilexer/cilexer/cilexer.py b/user_guide_src/cilexer/cilexer/cilexer.py index 40582f88aae..4ecfd0bc438 100644 --- a/user_guide_src/cilexer/cilexer/cilexer.py +++ b/user_guide_src/cilexer/cilexer/cilexer.py @@ -1,11 +1,11 @@ # CodeIgniter # https://codeigniter.com -# +# # An open source application development framework for PHP -# +# # This content is released under the MIT License (MIT) # -# Copyright (c) 2014 - 2016, British Columbia Institute of Technology +# Copyright (c) 2014 - 2017, British Columbia Institute of Technology # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 593ce680b87fadb05af6ba13c857ef8b16303bcf Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 3 Jan 2017 12:40:32 +0200 Subject: [PATCH 4636/5397] [ci skip] Fix 4953 --- system/database/DB_forge.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php index 2b2ff1c2400..7289235c87c 100644 --- a/system/database/DB_forge.php +++ b/system/database/DB_forge.php @@ -348,7 +348,7 @@ public function create_table($table, $if_not_exists = FALSE, array $attributes = if (($result = $this->db->query($sql)) !== FALSE) { - empty($this->db->data_cache['table_names']) OR $this->db->data_cache['table_names'][] = $table; + isset($this->db->data_cache['table_names']) && $this->db->data_cache['table_names'][] = $table; // Most databases don't support creating indexes from within the CREATE TABLE statement if ( ! empty($this->keys)) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index d7977f4ce21..f176977a70b 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -31,6 +31,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4937) - :doc:`Image Manipulation Library ` method ``initialize()`` didn't translate *new_image* inputs to absolute paths. - Fixed a bug (#4941) - :doc:`Query Builder ` method ``order_by()`` didn't work with 'RANDOM' under the 'pdo/sqlite' driver. - Fixed a regression (#4892) - :doc:`Query Builder ` method ``update_batch()`` didn't properly handle identifier escaping. +- Fixed a bug (#4953) - :doc:`Database Forge ` method ``create_table()`` didn't update an internal tables list cache if it exists but is empty. Version 3.1.2 ============= From 2cae5587fed1f1b448a48e978ab28f0af3e0ec88 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 3 Jan 2017 13:18:27 +0200 Subject: [PATCH 4637/5397] Merge pull request #4958 from boxsnake/develop Fix a bug where QB count_all_results() doesn't take into account qb_cache_orderby --- system/database/DB_query_builder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 661f5fe6970..3f1a8021add 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1402,7 +1402,7 @@ public function count_all_results($table = '', $reset = TRUE) $this->qb_orderby = NULL; } - $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby)) + $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby) OR ! empty($this->qb_cache_groupby)) ? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results") : $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); From 6e8a3e96aa0794081212f7a61a7e28f04e04c2ae Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 3 Jan 2017 13:19:55 +0200 Subject: [PATCH 4638/5397] [ci skip] Add changelog entry for PR #4958 --- user_guide_src/source/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index f176977a70b..ac245c998a6 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -32,6 +32,7 @@ Bug fixes for 3.1.3 - Fixed a bug (#4941) - :doc:`Query Builder ` method ``order_by()`` didn't work with 'RANDOM' under the 'pdo/sqlite' driver. - Fixed a regression (#4892) - :doc:`Query Builder ` method ``update_batch()`` didn't properly handle identifier escaping. - Fixed a bug (#4953) - :doc:`Database Forge ` method ``create_table()`` didn't update an internal tables list cache if it exists but is empty. +- Fixed a bug (#4958) - :doc:`Query Builder ` method ``count_all_results()`` didn't take into account cached ``ORDER BY`` clauses. Version 3.1.2 ============= From 973dbfc648705b26234d5100c08625af8e1a34d6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 3 Jan 2017 13:54:12 +0200 Subject: [PATCH 4639/5397] [ci skip] Remove /tests/tests/ from .gitignore It got there by accident --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 97f1d31593e..5982f9badab 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,3 @@ user_guide_src/cilexer/pycilexer.egg-info/* *.stTheme.cache *.sublime-workspace *.sublime-project -/tests/tests/ \ No newline at end of file From 51c84f3a436ecfebe371177ba5537b9e475cc3c6 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 3 Jan 2017 17:42:26 +0200 Subject: [PATCH 4640/5397] Fix #4804 --- system/database/DB_query_builder.php | 2 +- user_guide_src/source/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php index 3f1a8021add..ab19d97a2f0 100644 --- a/system/database/DB_query_builder.php +++ b/system/database/DB_query_builder.php @@ -1553,7 +1553,7 @@ public function set_insert_batch($key, $value = '', $escape = NULL) is_bool($escape) OR $escape = $this->_protect_identifiers; - $keys = array_keys($this->_object_to_array(current($key))); + $keys = array_keys($this->_object_to_array(reset($key))); sort($keys); foreach ($key as $row) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index ac245c998a6..73a0232be8a 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -33,6 +33,7 @@ Bug fixes for 3.1.3 - Fixed a regression (#4892) - :doc:`Query Builder ` method ``update_batch()`` didn't properly handle identifier escaping. - Fixed a bug (#4953) - :doc:`Database Forge ` method ``create_table()`` didn't update an internal tables list cache if it exists but is empty. - Fixed a bug (#4958) - :doc:`Query Builder ` method ``count_all_results()`` didn't take into account cached ``ORDER BY`` clauses. +- Fixed a bug (#4804) - :doc:`Query Builder ` method ``insert_batch()`` would skip input data elements if the input array pointer was modified on PHP 7+. Version 3.1.2 ============= From d6ebcbaec2755b7bb3c80fbd5f2d3d6d91766906 Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 3 Jan 2017 17:55:18 +0200 Subject: [PATCH 4641/5397] [ci skip] Correct changelog entry for issue #4804 --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 73a0232be8a..1c7ef16c62a 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -33,7 +33,7 @@ Bug fixes for 3.1.3 - Fixed a regression (#4892) - :doc:`Query Builder ` method ``update_batch()`` didn't properly handle identifier escaping. - Fixed a bug (#4953) - :doc:`Database Forge ` method ``create_table()`` didn't update an internal tables list cache if it exists but is empty. - Fixed a bug (#4958) - :doc:`Query Builder ` method ``count_all_results()`` didn't take into account cached ``ORDER BY`` clauses. -- Fixed a bug (#4804) - :doc:`Query Builder ` method ``insert_batch()`` would skip input data elements if the input array pointer was modified on PHP 7+. +- Fixed a bug (#4804) - :doc:`Query Builder ` method ``insert_batch()`` could skip input data elements if the input array pointer was modified. Version 3.1.2 ============= From 2fa068d238c65cbe8e048809b1839fa0cda3123b Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Tue, 3 Jan 2017 18:15:30 +0200 Subject: [PATCH 4642/5397] [ci skip] Correct changelog entry for issue #4804, again --- user_guide_src/source/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 1c7ef16c62a..3ae234102b9 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -33,7 +33,7 @@ Bug fixes for 3.1.3 - Fixed a regression (#4892) - :doc:`Query Builder ` method ``update_batch()`` didn't properly handle identifier escaping. - Fixed a bug (#4953) - :doc:`Database Forge ` method ``create_table()`` didn't update an internal tables list cache if it exists but is empty. - Fixed a bug (#4958) - :doc:`Query Builder ` method ``count_all_results()`` didn't take into account cached ``ORDER BY`` clauses. -- Fixed a bug (#4804) - :doc:`Query Builder ` method ``insert_batch()`` could skip input data elements if the input array pointer was modified. +- Fixed a bug (#4804) - :doc:`Query Builder ` method ``insert_batch()`` could fail if the input array pointer was modified. Version 3.1.2 ============= From 2ab1c1902711c8b0caf5c3e8f2fa825d72f6755d Mon Sep 17 00:00:00 2001 From: Andrey Andreev Date: Wed, 4 Jan 2017 15:26:35 +0200 Subject: [PATCH 4643/5397] Fix an XSS vulnerability --- system/core/Security.php | 2 +- tests/codeigniter/core/Security_test.php | 5 +++++ user_guide_src/source/changelog.rst | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/system/core/Security.php b/system/core/Security.php index 8b313a9a2f2..d198b663b28 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -499,7 +499,7 @@ public function xss_clean($str, $is_image = FALSE) * Becomes: <blink> */ $pattern = '#' - .'<((?/*\s*)(?[a-z0-9]+)(?=[^a-z0-9]|$)' // tag start and name, followed by a non-tag character + .'<((?/*\s*)((?[a-z0-9]+)(?=[^a-z0-9]|$)|.+)' // tag start and name, followed by a non-tag character .'[^\s\042\047a-z0-9>/=]*' // a valid attribute character immediately after the tag would count as a separator // optional attributes .'(?(?:[\s\042\047/=]*' // non-attribute characters, excluding > (tag close) for obvious reasons diff --git a/tests/codeigniter/core/Security_test.php b/tests/codeigniter/core/Security_test.php index cbf0285ecd9..4c54ec9fabb 100644 --- a/tests/codeigniter/core/Security_test.php +++ b/tests/codeigniter/core/Security_test.php @@ -154,6 +154,11 @@ public function test_xss_clean_sanitize_naughty_html_tags() 'on=">"x onerror="alert(1)">', $this->security->xss_clean('on=">"x onerror="alert(1)">') ); + + $this->assertEquals( + "\n><!-\n