##########
Change Log
##########

Version 3.0 (planned)
=======================

Release Date: Not Released

-  License

   -  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
         licensed with the Academic Free License (3.0) to allow you to retain
         all licensing authority over your own application code.

-  General Changes

   -  PHP 5.1.6 is no longer supported. CodeIgniter now requires PHP 5.2.4.
   -  Changed filenaming convention (class file names now must be Ucfirst and everything else in lowercase).
   -  ``$_SERVER['CI_ENV']`` can now be set to control the ``ENVIRONMENT`` constant.
   -  Added an optional backtrace to php-error template.
   -  Added Android to the list of user agents.
   -  Added Windows 7, Windows 8, Android, Blackberry, iOS and PlayStation 3 to the list of user platforms.
   -  Added Fennec (Firefox for mobile) to the list of mobile user agents.
   -  Ability to log certain error types, not all under a threshold.
   -  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 for pgp, gpg, zsh and cdr files to mimes.php.
   -  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, wma 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 rar, jar and 7zip 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 docx files in mimes.php.
   -  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 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*.
      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 the Log class to *application/core/*
   -  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.
   -  Updated email validation methods to use ``filter_var()`` instead of PCRE.
   -  Changed environment defaults to report all errors in *development* and only fatal ones in *testing*, *production* but only display them in *development*.
   -  Updated *ip_address* database field lengths from 16 to 45 for supporting IPv6 address on :doc:`Trackback Library <libraries/trackback>` and :doc:`Captcha Helper <helpers/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 log files using ``$config['log_file_extension']``.

-  Helpers

   -  :doc:`Date Helper <helpers/date_helper>` changes include:

      - :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 <http://www.php.net/manual/en/class.datetime.php#datetime.constants.types>`_.
      - Added function :php:func:`date_range()` that generates a list of dates between a specified period.

   -  :doc:`URL Helper <helpers/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.
      - :php:func:`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 the :php:func:`anchor_popup()` function.
      - Added support (auto-detection) for HTTP/1.1 response code 303 in :php:func:`redirect()`.
      - Changed :php:func:`redirect()` to 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*).

   -  :doc:`HTML Helper <helpers/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 <helpers/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.

   -  :doc:`Download Helper <helpers/download_helper>` changes include:

      - Added an optional third parameter to :php:func:`force_download()` that enables/disables sending the actual file MIME type in the Content-Type header (disabled by default).
      - Added a work-around in :php:func:`force_download()` for a bug Android <= 2.1, where the filename extension needs to be in uppercase.
      - Added support for reading from an existing file path by passing NULL as the second parameter to :php:func:`force_download()` (useful for large files and/or safely transmitting binary data).

   -  :doc:`Form Helper <helpers/form_helper>` changes include:

      - :php:func:`form_dropdown()` will now also take an array for unity with other form helpers.
      - :php:func:`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.

   -  :doc:`Security Helper <helpers/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 <libraries/security>`.

   -  :doc:`Smiley Helper <helpers/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 <helpers/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*.
      - Deprecated function ``read_file()`` - it's just an alias for PHP's native ``file_get_contents()``.

   -  :doc:`String Helper <helpers/string_helper>` changes include:

      - Deprecated function ``repeater()`` - it's just an alias for PHP's native ``str_repeat()``.
      - Deprecated function ``trim_slashes()`` - it's just an alias for PHP's native ``trim()`` (with a slash as its second argument).
      - Deprecated randomization type options **unique** and **encrypt** for funcion :php:func:`random_string()` (they are only aliases for **md5** and **sha1** respectively).

   -  :doc:`CAPTCHA Helper <helpers/captcha_helper>` changes include:

      - Added *word_length* and *pool* options to allow customization of the generated word.
      - Added *colors* configuration to allow customization for the *background*, *border*, *text* and *grid* colors.
      - Added *filename* to the returned array elements.

   -  :doc:`Directory Helper <helpers/directory_helper>` :php:func:`directory_map()` will now append ``DIRECTORY_SEPARATOR`` to directory names in the returned array.
   -  :doc:`Array Helper <helpers/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 <helpers/language_helper>` :php:func:`lang()` now accepts an optional list of additional HTML attributes.
   -  Deprecated the :doc:`Email Helper <helpers/email_helper>` as its ``valid_email()``, ``send_email()`` functions are now only aliases for PHP native functions ``filter_var()`` and ``mail()`` respectively.

-  Database

   -  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).
   -  Added subdrivers support (currently only used by PDO).
   -  Added an optional database name parameter to ``db_select()``.
   -  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).
   -  ``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.
   -  Added MySQL client compression support.
   -  Added encrypted connections support (for *mysql*, *sqlsrv* and PDO with *sqlsrv*).
   -  Removed :doc:`Loader Class <libraries/loader>` from Database error tracing to better find the likely culprit.
   -  Added support for SQLite3 database driver.
   -  Added Interbase/Firebird database support via the *ibase* driver.
   -  Added ODBC support for ``create_database()``, ``drop_database()`` and ``drop_table()`` in :doc:`Database Forge <database/forge>`.

   -  :doc:`Query Builder <database/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 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()``, ``insert()``, ``insert_batch()``.
      - Added support for ``join()`` with multiple conditions.
      - Added support for *USING* in ``join()``.
      - Added seed values support for random ordering with ``order_by(seed, 'RANDOM')``.
      - Changed ``limit()`` to ignore NULL values instead of always casting to integer.
      - Changed ``offset()`` to ignore empty values instead of always casting to integer.
      - Methods ``insert_batch()`` and ``update_batch()`` now return an integer representing the number of rows affected by them.

   -  :doc:`Database Results <database/results>` changes include:

      - 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.
      - Added method ``unbuffered_row()`` for fetching a row without prefetching the whole result (consume less memory).
      - Renamed former method ``_data_seek()`` to ``data_seek()`` and made it public.

   -  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 support for ``backup()`` in :doc:`Database Utilities <database/utilities>`.
      - Changed methods ``trans_begin()``, ``trans_commit()`` and ``trans_rollback()`` to use the PHP API instead of sending queries.	

   -  Improved support of the PDO driver, including:

      - Added support for ``create_database()``, ``drop_database()`` and ``drop_table()`` in :doc:`Database Forge <database/forge>`.
      - Added support for ``list_fields()`` in :doc:`Database Results <database/results>`.
      - Subdrivers are now isolated from each other instead of being in one large 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 support for ``optimize_table()`` in :doc:`Database Utilities <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 as PostgreSQL does not support those features.
      - Added a work-around for dead persistent connections to be re-created after a database restart.
      - Changed ``db_connect()`` to include the (new) **schema** value into Postgre's **search_path** session variable.
      - ``pg_escape_literal()`` is now used for escaping strings, if available.

   -  Improved support of the CUBRID driver, including:

      - Added DSN string support.
      - Added persistent connections support.
      - Improved ``list_databases()`` in :doc:`Database Utility <database/utilities>` (until now only the currently used database was returned).

   -  Improved support of the MSSQL and SQLSRV drivers, including:

      - Added random ordering support.
      - Added support for ``optimize_table()`` in :doc:`Database Utility <database/utilities>`.
      - Added escaping with *QUOTE_IDENTIFIER* setting detection.
      - Added port handling support for UNIX-based systems (MSSQL driver).
      - Added *OFFSET* support for SQL Server 2005 and above.
      - Added ``db_set_charset()`` support (MSSQL driver).

   -  Improved support of the Oracle (OCI8) driver, including:

      - Added DSN string support (Easy Connect and TNS).
      - Added support for ``drop_table()`` in :doc:`Database Forge <database/forge>`.
      - Added support for ``list_databases()`` in :doc:`Database Utilities <database/utilities>`.
      - Generally improved for speed and cleaned up all of its components.
      - ``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 <database/query_builder>`.
      - Added support for ``drop_table()`` in :doc:`Database Forge <database/forge>`.

   -  :doc:`Database Forge <database/forge>` changes include:

      - Added an optional second parameter to ``drop_table()`` that allows adding the **IF EXISTS** condition, which is no longer the default.
      - Added support for passing a custom database object to the loader.
      - Deprecated ``add_column()``'s third method. *AFTER* clause should now be added to the field definition array instead.
      - Added support for usage of the *FIRST* clause in ``add_column()`` for MySQL and CUBRID.
      - Overall improved support for all of the drivers.

   -  :doc:`Database Utility <database/utilities>` changes include:

      - Added support for passing a custom database object to the loader.
      - Modified the class to no longer extend :doc:`Database Forge <database/forge>`, which has been a deprecated behavior for awhile.
      - Overall improved support for all of the drivers.
      - Added *foreign_key_checks* option to MySQL/MySQLi backup, allowing statement to disable/re-enable foreign key checks to be inserted into the backup output.

-  Libraries

   -  :doc:`Session Library <libraries/sessions>` changes include:

      -  Library changed to :doc:`Driver <general/drivers>` with classic Cookie driver as default.
      -  Added Native PHP Session driver to work with ``$_SESSION``.
      -  Custom drivers can be added anywhere in package paths and be loaded with the library.
      -  Drivers interchangeable on the fly.
      -  New **tempdata** feature allows setting user data items with an expiration time.
      -  Added default ``$config['sess_driver']`` and ``$config['sess_valid_drivers']`` items to *config.php* file.
      -  Cookie driver now respects php.ini's *session.gc_probability* and *session.gc_divisor* settings.
      -  Cookie driver now uses HMAC authentication instead of the simple md5 checksum.
      -  The Cookie driver now also checks authentication on encrypted session data.
      -  Changed the Cookie driver to select only one row when using database sessions.
      -  Cookie driver now only writes to database at end of request when using database.
      -  Cookie driver now uses PHP functions for faster array manipulation when using database.
      -  Added ``all_flashdata()`` method to session class. Returns an associative array of only flashdata.
      -  Added ``has_userdata()`` method to verify existence of userdata item.
      -  Added ``tempdata()``, ``set_tempdata()``, and ``unset_tempdata()`` methods for manipulating tempdata.
      -  ``keep_flashdata()`` now accepts an array of keys.
      -  Added *debug* level log messages for key events in the session validation process.

   -  :doc:`File Uploading Library <libraries/file_uploading>` changes include:

      -  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 <libraries/security>`'s ``sanitize_filename()``.
      -  Added **file_ext_tolower** config setting.
      -  Added **mod_mime_fix** option to disable suffixing multiple file extensions with an underscore.

   -  :doc:`Cart library <libraries/cart>` 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.
      -  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 <libraries/image_lib>` 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.
      -  If property *maintain_ratio* is set to TRUE, ``image_reproportion()`` now doesn't need both width and height to be specified.
      -  Property *maintain_ratio* is now taken into account when resizing images using ImageMagick library.
      -  Added support for maintaining transparency for PNG images in method ``text_watermark()``.

   -  :doc:`Form Validation library <libraries/form_validation>` 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``.
      -  Added method ``reset_validation()`` which resets internal validation variables in case of multiple validation routines.
      -  Added support for setting error delimiters in the config file via ``$config['error_prefix']`` and ``$config['error_suffix']``.
      -  Internal method ``_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 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 **valid_url**.
      -  Added support for named parameters in error messages.
      -  :doc:`Language <libraries/language>` line keys must now be prefixed with **form_validation_**.
      -  Added rule **alpha_numeric_spaces**.

   -  :doc:`Caching Library <libraries/caching>` changes include:

      -  Added Wincache driver.
      -  Added Redis driver.
      -  Added a *key_prefix* option for cache IDs.
      -  Updated driver ``is_supported()`` methods to log at the "debug" level.

   -  :doc:`Email library <libraries/email>` 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.
      -  Renamed method _set_header() to set_header() and made it public to enable adding custom headers in the :doc:`Email Library <libraries/email>`.
      -  Successfully sent emails will automatically clear the parameters.
      -  Added a *return_path* parameter to the ``from()`` method.
      -  Removed the second parameter (character limit) from internal method ``_prep_quoted_printable()`` as it is never used.
      -  Internal method ``_prep_quoted_printable()`` will now utilize the native ``quoted_printable_encode()``, ``imap_8bit()`` functions (if available) when CRLF is set to "\r\n".
      -  Default charset now relies on the global ``$config['charset']`` setting.
      -  Removed unused protected method ``_get_ip()`` (:doc:`Input Library <libraries/input>`'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``.
      -  Public method ``set_header()`` now filters the input by removing all "\\r" and "\\n" characters.

   -  :doc:`Pagination Library <libraries/pagination>` 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).
      -  Added $config['reuse_query_string'] to allow automatic repopulation of query string arguments, combined with normal URI segments.
      -  Removed the default ``&nbsp;`` from a number of the configuration variables.
      -  Added the ability to use a proxy with the :doc:`XML-RPC Library <libraries/xmlrpc>`.

   -  :doc:`Encryption Library <libraries/encryption>` changes include:

      -  Added support for hashing algorithms other than SHA1 and MD5.
      -  Removed previously deprecated ``sha1()`` method.

   -  :doc:`Profiler Library <general/profiling>` changes include:

      -  Database object names are now being displayed.
      -  The sum of all queries running times in seconds is now being displayed.
      -  Added support for displaying the HTTP DNT ("Do Not Track") header.
      -  Added support for displaying $_FILES.

   -  :doc:`Migration Library <libraries/migration>` changes include:

      -  Added support for timestamp-based migrations (enabled by default).
      -  Added ``$config['migration_type']`` to allow switching between *sequential* and *timestamp* migrations.

   -  :doc:`User Agent Library <libraries/user_agent>` will now check if robots are pretending to be mobile clients (helps with e.g. Google indexing mobile website versions).
   -  Added support for setting :doc:`Table <libraries/table>` class defaults in a config file.

-  Core

   -  :doc:`URI Library <libraries/uri>` changes include:

      -  Changed private methods to protected so that MY_URI can override them.
      -  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 <http://www.ietf.org/rfc/rfc2616.txt>`.
      -  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.

   -  :doc:`Loader Library <libraries/loader>` changes include:

      -  Added method ``get_vars()`` to the Loader to retrieve all variables loaded with ``$this->load->vars()``.
      -  ``_ci_autoloader()`` is now a protected method.
      -  Added autoloading of drivers with ``$autoload['drivers']``.
      -  ``$config['rewrite_short_tags']`` now has no effect when using PHP 5.4 as ``<?=`` will always be available.
      -  Changed method ``config()`` to return whatever ``CI_Config::load()`` returns instead of always being void.
      -  Added support for model aliasing on autoload.
      -  Changed method ``is_loaded()`` to ask for the (case sensitive) library name instead of its instance name.
      -  Removed ``$_base_classes`` property and unified all class data in ``$_ci_classes`` instead.
      -  Added method ``clear_vars()`` to allow clearing the cached variables for views.

   -  :doc:`Input Library <libraries/input>` 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.
      -  Added method ``input_stream()`` to aid in using **php://input** stream data such as one passed via PUT, DELETE and PATCH requests.
      -  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 method ``post_get()`` and changed ``get_post()`` to search in GET data first. Both methods' names now properly match their GET/POST data search priorities.
      -  Changed method ``_fetch_from_array()`` to parse array notation in field name.
      -  Added an option for ``_clean_input_keys()`` to return FALSE instead of terminating the whole script.

   -  :doc:`Common functions <general/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()`.
      -  Removed redundant conditional to determine HTTP server protocol in :php:func:`set_status_header()`.
      -  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 <http://www.hardened-php.net/suhosin/>`.
      -  Removed the third (`$php_error`) from function :php:func:`log_message()`.

   -  :doc:`Output Library <libraries/output>` changes include:

      -  Added a second argument to method ``set_content_type()`` that allows setting the document charset as well.
      -  Added methods ``get_content_type()`` and ``get_header()``.
      -  Added method ``delete_cache()``.

   -  :doc:`Config Library <libraries/config>` changes include:

      -  Changed ``site_url()`` method  to accept an array as well.
      -  Removed internal method ``_assign_to_config()`` and moved its implementation to *CodeIgniter.php* instead.
      -  ``item()`` now returns NULL instead of FALSE when the required config item doesn't exist.
      -  Added an optional second parameter to both ``base_url()`` and ``site_url()`` that allows enforcing of a protocol different than the one in the *base_url* configuration setting.

   -  :doc:`Security Library <libraries/security>` changes include:

      -  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.
      -  Modified method ``sanitize_filename()`` to read a public ``$filename_bad_chars`` property for getting the invalid characters list.

   -  :doc:`URI Routing <general/routing>` changes include:

      -  Added possibility to route requests using callbacks.
      -  Added a new reserved route (*translate_uri_dashes*) to allow usage of dashes in the controller and method URI segments.
      -  Deprecated methods ``fetch_directory()``, ``fetch_class()`` and ``fetch_method()`` in favor of their respective public properties.

   -  :doc:`Language Library <libraries/language>` 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.
      -  Language files are now loaded in a cascading style with the one in **system/** always loaded and overriden afterwards, if another one is found.

   -  Removed ``CI_CORE`` boolean constant from *CodeIgniter.php* (no longer Reactor and Core versions).
   -  Log Library will now try to create the **log_path** directory if it doesn't exist.
   -  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 <general/hooks>`.
   -  ``$config['time_reference']`` now supports all timezone strings supported by PHP.
   -  Fatal PHP errors are now also passed to ``_exception_handler()``, so they can be logged.


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) - :doc:`Query Builder <database/query_builder>` nested transactions didn't work properly due to ``_trans_depth`` not being incremented.
-  Fixed a bug (#737, #75) - :doc:`Pagination <libraries/pagination>` anchor class was not set properly when using initialize method.
-  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 <libraries/form_validation>` rule **is_unique** didn't check if a database connection exists.
-  Fixed a bug (#647) - :doc:`Zip Library <libraries/zip>` internal method ``_get_mod_time()`` didn't suppress possible "stat failed" errors generated by ``filemtime()``.
-  Fixed a bug (#157, #174) - :doc:`Image Manipulation Library <libraries/image_lib>` method ``clear()`` didn't completely clear properties.
-  Fixed a bug where :doc:`Database Forge <database/forge>` method ``create_table()`` with PostgreSQL database could lead to fetching the whole table.
-  Fixed a bug (#795) - :doc:`Form Helper <helpers/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()``.
-  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 <libraries/pagination>` 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 <libraries/xmlrpc>` 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 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.
-  Fixed a bug (#1070) - CI_DB_driver::initialize() didn't set a character set if a database is not selected.
-  Fixed a bug (#177) - ``CI_Form_validation::set_value()`` didn't set the default value if POST data is NULL.
-  Fixed a bug (#68, #414) - Oracle's escape_str() didn't properly escape LIKE wild characters.
-  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 <libraries/file_uploading>`.
-  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 <database/index>` 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.
-  Fixed a bug (#638) - db_set_charset() ignored its arguments and always used the configured charset instead.
-  Fixed a bug (#413) - Oracle's error handling methods used to only return connection-related errors.
-  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 <database/forge>` 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 <libraries/email>` send() method was returning TRUE even if the connection/authentication against the server failed.
-  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_query_builder.php failed to handle queries containing SQL bracket delimiters in the join condition.
-  Fixed a bug in the :doc:`Session Library <libraries/sessions>` 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 <libraries/form_validation>`.
-  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 <database/forge>` didn't utilize the configured database character set.
-  Fixed a bug (#23, #1238) - delete_all() in the `Database Caching Library <database/caching>` used to delete .htaccess and index.html files, which is a potential security risk.
-  Fixed a bug in :doc:`Trackback Library <libraries/trackback>` 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) - routed URI string was being reported incorrectly in sub-directories.
-  Fixed a bug (#1242) - read_dir() in the :doc:`Zip Library <libraries/zip>` 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.
-  Fixed a bug in PDO's trans_commit() method where it failed due to an erroneous property name.
-  Fixed a bug (#798) - update() used to ignore LIKE conditions that were set with like().
-  Fixed a bug in Oracle's and MSSQL's delete() methods where an erroneous SQL statement was generated when used with limit().
-  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 <libraries/language>` 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 (#1349) - get_extension() in the :doc:`File Uploading Library <libraries/file_uploading>` returned the original filename when it didn't have an actual extension.
-  Fixed a bug (#1273) - E_NOTICE being generated by :doc:`Query Builder <database/query_builder>`'s set_update_batch() method.
-  Fixed a bug (#44, #110) - :doc:`Upload library <libraries/file_uploading>`'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.
-  Fixed a bug (#784, #862) - :doc:`Database Forge <database/forge>` method ``create_table()`` failed on SQLSRV/MSSQL when used with 'IF NOT EXISTS'.
-  Fixed a bug (#1419) - libraries/Driver.php had a static variable that was causing an error.
-  Fixed a bug (#1411) - the :doc:`Email library <libraries/email>` used its own short list of MIMEs instead the one from config/mimes.php.
-  Fixed a bug where the magic_quotes_runtime setting wasn't turned off for PHP 5.3 (where it is indeed deprecated, but not non-existent).
-  Fixed a bug (#666) - :doc:`Output library <libraries/output>`'s set_content_type() method didn't set the document charset.
-  Fixed a bug (#784, #861) - :doc:`Database Forge <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 its extra arguments when the value passed to it is an array.
-  Fixed a bug where ``_has_operator()`` didn't detect BETWEEN.
-  Fixed a bug in :doc:`Query Builder <database/query_builder>`'s ``join()`` method where it failed with identifiers containing dashes.
-  Fixed a bug (#1264) - :doc:`Database Forge <database/forge>` and :doc:`Database Utilities <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 <database/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 (#1202) - :doc:`Encryption Library <libraries/encryption>` 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 <libraries/uri>` internal method _detect_uri() failed with paths containing a colon.
-  Fixed a bug (#1387) - :doc:`Query Builder <database/query_builder>`'s from() method didn't escape table aliases.
-  Fixed a bug (#520) - :doc:`Date Helper <helpers/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 <general/profiling>` setting *query_toggle_count* was not settable as described in the manual.
-  Fixed a bug (#938) - :doc:`Config Library <libraries/config>` 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 <libraries/config>` method ``site_url()`` always appended ``$config['url_suffix']`` to the end of the URL string, regardless of whether a query string exists in it.
-  Fixed a bug where :doc:`URL Helper <helpers/url_helper>` function ``anchor_popup()`` ignored the attributes argument if it is not an array.
-  Fixed a bug (#1328) - :doc:`Form Validation Library <libraries/form_validation>` didn't properly check the type of the form fields before processing them.
-  Fixed a bug (#79) - :doc:`Form Validation Library <libraries/form_validation>` didn't properly validate array fields that use associative keys or have custom indexes.
-  Fixed a bug (#427) - :doc:`Form Validation Library <libraries/form_validation>` method ``strip_image_tags()`` was an alias to a non-existent method.
-  Fixed a bug (#1545) - :doc:`Query Builder <database/query_builder>` method ``limit()`` wasn't executed properly under Oracle.
-  Fixed a bug (#1551) - :doc:`Date Helper <helpers/date_helper>` function ``standard_date()`` didn't properly format *W3C* and *ATOM* standard dates.
-  Fixed a bug in :doc:`Query Builder <database/query_builder>` method join() where literal values were escaped 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 <helpers/form_helper>` functions ``form_multiselect()``, ``form_dropdown()`` didn't properly handle empty array option groups.
-  Fixed a bug (#1605) - :doc:`Pagination Library <libraries/pagination>` produced incorrect *previous* and *next* link values.
-  Fixed a bug in SQLSRV's ``affected_rows()`` method where an erroneous function name was used.
-  Fixed a bug (#1000) - Change syntax of ``$view_file`` to ``$_ci_view_file`` to prevent being overwritten by application.
-  Fixed a bug (#1757) - :doc:`Directory Helper <helpers/directory_helper>` function ``directory_map()`` was skipping files and directories named *0*.
-  Fixed a bug (#1789) - :doc:`Database Library <database/index>` method ``escape_str()`` escaped quote characters in LIKE conditions twice under MySQL.
-  Fixed a bug (#395) - :doc:`Unit Testing Library <libraries/unit_testing>` method ``result()`` didn't properly check array result columns when called from ``report()``.
-  Fixed a bug (#1692) - :doc:`Database Library <database/index>` method ``display_error()`` didn't properly trace the possible error source on Windows systems.
-  Fixed a bug (#1745) - ``is_write_type()`` method in the :doc:`Database Library <database/index>` didn't return TRUE for LOAD queries.
-  Fixed a bug (#1765) - :doc:`Database Library <database/index>` didn't properly detect connection errors for MySQLi.
-  Fixed a bug (#1257) - :doc:`Query Builder <database/query_builder>` used to (unnecessarily) group FROM clause contents, which breaks certain queries and is invalid for some databases.
-  Fixed a bug (#1709) - :doc:`Email <libraries/email>` headers were broken when using long email subjects and \r\n as CRLF.
-  Fixed a bug where ``MB_ENABLED`` was only declared if ``UTF8_ENABLED`` was set to TRUE.
-  Fixed a bug where the :doc:`Session Library <libraries/sessions>` accepted cookies with *last_activity* values being in the future.
-  Fixed a bug (#1897) - :doc:`Email Library <libraries/email>` triggered PHP E_WARNING errors when *mail* protocol used and ``to()`` is never called.
-  Fixed a bug (#1409) - :doc:`Email Library <libraries/email>` didn't properly handle multibyte characters when applying Q-encoding to headers.
-  Fixed a bug where :doc:`Email Library <libraries/email>` didn't honor its *wordwrap* setting while handling alternative messages.
-  Fixed a bug (#1476, #1909) - :doc:`Pagination Library <libraries/pagination>` didn't take into account actual routing when determining the current page.
-  Fixed a bug (#1766) - :doc:`Query Builder <database/query_builder>` didn't always take into account the *dbprefix* setting.
-  Fixed a bug (#779) - :doc:`URI Class <libraries/uri>` didn't always trim slashes from the *uri_string* as shown in the documentation.
-  Fixed a bug (#134) - :doc:`Database Caching <database/caching>` method ``delete_cache()`` didn't work in some cases due to *cachedir* not being initialized properly.
-  Fixed a bug (#191) - :doc:`Loader Library <libraries/loader>` ignored attempts for (re)loading databases to ``get_instance()->db`` even when the old database connection is dead.
-  Fixed a bug (#1255) - :doc:`User Agent Library <libraries/user_agent>` method ``is_referral()`` only checked if ``$_SERVER['HTTP_REFERER']`` exists.
-  Fixed a bug (#1146) - :doc:`Download Helper <helpers/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 <libraries/uri>` didn't properly cache segments for ``uri_to_assoc()`` and ``ruri_to_assoc()``.
-  Fixed a bug (#1506) - :doc:`Form Helpers <helpers/form_helper>` set empty *name* attributes.
-  Fixed a bug (#59) - :doc:`Query Builder <database/query_builder>` method ``count_all_results()`` ignored the DISTINCT clause.
-  Fixed a bug (#1624) - :doc:`Form Validation Library <libraries/form_validation>` rule **matches** didn't property handle array field names.
-  Fixed a bug (#1630) - :doc:`Form Helper <helpers/form_helper>` function ``set_value()`` didn't escape HTML entities.
-  Fixed a bug (#142) - :doc:`Form Helper <helpers/form_helper>` function ``form_dropdown()`` didn't escape HTML entities in option values.
-  Fixed a bug (#50) - :doc:`Session Library <libraries/sessions>` unnecessarily stripped slashed from serialized data, making it impossible to read objects in a namespace.
-  Fixed a bug (#658) - :doc:`Routing <general/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 <libraries/email>` removed multiple spaces inside a pre-formatted plain text message.
-  Fixed a bug (#388, #705) - :doc:`URI Library <libraries/uri>` 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 <libraries/uri>` method ``ruri_string()`` didn't include a directory if one is used.
-  Fixed a bug - :doc:`Routing Library <general/routing>` didn't properly handle *default_controller* in a subdirectory when a method is also specified.
-  Fixed a bug (#953) - :doc:`post_controller_constructor hook <general/hooks>` wasn't called with a *404_override*.
-  Fixed a bug (#1220) - :doc:`Profiler Library <general/profiling>` didn't display information for database objects that are instantiated inside models.
-  Fixed a bug (#1978) - :doc:`Directory Helper <helpers/directory_helper>` function :php:func:`directory_map()`'s return array didn't make a distinction between directories and file indexes when a directory with a numeric name is present.
-  Fixed a bug (#777) - :doc:`Loader Library <libraries/loader>` didn't look for helper extensions in added package paths.
-  Fixed a bug (#18) - :doc:`APC Cache <libraries/caching>` driver didn't (un)serialize data, resulting in failure to store objects.
-  Fixed a bug (#188) - :doc:`Unit Testing Library <libraries/unit_testing>` filled up logs with error messages for non-existing language keys.
-  Fixed a bug (#113) - :doc:`Form Validation Library <libraries/form_validation>` didn't properly handle empty fields that were specified as an array.
-  Fixed a bug (#2061) - :doc:`Routing Class <general/routing>` 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:`Database Results <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 <libraries/security>` method ``sanitize_filename()`` could be tricked by an XSS attack.
-  Fixed a bug (#2211) - :doc:`Migration Library <libraries/migration>` extensions couldn't execute ``CI_Migration::__construct()``.
-  Fixed a bug (#2255) - :doc:`Email Library <libraries/email>` didn't apply ``smtp_timeout`` to socket reads and writes.
-  Fixed a bug (#2239) - :doc:`Email Library <libraries/email>` 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 <database/query_builder>` didn't reset JOIN cache for write-type queries.
-  Fixed a bug (#2298) - :doc:`Database Results <database/results>` method ``next_row()`` kept returning the last row, allowing for infinite loops.
-  Fixed a bug (#2236, #2639) - :doc:`Form Helper <helpers/form_helper>` functions :func:`set_value()`, :func:`set_select()`, :func:`set_radio()`, :func:`set_checkbox()` didn't parse array notation for keys if the rule was not present in the :doc:`Form Validation Library <libraries/form_validation>`.
-  Fixed a bug (#2353) - :doc:`Query Builder <database/query_builder>` erroneously prefixed literal strings with **dbprefix**.
-  Fixed a bug (#78) - :doc:`Cart Library <libraries/cart>` didn't allow non-English letters in product names.
-  Fixed a bug (#77) - :doc:`Database Class <database/index>` didn't properly handle the transaction "test mode" flag.
-  Fixed a bug (#2380) - :doc:`URI Routing <general/routing>` method ``fetch_method()`` returned 'index' if the requested method name matches its controller name.
-  Fixed a bug (#2388) - :doc:`Email Library <libraries/email>` used to ignore attachment errors, resulting in broken emails being sent.
-  Fixed a bug (#2498) - :doc:`Form Validation Library <libraries/form_validation>` rule **valid_base64** only checked characters instead of actual validity.
-  Fixed a bug (#2425) - OCI8 :doc:`database <database>` driver's method ``stored_procedure()`` didn't log an error unless **db_debug** was set to TRUE.
-  Fixed a bug (#2490) - :doc:`Database Class <database/queries>` method ``query()`` returning boolean instead of a result object when the PostgreSQL-specific *RETURNING* clause is used.
-  Fixed a bug (#249) - :doc:`Cache Library <libraries/caching>` didn't properly handle Memcache(d) configurations with missing options.
-  Fixed a bug (#180) - :php:func:`config_item()` didn't take into account run-time configuration changes.
-  Fixed a bug (#2551) - :doc:`Loader Library <libraries/loader>` method ``library()`` didn't properly check if a class that is being loaded already exists.
-  Fixed a bug (#2560) - :doc:`Form Helper <helpers/form_helper>` function :php:func:`form_open()` set the 'method="post"' attribute only if the passed attributes equaled an empty string.
-  Fixed a bug (#2585) - :doc:`Query Builder <database/query_builder>` methods ``min()``, ``max()``, ``avg()``, ``sum()`` didn't escape field names.
-  Fixed an edge case (#2583) in the :doc:`Email Library <libraries/email>` where `Suhosin <http://www.hardened-php.net/suhosin/>` blocked messages sent via ``mail()`` due to trailing newspaces in headers.
-  Fixed a bug (#2590) - :php:func:`log_message()` didn't actually cache the ``CI_Log`` class instance.
-  Fixed a bug (#2609) - :php:func:`get_config()` optional argument was only effective on first function call. Also, it can now add items, in addition to updating existing items.
-  Fixed a bug in the 'postgre' :doc:`database <database/index>` driver where the connection ID wasn't passed to ``pg_escape_string()``.
-  Fixed a bug (#33) - Script execution was terminated when an invalid cookie key was encountered.
-  Fixed a bug (#2681) - ``CI_Security::entity_decode()`` used the `PREG_REPLACE_EVAL` flag, which is deprecated since PHP 5.5.
-  Fixed a bug (#2691) - nested transactions could end in a deadlock when an error is encountered with *db_debug* set to TRUE.
-  Fixed a bug (#2515) - ``_exception_handler()`` used to send the 200 "OK" HTTP status code and didn't stop script exection even on fatal errors.
-  Fixed a bug - Redis :doc:`Caching <libraries/caching>` driver didn't handle connection failures properly.

Version 2.1.4
=============

Release Date: July 8, 2013

-  General Changes

   - Improved security in ``xss_clean()``.

Bug fixes for 2.1.4
-------------------

-  Fixed a bug (#1936) - :doc:`Migration Library <libraries/migration>` method ``latest()`` had a typo when retrieving language values.
-  Fixed a bug (#2021) - :doc:`Migration Library <libraries/migration>` configuration file was mistakenly using Windows style line feeds.
-  Fixed a bug (#1273) - ``E_NOTICE`` being generated by :doc:`Query Builder <database/query_builder>`'s ``set_update_batch()`` method.
-  Fixed a bug (#2337) - :doc:`Email Library <libraries/email>` method ``print_debugger()`` didn't apply ``htmlspecialchars()`` to headers.

Version 2.1.3
=============

Release Date: October 8, 2012

-  Core

   - :doc:`Common function <general/common_functions>` ``is_loaded()`` now returns a reference.

Bug fixes for 2.1.3
-------------------

-  Fixed a bug (#1543) - File-based :doc:`Caching <libraries/caching>` method ``get_metadata()`` used a non-existent array key to look for the TTL value.
-  Fixed a bug (#1314) - :doc:`Session Library <libraries/sessions>` method ``sess_destroy()`` didn't destroy the userdata array.
-  Fixed a bug (#804) - :doc:`Profiler library <general/profiling>` 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 <libraries/migration>` ignored the ``$config['migration_path']`` setting.
-  Fixed a bug (#227) - :doc:`Input Library <libraries/input>` allowed unconditional spoofing of HTTP clients' IP addresses through the *HTTP_CLIENT_IP* header.
-  Fixed a bug (#907) - :doc:`Input Library <libraries/input>` ignored *HTTP_X_CLUSTER_CLIENT_IP* and *HTTP_X_CLIENT_IP* headers when checking for proxies.
-  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 (#499) - :doc:`Security Library <libraries/security>` where a CSRF cookie was created even if ``$config['csrf_protection']`` is set tot FALSE.
-  Fixed a bug (#1715) - :doc:`Input Library <libraries/input>` triggered ``csrf_verify()`` on CLI requests.
-  Fixed a bug (#751) - :doc:`Query Builder <database/query_builder>` didn't properly handle cached field escaping overrides.
-  Fixed a bug (#2004) - :doc:`Query Builder <database/query_builder>` didn't properly merge cached calls with non-cache ones.

Version 2.1.2
=============

Release Date: June 29, 2012

-  General Changes

   -  Improved security in ``xss_clean()``.

Version 2.1.1
=============

Release Date: June 12, 2012

-  General Changes

   -  Fixed support for docx, xlsx files in mimes.php.

-  Libraries

   -  Further improved MIME type detection in the :doc:`File Uploading Library <libraries/file_uploading>`.
   -  Added support for IPv6 to the :doc:`Input Library <libraries/input>`.
   -  Added support for the IP format parameter to the :doc:`Form Validation Library <libraries/form_validation>`.

-  Helpers

   -  ``url_title()`` performance and output improved. You can now use any string as the word delimiter, but 'dash' and 'underscore' are still supported.

Bug fixes for 2.1.1
-------------------

-  Fixed a bug (#697) - A wrong array key was used in the :doc:`File Uploading Library <libraries/file_uploading>` 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 :doc:`Image Manipulation Library <libraries/image_lib>` 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 its 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.

Version 2.1.0
=============

Release Date: November 14, 2011

-  General Changes

   -  Callback validation rules can now accept parameters like any other
      validation rule.
   -  Added html_escape() to :doc:`Common
      functions <general/common_functions>` to escape HTML output
      for preventing XSS.

-  Helpers

   -  Added increment_string() to :doc:`String
      Helper <helpers/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 :doc:`String Helper <helpers/string_helper>`'s random_string() method

-  Database

   -  Added a `CUBRID <http://www.cubrid.org/>`_ driver to the :doc:`Database
      Driver <database/index>`. Thanks to the CUBRID team for
      supplying this patch.
   -  Added a PDO driver to the :doc:`Database Driver <database/index>`.
   -  Typecast limit and offset in the :doc:`Database
      Driver <database/queries>` to integers to avoid possible
      injection.
   -  Added additional option 'none' for the optional third argument for
      $this->db->like() in the :doc:`Database
      Driver <database/query_builder>`.
   -  Added $this->db->insert_batch() support to the OCI8 (Oracle) driver.
   -  Added failover if the main connections in the config should fail

-  Libraries

   -  Changed ``$this->cart->insert()`` in the :doc:`Cart
      Library <libraries/cart>` 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 <libraries/form_validation>`.
   -  Added a :doc:`Migration library <libraries/migration>` 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.
   -  Added ``is_unique`` to the :doc:`Form Validation library <libraries/form_validation>`.
   -  Added $config['use_page_numbers'] to the :doc:`Pagination library <libraries/pagination>`, which enables real page numbers in the URI.
   -  Added TLS and SSL Encryption for SMTP.

-  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).

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 (#105) that stopped query errors from being logged unless database debugging was enabled
-  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 (#344) - Using schema found in :doc:`Saving Session Data to a Database <libraries/sessions>`, system would throw error "user_data does not have a default value" when deleting then creating a session.
-  Fixed a bug (#112) - OCI8 (Oracle) driver didn't pass the configured database character set when connecting.
-  Fixed a bug (#182) - OCI8 (Oracle) driver used to re-execute the statement whenever num_rows() is called.
-  Fixed a bug (#82) - WHERE clause field names in the DB update_string() method were not escaped, resulting in failed queries in some cases.
-  Fixed a bug (#89) - Fix a variable type mismatch in DB display_error() where an array is expected, but a string could be set instead.
-  Fixed a bug (#467) - Suppress warnings generated from get_magic_quotes_gpc() (deprecated in PHP 5.4)
-  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 :doc:`File Uploading Library <libraries/file_uploading>` in order to fix a possible MIME-type injection.
-  Fixed a bug (#537) - Support for all wav type in browser.
-  Fixed a bug (#576) - Using ini_get() function to detect if apc is enabled or not.
-  Fixed invalid date time format in :doc:`Date helper <helpers/date_helper>` and :doc:`XMLRPC library <libraries/xmlrpc>`.
-  Fixed a bug (#200) - MySQL queries would be malformed after calling db->count_all() then db->get().

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 <https://bitbucket.org/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.
   -  Fixed a bug where :doc:`Email library <libraries/email>`
      attachments with a "." in the name would using invalid MIME-types.

-  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 :doc:`Inflector
      helper <helpers/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 :doc:`Database
      Driver <database/queries>`.
   -  Changed $this->cart->insert() in the :doc:`Cart
      Library <libraries/cart>` to return the Row ID if a single
      item was inserted successfully.
   -  Added $this->load->get_var() to the :doc:`Loader
      library <libraries/loader>` 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 :doc:`Upgrade
   Notes <installation/upgrade_203>`.
-  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 :doc:`Cart
   Library <libraries/cart>` 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 :doc:`Security library <./libraries/security>` 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 :doc:`Cache driver <libraries/caching>`.
   -  Added :doc:`CLI usage <./general/cli>` documentation.

-  Helpers

   -  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.

-  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 :doc:`Input
   class <libraries/input>`.
-  Added form_validation_lang entries for decimal, less_than and
   greater_than.
-  `Fixed issue
   #153 <https://bitbucket.org/ellislab/codeigniter-reactor/issue/153/escape-str-bug-in-mssql-driver>`_
   Escape Str Bug in MSSQL driver.
-  `Fixed issue
   #172 <https://bitbucket.org/ellislab/codeigniter-reactor/issue/172/bug-in-chrome-and-form_open-in-201>`_
   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 :doc:`Handling
      Environments <general/environments>` page.
   -  Added support for
      :ref:`environment-specific <config-environments>`
      configuration files.

-  Libraries

   -  Added decimal, less_than and greater_than rules to the :doc:`Form
      validation Class <libraries/form_validation>`.
   -  :doc:`Input Class <libraries/input>` 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
      :doc:`Input Class <libraries/input>` method.
   -  Added set_content_type() to :doc:`Output
      Class <libraries/output>` to set the output Content-Type
      HTTP header based on a MIME Type or a config/mimes.php array key.
   -  :doc:`Output Class <libraries/output>` will now support method
      chaining.

-  Helpers

   -  Changed the logic for form_open() in :doc:`Form
      helper <helpers/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.

.. _2.0.0-changelog:

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
      :doc:`documented <./helpers/captcha_helper>`. The JavaScript
      calendar plugin was removed due to the ready availability of great
      JavaScript calendars, particularly with jQuery.
   -  Added new special Library type:
      :doc:`Drivers <./general/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 :doc:`Loader class <libraries/loader>`
      documentation for more details.
   -  In-development code is now hosted at
      `BitBucket <http://bitbucket.org/ellislab/codeigniter-reactor/>`_.
   -  Removed the deprecated Validation Class.
   -  Added CI\_ Prefix to all core classes.
   -  Package paths can now be set in application/config/autoload.php.
   -  :doc:`Upload library <libraries/file_uploading>` file_name can
      now be set without an extension, the extension will be taken from
      the uploaded file instead of the given name.
   -  In :doc:`Database Forge <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 :doc:`Cache driver <libraries/caching>` with APC,
      memcached, and file-based support.
   -  Added $prefix, $suffix and $first_url properties to :doc:`Pagination
      library <./libraries/pagination>`.
   -  Added the ability to suppress first, previous, next, last, and
      page links by setting their values to FALSE in the :doc:`Pagination
      library <./libraries/pagination>`.
   -  Added :doc:`Security library <./libraries/security>`, which now
      contains the xss_clean function, filename_security function and
      other security related functions.
   -  Added CSRF (Cross-site Reference Forgery) protection to the
      :doc:`Security library <./libraries/security>`.
   -  Added $parse_exec_vars property to Output library.
   -  Added ability to enable / disable individual sections of the
      :doc:`Profiler <general/profiling>`
   -  Added a wildcard option $config['allowed_types'] = '\*' to the
      :doc:`File Uploading Class <./libraries/file_uploading>`.
   -  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 :doc:`Parser
      Class <libraries/parser>`.
   -  Added HTTP headers and Config information to the
      :doc:`Profiler <general/profiling>` output.
   -  Added Chrome and Flock to the list of detectable browsers by
      browser() in the :doc:`User Agent Class <libraries/user_agent>`.
   -  The :doc:`Unit Test Class <libraries/unit_testing>` 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 :doc:`FTP
      library <libraries/ftp>`
   -  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 :doc:`upgrade
      instructions <./installation/upgrade_200>` 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 :doc:`User agent library <libraries/user_agent>` so that
      is_browser(), is_mobile() and is_robot() can optionally check
      for a specific browser or mobile device.
   -  Altered :doc:`Input library <libraries/input>` so that post() and
      get() will return all POST and GET items (respectively) if there
      are no parameters passed in.

-  Database

   -  :doc:`database configuration <./database/configuration>`.
   -  Added autoinit value to :doc:`database
      configuration <./database/configuration>`.
   -  Added stricton value to :doc:`database
      configuration <./database/configuration>`.
   -  Added database_exists() to the :doc:`Database Utilities
      Class <database/utilities>`.
   -  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 :doc:`text
      helper <./helpers/text_helper>`.
   -  Added accept-charset to the list of inserted attributes of
      form_open() in the :doc:`Form Helper <helpers/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 :doc:`File Helper <helpers/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
      :doc:`Directory Helper <helpers/directory_helper>` to accept an
      integer to specify recursion depth.
   -  Modified delete_files() in the :doc:`File
      Helper <helpers/file_helper>` to return FALSE on failure.
   -  Added an optional second parameter to byte_format() in the
      :doc:`Number Helper <helpers/number_helper>` to allow for decimal
      precision.
   -  Added alpha, and sha1 string types to random_string() in the
      :doc:`String Helper <helpers/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 :doc:`HTML
      helper <./helpers/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 :doc:`Security
      helper <./helpers/security_helper>`.
   -  Added ellipsize() to the :doc:`Text
      Helper <./helpers/text_helper>`
   -  Added elements() to the :doc:`Array
      Helper <./helpers/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 :doc:`Reserved
      Names <general/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 :doc:`Output
      Class <libraries/output>`.
   -  Documented a second argument in the decode() function for the
      :doc:`Encryption Class <libraries/encryption>`.
   -  Documented db->close().
   -  Updated the router to support a default route with any number of
      segments.
   -  Moved _remove_invisible_characters() function from the
      :doc:`Security Library <libraries/security>` to :doc:`common
      functions. <general/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 :doc:`Cart Class <libraries/cart>`.
   -  Added the ability to pass $config['file_name'] for the :doc:`File
      Uploading Class <libraries/file_uploading>` 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 :doc:`Form
      helper <helpers/form_helper>`.
   -  Modified form_hidden() in the :doc:`Form
      helper <helpers/form_helper>` to accept multi-dimensional
      arrays.
   -  Modified form_prep() in the :doc:`Form
      helper <helpers/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 :doc:`Directory
      helper <helpers/directory_helper>` to allow the inclusion of
      hidden files, and to return FALSE on failure to read directory.
   -  Modified the :doc:`Smiley helper <helpers/smiley_helper>` to work
      with multiple fields and insert the smiley at the last known
      cursor position.

-  General

   -  Compatible with PHP 5.3.0.
   -  Modified :doc:`show_error() <general/errors>` to allow sending
      of HTTP server response codes.
   -  Modified :doc:`show_404() <general/errors>` to send 404 status
      code, removing non-CGI compatible header() statement from
      error_404.php template.
   -  Added set_status_header() to the :doc:`Common
      functions <general/common_functions>` to allow use when the
      Output class is unavailable.
   -  Added is_php() to :doc:`Common
      functions <general/common_functions>` to facilitate PHP
      version comparisons.
   -  Added 2 CodeIgniter "cheatsheets" (thanks to DesignFellow.com for
      this contribution).

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
      :doc:`Image Manipulation Class <libraries/image_lib>`.
   -  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
      :doc:`form helper <helpers/form_helper>`.
   -  Added a doctype() function to the :doc:`HTML
      helper <helpers/html_helper>`.
   -  Added ability to force lowercase for url_title() in the :doc:`URL
      helper <helpers/url_helper>`.
   -  Changed the default "type" of form_button() to "button" from
      "submit" in the :doc:`form helper <helpers/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 :doc:`Form Validation
      Class <libraries/form_validation>`. 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 :doc:`Sessions class <libraries/sessions>` 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 :doc:`Loader class <libraries/loader>` for
      more info.
   -  Added the ability to assign library objects to your own variable
      names when you use $this->load->library(). Please see the :doc:`Loader
      class <libraries/loader>` for more info.
   -  Added controller class/method info to :doc:`Profiler
      class <general/profiling>` and support for multiple database
      connections.
   -  Improved the "auto typography" feature and moved it out of the
      helper into its own :doc:`Typography
      Class <libraries/typography>`.
   -  Improved performance and accuracy of xss_clean(), including
      reduction of false positives on image/file tests.
   -  Improved :doc:`Parser class <./libraries/parser>` 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
      :doc:`File Upload Class <libraries/file_uploading>`.
   -  Added set_status_header() function to :doc:`Output
      class <libraries/output>`.
   -  Modified :doc:`Pagination <libraries/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 :doc:`Form
      Validation <libraries/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 :doc:`Form
      helper <helpers/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 :doc:`Form Validation
      Class <libraries/form_validation>`.
   -  Added current_url() and uri_segments() to :doc:`URL
      helper <helpers/url_helper>`.
   -  Altered auto_link() in the :doc:`URL
      helper <helpers/url_helper>` so that email addresses with
      "+" included will be linked.
   -  Added meta() function to :doc:`HTML
      helper <helpers/html_helper>`.
   -  Improved accuracy of calculations in :doc:`Number
      helper <helpers/number_helper>`.
   -  Removed added newlines ("\\n") from most form and html helper
      functions.
   -  Tightened up validation in the :doc:`Date
      helper <helpers/date_helper>` function human_to_unix(),
      and eliminated the POSIX regex.
   -  Updated :doc:`Date helper <helpers/date_helper>` to match the
      world's current time zones and offsets.
   -  Modified url_title() in the :doc:`URL
      helper <helpers/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
      :doc:`URL helper <helpers/url_helper>`.

-  Other Changes

   -  Added :doc:`PHP Style Guide <./general/styleguide>` 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 :doc:`Email library <libraries/email>` 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
   :doc:`Date helper. <helpers/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 :doc:`Text
   helper <helpers/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
      :doc:`Forge class <database/forge>`
   -  Added ability to set additional database config values in :doc:`DSN
      connections <database/connecting>` via the query string.

-  Libraries

   -  Set the mime type check in the :doc:`Upload
      class <libraries/file_uploading>` to reference the global
      mimes variable.
   -  Added support for query strings to the :doc:`Pagination
      class <libraries/pagination>`, automatically detected or
      explicitly declared.
   -  Added get_post() to the :doc:`Input class <libraries/input>`.
   -  Documented get() in the :doc:`Input class <libraries/input>`.
   -  Added the ability to automatically output language items as form
      labels in the :doc:`Language class <libraries/language>`.

-  Helpers

   -  Added a :doc:`Language helper <helpers/language_helper>`.
   -  Added a :doc:`Number helper <helpers/number_helper>`.
   -  :doc:`Form helper <helpers/form_helper>` refactored to allow
      form_open() and form_fieldset() to accept arrays or strings as
      arguments.

-  Other changes

   -  Improved security in xss_clean().
   -  Removed an unused Router reference in _display_cache().
   -  Added ability to :doc:`use xss_clean() to test
      images <libraries/input>` 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 :doc:`XMLRPC userguide page <libraries/xmlrpc>`.
   -  Removed maxlength and size as automatically added attributes of
      form_input() in the :doc:`form helper <helpers/form_helper>`.
   -  Documented the language file use of byte_format() in the :doc:`number
      helper <helpers/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_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.
-  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 :doc:`DBForge <./database/forge>`.
   -  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 :doc:`Strict Mode <./database/transactions>` 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
      :doc:`Email <libraries/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
      :doc:`Email <libraries/email>` class.
   -  :doc:`Unit Testing <libraries/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 :doc:`Zip class <libraries/zip>` now exits within download().
   -  The :doc:`Zip class <libraries/zip>` 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 :doc:`Form
      helper <helpers/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 :doc:`URL
      Helper <helpers/url_helper>`.
   -  Modified img() in the :doc:`HTML Helper <helpers/html_helper>` to
      remove an unneeded space (#4208).
   -  Modified anchor() in the :doc:`URL helper <helpers/url_helper>`
      to no longer add a default title= attribute (#4209).
   -  The :doc:`Download helper <helpers/download_helper>` now exits
      within force_download().
   -  Added get_dir_file_info(), get_file_info(), and
      get_mime_by_extension() to the :doc:`File
      Helper <helpers/file_helper>`.
   -  Added symbolic_permissions() and octal_permissions() to the
      :doc:`File helper <helpers/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 :doc:`xss_clean() <libraries/input>` 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 :doc:`Reserved Names <general/reserved_names>` page to
      the userguide, and migrated reserved controller names into it.
   -  Added a :doc:`Common Functions <general/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 :doc:`xss_clean() <libraries/input>` 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 :doc:`URL
   helper <helpers/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

   -  Added :ref:`Active Record
      Caching <ar-caching>`.
   -  Made Active Record fully database-prefix aware.

-  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 :doc:`Path Helper <./helpers/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 :doc:`DBForge <./database/forge>` to the database tools.
   -  Moved create_database() and drop_database() into
      :doc:`DBForge <./database/forge>`.
   -  Added add_field(), add_key(), create_table(), drop_table(),
      add_column(), drop_column(), modify_column() into
      :doc:`DBForge <./database/forge>`.

-  Active Record

   -  Added protect_identifiers() in :doc:`Active
      Record <./database/query_builder>`.
   -  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 :doc:`Active
      Record <./database/query_builder>`.
   -  Added support for limit() into update() and delete() statements in
      :doc:`Active Record <./database/query_builder>`.
   -  Added empty_table() and truncate_table() to :doc:`Active
      Record <./database/query_builder>`.
   -  Added the ability to pass an array of tables to the delete()
      statement in :doc:`Active Record <./database/query_builder>`.
   -  Added count_all_results() function to :doc:`Active
      Record <./database/query_builder>`.
   -  Added select_max(), select_min(), select_avg() and
      select_sum() to :doc:`Active Record <./database/query_builder>`.
   -  Added the ability to use aliases with joins in :doc:`Active
      Record <./database/query_builder>`.
   -  Added a third parameter to Active Record's like() clause to
      control where the wildcard goes.
   -  Added a third parameter to set() in :doc:`Active
      Record <./database/query_builder>` 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 :doc:`auto-load <./general/autoloader>`
      :doc:`Models <./general/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 :doc:`Session
      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
      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 :doc:`Image
      Processing <../libraries/image_lib>` 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 :doc:`HTML
      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 strip_quotes() function to :doc:`string
      helper <./helpers/string_helper>`.
   -  Added reduce_multiples() function to :doc:`string
      helper <./helpers/string_helper>`.
   -  Added quotes_to_entities() function to :doc:`string
      helper <./helpers/string_helper>`.
   -  Added form_fieldset(), form_fieldset_close(), form_label(),
      and form_reset() function to :doc:`form
      helper <./helpers/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 :doc:`Zip Encoding Class <libraries/zip>`
      to the table of contents of the userguide.
   -  Moved part of the userguide menu javascript to an external file.
   -  Documented distinct() in :doc:`Active
      Record <./database/query_builder>`.
   -  Documented the timezones() function in the :doc:`Date
      Helper <./helpers/date_helper>`.
   -  Documented unset_userdata in the :doc:`Session
      class <./libraries/sessions>`.
   -  Documented 2 config options to the :doc:`Database
      configuration <./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 :doc:`parser class <./libraries/parser>`
   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 :doc:`Session
   library <./libraries/sessions>` 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 :doc:`File
   Helper <helpers/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 :doc:`User Agent
   library <./libraries/user_agent>` where more then 2 languages
   where not reported with languages().
-  Fixed a bug (#3017) in the :doc:`Email <./libraries/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 :doc:`upload
   library <./libraries/file_uploading>` 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 :doc:`User Agent
   Library <./libraries/user_agent>`.
-  Fixed a typo in the docblock comments that had CodeIgniter spelled
   CodeIgnitor.
-  Fixed a typo in the :doc:`String Helper <./helpers/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 :doc:`custom Language files <./libraries/language>` to the
   :doc:`autoload <./general/autoloader>` options.
-  Added stripslashes() to the _clean_input_data() function in the
   :doc:`Input class <./libraries/input>` when magic quotes is on so
   that data will always be un-slashed within the framework.
-  Added array to string into the :doc:`profiler <general/profiling>`.
-  Added some additional mime types in application/config/mimes.php.
-  Added filename_security() method to :doc:`Input
   library <./libraries/input>`.
-  Added some additional arguments to the :doc:`Inflection
   helper <./helpers/inflector_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 :doc:`Calendar library <./libraries/calendar>`
-  Fixed a typo in rpcs.php library
-  Fixed a bug in the :doc:`Zip library <./libraries/zip>`, 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
   :doc:`Profiler <./general/profiling>` output
-  Fixed a bug in display of queries with characters that would be
   interpreted as HTML in the :doc:`Profiler <./general/profiling>`
   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 :doc:`String
   helper <./helpers/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 :doc:`URL Helper <./helpers/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 :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
   no result is produced.
-  Fixed a bug in the redirect function of the :doc:`url
   helper <./helpers/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 :doc:`downloads <installation/downloads>` page.
-  Added support for captions in the :doc:`Table
   Library <./libraries/table>`
-  Fixed a bug in the
   :doc:`download_helper <helpers/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 :doc:`form helper <helpers/form_helper>` that
   gave textarea a value attribute
-  Fixed a bug in the :doc:`Image Library <libraries/image_lib>` 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 :doc:`DB utility class <./database/utilities>`, permitting DB
   backups, CVS or XML files from DB results, and various other
   functions.
-  Added :doc:`Database Caching Class <./database/caching>`.
-  Added :doc:`transaction support <./database/transactions>` to the
   database classes.
-  Added :doc:`Profiler Class <./general/profiling>` which generates a
   report of Benchmark execution times, queries, and POST data at the
   bottom of your pages.
-  Added :doc:`User Agent Library <./libraries/user_agent>` which
   allows browsers, robots, and mobile devises to be identified.
-  Added :doc:`HTML Table Class <./libraries/table>` , enabling tables
   to be generated from arrays or database results.
-  Added :doc:`Zip Encoding Library <./libraries/zip>`.
-  Added :doc:`FTP Library <./libraries/ftp>`.
-  Added the ability to :doc:`extend
   libraries <./general/creating_libraries>` and :doc:`extend core
   classes <./general/core_classes>`, in addition to being able to
   replace them.
-  Added support for storing :doc:`models within
   sub-folders <./general/models>`.
-  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 :doc:`$query->free_result() <./database/results>` to database
   class.
-  Added :doc:`$query->list_fields() <./database/fields>` function to
   database class
-  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 support for <ul> and <ol> lists in the :doc:`HTML
   Helper <./helpers/html_helper>`
-  Added the ability to rewrite :doc:`short
   tags <./general/alternative_php>` 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 :doc:`rename or relocate the "application"
   folder <./general/managing_apps>`.
-  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 :doc:`Input
   Class <./libraries/input>` 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. :doc:`Please see documentation <./general/creating_libraries>`.
-  **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
   :doc:`Controllers <general/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 :doc:`Controllers <general/controllers>`
   page.
-  Added several new functions in the :doc:`URI
   Class <./libraries/uri>` to let you retrieve and manipulate URI
   segments that have been re-routed using the :doc:`URI
   Routing <general/routing>` feature. Previously, the URI class did not
   permit you to access any re-routed URI segments, but now it does.
-  Added :doc:`$this->output->set_header() <./libraries/output>`
   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 :doc:`Inflector helper <./helpers/inflector_helper>`.
-  Added element() function in the :doc:`array
   helper <./helpers/array_helper>`.
-  Added RAND() to active record orderby() function.
-  Added delete_cookie() and get_cookie() to :doc:`Cookie
   helper <./helpers/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
   :doc:`libraries <./general/libraries>` or
   :doc:`models <./general/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 :doc:`Hooks <./general/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 :doc:`into
   sub-folders <general/controllers>`. Kudos to Marco for
   `suggesting <http://codeigniter.com/forums/viewthread/627/>`_ this
   (and the next two) feature.
-  Added regular expressions support for :doc:`routing
   rules <./general/routing>`.
-  Added the ability to :doc:`remap function
   calls <./general/controllers>` within your controllers.
-  Added the ability to :doc:`replace core system
   classes <./general/core_classes>` with your own classes.
-  Added support for % character in URL.
-  Added the ability to supply full URLs using the
   :doc:`anchor() <./helpers/url_helper>` helper function.
-  Added mode parameter to :doc:`file_write() <./helpers/file_helper>`
   helper.
-  Added support for changing the port number in the :doc:`Postgres
   driver <./database/configuration>`.
-  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 application/config/ folder.
-  Updated the Upload class to allow the upload field name to be set
   when calling :doc:`do_upload() <./libraries/file_uploading>`.
-  Updated the :doc:`Config Library <./libraries/config>` 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. :doc:`More info here <./general/models>`.
-  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 :doc:`Unit Testing Library <./libraries/unit_testing>`.
-  Added the ability to pass objects to the **insert()** and
   **update()** database functions. This feature enables you to (among
   other things) use your :doc:`Model class <./general/models>`
   variables to run queries with. See the Models page for details.
-  Added the ability to pass objects to the :doc:`view loading
   function <./general/views>`: $this->load->view('my_view',
   $object);
-  Added getwhere function to :doc:`Active Record
   class <./database/query_builder>`.
-  Added count_all function to :doc:`Active Record
   class <./database/query_builder>`.
-  Added language file for scaffolding and fixed a scaffolding bug that
   occurs when there are no rows in the specified table.
-  Added :doc:`$this->db->last_query() <./database/queries>`, 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 :doc:`Models <general/models>`.
-  Redesigned the database libraries to support additional RDBMs
   (Postgres, MySQLi, etc.).
-  Redesigned the :doc:`Active Record class <./database/query_builder>`
   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 :doc:`custom
   function calls <./database/call_function>`.
-  Added support for :doc:`private functions <general/controllers>` 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
   :doc:`custom core libraries <general/creating_libraries>` when using
   $this->load->library()
-  Added support for running standard :doc:`query string URLs <general/urls>`.
   These can be optionally enabled in your config file.
-  Added the ability to :doc:`specify a "suffix" <general/urls>`, 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 :doc:`string
   helpers <./helpers/string_helper>`.
-  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
   :doc:`found here <general/controllers>`.
-  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 :doc:`Active Record <./database/query_builder>` 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
   :doc:`get_instance() <general/ancillary_classes>` allowing the main
   CodeIgniter object to be accessible throughout your own classes.
-  Added new :doc:`File Helper <./helpers/file_helper>`:
   delete_files()
-  Added new :doc:`URL Helpers <./helpers/url_helper>`: base_url(),
   index_page()
-  Added the ability to create your own :doc:`core
   libraries <general/creating_libraries>` and store them in your local
   application directory.
-  Added an overwrite option to the :doc:`Upload
   class <./libraries/file_uploading>`, 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 :doc:`Calendaring class <./libraries/calendar>`.
-  Added support for running :doc:`multiple
   applications <general/managing_apps>` 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.
