##########
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*).
      - Added an optional second parameter to both :php:func:`base_url()` and :php:func:`site_url()` that allows enforcing of a protocol different than the one in the *base_url* configuration setting.

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

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

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

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

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

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

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

   -  :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/>`.

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

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


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) - :doc:`Form Helper <helpers/form_helper>` function ``set_value()`` 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 for PostgreSQL-specific *INSERT INTO ... RETURNING* statements.
-  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.

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 (#200) where MySQL queries would be malformed after calling $this->db->count_all() then $this->db->get()
-  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 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.
