Changing EOL style to LF
diff --git a/system/database/DB.php b/system/database/DB.php
index 2b3ff3d..ca0cfc2 100644
--- a/system/database/DB.php
+++ b/system/database/DB.php
@@ -1,146 +1,146 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Initialize the database

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-function &DB($params = '', $active_record_override = FALSE)

-{

-	// Load the DB config file if a DSN string wasn't passed

-	if (is_string($params) AND strpos($params, '://') === FALSE)

-	{

-		include(APPPATH.'config/database'.EXT);

-		

-		if ( ! isset($db) OR count($db) == 0)

-		{

-			show_error('No database connection settings were found in the database config file.');

-		}

-		

-		if ($params != '')

-		{

-			$active_group = $params;

-		}

-		

-		if ( ! isset($active_group) OR ! isset($db[$active_group]))

-		{

-			show_error('You have specified an invalid database connection group.');

-		}

-		

-		$params = $db[$active_group];

-	}

-	elseif (is_string($params))

-	{

-		

-		/* parse the URL from the DSN string

-		*  Database settings can be passed as discreet

-	 	*  parameters or as a data source name in the first

-	 	*  parameter. DSNs must have this prototype:

-	 	*  $dsn = 'driver://username:password@hostname/database';

-		*/

-	

-		if (($dns = @parse_url($params)) === FALSE)

-		{

-			show_error('Invalid DB Connection String');

-		}

-		

-		$params = array(

-							'dbdriver'	=> $dns['scheme'],

-							'hostname'	=> (isset($dns['host'])) ? rawurldecode($dns['host']) : '',

-							'username'	=> (isset($dns['user'])) ? rawurldecode($dns['user']) : '',

-							'password'	=> (isset($dns['pass'])) ? rawurldecode($dns['pass']) : '',

-							'database'	=> (isset($dns['path'])) ? rawurldecode(substr($dns['path'], 1)) : ''

-						);

-		

-		// were additional config items set?

-		if (isset($dns['query']))

-		{

-			parse_str($dns['query'], $extra);

-

-			foreach($extra as $key => $val)

-			{

-				// booleans please

-				if (strtoupper($val) == "TRUE")

-				{

-					$val = TRUE;

-				}

-				elseif (strtoupper($val) == "FALSE")

-				{

-					$val = FALSE;

-				}

-

-				$params[$key] = $val;

-			}

-		}

-	}

-	

-	// No DB specified yet?  Beat them senseless...

-	if ( ! isset($params['dbdriver']) OR $params['dbdriver'] == '')

-	{

-		show_error('You have not selected a database type to connect to.');

-	}

-

-	// Load the DB classes.  Note: Since the active record class is optional

-	// we need to dynamically create a class that extends proper parent class

-	// based on whether we're using the active record class or not.

-	// Kudos to Paul for discovering this clever use of eval()

-	

-	if ($active_record_override == TRUE)

-	{

-		$active_record = TRUE;

-	}

-	

-	require_once(BASEPATH.'database/DB_driver'.EXT);

-

-	if ( ! isset($active_record) OR $active_record == TRUE)

-	{

-		require_once(BASEPATH.'database/DB_active_rec'.EXT);

-		

-		if ( ! class_exists('CI_DB'))

-		{

-			eval('class CI_DB extends CI_DB_active_record { }');

-		}

-	}

-	else

-	{

-		if ( ! class_exists('CI_DB'))

-		{

-			eval('class CI_DB extends CI_DB_driver { }');

-		}

-	}

-			

-	require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver'.EXT);

-

-	// Instantiate the DB adapter

-	$driver = 'CI_DB_'.$params['dbdriver'].'_driver';

-	$DB =& new $driver($params);

-	

-	if ($DB->autoinit == TRUE)

-	{

-		$DB->initialize();

-	}

-	

-	return $DB;

-}	

-

-

-

-/* End of file DB.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Initialize the database
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+function &DB($params = '', $active_record_override = FALSE)
+{
+	// Load the DB config file if a DSN string wasn't passed
+	if (is_string($params) AND strpos($params, '://') === FALSE)
+	{
+		include(APPPATH.'config/database'.EXT);
+		
+		if ( ! isset($db) OR count($db) == 0)
+		{
+			show_error('No database connection settings were found in the database config file.');
+		}
+		
+		if ($params != '')
+		{
+			$active_group = $params;
+		}
+		
+		if ( ! isset($active_group) OR ! isset($db[$active_group]))
+		{
+			show_error('You have specified an invalid database connection group.');
+		}
+		
+		$params = $db[$active_group];
+	}
+	elseif (is_string($params))
+	{
+		
+		/* parse the URL from the DSN string
+		*  Database settings can be passed as discreet
+	 	*  parameters or as a data source name in the first
+	 	*  parameter. DSNs must have this prototype:
+	 	*  $dsn = 'driver://username:password@hostname/database';
+		*/
+	
+		if (($dns = @parse_url($params)) === FALSE)
+		{
+			show_error('Invalid DB Connection String');
+		}
+		
+		$params = array(
+							'dbdriver'	=> $dns['scheme'],
+							'hostname'	=> (isset($dns['host'])) ? rawurldecode($dns['host']) : '',
+							'username'	=> (isset($dns['user'])) ? rawurldecode($dns['user']) : '',
+							'password'	=> (isset($dns['pass'])) ? rawurldecode($dns['pass']) : '',
+							'database'	=> (isset($dns['path'])) ? rawurldecode(substr($dns['path'], 1)) : ''
+						);
+		
+		// were additional config items set?
+		if (isset($dns['query']))
+		{
+			parse_str($dns['query'], $extra);
+
+			foreach($extra as $key => $val)
+			{
+				// booleans please
+				if (strtoupper($val) == "TRUE")
+				{
+					$val = TRUE;
+				}
+				elseif (strtoupper($val) == "FALSE")
+				{
+					$val = FALSE;
+				}
+
+				$params[$key] = $val;
+			}
+		}
+	}
+	
+	// No DB specified yet?  Beat them senseless...
+	if ( ! isset($params['dbdriver']) OR $params['dbdriver'] == '')
+	{
+		show_error('You have not selected a database type to connect to.');
+	}
+
+	// Load the DB classes.  Note: Since the active record class is optional
+	// we need to dynamically create a class that extends proper parent class
+	// based on whether we're using the active record class or not.
+	// Kudos to Paul for discovering this clever use of eval()
+	
+	if ($active_record_override == TRUE)
+	{
+		$active_record = TRUE;
+	}
+	
+	require_once(BASEPATH.'database/DB_driver'.EXT);
+
+	if ( ! isset($active_record) OR $active_record == TRUE)
+	{
+		require_once(BASEPATH.'database/DB_active_rec'.EXT);
+		
+		if ( ! class_exists('CI_DB'))
+		{
+			eval('class CI_DB extends CI_DB_active_record { }');
+		}
+	}
+	else
+	{
+		if ( ! class_exists('CI_DB'))
+		{
+			eval('class CI_DB extends CI_DB_driver { }');
+		}
+	}
+			
+	require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver'.EXT);
+
+	// Instantiate the DB adapter
+	$driver = 'CI_DB_'.$params['dbdriver'].'_driver';
+	$DB =& new $driver($params);
+	
+	if ($DB->autoinit == TRUE)
+	{
+		$DB->initialize();
+	}
+	
+	return $DB;
+}	
+
+
+
+/* End of file DB.php */
 /* Location: ./system/database/DB.php */
\ No newline at end of file
diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php
index b270b6f..e8cefa2 100644
--- a/system/database/DB_active_rec.php
+++ b/system/database/DB_active_rec.php
@@ -1,1814 +1,1814 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Active Record Class

- *

- * This is the platform-independent base Active Record implementation class.

- *

- * @package		CodeIgniter

- * @subpackage	Drivers

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_active_record extends CI_DB_driver {

-

-	var $ar_select				= array();

-	var $ar_distinct			= FALSE;

-	var $ar_from				= array();

-	var $ar_join				= array();

-	var $ar_where				= array();

-	var $ar_like				= array();

-	var $ar_groupby				= array();

-	var $ar_having				= array();

-	var $ar_limit				= FALSE;

-	var $ar_offset				= FALSE;

-	var $ar_order				= FALSE;

-	var $ar_orderby				= array();

-	var $ar_set					= array();	

-	var $ar_wherein				= array();

-	var $ar_aliased_tables		= array();

-	var $ar_store_array			= array();

-	

-	// Active Record Caching variables

-	var $ar_caching 			= FALSE;

-	var $ar_cache_exists		= array();

-	var $ar_cache_select		= array();

-	var $ar_cache_from			= array();

-	var $ar_cache_join			= array();

-	var $ar_cache_where			= array();

-	var $ar_cache_like			= array();

-	var $ar_cache_groupby		= array();

-	var $ar_cache_having		= array();

-	var $ar_cache_orderby		= array();

-	var $ar_cache_set			= array();	

-

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Select

-	 *

-	 * Generates the SELECT portion of the query

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	object

-	 */

-	function select($select = '*', $escape = NULL)

-	{

-		// Set the global value if this was sepecified	

-		if (is_bool($escape))

-		{

-			$this->_protect_identifiers = $escape;

-		}

-		

-		if (is_string($select))

-		{

-			$select = explode(',', $select);

-		}

-

-		foreach ($select as $val)

-		{

-			$val = trim($val);

-

-			if ($val != '')

-			{

-				$this->ar_select[] = $val;

-

-				if ($this->ar_caching === TRUE)

-				{

-					$this->ar_cache_select[] = $val;

-					$this->ar_cache_exists[] = 'select';

-				}

-			}

-		}

-		return $this;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Select Max

-	 *

-	 * Generates a SELECT MAX(field) portion of a query

-	 *

-	 * @access	public

-	 * @param	string	the field

-	 * @param	string	an alias

-	 * @return	object

-	 */

-	function select_max($select = '', $alias = '')

-	{

-		return $this->_max_min_avg_sum($select, $alias, 'MAX');

-	}

-		

-	// --------------------------------------------------------------------

-

-	/**

-	 * Select Min

-	 *

-	 * Generates a SELECT MIN(field) portion of a query

-	 *

-	 * @access	public

-	 * @param	string	the field

-	 * @param	string	an alias

-	 * @return	object

-	 */

-	function select_min($select = '', $alias = '')

-	{

-		return $this->_max_min_avg_sum($select, $alias, 'MIN');

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Select Average

-	 *

-	 * Generates a SELECT AVG(field) portion of a query

-	 *

-	 * @access	public

-	 * @param	string	the field

-	 * @param	string	an alias

-	 * @return	object

-	 */

-	function select_avg($select = '', $alias = '')

-	{

-		return $this->_max_min_avg_sum($select, $alias, 'AVG');

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Select Sum

-	 *

-	 * Generates a SELECT SUM(field) portion of a query

-	 *

-	 * @access	public

-	 * @param	string	the field

-	 * @param	string	an alias

-	 * @return	object

-	 */

-	function select_sum($select = '', $alias = '')

-	{

-		return $this->_max_min_avg_sum($select, $alias, 'SUM');

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Processing Function for the four functions above:

-	 *

-	 *	select_max()

-	 *	select_min()

-	 *	select_avg()

-	 *  select_sum()

-	 *	

-	 * @access	public

-	 * @param	string	the field

-	 * @param	string	an alias

-	 * @return	object

-	 */

-	function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX')

-	{

-		if ( ! is_string($select) OR $select == '')

-		{

-			$this->display_error('db_invalid_query');

-		}

-	

-		$type = strtoupper($type);

-	

-		if ( ! in_array($type, array('MAX', 'MIN', 'AVG', 'SUM')))

-		{

-			show_error('Invalid function type: '.$type);

-		}

-	

-		if ($alias == '')

-		{

-			$alias = $this->_create_alias_from_table(trim($select));

-		}

-	

-		$sql = $type.'('.$this->_protect_identifiers(trim($select)).') AS '.$alias;

-

-		$this->ar_select[] = $sql;

-		

-		if ($this->ar_caching === TRUE)

-		{

-			$this->ar_cache_select[] = $sql;

-			$this->ar_cache_exists[] = 'select';

-		}

-		

-		return $this;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Determines the alias name based on the table

-	 *

-	 * @access	private

-	 * @param	string

-	 * @return	string

-	 */

-	function _create_alias_from_table($item)

-	{

-		if (strpos($item, '.') !== FALSE)

-		{

-			return end(explode('.', $item));

-		}

-		

-		return $item;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * DISTINCT

-	 *

-	 * Sets a flag which tells the query string compiler to add DISTINCT

-	 *

-	 * @access	public

-	 * @param	bool

-	 * @return	object

-	 */

-	function distinct($val = TRUE)

-	{

-		$this->ar_distinct = (is_bool($val)) ? $val : TRUE;

-		return $this;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * From

-	 *

-	 * Generates the FROM portion of the query

-	 *

-	 * @access	public

-	 * @param	mixed	can be a string or array

-	 * @return	object

-	 */

-	function from($from)

-	{

-		foreach ((array)$from as $val)

-		{

-			if (strpos($val, ',') !== FALSE)

-			{

-				foreach (explode(',', $val) as $v)

-				{

-					$v = trim($v);

-					$this->_track_aliases($v);

-

-					$this->ar_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE);

-					

-					if ($this->ar_caching === TRUE)

-					{

-						$this->ar_cache_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE);

-						$this->ar_cache_exists[] = 'from';

-					}				

-				}

-

-			}

-			else

-			{

-				$val = trim($val);

-

-				// Extract any aliases that might exist.  We use this information

-				// in the _protect_identifiers to know whether to add a table prefix 

-				$this->_track_aliases($val);

-	

-				$this->ar_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE);

-				

-				if ($this->ar_caching === TRUE)

-				{

-					$this->ar_cache_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE);

-					$this->ar_cache_exists[] = 'from';

-				}

-			}

-		}

-

-		return $this;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Join

-	 *

-	 * Generates the JOIN portion of the query

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string	the join condition

-	 * @param	string	the type of join

-	 * @return	object

-	 */

-	function join($table, $cond, $type = '')

-	{		

-		if ($type != '')

-		{

-			$type = strtoupper(trim($type));

-

-			if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER')))

-			{

-				$type = '';

-			}

-			else

-			{

-				$type .= ' ';

-			}

-		}

-

-		// Extract any aliases that might exist.  We use this information

-		// in the _protect_identifiers to know whether to add a table prefix 

-		$this->_track_aliases($table);

-

-		// Strip apart the condition and protect the identifiers

-		if (preg_match('/([\w\.]+)([\W\s]+)(.+)/', $cond, $match))

-		{

-			$match[1] = $this->_protect_identifiers($match[1]);

-			$match[3] = $this->_protect_identifiers($match[3]);

-		

-			$cond = $match[1].$match[2].$match[3];		

-		}

-		

-		// Assemble the JOIN statement

-		$join = $type.'JOIN '.$this->_protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond;

-

-		$this->ar_join[] = $join;

-		if ($this->ar_caching === TRUE)

-		{

-			$this->ar_cache_join[] = $join;

-			$this->ar_cache_exists[] = 'join';

-		}

-

-		return $this;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Where

-	 *

-	 * Generates the WHERE portion of the query. Separates

-	 * multiple calls with AND

-	 *

-	 * @access	public

-	 * @param	mixed

-	 * @param	mixed

-	 * @return	object

-	 */

-	function where($key, $value = NULL, $escape = TRUE)

-	{

-		return $this->_where($key, $value, 'AND ', $escape);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * OR Where

-	 *

-	 * Generates the WHERE portion of the query. Separates

-	 * multiple calls with OR

-	 *

-	 * @access	public

-	 * @param	mixed

-	 * @param	mixed

-	 * @return	object

-	 */

-	function or_where($key, $value = NULL, $escape = TRUE)

-	{

-		return $this->_where($key, $value, 'OR ', $escape);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * orwhere() is an alias of or_where()

-	 * this function is here for backwards compatibility, as

-	 * orwhere() has been deprecated

-	 */

-	function orwhere($key, $value = NULL, $escape = TRUE)

-	{

-		return $this->or_where($key, $value, $escape);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Where

-	 *

-	 * Called by where() or orwhere()

-	 *

-	 * @access	private

-	 * @param	mixed

-	 * @param	mixed

-	 * @param	string

-	 * @return	object

-	 */

-	function _where($key, $value = NULL, $type = 'AND ', $escape = NULL)

-	{

-		if ( ! is_array($key))

-		{

-			$key = array($key => $value);

-		}

-		

-		// If the escape value was not set will will base it on the global setting

-		if ( ! is_bool($escape))

-		{

-			$escape = $this->_protect_identifiers;

-		}

-

-		foreach ($key as $k => $v)

-		{

-			$prefix = (count($this->ar_where) == 0 AND count($this->ar_cache_where) == 0) ? '' : $type;

-

-			if (is_null($v) && ! $this->_has_operator($k))

-			{

-				// value appears not to have been set, assign the test to IS NULL

-				$k .= ' IS NULL';

-			}

-			

-			if ( ! is_null($v))

-			{

-				if ($escape === TRUE)

-				{

-					$k = $this->_protect_identifiers($k, FALSE, $escape);

-					

-					$v = ' '.$this->escape($v);

-				}

-

-				if ( ! $this->_has_operator($k))

-				{

-					$k .= ' =';

-				}

-			}

-			else

-			{

-				$k = $this->_protect_identifiers($k, FALSE, $escape);			

-			}

-

-			$this->ar_where[] = $prefix.$k.$v;

-			

-			if ($this->ar_caching === TRUE)

-			{

-				$this->ar_cache_where[] = $prefix.$k.$v;

-				$this->ar_cache_exists[] = 'where';

-			}

-			

-		}

-		

-		return $this;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Where_in

-	 *

-	 * Generates a WHERE field IN ('item', 'item') SQL query joined with

-	 * AND if appropriate

-	 *

-	 * @access	public

-	 * @param	string	The field to search

-	 * @param	array	The values searched on

-	 * @return	object

-	 */

-	function where_in($key = NULL, $values = NULL)

-	{

-		return $this->_where_in($key, $values);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Where_in_or

-	 *

-	 * Generates a WHERE field IN ('item', 'item') SQL query joined with

-	 * OR if appropriate

-	 *

-	 * @access	public

-	 * @param	string	The field to search

-	 * @param	array	The values searched on

-	 * @return	object

-	 */

-	function or_where_in($key = NULL, $values = NULL)

-	{

-		return $this->_where_in($key, $values, FALSE, 'OR ');

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Where_not_in

-	 *

-	 * Generates a WHERE field NOT IN ('item', 'item') SQL query joined

-	 * with AND if appropriate

-	 *

-	 * @access	public

-	 * @param	string	The field to search

-	 * @param	array	The values searched on

-	 * @return	object

-	 */

-	function where_not_in($key = NULL, $values = NULL)

-	{

-		return $this->_where_in($key, $values, TRUE);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Where_not_in_or

-	 *

-	 * Generates a WHERE field NOT IN ('item', 'item') SQL query joined

-	 * with OR if appropriate

-	 *

-	 * @access	public

-	 * @param	string	The field to search

-	 * @param	array	The values searched on

-	 * @return	object

-	 */

-	function or_where_not_in($key = NULL, $values = NULL)

-	{

-		return $this->_where_in($key, $values, TRUE, 'OR ');

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Where_in

-	 *

-	 * Called by where_in, where_in_or, where_not_in, where_not_in_or

-	 *

-	 * @access	public

-	 * @param	string	The field to search

-	 * @param	array	The values searched on

-	 * @param	boolean	If the statement would be IN or NOT IN

-	 * @param	string	

-	 * @return	object

-	 */

-	function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ')

-	{

-		if ($key === NULL OR $values === NULL)

-		{

-			return;

-		}

-		

-		if ( ! is_array($values))

-		{

-			$values = array($values);

-		}

-		

-		$not = ($not) ? ' NOT' : '';

-

-		foreach ($values as $value)

-		{

-			$this->ar_wherein[] = $this->escape($value);

-		}

-

-		$prefix = (count($this->ar_where) == 0) ? '' : $type;

- 

-		$where_in = $prefix . $this->_protect_identifiers($key) . $not . " IN (" . implode(", ", $this->ar_wherein) . ") ";

-

-		$this->ar_where[] = $where_in;

-		if ($this->ar_caching === TRUE)

-		{

-			$this->ar_cache_where[] = $where_in;

-			$this->ar_cache_exists[] = 'where';

-		}

-

-		// reset the array for multiple calls

-		$this->ar_wherein = array();

-		return $this;

-	}

-		

-	// --------------------------------------------------------------------

-

-	/**

-	 * Like

-	 *

-	 * Generates a %LIKE% portion of the query. Separates

-	 * multiple calls with AND

-	 *

-	 * @access	public

-	 * @param	mixed

-	 * @param	mixed

-	 * @return	object

-	 */

-	function like($field, $match = '', $side = 'both')

-	{

-		return $this->_like($field, $match, 'AND ', $side);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Not Like

-	 *

-	 * Generates a NOT LIKE portion of the query. Separates

-	 * multiple calls with AND

-	 *

-	 * @access	public

-	 * @param	mixed

-	 * @param	mixed

-	 * @return	object

-	 */

-	function not_like($field, $match = '', $side = 'both')

-	{

-		return $this->_like($field, $match, 'AND ', $side, 'NOT');

-	}

-		

-	// --------------------------------------------------------------------

-

-	/**

-	 * OR Like

-	 *

-	 * Generates a %LIKE% portion of the query. Separates

-	 * multiple calls with OR

-	 *

-	 * @access	public

-	 * @param	mixed

-	 * @param	mixed

-	 * @return	object

-	 */

-	function or_like($field, $match = '', $side = 'both')

-	{

-		return $this->_like($field, $match, 'OR ', $side);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * OR Not Like

-	 *

-	 * Generates a NOT LIKE portion of the query. Separates

-	 * multiple calls with OR

-	 *

-	 * @access	public

-	 * @param	mixed

-	 * @param	mixed

-	 * @return	object

-	 */

-	function or_not_like($field, $match = '', $side = 'both')

-	{

-		return $this->_like($field, $match, 'OR ', $side, 'NOT');

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * orlike() is an alias of or_like()

-	 * this function is here for backwards compatibility, as

-	 * orlike() has been deprecated

-	 */

-	function orlike($field, $match = '', $side = 'both')

-	{

-		return $this->or_like($field, $match, $side);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Like

-	 *

-	 * Called by like() or orlike()

-	 *

-	 * @access	private

-	 * @param	mixed

-	 * @param	mixed

-	 * @param	string

-	 * @return	object

-	 */

-	function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '')

-	{

-		if ( ! is_array($field))

-		{

-			$field = array($field => $match);

-		}

- 	

-		foreach ($field as $k => $v)

-		{

-			$k = $this->_protect_identifiers($k);

-

-			$prefix = (count($this->ar_like) == 0) ? '' : $type;

-

-			$v = $this->escape_str($v);

-

-			if ($side == 'before')

-			{

-				$like_statement = $prefix." $k $not LIKE '%{$v}'";

-			}

-			elseif ($side == 'after')

-			{

-				$like_statement = $prefix." $k $not LIKE '{$v}%'";

-			}

-			else

-			{

-				$like_statement = $prefix." $k $not LIKE '%{$v}%'";

-			}

-			

-			$this->ar_like[] = $like_statement;

-			if ($this->ar_caching === TRUE)

-			{

-				$this->ar_cache_like[] = $like_statement;

-				$this->ar_cache_exists[] = 'like';

-			}

-			

-		}

-		return $this;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * GROUP BY

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	object

-	 */

-	function group_by($by)

-	{

-		if (is_string($by))

-		{

-			$by = explode(',', $by);

-		}

-	

-		foreach ($by as $val)

-		{

-			$val = trim($val);

-		

-			if ($val != '')

-			{

-				$this->ar_groupby[] = $this->_protect_identifiers($val);

-				

-				if ($this->ar_caching === TRUE)

-				{

-					$this->ar_cache_groupby[] = $this->_protect_identifiers($val);

-					$this->ar_cache_exists[] = 'groupby';

-				}

-			}

-		}

-		return $this;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * groupby() is an alias of group_by()

-	 * this function is here for backwards compatibility, as

-	 * groupby() has been deprecated

-	 */

-	function groupby($by)

-	{

-		return $this->group_by($by);

-	}	

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Sets the HAVING value

-	 *

-	 * Separates multiple calls with AND

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @return	object

-	 */

-	function having($key, $value = '', $escape = TRUE)

-	{

-		return $this->_having($key, $value, 'AND ', $escape);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * orhaving() is an alias of or_having()

-	 * this function is here for backwards compatibility, as

-	 * orhaving() has been deprecated

-	 */

-

-	function orhaving($key, $value = '', $escape = TRUE)

-	{

-		return $this->or_having($key, $value, $escape);

-	}	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Sets the OR HAVING value

-	 *

-	 * Separates multiple calls with OR

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @return	object

-	 */

-	function or_having($key, $value = '', $escape = TRUE)

-	{

-		return $this->_having($key, $value, 'OR ', $escape);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Sets the HAVING values

-	 *

-	 * Called by having() or or_having()

-	 *

-	 * @access	private

-	 * @param	string

-	 * @param	string

-	 * @return	object

-	 */

-	function _having($key, $value = '', $type = 'AND ', $escape = TRUE)

-	{

-		if ( ! is_array($key))

-		{

-			$key = array($key => $value);

-		}

-	

-		foreach ($key as $k => $v)

-		{

-			$prefix = (count($this->ar_having) == 0) ? '' : $type;

-

-			if ($escape === TRUE)

-			{

-				$k = $this->_protect_identifiers($k);

-			}

-

-			if ( ! $this->_has_operator($k))

-			{

-				$k .= ' = ';

-			}

-

-			if ($v != '')

-			{

-				$v = ' '.$this->escape_str($v);

-			}

-			

-			$this->ar_having[] = $prefix.$k.$v;

-			if ($this->ar_caching === TRUE)

-			{

-				$this->ar_cache_having[] = $prefix.$k.$v;

-				$this->ar_cache_exists[] = 'having';

-			}

-		}

-		

-		return $this;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Sets the ORDER BY value

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string	direction: asc or desc

-	 * @return	object

-	 */

-	function order_by($orderby, $direction = '')

-	{

-		if (strtolower($direction) == 'random')

-		{

-			$orderby = ''; // Random results want or don't need a field name

-			$direction = $this->_random_keyword;

-		}

-		elseif (trim($direction) != '')

-		{

-			$direction = (in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE)) ? ' '.$direction : ' ASC';

-		}

-	

-	

-		if (strpos($orderby, ',') !== FALSE)

-		{

-			$temp = array();

-			foreach (explode(',', $orderby) as $part)

-			{

-				$part = trim($part);

-				if ( ! in_array($part, $this->ar_aliased_tables))

-				{

-					$part = $this->_protect_identifiers(trim($part));

-				}

-				

-				$temp[] = $part;

-			}

-			

-			$orderby = implode(', ', $temp);			

-		}

-		else

-		{

-			$orderby = $this->_protect_identifiers($orderby);

-		}

-	

-		$orderby_statement = $orderby.$direction;

-		

-		$this->ar_orderby[] = $orderby_statement;

-		if ($this->ar_caching === TRUE)

-		{

-			$this->ar_cache_orderby[] = $orderby_statement;

-			$this->ar_cache_exists[] = 'orderby';

-		}

-

-		return $this;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * orderby() is an alias of order_by()

-	 * this function is here for backwards compatibility, as

-	 * orderby() has been deprecated

-	 */

-	function orderby($orderby, $direction = '')

-	{

-		return $this->order_by($orderby, $direction);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Sets the LIMIT value

-	 *

-	 * @access	public

-	 * @param	integer	the limit value

-	 * @param	integer	the offset value

-	 * @return	object

-	 */

-	function limit($value, $offset = '')

-	{

-		$this->ar_limit = $value;

-

-		if ($offset != '')

-		{

-			$this->ar_offset = $offset;

-		}

-		

-		return $this;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Sets the OFFSET value

-	 *

-	 * @access	public

-	 * @param	integer	the offset value

-	 * @return	object

-	 */

-	function offset($offset)

-	{

-		$this->ar_offset = $offset;

-		return $this;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * The "set" function.  Allows key/value pairs to be set for inserting or updating

-	 *

-	 * @access	public

-	 * @param	mixed

-	 * @param	string

-	 * @param	boolean

-	 * @return	object

-	 */

-	function set($key, $value = '', $escape = TRUE)

-	{

-		$key = $this->_object_to_array($key);

-	

-		if ( ! is_array($key))

-		{

-			$key = array($key => $value);

-		}	

-

-		foreach ($key as $k => $v)

-		{

-			if ($escape === FALSE)

-			{

-				$this->ar_set[$this->_protect_identifiers($k)] = $v;

-			}

-			else

-			{

-				$this->ar_set[$this->_protect_identifiers($k)] = $this->escape($v);

-			}

-		}

-		

-		return $this;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Get

-	 *

-	 * Compiles the select statement based on the other functions called

-	 * and runs the query

-	 *

-	 * @access	public

-	 * @param	string	the table

-	 * @param	string	the limit clause

-	 * @param	string	the offset clause

-	 * @return	object

-	 */

-	function get($table = '', $limit = null, $offset = null)

-	{

-		if ($table != '')

-		{

-			$this->_track_aliases($table);

-			$this->from($table);

-		}

-		

-		if ( ! is_null($limit))

-		{

-			$this->limit($limit, $offset);

-		}

-			

-		$sql = $this->_compile_select();

-

-		$result = $this->query($sql);

-		$this->_reset_select();

-		return $result;

-	}

-

-	/**

-	 * "Count All Results" query

-	 *

-	 * Generates a platform-specific query string that counts all records 

-	 * returned by an Active Record query.

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function count_all_results($table = '')

-	{

-		if ($table != '')

-		{

-			$this->_track_aliases($table);

-			$this->from($table);

-		}

-		

-		$sql = $this->_compile_select($this->_count_string . $this->_protect_identifiers('numrows'));

-

-		$query = $this->query($sql);

-		$this->_reset_select();

-	

-		if ($query->num_rows() == 0)

-		{

-			return '0';

-		}

-

-		$row = $query->row();

-		return $row->numrows;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Get_Where

-	 *

-	 * Allows the where clause, limit and offset to be added directly

-	 *

-	 * @access	public

-	 * @param	string	the where clause

-	 * @param	string	the limit clause

-	 * @param	string	the offset clause

-	 * @return	object

-	 */

-	function get_where($table = '', $where = null, $limit = null, $offset = null)

-	{

-		if ($table != '')

-		{

-			$this->from($table);

-		}

-

-		if ( ! is_null($where))

-		{

-			$this->where($where);

-		}

-		

-		if ( ! is_null($limit))

-		{

-			$this->limit($limit, $offset);

-		}

-			

-		$sql = $this->_compile_select();

-

-		$result = $this->query($sql);

-		$this->_reset_select();

-		return $result;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * getwhere() is an alias of get_where()

-	 * this function is here for backwards compatibility, as

-	 * getwhere() has been deprecated

-	 */

-	function getwhere($table = '', $where = null, $limit = null, $offset = null)

-	{

-		return $this->get_where($table, $where, $limit, $offset);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Insert

-	 *

-	 * Compiles an insert string and runs the query

-	 *

-	 * @access	public

-	 * @param	string	the table to retrieve the results from

-	 * @param	array	an associative array of insert values

-	 * @return	object

-	 */

-	function insert($table = '', $set = NULL)

-	{	

-		if ( ! is_null($set))

-		{

-			$this->set($set);

-		}

-	

-		if (count($this->ar_set) == 0)

-		{

-			if ($this->db_debug)

-			{

-				return $this->display_error('db_must_use_set');

-			}

-			return FALSE;

-		}

-

-		if ($table == '')

-		{

-			if ( ! isset($this->ar_from[0]))

-			{

-				if ($this->db_debug)

-				{

-					return $this->display_error('db_must_set_table');

-				}

-				return FALSE;

-			}

-			

-			$table = $this->ar_from[0];

-		}

-

-		$sql = $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set));

-		

-		$this->_reset_write();

-		return $this->query($sql);		

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Update

-	 *

-	 * Compiles an update string and runs the query

-	 *

-	 * @access	public

-	 * @param	string	the table to retrieve the results from

-	 * @param	array	an associative array of update values

-	 * @param	mixed	the where clause

-	 * @return	object

-	 */

-	function update($table = '', $set = NULL, $where = NULL, $limit = NULL)

-	{

-		// Combine any cached components with the current statements

-		$this->_merge_cache();

-

-		if ( ! is_null($set))

-		{

-			$this->set($set);

-		}

-	

-		if (count($this->ar_set) == 0)

-		{

-			if ($this->db_debug)

-			{

-				return $this->display_error('db_must_use_set');

-			}

-			return FALSE;

-		}

-

-		if ($table == '')

-		{

-			if ( ! isset($this->ar_from[0]))

-			{

-				if ($this->db_debug)

-				{

-					return $this->display_error('db_must_set_table');

-				}

-				return FALSE;

-			}

-			

-			$table = $this->ar_from[0];

-		}

-		

-		if ($where != NULL)

-		{

-			$this->where($where);

-		}

-

-		if ($limit != NULL)

-		{

-			$this->limit($limit);

-		}

-		

-		$sql = $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit);

-		

-		$this->_reset_write();

-		return $this->query($sql);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Empty Table

-	 *

-	 * Compiles a delete string and runs "DELETE FROM table"

-	 *

-	 * @access	public

-	 * @param	string	the table to empty

-	 * @return	object

-	 */

-	function empty_table($table = '')

-	{

-		if ($table == '')

-		{

-			if ( ! isset($this->ar_from[0]))

-			{

-				if ($this->db_debug)

-				{

-					return $this->display_error('db_must_set_table');

-				}

-				return FALSE;

-			}

-

-			$table = $this->ar_from[0];

-		}

-		else

-		{

-			$table = $this->_protect_identifiers($table, TRUE, NULL, FALSE);

-		}

-

-		$sql = $this->_delete($table);

-

-		$this->_reset_write();

-		

-		return $this->query($sql);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Truncate

-	 *

-	 * Compiles a truncate string and runs the query

-	 * If the database does not support the truncate() command

-	 * This function maps to "DELETE FROM table"

-	 *

-	 * @access	public

-	 * @param	string	the table to truncate

-	 * @return	object

-	 */

-	function truncate($table = '')

-	{

-		if ($table == '')

-		{

-			if ( ! isset($this->ar_from[0]))

-			{

-				if ($this->db_debug)

-				{

-					return $this->display_error('db_must_set_table');

-				}

-				return FALSE;

-			}

-

-			$table = $this->ar_from[0];

-		}

-		else

-		{

-			$table = $this->_protect_identifiers($table, TRUE, NULL, FALSE);

-		}

-

-		$sql = $this->_truncate($table);

-

-		$this->_reset_write();

-		

-		return $this->query($sql);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete

-	 *

-	 * Compiles a delete string and runs the query

-	 *

-	 * @access	public

-	 * @param	mixed	the table(s) to delete from. String or array

-	 * @param	mixed	the where clause

-	 * @param	mixed	the limit clause

-	 * @param	boolean

-	 * @return	object

-	 */

-	function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE)

-	{

-		// Combine any cached components with the current statements

-		$this->_merge_cache();

-

-		if ($table == '')

-		{

-			if ( ! isset($this->ar_from[0]))

-			{

-				if ($this->db_debug)

-				{

-					return $this->display_error('db_must_set_table');

-				}

-				return FALSE;

-			}

-

-			$table = $this->ar_from[0];

-		}

-		elseif (is_array($table))

-		{

-			foreach($table as $single_table)

-			{

-				$this->delete($single_table, $where, $limit, FALSE);

-			}

-

-			$this->_reset_write();

-			return;

-		}

-		else

-		{

-			$table = $this->_protect_identifiers($table, TRUE, NULL, FALSE);

-		}

-

-		if ($where != '')

-		{

-			$this->where($where);

-		}

-

-		if ($limit != NULL)

-		{

-			$this->limit($limit);

-		}

-

-		if (count($this->ar_where) == 0 && count($this->ar_like) == 0)

-		{

-			if ($this->db_debug)

-			{

-				return $this->display_error('db_del_must_use_where');

-			}

-

-			return FALSE;

-		}		

-

-		$sql = $this->_delete($table, $this->ar_where, $this->ar_like, $this->ar_limit);

-

-		if ($reset_data)

-		{

-			$this->_reset_write();

-		}

-		

-		return $this->query($sql);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * DB Prefix

-	 *

-	 * Prepends a database prefix if one exists in configuration

-	 *

-	 * @access	public

-	 * @param	string	the table

-	 * @return	string

-	 */

-	function dbprefix($table = '')

-	{

-		if ($table == '')

-		{

-			$this->display_error('db_table_name_required');

-		}

-

-		return $this->dbprefix.$table;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Track Aliases

-	 *

-	 * Used to track SQL statements written with aliased tables.

-	 *

-	 * @access	private

-	 * @param	string	The table to inspect

-	 * @return	string

-	 */	

-	function _track_aliases($table)

-	{

-		if (is_array($table))

-		{

-			foreach ($table as $t)

-			{

-				$this->_track_aliases($t);

-			}

-			return;

-		}

-		

-		// Does the string contain a comma?  If so, we need to separate

-		// the string into discreet statements

-		if (strpos($table, ',') !== FALSE)

-		{

-			return $this->_track_aliases(explode(',', $table));

-		}

-	

-		// if a table alias is used we can recognize it by a space

-		if (strpos($table, " ") !== FALSE)

-		{

-			// if the alias is written with the AS keyword, remove it

-			$table = preg_replace('/ AS /i', ' ', $table);

-			

-			// Grab the alias

-			$table = trim(strrchr($table, " "));

-			

-			// Store the alias, if it doesn't already exist

-			if ( ! in_array($table, $this->ar_aliased_tables))

-			{

-				$this->ar_aliased_tables[] = $table;

-			}

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Compile the SELECT statement

-	 *

-	 * Generates a query string based on which functions were used.

-	 * Should not be called directly.  The get() function calls it.

-	 *

-	 * @access	private

-	 * @return	string

-	 */

-	function _compile_select($select_override = FALSE)

-	{

-		// Combine any cached components with the current statements

-		$this->_merge_cache();

-

-		// ----------------------------------------------------------------

-		

-		// Write the "select" portion of the query

-

-		if ($select_override !== FALSE)

-		{

-			$sql = $select_override;

-		}

-		else

-		{

-			$sql = ( ! $this->ar_distinct) ? 'SELECT ' : 'SELECT DISTINCT ';

-		

-			if (count($this->ar_select) == 0)

-			{

-				$sql .= '*';		

-			}

-			else

-			{				

-				// Cycle through the "select" portion of the query and prep each column name.

-				// The reason we protect identifiers here rather then in the select() function

-				// is because until the user calls the from() function we don't know if there are aliases

-				foreach ($this->ar_select as $key => $val)

-				{

-					$this->ar_select[$key] = $this->_protect_identifiers($val);

-				}

-				

-				$sql .= implode(', ', $this->ar_select);

-			}

-		}

-

-		// ----------------------------------------------------------------

-		

-		// Write the "FROM" portion of the query

-

-		if (count($this->ar_from) > 0)

-		{

-			$sql .= "\nFROM ";

-

-			$sql .= $this->_from_tables($this->ar_from);

-		}

-

-		// ----------------------------------------------------------------

-		

-		// Write the "JOIN" portion of the query

-

-		if (count($this->ar_join) > 0)

-		{

-			$sql .= "\n";

-

-			$sql .= implode("\n", $this->ar_join);

-		}

-

-		// ----------------------------------------------------------------

-		

-		// Write the "WHERE" portion of the query

-

-		if (count($this->ar_where) > 0 OR count($this->ar_like) > 0)

-		{

-			$sql .= "\n";

-

-			$sql .= "WHERE ";

-		}

-

-		$sql .= implode("\n", $this->ar_where);

-

-		// ----------------------------------------------------------------

-		

-		// Write the "LIKE" portion of the query

-	

-		if (count($this->ar_like) > 0)

-		{

-			if (count($this->ar_where) > 0)

-			{

-				$sql .= "\nAND ";

-			}

-

-			$sql .= implode("\n", $this->ar_like);

-		}

-

-		// ----------------------------------------------------------------

-		

-		// Write the "GROUP BY" portion of the query

-	

-		if (count($this->ar_groupby) > 0)

-		{

-			$sql .= "\nGROUP BY ";

-			

-			$sql .= implode(', ', $this->ar_groupby);

-		}

-

-		// ----------------------------------------------------------------

-		

-		// Write the "HAVING" portion of the query

-		

-		if (count($this->ar_having) > 0)

-		{

-			$sql .= "\nHAVING ";

-			$sql .= implode("\n", $this->ar_having);

-		}

-

-		// ----------------------------------------------------------------

-		

-		// Write the "ORDER BY" portion of the query

-

-		if (count($this->ar_orderby) > 0)

-		{

-			$sql .= "\nORDER BY ";

-			$sql .= implode(', ', $this->ar_orderby);

-			

-			if ($this->ar_order !== FALSE)

-			{

-				$sql .= ($this->ar_order == 'desc') ? ' DESC' : ' ASC';

-			}		

-		}

-

-		// ----------------------------------------------------------------

-		

-		// Write the "LIMIT" portion of the query

-		

-		if (is_numeric($this->ar_limit))

-		{

-			$sql .= "\n";

-			$sql = $this->_limit($sql, $this->ar_limit, $this->ar_offset);

-		}

-

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Object to Array

-	 *

-	 * Takes an object as input and converts the class variables to array key/vals

-	 *

-	 * @access	public

-	 * @param	object

-	 * @return	array

-	 */

-	function _object_to_array($object)

-	{

-		if ( ! is_object($object))

-		{

-			return $object;

-		}

-		

-		$array = array();

-		foreach (get_object_vars($object) as $key => $val)

-		{

-			// There are some built in keys we need to ignore for this conversion

-			if ( ! is_object($val) && ! is_array($val) && $key != '_parent_name' && $key != '_ci_scaffolding' && $key != '_ci_scaff_table')

-			{

-				$array[$key] = $val;

-			}

-		}

-	

-		return $array;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Start Cache

-	 *

-	 * Starts AR caching

-	 *

-	 * @access	public

-	 * @return	void

-	 */		

-	function start_cache()

-	{

-		$this->ar_caching = TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Stop Cache

-	 *

-	 * Stops AR caching

-	 *

-	 * @access	public

-	 * @return	void

-	 */		

-	function stop_cache()

-	{

-		$this->ar_caching = FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Flush Cache

-	 *

-	 * Empties the AR cache

-	 *

-	 * @access	public

-	 * @return	void

-	 */	

-	function flush_cache()

-	{	

-		$this->_reset_run(

-							array(

-									'ar_cache_select'	=> array(), 

-									'ar_cache_from'		=> array(), 

-									'ar_cache_join'		=> array(),

-									'ar_cache_where'	=> array(), 

-									'ar_cache_like'		=> array(), 

-									'ar_cache_groupby'	=> array(), 

-									'ar_cache_having'	=> array(), 

-									'ar_cache_orderby'	=> array(), 

-									'ar_cache_set'		=> array(),

-									'ar_cache_exists'	=> array()

-								)

-							);	

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Merge Cache

-	 *

-	 * When called, this function merges any cached AR arrays with 

-	 * locally called ones.

-	 *

-	 * @access	private

-	 * @return	void

-	 */

-	function _merge_cache()

-	{

-		if (count($this->ar_cache_exists) == 0)

-		{

-			return;

-		}

-

-		foreach ($this->ar_cache_exists as $val)

-		{

-			$ar_variable	= 'ar_'.$val;

-			$ar_cache_var	= 'ar_cache_'.$val;

-

-			if (count($this->$ar_cache_var) == 0)

-			{

-				continue;

-			}

-

-			$this->$ar_variable = array_unique(array_merge($this->$ar_cache_var, $this->$ar_variable));

-		}

-

-		// If we are "protecting identifiers" we need to examine the "from"

-		// portion of the query to determine if there are any aliases

-		if ($this->_protect_identifiers === TRUE AND count($this->ar_cache_from) > 0)

-		{

-			$this->_track_aliases($this->ar_from);

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Resets the active record values.  Called by the get() function

-	 *

-	 * @access	private

-	 * @param	array	An array of fields to reset

-	 * @return	void

-	 */

-	function _reset_run($ar_reset_items)

-	{

-		foreach ($ar_reset_items as $item => $default_value)

-		{

-			if ( ! in_array($item, $this->ar_store_array))

-			{

-				$this->$item = $default_value;

-			}

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Resets the active record values.  Called by the get() function

-	 *

-	 * @access	private

-	 * @return	void

-	 */

-	function _reset_select()

-	{

-		$ar_reset_items = array(

-								'ar_select'			=> array(), 

-								'ar_from'			=> array(), 

-								'ar_join'			=> array(), 

-								'ar_where'			=> array(), 

-								'ar_like'			=> array(), 

-								'ar_groupby'		=> array(), 

-								'ar_having'			=> array(), 

-								'ar_orderby'		=> array(), 

-								'ar_wherein'		=> array(), 

-								'ar_aliased_tables'	=> array(),

-								'ar_distinct'		=> FALSE, 

-								'ar_limit'			=> FALSE, 

-								'ar_offset'			=> FALSE, 

-								'ar_order'			=> FALSE,

-							);

-		

-		$this->_reset_run($ar_reset_items);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Resets the active record "write" values.

-	 *

-	 * Called by the insert() update() and delete() functions

-	 *

-	 * @access	private

-	 * @return	void

-	 */

-	function _reset_write()

-	{	

-		$ar_reset_items = array(

-								'ar_set'		=> array(), 

-								'ar_from'		=> array(), 

-								'ar_where'		=> array(), 

-								'ar_like'		=> array(),

-								'ar_orderby'	=> array(), 

-								'ar_limit'		=> FALSE, 

-								'ar_order'		=> FALSE

-								);

-

-		$this->_reset_run($ar_reset_items);

-	}

-	

-}

-

-/* End of file DB_active_rec.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Active Record Class
+ *
+ * This is the platform-independent base Active Record implementation class.
+ *
+ * @package		CodeIgniter
+ * @subpackage	Drivers
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_active_record extends CI_DB_driver {
+
+	var $ar_select				= array();
+	var $ar_distinct			= FALSE;
+	var $ar_from				= array();
+	var $ar_join				= array();
+	var $ar_where				= array();
+	var $ar_like				= array();
+	var $ar_groupby				= array();
+	var $ar_having				= array();
+	var $ar_limit				= FALSE;
+	var $ar_offset				= FALSE;
+	var $ar_order				= FALSE;
+	var $ar_orderby				= array();
+	var $ar_set					= array();	
+	var $ar_wherein				= array();
+	var $ar_aliased_tables		= array();
+	var $ar_store_array			= array();
+	
+	// Active Record Caching variables
+	var $ar_caching 			= FALSE;
+	var $ar_cache_exists		= array();
+	var $ar_cache_select		= array();
+	var $ar_cache_from			= array();
+	var $ar_cache_join			= array();
+	var $ar_cache_where			= array();
+	var $ar_cache_like			= array();
+	var $ar_cache_groupby		= array();
+	var $ar_cache_having		= array();
+	var $ar_cache_orderby		= array();
+	var $ar_cache_set			= array();	
+
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Select
+	 *
+	 * Generates the SELECT portion of the query
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	object
+	 */
+	function select($select = '*', $escape = NULL)
+	{
+		// Set the global value if this was sepecified	
+		if (is_bool($escape))
+		{
+			$this->_protect_identifiers = $escape;
+		}
+		
+		if (is_string($select))
+		{
+			$select = explode(',', $select);
+		}
+
+		foreach ($select as $val)
+		{
+			$val = trim($val);
+
+			if ($val != '')
+			{
+				$this->ar_select[] = $val;
+
+				if ($this->ar_caching === TRUE)
+				{
+					$this->ar_cache_select[] = $val;
+					$this->ar_cache_exists[] = 'select';
+				}
+			}
+		}
+		return $this;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Select Max
+	 *
+	 * Generates a SELECT MAX(field) portion of a query
+	 *
+	 * @access	public
+	 * @param	string	the field
+	 * @param	string	an alias
+	 * @return	object
+	 */
+	function select_max($select = '', $alias = '')
+	{
+		return $this->_max_min_avg_sum($select, $alias, 'MAX');
+	}
+		
+	// --------------------------------------------------------------------
+
+	/**
+	 * Select Min
+	 *
+	 * Generates a SELECT MIN(field) portion of a query
+	 *
+	 * @access	public
+	 * @param	string	the field
+	 * @param	string	an alias
+	 * @return	object
+	 */
+	function select_min($select = '', $alias = '')
+	{
+		return $this->_max_min_avg_sum($select, $alias, 'MIN');
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Select Average
+	 *
+	 * Generates a SELECT AVG(field) portion of a query
+	 *
+	 * @access	public
+	 * @param	string	the field
+	 * @param	string	an alias
+	 * @return	object
+	 */
+	function select_avg($select = '', $alias = '')
+	{
+		return $this->_max_min_avg_sum($select, $alias, 'AVG');
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Select Sum
+	 *
+	 * Generates a SELECT SUM(field) portion of a query
+	 *
+	 * @access	public
+	 * @param	string	the field
+	 * @param	string	an alias
+	 * @return	object
+	 */
+	function select_sum($select = '', $alias = '')
+	{
+		return $this->_max_min_avg_sum($select, $alias, 'SUM');
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Processing Function for the four functions above:
+	 *
+	 *	select_max()
+	 *	select_min()
+	 *	select_avg()
+	 *  select_sum()
+	 *	
+	 * @access	public
+	 * @param	string	the field
+	 * @param	string	an alias
+	 * @return	object
+	 */
+	function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX')
+	{
+		if ( ! is_string($select) OR $select == '')
+		{
+			$this->display_error('db_invalid_query');
+		}
+	
+		$type = strtoupper($type);
+	
+		if ( ! in_array($type, array('MAX', 'MIN', 'AVG', 'SUM')))
+		{
+			show_error('Invalid function type: '.$type);
+		}
+	
+		if ($alias == '')
+		{
+			$alias = $this->_create_alias_from_table(trim($select));
+		}
+	
+		$sql = $type.'('.$this->_protect_identifiers(trim($select)).') AS '.$alias;
+
+		$this->ar_select[] = $sql;
+		
+		if ($this->ar_caching === TRUE)
+		{
+			$this->ar_cache_select[] = $sql;
+			$this->ar_cache_exists[] = 'select';
+		}
+		
+		return $this;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Determines the alias name based on the table
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	string
+	 */
+	function _create_alias_from_table($item)
+	{
+		if (strpos($item, '.') !== FALSE)
+		{
+			return end(explode('.', $item));
+		}
+		
+		return $item;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * DISTINCT
+	 *
+	 * Sets a flag which tells the query string compiler to add DISTINCT
+	 *
+	 * @access	public
+	 * @param	bool
+	 * @return	object
+	 */
+	function distinct($val = TRUE)
+	{
+		$this->ar_distinct = (is_bool($val)) ? $val : TRUE;
+		return $this;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * From
+	 *
+	 * Generates the FROM portion of the query
+	 *
+	 * @access	public
+	 * @param	mixed	can be a string or array
+	 * @return	object
+	 */
+	function from($from)
+	{
+		foreach ((array)$from as $val)
+		{
+			if (strpos($val, ',') !== FALSE)
+			{
+				foreach (explode(',', $val) as $v)
+				{
+					$v = trim($v);
+					$this->_track_aliases($v);
+
+					$this->ar_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE);
+					
+					if ($this->ar_caching === TRUE)
+					{
+						$this->ar_cache_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE);
+						$this->ar_cache_exists[] = 'from';
+					}				
+				}
+
+			}
+			else
+			{
+				$val = trim($val);
+
+				// Extract any aliases that might exist.  We use this information
+				// in the _protect_identifiers to know whether to add a table prefix 
+				$this->_track_aliases($val);
+	
+				$this->ar_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE);
+				
+				if ($this->ar_caching === TRUE)
+				{
+					$this->ar_cache_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE);
+					$this->ar_cache_exists[] = 'from';
+				}
+			}
+		}
+
+		return $this;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Join
+	 *
+	 * Generates the JOIN portion of the query
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string	the join condition
+	 * @param	string	the type of join
+	 * @return	object
+	 */
+	function join($table, $cond, $type = '')
+	{		
+		if ($type != '')
+		{
+			$type = strtoupper(trim($type));
+
+			if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER')))
+			{
+				$type = '';
+			}
+			else
+			{
+				$type .= ' ';
+			}
+		}
+
+		// Extract any aliases that might exist.  We use this information
+		// in the _protect_identifiers to know whether to add a table prefix 
+		$this->_track_aliases($table);
+
+		// Strip apart the condition and protect the identifiers
+		if (preg_match('/([\w\.]+)([\W\s]+)(.+)/', $cond, $match))
+		{
+			$match[1] = $this->_protect_identifiers($match[1]);
+			$match[3] = $this->_protect_identifiers($match[3]);
+		
+			$cond = $match[1].$match[2].$match[3];		
+		}
+		
+		// Assemble the JOIN statement
+		$join = $type.'JOIN '.$this->_protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond;
+
+		$this->ar_join[] = $join;
+		if ($this->ar_caching === TRUE)
+		{
+			$this->ar_cache_join[] = $join;
+			$this->ar_cache_exists[] = 'join';
+		}
+
+		return $this;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Where
+	 *
+	 * Generates the WHERE portion of the query. Separates
+	 * multiple calls with AND
+	 *
+	 * @access	public
+	 * @param	mixed
+	 * @param	mixed
+	 * @return	object
+	 */
+	function where($key, $value = NULL, $escape = TRUE)
+	{
+		return $this->_where($key, $value, 'AND ', $escape);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * OR Where
+	 *
+	 * Generates the WHERE portion of the query. Separates
+	 * multiple calls with OR
+	 *
+	 * @access	public
+	 * @param	mixed
+	 * @param	mixed
+	 * @return	object
+	 */
+	function or_where($key, $value = NULL, $escape = TRUE)
+	{
+		return $this->_where($key, $value, 'OR ', $escape);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * orwhere() is an alias of or_where()
+	 * this function is here for backwards compatibility, as
+	 * orwhere() has been deprecated
+	 */
+	function orwhere($key, $value = NULL, $escape = TRUE)
+	{
+		return $this->or_where($key, $value, $escape);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Where
+	 *
+	 * Called by where() or orwhere()
+	 *
+	 * @access	private
+	 * @param	mixed
+	 * @param	mixed
+	 * @param	string
+	 * @return	object
+	 */
+	function _where($key, $value = NULL, $type = 'AND ', $escape = NULL)
+	{
+		if ( ! is_array($key))
+		{
+			$key = array($key => $value);
+		}
+		
+		// If the escape value was not set will will base it on the global setting
+		if ( ! is_bool($escape))
+		{
+			$escape = $this->_protect_identifiers;
+		}
+
+		foreach ($key as $k => $v)
+		{
+			$prefix = (count($this->ar_where) == 0 AND count($this->ar_cache_where) == 0) ? '' : $type;
+
+			if (is_null($v) && ! $this->_has_operator($k))
+			{
+				// value appears not to have been set, assign the test to IS NULL
+				$k .= ' IS NULL';
+			}
+			
+			if ( ! is_null($v))
+			{
+				if ($escape === TRUE)
+				{
+					$k = $this->_protect_identifiers($k, FALSE, $escape);
+					
+					$v = ' '.$this->escape($v);
+				}
+
+				if ( ! $this->_has_operator($k))
+				{
+					$k .= ' =';
+				}
+			}
+			else
+			{
+				$k = $this->_protect_identifiers($k, FALSE, $escape);			
+			}
+
+			$this->ar_where[] = $prefix.$k.$v;
+			
+			if ($this->ar_caching === TRUE)
+			{
+				$this->ar_cache_where[] = $prefix.$k.$v;
+				$this->ar_cache_exists[] = 'where';
+			}
+			
+		}
+		
+		return $this;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Where_in
+	 *
+	 * Generates a WHERE field IN ('item', 'item') SQL query joined with
+	 * AND if appropriate
+	 *
+	 * @access	public
+	 * @param	string	The field to search
+	 * @param	array	The values searched on
+	 * @return	object
+	 */
+	function where_in($key = NULL, $values = NULL)
+	{
+		return $this->_where_in($key, $values);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Where_in_or
+	 *
+	 * Generates a WHERE field IN ('item', 'item') SQL query joined with
+	 * OR if appropriate
+	 *
+	 * @access	public
+	 * @param	string	The field to search
+	 * @param	array	The values searched on
+	 * @return	object
+	 */
+	function or_where_in($key = NULL, $values = NULL)
+	{
+		return $this->_where_in($key, $values, FALSE, 'OR ');
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Where_not_in
+	 *
+	 * Generates a WHERE field NOT IN ('item', 'item') SQL query joined
+	 * with AND if appropriate
+	 *
+	 * @access	public
+	 * @param	string	The field to search
+	 * @param	array	The values searched on
+	 * @return	object
+	 */
+	function where_not_in($key = NULL, $values = NULL)
+	{
+		return $this->_where_in($key, $values, TRUE);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Where_not_in_or
+	 *
+	 * Generates a WHERE field NOT IN ('item', 'item') SQL query joined
+	 * with OR if appropriate
+	 *
+	 * @access	public
+	 * @param	string	The field to search
+	 * @param	array	The values searched on
+	 * @return	object
+	 */
+	function or_where_not_in($key = NULL, $values = NULL)
+	{
+		return $this->_where_in($key, $values, TRUE, 'OR ');
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Where_in
+	 *
+	 * Called by where_in, where_in_or, where_not_in, where_not_in_or
+	 *
+	 * @access	public
+	 * @param	string	The field to search
+	 * @param	array	The values searched on
+	 * @param	boolean	If the statement would be IN or NOT IN
+	 * @param	string	
+	 * @return	object
+	 */
+	function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ')
+	{
+		if ($key === NULL OR $values === NULL)
+		{
+			return;
+		}
+		
+		if ( ! is_array($values))
+		{
+			$values = array($values);
+		}
+		
+		$not = ($not) ? ' NOT' : '';
+
+		foreach ($values as $value)
+		{
+			$this->ar_wherein[] = $this->escape($value);
+		}
+
+		$prefix = (count($this->ar_where) == 0) ? '' : $type;
+ 
+		$where_in = $prefix . $this->_protect_identifiers($key) . $not . " IN (" . implode(", ", $this->ar_wherein) . ") ";
+
+		$this->ar_where[] = $where_in;
+		if ($this->ar_caching === TRUE)
+		{
+			$this->ar_cache_where[] = $where_in;
+			$this->ar_cache_exists[] = 'where';
+		}
+
+		// reset the array for multiple calls
+		$this->ar_wherein = array();
+		return $this;
+	}
+		
+	// --------------------------------------------------------------------
+
+	/**
+	 * Like
+	 *
+	 * Generates a %LIKE% portion of the query. Separates
+	 * multiple calls with AND
+	 *
+	 * @access	public
+	 * @param	mixed
+	 * @param	mixed
+	 * @return	object
+	 */
+	function like($field, $match = '', $side = 'both')
+	{
+		return $this->_like($field, $match, 'AND ', $side);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Not Like
+	 *
+	 * Generates a NOT LIKE portion of the query. Separates
+	 * multiple calls with AND
+	 *
+	 * @access	public
+	 * @param	mixed
+	 * @param	mixed
+	 * @return	object
+	 */
+	function not_like($field, $match = '', $side = 'both')
+	{
+		return $this->_like($field, $match, 'AND ', $side, 'NOT');
+	}
+		
+	// --------------------------------------------------------------------
+
+	/**
+	 * OR Like
+	 *
+	 * Generates a %LIKE% portion of the query. Separates
+	 * multiple calls with OR
+	 *
+	 * @access	public
+	 * @param	mixed
+	 * @param	mixed
+	 * @return	object
+	 */
+	function or_like($field, $match = '', $side = 'both')
+	{
+		return $this->_like($field, $match, 'OR ', $side);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * OR Not Like
+	 *
+	 * Generates a NOT LIKE portion of the query. Separates
+	 * multiple calls with OR
+	 *
+	 * @access	public
+	 * @param	mixed
+	 * @param	mixed
+	 * @return	object
+	 */
+	function or_not_like($field, $match = '', $side = 'both')
+	{
+		return $this->_like($field, $match, 'OR ', $side, 'NOT');
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * orlike() is an alias of or_like()
+	 * this function is here for backwards compatibility, as
+	 * orlike() has been deprecated
+	 */
+	function orlike($field, $match = '', $side = 'both')
+	{
+		return $this->or_like($field, $match, $side);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Like
+	 *
+	 * Called by like() or orlike()
+	 *
+	 * @access	private
+	 * @param	mixed
+	 * @param	mixed
+	 * @param	string
+	 * @return	object
+	 */
+	function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '')
+	{
+		if ( ! is_array($field))
+		{
+			$field = array($field => $match);
+		}
+ 	
+		foreach ($field as $k => $v)
+		{
+			$k = $this->_protect_identifiers($k);
+
+			$prefix = (count($this->ar_like) == 0) ? '' : $type;
+
+			$v = $this->escape_str($v);
+
+			if ($side == 'before')
+			{
+				$like_statement = $prefix." $k $not LIKE '%{$v}'";
+			}
+			elseif ($side == 'after')
+			{
+				$like_statement = $prefix." $k $not LIKE '{$v}%'";
+			}
+			else
+			{
+				$like_statement = $prefix." $k $not LIKE '%{$v}%'";
+			}
+			
+			$this->ar_like[] = $like_statement;
+			if ($this->ar_caching === TRUE)
+			{
+				$this->ar_cache_like[] = $like_statement;
+				$this->ar_cache_exists[] = 'like';
+			}
+			
+		}
+		return $this;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * GROUP BY
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	object
+	 */
+	function group_by($by)
+	{
+		if (is_string($by))
+		{
+			$by = explode(',', $by);
+		}
+	
+		foreach ($by as $val)
+		{
+			$val = trim($val);
+		
+			if ($val != '')
+			{
+				$this->ar_groupby[] = $this->_protect_identifiers($val);
+				
+				if ($this->ar_caching === TRUE)
+				{
+					$this->ar_cache_groupby[] = $this->_protect_identifiers($val);
+					$this->ar_cache_exists[] = 'groupby';
+				}
+			}
+		}
+		return $this;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * groupby() is an alias of group_by()
+	 * this function is here for backwards compatibility, as
+	 * groupby() has been deprecated
+	 */
+	function groupby($by)
+	{
+		return $this->group_by($by);
+	}	
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Sets the HAVING value
+	 *
+	 * Separates multiple calls with AND
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @return	object
+	 */
+	function having($key, $value = '', $escape = TRUE)
+	{
+		return $this->_having($key, $value, 'AND ', $escape);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * orhaving() is an alias of or_having()
+	 * this function is here for backwards compatibility, as
+	 * orhaving() has been deprecated
+	 */
+
+	function orhaving($key, $value = '', $escape = TRUE)
+	{
+		return $this->or_having($key, $value, $escape);
+	}	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Sets the OR HAVING value
+	 *
+	 * Separates multiple calls with OR
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @return	object
+	 */
+	function or_having($key, $value = '', $escape = TRUE)
+	{
+		return $this->_having($key, $value, 'OR ', $escape);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Sets the HAVING values
+	 *
+	 * Called by having() or or_having()
+	 *
+	 * @access	private
+	 * @param	string
+	 * @param	string
+	 * @return	object
+	 */
+	function _having($key, $value = '', $type = 'AND ', $escape = TRUE)
+	{
+		if ( ! is_array($key))
+		{
+			$key = array($key => $value);
+		}
+	
+		foreach ($key as $k => $v)
+		{
+			$prefix = (count($this->ar_having) == 0) ? '' : $type;
+
+			if ($escape === TRUE)
+			{
+				$k = $this->_protect_identifiers($k);
+			}
+
+			if ( ! $this->_has_operator($k))
+			{
+				$k .= ' = ';
+			}
+
+			if ($v != '')
+			{
+				$v = ' '.$this->escape_str($v);
+			}
+			
+			$this->ar_having[] = $prefix.$k.$v;
+			if ($this->ar_caching === TRUE)
+			{
+				$this->ar_cache_having[] = $prefix.$k.$v;
+				$this->ar_cache_exists[] = 'having';
+			}
+		}
+		
+		return $this;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Sets the ORDER BY value
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string	direction: asc or desc
+	 * @return	object
+	 */
+	function order_by($orderby, $direction = '')
+	{
+		if (strtolower($direction) == 'random')
+		{
+			$orderby = ''; // Random results want or don't need a field name
+			$direction = $this->_random_keyword;
+		}
+		elseif (trim($direction) != '')
+		{
+			$direction = (in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE)) ? ' '.$direction : ' ASC';
+		}
+	
+	
+		if (strpos($orderby, ',') !== FALSE)
+		{
+			$temp = array();
+			foreach (explode(',', $orderby) as $part)
+			{
+				$part = trim($part);
+				if ( ! in_array($part, $this->ar_aliased_tables))
+				{
+					$part = $this->_protect_identifiers(trim($part));
+				}
+				
+				$temp[] = $part;
+			}
+			
+			$orderby = implode(', ', $temp);			
+		}
+		else
+		{
+			$orderby = $this->_protect_identifiers($orderby);
+		}
+	
+		$orderby_statement = $orderby.$direction;
+		
+		$this->ar_orderby[] = $orderby_statement;
+		if ($this->ar_caching === TRUE)
+		{
+			$this->ar_cache_orderby[] = $orderby_statement;
+			$this->ar_cache_exists[] = 'orderby';
+		}
+
+		return $this;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * orderby() is an alias of order_by()
+	 * this function is here for backwards compatibility, as
+	 * orderby() has been deprecated
+	 */
+	function orderby($orderby, $direction = '')
+	{
+		return $this->order_by($orderby, $direction);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Sets the LIMIT value
+	 *
+	 * @access	public
+	 * @param	integer	the limit value
+	 * @param	integer	the offset value
+	 * @return	object
+	 */
+	function limit($value, $offset = '')
+	{
+		$this->ar_limit = $value;
+
+		if ($offset != '')
+		{
+			$this->ar_offset = $offset;
+		}
+		
+		return $this;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Sets the OFFSET value
+	 *
+	 * @access	public
+	 * @param	integer	the offset value
+	 * @return	object
+	 */
+	function offset($offset)
+	{
+		$this->ar_offset = $offset;
+		return $this;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * The "set" function.  Allows key/value pairs to be set for inserting or updating
+	 *
+	 * @access	public
+	 * @param	mixed
+	 * @param	string
+	 * @param	boolean
+	 * @return	object
+	 */
+	function set($key, $value = '', $escape = TRUE)
+	{
+		$key = $this->_object_to_array($key);
+	
+		if ( ! is_array($key))
+		{
+			$key = array($key => $value);
+		}	
+
+		foreach ($key as $k => $v)
+		{
+			if ($escape === FALSE)
+			{
+				$this->ar_set[$this->_protect_identifiers($k)] = $v;
+			}
+			else
+			{
+				$this->ar_set[$this->_protect_identifiers($k)] = $this->escape($v);
+			}
+		}
+		
+		return $this;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Get
+	 *
+	 * Compiles the select statement based on the other functions called
+	 * and runs the query
+	 *
+	 * @access	public
+	 * @param	string	the table
+	 * @param	string	the limit clause
+	 * @param	string	the offset clause
+	 * @return	object
+	 */
+	function get($table = '', $limit = null, $offset = null)
+	{
+		if ($table != '')
+		{
+			$this->_track_aliases($table);
+			$this->from($table);
+		}
+		
+		if ( ! is_null($limit))
+		{
+			$this->limit($limit, $offset);
+		}
+			
+		$sql = $this->_compile_select();
+
+		$result = $this->query($sql);
+		$this->_reset_select();
+		return $result;
+	}
+
+	/**
+	 * "Count All Results" query
+	 *
+	 * Generates a platform-specific query string that counts all records 
+	 * returned by an Active Record query.
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function count_all_results($table = '')
+	{
+		if ($table != '')
+		{
+			$this->_track_aliases($table);
+			$this->from($table);
+		}
+		
+		$sql = $this->_compile_select($this->_count_string . $this->_protect_identifiers('numrows'));
+
+		$query = $this->query($sql);
+		$this->_reset_select();
+	
+		if ($query->num_rows() == 0)
+		{
+			return '0';
+		}
+
+		$row = $query->row();
+		return $row->numrows;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Get_Where
+	 *
+	 * Allows the where clause, limit and offset to be added directly
+	 *
+	 * @access	public
+	 * @param	string	the where clause
+	 * @param	string	the limit clause
+	 * @param	string	the offset clause
+	 * @return	object
+	 */
+	function get_where($table = '', $where = null, $limit = null, $offset = null)
+	{
+		if ($table != '')
+		{
+			$this->from($table);
+		}
+
+		if ( ! is_null($where))
+		{
+			$this->where($where);
+		}
+		
+		if ( ! is_null($limit))
+		{
+			$this->limit($limit, $offset);
+		}
+			
+		$sql = $this->_compile_select();
+
+		$result = $this->query($sql);
+		$this->_reset_select();
+		return $result;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * getwhere() is an alias of get_where()
+	 * this function is here for backwards compatibility, as
+	 * getwhere() has been deprecated
+	 */
+	function getwhere($table = '', $where = null, $limit = null, $offset = null)
+	{
+		return $this->get_where($table, $where, $limit, $offset);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Insert
+	 *
+	 * Compiles an insert string and runs the query
+	 *
+	 * @access	public
+	 * @param	string	the table to retrieve the results from
+	 * @param	array	an associative array of insert values
+	 * @return	object
+	 */
+	function insert($table = '', $set = NULL)
+	{	
+		if ( ! is_null($set))
+		{
+			$this->set($set);
+		}
+	
+		if (count($this->ar_set) == 0)
+		{
+			if ($this->db_debug)
+			{
+				return $this->display_error('db_must_use_set');
+			}
+			return FALSE;
+		}
+
+		if ($table == '')
+		{
+			if ( ! isset($this->ar_from[0]))
+			{
+				if ($this->db_debug)
+				{
+					return $this->display_error('db_must_set_table');
+				}
+				return FALSE;
+			}
+			
+			$table = $this->ar_from[0];
+		}
+
+		$sql = $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set));
+		
+		$this->_reset_write();
+		return $this->query($sql);		
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Update
+	 *
+	 * Compiles an update string and runs the query
+	 *
+	 * @access	public
+	 * @param	string	the table to retrieve the results from
+	 * @param	array	an associative array of update values
+	 * @param	mixed	the where clause
+	 * @return	object
+	 */
+	function update($table = '', $set = NULL, $where = NULL, $limit = NULL)
+	{
+		// Combine any cached components with the current statements
+		$this->_merge_cache();
+
+		if ( ! is_null($set))
+		{
+			$this->set($set);
+		}
+	
+		if (count($this->ar_set) == 0)
+		{
+			if ($this->db_debug)
+			{
+				return $this->display_error('db_must_use_set');
+			}
+			return FALSE;
+		}
+
+		if ($table == '')
+		{
+			if ( ! isset($this->ar_from[0]))
+			{
+				if ($this->db_debug)
+				{
+					return $this->display_error('db_must_set_table');
+				}
+				return FALSE;
+			}
+			
+			$table = $this->ar_from[0];
+		}
+		
+		if ($where != NULL)
+		{
+			$this->where($where);
+		}
+
+		if ($limit != NULL)
+		{
+			$this->limit($limit);
+		}
+		
+		$sql = $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit);
+		
+		$this->_reset_write();
+		return $this->query($sql);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Empty Table
+	 *
+	 * Compiles a delete string and runs "DELETE FROM table"
+	 *
+	 * @access	public
+	 * @param	string	the table to empty
+	 * @return	object
+	 */
+	function empty_table($table = '')
+	{
+		if ($table == '')
+		{
+			if ( ! isset($this->ar_from[0]))
+			{
+				if ($this->db_debug)
+				{
+					return $this->display_error('db_must_set_table');
+				}
+				return FALSE;
+			}
+
+			$table = $this->ar_from[0];
+		}
+		else
+		{
+			$table = $this->_protect_identifiers($table, TRUE, NULL, FALSE);
+		}
+
+		$sql = $this->_delete($table);
+
+		$this->_reset_write();
+		
+		return $this->query($sql);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Truncate
+	 *
+	 * Compiles a truncate string and runs the query
+	 * If the database does not support the truncate() command
+	 * This function maps to "DELETE FROM table"
+	 *
+	 * @access	public
+	 * @param	string	the table to truncate
+	 * @return	object
+	 */
+	function truncate($table = '')
+	{
+		if ($table == '')
+		{
+			if ( ! isset($this->ar_from[0]))
+			{
+				if ($this->db_debug)
+				{
+					return $this->display_error('db_must_set_table');
+				}
+				return FALSE;
+			}
+
+			$table = $this->ar_from[0];
+		}
+		else
+		{
+			$table = $this->_protect_identifiers($table, TRUE, NULL, FALSE);
+		}
+
+		$sql = $this->_truncate($table);
+
+		$this->_reset_write();
+		
+		return $this->query($sql);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete
+	 *
+	 * Compiles a delete string and runs the query
+	 *
+	 * @access	public
+	 * @param	mixed	the table(s) to delete from. String or array
+	 * @param	mixed	the where clause
+	 * @param	mixed	the limit clause
+	 * @param	boolean
+	 * @return	object
+	 */
+	function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE)
+	{
+		// Combine any cached components with the current statements
+		$this->_merge_cache();
+
+		if ($table == '')
+		{
+			if ( ! isset($this->ar_from[0]))
+			{
+				if ($this->db_debug)
+				{
+					return $this->display_error('db_must_set_table');
+				}
+				return FALSE;
+			}
+
+			$table = $this->ar_from[0];
+		}
+		elseif (is_array($table))
+		{
+			foreach($table as $single_table)
+			{
+				$this->delete($single_table, $where, $limit, FALSE);
+			}
+
+			$this->_reset_write();
+			return;
+		}
+		else
+		{
+			$table = $this->_protect_identifiers($table, TRUE, NULL, FALSE);
+		}
+
+		if ($where != '')
+		{
+			$this->where($where);
+		}
+
+		if ($limit != NULL)
+		{
+			$this->limit($limit);
+		}
+
+		if (count($this->ar_where) == 0 && count($this->ar_like) == 0)
+		{
+			if ($this->db_debug)
+			{
+				return $this->display_error('db_del_must_use_where');
+			}
+
+			return FALSE;
+		}		
+
+		$sql = $this->_delete($table, $this->ar_where, $this->ar_like, $this->ar_limit);
+
+		if ($reset_data)
+		{
+			$this->_reset_write();
+		}
+		
+		return $this->query($sql);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * DB Prefix
+	 *
+	 * Prepends a database prefix if one exists in configuration
+	 *
+	 * @access	public
+	 * @param	string	the table
+	 * @return	string
+	 */
+	function dbprefix($table = '')
+	{
+		if ($table == '')
+		{
+			$this->display_error('db_table_name_required');
+		}
+
+		return $this->dbprefix.$table;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Track Aliases
+	 *
+	 * Used to track SQL statements written with aliased tables.
+	 *
+	 * @access	private
+	 * @param	string	The table to inspect
+	 * @return	string
+	 */	
+	function _track_aliases($table)
+	{
+		if (is_array($table))
+		{
+			foreach ($table as $t)
+			{
+				$this->_track_aliases($t);
+			}
+			return;
+		}
+		
+		// Does the string contain a comma?  If so, we need to separate
+		// the string into discreet statements
+		if (strpos($table, ',') !== FALSE)
+		{
+			return $this->_track_aliases(explode(',', $table));
+		}
+	
+		// if a table alias is used we can recognize it by a space
+		if (strpos($table, " ") !== FALSE)
+		{
+			// if the alias is written with the AS keyword, remove it
+			$table = preg_replace('/ AS /i', ' ', $table);
+			
+			// Grab the alias
+			$table = trim(strrchr($table, " "));
+			
+			// Store the alias, if it doesn't already exist
+			if ( ! in_array($table, $this->ar_aliased_tables))
+			{
+				$this->ar_aliased_tables[] = $table;
+			}
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Compile the SELECT statement
+	 *
+	 * Generates a query string based on which functions were used.
+	 * Should not be called directly.  The get() function calls it.
+	 *
+	 * @access	private
+	 * @return	string
+	 */
+	function _compile_select($select_override = FALSE)
+	{
+		// Combine any cached components with the current statements
+		$this->_merge_cache();
+
+		// ----------------------------------------------------------------
+		
+		// Write the "select" portion of the query
+
+		if ($select_override !== FALSE)
+		{
+			$sql = $select_override;
+		}
+		else
+		{
+			$sql = ( ! $this->ar_distinct) ? 'SELECT ' : 'SELECT DISTINCT ';
+		
+			if (count($this->ar_select) == 0)
+			{
+				$sql .= '*';		
+			}
+			else
+			{				
+				// Cycle through the "select" portion of the query and prep each column name.
+				// The reason we protect identifiers here rather then in the select() function
+				// is because until the user calls the from() function we don't know if there are aliases
+				foreach ($this->ar_select as $key => $val)
+				{
+					$this->ar_select[$key] = $this->_protect_identifiers($val);
+				}
+				
+				$sql .= implode(', ', $this->ar_select);
+			}
+		}
+
+		// ----------------------------------------------------------------
+		
+		// Write the "FROM" portion of the query
+
+		if (count($this->ar_from) > 0)
+		{
+			$sql .= "\nFROM ";
+
+			$sql .= $this->_from_tables($this->ar_from);
+		}
+
+		// ----------------------------------------------------------------
+		
+		// Write the "JOIN" portion of the query
+
+		if (count($this->ar_join) > 0)
+		{
+			$sql .= "\n";
+
+			$sql .= implode("\n", $this->ar_join);
+		}
+
+		// ----------------------------------------------------------------
+		
+		// Write the "WHERE" portion of the query
+
+		if (count($this->ar_where) > 0 OR count($this->ar_like) > 0)
+		{
+			$sql .= "\n";
+
+			$sql .= "WHERE ";
+		}
+
+		$sql .= implode("\n", $this->ar_where);
+
+		// ----------------------------------------------------------------
+		
+		// Write the "LIKE" portion of the query
+	
+		if (count($this->ar_like) > 0)
+		{
+			if (count($this->ar_where) > 0)
+			{
+				$sql .= "\nAND ";
+			}
+
+			$sql .= implode("\n", $this->ar_like);
+		}
+
+		// ----------------------------------------------------------------
+		
+		// Write the "GROUP BY" portion of the query
+	
+		if (count($this->ar_groupby) > 0)
+		{
+			$sql .= "\nGROUP BY ";
+			
+			$sql .= implode(', ', $this->ar_groupby);
+		}
+
+		// ----------------------------------------------------------------
+		
+		// Write the "HAVING" portion of the query
+		
+		if (count($this->ar_having) > 0)
+		{
+			$sql .= "\nHAVING ";
+			$sql .= implode("\n", $this->ar_having);
+		}
+
+		// ----------------------------------------------------------------
+		
+		// Write the "ORDER BY" portion of the query
+
+		if (count($this->ar_orderby) > 0)
+		{
+			$sql .= "\nORDER BY ";
+			$sql .= implode(', ', $this->ar_orderby);
+			
+			if ($this->ar_order !== FALSE)
+			{
+				$sql .= ($this->ar_order == 'desc') ? ' DESC' : ' ASC';
+			}		
+		}
+
+		// ----------------------------------------------------------------
+		
+		// Write the "LIMIT" portion of the query
+		
+		if (is_numeric($this->ar_limit))
+		{
+			$sql .= "\n";
+			$sql = $this->_limit($sql, $this->ar_limit, $this->ar_offset);
+		}
+
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Object to Array
+	 *
+	 * Takes an object as input and converts the class variables to array key/vals
+	 *
+	 * @access	public
+	 * @param	object
+	 * @return	array
+	 */
+	function _object_to_array($object)
+	{
+		if ( ! is_object($object))
+		{
+			return $object;
+		}
+		
+		$array = array();
+		foreach (get_object_vars($object) as $key => $val)
+		{
+			// There are some built in keys we need to ignore for this conversion
+			if ( ! is_object($val) && ! is_array($val) && $key != '_parent_name' && $key != '_ci_scaffolding' && $key != '_ci_scaff_table')
+			{
+				$array[$key] = $val;
+			}
+		}
+	
+		return $array;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Start Cache
+	 *
+	 * Starts AR caching
+	 *
+	 * @access	public
+	 * @return	void
+	 */		
+	function start_cache()
+	{
+		$this->ar_caching = TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Stop Cache
+	 *
+	 * Stops AR caching
+	 *
+	 * @access	public
+	 * @return	void
+	 */		
+	function stop_cache()
+	{
+		$this->ar_caching = FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Flush Cache
+	 *
+	 * Empties the AR cache
+	 *
+	 * @access	public
+	 * @return	void
+	 */	
+	function flush_cache()
+	{	
+		$this->_reset_run(
+							array(
+									'ar_cache_select'	=> array(), 
+									'ar_cache_from'		=> array(), 
+									'ar_cache_join'		=> array(),
+									'ar_cache_where'	=> array(), 
+									'ar_cache_like'		=> array(), 
+									'ar_cache_groupby'	=> array(), 
+									'ar_cache_having'	=> array(), 
+									'ar_cache_orderby'	=> array(), 
+									'ar_cache_set'		=> array(),
+									'ar_cache_exists'	=> array()
+								)
+							);	
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Merge Cache
+	 *
+	 * When called, this function merges any cached AR arrays with 
+	 * locally called ones.
+	 *
+	 * @access	private
+	 * @return	void
+	 */
+	function _merge_cache()
+	{
+		if (count($this->ar_cache_exists) == 0)
+		{
+			return;
+		}
+
+		foreach ($this->ar_cache_exists as $val)
+		{
+			$ar_variable	= 'ar_'.$val;
+			$ar_cache_var	= 'ar_cache_'.$val;
+
+			if (count($this->$ar_cache_var) == 0)
+			{
+				continue;
+			}
+
+			$this->$ar_variable = array_unique(array_merge($this->$ar_cache_var, $this->$ar_variable));
+		}
+
+		// If we are "protecting identifiers" we need to examine the "from"
+		// portion of the query to determine if there are any aliases
+		if ($this->_protect_identifiers === TRUE AND count($this->ar_cache_from) > 0)
+		{
+			$this->_track_aliases($this->ar_from);
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Resets the active record values.  Called by the get() function
+	 *
+	 * @access	private
+	 * @param	array	An array of fields to reset
+	 * @return	void
+	 */
+	function _reset_run($ar_reset_items)
+	{
+		foreach ($ar_reset_items as $item => $default_value)
+		{
+			if ( ! in_array($item, $this->ar_store_array))
+			{
+				$this->$item = $default_value;
+			}
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Resets the active record values.  Called by the get() function
+	 *
+	 * @access	private
+	 * @return	void
+	 */
+	function _reset_select()
+	{
+		$ar_reset_items = array(
+								'ar_select'			=> array(), 
+								'ar_from'			=> array(), 
+								'ar_join'			=> array(), 
+								'ar_where'			=> array(), 
+								'ar_like'			=> array(), 
+								'ar_groupby'		=> array(), 
+								'ar_having'			=> array(), 
+								'ar_orderby'		=> array(), 
+								'ar_wherein'		=> array(), 
+								'ar_aliased_tables'	=> array(),
+								'ar_distinct'		=> FALSE, 
+								'ar_limit'			=> FALSE, 
+								'ar_offset'			=> FALSE, 
+								'ar_order'			=> FALSE,
+							);
+		
+		$this->_reset_run($ar_reset_items);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Resets the active record "write" values.
+	 *
+	 * Called by the insert() update() and delete() functions
+	 *
+	 * @access	private
+	 * @return	void
+	 */
+	function _reset_write()
+	{	
+		$ar_reset_items = array(
+								'ar_set'		=> array(), 
+								'ar_from'		=> array(), 
+								'ar_where'		=> array(), 
+								'ar_like'		=> array(),
+								'ar_orderby'	=> array(), 
+								'ar_limit'		=> FALSE, 
+								'ar_order'		=> FALSE
+								);
+
+		$this->_reset_run($ar_reset_items);
+	}
+	
+}
+
+/* End of file DB_active_rec.php */
 /* Location: ./system/database/DB_active_rec.php */
\ No newline at end of file
diff --git a/system/database/DB_cache.php b/system/database/DB_cache.php
index 9bb1b16..70a2d95 100644
--- a/system/database/DB_cache.php
+++ b/system/database/DB_cache.php
@@ -1,195 +1,195 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Database Cache Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_Cache {

-

-	var $CI;

-	var $db;	// allows passing of db object so that multiple database connections and returned db objects can be supported

-

-	/**

-	 * Constructor

-	 *

-	 * Grabs the CI super object instance so we can access it.

-	 *

-	 */	

-	function CI_DB_Cache(&$db)

-	{

-		// Assign the main CI object to $this->CI

-		// and load the file helper since we use it a lot

-		$this->CI =& get_instance();

-		$this->db =& $db;

-		$this->CI->load->helper('file');	

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Set Cache Directory Path

-	 *

-	 * @access	public

-	 * @param	string	the path to the cache directory

-	 * @return	bool

-	 */		

-	function check_path($path = '')

-	{

-		if ($path == '')

-		{

-			if ($this->db->cachedir == '')

-			{

-				return $this->db->cache_off();

-			}

-		

-			$path = $this->db->cachedir;

-		}

-	

-		// Add a trailing slash to the path if needed

-		$path = preg_replace("/(.+?)\/*$/", "\\1/",  $path);

-

-		if ( ! is_dir($path) OR ! is_really_writable($path))

-		{

-			// If the path is wrong we'll turn off caching

-			return $this->db->cache_off();

-		}

-		

-		$this->db->cachedir = $path;

-		return TRUE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Retrieve a cached query

-	 *

-	 * The URI being requested will become the name of the cache sub-folder.

-	 * An MD5 hash of the SQL statement will become the cache file name

-	 *

-	 * @access	public

-	 * @return	string

-	 */

-	function read($sql)

-	{

-		if ( ! $this->check_path())

-		{

-			return $this->db->cache_off();

-		}

-

-		$segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);

-		

-		$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);

-	

-		$filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql);		

-		

-		if (FALSE === ($cachedata = read_file($filepath)))

-		{	

-			return FALSE;

-		}

-		

-		return unserialize($cachedata);			

-	}	

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Write a query to a cache file

-	 *

-	 * @access	public

-	 * @return	bool

-	 */

-	function write($sql, $object)

-	{

-		if ( ! $this->check_path())

-		{

-			return $this->db->cache_off();

-		}

-

-		$segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);

-		

-		$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);

-	

-		$dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';

-		

-		$filename = md5($sql);

-	

-		if ( ! @is_dir($dir_path))

-		{

-			if ( ! @mkdir($dir_path, DIR_WRITE_MODE))

-			{

-				return FALSE;

-			}

-			

-			@chmod($dir_path, DIR_WRITE_MODE);			

-		}

-		

-		if (write_file($dir_path.$filename, serialize($object)) === FALSE)

-		{

-			return FALSE;

-		}

-		

-		@chmod($dir_path.$filename, DIR_WRITE_MODE);

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete cache files within a particular directory

-	 *

-	 * @access	public

-	 * @return	bool

-	 */

-	function delete($segment_one = '', $segment_two = '')

-	{	

-		if ($segment_one == '')

-		{

-			$segment_one  = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);

-		}

-		

-		if ($segment_two == '')

-		{

-			$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);

-		}

-		

-		$dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';

-		

-		delete_files($dir_path, TRUE);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete all existing cache files

-	 *

-	 * @access	public

-	 * @return	bool

-	 */

-	function delete_all()

-	{

-		delete_files($this->db->cachedir, TRUE);

-	}

-

-}

-

-

-/* End of file DB_cache.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Database Cache Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_Cache {
+
+	var $CI;
+	var $db;	// allows passing of db object so that multiple database connections and returned db objects can be supported
+
+	/**
+	 * Constructor
+	 *
+	 * Grabs the CI super object instance so we can access it.
+	 *
+	 */	
+	function CI_DB_Cache(&$db)
+	{
+		// Assign the main CI object to $this->CI
+		// and load the file helper since we use it a lot
+		$this->CI =& get_instance();
+		$this->db =& $db;
+		$this->CI->load->helper('file');	
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set Cache Directory Path
+	 *
+	 * @access	public
+	 * @param	string	the path to the cache directory
+	 * @return	bool
+	 */		
+	function check_path($path = '')
+	{
+		if ($path == '')
+		{
+			if ($this->db->cachedir == '')
+			{
+				return $this->db->cache_off();
+			}
+		
+			$path = $this->db->cachedir;
+		}
+	
+		// Add a trailing slash to the path if needed
+		$path = preg_replace("/(.+?)\/*$/", "\\1/",  $path);
+
+		if ( ! is_dir($path) OR ! is_really_writable($path))
+		{
+			// If the path is wrong we'll turn off caching
+			return $this->db->cache_off();
+		}
+		
+		$this->db->cachedir = $path;
+		return TRUE;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Retrieve a cached query
+	 *
+	 * The URI being requested will become the name of the cache sub-folder.
+	 * An MD5 hash of the SQL statement will become the cache file name
+	 *
+	 * @access	public
+	 * @return	string
+	 */
+	function read($sql)
+	{
+		if ( ! $this->check_path())
+		{
+			return $this->db->cache_off();
+		}
+
+		$segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
+		
+		$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
+	
+		$filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql);		
+		
+		if (FALSE === ($cachedata = read_file($filepath)))
+		{	
+			return FALSE;
+		}
+		
+		return unserialize($cachedata);			
+	}	
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Write a query to a cache file
+	 *
+	 * @access	public
+	 * @return	bool
+	 */
+	function write($sql, $object)
+	{
+		if ( ! $this->check_path())
+		{
+			return $this->db->cache_off();
+		}
+
+		$segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
+		
+		$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
+	
+		$dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';
+		
+		$filename = md5($sql);
+	
+		if ( ! @is_dir($dir_path))
+		{
+			if ( ! @mkdir($dir_path, DIR_WRITE_MODE))
+			{
+				return FALSE;
+			}
+			
+			@chmod($dir_path, DIR_WRITE_MODE);			
+		}
+		
+		if (write_file($dir_path.$filename, serialize($object)) === FALSE)
+		{
+			return FALSE;
+		}
+		
+		@chmod($dir_path.$filename, DIR_WRITE_MODE);
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete cache files within a particular directory
+	 *
+	 * @access	public
+	 * @return	bool
+	 */
+	function delete($segment_one = '', $segment_two = '')
+	{	
+		if ($segment_one == '')
+		{
+			$segment_one  = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
+		}
+		
+		if ($segment_two == '')
+		{
+			$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
+		}
+		
+		$dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';
+		
+		delete_files($dir_path, TRUE);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete all existing cache files
+	 *
+	 * @access	public
+	 * @return	bool
+	 */
+	function delete_all()
+	{
+		delete_files($this->db->cachedir, TRUE);
+	}
+
+}
+
+
+/* End of file DB_cache.php */
 /* Location: ./system/database/DB_cache.php */
\ No newline at end of file
diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
index dbd82db..4293acc 100644
--- a/system/database/DB_driver.php
+++ b/system/database/DB_driver.php
@@ -1,1319 +1,1319 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Database Driver Class

- *

- * This is the platform-independent base DB implementation class.

- * This class will not be called directly. Rather, the adapter

- * class for the specific database will extend and instantiate it.

- *

- * @package		CodeIgniter

- * @subpackage	Drivers

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_driver {

-

-	var $username;

-	var $password;

-	var $hostname;

-	var $database;

-	var $dbdriver		= 'mysql';

-	var $dbprefix		= '';

-	var $char_set		= 'utf8';

-	var $dbcollat		= 'utf8_general_ci';

-	var $autoinit		= TRUE; // Whether to automatically initialize the DB

-	var $swap_pre		= '';

-	var $port			= '';

-	var $pconnect		= FALSE;

-	var $conn_id		= FALSE;

-	var $result_id		= FALSE;

-	var $db_debug		= FALSE;

-	var $benchmark		= 0;

-	var $query_count	= 0;

-	var $bind_marker	= '?';

-	var $save_queries	= TRUE;

-	var $queries		= array();

-	var $query_times	= array();

-	var $data_cache		= array();

-	var $trans_enabled	= TRUE;

-	var $trans_strict	= TRUE;

-	var $_trans_depth	= 0;

-	var $_trans_status	= TRUE; // Used with transactions to determine if a rollback should occur

-	var $cache_on		= FALSE;

-	var $cachedir		= '';

-	var $cache_autodel	= FALSE;

-	var $CACHE; // The cache class object

-

-	// Private variables

-	var $_protect_identifiers	= TRUE;

-	var $_reserved_identifiers	= array('*'); // Identifiers that should NOT be escaped

-

-	// These are use with Oracle

-	var $stmt_id;

-	var $curs_id;

-	var $limit_used;

-

-

-	

-	/**

-	 * Constructor.  Accepts one parameter containing the database

-	 * connection settings.

-	 *

-	 * @param array

-	 */	

-	function CI_DB_driver($params)

-	{

-		if (is_array($params))

-		{

-			foreach ($params as $key => $val)

-			{

-				$this->$key = $val;

-			}

-		}

-

-		log_message('debug', 'Database Driver Class Initialized');

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Initialize Database Settings

-	 *

-	 * @access	private Called by the constructor

-	 * @param	mixed

-	 * @return	void

-	 */	

-	function initialize()

-	{

-		// If an existing connection resource is available

-		// there is no need to connect and select the database

-		if (is_resource($this->conn_id) OR is_object($this->conn_id))

-		{

-			return TRUE;

-		}

-	

-		// ----------------------------------------------------------------

-		

-		// Connect to the database and set the connection ID

-		$this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect();

-

-		// No connection resource?  Throw an error

-		if ( ! $this->conn_id)

-		{

-			log_message('error', 'Unable to connect to the database');

-			

-			if ($this->db_debug)

-			{

-				$this->display_error('db_unable_to_connect');

-			}

-			return FALSE;

-		}

-

-		// ----------------------------------------------------------------

-

-		// Select the DB... assuming a database name is specified in the config file

-		if ($this->database != '')

-		{

-			if ( ! $this->db_select())

-			{

-				log_message('error', 'Unable to select database: '.$this->database);

-			

-				if ($this->db_debug)

-				{

-					$this->display_error('db_unable_to_select', $this->database);

-				}

-				return FALSE;			

-			}

-			else

-			{

-				// We've selected the DB. Now we set the character set

-				if ( ! $this->db_set_charset($this->char_set, $this->dbcollat))

-				{

-					return FALSE;

-				}

-		

-				return TRUE;

-			}

-		}

-

-		return TRUE;

-	}

-		

-	// --------------------------------------------------------------------

-

-	/**

-	 * Set client character set

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @return	resource

-	 */

-	function db_set_charset($charset, $collation)

-	{

-		if ( ! $this->_db_set_charset($this->char_set, $this->dbcollat))

-		{

-			log_message('error', 'Unable to set database connection charset: '.$this->char_set);

-		

-			if ($this->db_debug)

-			{

-				$this->display_error('db_unable_to_set_charset', $this->char_set);

-			}

-			

-			return FALSE;

-		}

-		

-		return TRUE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * The name of the platform in use (mysql, mssql, etc...)

-	 *

-	 * @access	public

-	 * @return	string		

-	 */	

-	function platform()

-	{

-		return $this->dbdriver;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Database Version Number.  Returns a string containing the

-	 * version of the database being used

-	 *

-	 * @access	public

-	 * @return	string	

-	 */	

-	function version()

-	{

-		if (FALSE === ($sql = $this->_version()))

-		{

-			if ($this->db_debug)

-			{

-				return $this->display_error('db_unsupported_function');

-			}

-			return FALSE;

-		}

-		

-		if ($this->dbdriver == 'oci8')

-		{

-			return $sql;

-		}

-	

-		$query = $this->query($sql);

-		return $query->row('ver');

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Execute the query

-	 *

-	 * Accepts an SQL string as input and returns a result object upon

-	 * successful execution of a "read" type query.  Returns boolean TRUE

-	 * upon successful execution of a "write" type query. Returns boolean

-	 * FALSE upon failure, and if the $db_debug variable is set to TRUE

-	 * will raise an error.

-	 *

-	 * @access	public

-	 * @param	string	An SQL query string

-	 * @param	array	An array of binding data

-	 * @return	mixed		

-	 */	

-	function query($sql, $binds = FALSE, $return_object = TRUE)

-	{

-		if ($sql == '')

-		{

-			if ($this->db_debug)

-			{

-				log_message('error', 'Invalid query: '.$sql);

-				return $this->display_error('db_invalid_query');

-			}

-			return FALSE;

-		}

-

-		// Verify table prefix and replace if necessary

-		if ( ($this->dbprefix != '' AND $this->swap_pre != '') AND ($this->dbprefix != $this->swap_pre) )

-		{			

-			$sql = preg_replace("/(\W)".$this->swap_pre."(\S+?)/", "\\1".$this->dbprefix."\\2", $sql);

-		}

-		

-		// Is query caching enabled?  If the query is a "read type"

-		// we will load the caching class and return the previously

-		// cached query if it exists

-		if ($this->cache_on == TRUE AND stristr($sql, 'SELECT'))

-		{

-			if ($this->_cache_init())

-			{

-				$this->load_rdriver();

-				if (FALSE !== ($cache = $this->CACHE->read($sql)))

-				{

-					return $cache;

-				}

-			}

-		}

-		

-		// Compile binds if needed

-		if ($binds !== FALSE)

-		{

-			$sql = $this->compile_binds($sql, $binds);

-		}

-

-		// Save the  query for debugging

-		if ($this->save_queries == TRUE)

-		{

-			$this->queries[] = $sql;

-		}

-		

-		// Start the Query Timer

-		$time_start = list($sm, $ss) = explode(' ', microtime());

-	

-		// Run the Query

-		if (FALSE === ($this->result_id = $this->simple_query($sql)))

-		{

-			if ($this->save_queries == TRUE)

-			{

-				$this->query_times[] = 0;

-			}

-		

-			// This will trigger a rollback if transactions are being used

-			$this->_trans_status = FALSE;

-

-			if ($this->db_debug)

-			{

-				// grab the error number and message now, as we might run some

-				// additional queries before displaying the error

-				$error_no = $this->_error_number();

-				$error_msg = $this->_error_message();

-				

-				// We call this function in order to roll-back queries

-				// if transactions are enabled.  If we don't call this here

-				// the error message will trigger an exit, causing the 

-				// transactions to remain in limbo.

-				$this->trans_complete();

-

-				// Log and display errors

-				log_message('error', 'Query error: '.$error_msg);

-				return $this->display_error(

-										array(

-												'Error Number: '.$error_no,

-												$error_msg,

-												$sql

-											)

-										);

-			}

-		

-			return FALSE;

-		}

-		

-		// Stop and aggregate the query time results

-		$time_end = list($em, $es) = explode(' ', microtime());

-		$this->benchmark += ($em + $es) - ($sm + $ss);

-

-		if ($this->save_queries == TRUE)

-		{

-			$this->query_times[] = ($em + $es) - ($sm + $ss);

-		}

-		

-		// Increment the query counter

-		$this->query_count++;

-		

-		// Was the query a "write" type?

-		// If so we'll simply return true

-		if ($this->is_write_type($sql) === TRUE)

-		{

-			// If caching is enabled we'll auto-cleanup any

-			// existing files related to this particular URI

-			if ($this->cache_on == TRUE AND $this->cache_autodel == TRUE AND $this->_cache_init())

-			{

-				$this->CACHE->delete();

-			}

-		

-			return TRUE;

-		}

-		

-		// Return TRUE if we don't need to create a result object

-		// Currently only the Oracle driver uses this when stored

-		// procedures are used

-		if ($return_object !== TRUE)

-		{

-			return TRUE;

-		}

-	

-		// Load and instantiate the result driver	

-		

-		$driver 		= $this->load_rdriver();

-		$RES 			= new $driver();

-		$RES->conn_id	= $this->conn_id;

-		$RES->result_id	= $this->result_id;

-

-		if ($this->dbdriver == 'oci8')

-		{

-			$RES->stmt_id		= $this->stmt_id;

-			$RES->curs_id		= NULL;

-			$RES->limit_used	= $this->limit_used;

-			$this->stmt_id		= FALSE;

-		}

-		

-		// oci8 vars must be set before calling this

-		$RES->num_rows	= $RES->num_rows();

-				

-		// Is query caching enabled?  If so, we'll serialize the

-		// result object and save it to a cache file.

-		if ($this->cache_on == TRUE AND $this->_cache_init())

-		{

-			// We'll create a new instance of the result object

-			// only without the platform specific driver since

-			// we can't use it with cached data (the query result

-			// resource ID won't be any good once we've cached the

-			// result object, so we'll have to compile the data

-			// and save it)

-			$CR = new CI_DB_result();

-			$CR->num_rows 		= $RES->num_rows();

-			$CR->result_object	= $RES->result_object();

-			$CR->result_array	= $RES->result_array();

-			

-			// Reset these since cached objects can not utilize resource IDs.

-			$CR->conn_id		= NULL;

-			$CR->result_id		= NULL;

-

-			$this->CACHE->write($sql, $CR);

-		}

-		

-		return $RES;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Load the result drivers

-	 *

-	 * @access	public

-	 * @return	string 	the name of the result class		

-	 */		

-	function load_rdriver()

-	{

-		$driver = 'CI_DB_'.$this->dbdriver.'_result';

-

-		if ( ! class_exists($driver))

-		{

-			include_once(BASEPATH.'database/DB_result'.EXT);

-			include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result'.EXT);

-		}

-		

-		return $driver;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Simple Query

-	 * This is a simplified version of the query() function.  Internally

-	 * we only use it when running transaction commands since they do

-	 * not require all the features of the main query() function.

-	 *

-	 * @access	public

-	 * @param	string	the sql query

-	 * @return	mixed		

-	 */	

-	function simple_query($sql)

-	{

-		if ( ! $this->conn_id)

-		{

-			$this->initialize();

-		}

-

-		return $this->_execute($sql);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Disable Transactions

-	 * This permits transactions to be disabled at run-time.

-	 *

-	 * @access	public

-	 * @return	void		

-	 */	

-	function trans_off()

-	{

-		$this->trans_enabled = FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Enable/disable Transaction Strict Mode

-	 * When strict mode is enabled, if you are running multiple groups of

-	 * transactions, if one group fails all groups will be rolled back.

-	 * If strict mode is disabled, each group is treated autonomously, meaning

-	 * a failure of one group will not affect any others

-	 *

-	 * @access	public

-	 * @return	void		

-	 */	

-	function trans_strict($mode = TRUE)

-	{

-		$this->trans_strict = is_bool($mode) ? $mode : TRUE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Start Transaction

-	 *

-	 * @access	public

-	 * @return	void		

-	 */	

-	function trans_start($test_mode = FALSE)

-	{	

-		if ( ! $this->trans_enabled)

-		{

-			return FALSE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			$this->_trans_depth += 1;

-			return;

-		}

-		

-		$this->trans_begin($test_mode);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Complete Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_complete()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return FALSE;

-		}

-	

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 1)

-		{

-			$this->_trans_depth -= 1;

-			return TRUE;

-		}

-	

-		// The query() function will set this flag to FALSE in the event that a query failed

-		if ($this->_trans_status === FALSE)

-		{

-			$this->trans_rollback();

-			

-			// If we are NOT running in strict mode, we will reset

-			// the _trans_status flag so that subsequent groups of transactions

-			// will be permitted.

-			if ($this->trans_strict === FALSE)

-			{

-				$this->_trans_status = TRUE;

-			}

-

-			log_message('debug', 'DB Transaction Failure');

-			return FALSE;

-		}

-		

-		$this->trans_commit();

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Lets you retrieve the transaction flag to determine if it has failed

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_status()

-	{

-		return $this->_trans_status;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Compile Bindings

-	 *

-	 * @access	public

-	 * @param	string	the sql statement

-	 * @param	array	an array of bind data

-	 * @return	string		

-	 */	

-	function compile_binds($sql, $binds)

-	{

-		if (strpos($sql, $this->bind_marker) === FALSE)

-		{

-			return $sql;

-		}

-		

-		if ( ! is_array($binds))

-		{

-			$binds = array($binds);

-		}

-		

-		// Get the sql segments around the bind markers

-		$segments = explode($this->bind_marker, $sql);

-

-		// The count of bind should be 1 less then the count of segments

-		// If there are more bind arguments trim it down

-		if (count($binds) >= count($segments)) {

-			$binds = array_slice($binds, 0, count($segments)-1);

-		}

-

-		// Construct the binded query

-		$result = $segments[0];

-		$i = 0;

-		foreach ($binds as $bind)

-		{

-			$result .= $this->escape($bind);

-			$result .= $segments[++$i];

-		}

-

-		return $result;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Determines if a query is a "write" type.

-	 *

-	 * @access	public

-	 * @param	string	An SQL query string

-	 * @return	boolean		

-	 */	

-	function is_write_type($sql)

-	{

-		if ( ! preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i', $sql))

-		{

-			return FALSE;

-		}

-		return TRUE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Calculate the aggregate query elapsed time

-	 *

-	 * @access	public

-	 * @param	integer	The number of decimal places

-	 * @return	integer		

-	 */	

-	function elapsed_time($decimals = 6)

-	{

-		return number_format($this->benchmark, $decimals);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Returns the total number of queries

-	 *

-	 * @access	public

-	 * @return	integer		

-	 */	

-	function total_queries()

-	{

-		return $this->query_count;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Returns the last query that was executed

-	 *

-	 * @access	public

-	 * @return	void		

-	 */	

-	function last_query()

-	{

-		return end($this->queries);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * "Smart" Escape String

-	 *

-	 * Escapes data based on type

-	 * Sets boolean and null types

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	integer		

-	 */	

-	function escape($str)

-	{	

-		switch (gettype($str))

-		{

-			case 'string'	:	$str = "'".$this->escape_str($str)."'";

-				break;

-			case 'boolean'	:	$str = ($str === FALSE) ? 0 : 1;

-				break;

-			default			:	$str = ($str === NULL) ? 'NULL' : $str;

-				break;

-		}		

-

-		return $str;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Primary

-	 *

-	 * Retrieves the primary key.  It assumes that the row in the first

-	 * position is the primary key

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string		

-	 */	

-	function primary($table = '')

-	{	

-		$fields = $this->list_fields($table);

-		

-		if ( ! is_array($fields))

-		{

-			return FALSE;

-		}

-

-		return current($fields);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Returns an array of table names

-	 *

-	 * @access	public

-	 * @return	array		

-	 */	

-	function list_tables($constrain_by_prefix = FALSE)

-	{

-		// Is there a cached result?

-		if (isset($this->data_cache['table_names']))

-		{

-			return $this->data_cache['table_names'];

-		}

-	

-		if (FALSE === ($sql = $this->_list_tables($constrain_by_prefix)))

-		{

-			if ($this->db_debug)

-			{

-				return $this->display_error('db_unsupported_function');

-			}

-			return FALSE;

-		}

-

-		$retval = array();

-		$query = $this->query($sql);

-		

-		if ($query->num_rows() > 0)

-		{

-			foreach($query->result_array() as $row)

-			{

-				if (isset($row['TABLE_NAME']))

-				{

-					$retval[] = $row['TABLE_NAME'];

-				}

-				else

-				{

-					$retval[] = array_shift($row);

-				}

-			}

-		}

-

-		$this->data_cache['table_names'] = $retval;

-		return $this->data_cache['table_names'];

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Determine if a particular table exists

-	 * @access	public

-	 * @return	boolean

-	 */

-	function table_exists($table_name)

-	{	

-		return ( ! in_array($this->_protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables())) ? FALSE : TRUE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Fetch MySQL Field Names

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	array		

-	 */

-	function list_fields($table = '')

-	{

-		// Is there a cached result?

-		if (isset($this->data_cache['field_names'][$table]))

-		{

-			return $this->data_cache['field_names'][$table];

-		}

-	

-		if ($table == '')

-		{

-			if ($this->db_debug)

-			{

-				return $this->display_error('db_field_param_missing');

-			}

-			return FALSE;

-		}

-		

-		if (FALSE === ($sql = $this->_list_columns($this->_protect_identifiers($table, TRUE, NULL, FALSE))))

-		{

-			if ($this->db_debug)

-			{

-				return $this->display_error('db_unsupported_function');

-			}

-			return FALSE;

-		}

-		

-		$query = $this->query($sql);

-		

-		$retval = array();

-		foreach($query->result_array() as $row)

-		{

-			if (isset($row['COLUMN_NAME']))

-			{

-				$retval[] = $row['COLUMN_NAME'];

-			}

-			else

-			{

-				$retval[] = current($row);

-			}		

-		}

-		

-		$this->data_cache['field_names'][$table] = $retval;

-		return $this->data_cache['field_names'][$table];

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Determine if a particular field exists

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @return	boolean

-	 */

-	function field_exists($field_name, $table_name)

-	{	

-		return ( ! in_array($field_name, $this->list_fields($table_name))) ? FALSE : TRUE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Returns an object with field data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	object		

-	 */	

-	function field_data($table = '')

-	{

-		if ($table == '')

-		{

-			if ($this->db_debug)

-			{

-				return $this->display_error('db_field_param_missing');

-			}

-			return FALSE;

-		}

-		

-		$query = $this->query($this->_field_data($this->_protect_identifiers($table, TRUE, NULL, FALSE)));

-

-		return $query->field_data();

-	}	

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Generate an insert string

-	 *

-	 * @access	public

-	 * @param	string	the table upon which the query will be performed

-	 * @param	array	an associative array data of key/values

-	 * @return	string		

-	 */	

-	function insert_string($table, $data)

-	{

-		$fields = array();

-		$values = array();

-		

-		foreach($data as $key => $val)

-		{

-			$fields[] = $this->_escape_identifiers($key);

-			$values[] = $this->escape($val);

-		}

-				

-		return $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values);

-	}	

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Generate an update string

-	 *

-	 * @access	public

-	 * @param	string	the table upon which the query will be performed

-	 * @param	array	an associative array data of key/values

-	 * @param	mixed	the "where" statement

-	 * @return	string		

-	 */	

-	function update_string($table, $data, $where)

-	{

-		if ($where == '')

-		{

-			return false;

-		}

-					

-		$fields = array();

-		foreach($data as $key => $val)

-		{

-			$fields[$this->_protect_identifiers($key)] = $this->escape($val);

-		}

-

-		if ( ! is_array($where))

-		{

-			$dest = array($where);

-		}

-		else

-		{

-			$dest = array();

-			foreach ($where as $key => $val)

-			{

-				$prefix = (count($dest) == 0) ? '' : ' AND ';

-	

-				if ($val !== '')

-				{

-					if ( ! $this->_has_operator($key))

-					{

-						$key .= ' =';

-					}

-				

-					$val = ' '.$this->escape($val);

-				}

-							

-				$dest[] = $prefix.$key.$val;

-			}

-		}		

-

-		return $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $dest);

-	}	

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Tests whether the string has an SQL operator

-	 *

-	 * @access	private

-	 * @param	string

-	 * @return	bool

-	 */

-	function _has_operator($str)

-	{

-		$str = trim($str);

-		if ( ! preg_match("/(\s|<|>|!|=|is null|is not null)/i", $str))

-		{

-			return FALSE;

-		}

-

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Enables a native PHP function to be run, using a platform agnostic wrapper.

-	 *

-	 * @access	public

-	 * @param	string	the function name

-	 * @param	mixed	any parameters needed by the function

-	 * @return	mixed		

-	 */	

-	function call_function($function)

-	{

-		$driver = ($this->dbdriver == 'postgre') ? 'pg_' : $this->dbdriver.'_';

-	

-		if (FALSE === strpos($driver, $function))

-		{

-			$function = $driver.$function;

-		}

-		

-		if ( ! function_exists($function))

-		{

-			if ($this->db_debug)

-			{

-				return $this->display_error('db_unsupported_function');

-			}

-			return FALSE;

-		}

-		else

-		{

-			$args = (func_num_args() > 1) ? array_splice(func_get_args(), 1) : null;

-

-			return call_user_func_array($function, $args);

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Set Cache Directory Path

-	 *

-	 * @access	public

-	 * @param	string	the path to the cache directory

-	 * @return	void

-	 */		

-	function cache_set_path($path = '')

-	{

-		$this->cachedir = $path;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Enable Query Caching

-	 *

-	 * @access	public

-	 * @return	void

-	 */		

-	function cache_on()

-	{

-		$this->cache_on = TRUE;

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Disable Query Caching

-	 *

-	 * @access	public

-	 * @return	void

-	 */	

-	function cache_off()

-	{

-		$this->cache_on = FALSE;

-		return FALSE;

-	}

-	

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete the cache files associated with a particular URI

-	 *

-	 * @access	public

-	 * @return	void

-	 */		

-	function cache_delete($segment_one = '', $segment_two = '')

-	{

-		if ( ! $this->_cache_init())

-		{

-			return FALSE;

-		}

-		return $this->CACHE->delete($segment_one, $segment_two);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete All cache files

-	 *

-	 * @access	public

-	 * @return	void

-	 */		

-	function cache_delete_all()

-	{

-		if ( ! $this->_cache_init())

-		{

-			return FALSE;

-		}

-

-		return $this->CACHE->delete_all();

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Initialize the Cache Class

-	 *

-	 * @access	private

-	 * @return	void

-	 */	

-	function _cache_init()

-	{

-		if (is_object($this->CACHE) AND class_exists('CI_DB_Cache'))

-		{

-			return TRUE;

-		}

-	

-		if ( ! @include(BASEPATH.'database/DB_cache'.EXT))

-		{

-			return $this->cache_off();

-		}

-		

-		$this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Close DB Connection

-	 *

-	 * @access	public

-	 * @return	void		

-	 */	

-	function close()

-	{

-		if (is_resource($this->conn_id) OR is_object($this->conn_id))

-		{

-			$this->_close($this->conn_id);

-		}

-		$this->conn_id = FALSE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Display an error message

-	 *

-	 * @access	public

-	 * @param	string	the error message

-	 * @param	string	any "swap" values

-	 * @param	boolean	whether to localize the message

-	 * @return	string	sends the application/error_db.php template		

-	 */	

-	function display_error($error = '', $swap = '', $native = FALSE)

-	{

-		$LANG =& load_class('Language');

-		$LANG->load('db');

-

-		$heading = $LANG->line('db_error_heading');

-

-		if ($native == TRUE)

-		{

-			$message = $error;

-		}

-		else

-		{

-			$message = ( ! is_array($error)) ? array(str_replace('%s', $swap, $LANG->line($error))) : $error;

-		}

-		

-		$error =& load_class('Exceptions');

-		echo $error->show_error($heading, $message, 'error_db');

-		exit;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Protect Identifiers

-	 *

-	 * This function adds backticks if appropriate based on db type

-	 *

-	 * @access	private

-	 * @param	mixed	the item to escape

-	 * @return	mixed	the item with backticks

-	 */

-	function protect_identifiers($item, $prefix_single = FALSE)

-	{

-		return $this->_protect_identifiers($item, $prefix_single);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Protect Identifiers

-	 *

-	 * This function is used extensively by the Active Record class, and by

-	 * a couple functions in this class. 

-	 * It takes a column or table name (optionally with an alias) and inserts

-	 * the table prefix onto it.  Some logic is necessary in order to deal with

-	 * column names that include the path.  Consider a query like this:

-	 *

-	 * SELECT * FROM hostname.database.table.column AS c FROM hostname.database.table

-	 *

-	 * Or a query with aliasing:

-	 *

-	 * SELECT m.member_id, m.member_name FROM members AS m

-	 *

-	 * Since the column name can include up to four segments (host, DB, table, column)

-	 * or also have an alias prefix, we need to do a bit of work to figure this out and

-	 * insert the table prefix (if it exists) in the proper position, and escape only

-	 * the correct identifiers.

-	 *

-	 * @access	private

-	 * @param	string

-	 * @param	bool

-	 * @param	mixed

-	 * @param	bool

-	 * @return	string

-	 */	

-	function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE)

-	{

-		if ( ! is_bool($protect_identifiers))

-		{

-			$protect_identifiers = $this->_protect_identifiers;

-		}

-		

-		// Convert tabs or multiple spaces into single spaces

-		$item = preg_replace('/[\t| ]+/', ' ', $item);

-	

-		// If the item has an alias declaration we remove it and set it aside.

-		// Basically we remove everything to the right of the first space

-		$alias = '';

-		if (strpos($item, ' ') !== FALSE)

-		{		

-			$alias = strstr($item, " ");

-			$item = substr($item, 0, - strlen($alias));

-		}

-

-		// Break the string apart if it contains periods, then insert the table prefix

-		// in the correct location, assuming the period doesn't indicate that we're dealing

-		// with an alias. While we're at it, we will escape the components

-		if (strpos($item, '.') !== FALSE)

-		{

-			$parts	= explode('.', $item);

-			

-			// Does the first segment of the exploded item match

-			// one of the aliases previously identified?  If so,

-			// we have nothing more to do other than escape the item

-			if (in_array($parts[0], $this->ar_aliased_tables))

-			{				

-				if ($protect_identifiers === TRUE)

-				{

-					foreach ($parts as $key => $val)

-					{

-						if ( ! in_array($val, $this->_reserved_identifiers))

-						{

-							$parts[$key] = $this->_escape_identifiers($val);

-						}

-					}

-				

-					$item = implode('.', $parts);

-				}			

-				return $item.$alias;

-			}

-			

-			// Is there a table prefix defined in the config file?  If not, no need to do anything

-			if ($this->dbprefix != '')

-			{

-				// We now add the table prefix based on some logic.

-				// Do we have 4 segments (hostname.database.table.column)?

-				// If so, we add the table prefix to the column name in the 3rd segment.

-				if (isset($parts[3]))

-				{

-					$i = 2;

-				}

-				// Do we have 3 segments (database.table.column)?

-				// If so, we add the table prefix to the column name in 2nd position

-				elseif (isset($parts[2]))

-				{

-					$i = 1;

-				}

-				// Do we have 2 segments (table.column)?

-				// If so, we add the table prefix to the column name in 1st segment

-				else

-				{

-					$i = 0;

-				}

-				

-				// This flag is set when the supplied $item does not contain a field name.

-				// This can happen when this function is being called from a JOIN.

-				if ($field_exists == FALSE)

-				{

-					$i++;

-				}

-				

-				// We only add the table prefix if it does not already exist

-				if (substr($parts[$i], 0, strlen($this->dbprefix)) != $this->dbprefix)

-				{

-					$parts[$i] = $this->dbprefix.$parts[$i];

-				}

-				

-				// Put the parts back together

-				$item = implode('.', $parts);

-			}

-			

-			if ($protect_identifiers === TRUE)

-			{

-				$item = $this->_escape_identifiers($item);

-			}

-			

-			return $item.$alias;

-		}

-

-		// This is basically a bug fix for queries that use MAX, MIN, etc.

-		// If a parenthesis is found we know that we do not need to 

-		// escape the data or add a prefix.  There's probably a more graceful

-		// way to deal with this, but I'm not thinking of it -- Rick

-		if (strpos($item, '(') !== FALSE)

-		{

-			return $item.$alias;

-		}

-		

-		// Is there a table prefix?  If not, no need to insert it

-		if ($this->dbprefix != '')

-		{

-			// Do we prefix an item with no segments?

-			if ($prefix_single == TRUE AND substr($item, 0, strlen($this->dbprefix)) != $this->dbprefix)

-			{

-				$item = $this->dbprefix.$item;

-			}		

-		}

-

-		if ($protect_identifiers === TRUE AND ! in_array($item, $this->_reserved_identifiers))

-		{

-			$item = $this->_escape_identifiers($item);

-		}

-		

-		return $item.$alias;

-	}

-

-

-}

-

-

-/* End of file DB_driver.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Database Driver Class
+ *
+ * This is the platform-independent base DB implementation class.
+ * This class will not be called directly. Rather, the adapter
+ * class for the specific database will extend and instantiate it.
+ *
+ * @package		CodeIgniter
+ * @subpackage	Drivers
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_driver {
+
+	var $username;
+	var $password;
+	var $hostname;
+	var $database;
+	var $dbdriver		= 'mysql';
+	var $dbprefix		= '';
+	var $char_set		= 'utf8';
+	var $dbcollat		= 'utf8_general_ci';
+	var $autoinit		= TRUE; // Whether to automatically initialize the DB
+	var $swap_pre		= '';
+	var $port			= '';
+	var $pconnect		= FALSE;
+	var $conn_id		= FALSE;
+	var $result_id		= FALSE;
+	var $db_debug		= FALSE;
+	var $benchmark		= 0;
+	var $query_count	= 0;
+	var $bind_marker	= '?';
+	var $save_queries	= TRUE;
+	var $queries		= array();
+	var $query_times	= array();
+	var $data_cache		= array();
+	var $trans_enabled	= TRUE;
+	var $trans_strict	= TRUE;
+	var $_trans_depth	= 0;
+	var $_trans_status	= TRUE; // Used with transactions to determine if a rollback should occur
+	var $cache_on		= FALSE;
+	var $cachedir		= '';
+	var $cache_autodel	= FALSE;
+	var $CACHE; // The cache class object
+
+	// Private variables
+	var $_protect_identifiers	= TRUE;
+	var $_reserved_identifiers	= array('*'); // Identifiers that should NOT be escaped
+
+	// These are use with Oracle
+	var $stmt_id;
+	var $curs_id;
+	var $limit_used;
+
+
+	
+	/**
+	 * Constructor.  Accepts one parameter containing the database
+	 * connection settings.
+	 *
+	 * @param array
+	 */	
+	function CI_DB_driver($params)
+	{
+		if (is_array($params))
+		{
+			foreach ($params as $key => $val)
+			{
+				$this->$key = $val;
+			}
+		}
+
+		log_message('debug', 'Database Driver Class Initialized');
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Initialize Database Settings
+	 *
+	 * @access	private Called by the constructor
+	 * @param	mixed
+	 * @return	void
+	 */	
+	function initialize()
+	{
+		// If an existing connection resource is available
+		// there is no need to connect and select the database
+		if (is_resource($this->conn_id) OR is_object($this->conn_id))
+		{
+			return TRUE;
+		}
+	
+		// ----------------------------------------------------------------
+		
+		// Connect to the database and set the connection ID
+		$this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect();
+
+		// No connection resource?  Throw an error
+		if ( ! $this->conn_id)
+		{
+			log_message('error', 'Unable to connect to the database');
+			
+			if ($this->db_debug)
+			{
+				$this->display_error('db_unable_to_connect');
+			}
+			return FALSE;
+		}
+
+		// ----------------------------------------------------------------
+
+		// Select the DB... assuming a database name is specified in the config file
+		if ($this->database != '')
+		{
+			if ( ! $this->db_select())
+			{
+				log_message('error', 'Unable to select database: '.$this->database);
+			
+				if ($this->db_debug)
+				{
+					$this->display_error('db_unable_to_select', $this->database);
+				}
+				return FALSE;			
+			}
+			else
+			{
+				// We've selected the DB. Now we set the character set
+				if ( ! $this->db_set_charset($this->char_set, $this->dbcollat))
+				{
+					return FALSE;
+				}
+		
+				return TRUE;
+			}
+		}
+
+		return TRUE;
+	}
+		
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set client character set
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @return	resource
+	 */
+	function db_set_charset($charset, $collation)
+	{
+		if ( ! $this->_db_set_charset($this->char_set, $this->dbcollat))
+		{
+			log_message('error', 'Unable to set database connection charset: '.$this->char_set);
+		
+			if ($this->db_debug)
+			{
+				$this->display_error('db_unable_to_set_charset', $this->char_set);
+			}
+			
+			return FALSE;
+		}
+		
+		return TRUE;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * The name of the platform in use (mysql, mssql, etc...)
+	 *
+	 * @access	public
+	 * @return	string		
+	 */	
+	function platform()
+	{
+		return $this->dbdriver;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Database Version Number.  Returns a string containing the
+	 * version of the database being used
+	 *
+	 * @access	public
+	 * @return	string	
+	 */	
+	function version()
+	{
+		if (FALSE === ($sql = $this->_version()))
+		{
+			if ($this->db_debug)
+			{
+				return $this->display_error('db_unsupported_function');
+			}
+			return FALSE;
+		}
+		
+		if ($this->dbdriver == 'oci8')
+		{
+			return $sql;
+		}
+	
+		$query = $this->query($sql);
+		return $query->row('ver');
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Execute the query
+	 *
+	 * Accepts an SQL string as input and returns a result object upon
+	 * successful execution of a "read" type query.  Returns boolean TRUE
+	 * upon successful execution of a "write" type query. Returns boolean
+	 * FALSE upon failure, and if the $db_debug variable is set to TRUE
+	 * will raise an error.
+	 *
+	 * @access	public
+	 * @param	string	An SQL query string
+	 * @param	array	An array of binding data
+	 * @return	mixed		
+	 */	
+	function query($sql, $binds = FALSE, $return_object = TRUE)
+	{
+		if ($sql == '')
+		{
+			if ($this->db_debug)
+			{
+				log_message('error', 'Invalid query: '.$sql);
+				return $this->display_error('db_invalid_query');
+			}
+			return FALSE;
+		}
+
+		// Verify table prefix and replace if necessary
+		if ( ($this->dbprefix != '' AND $this->swap_pre != '') AND ($this->dbprefix != $this->swap_pre) )
+		{			
+			$sql = preg_replace("/(\W)".$this->swap_pre."(\S+?)/", "\\1".$this->dbprefix."\\2", $sql);
+		}
+		
+		// Is query caching enabled?  If the query is a "read type"
+		// we will load the caching class and return the previously
+		// cached query if it exists
+		if ($this->cache_on == TRUE AND stristr($sql, 'SELECT'))
+		{
+			if ($this->_cache_init())
+			{
+				$this->load_rdriver();
+				if (FALSE !== ($cache = $this->CACHE->read($sql)))
+				{
+					return $cache;
+				}
+			}
+		}
+		
+		// Compile binds if needed
+		if ($binds !== FALSE)
+		{
+			$sql = $this->compile_binds($sql, $binds);
+		}
+
+		// Save the  query for debugging
+		if ($this->save_queries == TRUE)
+		{
+			$this->queries[] = $sql;
+		}
+		
+		// Start the Query Timer
+		$time_start = list($sm, $ss) = explode(' ', microtime());
+	
+		// Run the Query
+		if (FALSE === ($this->result_id = $this->simple_query($sql)))
+		{
+			if ($this->save_queries == TRUE)
+			{
+				$this->query_times[] = 0;
+			}
+		
+			// This will trigger a rollback if transactions are being used
+			$this->_trans_status = FALSE;
+
+			if ($this->db_debug)
+			{
+				// grab the error number and message now, as we might run some
+				// additional queries before displaying the error
+				$error_no = $this->_error_number();
+				$error_msg = $this->_error_message();
+				
+				// We call this function in order to roll-back queries
+				// if transactions are enabled.  If we don't call this here
+				// the error message will trigger an exit, causing the 
+				// transactions to remain in limbo.
+				$this->trans_complete();
+
+				// Log and display errors
+				log_message('error', 'Query error: '.$error_msg);
+				return $this->display_error(
+										array(
+												'Error Number: '.$error_no,
+												$error_msg,
+												$sql
+											)
+										);
+			}
+		
+			return FALSE;
+		}
+		
+		// Stop and aggregate the query time results
+		$time_end = list($em, $es) = explode(' ', microtime());
+		$this->benchmark += ($em + $es) - ($sm + $ss);
+
+		if ($this->save_queries == TRUE)
+		{
+			$this->query_times[] = ($em + $es) - ($sm + $ss);
+		}
+		
+		// Increment the query counter
+		$this->query_count++;
+		
+		// Was the query a "write" type?
+		// If so we'll simply return true
+		if ($this->is_write_type($sql) === TRUE)
+		{
+			// If caching is enabled we'll auto-cleanup any
+			// existing files related to this particular URI
+			if ($this->cache_on == TRUE AND $this->cache_autodel == TRUE AND $this->_cache_init())
+			{
+				$this->CACHE->delete();
+			}
+		
+			return TRUE;
+		}
+		
+		// Return TRUE if we don't need to create a result object
+		// Currently only the Oracle driver uses this when stored
+		// procedures are used
+		if ($return_object !== TRUE)
+		{
+			return TRUE;
+		}
+	
+		// Load and instantiate the result driver	
+		
+		$driver 		= $this->load_rdriver();
+		$RES 			= new $driver();
+		$RES->conn_id	= $this->conn_id;
+		$RES->result_id	= $this->result_id;
+
+		if ($this->dbdriver == 'oci8')
+		{
+			$RES->stmt_id		= $this->stmt_id;
+			$RES->curs_id		= NULL;
+			$RES->limit_used	= $this->limit_used;
+			$this->stmt_id		= FALSE;
+		}
+		
+		// oci8 vars must be set before calling this
+		$RES->num_rows	= $RES->num_rows();
+				
+		// Is query caching enabled?  If so, we'll serialize the
+		// result object and save it to a cache file.
+		if ($this->cache_on == TRUE AND $this->_cache_init())
+		{
+			// We'll create a new instance of the result object
+			// only without the platform specific driver since
+			// we can't use it with cached data (the query result
+			// resource ID won't be any good once we've cached the
+			// result object, so we'll have to compile the data
+			// and save it)
+			$CR = new CI_DB_result();
+			$CR->num_rows 		= $RES->num_rows();
+			$CR->result_object	= $RES->result_object();
+			$CR->result_array	= $RES->result_array();
+			
+			// Reset these since cached objects can not utilize resource IDs.
+			$CR->conn_id		= NULL;
+			$CR->result_id		= NULL;
+
+			$this->CACHE->write($sql, $CR);
+		}
+		
+		return $RES;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Load the result drivers
+	 *
+	 * @access	public
+	 * @return	string 	the name of the result class		
+	 */		
+	function load_rdriver()
+	{
+		$driver = 'CI_DB_'.$this->dbdriver.'_result';
+
+		if ( ! class_exists($driver))
+		{
+			include_once(BASEPATH.'database/DB_result'.EXT);
+			include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result'.EXT);
+		}
+		
+		return $driver;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Simple Query
+	 * This is a simplified version of the query() function.  Internally
+	 * we only use it when running transaction commands since they do
+	 * not require all the features of the main query() function.
+	 *
+	 * @access	public
+	 * @param	string	the sql query
+	 * @return	mixed		
+	 */	
+	function simple_query($sql)
+	{
+		if ( ! $this->conn_id)
+		{
+			$this->initialize();
+		}
+
+		return $this->_execute($sql);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Disable Transactions
+	 * This permits transactions to be disabled at run-time.
+	 *
+	 * @access	public
+	 * @return	void		
+	 */	
+	function trans_off()
+	{
+		$this->trans_enabled = FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Enable/disable Transaction Strict Mode
+	 * When strict mode is enabled, if you are running multiple groups of
+	 * transactions, if one group fails all groups will be rolled back.
+	 * If strict mode is disabled, each group is treated autonomously, meaning
+	 * a failure of one group will not affect any others
+	 *
+	 * @access	public
+	 * @return	void		
+	 */	
+	function trans_strict($mode = TRUE)
+	{
+		$this->trans_strict = is_bool($mode) ? $mode : TRUE;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Start Transaction
+	 *
+	 * @access	public
+	 * @return	void		
+	 */	
+	function trans_start($test_mode = FALSE)
+	{	
+		if ( ! $this->trans_enabled)
+		{
+			return FALSE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			$this->_trans_depth += 1;
+			return;
+		}
+		
+		$this->trans_begin($test_mode);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Complete Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_complete()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return FALSE;
+		}
+	
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 1)
+		{
+			$this->_trans_depth -= 1;
+			return TRUE;
+		}
+	
+		// The query() function will set this flag to FALSE in the event that a query failed
+		if ($this->_trans_status === FALSE)
+		{
+			$this->trans_rollback();
+			
+			// If we are NOT running in strict mode, we will reset
+			// the _trans_status flag so that subsequent groups of transactions
+			// will be permitted.
+			if ($this->trans_strict === FALSE)
+			{
+				$this->_trans_status = TRUE;
+			}
+
+			log_message('debug', 'DB Transaction Failure');
+			return FALSE;
+		}
+		
+		$this->trans_commit();
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Lets you retrieve the transaction flag to determine if it has failed
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_status()
+	{
+		return $this->_trans_status;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Compile Bindings
+	 *
+	 * @access	public
+	 * @param	string	the sql statement
+	 * @param	array	an array of bind data
+	 * @return	string		
+	 */	
+	function compile_binds($sql, $binds)
+	{
+		if (strpos($sql, $this->bind_marker) === FALSE)
+		{
+			return $sql;
+		}
+		
+		if ( ! is_array($binds))
+		{
+			$binds = array($binds);
+		}
+		
+		// Get the sql segments around the bind markers
+		$segments = explode($this->bind_marker, $sql);
+
+		// The count of bind should be 1 less then the count of segments
+		// If there are more bind arguments trim it down
+		if (count($binds) >= count($segments)) {
+			$binds = array_slice($binds, 0, count($segments)-1);
+		}
+
+		// Construct the binded query
+		$result = $segments[0];
+		$i = 0;
+		foreach ($binds as $bind)
+		{
+			$result .= $this->escape($bind);
+			$result .= $segments[++$i];
+		}
+
+		return $result;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Determines if a query is a "write" type.
+	 *
+	 * @access	public
+	 * @param	string	An SQL query string
+	 * @return	boolean		
+	 */	
+	function is_write_type($sql)
+	{
+		if ( ! preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i', $sql))
+		{
+			return FALSE;
+		}
+		return TRUE;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Calculate the aggregate query elapsed time
+	 *
+	 * @access	public
+	 * @param	integer	The number of decimal places
+	 * @return	integer		
+	 */	
+	function elapsed_time($decimals = 6)
+	{
+		return number_format($this->benchmark, $decimals);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Returns the total number of queries
+	 *
+	 * @access	public
+	 * @return	integer		
+	 */	
+	function total_queries()
+	{
+		return $this->query_count;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Returns the last query that was executed
+	 *
+	 * @access	public
+	 * @return	void		
+	 */	
+	function last_query()
+	{
+		return end($this->queries);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * "Smart" Escape String
+	 *
+	 * Escapes data based on type
+	 * Sets boolean and null types
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	integer		
+	 */	
+	function escape($str)
+	{	
+		switch (gettype($str))
+		{
+			case 'string'	:	$str = "'".$this->escape_str($str)."'";
+				break;
+			case 'boolean'	:	$str = ($str === FALSE) ? 0 : 1;
+				break;
+			default			:	$str = ($str === NULL) ? 'NULL' : $str;
+				break;
+		}		
+
+		return $str;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Primary
+	 *
+	 * Retrieves the primary key.  It assumes that the row in the first
+	 * position is the primary key
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string		
+	 */	
+	function primary($table = '')
+	{	
+		$fields = $this->list_fields($table);
+		
+		if ( ! is_array($fields))
+		{
+			return FALSE;
+		}
+
+		return current($fields);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Returns an array of table names
+	 *
+	 * @access	public
+	 * @return	array		
+	 */	
+	function list_tables($constrain_by_prefix = FALSE)
+	{
+		// Is there a cached result?
+		if (isset($this->data_cache['table_names']))
+		{
+			return $this->data_cache['table_names'];
+		}
+	
+		if (FALSE === ($sql = $this->_list_tables($constrain_by_prefix)))
+		{
+			if ($this->db_debug)
+			{
+				return $this->display_error('db_unsupported_function');
+			}
+			return FALSE;
+		}
+
+		$retval = array();
+		$query = $this->query($sql);
+		
+		if ($query->num_rows() > 0)
+		{
+			foreach($query->result_array() as $row)
+			{
+				if (isset($row['TABLE_NAME']))
+				{
+					$retval[] = $row['TABLE_NAME'];
+				}
+				else
+				{
+					$retval[] = array_shift($row);
+				}
+			}
+		}
+
+		$this->data_cache['table_names'] = $retval;
+		return $this->data_cache['table_names'];
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Determine if a particular table exists
+	 * @access	public
+	 * @return	boolean
+	 */
+	function table_exists($table_name)
+	{	
+		return ( ! in_array($this->_protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables())) ? FALSE : TRUE;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Fetch MySQL Field Names
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	array		
+	 */
+	function list_fields($table = '')
+	{
+		// Is there a cached result?
+		if (isset($this->data_cache['field_names'][$table]))
+		{
+			return $this->data_cache['field_names'][$table];
+		}
+	
+		if ($table == '')
+		{
+			if ($this->db_debug)
+			{
+				return $this->display_error('db_field_param_missing');
+			}
+			return FALSE;
+		}
+		
+		if (FALSE === ($sql = $this->_list_columns($this->_protect_identifiers($table, TRUE, NULL, FALSE))))
+		{
+			if ($this->db_debug)
+			{
+				return $this->display_error('db_unsupported_function');
+			}
+			return FALSE;
+		}
+		
+		$query = $this->query($sql);
+		
+		$retval = array();
+		foreach($query->result_array() as $row)
+		{
+			if (isset($row['COLUMN_NAME']))
+			{
+				$retval[] = $row['COLUMN_NAME'];
+			}
+			else
+			{
+				$retval[] = current($row);
+			}		
+		}
+		
+		$this->data_cache['field_names'][$table] = $retval;
+		return $this->data_cache['field_names'][$table];
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Determine if a particular field exists
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @return	boolean
+	 */
+	function field_exists($field_name, $table_name)
+	{	
+		return ( ! in_array($field_name, $this->list_fields($table_name))) ? FALSE : TRUE;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Returns an object with field data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	object		
+	 */	
+	function field_data($table = '')
+	{
+		if ($table == '')
+		{
+			if ($this->db_debug)
+			{
+				return $this->display_error('db_field_param_missing');
+			}
+			return FALSE;
+		}
+		
+		$query = $this->query($this->_field_data($this->_protect_identifiers($table, TRUE, NULL, FALSE)));
+
+		return $query->field_data();
+	}	
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Generate an insert string
+	 *
+	 * @access	public
+	 * @param	string	the table upon which the query will be performed
+	 * @param	array	an associative array data of key/values
+	 * @return	string		
+	 */	
+	function insert_string($table, $data)
+	{
+		$fields = array();
+		$values = array();
+		
+		foreach($data as $key => $val)
+		{
+			$fields[] = $this->_escape_identifiers($key);
+			$values[] = $this->escape($val);
+		}
+				
+		return $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values);
+	}	
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Generate an update string
+	 *
+	 * @access	public
+	 * @param	string	the table upon which the query will be performed
+	 * @param	array	an associative array data of key/values
+	 * @param	mixed	the "where" statement
+	 * @return	string		
+	 */	
+	function update_string($table, $data, $where)
+	{
+		if ($where == '')
+		{
+			return false;
+		}
+					
+		$fields = array();
+		foreach($data as $key => $val)
+		{
+			$fields[$this->_protect_identifiers($key)] = $this->escape($val);
+		}
+
+		if ( ! is_array($where))
+		{
+			$dest = array($where);
+		}
+		else
+		{
+			$dest = array();
+			foreach ($where as $key => $val)
+			{
+				$prefix = (count($dest) == 0) ? '' : ' AND ';
+	
+				if ($val !== '')
+				{
+					if ( ! $this->_has_operator($key))
+					{
+						$key .= ' =';
+					}
+				
+					$val = ' '.$this->escape($val);
+				}
+							
+				$dest[] = $prefix.$key.$val;
+			}
+		}		
+
+		return $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $dest);
+	}	
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Tests whether the string has an SQL operator
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	bool
+	 */
+	function _has_operator($str)
+	{
+		$str = trim($str);
+		if ( ! preg_match("/(\s|<|>|!|=|is null|is not null)/i", $str))
+		{
+			return FALSE;
+		}
+
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Enables a native PHP function to be run, using a platform agnostic wrapper.
+	 *
+	 * @access	public
+	 * @param	string	the function name
+	 * @param	mixed	any parameters needed by the function
+	 * @return	mixed		
+	 */	
+	function call_function($function)
+	{
+		$driver = ($this->dbdriver == 'postgre') ? 'pg_' : $this->dbdriver.'_';
+	
+		if (FALSE === strpos($driver, $function))
+		{
+			$function = $driver.$function;
+		}
+		
+		if ( ! function_exists($function))
+		{
+			if ($this->db_debug)
+			{
+				return $this->display_error('db_unsupported_function');
+			}
+			return FALSE;
+		}
+		else
+		{
+			$args = (func_num_args() > 1) ? array_splice(func_get_args(), 1) : null;
+
+			return call_user_func_array($function, $args);
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set Cache Directory Path
+	 *
+	 * @access	public
+	 * @param	string	the path to the cache directory
+	 * @return	void
+	 */		
+	function cache_set_path($path = '')
+	{
+		$this->cachedir = $path;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Enable Query Caching
+	 *
+	 * @access	public
+	 * @return	void
+	 */		
+	function cache_on()
+	{
+		$this->cache_on = TRUE;
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Disable Query Caching
+	 *
+	 * @access	public
+	 * @return	void
+	 */	
+	function cache_off()
+	{
+		$this->cache_on = FALSE;
+		return FALSE;
+	}
+	
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete the cache files associated with a particular URI
+	 *
+	 * @access	public
+	 * @return	void
+	 */		
+	function cache_delete($segment_one = '', $segment_two = '')
+	{
+		if ( ! $this->_cache_init())
+		{
+			return FALSE;
+		}
+		return $this->CACHE->delete($segment_one, $segment_two);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete All cache files
+	 *
+	 * @access	public
+	 * @return	void
+	 */		
+	function cache_delete_all()
+	{
+		if ( ! $this->_cache_init())
+		{
+			return FALSE;
+		}
+
+		return $this->CACHE->delete_all();
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Initialize the Cache Class
+	 *
+	 * @access	private
+	 * @return	void
+	 */	
+	function _cache_init()
+	{
+		if (is_object($this->CACHE) AND class_exists('CI_DB_Cache'))
+		{
+			return TRUE;
+		}
+	
+		if ( ! @include(BASEPATH.'database/DB_cache'.EXT))
+		{
+			return $this->cache_off();
+		}
+		
+		$this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Close DB Connection
+	 *
+	 * @access	public
+	 * @return	void		
+	 */	
+	function close()
+	{
+		if (is_resource($this->conn_id) OR is_object($this->conn_id))
+		{
+			$this->_close($this->conn_id);
+		}
+		$this->conn_id = FALSE;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Display an error message
+	 *
+	 * @access	public
+	 * @param	string	the error message
+	 * @param	string	any "swap" values
+	 * @param	boolean	whether to localize the message
+	 * @return	string	sends the application/error_db.php template		
+	 */	
+	function display_error($error = '', $swap = '', $native = FALSE)
+	{
+		$LANG =& load_class('Language');
+		$LANG->load('db');
+
+		$heading = $LANG->line('db_error_heading');
+
+		if ($native == TRUE)
+		{
+			$message = $error;
+		}
+		else
+		{
+			$message = ( ! is_array($error)) ? array(str_replace('%s', $swap, $LANG->line($error))) : $error;
+		}
+		
+		$error =& load_class('Exceptions');
+		echo $error->show_error($heading, $message, 'error_db');
+		exit;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Protect Identifiers
+	 *
+	 * This function adds backticks if appropriate based on db type
+	 *
+	 * @access	private
+	 * @param	mixed	the item to escape
+	 * @return	mixed	the item with backticks
+	 */
+	function protect_identifiers($item, $prefix_single = FALSE)
+	{
+		return $this->_protect_identifiers($item, $prefix_single);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Protect Identifiers
+	 *
+	 * This function is used extensively by the Active Record class, and by
+	 * a couple functions in this class. 
+	 * It takes a column or table name (optionally with an alias) and inserts
+	 * the table prefix onto it.  Some logic is necessary in order to deal with
+	 * column names that include the path.  Consider a query like this:
+	 *
+	 * SELECT * FROM hostname.database.table.column AS c FROM hostname.database.table
+	 *
+	 * Or a query with aliasing:
+	 *
+	 * SELECT m.member_id, m.member_name FROM members AS m
+	 *
+	 * Since the column name can include up to four segments (host, DB, table, column)
+	 * or also have an alias prefix, we need to do a bit of work to figure this out and
+	 * insert the table prefix (if it exists) in the proper position, and escape only
+	 * the correct identifiers.
+	 *
+	 * @access	private
+	 * @param	string
+	 * @param	bool
+	 * @param	mixed
+	 * @param	bool
+	 * @return	string
+	 */	
+	function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE)
+	{
+		if ( ! is_bool($protect_identifiers))
+		{
+			$protect_identifiers = $this->_protect_identifiers;
+		}
+		
+		// Convert tabs or multiple spaces into single spaces
+		$item = preg_replace('/[\t| ]+/', ' ', $item);
+	
+		// If the item has an alias declaration we remove it and set it aside.
+		// Basically we remove everything to the right of the first space
+		$alias = '';
+		if (strpos($item, ' ') !== FALSE)
+		{		
+			$alias = strstr($item, " ");
+			$item = substr($item, 0, - strlen($alias));
+		}
+
+		// Break the string apart if it contains periods, then insert the table prefix
+		// in the correct location, assuming the period doesn't indicate that we're dealing
+		// with an alias. While we're at it, we will escape the components
+		if (strpos($item, '.') !== FALSE)
+		{
+			$parts	= explode('.', $item);
+			
+			// Does the first segment of the exploded item match
+			// one of the aliases previously identified?  If so,
+			// we have nothing more to do other than escape the item
+			if (in_array($parts[0], $this->ar_aliased_tables))
+			{				
+				if ($protect_identifiers === TRUE)
+				{
+					foreach ($parts as $key => $val)
+					{
+						if ( ! in_array($val, $this->_reserved_identifiers))
+						{
+							$parts[$key] = $this->_escape_identifiers($val);
+						}
+					}
+				
+					$item = implode('.', $parts);
+				}			
+				return $item.$alias;
+			}
+			
+			// Is there a table prefix defined in the config file?  If not, no need to do anything
+			if ($this->dbprefix != '')
+			{
+				// We now add the table prefix based on some logic.
+				// Do we have 4 segments (hostname.database.table.column)?
+				// If so, we add the table prefix to the column name in the 3rd segment.
+				if (isset($parts[3]))
+				{
+					$i = 2;
+				}
+				// Do we have 3 segments (database.table.column)?
+				// If so, we add the table prefix to the column name in 2nd position
+				elseif (isset($parts[2]))
+				{
+					$i = 1;
+				}
+				// Do we have 2 segments (table.column)?
+				// If so, we add the table prefix to the column name in 1st segment
+				else
+				{
+					$i = 0;
+				}
+				
+				// This flag is set when the supplied $item does not contain a field name.
+				// This can happen when this function is being called from a JOIN.
+				if ($field_exists == FALSE)
+				{
+					$i++;
+				}
+				
+				// We only add the table prefix if it does not already exist
+				if (substr($parts[$i], 0, strlen($this->dbprefix)) != $this->dbprefix)
+				{
+					$parts[$i] = $this->dbprefix.$parts[$i];
+				}
+				
+				// Put the parts back together
+				$item = implode('.', $parts);
+			}
+			
+			if ($protect_identifiers === TRUE)
+			{
+				$item = $this->_escape_identifiers($item);
+			}
+			
+			return $item.$alias;
+		}
+
+		// This is basically a bug fix for queries that use MAX, MIN, etc.
+		// If a parenthesis is found we know that we do not need to 
+		// escape the data or add a prefix.  There's probably a more graceful
+		// way to deal with this, but I'm not thinking of it -- Rick
+		if (strpos($item, '(') !== FALSE)
+		{
+			return $item.$alias;
+		}
+		
+		// Is there a table prefix?  If not, no need to insert it
+		if ($this->dbprefix != '')
+		{
+			// Do we prefix an item with no segments?
+			if ($prefix_single == TRUE AND substr($item, 0, strlen($this->dbprefix)) != $this->dbprefix)
+			{
+				$item = $this->dbprefix.$item;
+			}		
+		}
+
+		if ($protect_identifiers === TRUE AND ! in_array($item, $this->_reserved_identifiers))
+		{
+			$item = $this->_escape_identifiers($item);
+		}
+		
+		return $item.$alias;
+	}
+
+
+}
+
+
+/* End of file DB_driver.php */
 /* Location: ./system/database/DB_driver.php */
\ No newline at end of file
diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php
index 20f0a30..f708910 100644
--- a/system/database/DB_forge.php
+++ b/system/database/DB_forge.php
@@ -1,355 +1,355 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * Code Igniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Database Utility Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_forge {

-

-	var $fields		 	= array();

-	var $keys			= array();

-	var $primary_keys 	= array();

-	var $db_char_set	=	'';

-

-	/**

-	 * Constructor

-	 *

-	 * Grabs the CI super object instance so we can access it.

-	 *

-	 */	

-	function CI_DB_forge()

-	{

-		// Assign the main database object to $this->db

-		$CI =& get_instance();

-		$this->db =& $CI->db;

-		log_message('debug', "Database Forge Class Initialized");

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Create database

-	 *

-	 * @access	public

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function create_database($db_name)

-	{

-		$sql = $this->_create_database($db_name);

-		

-		if (is_bool($sql))

-		{

-			return $sql;

-		}

-	

-		return $this->db->query($sql);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	public

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function drop_database($db_name)

-	{

-		$sql = $this->_drop_database($db_name);

-		

-		if (is_bool($sql))

-		{

-			return $sql;

-		}

-	

-		return $this->db->query($sql);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Add Key

-	 *

-	 * @access	public

-	 * @param	string	key

-	 * @param	string	type

-	 * @return	void

-	 */

-	function add_key($key = '', $primary = FALSE)

-	{

-		if (is_array($key))

-		{

-			foreach($key as $one)

-			{

-				$this->add_key($one, $primary);

-			}

-			

-			return;

-		}

-	

-		if ($key == '')

-		{

-			show_error('Key information is required for that operation.');

-		}

-		

-		if ($primary === TRUE)

-		{

-			$this->primary_keys[] = $key;

-		}

-		else

-		{

-			$this->keys[] = $key;

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Add Field

-	 *

-	 * @access	public

-	 * @param	string	collation

-	 * @return	void

-	 */

-	function add_field($field = '')

-	{

-		if ($field == '')

-		{

-			show_error('Field information is required.');

-		}

-		

-		if (is_string($field))

-		{

-			if ($field == 'id')

-			{

-				$this->add_field(array(

-										'id' => array(

-													'type' => 'INT',

-													'constraint' => 9,

-													'auto_increment' => TRUE

-													)

-								));

-				$this->add_key('id', TRUE);

-			}

-			else

-			{

-				if (strpos($field, ' ') === FALSE)

-				{

-					show_error('Field information is required for that operation.');

-				}

-				

-				$this->fields[] = $field;

-			}

-		}

-		

-		if (is_array($field))

-		{

-			$this->fields = array_merge($this->fields, $field);

-		}

-		

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Create Table

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	bool

-	 */

-	function create_table($table = '', $if_not_exists = FALSE)

-	{	

-		if ($table == '')

-		{

-			show_error('A table name is required for that operation.');

-		}

-			

-		if (count($this->fields) == 0)

-		{	

-			show_error('Field information is required.');

-		}

-

-		$sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists);

-		

-		$this->_reset();

-		return $this->db->query($sql);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop Table

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	bool

-	 */

-	function drop_table($table_name)

-	{

-		$sql = $this->_drop_table($this->db->dbprefix.$table_name);

-		

-		if (is_bool($sql))

-		{

-			return $sql;

-		}

-	

-		return $this->db->query($sql);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rename Table

-	 *

-	 * @access	public

-	 * @param	string	the old table name

-	 * @param	string	the new table name

-	 * @return	bool

-	 */

-	function rename_table($table_name, $new_table_name)

-	{

-		if ($table_name == '' OR $new_table_name == '')

-		{

-			show_error('A table name is required for that operation.');

-		}

-			

-		$sql = $this->_rename_table($table_name, $new_table_name);

-		return $this->db->query($sql);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Column Add

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	string	the column name

-	 * @param	string	the column definition

-	 * @return	bool

-	 */

-	function add_column($table = '', $field = array(), $after_field = '')

-	{

-		if ($table == '')

-		{

-			show_error('A table name is required for that operation.');

-		}

-

-		// add field info into field array, but we can only do one at a time

-		// so only grab the first field in the event there are more then one

-		$this->add_field(array_slice($field, 0, 1));

-

-		if (count($this->fields) == 0)

-		{	

-			show_error('Field information is required.');

-		}

-

-		$sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field);

-

-		$this->_reset();

-		return $this->db->query($sql);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Column Drop

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	string	the column name

-	 * @return	bool

-	 */

-	function drop_column($table = '', $column_name = '')

-	{

-	

-		if ($table == '')

-		{

-			show_error('A table name is required for that operation.');

-		}

-

-		if ($column_name == '')

-		{

-			show_error('A column name is required for that operation.');

-		}

-

-		$sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name);

-	

-		return $this->db->query($sql);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Column Modify

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	string	the column name

-	 * @param	string	the column definition

-	 * @return	bool

-	 */

-	function modify_column($table = '', $field = array())

-	{

-		if ($table == '')

-		{

-			show_error('A table name is required for that operation.');

-		}

-

-		// add field info into field array, but we can only do one at a time

-		// so only grab the first field in the event there are more then one

-		$this->add_field(array_slice($field, 0, 1));

-

-		if (count($this->fields) == 0)

-		{	

-			show_error('Field information is required.');

-		}

-

-		$sql = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields);

-

-		$this->_reset();

-		return $this->db->query($sql);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Reset

-	 *

-	 * Resets table creation vars

-	 *

-	 * @access	private

-	 * @return	void

-	 */

-	function _reset()

-	{

-		$this->fields 		= array();

-		$this->keys			= array();

-		$this->primary_keys 	= array();

-	}

-

-}

-

-/* End of file DB_forge.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Database Utility Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_forge {
+
+	var $fields		 	= array();
+	var $keys			= array();
+	var $primary_keys 	= array();
+	var $db_char_set	=	'';
+
+	/**
+	 * Constructor
+	 *
+	 * Grabs the CI super object instance so we can access it.
+	 *
+	 */	
+	function CI_DB_forge()
+	{
+		// Assign the main database object to $this->db
+		$CI =& get_instance();
+		$this->db =& $CI->db;
+		log_message('debug', "Database Forge Class Initialized");
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Create database
+	 *
+	 * @access	public
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function create_database($db_name)
+	{
+		$sql = $this->_create_database($db_name);
+		
+		if (is_bool($sql))
+		{
+			return $sql;
+		}
+	
+		return $this->db->query($sql);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	public
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function drop_database($db_name)
+	{
+		$sql = $this->_drop_database($db_name);
+		
+		if (is_bool($sql))
+		{
+			return $sql;
+		}
+	
+		return $this->db->query($sql);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Add Key
+	 *
+	 * @access	public
+	 * @param	string	key
+	 * @param	string	type
+	 * @return	void
+	 */
+	function add_key($key = '', $primary = FALSE)
+	{
+		if (is_array($key))
+		{
+			foreach($key as $one)
+			{
+				$this->add_key($one, $primary);
+			}
+			
+			return;
+		}
+	
+		if ($key == '')
+		{
+			show_error('Key information is required for that operation.');
+		}
+		
+		if ($primary === TRUE)
+		{
+			$this->primary_keys[] = $key;
+		}
+		else
+		{
+			$this->keys[] = $key;
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Add Field
+	 *
+	 * @access	public
+	 * @param	string	collation
+	 * @return	void
+	 */
+	function add_field($field = '')
+	{
+		if ($field == '')
+		{
+			show_error('Field information is required.');
+		}
+		
+		if (is_string($field))
+		{
+			if ($field == 'id')
+			{
+				$this->add_field(array(
+										'id' => array(
+													'type' => 'INT',
+													'constraint' => 9,
+													'auto_increment' => TRUE
+													)
+								));
+				$this->add_key('id', TRUE);
+			}
+			else
+			{
+				if (strpos($field, ' ') === FALSE)
+				{
+					show_error('Field information is required for that operation.');
+				}
+				
+				$this->fields[] = $field;
+			}
+		}
+		
+		if (is_array($field))
+		{
+			$this->fields = array_merge($this->fields, $field);
+		}
+		
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Create Table
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	bool
+	 */
+	function create_table($table = '', $if_not_exists = FALSE)
+	{	
+		if ($table == '')
+		{
+			show_error('A table name is required for that operation.');
+		}
+			
+		if (count($this->fields) == 0)
+		{	
+			show_error('Field information is required.');
+		}
+
+		$sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists);
+		
+		$this->_reset();
+		return $this->db->query($sql);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop Table
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	bool
+	 */
+	function drop_table($table_name)
+	{
+		$sql = $this->_drop_table($this->db->dbprefix.$table_name);
+		
+		if (is_bool($sql))
+		{
+			return $sql;
+		}
+	
+		return $this->db->query($sql);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rename Table
+	 *
+	 * @access	public
+	 * @param	string	the old table name
+	 * @param	string	the new table name
+	 * @return	bool
+	 */
+	function rename_table($table_name, $new_table_name)
+	{
+		if ($table_name == '' OR $new_table_name == '')
+		{
+			show_error('A table name is required for that operation.');
+		}
+			
+		$sql = $this->_rename_table($table_name, $new_table_name);
+		return $this->db->query($sql);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Column Add
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	string	the column name
+	 * @param	string	the column definition
+	 * @return	bool
+	 */
+	function add_column($table = '', $field = array(), $after_field = '')
+	{
+		if ($table == '')
+		{
+			show_error('A table name is required for that operation.');
+		}
+
+		// add field info into field array, but we can only do one at a time
+		// so only grab the first field in the event there are more then one
+		$this->add_field(array_slice($field, 0, 1));
+
+		if (count($this->fields) == 0)
+		{	
+			show_error('Field information is required.');
+		}
+
+		$sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field);
+
+		$this->_reset();
+		return $this->db->query($sql);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Column Drop
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	string	the column name
+	 * @return	bool
+	 */
+	function drop_column($table = '', $column_name = '')
+	{
+	
+		if ($table == '')
+		{
+			show_error('A table name is required for that operation.');
+		}
+
+		if ($column_name == '')
+		{
+			show_error('A column name is required for that operation.');
+		}
+
+		$sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name);
+	
+		return $this->db->query($sql);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Column Modify
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	string	the column name
+	 * @param	string	the column definition
+	 * @return	bool
+	 */
+	function modify_column($table = '', $field = array())
+	{
+		if ($table == '')
+		{
+			show_error('A table name is required for that operation.');
+		}
+
+		// add field info into field array, but we can only do one at a time
+		// so only grab the first field in the event there are more then one
+		$this->add_field(array_slice($field, 0, 1));
+
+		if (count($this->fields) == 0)
+		{	
+			show_error('Field information is required.');
+		}
+
+		$sql = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields);
+
+		$this->_reset();
+		return $this->db->query($sql);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Reset
+	 *
+	 * Resets table creation vars
+	 *
+	 * @access	private
+	 * @return	void
+	 */
+	function _reset()
+	{
+		$this->fields 		= array();
+		$this->keys			= array();
+		$this->primary_keys 	= array();
+	}
+
+}
+
+/* End of file DB_forge.php */
 /* Location: ./system/database/DB_forge.php */
\ No newline at end of file
diff --git a/system/database/DB_result.php b/system/database/DB_result.php
index 8f55f67..4128141 100644
--- a/system/database/DB_result.php
+++ b/system/database/DB_result.php
@@ -1,342 +1,342 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Database Result Class

- *

- * This is the platform-independent result class.

- * This class will not be called directly. Rather, the adapter

- * class for the specific database will extend and instantiate it.

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_result {

-

-	var $conn_id		= NULL;

-	var $result_id		= NULL;

-	var $result_array	= array();

-	var $result_object	= array();

-	var $current_row 	= 0;

-	var $num_rows		= 0;

-	var $row_data		= NULL;

-

-

-	/**

-	 * Query result.  Acts as a wrapper function for the following functions.

-	 *

-	 * @access	public

-	 * @param	string	can be "object" or "array"

-	 * @return	mixed	either a result object or array	

-	 */	

-	function result($type = 'object')

-	{	

-		return ($type == 'object') ? $this->result_object() : $this->result_array();

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Query result.  "object" version.

-	 *

-	 * @access	public

-	 * @return	object

-	 */	

-	function result_object()

-	{

-		if (count($this->result_object) > 0)

-		{

-			return $this->result_object;

-		}

-		

-		// In the event that query caching is on the result_id variable 

-		// will return FALSE since there isn't a valid SQL resource so 

-		// we'll simply return an empty array.

-		if ($this->result_id === FALSE OR $this->num_rows() == 0)

-		{

-			return array();

-		}

-

-		$this->_data_seek(0);

-		while ($row = $this->_fetch_object())

-		{

-			$this->result_object[] = $row;

-		}

-		

-		return $this->result_object;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Query result.  "array" version.

-	 *

-	 * @access	public

-	 * @return	array

-	 */	

-	function result_array()

-	{

-		if (count($this->result_array) > 0)

-		{

-			return $this->result_array;

-		}

-

-		// In the event that query caching is on the result_id variable 

-		// will return FALSE since there isn't a valid SQL resource so 

-		// we'll simply return an empty array.

-		if ($this->result_id === FALSE OR $this->num_rows() == 0)

-		{

-			return array();

-		}

-

-		$this->_data_seek(0);

-		while ($row = $this->_fetch_assoc())

-		{

-			$this->result_array[] = $row;

-		}

-		

-		return $this->result_array;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Query result.  Acts as a wrapper function for the following functions.

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string	can be "object" or "array"

-	 * @return	mixed	either a result object or array	

-	 */	

-	function row($n = 0, $type = 'object')

-	{

-		if ( ! is_numeric($n))

-		{

-			// We cache the row data for subsequent uses

-			if ( ! is_array($this->row_data))

-			{

-				$this->row_data = $this->row_array(0);

-			}

-		

-			// array_key_exists() instead of isset() to allow for MySQL NULL values

-			if (array_key_exists($n, $this->row_data))

-			{

-				return $this->row_data[$n];

-			}

-			// reset the $n variable if the result was not achieved			

-			$n = 0;

-		}

-		

-		return ($type == 'object') ? $this->row_object($n) : $this->row_array($n);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Assigns an item into a particular column slot

-	 *

-	 * @access	public

-	 * @return	object

-	 */	

-	function set_row($key, $value = NULL)

-	{

-		// We cache the row data for subsequent uses

-		if ( ! is_array($this->row_data))

-		{

-			$this->row_data = $this->row_array(0);

-		}

-	

-		if (is_array($key))

-		{

-			foreach ($key as $k => $v)

-			{

-				$this->row_data[$k] = $v;

-			}

-			

-			return;

-		}

-	

-		if ($key != '' AND ! is_null($value))

-		{

-			$this->row_data[$key] = $value;

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Returns a single result row - object version

-	 *

-	 * @access	public

-	 * @return	object

-	 */	

-	function row_object($n = 0)

-	{

-		$result = $this->result_object();

-		

-		if (count($result) == 0)

-		{

-			return $result;

-		}

-

-		if ($n != $this->current_row AND isset($result[$n]))

-		{

-			$this->current_row = $n;

-		}

-

-		return $result[$this->current_row];

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Returns a single result row - array version

-	 *

-	 * @access	public

-	 * @return	array

-	 */	

-	function row_array($n = 0)

-	{

-		$result = $this->result_array();

-

-		if (count($result) == 0)

-		{

-			return $result;

-		}

-			

-		if ($n != $this->current_row AND isset($result[$n]))

-		{

-			$this->current_row = $n;

-		}

-		

-		return $result[$this->current_row];

-	}

-

-		

-	// --------------------------------------------------------------------

-

-	/**

-	 * Returns the "first" row

-	 *

-	 * @access	public

-	 * @return	object

-	 */	

-	function first_row($type = 'object')

-	{

-		$result = $this->result($type);

-

-		if (count($result) == 0)

-		{

-			return $result;

-		}

-		return $result[0];

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Returns the "last" row

-	 *

-	 * @access	public

-	 * @return	object

-	 */	

-	function last_row($type = 'object')

-	{

-		$result = $this->result($type);

-

-		if (count($result) == 0)

-		{

-			return $result;

-		}

-		return $result[count($result) -1];

-	}	

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Returns the "next" row

-	 *

-	 * @access	public

-	 * @return	object

-	 */	

-	function next_row($type = 'object')

-	{

-		$result = $this->result($type);

-

-		if (count($result) == 0)

-		{

-			return $result;

-		}

-

-		if (isset($result[$this->current_row + 1]))

-		{

-			++$this->current_row;

-		}

-				

-		return $result[$this->current_row];

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Returns the "previous" row

-	 *

-	 * @access	public

-	 * @return	object

-	 */	

-	function previous_row($type = 'object')

-	{

-		$result = $this->result($type);

-

-		if (count($result) == 0)

-		{

-			return $result;

-		}

-

-		if (isset($result[$this->current_row - 1]))

-		{

-			--$this->current_row;

-		}

-		return $result[$this->current_row];

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * The following functions are normally overloaded by the identically named

-	 * methods in the platform-specific driver -- except when query caching

-	 * is used.  When caching is enabled we do not load the other driver.

-	 * These functions are primarily here to prevent undefined function errors

-	 * when a cached result object is in use.  They are not otherwise fully

-	 * operational due to the unavailability of the database resource IDs with

-	 * cached results.

-	 */

-	function num_rows() { return $this->num_rows; }

-	function num_fields() { return 0; }

-	function list_fields() { return array(); }

-	function field_data() { return array(); }	

-	function free_result() { return TRUE; }

-	function _data_seek() { return TRUE; }

-	function _fetch_assoc() { return array(); }	

-	function _fetch_object() { return array(); }

-	

-}

-// END DB_result class

-

-/* End of file DB_result.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Database Result Class
+ *
+ * This is the platform-independent result class.
+ * This class will not be called directly. Rather, the adapter
+ * class for the specific database will extend and instantiate it.
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_result {
+
+	var $conn_id		= NULL;
+	var $result_id		= NULL;
+	var $result_array	= array();
+	var $result_object	= array();
+	var $current_row 	= 0;
+	var $num_rows		= 0;
+	var $row_data		= NULL;
+
+
+	/**
+	 * Query result.  Acts as a wrapper function for the following functions.
+	 *
+	 * @access	public
+	 * @param	string	can be "object" or "array"
+	 * @return	mixed	either a result object or array	
+	 */	
+	function result($type = 'object')
+	{	
+		return ($type == 'object') ? $this->result_object() : $this->result_array();
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Query result.  "object" version.
+	 *
+	 * @access	public
+	 * @return	object
+	 */	
+	function result_object()
+	{
+		if (count($this->result_object) > 0)
+		{
+			return $this->result_object;
+		}
+		
+		// In the event that query caching is on the result_id variable 
+		// will return FALSE since there isn't a valid SQL resource so 
+		// we'll simply return an empty array.
+		if ($this->result_id === FALSE OR $this->num_rows() == 0)
+		{
+			return array();
+		}
+
+		$this->_data_seek(0);
+		while ($row = $this->_fetch_object())
+		{
+			$this->result_object[] = $row;
+		}
+		
+		return $this->result_object;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Query result.  "array" version.
+	 *
+	 * @access	public
+	 * @return	array
+	 */	
+	function result_array()
+	{
+		if (count($this->result_array) > 0)
+		{
+			return $this->result_array;
+		}
+
+		// In the event that query caching is on the result_id variable 
+		// will return FALSE since there isn't a valid SQL resource so 
+		// we'll simply return an empty array.
+		if ($this->result_id === FALSE OR $this->num_rows() == 0)
+		{
+			return array();
+		}
+
+		$this->_data_seek(0);
+		while ($row = $this->_fetch_assoc())
+		{
+			$this->result_array[] = $row;
+		}
+		
+		return $this->result_array;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Query result.  Acts as a wrapper function for the following functions.
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string	can be "object" or "array"
+	 * @return	mixed	either a result object or array	
+	 */	
+	function row($n = 0, $type = 'object')
+	{
+		if ( ! is_numeric($n))
+		{
+			// We cache the row data for subsequent uses
+			if ( ! is_array($this->row_data))
+			{
+				$this->row_data = $this->row_array(0);
+			}
+		
+			// array_key_exists() instead of isset() to allow for MySQL NULL values
+			if (array_key_exists($n, $this->row_data))
+			{
+				return $this->row_data[$n];
+			}
+			// reset the $n variable if the result was not achieved			
+			$n = 0;
+		}
+		
+		return ($type == 'object') ? $this->row_object($n) : $this->row_array($n);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Assigns an item into a particular column slot
+	 *
+	 * @access	public
+	 * @return	object
+	 */	
+	function set_row($key, $value = NULL)
+	{
+		// We cache the row data for subsequent uses
+		if ( ! is_array($this->row_data))
+		{
+			$this->row_data = $this->row_array(0);
+		}
+	
+		if (is_array($key))
+		{
+			foreach ($key as $k => $v)
+			{
+				$this->row_data[$k] = $v;
+			}
+			
+			return;
+		}
+	
+		if ($key != '' AND ! is_null($value))
+		{
+			$this->row_data[$key] = $value;
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Returns a single result row - object version
+	 *
+	 * @access	public
+	 * @return	object
+	 */	
+	function row_object($n = 0)
+	{
+		$result = $this->result_object();
+		
+		if (count($result) == 0)
+		{
+			return $result;
+		}
+
+		if ($n != $this->current_row AND isset($result[$n]))
+		{
+			$this->current_row = $n;
+		}
+
+		return $result[$this->current_row];
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Returns a single result row - array version
+	 *
+	 * @access	public
+	 * @return	array
+	 */	
+	function row_array($n = 0)
+	{
+		$result = $this->result_array();
+
+		if (count($result) == 0)
+		{
+			return $result;
+		}
+			
+		if ($n != $this->current_row AND isset($result[$n]))
+		{
+			$this->current_row = $n;
+		}
+		
+		return $result[$this->current_row];
+	}
+
+		
+	// --------------------------------------------------------------------
+
+	/**
+	 * Returns the "first" row
+	 *
+	 * @access	public
+	 * @return	object
+	 */	
+	function first_row($type = 'object')
+	{
+		$result = $this->result($type);
+
+		if (count($result) == 0)
+		{
+			return $result;
+		}
+		return $result[0];
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Returns the "last" row
+	 *
+	 * @access	public
+	 * @return	object
+	 */	
+	function last_row($type = 'object')
+	{
+		$result = $this->result($type);
+
+		if (count($result) == 0)
+		{
+			return $result;
+		}
+		return $result[count($result) -1];
+	}	
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Returns the "next" row
+	 *
+	 * @access	public
+	 * @return	object
+	 */	
+	function next_row($type = 'object')
+	{
+		$result = $this->result($type);
+
+		if (count($result) == 0)
+		{
+			return $result;
+		}
+
+		if (isset($result[$this->current_row + 1]))
+		{
+			++$this->current_row;
+		}
+				
+		return $result[$this->current_row];
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Returns the "previous" row
+	 *
+	 * @access	public
+	 * @return	object
+	 */	
+	function previous_row($type = 'object')
+	{
+		$result = $this->result($type);
+
+		if (count($result) == 0)
+		{
+			return $result;
+		}
+
+		if (isset($result[$this->current_row - 1]))
+		{
+			--$this->current_row;
+		}
+		return $result[$this->current_row];
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * The following functions are normally overloaded by the identically named
+	 * methods in the platform-specific driver -- except when query caching
+	 * is used.  When caching is enabled we do not load the other driver.
+	 * These functions are primarily here to prevent undefined function errors
+	 * when a cached result object is in use.  They are not otherwise fully
+	 * operational due to the unavailability of the database resource IDs with
+	 * cached results.
+	 */
+	function num_rows() { return $this->num_rows; }
+	function num_fields() { return 0; }
+	function list_fields() { return array(); }
+	function field_data() { return array(); }	
+	function free_result() { return TRUE; }
+	function _data_seek() { return TRUE; }
+	function _fetch_assoc() { return array(); }	
+	function _fetch_object() { return array(); }
+	
+}
+// END DB_result class
+
+/* End of file DB_result.php */
 /* Location: ./system/database/DB_result.php */
\ No newline at end of file
diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php
index a37522d..195e4c4 100644
--- a/system/database/DB_utility.php
+++ b/system/database/DB_utility.php
@@ -1,389 +1,389 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * Code Igniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Database Utility Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_utility extends CI_DB_forge {

-

-	var $db;

-	var $data_cache 	= array();

-

-	/**

-	 * Constructor

-	 *

-	 * Grabs the CI super object instance so we can access it.

-	 *

-	 */	

-	function CI_DB_utility()

-	{

-		// Assign the main database object to $this->db

-		$CI =& get_instance();

-		$this->db =& $CI->db;

-		

-		log_message('debug', "Database Utility Class Initialized");

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * List databases

-	 *

-	 * @access	public

-	 * @return	bool

-	 */

-	function list_databases()

-	{	

-		// Is there a cached result?

-		if (isset($this->data_cache['db_names']))

-		{

-			return $this->data_cache['db_names'];

-		}

-	

-		$query = $this->db->query($this->_list_databases());

-		$dbs = array();

-		if ($query->num_rows() > 0)

-		{

-			foreach ($query->result_array() as $row)

-			{

-				$dbs[] = current($row);

-			}

-		}

-			

-		$this->data_cache['db_names'] = $dbs;

-		return $this->data_cache['db_names'];

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Optimize Table

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	bool

-	 */

-	function optimize_table($table_name)

-	{

-		$sql = $this->_optimize_table($table_name);

-		

-		if (is_bool($sql))

-		{

-				show_error('db_must_use_set');

-		}

-	

-		$query = $this->db->query($sql);

-		$res = $query->result_array();

-		

-		// Note: Due to a bug in current() that affects some versions

-		// of PHP we can not pass function call directly into it

-		return current($res);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Optimize Database

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function optimize_database()

-	{

-		$result = array();

-		foreach ($this->db->list_tables() as $table_name)

-		{

-			$sql = $this->_optimize_table($table_name);

-			

-			if (is_bool($sql))

-			{

-				return $sql;

-			}

-			

-			$query = $this->db->query($sql);

-			

-			// Build the result array...

-			// Note: Due to a bug in current() that affects some versions

-			// of PHP we can not pass function call directly into it

-			$res = $query->result_array();

-			$res = current($res);

-			$key = str_replace($this->db->database.'.', '', current($res));

-			$keys = array_keys($res);

-			unset($res[$keys[0]]);

-			

-			$result[$key] = $res;

-		}

-

-		return $result;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Repair Table

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	bool

-	 */

-	function repair_table($table_name)

-	{

-		$sql = $this->_repair_table($table_name);

-		

-		if (is_bool($sql))

-		{

-			return $sql;

-		}

-	

-		$query = $this->db->query($sql);

-		

-		// Note: Due to a bug in current() that affects some versions

-		// of PHP we can not pass function call directly into it

-		$res = $query->result_array();

-		return current($res);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Generate CSV from a query result object

-	 *

-	 * @access	public

-	 * @param	object	The query result object

-	 * @param	string	The delimiter - comma by default

-	 * @param	string	The newline character - \n by default

-	 * @param	string	The enclosure - double quote by default

-	 * @return	string

-	 */

-	function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"')

-	{

-		if ( ! is_object($query) OR ! method_exists($query, 'field_names'))

-		{

-			show_error('You must submit a valid result object');

-		}	

-	

-		$out = '';

-		

-		// First generate the headings from the table column names

-		foreach ($query->list_fields() as $name)

-		{

-			$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;

-		}

-		

-		$out = rtrim($out);

-		$out .= $newline;

-		

-		// Next blast through the result array and build out the rows

-		foreach ($query->result_array() as $row)

-		{

-			foreach ($row as $item)

-			{

-				$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim;			

-			}

-			$out = rtrim($out);

-			$out .= $newline;

-		}

-

-		return $out;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Generate XML data from a query result object

-	 *

-	 * @access	public

-	 * @param	object	The query result object

-	 * @param	array	Any preferences

-	 * @return	string

-	 */

-	function xml_from_result($query, $params = array())

-	{

-		if ( ! is_object($query) OR ! method_exists($query, 'field_names'))

-		{

-			show_error('You must submit a valid result object');

-		}

-		

-		// Set our default values

-		foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val)

-		{

-			if ( ! isset($params[$key]))

-			{

-				$params[$key] = $val;

-			}

-		}

-		

-		// Create variables for convenience

-		extract($params);

-			

-		// Load the xml helper

-		$CI =& get_instance();

-		$CI->load->helper('xml');

-

-		// Generate the result

-		$xml = "<{$root}>".$newline;

-		foreach ($query->result_array() as $row)

-		{

-			$xml .= $tab."<{$element}>".$newline;

-			

-			foreach ($row as $key => $val)

-			{

-				$xml .= $tab.$tab."<{$key}>".xml_convert($val)."</{$key}>".$newline;

-			}

-			$xml .= $tab."</{$element}>".$newline;

-		}

-		$xml .= "</$root>".$newline;

-		

-		return $xml;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Database Backup

-	 *

-	 * @access	public

-	 * @return	void

-	 */

-	function backup($params = array())

-	{

-		// If the parameters have not been submitted as an

-		// array then we know that it is simply the table

-		// name, which is a valid short cut.

-		if (is_string($params))

-		{

-			$params = array('tables' => $params);

-		}

-		

-		// ------------------------------------------------------

-	

-		// Set up our default preferences

-		$prefs = array(

-							'tables'		=> array(),

-							'ignore'		=> array(),

-							'filename'		=> '',

-							'format'		=> 'gzip', // gzip, zip, txt

-							'add_drop'		=> TRUE,

-							'add_insert'	=> TRUE,

-							'newline'		=> "\n"

-						);

-

-		// Did the user submit any preferences? If so set them....

-		if (count($params) > 0)

-		{

-			foreach ($prefs as $key => $val)

-			{

-				if (isset($params[$key]))

-				{

-					$prefs[$key] = $params[$key];

-				}

-			}

-		}

-

-		// ------------------------------------------------------

-

-		// Are we backing up a complete database or individual tables?	

-		// If no table names were submitted we'll fetch the entire table list

-		if (count($prefs['tables']) == 0)

-		{

-			$prefs['tables'] = $this->db->list_tables();

-		}

-		

-		// ------------------------------------------------------

-

-		// Validate the format

-		if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE))

-		{

-			$prefs['format'] = 'txt';

-		}

-

-		// ------------------------------------------------------

-

-		// Is the encoder supported?  If not, we'll either issue an

-		// error or use plain text depending on the debug settings

-		if (($prefs['format'] == 'gzip' AND ! @function_exists('gzencode'))

-		 OR ($prefs['format'] == 'zip'  AND ! @function_exists('gzcompress')))

-		{

-			if ($this->db->db_debug)

-			{

-				return $this->db->display_error('db_unsuported_compression');

-			}

-		

-			$prefs['format'] = 'txt';

-		}

-

-		// ------------------------------------------------------

-

-		// Set the filename if not provided - Only needed with Zip files

-		if ($prefs['filename'] == '' AND $prefs['format'] == 'zip')

-		{

-			$prefs['filename'] = (count($prefs['tables']) == 1) ? $prefs['tables'] : $this->db->database;

-			$prefs['filename'] .= '_'.date('Y-m-d_H-i', time());

-		}

-

-		// ------------------------------------------------------

-				

-		// Was a Gzip file requested?

-		if ($prefs['format'] == 'gzip')

-		{

-			return gzencode($this->_backup($prefs));

-		}

-

-		// ------------------------------------------------------

-		

-		// Was a text file requested?

-		if ($prefs['format'] == 'txt')

-		{

-			return $this->_backup($prefs);

-		}

-

-		// ------------------------------------------------------

-

-		// Was a Zip file requested?		

-		if ($prefs['format'] == 'zip')

-		{

-			// If they included the .zip file extension we'll remove it

-			if (preg_match("|.+?\.zip$|", $prefs['filename']))

-			{

-				$prefs['filename'] = str_replace('.zip', '', $prefs['filename']);

-			}

-			

-			// Tack on the ".sql" file extension if needed

-			if ( ! preg_match("|.+?\.sql$|", $prefs['filename']))

-			{

-				$prefs['filename'] .= '.sql';

-			}

-

-			// Load the Zip class and output it

-			

-			$CI =& get_instance();

-			$CI->load->library('zip');

-			$CI->zip->add_data($prefs['filename'], $this->_backup($prefs));							

-			return $CI->zip->get_zip();

-		}

-		

-	}

-

-}

-

-

-/* End of file DB_utility.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Database Utility Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_utility extends CI_DB_forge {
+
+	var $db;
+	var $data_cache 	= array();
+
+	/**
+	 * Constructor
+	 *
+	 * Grabs the CI super object instance so we can access it.
+	 *
+	 */	
+	function CI_DB_utility()
+	{
+		// Assign the main database object to $this->db
+		$CI =& get_instance();
+		$this->db =& $CI->db;
+		
+		log_message('debug', "Database Utility Class Initialized");
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * List databases
+	 *
+	 * @access	public
+	 * @return	bool
+	 */
+	function list_databases()
+	{	
+		// Is there a cached result?
+		if (isset($this->data_cache['db_names']))
+		{
+			return $this->data_cache['db_names'];
+		}
+	
+		$query = $this->db->query($this->_list_databases());
+		$dbs = array();
+		if ($query->num_rows() > 0)
+		{
+			foreach ($query->result_array() as $row)
+			{
+				$dbs[] = current($row);
+			}
+		}
+			
+		$this->data_cache['db_names'] = $dbs;
+		return $this->data_cache['db_names'];
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Optimize Table
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	bool
+	 */
+	function optimize_table($table_name)
+	{
+		$sql = $this->_optimize_table($table_name);
+		
+		if (is_bool($sql))
+		{
+				show_error('db_must_use_set');
+		}
+	
+		$query = $this->db->query($sql);
+		$res = $query->result_array();
+		
+		// Note: Due to a bug in current() that affects some versions
+		// of PHP we can not pass function call directly into it
+		return current($res);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Optimize Database
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function optimize_database()
+	{
+		$result = array();
+		foreach ($this->db->list_tables() as $table_name)
+		{
+			$sql = $this->_optimize_table($table_name);
+			
+			if (is_bool($sql))
+			{
+				return $sql;
+			}
+			
+			$query = $this->db->query($sql);
+			
+			// Build the result array...
+			// Note: Due to a bug in current() that affects some versions
+			// of PHP we can not pass function call directly into it
+			$res = $query->result_array();
+			$res = current($res);
+			$key = str_replace($this->db->database.'.', '', current($res));
+			$keys = array_keys($res);
+			unset($res[$keys[0]]);
+			
+			$result[$key] = $res;
+		}
+
+		return $result;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Repair Table
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	bool
+	 */
+	function repair_table($table_name)
+	{
+		$sql = $this->_repair_table($table_name);
+		
+		if (is_bool($sql))
+		{
+			return $sql;
+		}
+	
+		$query = $this->db->query($sql);
+		
+		// Note: Due to a bug in current() that affects some versions
+		// of PHP we can not pass function call directly into it
+		$res = $query->result_array();
+		return current($res);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Generate CSV from a query result object
+	 *
+	 * @access	public
+	 * @param	object	The query result object
+	 * @param	string	The delimiter - comma by default
+	 * @param	string	The newline character - \n by default
+	 * @param	string	The enclosure - double quote by default
+	 * @return	string
+	 */
+	function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"')
+	{
+		if ( ! is_object($query) OR ! method_exists($query, 'field_names'))
+		{
+			show_error('You must submit a valid result object');
+		}	
+	
+		$out = '';
+		
+		// First generate the headings from the table column names
+		foreach ($query->list_fields() as $name)
+		{
+			$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
+		}
+		
+		$out = rtrim($out);
+		$out .= $newline;
+		
+		// Next blast through the result array and build out the rows
+		foreach ($query->result_array() as $row)
+		{
+			foreach ($row as $item)
+			{
+				$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim;			
+			}
+			$out = rtrim($out);
+			$out .= $newline;
+		}
+
+		return $out;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Generate XML data from a query result object
+	 *
+	 * @access	public
+	 * @param	object	The query result object
+	 * @param	array	Any preferences
+	 * @return	string
+	 */
+	function xml_from_result($query, $params = array())
+	{
+		if ( ! is_object($query) OR ! method_exists($query, 'field_names'))
+		{
+			show_error('You must submit a valid result object');
+		}
+		
+		// Set our default values
+		foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val)
+		{
+			if ( ! isset($params[$key]))
+			{
+				$params[$key] = $val;
+			}
+		}
+		
+		// Create variables for convenience
+		extract($params);
+			
+		// Load the xml helper
+		$CI =& get_instance();
+		$CI->load->helper('xml');
+
+		// Generate the result
+		$xml = "<{$root}>".$newline;
+		foreach ($query->result_array() as $row)
+		{
+			$xml .= $tab."<{$element}>".$newline;
+			
+			foreach ($row as $key => $val)
+			{
+				$xml .= $tab.$tab."<{$key}>".xml_convert($val)."</{$key}>".$newline;
+			}
+			$xml .= $tab."</{$element}>".$newline;
+		}
+		$xml .= "</$root>".$newline;
+		
+		return $xml;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Database Backup
+	 *
+	 * @access	public
+	 * @return	void
+	 */
+	function backup($params = array())
+	{
+		// If the parameters have not been submitted as an
+		// array then we know that it is simply the table
+		// name, which is a valid short cut.
+		if (is_string($params))
+		{
+			$params = array('tables' => $params);
+		}
+		
+		// ------------------------------------------------------
+	
+		// Set up our default preferences
+		$prefs = array(
+							'tables'		=> array(),
+							'ignore'		=> array(),
+							'filename'		=> '',
+							'format'		=> 'gzip', // gzip, zip, txt
+							'add_drop'		=> TRUE,
+							'add_insert'	=> TRUE,
+							'newline'		=> "\n"
+						);
+
+		// Did the user submit any preferences? If so set them....
+		if (count($params) > 0)
+		{
+			foreach ($prefs as $key => $val)
+			{
+				if (isset($params[$key]))
+				{
+					$prefs[$key] = $params[$key];
+				}
+			}
+		}
+
+		// ------------------------------------------------------
+
+		// Are we backing up a complete database or individual tables?	
+		// If no table names were submitted we'll fetch the entire table list
+		if (count($prefs['tables']) == 0)
+		{
+			$prefs['tables'] = $this->db->list_tables();
+		}
+		
+		// ------------------------------------------------------
+
+		// Validate the format
+		if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE))
+		{
+			$prefs['format'] = 'txt';
+		}
+
+		// ------------------------------------------------------
+
+		// Is the encoder supported?  If not, we'll either issue an
+		// error or use plain text depending on the debug settings
+		if (($prefs['format'] == 'gzip' AND ! @function_exists('gzencode'))
+		 OR ($prefs['format'] == 'zip'  AND ! @function_exists('gzcompress')))
+		{
+			if ($this->db->db_debug)
+			{
+				return $this->db->display_error('db_unsuported_compression');
+			}
+		
+			$prefs['format'] = 'txt';
+		}
+
+		// ------------------------------------------------------
+
+		// Set the filename if not provided - Only needed with Zip files
+		if ($prefs['filename'] == '' AND $prefs['format'] == 'zip')
+		{
+			$prefs['filename'] = (count($prefs['tables']) == 1) ? $prefs['tables'] : $this->db->database;
+			$prefs['filename'] .= '_'.date('Y-m-d_H-i', time());
+		}
+
+		// ------------------------------------------------------
+				
+		// Was a Gzip file requested?
+		if ($prefs['format'] == 'gzip')
+		{
+			return gzencode($this->_backup($prefs));
+		}
+
+		// ------------------------------------------------------
+		
+		// Was a text file requested?
+		if ($prefs['format'] == 'txt')
+		{
+			return $this->_backup($prefs);
+		}
+
+		// ------------------------------------------------------
+
+		// Was a Zip file requested?		
+		if ($prefs['format'] == 'zip')
+		{
+			// If they included the .zip file extension we'll remove it
+			if (preg_match("|.+?\.zip$|", $prefs['filename']))
+			{
+				$prefs['filename'] = str_replace('.zip', '', $prefs['filename']);
+			}
+			
+			// Tack on the ".sql" file extension if needed
+			if ( ! preg_match("|.+?\.sql$|", $prefs['filename']))
+			{
+				$prefs['filename'] .= '.sql';
+			}
+
+			// Load the Zip class and output it
+			
+			$CI =& get_instance();
+			$CI->load->library('zip');
+			$CI->zip->add_data($prefs['filename'], $this->_backup($prefs));							
+			return $CI->zip->get_zip();
+		}
+		
+	}
+
+}
+
+
+/* End of file DB_utility.php */
 /* Location: ./system/database/DB_utility.php */
\ No newline at end of file
diff --git a/system/database/drivers/index.html b/system/database/drivers/index.html
index 065d2da..c942a79 100644
--- a/system/database/drivers/index.html
+++ b/system/database/drivers/index.html
@@ -1,10 +1,10 @@
-<html>

-<head>

-	<title>403 Forbidden</title>

-</head>

-<body>

-

-<p>Directory access is forbidden.</p>

-

-</body>

+<html>
+<head>
+	<title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
 </html>
\ No newline at end of file
diff --git a/system/database/drivers/mssql/index.html b/system/database/drivers/mssql/index.html
index 065d2da..c942a79 100644
--- a/system/database/drivers/mssql/index.html
+++ b/system/database/drivers/mssql/index.html
@@ -1,10 +1,10 @@
-<html>

-<head>

-	<title>403 Forbidden</title>

-</head>

-<body>

-

-<p>Directory access is forbidden.</p>

-

-</body>

+<html>
+<head>
+	<title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
 </html>
\ No newline at end of file
diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php
index 6ad0880..78f81da 100644
--- a/system/database/drivers/mssql/mssql_driver.php
+++ b/system/database/drivers/mssql/mssql_driver.php
@@ -1,622 +1,622 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * MS SQL Database Adapter Class

- *

- * Note: _DB is an extender class that the app controller

- * creates dynamically based on whether the active record

- * class is being used or not.

- *

- * @package		CodeIgniter

- * @subpackage	Drivers

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_mssql_driver extends CI_DB {

-

-	var $dbdriver = 'mssql';

-	

-	// The character used for escaping

-	var $_escape_char = '';

-	/**

-	 * The syntax to count rows is slightly different across different

-	 * database engines, so this string appears in each driver and is

-	 * used for the count_all() and count_all_results() functions.

-	 */

-	var $_count_string = "SELECT COUNT(*) AS ";

-	var $_random_keyword = ' ASC'; // not currently supported

-

-	/**

-	 * Non-persistent database connection

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_connect()

-	{

-		if ($this->port != '')

-		{

-			$this->hostname .= ','.$this->port;

-		}

-

-		return @mssql_connect($this->hostname, $this->username, $this->password);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Persistent database connection

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_pconnect()

-	{

-		if ($this->port != '')

-		{

-			$this->hostname .= ','.$this->port;

-		}

-

-		return @mssql_pconnect($this->hostname, $this->username, $this->password);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Select the database

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_select()

-	{

-		// Note: The brackets are required in the event that the DB name

-		// contains reserved characters

-		return @mssql_select_db('['.$this->database.']', $this->conn_id);

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Set client character set

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @return	resource

-	 */

-	function db_set_charset($charset, $collation)

-	{

-		// @todo - add support if needed

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Execute the query

-	 *

-	 * @access	private called by the base class

-	 * @param	string	an SQL query

-	 * @return	resource

-	 */	

-	function _execute($sql)

-	{

-		$sql = $this->_prep_query($sql);

-		return @mssql_query($sql, $this->conn_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Prep the query

-	 *

-	 * If needed, each database adapter can prep the query string

-	 *

-	 * @access	private called by execute()

-	 * @param	string	an SQL query

-	 * @return	string

-	 */	

-	function _prep_query($sql)

-	{

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Begin Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_begin($test_mode = FALSE)

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-		

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		// Reset the transaction failure flag.

-		// If the $test_mode flag is set to TRUE transactions will be rolled back

-		// even if the queries produce a successful result.

-		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;

-

-		$this->simple_query('BEGIN TRAN');

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Commit Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_commit()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		$this->simple_query('COMMIT TRAN');

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rollback Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_rollback()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		$this->simple_query('ROLLBACK TRAN');

-		return TRUE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape String

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function escape_str($str)	

-	{

-		// Access the CI object

-		$CI =& get_instance();

-		

-		// Escape single quotes

-		return str_replace("'", "''", $CI->input->_remove_invisible_characters($str));

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Affected Rows

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function affected_rows()

-	{

-		return @mssql_rows_affected($this->conn_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	* Insert ID

-	*

-	* Returns the last id created in the Identity column.

-	*

-	* @access public

-	* @return integer

-	*/

-	function insert_id()

-	{

-		$ver = self::_parse_major_version($this->version());

-		$sql = ($ver >= 8 ? "SELECT SCOPE_IDENTITY() AS last_id" : "SELECT @@IDENTITY AS last_id");

-		$query = $this->query($sql);

-		$row = $query->row();

-		return $row->last_id;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	* Parse major version

-	*

-	* Grabs the major version number from the 

-	* database server version string passed in.

-	*

-	* @access private

-	* @param string $version

-	* @return int16 major version number

-	*/

-	function _parse_major_version($version)

-	{

-		preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info);

-		return $ver_info[1]; // return the major version b/c that's all we're interested in.

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	* Version number query string

-	*

-	* @access public

-	* @return string

-	*/

-	function _version()

-	{

-		return "SELECT @@VERSION AS ver";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * "Count All" query

-	 *

-	 * Generates a platform-specific query string that counts all records in

-	 * the specified database

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function count_all($table = '')

-	{

-		if ($table == '')

-			return '0';

-	

-		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));

-

-		if ($query->num_rows() == 0)

-			return '0';

-

-		$row = $query->row();

-		return $row->numrows;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * List table query

-	 *

-	 * Generates a platform-specific query string so that the table names can be fetched

-	 *

-	 * @access	private

-	 * @param	boolean

-	 * @return	string

-	 */

-	function _list_tables($prefix_limit = FALSE)

-	{

-		$sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name";

-		

-		// for future compatibility

-		if ($prefix_limit !== FALSE AND $this->dbprefix != '')

-		{

-			//$sql .= " LIKE '".$this->dbprefix."%'";

-			return FALSE; // not currently supported

-		}

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * List column query

-	 *

-	 * Generates a platform-specific query string so that the column names can be fetched

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	string

-	 */

-	function _list_columns($table = '')

-	{

-		return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$table."'";	

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data query

-	 *

-	 * Generates a platform-specific query so that the column data can be retrieved

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _field_data($table)

-	{

-		return "SELECT TOP 1 * FROM ".$table;	

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message string

-	 *

-	 * @access	private

-	 * @return	string

-	 */

-	function _error_message()

-	{

-		// Are errros even supported in MS SQL?

-		return '';

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message number

-	 *

-	 * @access	private

-	 * @return	integer

-	 */

-	function _error_number()

-	{

-		// Are error numbers supported?

-		return '';

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape the SQL Identifiers

-	 *

-	 * This function escapes column and table names

-	 *

-	 * @access	private

-	 * @param	string

-	 * @return	string

-	 */

-	function _escape_identifiers($item)

-	{

-		if ($this->_escape_char == '')

-		{

-			return $item;

-		}

-

-		foreach ($this->_reserved_identifiers as $id)

-		{

-			if (strpos($item, '.'.$id) !== FALSE)

-			{

-				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  

-				

-				// remove duplicates if the user already included the escape

-				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-			}		

-		}

-

-		if (strpos($item, '.') !== FALSE)

-		{

-			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			

-		}

-		else

-		{

-			$str = $this->_escape_char.$item.$this->_escape_char;

-		}

-		

-		// remove duplicates if the user already included the escape

-		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * From Tables

-	 *

-	 * This function implicitly groups FROM tables so there is no confusion

-	 * about operator precedence in harmony with SQL standards

-	 *

-	 * @access	public

-	 * @param	type

-	 * @return	type

-	 */

-	function _from_tables($tables)

-	{

-		if ( ! is_array($tables))

-		{

-			$tables = array($tables);

-		}

-		

-		return implode(', ', $tables);

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Insert statement

-	 *

-	 * Generates a platform-specific insert string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the insert keys

-	 * @param	array	the insert values

-	 * @return	string

-	 */

-	function _insert($table, $keys, $values)

-	{	

-		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Update statement

-	 *

-	 * Generates a platform-specific update string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the update data

-	 * @param	array	the where clause

-	 * @param	array	the orderby clause

-	 * @param	array	the limit clause

-	 * @return	string

-	 */

-	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)

-	{

-		foreach($values as $key => $val)

-		{

-			$valstr[] = $key." = ".$val;

-		}

-		

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-		

-		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';

-	

-		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);

-

-		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';

-

-		$sql .= $orderby.$limit;

-		

-		return $sql;

-	}

-

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Truncate statement

-	 *

-	 * Generates a platform-specific truncate string from the supplied data

-	 * If the database does not support the truncate() command

-	 * This function maps to "DELETE FROM table"

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string

-	 */	

-	function _truncate($table)

-	{

-		return "TRUNCATE ".$table;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete statement

-	 *

-	 * Generates a platform-specific delete string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the where clause

-	 * @param	string	the limit clause

-	 * @return	string

-	 */	

-	function _delete($table, $where = array(), $like = array(), $limit = FALSE)

-	{

-		$conditions = '';

-

-		if (count($where) > 0 OR count($like) > 0)

-		{

-			$conditions = "\nWHERE ";

-			$conditions .= implode("\n", $this->ar_where);

-

-			if (count($where) > 0 && count($like) > 0)

-			{

-				$conditions .= " AND ";

-			}

-			$conditions .= implode("\n", $like);

-		}

-

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-	

-		return "DELETE FROM ".$table.$conditions.$limit;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Limit string

-	 *

-	 * Generates a platform-specific LIMIT clause

-	 *

-	 * @access	public

-	 * @param	string	the sql query string

-	 * @param	integer	the number of rows to limit the query to

-	 * @param	integer	the offset value

-	 * @return	string

-	 */

-	function _limit($sql, $limit, $offset)

-	{

-		$i = $limit + $offset;

-	

-		return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql);		

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Close DB Connection

-	 *

-	 * @access	public

-	 * @param	resource

-	 * @return	void

-	 */

-	function _close($conn_id)

-	{

-		@mssql_close($conn_id);

-	}	

-

-}

-

-

-

-/* End of file mssql_driver.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MS SQL Database Adapter Class
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package		CodeIgniter
+ * @subpackage	Drivers
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mssql_driver extends CI_DB {
+
+	var $dbdriver = 'mssql';
+	
+	// The character used for escaping
+	var $_escape_char = '';
+	/**
+	 * The syntax to count rows is slightly different across different
+	 * database engines, so this string appears in each driver and is
+	 * used for the count_all() and count_all_results() functions.
+	 */
+	var $_count_string = "SELECT COUNT(*) AS ";
+	var $_random_keyword = ' ASC'; // not currently supported
+
+	/**
+	 * Non-persistent database connection
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_connect()
+	{
+		if ($this->port != '')
+		{
+			$this->hostname .= ','.$this->port;
+		}
+
+		return @mssql_connect($this->hostname, $this->username, $this->password);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Persistent database connection
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_pconnect()
+	{
+		if ($this->port != '')
+		{
+			$this->hostname .= ','.$this->port;
+		}
+
+		return @mssql_pconnect($this->hostname, $this->username, $this->password);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Select the database
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_select()
+	{
+		// Note: The brackets are required in the event that the DB name
+		// contains reserved characters
+		return @mssql_select_db('['.$this->database.']', $this->conn_id);
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Set client character set
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @return	resource
+	 */
+	function db_set_charset($charset, $collation)
+	{
+		// @todo - add support if needed
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Execute the query
+	 *
+	 * @access	private called by the base class
+	 * @param	string	an SQL query
+	 * @return	resource
+	 */	
+	function _execute($sql)
+	{
+		$sql = $this->_prep_query($sql);
+		return @mssql_query($sql, $this->conn_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Prep the query
+	 *
+	 * If needed, each database adapter can prep the query string
+	 *
+	 * @access	private called by execute()
+	 * @param	string	an SQL query
+	 * @return	string
+	 */	
+	function _prep_query($sql)
+	{
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Begin Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_begin($test_mode = FALSE)
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+		
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		// Reset the transaction failure flag.
+		// If the $test_mode flag is set to TRUE transactions will be rolled back
+		// even if the queries produce a successful result.
+		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+
+		$this->simple_query('BEGIN TRAN');
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Commit Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_commit()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		$this->simple_query('COMMIT TRAN');
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rollback Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_rollback()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		$this->simple_query('ROLLBACK TRAN');
+		return TRUE;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape String
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function escape_str($str)	
+	{
+		// Access the CI object
+		$CI =& get_instance();
+		
+		// Escape single quotes
+		return str_replace("'", "''", $CI->input->_remove_invisible_characters($str));
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Affected Rows
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function affected_rows()
+	{
+		return @mssql_rows_affected($this->conn_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	* Insert ID
+	*
+	* Returns the last id created in the Identity column.
+	*
+	* @access public
+	* @return integer
+	*/
+	function insert_id()
+	{
+		$ver = self::_parse_major_version($this->version());
+		$sql = ($ver >= 8 ? "SELECT SCOPE_IDENTITY() AS last_id" : "SELECT @@IDENTITY AS last_id");
+		$query = $this->query($sql);
+		$row = $query->row();
+		return $row->last_id;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	* Parse major version
+	*
+	* Grabs the major version number from the 
+	* database server version string passed in.
+	*
+	* @access private
+	* @param string $version
+	* @return int16 major version number
+	*/
+	function _parse_major_version($version)
+	{
+		preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info);
+		return $ver_info[1]; // return the major version b/c that's all we're interested in.
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	* Version number query string
+	*
+	* @access public
+	* @return string
+	*/
+	function _version()
+	{
+		return "SELECT @@VERSION AS ver";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * "Count All" query
+	 *
+	 * Generates a platform-specific query string that counts all records in
+	 * the specified database
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function count_all($table = '')
+	{
+		if ($table == '')
+			return '0';
+	
+		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+
+		if ($query->num_rows() == 0)
+			return '0';
+
+		$row = $query->row();
+		return $row->numrows;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * List table query
+	 *
+	 * Generates a platform-specific query string so that the table names can be fetched
+	 *
+	 * @access	private
+	 * @param	boolean
+	 * @return	string
+	 */
+	function _list_tables($prefix_limit = FALSE)
+	{
+		$sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name";
+		
+		// for future compatibility
+		if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+		{
+			//$sql .= " LIKE '".$this->dbprefix."%'";
+			return FALSE; // not currently supported
+		}
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * List column query
+	 *
+	 * Generates a platform-specific query string so that the column names can be fetched
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	string
+	 */
+	function _list_columns($table = '')
+	{
+		return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$table."'";	
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data query
+	 *
+	 * Generates a platform-specific query so that the column data can be retrieved
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _field_data($table)
+	{
+		return "SELECT TOP 1 * FROM ".$table;	
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message string
+	 *
+	 * @access	private
+	 * @return	string
+	 */
+	function _error_message()
+	{
+		// Are errros even supported in MS SQL?
+		return '';
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message number
+	 *
+	 * @access	private
+	 * @return	integer
+	 */
+	function _error_number()
+	{
+		// Are error numbers supported?
+		return '';
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape the SQL Identifiers
+	 *
+	 * This function escapes column and table names
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	string
+	 */
+	function _escape_identifiers($item)
+	{
+		if ($this->_escape_char == '')
+		{
+			return $item;
+		}
+
+		foreach ($this->_reserved_identifiers as $id)
+		{
+			if (strpos($item, '.'.$id) !== FALSE)
+			{
+				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  
+				
+				// remove duplicates if the user already included the escape
+				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+			}		
+		}
+
+		if (strpos($item, '.') !== FALSE)
+		{
+			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			
+		}
+		else
+		{
+			$str = $this->_escape_char.$item.$this->_escape_char;
+		}
+		
+		// remove duplicates if the user already included the escape
+		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * From Tables
+	 *
+	 * This function implicitly groups FROM tables so there is no confusion
+	 * about operator precedence in harmony with SQL standards
+	 *
+	 * @access	public
+	 * @param	type
+	 * @return	type
+	 */
+	function _from_tables($tables)
+	{
+		if ( ! is_array($tables))
+		{
+			$tables = array($tables);
+		}
+		
+		return implode(', ', $tables);
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Insert statement
+	 *
+	 * Generates a platform-specific insert string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the insert keys
+	 * @param	array	the insert values
+	 * @return	string
+	 */
+	function _insert($table, $keys, $values)
+	{	
+		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Update statement
+	 *
+	 * Generates a platform-specific update string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the update data
+	 * @param	array	the where clause
+	 * @param	array	the orderby clause
+	 * @param	array	the limit clause
+	 * @return	string
+	 */
+	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+	{
+		foreach($values as $key => $val)
+		{
+			$valstr[] = $key." = ".$val;
+		}
+		
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+		
+		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+	
+		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+		$sql .= $orderby.$limit;
+		
+		return $sql;
+	}
+
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Truncate statement
+	 *
+	 * Generates a platform-specific truncate string from the supplied data
+	 * If the database does not support the truncate() command
+	 * This function maps to "DELETE FROM table"
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string
+	 */	
+	function _truncate($table)
+	{
+		return "TRUNCATE ".$table;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete statement
+	 *
+	 * Generates a platform-specific delete string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the where clause
+	 * @param	string	the limit clause
+	 * @return	string
+	 */	
+	function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+	{
+		$conditions = '';
+
+		if (count($where) > 0 OR count($like) > 0)
+		{
+			$conditions = "\nWHERE ";
+			$conditions .= implode("\n", $this->ar_where);
+
+			if (count($where) > 0 && count($like) > 0)
+			{
+				$conditions .= " AND ";
+			}
+			$conditions .= implode("\n", $like);
+		}
+
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+	
+		return "DELETE FROM ".$table.$conditions.$limit;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Limit string
+	 *
+	 * Generates a platform-specific LIMIT clause
+	 *
+	 * @access	public
+	 * @param	string	the sql query string
+	 * @param	integer	the number of rows to limit the query to
+	 * @param	integer	the offset value
+	 * @return	string
+	 */
+	function _limit($sql, $limit, $offset)
+	{
+		$i = $limit + $offset;
+	
+		return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql);		
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Close DB Connection
+	 *
+	 * @access	public
+	 * @param	resource
+	 * @return	void
+	 */
+	function _close($conn_id)
+	{
+		@mssql_close($conn_id);
+	}	
+
+}
+
+
+
+/* End of file mssql_driver.php */
 /* Location: ./system/database/drivers/mssql/mssql_driver.php */
\ No newline at end of file
diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php
index 8665dc0..512fc47 100644
--- a/system/database/drivers/mssql/mssql_forge.php
+++ b/system/database/drivers/mssql/mssql_forge.php
@@ -1,248 +1,248 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * MS SQL Forge Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_mssql_forge extends CI_DB_forge {

-

-	/**

-	 * Create database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database($name)

-	{

-		return "CREATE DATABASE ".$name;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		return "DROP DATABASE ".$name;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop Table

-	 *

-	 * @access	private

-	 * @return	bool

-	 */

-	function _drop_table($table)

-	{

-		return "DROP TABLE ".$this->db->_escape_identifiers($table);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Create Table

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @param	array	the fields

-	 * @param	mixed	primary key(s)

-	 * @param	mixed	key(s)

-	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL

-	 * @return	bool

-	 */

-	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)

-	{

-		$sql = 'CREATE TABLE ';

-		

-		if ($if_not_exists === TRUE)

-		{

-			$sql .= 'IF NOT EXISTS ';

-		}

-		

-		$sql .= $this->db->_escape_identifiers($table)." (";

-		$current_field_count = 0;

-

-		foreach ($fields as $field=>$attributes)

-		{

-			// Numeric field names aren't allowed in databases, so if the key is

-			// numeric, we know it was assigned by PHP and the developer manually

-			// entered the field information, so we'll simply add it to the list

-			if (is_numeric($field))

-			{

-				$sql .= "\n\t$attributes";

-			}

-			else

-			{

-				$attributes = array_change_key_case($attributes, CASE_UPPER);

-				

-				$sql .= "\n\t".$this->db->_protect_identifiers($field);

-				

-				$sql .=  ' '.$attributes['TYPE'];

-	

-				if (array_key_exists('CONSTRAINT', $attributes))

-				{

-					$sql .= '('.$attributes['CONSTRAINT'].')';

-				}

-	

-				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)

-				{

-					$sql .= ' UNSIGNED';

-				}

-	

-				if (array_key_exists('DEFAULT', $attributes))

-				{

-					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';

-				}

-	

-				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)

-				{

-					$sql .= ' NULL';

-				}

-				else

-				{

-					$sql .= ' NOT NULL';			

-				}

-	

-				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)

-				{

-					$sql .= ' AUTO_INCREMENT';

-				}

-			}

-			

-			// don't add a comma on the end of the last field

-			if (++$current_field_count < count($fields))

-			{

-				$sql .= ',';

-			}

-		}

-

-		if (count($primary_keys) > 0)

-		{

-			$primary_keys = $this->db->_protect_identifiers($primary_keys);

-			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";

-		}

-		

-		if (is_array($keys) && count($keys) > 0)

-		{

-			foreach ($keys as $key)

-			{

-				if (is_array($key))

-				{

-					$key = $this->db->_protect_identifiers($key);	

-				}

-				else

-				{

-					$key = array($this->db->_protect_identifiers($key));

-				}

-				

-				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";

-			}

-		}

-		

-		$sql .= "\n)";

-

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Alter table query

-	 *

-	 * Generates a platform-specific query so that a table can be altered

-	 * Called by add_column(), drop_column(), and column_alter(),

-	 *

-	 * @access	private

-	 * @param	string	the ALTER type (ADD, DROP, CHANGE)

-	 * @param	string	the column name

-	 * @param	string	the table name

-	 * @param	string	the column definition

-	 * @param	string	the default value

-	 * @param	boolean	should 'NOT NULL' be added

-	 * @param	string	the field after which we should add the new field

-	 * @return	object

-	 */

-	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);

-

-		// DROP has everything it needs now.

-		if ($alter_type == 'DROP')

-		{

-			return $sql;

-		}

-

-		$sql .= " $column_definition";

-

-		if ($default_value != '')

-		{

-			$sql .= " DEFAULT \"$default_value\"";

-		}

-

-		if ($null === NULL)

-		{

-			$sql .= ' NULL';

-		}

-		else

-		{

-			$sql .= ' NOT NULL';

-		}

-

-		if ($after_field != '')

-		{

-			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);

-		}

-		

-		return $sql;

-		

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rename a table

-	 *

-	 * Generates a platform-specific query so that a table can be renamed

-	 *

-	 * @access	private

-	 * @param	string	the old table name

-	 * @param	string	the new table name

-	 * @return	string

-	 */

-	function _rename_table($table_name, $new_table_name)

-	{

-		// I think this syntax will work, but can find little documentation on renaming tables in MSSQL

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);

-		return $sql;

-	}

-

-}

-

-/* End of file mssql_forge.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MS SQL Forge Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mssql_forge extends CI_DB_forge {
+
+	/**
+	 * Create database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database($name)
+	{
+		return "CREATE DATABASE ".$name;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		return "DROP DATABASE ".$name;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop Table
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _drop_table($table)
+	{
+		return "DROP TABLE ".$this->db->_escape_identifiers($table);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Create Table
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @param	array	the fields
+	 * @param	mixed	primary key(s)
+	 * @param	mixed	key(s)
+	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL
+	 * @return	bool
+	 */
+	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+	{
+		$sql = 'CREATE TABLE ';
+		
+		if ($if_not_exists === TRUE)
+		{
+			$sql .= 'IF NOT EXISTS ';
+		}
+		
+		$sql .= $this->db->_escape_identifiers($table)." (";
+		$current_field_count = 0;
+
+		foreach ($fields as $field=>$attributes)
+		{
+			// Numeric field names aren't allowed in databases, so if the key is
+			// numeric, we know it was assigned by PHP and the developer manually
+			// entered the field information, so we'll simply add it to the list
+			if (is_numeric($field))
+			{
+				$sql .= "\n\t$attributes";
+			}
+			else
+			{
+				$attributes = array_change_key_case($attributes, CASE_UPPER);
+				
+				$sql .= "\n\t".$this->db->_protect_identifiers($field);
+				
+				$sql .=  ' '.$attributes['TYPE'];
+	
+				if (array_key_exists('CONSTRAINT', $attributes))
+				{
+					$sql .= '('.$attributes['CONSTRAINT'].')';
+				}
+	
+				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+				{
+					$sql .= ' UNSIGNED';
+				}
+	
+				if (array_key_exists('DEFAULT', $attributes))
+				{
+					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+				}
+	
+				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
+				{
+					$sql .= ' NULL';
+				}
+				else
+				{
+					$sql .= ' NOT NULL';			
+				}
+	
+				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+				{
+					$sql .= ' AUTO_INCREMENT';
+				}
+			}
+			
+			// don't add a comma on the end of the last field
+			if (++$current_field_count < count($fields))
+			{
+				$sql .= ',';
+			}
+		}
+
+		if (count($primary_keys) > 0)
+		{
+			$primary_keys = $this->db->_protect_identifiers($primary_keys);
+			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
+		}
+		
+		if (is_array($keys) && count($keys) > 0)
+		{
+			foreach ($keys as $key)
+			{
+				if (is_array($key))
+				{
+					$key = $this->db->_protect_identifiers($key);	
+				}
+				else
+				{
+					$key = array($this->db->_protect_identifiers($key));
+				}
+				
+				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";
+			}
+		}
+		
+		$sql .= "\n)";
+
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Alter table query
+	 *
+	 * Generates a platform-specific query so that a table can be altered
+	 * Called by add_column(), drop_column(), and column_alter(),
+	 *
+	 * @access	private
+	 * @param	string	the ALTER type (ADD, DROP, CHANGE)
+	 * @param	string	the column name
+	 * @param	string	the table name
+	 * @param	string	the column definition
+	 * @param	string	the default value
+	 * @param	boolean	should 'NOT NULL' be added
+	 * @param	string	the field after which we should add the new field
+	 * @return	object
+	 */
+	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
+
+		// DROP has everything it needs now.
+		if ($alter_type == 'DROP')
+		{
+			return $sql;
+		}
+
+		$sql .= " $column_definition";
+
+		if ($default_value != '')
+		{
+			$sql .= " DEFAULT \"$default_value\"";
+		}
+
+		if ($null === NULL)
+		{
+			$sql .= ' NULL';
+		}
+		else
+		{
+			$sql .= ' NOT NULL';
+		}
+
+		if ($after_field != '')
+		{
+			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+		}
+		
+		return $sql;
+		
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rename a table
+	 *
+	 * Generates a platform-specific query so that a table can be renamed
+	 *
+	 * @access	private
+	 * @param	string	the old table name
+	 * @param	string	the new table name
+	 * @return	string
+	 */
+	function _rename_table($table_name, $new_table_name)
+	{
+		// I think this syntax will work, but can find little documentation on renaming tables in MSSQL
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+		return $sql;
+	}
+
+}
+
+/* End of file mssql_forge.php */
 /* Location: ./system/database/drivers/mssql/mssql_forge.php */
\ No newline at end of file
diff --git a/system/database/drivers/mssql/mssql_result.php b/system/database/drivers/mssql/mssql_result.php
index 33fdda9..e9679cb 100644
--- a/system/database/drivers/mssql/mssql_result.php
+++ b/system/database/drivers/mssql/mssql_result.php
@@ -1,169 +1,169 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * MS SQL Result Class

- *

- * This class extends the parent result class: CI_DB_result

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_mssql_result extends CI_DB_result {

-	

-	/**

-	 * Number of rows in the result set

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function num_rows()

-	{

-		return @mssql_num_rows($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Number of fields in the result set

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function num_fields()

-	{

-		return @mssql_num_fields($this->result_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Fetch Field Names

-	 *

-	 * Generates an array of column names

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function list_fields()

-	{

-		$field_names = array();

-		while ($field = mssql_fetch_field($this->result_id))

-		{

-			$field_names[] = $field->name;

-		}

-		

-		return $field_names;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data

-	 *

-	 * Generates an array of objects containing field meta-data

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function field_data()

-	{

-		$retval = array();

-		while ($field = mssql_fetch_field($this->result_id))

-		{	

-			$F 				= new stdClass();

-			$F->name 		= $field->name;

-			$F->type 		= $field->type;

-			$F->max_length	= $field->max_length;

-			$F->primary_key = 0;

-			$F->default		= '';

-			

-			$retval[] = $F;

-		}

-		

-		return $retval;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Free the result

-	 *

-	 * @return	null

-	 */		

-	function free_result()

-	{

-		if (is_resource($this->result_id))

-		{

-			mssql_free_result($this->result_id);

-			$this->result_id = FALSE;

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Data Seek

-	 *

-	 * Moves the internal pointer to the desired offset.  We call

-	 * this internally before fetching results to make sure the

-	 * result set starts at zero

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _data_seek($n = 0)

-	{

-		return mssql_data_seek($this->result_id, $n);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - associative array

-	 *

-	 * Returns the result set as an array

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _fetch_assoc()

-	{

-		return mssql_fetch_assoc($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - object

-	 *

-	 * Returns the result set as an object

-	 *

-	 * @access	private

-	 * @return	object

-	 */

-	function _fetch_object()

-	{

-		return mssql_fetch_object($this->result_id);

-	}

-

-}

-

-

-/* End of file mssql_result.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MS SQL Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mssql_result extends CI_DB_result {
+	
+	/**
+	 * Number of rows in the result set
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function num_rows()
+	{
+		return @mssql_num_rows($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Number of fields in the result set
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function num_fields()
+	{
+		return @mssql_num_fields($this->result_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Fetch Field Names
+	 *
+	 * Generates an array of column names
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function list_fields()
+	{
+		$field_names = array();
+		while ($field = mssql_fetch_field($this->result_id))
+		{
+			$field_names[] = $field->name;
+		}
+		
+		return $field_names;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data
+	 *
+	 * Generates an array of objects containing field meta-data
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function field_data()
+	{
+		$retval = array();
+		while ($field = mssql_fetch_field($this->result_id))
+		{	
+			$F 				= new stdClass();
+			$F->name 		= $field->name;
+			$F->type 		= $field->type;
+			$F->max_length	= $field->max_length;
+			$F->primary_key = 0;
+			$F->default		= '';
+			
+			$retval[] = $F;
+		}
+		
+		return $retval;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Free the result
+	 *
+	 * @return	null
+	 */		
+	function free_result()
+	{
+		if (is_resource($this->result_id))
+		{
+			mssql_free_result($this->result_id);
+			$this->result_id = FALSE;
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Data Seek
+	 *
+	 * Moves the internal pointer to the desired offset.  We call
+	 * this internally before fetching results to make sure the
+	 * result set starts at zero
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _data_seek($n = 0)
+	{
+		return mssql_data_seek($this->result_id, $n);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - associative array
+	 *
+	 * Returns the result set as an array
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _fetch_assoc()
+	{
+		return mssql_fetch_assoc($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - object
+	 *
+	 * Returns the result set as an object
+	 *
+	 * @access	private
+	 * @return	object
+	 */
+	function _fetch_object()
+	{
+		return mssql_fetch_object($this->result_id);
+	}
+
+}
+
+
+/* End of file mssql_result.php */
 /* Location: ./system/database/drivers/mssql/mssql_result.php */
\ No newline at end of file
diff --git a/system/database/drivers/mssql/mssql_utility.php b/system/database/drivers/mssql/mssql_utility.php
index 1736fba..38118ac 100644
--- a/system/database/drivers/mssql/mssql_utility.php
+++ b/system/database/drivers/mssql/mssql_utility.php
@@ -1,123 +1,123 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * MS SQL Utility Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_mssql_utility extends CI_DB_utility {

-

-	/**

-	 * List databases

-	 *

-	 * @access	private

-	 * @return	bool

-	 */

-	function _list_databases()

-	{

-		return "EXEC sp_helpdb"; // Can also be: EXEC sp_databases

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Optimize table query

-	 *

-	 * Generates a platform-specific query so that a table can be optimized

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _optimize_table($table)

-	{

-		return FALSE; // Is this supported in MS SQL?

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Repair table query

-	 *

-	 * Generates a platform-specific query so that a table can be repaired

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _repair_table($table)

-	{

-		return FALSE; // Is this supported in MS SQL?

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * MSSQL Export

-	 *

-	 * @access	private

-	 * @param	array	Preferences

-	 * @return	mixed

-	 */

-	function _backup($params = array())

-	{

-		// Currently unsupported

-		return $this->db->display_error('db_unsuported_feature');

-	}

-

-	/**

-	 *

-	 * The functions below have been deprecated as of 1.6, and are only here for backwards

-	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation

-	 * is STRONGLY discouraged in favour if using dbforge.

-	 *

-	 */

-

-	/**

-	 * Create database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database($name)

-	{

-		return "CREATE DATABASE ".$name;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		return "DROP DATABASE ".$name;

-	}

-

-}

-

-

-/* End of file mssql_utility.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MS SQL Utility Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mssql_utility extends CI_DB_utility {
+
+	/**
+	 * List databases
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _list_databases()
+	{
+		return "EXEC sp_helpdb"; // Can also be: EXEC sp_databases
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Optimize table query
+	 *
+	 * Generates a platform-specific query so that a table can be optimized
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _optimize_table($table)
+	{
+		return FALSE; // Is this supported in MS SQL?
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Repair table query
+	 *
+	 * Generates a platform-specific query so that a table can be repaired
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _repair_table($table)
+	{
+		return FALSE; // Is this supported in MS SQL?
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * MSSQL Export
+	 *
+	 * @access	private
+	 * @param	array	Preferences
+	 * @return	mixed
+	 */
+	function _backup($params = array())
+	{
+		// Currently unsupported
+		return $this->db->display_error('db_unsuported_feature');
+	}
+
+	/**
+	 *
+	 * The functions below have been deprecated as of 1.6, and are only here for backwards
+	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation
+	 * is STRONGLY discouraged in favour if using dbforge.
+	 *
+	 */
+
+	/**
+	 * Create database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database($name)
+	{
+		return "CREATE DATABASE ".$name;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		return "DROP DATABASE ".$name;
+	}
+
+}
+
+
+/* End of file mssql_utility.php */
 /* Location: ./system/database/drivers/mssql/mssql_utility.php */
\ No newline at end of file
diff --git a/system/database/drivers/mysql/index.html b/system/database/drivers/mysql/index.html
index 065d2da..c942a79 100644
--- a/system/database/drivers/mysql/index.html
+++ b/system/database/drivers/mysql/index.html
@@ -1,10 +1,10 @@
-<html>

-<head>

-	<title>403 Forbidden</title>

-</head>

-<body>

-

-<p>Directory access is forbidden.</p>

-

-</body>

+<html>
+<head>
+	<title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
 </html>
\ No newline at end of file
diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php
index 45bf771..943b3c0 100644
--- a/system/database/drivers/mysql/mysql_driver.php
+++ b/system/database/drivers/mysql/mysql_driver.php
@@ -1,634 +1,634 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * MySQL Database Adapter Class

- *

- * Note: _DB is an extender class that the app controller

- * creates dynamically based on whether the active record

- * class is being used or not.

- *

- * @package		CodeIgniter

- * @subpackage	Drivers

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_mysql_driver extends CI_DB {

-

-	var $dbdriver = 'mysql';

-

-	// The character used for escaping

-	var	$_escape_char = '`';

-	

-	/**

-	 * Whether to use the MySQL "delete hack" which allows the number

-	 * of affected rows to be shown. Uses a preg_replace when enabled,

-	 * adding a bit more processing to all queries.

-	 */	

-	var $delete_hack = TRUE;

-	

-	/**

-	 * The syntax to count rows is slightly different across different

-	 * database engines, so this string appears in each driver and is

-	 * used for the count_all() and count_all_results() functions.

-	 */

-	var $_count_string = 'SELECT COUNT(*) AS ';

-	var $_random_keyword = ' RAND()'; // database specific random keyword

-

-	/**

-	 * Non-persistent database connection

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_connect()

-	{

-		if ($this->port != '')

-		{

-			$this->hostname .= ':'.$this->port;

-		}

-		

-		return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Persistent database connection

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_pconnect()

-	{

-		if ($this->port != '')

-		{

-			$this->hostname .= ':'.$this->port;

-		}

-

-		return @mysql_pconnect($this->hostname, $this->username, $this->password);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Select the database

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_select()

-	{

-		return @mysql_select_db($this->database, $this->conn_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Set client character set

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @return	resource

-	 */

-	function db_set_charset($charset, $collation)

-	{

-		return @mysql_query("SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'", $this->conn_id);

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Version number query string

-	 *

-	 * @access	public

-	 * @return	string

-	 */

-	function _version()

-	{

-		return "SELECT version() AS ver";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Execute the query

-	 *

-	 * @access	private called by the base class

-	 * @param	string	an SQL query

-	 * @return	resource

-	 */	

-	function _execute($sql)

-	{

-		$sql = $this->_prep_query($sql);

-		return @mysql_query($sql, $this->conn_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Prep the query

-	 *

-	 * If needed, each database adapter can prep the query string

-	 *

-	 * @access	private called by execute()

-	 * @param	string	an SQL query

-	 * @return	string

-	 */	

-	function _prep_query($sql)

-	{

-		// "DELETE FROM TABLE" returns 0 affected rows This hack modifies

-		// the query so that it returns the number of affected rows

-		if ($this->delete_hack === TRUE)

-		{

-			if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))

-			{

-				$sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);

-			}

-		}

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Begin Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_begin($test_mode = FALSE)

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-		

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		// Reset the transaction failure flag.

-		// If the $test_mode flag is set to TRUE transactions will be rolled back

-		// even if the queries produce a successful result.

-		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;

-		

-		$this->simple_query('SET AUTOCOMMIT=0');

-		$this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Commit Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_commit()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		$this->simple_query('COMMIT');

-		$this->simple_query('SET AUTOCOMMIT=1');

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rollback Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_rollback()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		$this->simple_query('ROLLBACK');

-		$this->simple_query('SET AUTOCOMMIT=1');

-		return TRUE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape String

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function escape_str($str)	

-	{	

-		if (is_array($str))

-		{

-			foreach($str as $key => $val)

-	   		{

-				$str[$key] = $this->escape_str($val);

-	   		}

-   		

-	   		return $str;

-	   	}

-

-		if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))

-		{

-			return mysql_real_escape_string($str, $this->conn_id);

-		}

-		elseif (function_exists('mysql_escape_string'))

-		{

-			return mysql_escape_string($str);

-		}

-		else

-		{

-			return addslashes($str);

-		}

-	}

-		

-	// --------------------------------------------------------------------

-

-	/**

-	 * Affected Rows

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function affected_rows()

-	{

-		return @mysql_affected_rows($this->conn_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Insert ID

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function insert_id()

-	{

-		return @mysql_insert_id($this->conn_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * "Count All" query

-	 *

-	 * Generates a platform-specific query string that counts all records in

-	 * the specified database

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function count_all($table = '')

-	{

-		if ($table == '')

-			return '0';

-	

-		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));

-		

-		if ($query->num_rows() == 0)

-			return '0';

-

-		$row = $query->row();

-		return (int)$row->numrows;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * List table query

-	 *

-	 * Generates a platform-specific query string so that the table names can be fetched

-	 *

-	 * @access	private

-	 * @param	boolean

-	 * @return	string

-	 */

-	function _list_tables($prefix_limit = FALSE)

-	{

-		$sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char;	

-

-		if ($prefix_limit !== FALSE AND $this->dbprefix != '')

-		{

-			$sql .= " LIKE '".$this->dbprefix."%'";

-		}

-

-		return $sql;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Show column query

-	 *

-	 * Generates a platform-specific query string so that the column names can be fetched

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string

-	 */

-	function _list_columns($table = '')

-	{

-		return "SHOW COLUMNS FROM ".$table;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data query

-	 *

-	 * Generates a platform-specific query so that the column data can be retrieved

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _field_data($table)

-	{

-		return "SELECT * FROM ".$table." LIMIT 1";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message string

-	 *

-	 * @access	private

-	 * @return	string

-	 */

-	function _error_message()

-	{

-		return mysql_error($this->conn_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message number

-	 *

-	 * @access	private

-	 * @return	integer

-	 */

-	function _error_number()

-	{

-		return mysql_errno($this->conn_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape the SQL Identifiers

-	 *

-	 * This function escapes column and table names

-	 *

-	 * @access	private

-	 * @param	string

-	 * @return	string

-	 */

-	function _escape_identifiers($item)

-	{

-		if ($this->_escape_char == '')

-		{

-			return $item;

-		}

-

-		foreach ($this->_reserved_identifiers as $id)

-		{

-			if (strpos($item, '.'.$id) !== FALSE)

-			{

-				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  

-				

-				// remove duplicates if the user already included the escape

-				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-			}		

-		}

-		

-		if (strpos($item, '.') !== FALSE)

-		{

-			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			

-		}

-		else

-		{

-			$str = $this->_escape_char.$item.$this->_escape_char;

-		}

-	

-		// remove duplicates if the user already included the escape

-		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-	}

-			

-	// --------------------------------------------------------------------

-

-	/**

-	 * From Tables

-	 *

-	 * This function implicitly groups FROM tables so there is no confusion

-	 * about operator precedence in harmony with SQL standards

-	 *

-	 * @access	public

-	 * @param	type

-	 * @return	type

-	 */

-	function _from_tables($tables)

-	{

-		if ( ! is_array($tables))

-		{

-			$tables = array($tables);

-		}

-		

-		return '('.implode(', ', $tables).')';

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Insert statement

-	 *

-	 * Generates a platform-specific insert string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the insert keys

-	 * @param	array	the insert values

-	 * @return	string

-	 */

-	function _insert($table, $keys, $values)

-	{	

-		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Update statement

-	 *

-	 * Generates a platform-specific update string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the update data

-	 * @param	array	the where clause

-	 * @param	array	the orderby clause

-	 * @param	array	the limit clause

-	 * @return	string

-	 */

-	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)

-	{

-		foreach($values as $key => $val)

-		{

-			$valstr[] = $key." = ".$val;

-		}

-		

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-		

-		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';

-	

-		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);

-

-		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';

-

-		$sql .= $orderby.$limit;

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Truncate statement

-	 *

-	 * Generates a platform-specific truncate string from the supplied data

-	 * If the database does not support the truncate() command

-	 * This function maps to "DELETE FROM table"

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string

-	 */	

-	function _truncate($table)

-	{

-		return "TRUNCATE ".$table;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete statement

-	 *

-	 * Generates a platform-specific delete string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the where clause

-	 * @param	string	the limit clause

-	 * @return	string

-	 */	

-	function _delete($table, $where = array(), $like = array(), $limit = FALSE)

-	{

-		$conditions = '';

-

-		if (count($where) > 0 OR count($like) > 0)

-		{

-			$conditions = "\nWHERE ";

-			$conditions .= implode("\n", $this->ar_where);

-

-			if (count($where) > 0 && count($like) > 0)

-			{

-				$conditions .= " AND ";

-			}

-			$conditions .= implode("\n", $like);

-		}

-

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-	

-		return "DELETE FROM ".$table.$conditions.$limit;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Limit string

-	 *

-	 * Generates a platform-specific LIMIT clause

-	 *

-	 * @access	public

-	 * @param	string	the sql query string

-	 * @param	integer	the number of rows to limit the query to

-	 * @param	integer	the offset value

-	 * @return	string

-	 */

-	function _limit($sql, $limit, $offset)

-	{	

-		if ($offset == 0)

-		{

-			$offset = '';

-		}

-		else

-		{

-			$offset .= ", ";

-		}

-		

-		return $sql."LIMIT ".$offset.$limit;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Close DB Connection

-	 *

-	 * @access	public

-	 * @param	resource

-	 * @return	void

-	 */

-	function _close($conn_id)

-	{

-		@mysql_close($conn_id);

-	}

-	

-}

-

-

-/* End of file mysql_driver.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQL Database Adapter Class
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package		CodeIgniter
+ * @subpackage	Drivers
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysql_driver extends CI_DB {
+
+	var $dbdriver = 'mysql';
+
+	// The character used for escaping
+	var	$_escape_char = '`';
+	
+	/**
+	 * Whether to use the MySQL "delete hack" which allows the number
+	 * of affected rows to be shown. Uses a preg_replace when enabled,
+	 * adding a bit more processing to all queries.
+	 */	
+	var $delete_hack = TRUE;
+	
+	/**
+	 * The syntax to count rows is slightly different across different
+	 * database engines, so this string appears in each driver and is
+	 * used for the count_all() and count_all_results() functions.
+	 */
+	var $_count_string = 'SELECT COUNT(*) AS ';
+	var $_random_keyword = ' RAND()'; // database specific random keyword
+
+	/**
+	 * Non-persistent database connection
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_connect()
+	{
+		if ($this->port != '')
+		{
+			$this->hostname .= ':'.$this->port;
+		}
+		
+		return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Persistent database connection
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_pconnect()
+	{
+		if ($this->port != '')
+		{
+			$this->hostname .= ':'.$this->port;
+		}
+
+		return @mysql_pconnect($this->hostname, $this->username, $this->password);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Select the database
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_select()
+	{
+		return @mysql_select_db($this->database, $this->conn_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set client character set
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @return	resource
+	 */
+	function db_set_charset($charset, $collation)
+	{
+		return @mysql_query("SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'", $this->conn_id);
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Version number query string
+	 *
+	 * @access	public
+	 * @return	string
+	 */
+	function _version()
+	{
+		return "SELECT version() AS ver";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Execute the query
+	 *
+	 * @access	private called by the base class
+	 * @param	string	an SQL query
+	 * @return	resource
+	 */	
+	function _execute($sql)
+	{
+		$sql = $this->_prep_query($sql);
+		return @mysql_query($sql, $this->conn_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Prep the query
+	 *
+	 * If needed, each database adapter can prep the query string
+	 *
+	 * @access	private called by execute()
+	 * @param	string	an SQL query
+	 * @return	string
+	 */	
+	function _prep_query($sql)
+	{
+		// "DELETE FROM TABLE" returns 0 affected rows This hack modifies
+		// the query so that it returns the number of affected rows
+		if ($this->delete_hack === TRUE)
+		{
+			if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
+			{
+				$sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);
+			}
+		}
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Begin Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_begin($test_mode = FALSE)
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+		
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		// Reset the transaction failure flag.
+		// If the $test_mode flag is set to TRUE transactions will be rolled back
+		// even if the queries produce a successful result.
+		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+		
+		$this->simple_query('SET AUTOCOMMIT=0');
+		$this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Commit Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_commit()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		$this->simple_query('COMMIT');
+		$this->simple_query('SET AUTOCOMMIT=1');
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rollback Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_rollback()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		$this->simple_query('ROLLBACK');
+		$this->simple_query('SET AUTOCOMMIT=1');
+		return TRUE;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape String
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function escape_str($str)	
+	{	
+		if (is_array($str))
+		{
+			foreach($str as $key => $val)
+	   		{
+				$str[$key] = $this->escape_str($val);
+	   		}
+   		
+	   		return $str;
+	   	}
+
+		if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))
+		{
+			return mysql_real_escape_string($str, $this->conn_id);
+		}
+		elseif (function_exists('mysql_escape_string'))
+		{
+			return mysql_escape_string($str);
+		}
+		else
+		{
+			return addslashes($str);
+		}
+	}
+		
+	// --------------------------------------------------------------------
+
+	/**
+	 * Affected Rows
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function affected_rows()
+	{
+		return @mysql_affected_rows($this->conn_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Insert ID
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function insert_id()
+	{
+		return @mysql_insert_id($this->conn_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * "Count All" query
+	 *
+	 * Generates a platform-specific query string that counts all records in
+	 * the specified database
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function count_all($table = '')
+	{
+		if ($table == '')
+			return '0';
+	
+		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+		
+		if ($query->num_rows() == 0)
+			return '0';
+
+		$row = $query->row();
+		return (int)$row->numrows;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * List table query
+	 *
+	 * Generates a platform-specific query string so that the table names can be fetched
+	 *
+	 * @access	private
+	 * @param	boolean
+	 * @return	string
+	 */
+	function _list_tables($prefix_limit = FALSE)
+	{
+		$sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char;	
+
+		if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+		{
+			$sql .= " LIKE '".$this->dbprefix."%'";
+		}
+
+		return $sql;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Show column query
+	 *
+	 * Generates a platform-specific query string so that the column names can be fetched
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string
+	 */
+	function _list_columns($table = '')
+	{
+		return "SHOW COLUMNS FROM ".$table;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data query
+	 *
+	 * Generates a platform-specific query so that the column data can be retrieved
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _field_data($table)
+	{
+		return "SELECT * FROM ".$table." LIMIT 1";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message string
+	 *
+	 * @access	private
+	 * @return	string
+	 */
+	function _error_message()
+	{
+		return mysql_error($this->conn_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message number
+	 *
+	 * @access	private
+	 * @return	integer
+	 */
+	function _error_number()
+	{
+		return mysql_errno($this->conn_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape the SQL Identifiers
+	 *
+	 * This function escapes column and table names
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	string
+	 */
+	function _escape_identifiers($item)
+	{
+		if ($this->_escape_char == '')
+		{
+			return $item;
+		}
+
+		foreach ($this->_reserved_identifiers as $id)
+		{
+			if (strpos($item, '.'.$id) !== FALSE)
+			{
+				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  
+				
+				// remove duplicates if the user already included the escape
+				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+			}		
+		}
+		
+		if (strpos($item, '.') !== FALSE)
+		{
+			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			
+		}
+		else
+		{
+			$str = $this->_escape_char.$item.$this->_escape_char;
+		}
+	
+		// remove duplicates if the user already included the escape
+		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+	}
+			
+	// --------------------------------------------------------------------
+
+	/**
+	 * From Tables
+	 *
+	 * This function implicitly groups FROM tables so there is no confusion
+	 * about operator precedence in harmony with SQL standards
+	 *
+	 * @access	public
+	 * @param	type
+	 * @return	type
+	 */
+	function _from_tables($tables)
+	{
+		if ( ! is_array($tables))
+		{
+			$tables = array($tables);
+		}
+		
+		return '('.implode(', ', $tables).')';
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Insert statement
+	 *
+	 * Generates a platform-specific insert string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the insert keys
+	 * @param	array	the insert values
+	 * @return	string
+	 */
+	function _insert($table, $keys, $values)
+	{	
+		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Update statement
+	 *
+	 * Generates a platform-specific update string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the update data
+	 * @param	array	the where clause
+	 * @param	array	the orderby clause
+	 * @param	array	the limit clause
+	 * @return	string
+	 */
+	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+	{
+		foreach($values as $key => $val)
+		{
+			$valstr[] = $key." = ".$val;
+		}
+		
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+		
+		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+	
+		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+		$sql .= $orderby.$limit;
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Truncate statement
+	 *
+	 * Generates a platform-specific truncate string from the supplied data
+	 * If the database does not support the truncate() command
+	 * This function maps to "DELETE FROM table"
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string
+	 */	
+	function _truncate($table)
+	{
+		return "TRUNCATE ".$table;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete statement
+	 *
+	 * Generates a platform-specific delete string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the where clause
+	 * @param	string	the limit clause
+	 * @return	string
+	 */	
+	function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+	{
+		$conditions = '';
+
+		if (count($where) > 0 OR count($like) > 0)
+		{
+			$conditions = "\nWHERE ";
+			$conditions .= implode("\n", $this->ar_where);
+
+			if (count($where) > 0 && count($like) > 0)
+			{
+				$conditions .= " AND ";
+			}
+			$conditions .= implode("\n", $like);
+		}
+
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+	
+		return "DELETE FROM ".$table.$conditions.$limit;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Limit string
+	 *
+	 * Generates a platform-specific LIMIT clause
+	 *
+	 * @access	public
+	 * @param	string	the sql query string
+	 * @param	integer	the number of rows to limit the query to
+	 * @param	integer	the offset value
+	 * @return	string
+	 */
+	function _limit($sql, $limit, $offset)
+	{	
+		if ($offset == 0)
+		{
+			$offset = '';
+		}
+		else
+		{
+			$offset .= ", ";
+		}
+		
+		return $sql."LIMIT ".$offset.$limit;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Close DB Connection
+	 *
+	 * @access	public
+	 * @param	resource
+	 * @return	void
+	 */
+	function _close($conn_id)
+	{
+		@mysql_close($conn_id);
+	}
+	
+}
+
+
+/* End of file mysql_driver.php */
 /* Location: ./system/database/drivers/mysql/mysql_driver.php */
\ No newline at end of file
diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php
index 28a77b3..d8cb77e 100644
--- a/system/database/drivers/mysql/mysql_forge.php
+++ b/system/database/drivers/mysql/mysql_forge.php
@@ -1,254 +1,254 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * MySQL Forge Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_mysql_forge extends CI_DB_forge {

-	

-	/**

-	 * Create database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database($name)

-	{

-		return "CREATE DATABASE ".$name;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		return "DROP DATABASE ".$name;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Process Fields

-	 *

-	 * @access	private

-	 * @param	mixed	the fields

-	 * @return	string

-	 */

-	function _process_fields($fields)

-	{

-		$current_field_count = 0;

-		$sql = '';

-

-		foreach ($fields as $field=>$attributes)

-		{

-			// Numeric field names aren't allowed in databases, so if the key is

-			// numeric, we know it was assigned by PHP and the developer manually

-			// entered the field information, so we'll simply add it to the list

-			if (is_numeric($field))

-			{

-				$sql .= "\n\t$attributes";

-			}

-			else

-			{

-				$attributes = array_change_key_case($attributes, CASE_UPPER);

-				

-				$sql .= "\n\t".$this->db->_protect_identifiers($field);

-

-				if (array_key_exists('NAME', $attributes))

-				{

-					$sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';

-				}

-				

-				if (array_key_exists('TYPE', $attributes))

-				{

-					$sql .=  ' '.$attributes['TYPE'];

-				}

-	

-				if (array_key_exists('CONSTRAINT', $attributes))

-				{

-					$sql .= '('.$attributes['CONSTRAINT'].')';

-				}

-	

-				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)

-				{

-					$sql .= ' UNSIGNED';

-				}

-	

-				if (array_key_exists('DEFAULT', $attributes))

-				{

-					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';

-				}

-	

-				if (array_key_exists('NULL', $attributes))

-				{

-					$sql .= ($attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL';

-				}

-	

-				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)

-				{

-					$sql .= ' AUTO_INCREMENT';

-				}

-			}

-			

-			// don't add a comma on the end of the last field

-			if (++$current_field_count < count($fields))

-			{

-				$sql .= ',';

-			}

-		}

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Create Table

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @param	mixed	the fields

-	 * @param	mixed	primary key(s)

-	 * @param	mixed	key(s)

-	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL

-	 * @return	bool

-	 */

-	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)

-	{

-		$sql = 'CREATE TABLE ';

-		

-		if ($if_not_exists === TRUE)

-		{

-			$sql .= 'IF NOT EXISTS ';

-		}

-		

-		$sql .= $this->db->_escape_identifiers($table)." (";

-

-		$sql .= $this->_process_fields($fields);

-

-		if (count($primary_keys) > 0)

-		{

-			$key_name = $this->db->_protect_identifiers(implode('_', $primary_keys));

-			$primary_keys = $this->db->_protect_identifiers($primary_keys);

-			$sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")";

-		}

-

-		if (is_array($keys) && count($keys) > 0)

-		{

-			foreach ($keys as $key)

-			{

-				if (is_array($key))

-				{

-					$key_name = $this->db->_protect_identifiers(implode('_', $key));

-					$key = $this->db->_protect_identifiers($key);	

-				}

-				else

-				{

-					$key_name = $this->db->_protect_identifiers($key);

-					$key = array($key_name);

-				}

-				

-				$sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";

-			}

-		}

-

-		$sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";

-

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop Table

-	 *

-	 * @access	private

-	 * @return	string

-	 */

-	function _drop_table($table)

-	{

-		return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Alter table query

-	 *

-	 * Generates a platform-specific query so that a table can be altered

-	 * Called by add_column(), drop_column(), and column_alter(),

-	 *

-	 * @access	private

-	 * @param	string	the ALTER type (ADD, DROP, CHANGE)

-	 * @param	string	the column name

-	 * @param	array	fields

-	 * @param	string	the field after which we should add the new field

-	 * @return	object

-	 */

-	function _alter_table($alter_type, $table, $fields, $after_field = '')

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";

-

-		// DROP has everything it needs now.

-		if ($alter_type == 'DROP')

-		{

-			return $sql.$this->db->_protect_identifiers($fields);

-		}

-

-		$sql .= $this->_process_fields($fields);

-

-		if ($after_field != '')

-		{

-			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);

-		}

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rename a table

-	 *

-	 * Generates a platform-specific query so that a table can be renamed

-	 *

-	 * @access	private

-	 * @param	string	the old table name

-	 * @param	string	the new table name

-	 * @return	string

-	 */

-	function _rename_table($table_name, $new_table_name)

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);

-		return $sql;

-	}

-

-}

-

-/* End of file mysql_forge.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQL Forge Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysql_forge extends CI_DB_forge {
+	
+	/**
+	 * Create database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database($name)
+	{
+		return "CREATE DATABASE ".$name;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		return "DROP DATABASE ".$name;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Process Fields
+	 *
+	 * @access	private
+	 * @param	mixed	the fields
+	 * @return	string
+	 */
+	function _process_fields($fields)
+	{
+		$current_field_count = 0;
+		$sql = '';
+
+		foreach ($fields as $field=>$attributes)
+		{
+			// Numeric field names aren't allowed in databases, so if the key is
+			// numeric, we know it was assigned by PHP and the developer manually
+			// entered the field information, so we'll simply add it to the list
+			if (is_numeric($field))
+			{
+				$sql .= "\n\t$attributes";
+			}
+			else
+			{
+				$attributes = array_change_key_case($attributes, CASE_UPPER);
+				
+				$sql .= "\n\t".$this->db->_protect_identifiers($field);
+
+				if (array_key_exists('NAME', $attributes))
+				{
+					$sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';
+				}
+				
+				if (array_key_exists('TYPE', $attributes))
+				{
+					$sql .=  ' '.$attributes['TYPE'];
+				}
+	
+				if (array_key_exists('CONSTRAINT', $attributes))
+				{
+					$sql .= '('.$attributes['CONSTRAINT'].')';
+				}
+	
+				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+				{
+					$sql .= ' UNSIGNED';
+				}
+	
+				if (array_key_exists('DEFAULT', $attributes))
+				{
+					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+				}
+	
+				if (array_key_exists('NULL', $attributes))
+				{
+					$sql .= ($attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL';
+				}
+	
+				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+				{
+					$sql .= ' AUTO_INCREMENT';
+				}
+			}
+			
+			// don't add a comma on the end of the last field
+			if (++$current_field_count < count($fields))
+			{
+				$sql .= ',';
+			}
+		}
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Create Table
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @param	mixed	the fields
+	 * @param	mixed	primary key(s)
+	 * @param	mixed	key(s)
+	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL
+	 * @return	bool
+	 */
+	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+	{
+		$sql = 'CREATE TABLE ';
+		
+		if ($if_not_exists === TRUE)
+		{
+			$sql .= 'IF NOT EXISTS ';
+		}
+		
+		$sql .= $this->db->_escape_identifiers($table)." (";
+
+		$sql .= $this->_process_fields($fields);
+
+		if (count($primary_keys) > 0)
+		{
+			$key_name = $this->db->_protect_identifiers(implode('_', $primary_keys));
+			$primary_keys = $this->db->_protect_identifiers($primary_keys);
+			$sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")";
+		}
+
+		if (is_array($keys) && count($keys) > 0)
+		{
+			foreach ($keys as $key)
+			{
+				if (is_array($key))
+				{
+					$key_name = $this->db->_protect_identifiers(implode('_', $key));
+					$key = $this->db->_protect_identifiers($key);	
+				}
+				else
+				{
+					$key_name = $this->db->_protect_identifiers($key);
+					$key = array($key_name);
+				}
+				
+				$sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";
+			}
+		}
+
+		$sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";
+
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop Table
+	 *
+	 * @access	private
+	 * @return	string
+	 */
+	function _drop_table($table)
+	{
+		return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Alter table query
+	 *
+	 * Generates a platform-specific query so that a table can be altered
+	 * Called by add_column(), drop_column(), and column_alter(),
+	 *
+	 * @access	private
+	 * @param	string	the ALTER type (ADD, DROP, CHANGE)
+	 * @param	string	the column name
+	 * @param	array	fields
+	 * @param	string	the field after which we should add the new field
+	 * @return	object
+	 */
+	function _alter_table($alter_type, $table, $fields, $after_field = '')
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";
+
+		// DROP has everything it needs now.
+		if ($alter_type == 'DROP')
+		{
+			return $sql.$this->db->_protect_identifiers($fields);
+		}
+
+		$sql .= $this->_process_fields($fields);
+
+		if ($after_field != '')
+		{
+			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+		}
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rename a table
+	 *
+	 * Generates a platform-specific query so that a table can be renamed
+	 *
+	 * @access	private
+	 * @param	string	the old table name
+	 * @param	string	the new table name
+	 * @return	string
+	 */
+	function _rename_table($table_name, $new_table_name)
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+		return $sql;
+	}
+
+}
+
+/* End of file mysql_forge.php */
 /* Location: ./system/database/drivers/mysql/mysql_forge.php */
\ No newline at end of file
diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php
index a28a198..673aeac 100644
--- a/system/database/drivers/mysql/mysql_result.php
+++ b/system/database/drivers/mysql/mysql_result.php
@@ -1,169 +1,169 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// --------------------------------------------------------------------

-

-/**

- * MySQL Result Class

- *

- * This class extends the parent result class: CI_DB_result

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_mysql_result extends CI_DB_result {

-

-	/**

-	 * Number of rows in the result set

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function num_rows()

-	{

-		return @mysql_num_rows($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Number of fields in the result set

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function num_fields()

-	{

-		return @mysql_num_fields($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Fetch Field Names

-	 *

-	 * Generates an array of column names

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function list_fields()

-	{

-		$field_names = array();

-		while ($field = mysql_fetch_field($this->result_id))

-		{

-			$field_names[] = $field->name;

-		}

-		

-		return $field_names;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data

-	 *

-	 * Generates an array of objects containing field meta-data

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function field_data()

-	{

-		$retval = array();

-		while ($field = mysql_fetch_field($this->result_id))

-		{	

-			$F				= new stdClass();

-			$F->name 		= $field->name;

-			$F->type 		= $field->type;

-			$F->default		= $field->def;

-			$F->max_length	= $field->max_length;

-			$F->primary_key = $field->primary_key;

-			

-			$retval[] = $F;

-		}

-		

-		return $retval;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Free the result

-	 *

-	 * @return	null

-	 */		

-	function free_result()

-	{

-		if (is_resource($this->result_id))

-		{

-			mysql_free_result($this->result_id);

-			$this->result_id = FALSE;

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Data Seek

-	 *

-	 * Moves the internal pointer to the desired offset.  We call

-	 * this internally before fetching results to make sure the

-	 * result set starts at zero

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _data_seek($n = 0)

-	{

-		return mysql_data_seek($this->result_id, $n);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - associative array

-	 *

-	 * Returns the result set as an array

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _fetch_assoc()

-	{

-		return mysql_fetch_assoc($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - object

-	 *

-	 * Returns the result set as an object

-	 *

-	 * @access	private

-	 * @return	object

-	 */

-	function _fetch_object()

-	{

-		return mysql_fetch_object($this->result_id);

-	}

-	

-}

-

-

-/* End of file mysql_result.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// --------------------------------------------------------------------
+
+/**
+ * MySQL Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysql_result extends CI_DB_result {
+
+	/**
+	 * Number of rows in the result set
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function num_rows()
+	{
+		return @mysql_num_rows($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Number of fields in the result set
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function num_fields()
+	{
+		return @mysql_num_fields($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Fetch Field Names
+	 *
+	 * Generates an array of column names
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function list_fields()
+	{
+		$field_names = array();
+		while ($field = mysql_fetch_field($this->result_id))
+		{
+			$field_names[] = $field->name;
+		}
+		
+		return $field_names;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data
+	 *
+	 * Generates an array of objects containing field meta-data
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function field_data()
+	{
+		$retval = array();
+		while ($field = mysql_fetch_field($this->result_id))
+		{	
+			$F				= new stdClass();
+			$F->name 		= $field->name;
+			$F->type 		= $field->type;
+			$F->default		= $field->def;
+			$F->max_length	= $field->max_length;
+			$F->primary_key = $field->primary_key;
+			
+			$retval[] = $F;
+		}
+		
+		return $retval;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Free the result
+	 *
+	 * @return	null
+	 */		
+	function free_result()
+	{
+		if (is_resource($this->result_id))
+		{
+			mysql_free_result($this->result_id);
+			$this->result_id = FALSE;
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Data Seek
+	 *
+	 * Moves the internal pointer to the desired offset.  We call
+	 * this internally before fetching results to make sure the
+	 * result set starts at zero
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _data_seek($n = 0)
+	{
+		return mysql_data_seek($this->result_id, $n);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - associative array
+	 *
+	 * Returns the result set as an array
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _fetch_assoc()
+	{
+		return mysql_fetch_assoc($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - object
+	 *
+	 * Returns the result set as an object
+	 *
+	 * @access	private
+	 * @return	object
+	 */
+	function _fetch_object()
+	{
+		return mysql_fetch_object($this->result_id);
+	}
+	
+}
+
+
+/* End of file mysql_result.php */
 /* Location: ./system/database/drivers/mysql/mysql_result.php */
\ No newline at end of file
diff --git a/system/database/drivers/mysql/mysql_utility.php b/system/database/drivers/mysql/mysql_utility.php
index d2c10db..003b1dd 100644
--- a/system/database/drivers/mysql/mysql_utility.php
+++ b/system/database/drivers/mysql/mysql_utility.php
@@ -1,245 +1,245 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * MySQL Utility Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_mysql_utility extends CI_DB_utility {

-

-	/**

-	 * List databases

-	 *

-	 * @access	private

-	 * @return	bool

-	 */

-	function _list_databases()

-	{

-		return "SHOW DATABASES";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Optimize table query

-	 *

-	 * Generates a platform-specific query so that a table can be optimized

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _optimize_table($table)

-	{

-		return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Repair table query

-	 *

-	 * Generates a platform-specific query so that a table can be repaired

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _repair_table($table)

-	{

-		return "REPAIR TABLE ".$this->db->_escape_identifiers($table);

-	}

-

-	// --------------------------------------------------------------------

-	/**

-	 * MySQL Export

-	 *

-	 * @access	private

-	 * @param	array	Preferences

-	 * @return	mixed

-	 */

-	function _backup($params = array())

-	{

-		if (count($params) == 0)

-		{

-			return FALSE;

-		}

-

-		// Extract the prefs for simplicity

-		extract($params);

-	

-		// Build the output

-		$output = '';

-		foreach ((array)$tables as $table)

-		{

-			// Is the table in the "ignore" list?

-			if (in_array($table, (array)$ignore, TRUE))

-			{

-				continue;

-			}

-

-			// Get the table schema

-			$query = $this->db->query("SHOW CREATE TABLE `".$this->db->database.'`.'.$table);

-			

-			// No result means the table name was invalid

-			if ($query === FALSE)

-			{

-				continue;

-			}

-			

-			// Write out the table schema

-			$output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline;

-

- 			if ($add_drop == TRUE)

- 			{

-				$output .= 'DROP TABLE IF EXISTS '.$table.';'.$newline.$newline;

-			}

-			

-			$i = 0;

-			$result = $query->result_array();

-			foreach ($result[0] as $val)

-			{

-				if ($i++ % 2)

-				{ 					

-					$output .= $val.';'.$newline.$newline;

-				}

-			}

-			

-			// If inserts are not needed we're done...

-			if ($add_insert == FALSE)

-			{

-				continue;

-			}

-

-			// Grab all the data from the current table

-			$query = $this->db->query("SELECT * FROM $table");

-			

-			if ($query->num_rows() == 0)

-			{

-				continue;

-			}

-		

-			// Fetch the field names and determine if the field is an

-			// integer type.  We use this info to decide whether to

-			// surround the data with quotes or not

-			

-			$i = 0;

-			$field_str = '';

-			$is_int = array();

-			while ($field = mysql_fetch_field($query->result_id))

-			{

-				// Most versions of MySQL store timestamp as a string

-				$is_int[$i] = (in_array(

-										strtolower(mysql_field_type($query->result_id, $i)),

-										array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), 

-										TRUE)

-										) ? TRUE : FALSE;

-										

-				// Create a string of field names

-				$field_str .= '`'.$field->name.'`, ';

-				$i++;

-			}

-			

-			// Trim off the end comma

-			$field_str = preg_replace( "/, $/" , "" , $field_str);

-			

-			

-			// Build the insert string

-			foreach ($query->result_array() as $row)

-			{

-				$val_str = '';

-			

-				$i = 0;

-				foreach ($row as $v)

-				{

-					// Is the value NULL?

-					if ($v === NULL)

-					{

-						$val_str .= 'NULL';

-					}

-					else

-					{

-						// Escape the data if it's not an integer

-						if ($is_int[$i] == FALSE)

-						{

-							$val_str .= $this->db->escape($v);

-						}

-						else

-						{

-							$val_str .= $v;

-						}					

-					}					

-					

-					// Append a comma

-					$val_str .= ', ';

-					$i++;

-				}

-				

-				// Remove the comma at the end of the string

-				$val_str = preg_replace( "/, $/" , "" , $val_str);

-								

-				// Build the INSERT string

-				$output .= 'INSERT INTO '.$table.' ('.$field_str.') VALUES ('.$val_str.');'.$newline;

-			}

-			

-			$output .= $newline.$newline;

-		}

-

-		return $output;

-	}

-

-	/**

-	 *

-	 * The functions below have been deprecated as of 1.6, and are only here for backwards

-	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation

-	 * is STRONGLY discouraged in favour if using dbforge.

-	 *

-	 */

-

-	/**

-	 * Create database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database($name)

-	{

-		return "CREATE DATABASE ".$name;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		return "DROP DATABASE ".$name;

-	}

-

-}

-

-/* End of file mysql_utility.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQL Utility Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysql_utility extends CI_DB_utility {
+
+	/**
+	 * List databases
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _list_databases()
+	{
+		return "SHOW DATABASES";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Optimize table query
+	 *
+	 * Generates a platform-specific query so that a table can be optimized
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _optimize_table($table)
+	{
+		return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Repair table query
+	 *
+	 * Generates a platform-specific query so that a table can be repaired
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _repair_table($table)
+	{
+		return "REPAIR TABLE ".$this->db->_escape_identifiers($table);
+	}
+
+	// --------------------------------------------------------------------
+	/**
+	 * MySQL Export
+	 *
+	 * @access	private
+	 * @param	array	Preferences
+	 * @return	mixed
+	 */
+	function _backup($params = array())
+	{
+		if (count($params) == 0)
+		{
+			return FALSE;
+		}
+
+		// Extract the prefs for simplicity
+		extract($params);
+	
+		// Build the output
+		$output = '';
+		foreach ((array)$tables as $table)
+		{
+			// Is the table in the "ignore" list?
+			if (in_array($table, (array)$ignore, TRUE))
+			{
+				continue;
+			}
+
+			// Get the table schema
+			$query = $this->db->query("SHOW CREATE TABLE `".$this->db->database.'`.'.$table);
+			
+			// No result means the table name was invalid
+			if ($query === FALSE)
+			{
+				continue;
+			}
+			
+			// Write out the table schema
+			$output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline;
+
+ 			if ($add_drop == TRUE)
+ 			{
+				$output .= 'DROP TABLE IF EXISTS '.$table.';'.$newline.$newline;
+			}
+			
+			$i = 0;
+			$result = $query->result_array();
+			foreach ($result[0] as $val)
+			{
+				if ($i++ % 2)
+				{ 					
+					$output .= $val.';'.$newline.$newline;
+				}
+			}
+			
+			// If inserts are not needed we're done...
+			if ($add_insert == FALSE)
+			{
+				continue;
+			}
+
+			// Grab all the data from the current table
+			$query = $this->db->query("SELECT * FROM $table");
+			
+			if ($query->num_rows() == 0)
+			{
+				continue;
+			}
+		
+			// Fetch the field names and determine if the field is an
+			// integer type.  We use this info to decide whether to
+			// surround the data with quotes or not
+			
+			$i = 0;
+			$field_str = '';
+			$is_int = array();
+			while ($field = mysql_fetch_field($query->result_id))
+			{
+				// Most versions of MySQL store timestamp as a string
+				$is_int[$i] = (in_array(
+										strtolower(mysql_field_type($query->result_id, $i)),
+										array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), 
+										TRUE)
+										) ? TRUE : FALSE;
+										
+				// Create a string of field names
+				$field_str .= '`'.$field->name.'`, ';
+				$i++;
+			}
+			
+			// Trim off the end comma
+			$field_str = preg_replace( "/, $/" , "" , $field_str);
+			
+			
+			// Build the insert string
+			foreach ($query->result_array() as $row)
+			{
+				$val_str = '';
+			
+				$i = 0;
+				foreach ($row as $v)
+				{
+					// Is the value NULL?
+					if ($v === NULL)
+					{
+						$val_str .= 'NULL';
+					}
+					else
+					{
+						// Escape the data if it's not an integer
+						if ($is_int[$i] == FALSE)
+						{
+							$val_str .= $this->db->escape($v);
+						}
+						else
+						{
+							$val_str .= $v;
+						}					
+					}					
+					
+					// Append a comma
+					$val_str .= ', ';
+					$i++;
+				}
+				
+				// Remove the comma at the end of the string
+				$val_str = preg_replace( "/, $/" , "" , $val_str);
+								
+				// Build the INSERT string
+				$output .= 'INSERT INTO '.$table.' ('.$field_str.') VALUES ('.$val_str.');'.$newline;
+			}
+			
+			$output .= $newline.$newline;
+		}
+
+		return $output;
+	}
+
+	/**
+	 *
+	 * The functions below have been deprecated as of 1.6, and are only here for backwards
+	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation
+	 * is STRONGLY discouraged in favour if using dbforge.
+	 *
+	 */
+
+	/**
+	 * Create database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database($name)
+	{
+		return "CREATE DATABASE ".$name;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		return "DROP DATABASE ".$name;
+	}
+
+}
+
+/* End of file mysql_utility.php */
 /* Location: ./system/database/drivers/mysql/mysql_utility.php */
\ No newline at end of file
diff --git a/system/database/drivers/mysqli/index.html b/system/database/drivers/mysqli/index.html
index 065d2da..c942a79 100644
--- a/system/database/drivers/mysqli/index.html
+++ b/system/database/drivers/mysqli/index.html
@@ -1,10 +1,10 @@
-<html>

-<head>

-	<title>403 Forbidden</title>

-</head>

-<body>

-

-<p>Directory access is forbidden.</p>

-

-</body>

+<html>
+<head>
+	<title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
 </html>
\ No newline at end of file
diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php
index 1b3da7a..ce458f2 100644
--- a/system/database/drivers/mysqli/mysqli_driver.php
+++ b/system/database/drivers/mysqli/mysqli_driver.php
@@ -1,625 +1,625 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * MySQLi Database Adapter Class - MySQLi only works with PHP 5

- *

- * Note: _DB is an extender class that the app controller

- * creates dynamically based on whether the active record

- * class is being used or not.

- *

- * @package		CodeIgniter

- * @subpackage	Drivers

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_mysqli_driver extends CI_DB {

-

-	var $dbdriver = 'mysqli';

-	

-	// The character used for escaping

-	var $_escape_char = '`';

-

-	/**

-	 * The syntax to count rows is slightly different across different

-	 * database engines, so this string appears in each driver and is

-	 * used for the count_all() and count_all_results() functions.

-	 */

-	var $_count_string = "SELECT COUNT(*) AS ";

-	var $_random_keyword = ' RAND()'; // database specific random keyword

-

-	/**

-	 * Whether to use the MySQL "delete hack" which allows the number

-	 * of affected rows to be shown. Uses a preg_replace when enabled,

-	 * adding a bit more processing to all queries.

-	 */	

-	var $delete_hack = TRUE;

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Non-persistent database connection

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_connect()

-	{

-		if ($this->port != '')

-		{

-			return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port);			

-		}

-		else

-		{

-			return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database);

-		}

-

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Persistent database connection

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_pconnect()

-	{

-		return $this->db_connect();

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Select the database

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_select()

-	{

-		return @mysqli_select_db($this->conn_id, $this->database);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Set client character set

-	 *

-	 * @access	private

-	 * @param	string

-	 * @param	string

-	 * @return	resource

-	 */

-	function _db_set_charset($charset, $collation)

-	{

-		return @mysqli_query($this->conn_id, "SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'");

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Version number query string

-	 *

-	 * @access	public

-	 * @return	string

-	 */

-	function _version()

-	{

-		return "SELECT version() AS ver";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Execute the query

-	 *

-	 * @access	private called by the base class

-	 * @param	string	an SQL query

-	 * @return	resource

-	 */	

-	function _execute($sql)

-	{

-		$sql = $this->_prep_query($sql);	

-		$result = @mysqli_query($this->conn_id, $sql);

-		return $result;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Prep the query

-	 *

-	 * If needed, each database adapter can prep the query string

-	 *

-	 * @access	private called by execute()

-	 * @param	string	an SQL query

-	 * @return	string

-	 */	

-	function _prep_query($sql)

-	{

-		// "DELETE FROM TABLE" returns 0 affected rows This hack modifies

-		// the query so that it returns the number of affected rows

-		if ($this->delete_hack === TRUE)

-		{

-			if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))

-			{

-				$sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);

-			}

-		}

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Begin Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_begin($test_mode = FALSE)

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-		

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		// Reset the transaction failure flag.

-		// If the $test_mode flag is set to TRUE transactions will be rolled back

-		// even if the queries produce a successful result.

-		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;

-

-		$this->simple_query('SET AUTOCOMMIT=0');

-		$this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Commit Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_commit()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		$this->simple_query('COMMIT');

-		$this->simple_query('SET AUTOCOMMIT=1');

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rollback Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_rollback()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		$this->simple_query('ROLLBACK');

-		$this->simple_query('SET AUTOCOMMIT=1');

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape String

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function escape_str($str)	

-	{

-		if (function_exists('mysqli_real_escape_string') AND is_object($this->conn_id))

-		{

-			return mysqli_real_escape_string($this->conn_id, $str);

-		}

-		elseif (function_exists('mysql_escape_string'))

-		{

-			return mysql_escape_string($str);

-		}

-		else

-		{

-			return addslashes($str);

-		}

-	}

-		

-	// --------------------------------------------------------------------

-

-	/**

-	 * Affected Rows

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function affected_rows()

-	{

-		return @mysqli_affected_rows($this->conn_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Insert ID

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function insert_id()

-	{

-		return @mysqli_insert_id($this->conn_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * "Count All" query

-	 *

-	 * Generates a platform-specific query string that counts all records in

-	 * the specified database

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function count_all($table = '')

-	{

-		if ($table == '')

-			return '0';

-		

-		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));

-		

-		if ($query->num_rows() == 0)

-			return '0';

-

-		$row = $query->row();

-		return $row->numrows;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * List table query

-	 *

-	 * Generates a platform-specific query string so that the table names can be fetched

-	 *

-	 * @access	private

-	 * @param	boolean

-	 * @return	string

-	 */

-	function _list_tables($prefix_limit = FALSE)

-	{

-		$sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char;	

-		

-		if ($prefix_limit !== FALSE AND $this->dbprefix != '')

-		{

-			$sql .= " LIKE '".$this->dbprefix."%'";

-		}

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Show column query

-	 *

-	 * Generates a platform-specific query string so that the column names can be fetched

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string

-	 */

-	function _list_columns($table = '')

-	{

-		return "SHOW COLUMNS FROM ".$table;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data query

-	 *

-	 * Generates a platform-specific query so that the column data can be retrieved

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _field_data($table)

-	{

-		return "SELECT * FROM ".$table." LIMIT 1";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message string

-	 *

-	 * @access	private

-	 * @return	string

-	 */

-	function _error_message()

-	{

-		return mysqli_error($this->conn_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message number

-	 *

-	 * @access	private

-	 * @return	integer

-	 */

-	function _error_number()

-	{

-		return mysqli_errno($this->conn_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape the SQL Identifiers

-	 *

-	 * This function escapes column and table names

-	 *

-	 * @access	private

-	 * @param	string

-	 * @return	string

-	 */

-	function _escape_identifiers($item)

-	{

-		if ($this->_escape_char == '')

-		{

-			return $item;

-		}

-		

-		foreach ($this->_reserved_identifiers as $id)

-		{

-			if (strpos($item, '.'.$id) !== FALSE)

-			{

-				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  

-				

-				// remove duplicates if the user already included the escape

-				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-			}		

-		}

-		

-		if (strpos($item, '.') !== FALSE)

-		{

-			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			

-		}

-		else

-		{

-			$str = $this->_escape_char.$item.$this->_escape_char;

-		}

-		

-		// remove duplicates if the user already included the escape

-		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-	}

-			

-	// --------------------------------------------------------------------

-

-	/**

-	 * From Tables

-	 *

-	 * This function implicitly groups FROM tables so there is no confusion

-	 * about operator precedence in harmony with SQL standards

-	 *

-	 * @access	public

-	 * @param	type

-	 * @return	type

-	 */

-	function _from_tables($tables)

-	{

-		if ( ! is_array($tables))

-		{

-			$tables = array($tables);

-		}

-		

-		return '('.implode(', ', $tables).')';

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Insert statement

-	 *

-	 * Generates a platform-specific insert string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the insert keys

-	 * @param	array	the insert values

-	 * @return	string

-	 */

-	function _insert($table, $keys, $values)

-	{	

-		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Update statement

-	 *

-	 * Generates a platform-specific update string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the update data

-	 * @param	array	the where clause

-	 * @param	array	the orderby clause

-	 * @param	array	the limit clause

-	 * @return	string

-	 */

-	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)

-	{

-		foreach($values as $key => $val)

-		{

-			$valstr[] = $key." = ".$val;

-		}

-		

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-		

-		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';

-	

-		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);

-		

-		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';

-		

-		$sql .= $orderby.$limit;

-		

-		return $sql;

-	}

-

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Truncate statement

-	 *

-	 * Generates a platform-specific truncate string from the supplied data

-	 * If the database does not support the truncate() command

-	 * This function maps to "DELETE FROM table"

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string

-	 */	

-	function _truncate($table)

-	{

-		return "TRUNCATE ".$table;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete statement

-	 *

-	 * Generates a platform-specific delete string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the where clause

-	 * @param	string	the limit clause

-	 * @return	string

-	 */	

-	function _delete($table, $where = array(), $like = array(), $limit = FALSE)

-	{

-		$conditions = '';

-

-		if (count($where) > 0 OR count($like) > 0)

-		{

-			$conditions = "\nWHERE ";

-			$conditions .= implode("\n", $this->ar_where);

-

-			if (count($where) > 0 && count($like) > 0)

-			{

-				$conditions .= " AND ";

-			}

-			$conditions .= implode("\n", $like);

-		}

-

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-	

-		return "DELETE FROM ".$table.$conditions.$limit;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Limit string

-	 *

-	 * Generates a platform-specific LIMIT clause

-	 *

-	 * @access	public

-	 * @param	string	the sql query string

-	 * @param	integer	the number of rows to limit the query to

-	 * @param	integer	the offset value

-	 * @return	string

-	 */

-	function _limit($sql, $limit, $offset)

-	{	

-		$sql .= "LIMIT ".$limit;

-	

-		if ($offset > 0)

-		{

-			$sql .= " OFFSET ".$offset;

-		}

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Close DB Connection

-	 *

-	 * @access	public

-	 * @param	resource

-	 * @return	void

-	 */

-	function _close($conn_id)

-	{

-		@mysqli_close($conn_id);

-	}

-

-

-}

-

-

-/* End of file mysqli_driver.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQLi Database Adapter Class - MySQLi only works with PHP 5
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package		CodeIgniter
+ * @subpackage	Drivers
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysqli_driver extends CI_DB {
+
+	var $dbdriver = 'mysqli';
+	
+	// The character used for escaping
+	var $_escape_char = '`';
+
+	/**
+	 * The syntax to count rows is slightly different across different
+	 * database engines, so this string appears in each driver and is
+	 * used for the count_all() and count_all_results() functions.
+	 */
+	var $_count_string = "SELECT COUNT(*) AS ";
+	var $_random_keyword = ' RAND()'; // database specific random keyword
+
+	/**
+	 * Whether to use the MySQL "delete hack" which allows the number
+	 * of affected rows to be shown. Uses a preg_replace when enabled,
+	 * adding a bit more processing to all queries.
+	 */	
+	var $delete_hack = TRUE;
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Non-persistent database connection
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_connect()
+	{
+		if ($this->port != '')
+		{
+			return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port);			
+		}
+		else
+		{
+			return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database);
+		}
+
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Persistent database connection
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_pconnect()
+	{
+		return $this->db_connect();
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Select the database
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_select()
+	{
+		return @mysqli_select_db($this->conn_id, $this->database);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set client character set
+	 *
+	 * @access	private
+	 * @param	string
+	 * @param	string
+	 * @return	resource
+	 */
+	function _db_set_charset($charset, $collation)
+	{
+		return @mysqli_query($this->conn_id, "SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'");
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Version number query string
+	 *
+	 * @access	public
+	 * @return	string
+	 */
+	function _version()
+	{
+		return "SELECT version() AS ver";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Execute the query
+	 *
+	 * @access	private called by the base class
+	 * @param	string	an SQL query
+	 * @return	resource
+	 */	
+	function _execute($sql)
+	{
+		$sql = $this->_prep_query($sql);	
+		$result = @mysqli_query($this->conn_id, $sql);
+		return $result;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Prep the query
+	 *
+	 * If needed, each database adapter can prep the query string
+	 *
+	 * @access	private called by execute()
+	 * @param	string	an SQL query
+	 * @return	string
+	 */	
+	function _prep_query($sql)
+	{
+		// "DELETE FROM TABLE" returns 0 affected rows This hack modifies
+		// the query so that it returns the number of affected rows
+		if ($this->delete_hack === TRUE)
+		{
+			if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
+			{
+				$sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);
+			}
+		}
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Begin Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_begin($test_mode = FALSE)
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+		
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		// Reset the transaction failure flag.
+		// If the $test_mode flag is set to TRUE transactions will be rolled back
+		// even if the queries produce a successful result.
+		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+
+		$this->simple_query('SET AUTOCOMMIT=0');
+		$this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Commit Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_commit()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		$this->simple_query('COMMIT');
+		$this->simple_query('SET AUTOCOMMIT=1');
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rollback Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_rollback()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		$this->simple_query('ROLLBACK');
+		$this->simple_query('SET AUTOCOMMIT=1');
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape String
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function escape_str($str)	
+	{
+		if (function_exists('mysqli_real_escape_string') AND is_object($this->conn_id))
+		{
+			return mysqli_real_escape_string($this->conn_id, $str);
+		}
+		elseif (function_exists('mysql_escape_string'))
+		{
+			return mysql_escape_string($str);
+		}
+		else
+		{
+			return addslashes($str);
+		}
+	}
+		
+	// --------------------------------------------------------------------
+
+	/**
+	 * Affected Rows
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function affected_rows()
+	{
+		return @mysqli_affected_rows($this->conn_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Insert ID
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function insert_id()
+	{
+		return @mysqli_insert_id($this->conn_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * "Count All" query
+	 *
+	 * Generates a platform-specific query string that counts all records in
+	 * the specified database
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function count_all($table = '')
+	{
+		if ($table == '')
+			return '0';
+		
+		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+		
+		if ($query->num_rows() == 0)
+			return '0';
+
+		$row = $query->row();
+		return $row->numrows;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * List table query
+	 *
+	 * Generates a platform-specific query string so that the table names can be fetched
+	 *
+	 * @access	private
+	 * @param	boolean
+	 * @return	string
+	 */
+	function _list_tables($prefix_limit = FALSE)
+	{
+		$sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char;	
+		
+		if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+		{
+			$sql .= " LIKE '".$this->dbprefix."%'";
+		}
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Show column query
+	 *
+	 * Generates a platform-specific query string so that the column names can be fetched
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string
+	 */
+	function _list_columns($table = '')
+	{
+		return "SHOW COLUMNS FROM ".$table;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data query
+	 *
+	 * Generates a platform-specific query so that the column data can be retrieved
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _field_data($table)
+	{
+		return "SELECT * FROM ".$table." LIMIT 1";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message string
+	 *
+	 * @access	private
+	 * @return	string
+	 */
+	function _error_message()
+	{
+		return mysqli_error($this->conn_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message number
+	 *
+	 * @access	private
+	 * @return	integer
+	 */
+	function _error_number()
+	{
+		return mysqli_errno($this->conn_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape the SQL Identifiers
+	 *
+	 * This function escapes column and table names
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	string
+	 */
+	function _escape_identifiers($item)
+	{
+		if ($this->_escape_char == '')
+		{
+			return $item;
+		}
+		
+		foreach ($this->_reserved_identifiers as $id)
+		{
+			if (strpos($item, '.'.$id) !== FALSE)
+			{
+				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  
+				
+				// remove duplicates if the user already included the escape
+				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+			}		
+		}
+		
+		if (strpos($item, '.') !== FALSE)
+		{
+			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			
+		}
+		else
+		{
+			$str = $this->_escape_char.$item.$this->_escape_char;
+		}
+		
+		// remove duplicates if the user already included the escape
+		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+	}
+			
+	// --------------------------------------------------------------------
+
+	/**
+	 * From Tables
+	 *
+	 * This function implicitly groups FROM tables so there is no confusion
+	 * about operator precedence in harmony with SQL standards
+	 *
+	 * @access	public
+	 * @param	type
+	 * @return	type
+	 */
+	function _from_tables($tables)
+	{
+		if ( ! is_array($tables))
+		{
+			$tables = array($tables);
+		}
+		
+		return '('.implode(', ', $tables).')';
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Insert statement
+	 *
+	 * Generates a platform-specific insert string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the insert keys
+	 * @param	array	the insert values
+	 * @return	string
+	 */
+	function _insert($table, $keys, $values)
+	{	
+		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Update statement
+	 *
+	 * Generates a platform-specific update string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the update data
+	 * @param	array	the where clause
+	 * @param	array	the orderby clause
+	 * @param	array	the limit clause
+	 * @return	string
+	 */
+	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+	{
+		foreach($values as $key => $val)
+		{
+			$valstr[] = $key." = ".$val;
+		}
+		
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+		
+		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+	
+		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+		
+		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+		
+		$sql .= $orderby.$limit;
+		
+		return $sql;
+	}
+
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Truncate statement
+	 *
+	 * Generates a platform-specific truncate string from the supplied data
+	 * If the database does not support the truncate() command
+	 * This function maps to "DELETE FROM table"
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string
+	 */	
+	function _truncate($table)
+	{
+		return "TRUNCATE ".$table;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete statement
+	 *
+	 * Generates a platform-specific delete string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the where clause
+	 * @param	string	the limit clause
+	 * @return	string
+	 */	
+	function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+	{
+		$conditions = '';
+
+		if (count($where) > 0 OR count($like) > 0)
+		{
+			$conditions = "\nWHERE ";
+			$conditions .= implode("\n", $this->ar_where);
+
+			if (count($where) > 0 && count($like) > 0)
+			{
+				$conditions .= " AND ";
+			}
+			$conditions .= implode("\n", $like);
+		}
+
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+	
+		return "DELETE FROM ".$table.$conditions.$limit;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Limit string
+	 *
+	 * Generates a platform-specific LIMIT clause
+	 *
+	 * @access	public
+	 * @param	string	the sql query string
+	 * @param	integer	the number of rows to limit the query to
+	 * @param	integer	the offset value
+	 * @return	string
+	 */
+	function _limit($sql, $limit, $offset)
+	{	
+		$sql .= "LIMIT ".$limit;
+	
+		if ($offset > 0)
+		{
+			$sql .= " OFFSET ".$offset;
+		}
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Close DB Connection
+	 *
+	 * @access	public
+	 * @param	resource
+	 * @return	void
+	 */
+	function _close($conn_id)
+	{
+		@mysqli_close($conn_id);
+	}
+
+
+}
+
+
+/* End of file mysqli_driver.php */
 /* Location: ./system/database/drivers/mysqli/mysqli_driver.php */
\ No newline at end of file
diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php
index c7889bf..99c2ebc 100644
--- a/system/database/drivers/mysqli/mysqli_forge.php
+++ b/system/database/drivers/mysqli/mysqli_forge.php
@@ -1,254 +1,254 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * MySQLi Forge Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_mysqli_forge extends CI_DB_forge {

-	

-	/**

-	 * Create database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database($name)

-	{

-		return "CREATE DATABASE ".$name;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		return "DROP DATABASE ".$name;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Process Fields

-	 *

-	 * @access	private

-	 * @param	mixed	the fields

-	 * @return	string

-	 */

-	function _process_fields($fields)

-	{

-		$current_field_count = 0;

-		$sql = '';

-

-		foreach ($fields as $field=>$attributes)

-		{

-			// Numeric field names aren't allowed in databases, so if the key is

-			// numeric, we know it was assigned by PHP and the developer manually

-			// entered the field information, so we'll simply add it to the list

-			if (is_numeric($field))

-			{

-				$sql .= "\n\t$attributes";

-			}

-			else

-			{

-				$attributes = array_change_key_case($attributes, CASE_UPPER);

-				

-				$sql .= "\n\t".$this->db->_protect_identifiers($field);

-

-				if (array_key_exists('NAME', $attributes))

-				{

-					$sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';

-				}

-				

-				if (array_key_exists('TYPE', $attributes))

-				{

-					$sql .=  ' '.$attributes['TYPE'];

-				}

-	

-				if (array_key_exists('CONSTRAINT', $attributes))

-				{

-					$sql .= '('.$attributes['CONSTRAINT'].')';

-				}

-	

-				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)

-				{

-					$sql .= ' UNSIGNED';

-				}

-	

-				if (array_key_exists('DEFAULT', $attributes))

-				{

-					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';

-				}

-	

-				if (array_key_exists('NULL', $attributes))

-				{

-					$sql .= ($attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL';

-				}

-	

-				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)

-				{

-					$sql .= ' AUTO_INCREMENT';

-				}

-			}

-			

-			// don't add a comma on the end of the last field

-			if (++$current_field_count < count($fields))

-			{

-				$sql .= ',';

-			}

-		}

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Create Table

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @param	mixed	the fields

-	 * @param	mixed	primary key(s)

-	 * @param	mixed	key(s)

-	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL

-	 * @return	bool

-	 */

-	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)

-	{

-		$sql = 'CREATE TABLE ';

-		

-		if ($if_not_exists === TRUE)

-		{

-			$sql .= 'IF NOT EXISTS ';

-		}

-		

-		$sql .= $this->db->_escape_identifiers($table)." (";

-

-		$sql .= $this->_process_fields($fields);

-

-		if (count($primary_keys) > 0)

-		{

-			$key_name = $this->db->_protect_identifiers(implode('_', $primary_keys));

-			$primary_keys = $this->db->_protect_identifiers($primary_keys);

-			$sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")";

-		}

-

-		if (is_array($keys) && count($keys) > 0)

-		{

-			foreach ($keys as $key)

-			{

-				if (is_array($key))

-				{

-					$key_name = $this->db->_protect_identifiers(implode('_', $key));

-					$key = $this->db->_protect_identifiers($key);	

-				}

-				else

-				{

-					$key_name = $this->db->_protect_identifiers($key);

-					$key = array($key_name);

-				}

-				

-				$sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";

-			}

-		}

-

-		$sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";

-

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop Table

-	 *

-	 * @access	private

-	 * @return	string

-	 */

-	function _drop_table($table)

-	{

-		return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Alter table query

-	 *

-	 * Generates a platform-specific query so that a table can be altered

-	 * Called by add_column(), drop_column(), and column_alter(),

-	 *

-	 * @access	private

-	 * @param	string	the ALTER type (ADD, DROP, CHANGE)

-	 * @param	string	the column name

-	 * @param	array	fields

-	 * @param	string	the field after which we should add the new field

-	 * @return	object

-	 */

-	function _alter_table($alter_type, $table, $fields, $after_field = '')

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";

-

-		// DROP has everything it needs now.

-		if ($alter_type == 'DROP')

-		{

-			return $sql.$this->db->_protect_identifiers($fields);

-		}

-

-		$sql .= $this->_process_fields($fields);

-

-		if ($after_field != '')

-		{

-			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);

-		}

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rename a table

-	 *

-	 * Generates a platform-specific query so that a table can be renamed

-	 *

-	 * @access	private

-	 * @param	string	the old table name

-	 * @param	string	the new table name

-	 * @return	string

-	 */

-	function _rename_table($table_name, $new_table_name)

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);

-		return $sql;

-	}

-

-}

-

-/* End of file mysqli_forge.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQLi Forge Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysqli_forge extends CI_DB_forge {
+	
+	/**
+	 * Create database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database($name)
+	{
+		return "CREATE DATABASE ".$name;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		return "DROP DATABASE ".$name;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Process Fields
+	 *
+	 * @access	private
+	 * @param	mixed	the fields
+	 * @return	string
+	 */
+	function _process_fields($fields)
+	{
+		$current_field_count = 0;
+		$sql = '';
+
+		foreach ($fields as $field=>$attributes)
+		{
+			// Numeric field names aren't allowed in databases, so if the key is
+			// numeric, we know it was assigned by PHP and the developer manually
+			// entered the field information, so we'll simply add it to the list
+			if (is_numeric($field))
+			{
+				$sql .= "\n\t$attributes";
+			}
+			else
+			{
+				$attributes = array_change_key_case($attributes, CASE_UPPER);
+				
+				$sql .= "\n\t".$this->db->_protect_identifiers($field);
+
+				if (array_key_exists('NAME', $attributes))
+				{
+					$sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';
+				}
+				
+				if (array_key_exists('TYPE', $attributes))
+				{
+					$sql .=  ' '.$attributes['TYPE'];
+				}
+	
+				if (array_key_exists('CONSTRAINT', $attributes))
+				{
+					$sql .= '('.$attributes['CONSTRAINT'].')';
+				}
+	
+				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+				{
+					$sql .= ' UNSIGNED';
+				}
+	
+				if (array_key_exists('DEFAULT', $attributes))
+				{
+					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+				}
+	
+				if (array_key_exists('NULL', $attributes))
+				{
+					$sql .= ($attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL';
+				}
+	
+				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+				{
+					$sql .= ' AUTO_INCREMENT';
+				}
+			}
+			
+			// don't add a comma on the end of the last field
+			if (++$current_field_count < count($fields))
+			{
+				$sql .= ',';
+			}
+		}
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Create Table
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @param	mixed	the fields
+	 * @param	mixed	primary key(s)
+	 * @param	mixed	key(s)
+	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL
+	 * @return	bool
+	 */
+	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+	{
+		$sql = 'CREATE TABLE ';
+		
+		if ($if_not_exists === TRUE)
+		{
+			$sql .= 'IF NOT EXISTS ';
+		}
+		
+		$sql .= $this->db->_escape_identifiers($table)." (";
+
+		$sql .= $this->_process_fields($fields);
+
+		if (count($primary_keys) > 0)
+		{
+			$key_name = $this->db->_protect_identifiers(implode('_', $primary_keys));
+			$primary_keys = $this->db->_protect_identifiers($primary_keys);
+			$sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")";
+		}
+
+		if (is_array($keys) && count($keys) > 0)
+		{
+			foreach ($keys as $key)
+			{
+				if (is_array($key))
+				{
+					$key_name = $this->db->_protect_identifiers(implode('_', $key));
+					$key = $this->db->_protect_identifiers($key);	
+				}
+				else
+				{
+					$key_name = $this->db->_protect_identifiers($key);
+					$key = array($key_name);
+				}
+				
+				$sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";
+			}
+		}
+
+		$sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";
+
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop Table
+	 *
+	 * @access	private
+	 * @return	string
+	 */
+	function _drop_table($table)
+	{
+		return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Alter table query
+	 *
+	 * Generates a platform-specific query so that a table can be altered
+	 * Called by add_column(), drop_column(), and column_alter(),
+	 *
+	 * @access	private
+	 * @param	string	the ALTER type (ADD, DROP, CHANGE)
+	 * @param	string	the column name
+	 * @param	array	fields
+	 * @param	string	the field after which we should add the new field
+	 * @return	object
+	 */
+	function _alter_table($alter_type, $table, $fields, $after_field = '')
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";
+
+		// DROP has everything it needs now.
+		if ($alter_type == 'DROP')
+		{
+			return $sql.$this->db->_protect_identifiers($fields);
+		}
+
+		$sql .= $this->_process_fields($fields);
+
+		if ($after_field != '')
+		{
+			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+		}
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rename a table
+	 *
+	 * Generates a platform-specific query so that a table can be renamed
+	 *
+	 * @access	private
+	 * @param	string	the old table name
+	 * @param	string	the new table name
+	 * @return	string
+	 */
+	function _rename_table($table_name, $new_table_name)
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+		return $sql;
+	}
+
+}
+
+/* End of file mysqli_forge.php */
 /* Location: ./system/database/drivers/mysqli/mysqli_forge.php */
\ No newline at end of file
diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php
index b690914..5b1f793 100644
--- a/system/database/drivers/mysqli/mysqli_result.php
+++ b/system/database/drivers/mysqli/mysqli_result.php
@@ -1,169 +1,169 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * MySQLi Result Class

- *

- * This class extends the parent result class: CI_DB_result

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_mysqli_result extends CI_DB_result {

-	

-	/**

-	 * Number of rows in the result set

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function num_rows()

-	{

-		return @mysqli_num_rows($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Number of fields in the result set

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function num_fields()

-	{

-		return @mysqli_num_fields($this->result_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Fetch Field Names

-	 *

-	 * Generates an array of column names

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function list_fields()

-	{

-		$field_names = array();

-		while ($field = mysqli_fetch_field($this->result_id))

-		{

-			$field_names[] = $field->name;

-		}

-		

-		return $field_names;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data

-	 *

-	 * Generates an array of objects containing field meta-data

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function field_data()

-	{

-		$retval = array();

-		while ($field = mysqli_fetch_field($this->result_id))

-		{	

-			$F 				= new stdClass();

-			$F->name 		= $field->name;

-			$F->type 		= $field->type;

-			$F->default		= $field->def;

-			$F->max_length	= $field->max_length;

-			$F->primary_key = ($field->flags & MYSQLI_PRI_KEY_FLAG) ? 1 : 0;

-			

-			$retval[] = $F;

-		}

-		

-		return $retval;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Free the result

-	 *

-	 * @return	null

-	 */		

-	function free_result()

-	{

-		if (is_object($this->result_id))

-		{

-			mysqli_free_result($this->result_id);

-			$this->result_id = FALSE;

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Data Seek

-	 *

-	 * Moves the internal pointer to the desired offset.  We call

-	 * this internally before fetching results to make sure the

-	 * result set starts at zero

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _data_seek($n = 0)

-	{

-		return mysqli_data_seek($this->result_id, $n);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - associative array

-	 *

-	 * Returns the result set as an array

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _fetch_assoc()

-	{

-		return mysqli_fetch_assoc($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - object

-	 *

-	 * Returns the result set as an object

-	 *

-	 * @access	private

-	 * @return	object

-	 */

-	function _fetch_object()

-	{

-		return mysqli_fetch_object($this->result_id);

-	}

-	

-}

-

-

-/* End of file mysqli_result.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQLi Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysqli_result extends CI_DB_result {
+	
+	/**
+	 * Number of rows in the result set
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function num_rows()
+	{
+		return @mysqli_num_rows($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Number of fields in the result set
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function num_fields()
+	{
+		return @mysqli_num_fields($this->result_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Fetch Field Names
+	 *
+	 * Generates an array of column names
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function list_fields()
+	{
+		$field_names = array();
+		while ($field = mysqli_fetch_field($this->result_id))
+		{
+			$field_names[] = $field->name;
+		}
+		
+		return $field_names;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data
+	 *
+	 * Generates an array of objects containing field meta-data
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function field_data()
+	{
+		$retval = array();
+		while ($field = mysqli_fetch_field($this->result_id))
+		{	
+			$F 				= new stdClass();
+			$F->name 		= $field->name;
+			$F->type 		= $field->type;
+			$F->default		= $field->def;
+			$F->max_length	= $field->max_length;
+			$F->primary_key = ($field->flags & MYSQLI_PRI_KEY_FLAG) ? 1 : 0;
+			
+			$retval[] = $F;
+		}
+		
+		return $retval;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Free the result
+	 *
+	 * @return	null
+	 */		
+	function free_result()
+	{
+		if (is_object($this->result_id))
+		{
+			mysqli_free_result($this->result_id);
+			$this->result_id = FALSE;
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Data Seek
+	 *
+	 * Moves the internal pointer to the desired offset.  We call
+	 * this internally before fetching results to make sure the
+	 * result set starts at zero
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _data_seek($n = 0)
+	{
+		return mysqli_data_seek($this->result_id, $n);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - associative array
+	 *
+	 * Returns the result set as an array
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _fetch_assoc()
+	{
+		return mysqli_fetch_assoc($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - object
+	 *
+	 * Returns the result set as an object
+	 *
+	 * @access	private
+	 * @return	object
+	 */
+	function _fetch_object()
+	{
+		return mysqli_fetch_object($this->result_id);
+	}
+	
+}
+
+
+/* End of file mysqli_result.php */
 /* Location: ./system/database/drivers/mysqli/mysqli_result.php */
\ No newline at end of file
diff --git a/system/database/drivers/mysqli/mysqli_utility.php b/system/database/drivers/mysqli/mysqli_utility.php
index d19b643..c1d191d 100644
--- a/system/database/drivers/mysqli/mysqli_utility.php
+++ b/system/database/drivers/mysqli/mysqli_utility.php
@@ -1,123 +1,123 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * MySQLi Utility Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_mysqli_utility extends CI_DB_utility {

-	

-	/**

-	 * List databases

-	 *

-	 * @access	private

-	 * @return	bool

-	 */

-	function _list_databases()

-	{

-		return "SHOW DATABASES";

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Optimize table query

-	 *

-	 * Generates a platform-specific query so that a table can be optimized

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _optimize_table($table)

-	{

-		return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Repair table query

-	 *

-	 * Generates a platform-specific query so that a table can be repaired

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _repair_table($table)

-	{

-		return "REPAIR TABLE ".$this->db->_escape_identifiers($table);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * MySQLi Export

-	 *

-	 * @access	private

-	 * @param	array	Preferences

-	 * @return	mixed

-	 */

-	function _backup($params = array())

-	{

-		// Currently unsupported

-		return $this->db->display_error('db_unsuported_feature');

-	}

-

-

-	/**

-	 *

-	 * The functions below have been deprecated as of 1.6, and are only here for backwards

-	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation

-	 * is STRONGLY discouraged in favour if using dbforge.

-	 *

-	 */

-

-	/**

-	 * Create database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database($name)

-	{

-		return "CREATE DATABASE ".$name;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		return "DROP DATABASE ".$name;

-	}

-

-}

-

-/* End of file mysqli_utility.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQLi Utility Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysqli_utility extends CI_DB_utility {
+	
+	/**
+	 * List databases
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _list_databases()
+	{
+		return "SHOW DATABASES";
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Optimize table query
+	 *
+	 * Generates a platform-specific query so that a table can be optimized
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _optimize_table($table)
+	{
+		return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Repair table query
+	 *
+	 * Generates a platform-specific query so that a table can be repaired
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _repair_table($table)
+	{
+		return "REPAIR TABLE ".$this->db->_escape_identifiers($table);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * MySQLi Export
+	 *
+	 * @access	private
+	 * @param	array	Preferences
+	 * @return	mixed
+	 */
+	function _backup($params = array())
+	{
+		// Currently unsupported
+		return $this->db->display_error('db_unsuported_feature');
+	}
+
+
+	/**
+	 *
+	 * The functions below have been deprecated as of 1.6, and are only here for backwards
+	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation
+	 * is STRONGLY discouraged in favour if using dbforge.
+	 *
+	 */
+
+	/**
+	 * Create database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database($name)
+	{
+		return "CREATE DATABASE ".$name;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		return "DROP DATABASE ".$name;
+	}
+
+}
+
+/* End of file mysqli_utility.php */
 /* Location: ./system/database/drivers/mysqli/mysqli_utility.php */
\ No newline at end of file
diff --git a/system/database/drivers/oci8/index.html b/system/database/drivers/oci8/index.html
index 065d2da..c942a79 100644
--- a/system/database/drivers/oci8/index.html
+++ b/system/database/drivers/oci8/index.html
@@ -1,10 +1,10 @@
-<html>

-<head>

-	<title>403 Forbidden</title>

-</head>

-<body>

-

-<p>Directory access is forbidden.</p>

-

-</body>

+<html>
+<head>
+	<title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
 </html>
\ No newline at end of file
diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php
index 0c14677..0629a59 100644
--- a/system/database/drivers/oci8/oci8_driver.php
+++ b/system/database/drivers/oci8/oci8_driver.php
@@ -1,737 +1,737 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package	 	CodeIgniter

- * @author	  	ExpressionEngine Dev Team

- * @copyright   Copyright (c) 2008, EllisLab, Inc.

- * @license	 	http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since	   	Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * oci8 Database Adapter Class

- *

- * Note: _DB is an extender class that the app controller

- * creates dynamically based on whether the active record

- * class is being used or not.

- *

- * @package	 	CodeIgniter

- * @subpackage  Drivers

- * @category	Database

- * @author	  	ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-

-/**

- * oci8 Database Adapter Class

- *

- * This is a modification of the DB_driver class to

- * permit access to oracle databases

- *

- * NOTE: this uses the PHP 4 oci methods

- *

- * @author	  Kelly McArdle

- *

- */

-

-class CI_DB_oci8_driver extends CI_DB {

-

-	var $dbdriver = 'oci8';

-	

-	// The character used for excaping

-	var $_escape_char = '"';

-

-	/**

-	 * The syntax to count rows is slightly different across different

-	 * database engines, so this string appears in each driver and is

-	 * used for the count_all() and count_all_results() functions.

-	 */

-	var $_count_string = "SELECT COUNT(1) AS ";

-	var $_random_keyword = ' ASC'; // not currently supported

-

-	// Set "auto commit" by default

-	var $_commit = OCI_COMMIT_ON_SUCCESS;

-

-	// need to track statement id and cursor id

-	var $stmt_id;

-	var $curs_id;

-

-	// if we use a limit, we will add a field that will

-	// throw off num_fields later

-	var $limit_used;

-

-	/**

-	 * Non-persistent database connection

-	 *

-	 * @access  private called by the base class

-	 * @return  resource

-	 */

-	function db_connect()

-	{

-		return @ocilogon($this->username, $this->password, $this->hostname);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Persistent database connection

-	 *

-	 * @access  private called by the base class

-	 * @return  resource

-	 */

-	function db_pconnect()

-	{

-		return @ociplogon($this->username, $this->password, $this->hostname);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Select the database

-	 *

-	 * @access  private called by the base class

-	 * @return  resource

-	 */

-	function db_select()

-	{

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Set client character set

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @return	resource

-	 */

-	function db_set_charset($charset, $collation)

-	{

-		// @todo - add support if needed

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Version number query string

-	 *

-	 * @access  public

-	 * @return  string

-	 */

-	function _version()

-	{

-		return ociserverversion($this->conn_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Execute the query

-	 *

-	 * @access  private called by the base class

-	 * @param   string  an SQL query

-	 * @return  resource

-	 */

-	function _execute($sql)

-	{

-		// oracle must parse the query before it is run. All of the actions with

-		// the query are based on the statement id returned by ociparse

-		$this->stmt_id = FALSE;

-		$this->_set_stmt_id($sql);

-		ocisetprefetch($this->stmt_id, 1000);

-		return @ociexecute($this->stmt_id, $this->_commit);

-	}

-

-	/**

-	 * Generate a statement ID

-	 *

-	 * @access  private

-	 * @param   string  an SQL query

-	 * @return  none

-	 */

-	function _set_stmt_id($sql)

-	{

-		if ( ! is_resource($this->stmt_id))

-		{

-			$this->stmt_id = ociparse($this->conn_id, $this->_prep_query($sql));

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Prep the query

-	 *

-	 * If needed, each database adapter can prep the query string

-	 *

-	 * @access  private called by execute()

-	 * @param   string  an SQL query

-	 * @return  string

-	 */

-	function _prep_query($sql)

-	{

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * getCursor.  Returns a cursor from the datbase

-	 *

-	 * @access  public

-	 * @return  cursor id

-	 */

-	function get_cursor()

-	{

-		$this->curs_id = ocinewcursor($this->conn_id);

-		return $this->curs_id;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Stored Procedure.  Executes a stored procedure

-	 *

-	 * @access  public

-	 * @param   package	 package stored procedure is in

-	 * @param   procedure   stored procedure to execute

-	 * @param   params	  array of parameters

-	 * @return  array

-	 *

-	 * params array keys

-	 *

-	 * KEY	  OPTIONAL	NOTES

-	 * name		no		the name of the parameter should be in :<param_name> format

-	 * value	no		the value of the parameter.  If this is an OUT or IN OUT parameter,

-	 *					this should be a reference to a variable

-	 * type		yes		the type of the parameter

-	 * length	yes		the max size of the parameter

-	 */

-	function stored_procedure($package, $procedure, $params)

-	{

-		if ($package == '' OR $procedure == '' OR ! is_array($params))

-		{

-			if ($this->db_debug)

-			{

-				log_message('error', 'Invalid query: '.$package.'.'.$procedure);

-				return $this->display_error('db_invalid_query');

-			}

-			return FALSE;

-		}

-		

-		// build the query string

-		$sql = "begin $package.$procedure(";

-

-		$have_cursor = FALSE;

-		foreach($params as $param)

-		{

-			$sql .= $param['name'] . ",";

-			

-			if (array_key_exists('type', $param) && ($param['type'] == OCI_B_CURSOR))

-			{

-				$have_cursor = TRUE;

-			}

-		}

-		$sql = trim($sql, ",") . "); end;";

-				

-		$this->stmt_id = FALSE;

-		$this->_set_stmt_id($sql);

-		$this->_bind_params($params);

-		$this->query($sql, FALSE, $have_cursor);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Bind parameters

-	 *

-	 * @access  private

-	 * @return  none

-	 */

-	function _bind_params($params)

-	{

-		if ( ! is_array($params) OR ! is_resource($this->stmt_id))

-		{

-			return;

-		}

-		

-		foreach ($params as $param)

-		{

- 			foreach (array('name', 'value', 'type', 'length') as $val)

-			{

-				if ( ! isset($param[$val]))

-				{

-					$param[$val] = '';

-				}

-			}

-

-			ocibindbyname($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']);

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Begin Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_begin($test_mode = FALSE)

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-		

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-		

-		// Reset the transaction failure flag.

-		// If the $test_mode flag is set to TRUE transactions will be rolled back

-		// even if the queries produce a successful result.

-		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;

-		

-		$this->_commit = OCI_DEFAULT;

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Commit Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_commit()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		$ret = OCIcommit($this->conn_id);

-		$this->_commit = OCI_COMMIT_ON_SUCCESS;

-		return $ret;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rollback Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_rollback()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		$ret = OCIrollback($this->conn_id);

-		$this->_commit = OCI_COMMIT_ON_SUCCESS;

-		return $ret;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape String

-	 *

-	 * @access  public

-	 * @param   string

-	 * @return  string

-	 */

-	function escape_str($str)

-	{

-		// Access the CI object

-		$CI =& get_instance();

-

-		return $CI->_remove_invisible_characters($str);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Affected Rows

-	 *

-	 * @access  public

-	 * @return  integer

-	 */

-	function affected_rows()

-	{

-		return @ocirowcount($this->stmt_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Insert ID

-	 *

-	 * @access  public

-	 * @return  integer

-	 */

-	function insert_id()

-	{

-		// not supported in oracle

-		return $this->display_error('db_unsupported_function');

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * "Count All" query

-	 *

-	 * Generates a platform-specific query string that counts all records in

-	 * the specified database

-	 *

-	 * @access  public

-	 * @param   string

-	 * @return  string

-	 */

-	function count_all($table = '')

-	{

-		if ($table == '')

-			return '0';

-

-		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));

-

-		if ($query == FALSE)

-			{

-			return 0;

-			}

-

-		$row = $query->row();

-		return $row->NUMROWS;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Show table query

-	 *

-	 * Generates a platform-specific query string so that the table names can be fetched

-	 *

-	 * @access  private

-	 * @param	boolean

-	 * @return  string

-	 */

-	function _list_tables($prefix_limit = FALSE)

-	{

-		$sql = "SELECT TABLE_NAME FROM ALL_TABLES";

-

-		if ($prefix_limit !== FALSE AND $this->dbprefix != '')

-		{

-			$sql .= " WHERE TABLE_NAME LIKE '".$this->dbprefix."%'";

-		}

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Show column query

-	 *

-	 * Generates a platform-specific query string so that the column names can be fetched

-	 *

-	 * @access  public

-	 * @param   string  the table name

-	 * @return  string

-	 */

-	function _list_columns($table = '')

-	{

-		return "SELECT COLUMN_NAME FROM all_tab_columns WHERE table_name = '$table'";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data query

-	 *

-	 * Generates a platform-specific query so that the column data can be retrieved

-	 *

-	 * @access  public

-	 * @param   string  the table name

-	 * @return  object

-	 */

-	function _field_data($table)

-	{

-		return "SELECT * FROM ".$table." where rownum = 1";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message string

-	 *

-	 * @access  private

-	 * @return  string

-	 */

-	function _error_message()

-	{

-		$error = ocierror($this->conn_id);

-		return $error['message'];

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message number

-	 *

-	 * @access  private

-	 * @return  integer

-	 */

-	function _error_number()

-	{

-		$error = ocierror($this->conn_id);

-		return $error['code'];

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape the SQL Identifiers

-	 *

-	 * This function escapes column and table names

-	 *

-	 * @access	private

-	 * @param	string

-	 * @return	string

-	 */

-	function _escape_identifiers($item)

-	{

-		if ($this->_escape_char == '')

-		{

-			return $item;

-		}

-

-		foreach ($this->_reserved_identifiers as $id)

-		{

-			if (strpos($item, '.'.$id) !== FALSE)

-			{

-				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  

-				

-				// remove duplicates if the user already included the escape

-				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-			}		

-		}

-	

-		if (strpos($item, '.') !== FALSE)

-		{

-			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			

-		}

-		else

-		{

-			$str = $this->_escape_char.$item.$this->_escape_char;

-		}

-		

-		// remove duplicates if the user already included the escape

-		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * From Tables

-	 *

-	 * This function implicitly groups FROM tables so there is no confusion

-	 * about operator precedence in harmony with SQL standards

-	 *

-	 * @access	public

-	 * @param	type

-	 * @return	type

-	 */

-	function _from_tables($tables)

-	{

-		if ( ! is_array($tables))

-		{

-			$tables = array($tables);

-		}

-		

-		return implode(', ', $tables);

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Insert statement

-	 *

-	 * Generates a platform-specific insert string from the supplied data

-	 *

-	 * @access  public

-	 * @param   string  the table name

-	 * @param   array   the insert keys

-	 * @param   array   the insert values

-	 * @return  string

-	 */

-	function _insert($table, $keys, $values)

-	{

-	return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Update statement

-	 *

-	 * Generates a platform-specific update string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the update data

-	 * @param	array	the where clause

-	 * @param	array	the orderby clause

-	 * @param	array	the limit clause

-	 * @return	string

-	 */

-	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)

-	{

-		foreach($values as $key => $val)

-		{

-			$valstr[] = $key." = ".$val;

-		}

-		

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-		

-		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';

-	

-		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);

-

-		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';

-

-		$sql .= $orderby.$limit;

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Truncate statement

-	 *

-	 * Generates a platform-specific truncate string from the supplied data

-	 * If the database does not support the truncate() command

-	 * This function maps to "DELETE FROM table"

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string

-	 */	

-	function _truncate($table)

-	{

-		return "TRUNCATE TABLE ".$table;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete statement

-	 *

-	 * Generates a platform-specific delete string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the where clause

-	 * @param	string	the limit clause

-	 * @return	string

-	 */	

-	function _delete($table, $where = array(), $like = array(), $limit = FALSE)

-	{

-		$conditions = '';

-

-		if (count($where) > 0 OR count($like) > 0)

-		{

-			$conditions = "\nWHERE ";

-			$conditions .= implode("\n", $this->ar_where);

-

-			if (count($where) > 0 && count($like) > 0)

-			{

-				$conditions .= " AND ";

-			}

-			$conditions .= implode("\n", $like);

-		}

-

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-	

-		return "DELETE FROM ".$table.$conditions.$limit;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Limit string

-	 *

-	 * Generates a platform-specific LIMIT clause

-	 *

-	 * @access  public

-	 * @param   string  the sql query string

-	 * @param   integer the number of rows to limit the query to

-	 * @param   integer the offset value

-	 * @return  string

-	 */

-	function _limit($sql, $limit, $offset)

-	{

-		$limit = $offset + $limit;

-		$newsql = "SELECT * FROM (select inner_query.*, rownum rnum FROM ($sql) inner_query WHERE rownum < $limit)";

-

-		if ($offset != 0)

-		{

-			$newsql .= " WHERE rnum >= $offset";

-		}

-

-		// remember that we used limits

-		$this->limit_used = TRUE;

-

-		return $newsql;

-	}	

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Close DB Connection

-	 *

-	 * @access  public

-	 * @param   resource

-	 * @return  void

-	 */

-	function _close($conn_id)

-	{

-		@ocilogoff($conn_id);

-	}

-

-

-}

-

-

-

-/* End of file oci8_driver.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package	 	CodeIgniter
+ * @author	  	ExpressionEngine Dev Team
+ * @copyright   Copyright (c) 2008, EllisLab, Inc.
+ * @license	 	http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since	   	Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * oci8 Database Adapter Class
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package	 	CodeIgniter
+ * @subpackage  Drivers
+ * @category	Database
+ * @author	  	ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+
+/**
+ * oci8 Database Adapter Class
+ *
+ * This is a modification of the DB_driver class to
+ * permit access to oracle databases
+ *
+ * NOTE: this uses the PHP 4 oci methods
+ *
+ * @author	  Kelly McArdle
+ *
+ */
+
+class CI_DB_oci8_driver extends CI_DB {
+
+	var $dbdriver = 'oci8';
+	
+	// The character used for excaping
+	var $_escape_char = '"';
+
+	/**
+	 * The syntax to count rows is slightly different across different
+	 * database engines, so this string appears in each driver and is
+	 * used for the count_all() and count_all_results() functions.
+	 */
+	var $_count_string = "SELECT COUNT(1) AS ";
+	var $_random_keyword = ' ASC'; // not currently supported
+
+	// Set "auto commit" by default
+	var $_commit = OCI_COMMIT_ON_SUCCESS;
+
+	// need to track statement id and cursor id
+	var $stmt_id;
+	var $curs_id;
+
+	// if we use a limit, we will add a field that will
+	// throw off num_fields later
+	var $limit_used;
+
+	/**
+	 * Non-persistent database connection
+	 *
+	 * @access  private called by the base class
+	 * @return  resource
+	 */
+	function db_connect()
+	{
+		return @ocilogon($this->username, $this->password, $this->hostname);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Persistent database connection
+	 *
+	 * @access  private called by the base class
+	 * @return  resource
+	 */
+	function db_pconnect()
+	{
+		return @ociplogon($this->username, $this->password, $this->hostname);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Select the database
+	 *
+	 * @access  private called by the base class
+	 * @return  resource
+	 */
+	function db_select()
+	{
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set client character set
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @return	resource
+	 */
+	function db_set_charset($charset, $collation)
+	{
+		// @todo - add support if needed
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Version number query string
+	 *
+	 * @access  public
+	 * @return  string
+	 */
+	function _version()
+	{
+		return ociserverversion($this->conn_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Execute the query
+	 *
+	 * @access  private called by the base class
+	 * @param   string  an SQL query
+	 * @return  resource
+	 */
+	function _execute($sql)
+	{
+		// oracle must parse the query before it is run. All of the actions with
+		// the query are based on the statement id returned by ociparse
+		$this->stmt_id = FALSE;
+		$this->_set_stmt_id($sql);
+		ocisetprefetch($this->stmt_id, 1000);
+		return @ociexecute($this->stmt_id, $this->_commit);
+	}
+
+	/**
+	 * Generate a statement ID
+	 *
+	 * @access  private
+	 * @param   string  an SQL query
+	 * @return  none
+	 */
+	function _set_stmt_id($sql)
+	{
+		if ( ! is_resource($this->stmt_id))
+		{
+			$this->stmt_id = ociparse($this->conn_id, $this->_prep_query($sql));
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Prep the query
+	 *
+	 * If needed, each database adapter can prep the query string
+	 *
+	 * @access  private called by execute()
+	 * @param   string  an SQL query
+	 * @return  string
+	 */
+	function _prep_query($sql)
+	{
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * getCursor.  Returns a cursor from the datbase
+	 *
+	 * @access  public
+	 * @return  cursor id
+	 */
+	function get_cursor()
+	{
+		$this->curs_id = ocinewcursor($this->conn_id);
+		return $this->curs_id;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Stored Procedure.  Executes a stored procedure
+	 *
+	 * @access  public
+	 * @param   package	 package stored procedure is in
+	 * @param   procedure   stored procedure to execute
+	 * @param   params	  array of parameters
+	 * @return  array
+	 *
+	 * params array keys
+	 *
+	 * KEY	  OPTIONAL	NOTES
+	 * name		no		the name of the parameter should be in :<param_name> format
+	 * value	no		the value of the parameter.  If this is an OUT or IN OUT parameter,
+	 *					this should be a reference to a variable
+	 * type		yes		the type of the parameter
+	 * length	yes		the max size of the parameter
+	 */
+	function stored_procedure($package, $procedure, $params)
+	{
+		if ($package == '' OR $procedure == '' OR ! is_array($params))
+		{
+			if ($this->db_debug)
+			{
+				log_message('error', 'Invalid query: '.$package.'.'.$procedure);
+				return $this->display_error('db_invalid_query');
+			}
+			return FALSE;
+		}
+		
+		// build the query string
+		$sql = "begin $package.$procedure(";
+
+		$have_cursor = FALSE;
+		foreach($params as $param)
+		{
+			$sql .= $param['name'] . ",";
+			
+			if (array_key_exists('type', $param) && ($param['type'] == OCI_B_CURSOR))
+			{
+				$have_cursor = TRUE;
+			}
+		}
+		$sql = trim($sql, ",") . "); end;";
+				
+		$this->stmt_id = FALSE;
+		$this->_set_stmt_id($sql);
+		$this->_bind_params($params);
+		$this->query($sql, FALSE, $have_cursor);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Bind parameters
+	 *
+	 * @access  private
+	 * @return  none
+	 */
+	function _bind_params($params)
+	{
+		if ( ! is_array($params) OR ! is_resource($this->stmt_id))
+		{
+			return;
+		}
+		
+		foreach ($params as $param)
+		{
+ 			foreach (array('name', 'value', 'type', 'length') as $val)
+			{
+				if ( ! isset($param[$val]))
+				{
+					$param[$val] = '';
+				}
+			}
+
+			ocibindbyname($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']);
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Begin Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_begin($test_mode = FALSE)
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+		
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+		
+		// Reset the transaction failure flag.
+		// If the $test_mode flag is set to TRUE transactions will be rolled back
+		// even if the queries produce a successful result.
+		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+		
+		$this->_commit = OCI_DEFAULT;
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Commit Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_commit()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		$ret = OCIcommit($this->conn_id);
+		$this->_commit = OCI_COMMIT_ON_SUCCESS;
+		return $ret;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rollback Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_rollback()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		$ret = OCIrollback($this->conn_id);
+		$this->_commit = OCI_COMMIT_ON_SUCCESS;
+		return $ret;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape String
+	 *
+	 * @access  public
+	 * @param   string
+	 * @return  string
+	 */
+	function escape_str($str)
+	{
+		// Access the CI object
+		$CI =& get_instance();
+
+		return $CI->_remove_invisible_characters($str);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Affected Rows
+	 *
+	 * @access  public
+	 * @return  integer
+	 */
+	function affected_rows()
+	{
+		return @ocirowcount($this->stmt_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Insert ID
+	 *
+	 * @access  public
+	 * @return  integer
+	 */
+	function insert_id()
+	{
+		// not supported in oracle
+		return $this->display_error('db_unsupported_function');
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * "Count All" query
+	 *
+	 * Generates a platform-specific query string that counts all records in
+	 * the specified database
+	 *
+	 * @access  public
+	 * @param   string
+	 * @return  string
+	 */
+	function count_all($table = '')
+	{
+		if ($table == '')
+			return '0';
+
+		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+
+		if ($query == FALSE)
+			{
+			return 0;
+			}
+
+		$row = $query->row();
+		return $row->NUMROWS;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Show table query
+	 *
+	 * Generates a platform-specific query string so that the table names can be fetched
+	 *
+	 * @access  private
+	 * @param	boolean
+	 * @return  string
+	 */
+	function _list_tables($prefix_limit = FALSE)
+	{
+		$sql = "SELECT TABLE_NAME FROM ALL_TABLES";
+
+		if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+		{
+			$sql .= " WHERE TABLE_NAME LIKE '".$this->dbprefix."%'";
+		}
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Show column query
+	 *
+	 * Generates a platform-specific query string so that the column names can be fetched
+	 *
+	 * @access  public
+	 * @param   string  the table name
+	 * @return  string
+	 */
+	function _list_columns($table = '')
+	{
+		return "SELECT COLUMN_NAME FROM all_tab_columns WHERE table_name = '$table'";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data query
+	 *
+	 * Generates a platform-specific query so that the column data can be retrieved
+	 *
+	 * @access  public
+	 * @param   string  the table name
+	 * @return  object
+	 */
+	function _field_data($table)
+	{
+		return "SELECT * FROM ".$table." where rownum = 1";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message string
+	 *
+	 * @access  private
+	 * @return  string
+	 */
+	function _error_message()
+	{
+		$error = ocierror($this->conn_id);
+		return $error['message'];
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message number
+	 *
+	 * @access  private
+	 * @return  integer
+	 */
+	function _error_number()
+	{
+		$error = ocierror($this->conn_id);
+		return $error['code'];
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape the SQL Identifiers
+	 *
+	 * This function escapes column and table names
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	string
+	 */
+	function _escape_identifiers($item)
+	{
+		if ($this->_escape_char == '')
+		{
+			return $item;
+		}
+
+		foreach ($this->_reserved_identifiers as $id)
+		{
+			if (strpos($item, '.'.$id) !== FALSE)
+			{
+				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  
+				
+				// remove duplicates if the user already included the escape
+				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+			}		
+		}
+	
+		if (strpos($item, '.') !== FALSE)
+		{
+			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			
+		}
+		else
+		{
+			$str = $this->_escape_char.$item.$this->_escape_char;
+		}
+		
+		// remove duplicates if the user already included the escape
+		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * From Tables
+	 *
+	 * This function implicitly groups FROM tables so there is no confusion
+	 * about operator precedence in harmony with SQL standards
+	 *
+	 * @access	public
+	 * @param	type
+	 * @return	type
+	 */
+	function _from_tables($tables)
+	{
+		if ( ! is_array($tables))
+		{
+			$tables = array($tables);
+		}
+		
+		return implode(', ', $tables);
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Insert statement
+	 *
+	 * Generates a platform-specific insert string from the supplied data
+	 *
+	 * @access  public
+	 * @param   string  the table name
+	 * @param   array   the insert keys
+	 * @param   array   the insert values
+	 * @return  string
+	 */
+	function _insert($table, $keys, $values)
+	{
+	return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Update statement
+	 *
+	 * Generates a platform-specific update string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the update data
+	 * @param	array	the where clause
+	 * @param	array	the orderby clause
+	 * @param	array	the limit clause
+	 * @return	string
+	 */
+	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+	{
+		foreach($values as $key => $val)
+		{
+			$valstr[] = $key." = ".$val;
+		}
+		
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+		
+		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+	
+		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+		$sql .= $orderby.$limit;
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Truncate statement
+	 *
+	 * Generates a platform-specific truncate string from the supplied data
+	 * If the database does not support the truncate() command
+	 * This function maps to "DELETE FROM table"
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string
+	 */	
+	function _truncate($table)
+	{
+		return "TRUNCATE TABLE ".$table;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete statement
+	 *
+	 * Generates a platform-specific delete string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the where clause
+	 * @param	string	the limit clause
+	 * @return	string
+	 */	
+	function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+	{
+		$conditions = '';
+
+		if (count($where) > 0 OR count($like) > 0)
+		{
+			$conditions = "\nWHERE ";
+			$conditions .= implode("\n", $this->ar_where);
+
+			if (count($where) > 0 && count($like) > 0)
+			{
+				$conditions .= " AND ";
+			}
+			$conditions .= implode("\n", $like);
+		}
+
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+	
+		return "DELETE FROM ".$table.$conditions.$limit;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Limit string
+	 *
+	 * Generates a platform-specific LIMIT clause
+	 *
+	 * @access  public
+	 * @param   string  the sql query string
+	 * @param   integer the number of rows to limit the query to
+	 * @param   integer the offset value
+	 * @return  string
+	 */
+	function _limit($sql, $limit, $offset)
+	{
+		$limit = $offset + $limit;
+		$newsql = "SELECT * FROM (select inner_query.*, rownum rnum FROM ($sql) inner_query WHERE rownum < $limit)";
+
+		if ($offset != 0)
+		{
+			$newsql .= " WHERE rnum >= $offset";
+		}
+
+		// remember that we used limits
+		$this->limit_used = TRUE;
+
+		return $newsql;
+	}	
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Close DB Connection
+	 *
+	 * @access  public
+	 * @param   resource
+	 * @return  void
+	 */
+	function _close($conn_id)
+	{
+		@ocilogoff($conn_id);
+	}
+
+
+}
+
+
+
+/* End of file oci8_driver.php */
 /* Location: ./system/database/drivers/oci8/oci8_driver.php */
\ No newline at end of file
diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php
index 4b073d0..bbc11f3 100644
--- a/system/database/drivers/oci8/oci8_forge.php
+++ b/system/database/drivers/oci8/oci8_forge.php
@@ -1,248 +1,248 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Oracle Forge Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_oci8_forge extends CI_DB_forge {

-

-	/**

-	 * Create database

-	 *

-	 * @access	public

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database($name)

-	{

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Create Table

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @param	array	the fields

-	 * @param	mixed	primary key(s)

-	 * @param	mixed	key(s)

-	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL

-	 * @return	bool

-	 */

-	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)

-	{

-		$sql = 'CREATE TABLE ';

-		

-		if ($if_not_exists === TRUE)

-		{

-			$sql .= 'IF NOT EXISTS ';

-		}

-		

-		$sql .= $this->db->_escape_identifiers($table)." (";

-		$current_field_count = 0;

-

-		foreach ($fields as $field=>$attributes)

-		{

-			// Numeric field names aren't allowed in databases, so if the key is

-			// numeric, we know it was assigned by PHP and the developer manually

-			// entered the field information, so we'll simply add it to the list

-			if (is_numeric($field))

-			{

-				$sql .= "\n\t$attributes";

-			}

-			else

-			{

-				$attributes = array_change_key_case($attributes, CASE_UPPER);

-				

-				$sql .= "\n\t".$this->db->_protect_identifiers($field);

-				

-				$sql .=  ' '.$attributes['TYPE'];

-	

-				if (array_key_exists('CONSTRAINT', $attributes))

-				{

-					$sql .= '('.$attributes['CONSTRAINT'].')';

-				}

-	

-				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)

-				{

-					$sql .= ' UNSIGNED';

-				}

-	

-				if (array_key_exists('DEFAULT', $attributes))

-				{

-					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';

-				}

-	

-				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)

-				{

-					$sql .= ' NULL';

-				}

-				else

-				{

-					$sql .= ' NOT NULL';			

-				}

-	

-				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)

-				{

-					$sql .= ' AUTO_INCREMENT';

-				}

-			}

-			

-			// don't add a comma on the end of the last field

-			if (++$current_field_count < count($fields))

-			{

-				$sql .= ',';

-			}

-		}

-

-		if (count($primary_keys) > 0)

-		{

-			$primary_keys = $this->db->_protect_identifiers($primary_keys);

-			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";

-		}

-

-		if (is_array($keys) && count($keys) > 0)

-		{

-			foreach ($keys as $key)

-			{

-				if (is_array($key))

-				{

-					$key = $this->db->_protect_identifiers($key);	

-				}

-				else

-				{

-					$key = array($this->db->_protect_identifiers($key));

-				}

-				

-				$sql .= ",\n\tUNIQUE COLUMNS (" . implode(', ', $key) . ")";

-			}

-		}

-		

-		$sql .= "\n)";

-

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop Table

-	 *

-	 * @access	private

-	 * @return	bool

-	 */

-	function _drop_table($table)

-	{

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Alter table query

-	 *

-	 * Generates a platform-specific query so that a table can be altered

-	 * Called by add_column(), drop_column(), and column_alter(),

-	 *

-	 * @access	private

-	 * @param	string	the ALTER type (ADD, DROP, CHANGE)

-	 * @param	string	the column name

-	 * @param	string	the table name

-	 * @param	string	the column definition

-	 * @param	string	the default value

-	 * @param	boolean	should 'NOT NULL' be added

-	 * @param	string	the field after which we should add the new field

-	 * @return	object

-	 */

-	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);

-

-		// DROP has everything it needs now.

-		if ($alter_type == 'DROP')

-		{

-			return $sql;

-		}

-

-		$sql .= " $column_definition";

-

-		if ($default_value != '')

-		{

-			$sql .= " DEFAULT \"$default_value\"";

-		}

-

-		if ($null === NULL)

-		{

-			$sql .= ' NULL';

-		}

-		else

-		{

-			$sql .= ' NOT NULL';

-		}

-

-		if ($after_field != '')

-		{

-			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);

-		}

-		

-		return $sql;

-		

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rename a table

-	 *

-	 * Generates a platform-specific query so that a table can be renamed

-	 *

-	 * @access	private

-	 * @param	string	the old table name

-	 * @param	string	the new table name

-	 * @return	string

-	 */

-	function _rename_table($table_name, $new_table_name)

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);

-		return $sql;

-	}

-

-

-}

-

-/* End of file oci8_forge.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Oracle Forge Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_oci8_forge extends CI_DB_forge {
+
+	/**
+	 * Create database
+	 *
+	 * @access	public
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database($name)
+	{
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Create Table
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @param	array	the fields
+	 * @param	mixed	primary key(s)
+	 * @param	mixed	key(s)
+	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL
+	 * @return	bool
+	 */
+	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+	{
+		$sql = 'CREATE TABLE ';
+		
+		if ($if_not_exists === TRUE)
+		{
+			$sql .= 'IF NOT EXISTS ';
+		}
+		
+		$sql .= $this->db->_escape_identifiers($table)." (";
+		$current_field_count = 0;
+
+		foreach ($fields as $field=>$attributes)
+		{
+			// Numeric field names aren't allowed in databases, so if the key is
+			// numeric, we know it was assigned by PHP and the developer manually
+			// entered the field information, so we'll simply add it to the list
+			if (is_numeric($field))
+			{
+				$sql .= "\n\t$attributes";
+			}
+			else
+			{
+				$attributes = array_change_key_case($attributes, CASE_UPPER);
+				
+				$sql .= "\n\t".$this->db->_protect_identifiers($field);
+				
+				$sql .=  ' '.$attributes['TYPE'];
+	
+				if (array_key_exists('CONSTRAINT', $attributes))
+				{
+					$sql .= '('.$attributes['CONSTRAINT'].')';
+				}
+	
+				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+				{
+					$sql .= ' UNSIGNED';
+				}
+	
+				if (array_key_exists('DEFAULT', $attributes))
+				{
+					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+				}
+	
+				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
+				{
+					$sql .= ' NULL';
+				}
+				else
+				{
+					$sql .= ' NOT NULL';			
+				}
+	
+				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+				{
+					$sql .= ' AUTO_INCREMENT';
+				}
+			}
+			
+			// don't add a comma on the end of the last field
+			if (++$current_field_count < count($fields))
+			{
+				$sql .= ',';
+			}
+		}
+
+		if (count($primary_keys) > 0)
+		{
+			$primary_keys = $this->db->_protect_identifiers($primary_keys);
+			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
+		}
+
+		if (is_array($keys) && count($keys) > 0)
+		{
+			foreach ($keys as $key)
+			{
+				if (is_array($key))
+				{
+					$key = $this->db->_protect_identifiers($key);	
+				}
+				else
+				{
+					$key = array($this->db->_protect_identifiers($key));
+				}
+				
+				$sql .= ",\n\tUNIQUE COLUMNS (" . implode(', ', $key) . ")";
+			}
+		}
+		
+		$sql .= "\n)";
+
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop Table
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _drop_table($table)
+	{
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Alter table query
+	 *
+	 * Generates a platform-specific query so that a table can be altered
+	 * Called by add_column(), drop_column(), and column_alter(),
+	 *
+	 * @access	private
+	 * @param	string	the ALTER type (ADD, DROP, CHANGE)
+	 * @param	string	the column name
+	 * @param	string	the table name
+	 * @param	string	the column definition
+	 * @param	string	the default value
+	 * @param	boolean	should 'NOT NULL' be added
+	 * @param	string	the field after which we should add the new field
+	 * @return	object
+	 */
+	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
+
+		// DROP has everything it needs now.
+		if ($alter_type == 'DROP')
+		{
+			return $sql;
+		}
+
+		$sql .= " $column_definition";
+
+		if ($default_value != '')
+		{
+			$sql .= " DEFAULT \"$default_value\"";
+		}
+
+		if ($null === NULL)
+		{
+			$sql .= ' NULL';
+		}
+		else
+		{
+			$sql .= ' NOT NULL';
+		}
+
+		if ($after_field != '')
+		{
+			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+		}
+		
+		return $sql;
+		
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rename a table
+	 *
+	 * Generates a platform-specific query so that a table can be renamed
+	 *
+	 * @access	private
+	 * @param	string	the old table name
+	 * @param	string	the new table name
+	 * @return	string
+	 */
+	function _rename_table($table_name, $new_table_name)
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+		return $sql;
+	}
+
+
+}
+
+/* End of file oci8_forge.php */
 /* Location: ./system/database/drivers/oci8/oci8_forge.php */
\ No newline at end of file
diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php
index 4cfbfa4..7d7cd1c 100644
--- a/system/database/drivers/oci8/oci8_result.php
+++ b/system/database/drivers/oci8/oci8_result.php
@@ -1,249 +1,249 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package	 	CodeIgniter

- * @author	 	ExpressionEngine Dev Team

- * @copyright   Copyright (c) 2008, EllisLab, Inc.

- * @license	 	http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since	   	Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * oci8 Result Class

- *

- * This class extends the parent result class: CI_DB_result

- *

- * @category	Database

- * @author	 	ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_oci8_result extends CI_DB_result {

-

-	var $stmt_id;

-	var $curs_id;

-	var $limit_used;

-

-	/**

-	 * Number of rows in the result set.

-	 *

-	 * Oracle doesn't have a graceful way to retun the number of rows

-	 * so we have to use what amounts to a hack.

-	 * 

-	 *

-	 * @access  public

-	 * @return  integer

-	 */

-	function num_rows()

-	{

-		$rowcount = count($this->result_array());

-		@ociexecute($this->stmt_id);

-

-		if ($this->curs_id)

-		{

-			@ociexecute($this->curs_id);

-		}

-

-		return $rowcount;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Number of fields in the result set

-	 *

-	 * @access  public

-	 * @return  integer

-	 */

-	function num_fields()

-	{

-		$count = @ocinumcols($this->stmt_id);

-

-		// if we used a limit we subtract it

-		if ($this->limit_used)

-		{

-			$count = $count - 1;

-		}

-

-		return $count;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Fetch Field Names

-	 *

-	 * Generates an array of column names

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function list_fields()

-	{

-		$field_names = array();

-		$fieldCount = $this->num_fields();

-		for ($c = 1; $c <= $fieldCount; $c++)

-		{

-			$field_names[] = ocicolumnname($this->stmt_id, $c);

-		}

-		return $field_names;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data

-	 *

-	 * Generates an array of objects containing field meta-data

-	 *

-	 * @access  public

-	 * @return  array

-	 */

-	function field_data()

-	{

-		$retval = array();

-		$fieldCount = $this->num_fields();

-		for ($c = 1; $c <= $fieldCount; $c++)

-		{

-			$F			  = new stdClass();

-			$F->name		= ocicolumnname($this->stmt_id, $c);

-			$F->type		= ocicolumntype($this->stmt_id, $c);

-			$F->max_length  = ocicolumnsize($this->stmt_id, $c);

-

-			$retval[] = $F;

-		}

-

-		return $retval;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Free the result

-	 *

-	 * @return	null

-	 */		

-	function free_result()

-	{

-		if (is_resource($this->result_id))

-		{

-			ocifreestatement($this->result_id);			

-			$this->result_id = FALSE;

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - associative array

-	 *

-	 * Returns the result set as an array

-	 *

-	 * @access  private

-	 * @return  array

-	 */

-	function _fetch_assoc(&$row)

-	{

-		$id = ($this->curs_id) ? $this->curs_id : $this->stmt_id;

-	

-		return ocifetchinto($id, $row, OCI_ASSOC + OCI_RETURN_NULLS);	

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - object

-	 *

-	 * Returns the result set as an object

-	 *

-	 * @access  private

-	 * @return  object

-	 */

-	function _fetch_object()

-	{	

-		$result = array();

-

-		// If PHP 5 is being used we can fetch an result object

-		if (function_exists('oci_fetch_object'))

-		{

-			$id = ($this->curs_id) ? $this->curs_id : $this->stmt_id;

-			

-			return @oci_fetch_object($id);

-		}

-		

-		// If PHP 4 is being used we have to build our own result

-		foreach ($this->result_array() as $key => $val)

-		{

-			$obj = new stdClass();

-			if (is_array($val))

-			{

-				foreach ($val as $k => $v)

-				{

-					$obj->$k = $v;

-				}

-			}

-			else

-			{

-				$obj->$key = $val;

-			}

-			

-			$result[] = $obj;

-		}

-

-		return $result;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Query result.  "array" version.

-	 *

-	 * @access  public

-	 * @return  array

-	 */

-	function result_array()

-	{

-		if (count($this->result_array) > 0)

-		{

-			return $this->result_array;

-		}

-

-		// oracle's fetch functions do not return arrays.

-		// The information is returned in reference parameters

-		$row = NULL;

-		while ($this->_fetch_assoc($row))

-		{

-			$this->result_array[] = $row;

-		}

-

-		return $this->result_array;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Data Seek

-	 *

-	 * Moves the internal pointer to the desired offset.  We call

-	 * this internally before fetching results to make sure the

-	 * result set starts at zero

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _data_seek($n = 0)

-	{

-		return FALSE; // Not needed

-	}

-

-}

-

-

-/* End of file oci8_result.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package	 	CodeIgniter
+ * @author	 	ExpressionEngine Dev Team
+ * @copyright   Copyright (c) 2008, EllisLab, Inc.
+ * @license	 	http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since	   	Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * oci8 Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category	Database
+ * @author	 	ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_oci8_result extends CI_DB_result {
+
+	var $stmt_id;
+	var $curs_id;
+	var $limit_used;
+
+	/**
+	 * Number of rows in the result set.
+	 *
+	 * Oracle doesn't have a graceful way to retun the number of rows
+	 * so we have to use what amounts to a hack.
+	 * 
+	 *
+	 * @access  public
+	 * @return  integer
+	 */
+	function num_rows()
+	{
+		$rowcount = count($this->result_array());
+		@ociexecute($this->stmt_id);
+
+		if ($this->curs_id)
+		{
+			@ociexecute($this->curs_id);
+		}
+
+		return $rowcount;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Number of fields in the result set
+	 *
+	 * @access  public
+	 * @return  integer
+	 */
+	function num_fields()
+	{
+		$count = @ocinumcols($this->stmt_id);
+
+		// if we used a limit we subtract it
+		if ($this->limit_used)
+		{
+			$count = $count - 1;
+		}
+
+		return $count;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Fetch Field Names
+	 *
+	 * Generates an array of column names
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function list_fields()
+	{
+		$field_names = array();
+		$fieldCount = $this->num_fields();
+		for ($c = 1; $c <= $fieldCount; $c++)
+		{
+			$field_names[] = ocicolumnname($this->stmt_id, $c);
+		}
+		return $field_names;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data
+	 *
+	 * Generates an array of objects containing field meta-data
+	 *
+	 * @access  public
+	 * @return  array
+	 */
+	function field_data()
+	{
+		$retval = array();
+		$fieldCount = $this->num_fields();
+		for ($c = 1; $c <= $fieldCount; $c++)
+		{
+			$F			  = new stdClass();
+			$F->name		= ocicolumnname($this->stmt_id, $c);
+			$F->type		= ocicolumntype($this->stmt_id, $c);
+			$F->max_length  = ocicolumnsize($this->stmt_id, $c);
+
+			$retval[] = $F;
+		}
+
+		return $retval;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Free the result
+	 *
+	 * @return	null
+	 */		
+	function free_result()
+	{
+		if (is_resource($this->result_id))
+		{
+			ocifreestatement($this->result_id);			
+			$this->result_id = FALSE;
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - associative array
+	 *
+	 * Returns the result set as an array
+	 *
+	 * @access  private
+	 * @return  array
+	 */
+	function _fetch_assoc(&$row)
+	{
+		$id = ($this->curs_id) ? $this->curs_id : $this->stmt_id;
+	
+		return ocifetchinto($id, $row, OCI_ASSOC + OCI_RETURN_NULLS);	
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - object
+	 *
+	 * Returns the result set as an object
+	 *
+	 * @access  private
+	 * @return  object
+	 */
+	function _fetch_object()
+	{	
+		$result = array();
+
+		// If PHP 5 is being used we can fetch an result object
+		if (function_exists('oci_fetch_object'))
+		{
+			$id = ($this->curs_id) ? $this->curs_id : $this->stmt_id;
+			
+			return @oci_fetch_object($id);
+		}
+		
+		// If PHP 4 is being used we have to build our own result
+		foreach ($this->result_array() as $key => $val)
+		{
+			$obj = new stdClass();
+			if (is_array($val))
+			{
+				foreach ($val as $k => $v)
+				{
+					$obj->$k = $v;
+				}
+			}
+			else
+			{
+				$obj->$key = $val;
+			}
+			
+			$result[] = $obj;
+		}
+
+		return $result;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Query result.  "array" version.
+	 *
+	 * @access  public
+	 * @return  array
+	 */
+	function result_array()
+	{
+		if (count($this->result_array) > 0)
+		{
+			return $this->result_array;
+		}
+
+		// oracle's fetch functions do not return arrays.
+		// The information is returned in reference parameters
+		$row = NULL;
+		while ($this->_fetch_assoc($row))
+		{
+			$this->result_array[] = $row;
+		}
+
+		return $this->result_array;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Data Seek
+	 *
+	 * Moves the internal pointer to the desired offset.  We call
+	 * this internally before fetching results to make sure the
+	 * result set starts at zero
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _data_seek($n = 0)
+	{
+		return FALSE; // Not needed
+	}
+
+}
+
+
+/* End of file oci8_result.php */
 /* Location: ./system/database/drivers/oci8/oci8_result.php */
\ No newline at end of file
diff --git a/system/database/drivers/oci8/oci8_utility.php b/system/database/drivers/oci8/oci8_utility.php
index a3b6d81..cf6e9e6 100644
--- a/system/database/drivers/oci8/oci8_utility.php
+++ b/system/database/drivers/oci8/oci8_utility.php
@@ -1,122 +1,122 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Oracle Utility Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_oci8_utility extends CI_DB_utility {

-

-	/**

-	 * List databases

-	 *

-	 * @access	private

-	 * @return	bool

-	 */

-	function _list_databases()

-	{

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Optimize table query

-	 *

-	 * Generates a platform-specific query so that a table can be optimized

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _optimize_table($table)

-	{

-		return FALSE; // Is this supported in Oracle?

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Repair table query

-	 *

-	 * Generates a platform-specific query so that a table can be repaired

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _repair_table($table)

-	{

-		return FALSE; // Is this supported in Oracle?

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Oracle Export

-	 *

-	 * @access	private

-	 * @param	array	Preferences

-	 * @return	mixed

-	 */

-	function _backup($params = array())

-	{

-		// Currently unsupported

-		return $this->db->display_error('db_unsuported_feature');

-	}

-

-	/**

-	 *

-	 * The functions below have been deprecated as of 1.6, and are only here for backwards

-	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation

-	 * is STRONGLY discouraged in favour if using dbforge.

-	 *

-	 */

-

-	/**

-	 * Create database

-	 *

-	 * @access	public

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database($name)

-	{

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		return FALSE;

-	}

-

-}

-

-/* End of file oci8_utility.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Oracle Utility Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_oci8_utility extends CI_DB_utility {
+
+	/**
+	 * List databases
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _list_databases()
+	{
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Optimize table query
+	 *
+	 * Generates a platform-specific query so that a table can be optimized
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _optimize_table($table)
+	{
+		return FALSE; // Is this supported in Oracle?
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Repair table query
+	 *
+	 * Generates a platform-specific query so that a table can be repaired
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _repair_table($table)
+	{
+		return FALSE; // Is this supported in Oracle?
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Oracle Export
+	 *
+	 * @access	private
+	 * @param	array	Preferences
+	 * @return	mixed
+	 */
+	function _backup($params = array())
+	{
+		// Currently unsupported
+		return $this->db->display_error('db_unsuported_feature');
+	}
+
+	/**
+	 *
+	 * The functions below have been deprecated as of 1.6, and are only here for backwards
+	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation
+	 * is STRONGLY discouraged in favour if using dbforge.
+	 *
+	 */
+
+	/**
+	 * Create database
+	 *
+	 * @access	public
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database($name)
+	{
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		return FALSE;
+	}
+
+}
+
+/* End of file oci8_utility.php */
 /* Location: ./system/database/drivers/oci8/oci8_utility.php */
\ No newline at end of file
diff --git a/system/database/drivers/odbc/index.html b/system/database/drivers/odbc/index.html
index 065d2da..c942a79 100644
--- a/system/database/drivers/odbc/index.html
+++ b/system/database/drivers/odbc/index.html
@@ -1,10 +1,10 @@
-<html>

-<head>

-	<title>403 Forbidden</title>

-</head>

-<body>

-

-<p>Directory access is forbidden.</p>

-

-</body>

+<html>
+<head>
+	<title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
 </html>
\ No newline at end of file
diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php
index 3c6f015..8fcbcfe 100644
--- a/system/database/drivers/odbc/odbc_driver.php
+++ b/system/database/drivers/odbc/odbc_driver.php
@@ -1,594 +1,594 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * ODBC Database Adapter Class

- *

- * Note: _DB is an extender class that the app controller

- * creates dynamically based on whether the active record

- * class is being used or not.

- *

- * @package		CodeIgniter

- * @subpackage	Drivers

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_odbc_driver extends CI_DB {

-

-	var $dbdriver = 'odbc';

-	

-	// the character used to excape - not necessary for ODBC

-	var $_escape_char = '';

-

-	/**

-	 * The syntax to count rows is slightly different across different

-	 * database engines, so this string appears in each driver and is

-	 * used for the count_all() and count_all_results() functions.

-	 */

-	var $_count_string = "SELECT COUNT(*) AS ";

-	var $_random_keyword;

-

-

-	function CI_DB_odbc_driver($params)

-	{

-		parent::CI_DB($params);

-		

-		$this->_random_keyword = ' RND('.time().')'; // database specific random keyword

-	}

-

-	/**

-	 * Non-persistent database connection

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_connect()

-	{

-		return @odbc_connect($this->hostname, $this->username, $this->password);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Persistent database connection

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_pconnect()

-	{

-		return @odbc_pconnect($this->hostname, $this->username, $this->password);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Select the database

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_select()

-	{

-		// Not needed for ODBC

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Set client character set

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @return	resource

-	 */

-	function db_set_charset($charset, $collation)

-	{

-		// @todo - add support if needed

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Version number query string

-	 *

-	 * @access	public

-	 * @return	string

-	 */

-	function _version()

-	{

-		return "SELECT version() AS ver";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Execute the query

-	 *

-	 * @access	private called by the base class

-	 * @param	string	an SQL query

-	 * @return	resource

-	 */	

-	function _execute($sql)

-	{

-		$sql = $this->_prep_query($sql);

-		return @odbc_exec($this->conn_id, $sql);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Prep the query

-	 *

-	 * If needed, each database adapter can prep the query string

-	 *

-	 * @access	private called by execute()

-	 * @param	string	an SQL query

-	 * @return	string

-	 */	

-	function _prep_query($sql)

-	{

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Begin Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_begin($test_mode = FALSE)

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-		

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		// Reset the transaction failure flag.

-		// If the $test_mode flag is set to TRUE transactions will be rolled back

-		// even if the queries produce a successful result.

-		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;

-

-		return odbc_autocommit($this->conn_id, FALSE);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Commit Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_commit()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		$ret = odbc_commit($this->conn_id);

-		odbc_autocommit($this->conn_id, TRUE);

-		return $ret;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rollback Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_rollback()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		$ret = odbc_rollback($this->conn_id);

-		odbc_autocommit($this->conn_id, TRUE);

-		return $ret;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape String

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function escape_str($str)	

-	{

-		// Access the CI object

-		$CI =& get_instance();

-

-		// ODBC doesn't require escaping

-		return $CI->_remove_invisible_characters($str);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Affected Rows

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function affected_rows()

-	{

-		return @odbc_num_rows($this->conn_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Insert ID

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function insert_id()

-	{

-		return @odbc_insert_id($this->conn_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * "Count All" query

-	 *

-	 * Generates a platform-specific query string that counts all records in

-	 * the specified database

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function count_all($table = '')

-	{

-		if ($table == '')

-			return '0';

-	

-		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));

-	

-		if ($query->num_rows() == 0)

-			return '0';

-

-		$row = $query->row();

-		return $row->numrows;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Show table query

-	 *

-	 * Generates a platform-specific query string so that the table names can be fetched

-	 *

-	 * @access	private

-	 * @param	boolean

-	 * @return	string

-	 */

-	function _list_tables($prefix_limit = FALSE)

-	{

-		$sql = "SHOW TABLES FROM `".$this->database."`";

-

-		if ($prefix_limit !== FALSE AND $this->dbprefix != '')

-		{

-			//$sql .= " LIKE '".$this->dbprefix."%'";

-			return FALSE; // not currently supported

-		}

-		

-		return $sql;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Show column query

-	 *

-	 * Generates a platform-specific query string so that the column names can be fetched

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string

-	 */

-	function _list_columns($table = '')

-	{

-		return "SHOW COLUMNS FROM ".$table;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data query

-	 *

-	 * Generates a platform-specific query so that the column data can be retrieved

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _field_data($table)

-	{

-		return "SELECT TOP 1 FROM ".$table;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message string

-	 *

-	 * @access	private

-	 * @return	string

-	 */

-	function _error_message()

-	{

-		return odbc_errormsg($this->conn_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message number

-	 *

-	 * @access	private

-	 * @return	integer

-	 */

-	function _error_number()

-	{

-		return odbc_error($this->conn_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape the SQL Identifiers

-	 *

-	 * This function escapes column and table names

-	 *

-	 * @access	private

-	 * @param	string

-	 * @return	string

-	 */

-	function _escape_identifiers($item)

-	{

-		if ($this->_escape_char == '')

-		{

-			return $item;

-		}

-

-		foreach ($this->_reserved_identifiers as $id)

-		{

-			if (strpos($item, '.'.$id) !== FALSE)

-			{

-				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  

-				

-				// remove duplicates if the user already included the escape

-				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-			}		

-		}

-	

-		if (strpos($item, '.') !== FALSE)

-		{

-			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			

-		}

-		else

-		{

-			$str = $this->_escape_char.$item.$this->_escape_char;

-		}

-		

-		// remove duplicates if the user already included the escape

-		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-	}

-			

-	// --------------------------------------------------------------------

-

-	/**

-	 * From Tables

-	 *

-	 * This function implicitly groups FROM tables so there is no confusion

-	 * about operator precedence in harmony with SQL standards

-	 *

-	 * @access	public

-	 * @param	type

-	 * @return	type

-	 */

-	function _from_tables($tables)

-	{

-		if ( ! is_array($tables))

-		{

-			$tables = array($tables);

-		}

-		

-		return '('.implode(', ', $tables).')';

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Insert statement

-	 *

-	 * Generates a platform-specific insert string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the insert keys

-	 * @param	array	the insert values

-	 * @return	string

-	 */

-	function _insert($table, $keys, $values)

-	{	

-		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Update statement

-	 *

-	 * Generates a platform-specific update string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the update data

-	 * @param	array	the where clause

-	 * @param	array	the orderby clause

-	 * @param	array	the limit clause

-	 * @return	string

-	 */

-	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)

-	{

-		foreach($values as $key => $val)

-		{

-			$valstr[] = $key." = ".$val;

-		}

-		

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-		

-		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';

-	

-		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);

-

-		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';

-

-		$sql .= $orderby.$limit;

-		

-		return $sql;

-	}

-

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Truncate statement

-	 *

-	 * Generates a platform-specific truncate string from the supplied data

-	 * If the database does not support the truncate() command

-	 * This function maps to "DELETE FROM table"

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string

-	 */	

-	function _truncate($table)

-	{

-		return $this->_delete($table);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete statement

-	 *

-	 * Generates a platform-specific delete string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the where clause

-	 * @param	string	the limit clause

-	 * @return	string

-	 */	

-	function _delete($table, $where = array(), $like = array(), $limit = FALSE)

-	{

-		$conditions = '';

-

-		if (count($where) > 0 OR count($like) > 0)

-		{

-			$conditions = "\nWHERE ";

-			$conditions .= implode("\n", $this->ar_where);

-

-			if (count($where) > 0 && count($like) > 0)

-			{

-				$conditions .= " AND ";

-			}

-			$conditions .= implode("\n", $like);

-		}

-

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-	

-		return "DELETE FROM ".$table.$conditions.$limit;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Limit string

-	 *

-	 * Generates a platform-specific LIMIT clause

-	 *

-	 * @access	public

-	 * @param	string	the sql query string

-	 * @param	integer	the number of rows to limit the query to

-	 * @param	integer	the offset value

-	 * @return	string

-	 */

-	function _limit($sql, $limit, $offset)

-	{

-		// Does ODBC doesn't use the LIMIT clause?

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Close DB Connection

-	 *

-	 * @access	public

-	 * @param	resource

-	 * @return	void

-	 */

-	function _close($conn_id)

-	{

-		@odbc_close($conn_id);

-	}

-

-	

-}

-

-

-

-/* End of file odbc_driver.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * ODBC Database Adapter Class
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package		CodeIgniter
+ * @subpackage	Drivers
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_odbc_driver extends CI_DB {
+
+	var $dbdriver = 'odbc';
+	
+	// the character used to excape - not necessary for ODBC
+	var $_escape_char = '';
+
+	/**
+	 * The syntax to count rows is slightly different across different
+	 * database engines, so this string appears in each driver and is
+	 * used for the count_all() and count_all_results() functions.
+	 */
+	var $_count_string = "SELECT COUNT(*) AS ";
+	var $_random_keyword;
+
+
+	function CI_DB_odbc_driver($params)
+	{
+		parent::CI_DB($params);
+		
+		$this->_random_keyword = ' RND('.time().')'; // database specific random keyword
+	}
+
+	/**
+	 * Non-persistent database connection
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_connect()
+	{
+		return @odbc_connect($this->hostname, $this->username, $this->password);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Persistent database connection
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_pconnect()
+	{
+		return @odbc_pconnect($this->hostname, $this->username, $this->password);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Select the database
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_select()
+	{
+		// Not needed for ODBC
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set client character set
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @return	resource
+	 */
+	function db_set_charset($charset, $collation)
+	{
+		// @todo - add support if needed
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Version number query string
+	 *
+	 * @access	public
+	 * @return	string
+	 */
+	function _version()
+	{
+		return "SELECT version() AS ver";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Execute the query
+	 *
+	 * @access	private called by the base class
+	 * @param	string	an SQL query
+	 * @return	resource
+	 */	
+	function _execute($sql)
+	{
+		$sql = $this->_prep_query($sql);
+		return @odbc_exec($this->conn_id, $sql);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Prep the query
+	 *
+	 * If needed, each database adapter can prep the query string
+	 *
+	 * @access	private called by execute()
+	 * @param	string	an SQL query
+	 * @return	string
+	 */	
+	function _prep_query($sql)
+	{
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Begin Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_begin($test_mode = FALSE)
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+		
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		// Reset the transaction failure flag.
+		// If the $test_mode flag is set to TRUE transactions will be rolled back
+		// even if the queries produce a successful result.
+		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+
+		return odbc_autocommit($this->conn_id, FALSE);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Commit Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_commit()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		$ret = odbc_commit($this->conn_id);
+		odbc_autocommit($this->conn_id, TRUE);
+		return $ret;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rollback Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_rollback()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		$ret = odbc_rollback($this->conn_id);
+		odbc_autocommit($this->conn_id, TRUE);
+		return $ret;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape String
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function escape_str($str)	
+	{
+		// Access the CI object
+		$CI =& get_instance();
+
+		// ODBC doesn't require escaping
+		return $CI->_remove_invisible_characters($str);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Affected Rows
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function affected_rows()
+	{
+		return @odbc_num_rows($this->conn_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Insert ID
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function insert_id()
+	{
+		return @odbc_insert_id($this->conn_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * "Count All" query
+	 *
+	 * Generates a platform-specific query string that counts all records in
+	 * the specified database
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function count_all($table = '')
+	{
+		if ($table == '')
+			return '0';
+	
+		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+	
+		if ($query->num_rows() == 0)
+			return '0';
+
+		$row = $query->row();
+		return $row->numrows;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Show table query
+	 *
+	 * Generates a platform-specific query string so that the table names can be fetched
+	 *
+	 * @access	private
+	 * @param	boolean
+	 * @return	string
+	 */
+	function _list_tables($prefix_limit = FALSE)
+	{
+		$sql = "SHOW TABLES FROM `".$this->database."`";
+
+		if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+		{
+			//$sql .= " LIKE '".$this->dbprefix."%'";
+			return FALSE; // not currently supported
+		}
+		
+		return $sql;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Show column query
+	 *
+	 * Generates a platform-specific query string so that the column names can be fetched
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string
+	 */
+	function _list_columns($table = '')
+	{
+		return "SHOW COLUMNS FROM ".$table;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data query
+	 *
+	 * Generates a platform-specific query so that the column data can be retrieved
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _field_data($table)
+	{
+		return "SELECT TOP 1 FROM ".$table;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message string
+	 *
+	 * @access	private
+	 * @return	string
+	 */
+	function _error_message()
+	{
+		return odbc_errormsg($this->conn_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message number
+	 *
+	 * @access	private
+	 * @return	integer
+	 */
+	function _error_number()
+	{
+		return odbc_error($this->conn_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape the SQL Identifiers
+	 *
+	 * This function escapes column and table names
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	string
+	 */
+	function _escape_identifiers($item)
+	{
+		if ($this->_escape_char == '')
+		{
+			return $item;
+		}
+
+		foreach ($this->_reserved_identifiers as $id)
+		{
+			if (strpos($item, '.'.$id) !== FALSE)
+			{
+				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  
+				
+				// remove duplicates if the user already included the escape
+				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+			}		
+		}
+	
+		if (strpos($item, '.') !== FALSE)
+		{
+			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			
+		}
+		else
+		{
+			$str = $this->_escape_char.$item.$this->_escape_char;
+		}
+		
+		// remove duplicates if the user already included the escape
+		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+	}
+			
+	// --------------------------------------------------------------------
+
+	/**
+	 * From Tables
+	 *
+	 * This function implicitly groups FROM tables so there is no confusion
+	 * about operator precedence in harmony with SQL standards
+	 *
+	 * @access	public
+	 * @param	type
+	 * @return	type
+	 */
+	function _from_tables($tables)
+	{
+		if ( ! is_array($tables))
+		{
+			$tables = array($tables);
+		}
+		
+		return '('.implode(', ', $tables).')';
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Insert statement
+	 *
+	 * Generates a platform-specific insert string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the insert keys
+	 * @param	array	the insert values
+	 * @return	string
+	 */
+	function _insert($table, $keys, $values)
+	{	
+		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Update statement
+	 *
+	 * Generates a platform-specific update string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the update data
+	 * @param	array	the where clause
+	 * @param	array	the orderby clause
+	 * @param	array	the limit clause
+	 * @return	string
+	 */
+	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+	{
+		foreach($values as $key => $val)
+		{
+			$valstr[] = $key." = ".$val;
+		}
+		
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+		
+		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+	
+		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+		$sql .= $orderby.$limit;
+		
+		return $sql;
+	}
+
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Truncate statement
+	 *
+	 * Generates a platform-specific truncate string from the supplied data
+	 * If the database does not support the truncate() command
+	 * This function maps to "DELETE FROM table"
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string
+	 */	
+	function _truncate($table)
+	{
+		return $this->_delete($table);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete statement
+	 *
+	 * Generates a platform-specific delete string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the where clause
+	 * @param	string	the limit clause
+	 * @return	string
+	 */	
+	function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+	{
+		$conditions = '';
+
+		if (count($where) > 0 OR count($like) > 0)
+		{
+			$conditions = "\nWHERE ";
+			$conditions .= implode("\n", $this->ar_where);
+
+			if (count($where) > 0 && count($like) > 0)
+			{
+				$conditions .= " AND ";
+			}
+			$conditions .= implode("\n", $like);
+		}
+
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+	
+		return "DELETE FROM ".$table.$conditions.$limit;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Limit string
+	 *
+	 * Generates a platform-specific LIMIT clause
+	 *
+	 * @access	public
+	 * @param	string	the sql query string
+	 * @param	integer	the number of rows to limit the query to
+	 * @param	integer	the offset value
+	 * @return	string
+	 */
+	function _limit($sql, $limit, $offset)
+	{
+		// Does ODBC doesn't use the LIMIT clause?
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Close DB Connection
+	 *
+	 * @access	public
+	 * @param	resource
+	 * @return	void
+	 */
+	function _close($conn_id)
+	{
+		@odbc_close($conn_id);
+	}
+
+	
+}
+
+
+
+/* End of file odbc_driver.php */
 /* Location: ./system/database/drivers/odbc/odbc_driver.php */
\ No newline at end of file
diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php
index 099925c..5305afb 100644
--- a/system/database/drivers/odbc/odbc_forge.php
+++ b/system/database/drivers/odbc/odbc_forge.php
@@ -1,266 +1,266 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * ODBC Forge Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/database/

- */

-class CI_DB_odbc_forge extends CI_DB_forge {

-

-	/**

-	 * Create database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database()

-	{

-		// ODBC has no "create database" command since it's

-		// designed to connect to an existing database

-		if ($this->db->db_debug)

-		{

-			return $this->db->display_error('db_unsuported_feature');

-		}

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		// ODBC has no "drop database" command since it's

-		// designed to connect to an existing database		

-		if ($this->db->db_debug)

-		{

-			return $this->db->display_error('db_unsuported_feature');

-		}

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Create Table

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @param	array	the fields

-	 * @param	mixed	primary key(s)

-	 * @param	mixed	key(s)

-	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL

-	 * @return	bool

-	 */

-	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)

-	{

-		$sql = 'CREATE TABLE ';

-		

-		if ($if_not_exists === TRUE)

-		{

-			$sql .= 'IF NOT EXISTS ';

-		}

-		

-		$sql .= $this->db->_escape_identifiers($table)." (";

-		$current_field_count = 0;

-

-		foreach ($fields as $field=>$attributes)

-		{

-			// Numeric field names aren't allowed in databases, so if the key is

-			// numeric, we know it was assigned by PHP and the developer manually

-			// entered the field information, so we'll simply add it to the list

-			if (is_numeric($field))

-			{

-				$sql .= "\n\t$attributes";

-			}

-			else

-			{

-				$attributes = array_change_key_case($attributes, CASE_UPPER);

-				

-				$sql .= "\n\t".$this->db->_protect_identifiers($field);

-				

-				$sql .=  ' '.$attributes['TYPE'];

-	

-				if (array_key_exists('CONSTRAINT', $attributes))

-				{

-					$sql .= '('.$attributes['CONSTRAINT'].')';

-				}

-	

-				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)

-				{

-					$sql .= ' UNSIGNED';

-				}

-	

-				if (array_key_exists('DEFAULT', $attributes))

-				{

-					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';

-				}

-	

-				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)

-				{

-					$sql .= ' NULL';

-				}

-				else

-				{

-					$sql .= ' NOT NULL';			

-				}

-	

-				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)

-				{

-					$sql .= ' AUTO_INCREMENT';

-				}

-			}

-			

-			// don't add a comma on the end of the last field

-			if (++$current_field_count < count($fields))

-			{

-				$sql .= ',';

-			}

-		}

-

-		if (count($primary_keys) > 0)

-		{

-			$primary_keys = $this->db->_protect_identifiers($primary_keys);

-			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";

-		}

-		

-		if (is_array($keys) && count($keys) > 0)

-		{

-			foreach ($keys as $key)

-			{

-				if (is_array($key))

-				{

-					$key = $this->db->_protect_identifiers($key);	

-				}

-				else

-				{

-					$key = array($this->db->_protect_identifiers($key));

-				}

-				

-				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";

-			}

-		}

-		

-		$sql .= "\n)";

-

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop Table

-	 *

-	 * @access	private

-	 * @return	bool

-	 */

-	function _drop_table($table)

-	{

-		// Not a supported ODBC feature	

-		if ($this->db->db_debug)

-		{

-			return $this->db->display_error('db_unsuported_feature');

-		}

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Alter table query

-	 *

-	 * Generates a platform-specific query so that a table can be altered

-	 * Called by add_column(), drop_column(), and column_alter(),

-	 *

-	 * @access	private

-	 * @param	string	the ALTER type (ADD, DROP, CHANGE)

-	 * @param	string	the column name

-	 * @param	string	the table name

-	 * @param	string	the column definition

-	 * @param	string	the default value

-	 * @param	boolean	should 'NOT NULL' be added

-	 * @param	string	the field after which we should add the new field

-	 * @return	object

-	 */

-	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);

-

-		// DROP has everything it needs now.

-		if ($alter_type == 'DROP')

-		{

-			return $sql;

-		}

-

-		$sql .= " $column_definition";

-

-		if ($default_value != '')

-		{

-			$sql .= " DEFAULT \"$default_value\"";

-		}

-

-		if ($null === NULL)

-		{

-			$sql .= ' NULL';

-		}

-		else

-		{

-			$sql .= ' NOT NULL';

-		}

-

-		if ($after_field != '')

-		{

-			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);

-		}

-		

-		return $sql;

-		

-	}

-

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rename a table

-	 *

-	 * Generates a platform-specific query so that a table can be renamed

-	 *

-	 * @access	private

-	 * @param	string	the old table name

-	 * @param	string	the new table name

-	 * @return	string

-	 */

-	function _rename_table($table_name, $new_table_name)

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);

-		return $sql;

-	}

-

-

-}

-

-/* End of file odbc_forge.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * ODBC Forge Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/database/
+ */
+class CI_DB_odbc_forge extends CI_DB_forge {
+
+	/**
+	 * Create database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database()
+	{
+		// ODBC has no "create database" command since it's
+		// designed to connect to an existing database
+		if ($this->db->db_debug)
+		{
+			return $this->db->display_error('db_unsuported_feature');
+		}
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		// ODBC has no "drop database" command since it's
+		// designed to connect to an existing database		
+		if ($this->db->db_debug)
+		{
+			return $this->db->display_error('db_unsuported_feature');
+		}
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Create Table
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @param	array	the fields
+	 * @param	mixed	primary key(s)
+	 * @param	mixed	key(s)
+	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL
+	 * @return	bool
+	 */
+	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+	{
+		$sql = 'CREATE TABLE ';
+		
+		if ($if_not_exists === TRUE)
+		{
+			$sql .= 'IF NOT EXISTS ';
+		}
+		
+		$sql .= $this->db->_escape_identifiers($table)." (";
+		$current_field_count = 0;
+
+		foreach ($fields as $field=>$attributes)
+		{
+			// Numeric field names aren't allowed in databases, so if the key is
+			// numeric, we know it was assigned by PHP and the developer manually
+			// entered the field information, so we'll simply add it to the list
+			if (is_numeric($field))
+			{
+				$sql .= "\n\t$attributes";
+			}
+			else
+			{
+				$attributes = array_change_key_case($attributes, CASE_UPPER);
+				
+				$sql .= "\n\t".$this->db->_protect_identifiers($field);
+				
+				$sql .=  ' '.$attributes['TYPE'];
+	
+				if (array_key_exists('CONSTRAINT', $attributes))
+				{
+					$sql .= '('.$attributes['CONSTRAINT'].')';
+				}
+	
+				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+				{
+					$sql .= ' UNSIGNED';
+				}
+	
+				if (array_key_exists('DEFAULT', $attributes))
+				{
+					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+				}
+	
+				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
+				{
+					$sql .= ' NULL';
+				}
+				else
+				{
+					$sql .= ' NOT NULL';			
+				}
+	
+				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+				{
+					$sql .= ' AUTO_INCREMENT';
+				}
+			}
+			
+			// don't add a comma on the end of the last field
+			if (++$current_field_count < count($fields))
+			{
+				$sql .= ',';
+			}
+		}
+
+		if (count($primary_keys) > 0)
+		{
+			$primary_keys = $this->db->_protect_identifiers($primary_keys);
+			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
+		}
+		
+		if (is_array($keys) && count($keys) > 0)
+		{
+			foreach ($keys as $key)
+			{
+				if (is_array($key))
+				{
+					$key = $this->db->_protect_identifiers($key);	
+				}
+				else
+				{
+					$key = array($this->db->_protect_identifiers($key));
+				}
+				
+				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";
+			}
+		}
+		
+		$sql .= "\n)";
+
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop Table
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _drop_table($table)
+	{
+		// Not a supported ODBC feature	
+		if ($this->db->db_debug)
+		{
+			return $this->db->display_error('db_unsuported_feature');
+		}
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Alter table query
+	 *
+	 * Generates a platform-specific query so that a table can be altered
+	 * Called by add_column(), drop_column(), and column_alter(),
+	 *
+	 * @access	private
+	 * @param	string	the ALTER type (ADD, DROP, CHANGE)
+	 * @param	string	the column name
+	 * @param	string	the table name
+	 * @param	string	the column definition
+	 * @param	string	the default value
+	 * @param	boolean	should 'NOT NULL' be added
+	 * @param	string	the field after which we should add the new field
+	 * @return	object
+	 */
+	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
+
+		// DROP has everything it needs now.
+		if ($alter_type == 'DROP')
+		{
+			return $sql;
+		}
+
+		$sql .= " $column_definition";
+
+		if ($default_value != '')
+		{
+			$sql .= " DEFAULT \"$default_value\"";
+		}
+
+		if ($null === NULL)
+		{
+			$sql .= ' NULL';
+		}
+		else
+		{
+			$sql .= ' NOT NULL';
+		}
+
+		if ($after_field != '')
+		{
+			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+		}
+		
+		return $sql;
+		
+	}
+
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rename a table
+	 *
+	 * Generates a platform-specific query so that a table can be renamed
+	 *
+	 * @access	private
+	 * @param	string	the old table name
+	 * @param	string	the new table name
+	 * @return	string
+	 */
+	function _rename_table($table_name, $new_table_name)
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+		return $sql;
+	}
+
+
+}
+
+/* End of file odbc_forge.php */
 /* Location: ./system/database/drivers/odbc/odbc_forge.php */
\ No newline at end of file
diff --git a/system/database/drivers/odbc/odbc_result.php b/system/database/drivers/odbc/odbc_result.php
index 6d6542e..9a59cfc 100644
--- a/system/database/drivers/odbc/odbc_result.php
+++ b/system/database/drivers/odbc/odbc_result.php
@@ -1,228 +1,228 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * ODBC Result Class

- *

- * This class extends the parent result class: CI_DB_result

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_odbc_result extends CI_DB_result {

-	

-	/**

-	 * Number of rows in the result set

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function num_rows()

-	{

-		return @odbc_num_rows($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Number of fields in the result set

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function num_fields()

-	{

-		return @odbc_num_fields($this->result_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Fetch Field Names

-	 *

-	 * Generates an array of column names

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function list_fields()

-	{

-		$field_names = array();

-		for ($i = 0; $i < $this->num_fields(); $i++)

-		{

-			$field_names[] 	= odbc_field_name($this->result_id, $i);

-		}

-		

-		return $field_names;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data

-	 *

-	 * Generates an array of objects containing field meta-data

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function field_data()

-	{

-		$retval = array();

-		for ($i = 0; $i < $this->num_fields(); $i++)

-		{

-			$F 				= new stdClass();

-			$F->name 		= odbc_field_name($this->result_id, $i);

-			$F->type 		= odbc_field_type($this->result_id, $i);

-			$F->max_length	= odbc_field_len($this->result_id, $i);

-			$F->primary_key = 0;

-			$F->default		= '';

-

-			$retval[] = $F;

-		}

-		

-		return $retval;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Free the result

-	 *

-	 * @return	null

-	 */		

-	function free_result()

-	{

-		if (is_resource($this->result_id))

-		{

-			odbc_free_result($this->result_id);

-			$this->result_id = FALSE;

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Data Seek

-	 *

-	 * Moves the internal pointer to the desired offset.  We call

-	 * this internally before fetching results to make sure the

-	 * result set starts at zero

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _data_seek($n = 0)

-	{

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - associative array

-	 *

-	 * Returns the result set as an array

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _fetch_assoc()

-	{

-		if (function_exists('odbc_fetch_object'))

-		{

-			return odbc_fetch_array($this->result_id);

-		}

-		else

-		{

-			return $this->_odbc_fetch_array($this->result_id);

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - object

-	 *

-	 * Returns the result set as an object

-	 *

-	 * @access	private

-	 * @return	object

-	 */

-	function _fetch_object()

-	{

-		if (function_exists('odbc_fetch_object'))

-		{

-			return odbc_fetch_object($this->result_id);

-		}

-		else

-		{

-			return $this->_odbc_fetch_object($this->result_id);

-		}

-	}

-

-

-	/**

-	 * Result - object

-	 *

-	 * subsititutes the odbc_fetch_object function when

-	 * not available (odbc_fetch_object requires unixODBC)

-	 *

-	 * @access	private

-	 * @return	object

-	 */

-	function _odbc_fetch_object(& $odbc_result) {

-		$rs = array();

-		$rs_obj = false;

-		if (odbc_fetch_into($odbc_result, $rs)) {

-			foreach ($rs as $k=>$v) {

-				$field_name= odbc_field_name($odbc_result, $k+1);

-				$rs_obj->$field_name = $v;

-			}

-		}

-		return $rs_obj;

-	}

-

-

-	/**

-	 * Result - array

-	 *

-	 * subsititutes the odbc_fetch_array function when

-	 * not available (odbc_fetch_array requires unixODBC)

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _odbc_fetch_array(& $odbc_result) {

-		$rs = array();

-		$rs_assoc = false;

-		if (odbc_fetch_into($odbc_result, $rs)) {

-			$rs_assoc=array();

-			foreach ($rs as $k=>$v) {

-				$field_name= odbc_field_name($odbc_result, $k+1);

-				$rs_assoc[$field_name] = $v;

-			}

-		}

-		return $rs_assoc;

-	}

-

-}

-

-

-/* End of file odbc_result.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * ODBC Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_odbc_result extends CI_DB_result {
+	
+	/**
+	 * Number of rows in the result set
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function num_rows()
+	{
+		return @odbc_num_rows($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Number of fields in the result set
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function num_fields()
+	{
+		return @odbc_num_fields($this->result_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Fetch Field Names
+	 *
+	 * Generates an array of column names
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function list_fields()
+	{
+		$field_names = array();
+		for ($i = 0; $i < $this->num_fields(); $i++)
+		{
+			$field_names[] 	= odbc_field_name($this->result_id, $i);
+		}
+		
+		return $field_names;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data
+	 *
+	 * Generates an array of objects containing field meta-data
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function field_data()
+	{
+		$retval = array();
+		for ($i = 0; $i < $this->num_fields(); $i++)
+		{
+			$F 				= new stdClass();
+			$F->name 		= odbc_field_name($this->result_id, $i);
+			$F->type 		= odbc_field_type($this->result_id, $i);
+			$F->max_length	= odbc_field_len($this->result_id, $i);
+			$F->primary_key = 0;
+			$F->default		= '';
+
+			$retval[] = $F;
+		}
+		
+		return $retval;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Free the result
+	 *
+	 * @return	null
+	 */		
+	function free_result()
+	{
+		if (is_resource($this->result_id))
+		{
+			odbc_free_result($this->result_id);
+			$this->result_id = FALSE;
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Data Seek
+	 *
+	 * Moves the internal pointer to the desired offset.  We call
+	 * this internally before fetching results to make sure the
+	 * result set starts at zero
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _data_seek($n = 0)
+	{
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - associative array
+	 *
+	 * Returns the result set as an array
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _fetch_assoc()
+	{
+		if (function_exists('odbc_fetch_object'))
+		{
+			return odbc_fetch_array($this->result_id);
+		}
+		else
+		{
+			return $this->_odbc_fetch_array($this->result_id);
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - object
+	 *
+	 * Returns the result set as an object
+	 *
+	 * @access	private
+	 * @return	object
+	 */
+	function _fetch_object()
+	{
+		if (function_exists('odbc_fetch_object'))
+		{
+			return odbc_fetch_object($this->result_id);
+		}
+		else
+		{
+			return $this->_odbc_fetch_object($this->result_id);
+		}
+	}
+
+
+	/**
+	 * Result - object
+	 *
+	 * subsititutes the odbc_fetch_object function when
+	 * not available (odbc_fetch_object requires unixODBC)
+	 *
+	 * @access	private
+	 * @return	object
+	 */
+	function _odbc_fetch_object(& $odbc_result) {
+		$rs = array();
+		$rs_obj = false;
+		if (odbc_fetch_into($odbc_result, $rs)) {
+			foreach ($rs as $k=>$v) {
+				$field_name= odbc_field_name($odbc_result, $k+1);
+				$rs_obj->$field_name = $v;
+			}
+		}
+		return $rs_obj;
+	}
+
+
+	/**
+	 * Result - array
+	 *
+	 * subsititutes the odbc_fetch_array function when
+	 * not available (odbc_fetch_array requires unixODBC)
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _odbc_fetch_array(& $odbc_result) {
+		$rs = array();
+		$rs_assoc = false;
+		if (odbc_fetch_into($odbc_result, $rs)) {
+			$rs_assoc=array();
+			foreach ($rs as $k=>$v) {
+				$field_name= odbc_field_name($odbc_result, $k+1);
+				$rs_assoc[$field_name] = $v;
+			}
+		}
+		return $rs_assoc;
+	}
+
+}
+
+
+/* End of file odbc_result.php */
 /* Location: ./system/database/drivers/odbc/odbc_result.php */
\ No newline at end of file
diff --git a/system/database/drivers/odbc/odbc_utility.php b/system/database/drivers/odbc/odbc_utility.php
index 6f4376e..67aee64 100644
--- a/system/database/drivers/odbc/odbc_utility.php
+++ b/system/database/drivers/odbc/odbc_utility.php
@@ -1,148 +1,148 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * ODBC Utility Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/database/

- */

-class CI_DB_odbc_utility extends CI_DB_utility {

-

-	/**

-	 * List databases

-	 *

-	 * @access	private

-	 * @return	bool

-	 */

-	function _list_databases()

-	{

-		// Not sure if ODBC lets you list all databases...	

-		if ($this->db->db_debug)

-		{

-			return $this->db->display_error('db_unsuported_feature');

-		}

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Optimize table query

-	 *

-	 * Generates a platform-specific query so that a table can be optimized

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _optimize_table($table)

-	{

-		// Not a supported ODBC feature	

-		if ($this->db->db_debug)

-		{

-			return $this->db->display_error('db_unsuported_feature');

-		}

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Repair table query

-	 *

-	 * Generates a platform-specific query so that a table can be repaired

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _repair_table($table)

-	{

-		// Not a supported ODBC feature	

-		if ($this->db->db_debug)

-		{

-			return $this->db->display_error('db_unsuported_feature');

-		}

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * ODBC Export

-	 *

-	 * @access	private

-	 * @param	array	Preferences

-	 * @return	mixed

-	 */

-	function _backup($params = array())

-	{

-		// Currently unsupported

-		return $this->db->display_error('db_unsuported_feature');

-	}

-	

-	/**

-	 *

-	 * The functions below have been deprecated as of 1.6, and are only here for backwards

-	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation

-	 * is STRONGLY discouraged in favour if using dbforge.

-	 *

-	 */

-

-	/**

-	 * Create database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database()

-	{

-		// ODBC has no "create database" command since it's

-		// designed to connect to an existing database

-		if ($this->db->db_debug)

-		{

-			return $this->db->display_error('db_unsuported_feature');

-		}

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		// ODBC has no "drop database" command since it's

-		// designed to connect to an existing database		

-		if ($this->db->db_debug)

-		{

-			return $this->db->display_error('db_unsuported_feature');

-		}

-		return FALSE;

-	}

-}

-

-/* End of file odbc_utility.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * ODBC Utility Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/database/
+ */
+class CI_DB_odbc_utility extends CI_DB_utility {
+
+	/**
+	 * List databases
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _list_databases()
+	{
+		// Not sure if ODBC lets you list all databases...	
+		if ($this->db->db_debug)
+		{
+			return $this->db->display_error('db_unsuported_feature');
+		}
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Optimize table query
+	 *
+	 * Generates a platform-specific query so that a table can be optimized
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _optimize_table($table)
+	{
+		// Not a supported ODBC feature	
+		if ($this->db->db_debug)
+		{
+			return $this->db->display_error('db_unsuported_feature');
+		}
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Repair table query
+	 *
+	 * Generates a platform-specific query so that a table can be repaired
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _repair_table($table)
+	{
+		// Not a supported ODBC feature	
+		if ($this->db->db_debug)
+		{
+			return $this->db->display_error('db_unsuported_feature');
+		}
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * ODBC Export
+	 *
+	 * @access	private
+	 * @param	array	Preferences
+	 * @return	mixed
+	 */
+	function _backup($params = array())
+	{
+		// Currently unsupported
+		return $this->db->display_error('db_unsuported_feature');
+	}
+	
+	/**
+	 *
+	 * The functions below have been deprecated as of 1.6, and are only here for backwards
+	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation
+	 * is STRONGLY discouraged in favour if using dbforge.
+	 *
+	 */
+
+	/**
+	 * Create database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database()
+	{
+		// ODBC has no "create database" command since it's
+		// designed to connect to an existing database
+		if ($this->db->db_debug)
+		{
+			return $this->db->display_error('db_unsuported_feature');
+		}
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		// ODBC has no "drop database" command since it's
+		// designed to connect to an existing database		
+		if ($this->db->db_debug)
+		{
+			return $this->db->display_error('db_unsuported_feature');
+		}
+		return FALSE;
+	}
+}
+
+/* End of file odbc_utility.php */
 /* Location: ./system/database/drivers/odbc/odbc_utility.php */
\ No newline at end of file
diff --git a/system/database/drivers/postgre/index.html b/system/database/drivers/postgre/index.html
index 065d2da..c942a79 100644
--- a/system/database/drivers/postgre/index.html
+++ b/system/database/drivers/postgre/index.html
@@ -1,10 +1,10 @@
-<html>

-<head>

-	<title>403 Forbidden</title>

-</head>

-<body>

-

-<p>Directory access is forbidden.</p>

-

-</body>

+<html>
+<head>
+	<title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
 </html>
\ No newline at end of file
diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php
index 68622a2..da0b0f2 100644
--- a/system/database/drivers/postgre/postgre_driver.php
+++ b/system/database/drivers/postgre/postgre_driver.php
@@ -1,636 +1,636 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Postgre Database Adapter Class

- *

- * Note: _DB is an extender class that the app controller

- * creates dynamically based on whether the active record

- * class is being used or not.

- *

- * @package		CodeIgniter

- * @subpackage	Drivers

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_postgre_driver extends CI_DB {

-

-	var $dbdriver = 'postgre';

-	

-	var $_escape_char = '"';

-

-	/**

-	 * The syntax to count rows is slightly different across different

-	 * database engines, so this string appears in each driver and is

-	 * used for the count_all() and count_all_results() functions.

-	 */

-	var $_count_string = "SELECT COUNT(*) AS ";

-	var $_random_keyword = ' RANDOM()'; // database specific random keyword

-

-	/**

-	 * Connection String

-	 *

-	 * @access	private

-	 * @return	string

-	 */	

-	function _connect_string()

-	{

-		$components = array(

-								'hostname'	=> 'host',

-								'port'		=> 'port',

-								'database'	=> 'dbname',

-								'username'	=> 'user',

-								'password'	=> 'password'

-							);

-		

-		$connect_string = "";

-		foreach ($components as $key => $val)

-		{

-			if (isset($this->$key) && $this->$key != '')

-			{

-				$connect_string .= " $val=".$this->$key;

-			}

-		}

-		return trim($connect_string);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Non-persistent database connection

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_connect()

-	{		

-		return @pg_connect($this->_connect_string());

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Persistent database connection

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_pconnect()

-	{

-		return @pg_pconnect($this->_connect_string());

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Select the database

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_select()

-	{

-		// Not needed for Postgre so we'll return TRUE

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Set client character set

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @return	resource

-	 */

-	function db_set_charset($charset, $collation)

-	{

-		// @todo - add support if needed

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Version number query string

-	 *

-	 * @access	public

-	 * @return	string

-	 */

-	function _version()

-	{

-		return "SELECT version() AS ver";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Execute the query

-	 *

-	 * @access	private called by the base class

-	 * @param	string	an SQL query

-	 * @return	resource

-	 */	

-	function _execute($sql)

-	{

-		$sql = $this->_prep_query($sql);

-		return @pg_query($this->conn_id, $sql);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Prep the query

-	 *

-	 * If needed, each database adapter can prep the query string

-	 *

-	 * @access	private called by execute()

-	 * @param	string	an SQL query

-	 * @return	string

-	 */	

-	function _prep_query($sql)

-	{

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Begin Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_begin($test_mode = FALSE)

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-		

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		// Reset the transaction failure flag.

-		// If the $test_mode flag is set to TRUE transactions will be rolled back

-		// even if the queries produce a successful result.

-		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;

-

-		return @pg_exec($this->conn_id, "begin");

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Commit Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_commit()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		return @pg_exec($this->conn_id, "commit");

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rollback Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_rollback()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		return @pg_exec($this->conn_id, "rollback");

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape String

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function escape_str($str)	

-	{	

-		return pg_escape_string($str);

-	}

-		

-	// --------------------------------------------------------------------

-

-	/**

-	 * Affected Rows

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function affected_rows()

-	{

-		return @pg_affected_rows($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Insert ID

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function insert_id()

-	{

-		$v = $this->_version();

-		$v = $v['server'];

-		

-		$table	= func_num_args() > 0 ? func_get_arg(0) : null;

-		$column	= func_num_args() > 1 ? func_get_arg(1) : null;

-		

-		if ($table == null && $v >= '8.1')

-		{

-			$sql='SELECT LASTVAL() as ins_id';

-		}

-		elseif ($table != null && $column != null && $v >= '8.0')

-		{

-			$sql = sprintf("SELECT pg_get_serial_sequence('%s','%s') as seq", $table, $column);

-			$query = $this->query($sql);

-			$row = $query->row();

-			$sql = sprintf("SELECT CURRVAL('%s') as ins_id", $row->seq);

-		}

-		elseif ($table != null)

-		{

-			// seq_name passed in table parameter

-			$sql = sprintf("SELECT CURRVAL('%s') as ins_id", $table);

-		}

-		else

-		{

-			return pg_last_oid($this->result_id);

-		}

-		$query = $this->query($sql);

-		$row = $query->row();

-		return $row->ins_id;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * "Count All" query

-	 *

-	 * Generates a platform-specific query string that counts all records in

-	 * the specified database

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function count_all($table = '')

-	{

-		if ($table == '')

-			return '0';

-

-		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));

-				

-		if ($query->num_rows() == 0)

-			return '0';

-

-		$row = $query->row();

-		return $row->numrows;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Show table query

-	 *

-	 * Generates a platform-specific query string so that the table names can be fetched

-	 *

-	 * @access	private

-	 * @param	boolean

-	 * @return	string

-	 */

-	function _list_tables($prefix_limit = FALSE)

-	{	

-		$sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'";	

-		

-		if ($prefix_limit !== FALSE AND $this->dbprefix != '')

-		{

-			$sql .= " AND table_name LIKE '".$this->dbprefix."%'";

-		}

-		

-		return $sql;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Show column query

-	 *

-	 * Generates a platform-specific query string so that the column names can be fetched

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string

-	 */

-	function _list_columns($table = '')

-	{

-		return "SELECT column_name FROM information_schema.columns WHERE table_name ='".$table."'";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data query

-	 *

-	 * Generates a platform-specific query so that the column data can be retrieved

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _field_data($table)

-	{

-		return "SELECT * FROM ".$table." LIMIT 1";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message string

-	 *

-	 * @access	private

-	 * @return	string

-	 */

-	function _error_message()

-	{

-		return pg_last_error($this->conn_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message number

-	 *

-	 * @access	private

-	 * @return	integer

-	 */

-	function _error_number()

-	{

-		return '';

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape the SQL Identifiers

-	 *

-	 * This function escapes column and table names

-	 *

-	 * @access	private

-	 * @param	string

-	 * @return	string

-	 */

-	function _escape_identifiers($item)

-	{

-		if ($this->_escape_char == '')

-		{

-			return $item;

-		}

-

-		foreach ($this->_reserved_identifiers as $id)

-		{

-			if (strpos($item, '.'.$id) !== FALSE)

-			{

-				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  

-				

-				// remove duplicates if the user already included the escape

-				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-			}		

-		}

-	

-		if (strpos($item, '.') !== FALSE)

-		{

-			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			

-		}

-		else

-		{

-			$str = $this->_escape_char.$item.$this->_escape_char;

-		}

-		

-		// remove duplicates if the user already included the escape

-		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-	}

-			

-	// --------------------------------------------------------------------

-

-	/**

-	 * From Tables

-	 *

-	 * This function implicitly groups FROM tables so there is no confusion

-	 * about operator precedence in harmony with SQL standards

-	 *

-	 * @access	public

-	 * @param	type

-	 * @return	type

-	 */

-	function _from_tables($tables)

-	{

-		if ( ! is_array($tables))

-		{

-			$tables = array($tables);

-		}

-		

-		return implode(', ', $tables);

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Insert statement

-	 *

-	 * Generates a platform-specific insert string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the insert keys

-	 * @param	array	the insert values

-	 * @return	string

-	 */

-	function _insert($table, $keys, $values)

-	{	

-		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Update statement

-	 *

-	 * Generates a platform-specific update string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the update data

-	 * @param	array	the where clause

-	 * @param	array	the orderby clause

-	 * @param	array	the limit clause

-	 * @return	string

-	 */

-	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)

-	{

-		foreach($values as $key => $val)

-		{

-			$valstr[] = $key." = ".$val;

-		}

-		

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-		

-		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';

-	

-		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);

-

-		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';

-

-		$sql .= $orderby.$limit;

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Truncate statement

-	 *

-	 * Generates a platform-specific truncate string from the supplied data

-	 * If the database does not support the truncate() command

-	 * This function maps to "DELETE FROM table"

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string

-	 */	

-	function _truncate($table)

-	{

-		return "TRUNCATE ".$table;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete statement

-	 *

-	 * Generates a platform-specific delete string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the where clause

-	 * @param	string	the limit clause

-	 * @return	string

-	 */	

-	function _delete($table, $where = array(), $like = array(), $limit = FALSE)

-	{

-		$conditions = '';

-

-		if (count($where) > 0 OR count($like) > 0)

-		{

-			$conditions = "\nWHERE ";

-			$conditions .= implode("\n", $this->ar_where);

-

-			if (count($where) > 0 && count($like) > 0)

-			{

-				$conditions .= " AND ";

-			}

-			$conditions .= implode("\n", $like);

-		}

-

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-	

-		return "DELETE FROM ".$table.$conditions.$limit;

-	}

-

-	// --------------------------------------------------------------------

-	/**

-	 * Limit string

-	 *

-	 * Generates a platform-specific LIMIT clause

-	 *

-	 * @access	public

-	 * @param	string	the sql query string

-	 * @param	integer	the number of rows to limit the query to

-	 * @param	integer	the offset value

-	 * @return	string

-	 */

-	function _limit($sql, $limit, $offset)

-	{	

-		$sql .= "LIMIT ".$limit;

-	

-		if ($offset > 0)

-		{

-			$sql .= " OFFSET ".$offset;

-		}

-		

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Close DB Connection

-	 *

-	 * @access	public

-	 * @param	resource

-	 * @return	void

-	 */

-	function _close($conn_id)

-	{

-		@pg_close($conn_id);

-	}

-

-

-}

-

-

-/* End of file postgre_driver.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Postgre Database Adapter Class
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package		CodeIgniter
+ * @subpackage	Drivers
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_postgre_driver extends CI_DB {
+
+	var $dbdriver = 'postgre';
+	
+	var $_escape_char = '"';
+
+	/**
+	 * The syntax to count rows is slightly different across different
+	 * database engines, so this string appears in each driver and is
+	 * used for the count_all() and count_all_results() functions.
+	 */
+	var $_count_string = "SELECT COUNT(*) AS ";
+	var $_random_keyword = ' RANDOM()'; // database specific random keyword
+
+	/**
+	 * Connection String
+	 *
+	 * @access	private
+	 * @return	string
+	 */	
+	function _connect_string()
+	{
+		$components = array(
+								'hostname'	=> 'host',
+								'port'		=> 'port',
+								'database'	=> 'dbname',
+								'username'	=> 'user',
+								'password'	=> 'password'
+							);
+		
+		$connect_string = "";
+		foreach ($components as $key => $val)
+		{
+			if (isset($this->$key) && $this->$key != '')
+			{
+				$connect_string .= " $val=".$this->$key;
+			}
+		}
+		return trim($connect_string);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Non-persistent database connection
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_connect()
+	{		
+		return @pg_connect($this->_connect_string());
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Persistent database connection
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_pconnect()
+	{
+		return @pg_pconnect($this->_connect_string());
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Select the database
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_select()
+	{
+		// Not needed for Postgre so we'll return TRUE
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set client character set
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @return	resource
+	 */
+	function db_set_charset($charset, $collation)
+	{
+		// @todo - add support if needed
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Version number query string
+	 *
+	 * @access	public
+	 * @return	string
+	 */
+	function _version()
+	{
+		return "SELECT version() AS ver";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Execute the query
+	 *
+	 * @access	private called by the base class
+	 * @param	string	an SQL query
+	 * @return	resource
+	 */	
+	function _execute($sql)
+	{
+		$sql = $this->_prep_query($sql);
+		return @pg_query($this->conn_id, $sql);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Prep the query
+	 *
+	 * If needed, each database adapter can prep the query string
+	 *
+	 * @access	private called by execute()
+	 * @param	string	an SQL query
+	 * @return	string
+	 */	
+	function _prep_query($sql)
+	{
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Begin Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_begin($test_mode = FALSE)
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+		
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		// Reset the transaction failure flag.
+		// If the $test_mode flag is set to TRUE transactions will be rolled back
+		// even if the queries produce a successful result.
+		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+
+		return @pg_exec($this->conn_id, "begin");
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Commit Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_commit()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		return @pg_exec($this->conn_id, "commit");
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rollback Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_rollback()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		return @pg_exec($this->conn_id, "rollback");
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape String
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function escape_str($str)	
+	{	
+		return pg_escape_string($str);
+	}
+		
+	// --------------------------------------------------------------------
+
+	/**
+	 * Affected Rows
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function affected_rows()
+	{
+		return @pg_affected_rows($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Insert ID
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function insert_id()
+	{
+		$v = $this->_version();
+		$v = $v['server'];
+		
+		$table	= func_num_args() > 0 ? func_get_arg(0) : null;
+		$column	= func_num_args() > 1 ? func_get_arg(1) : null;
+		
+		if ($table == null && $v >= '8.1')
+		{
+			$sql='SELECT LASTVAL() as ins_id';
+		}
+		elseif ($table != null && $column != null && $v >= '8.0')
+		{
+			$sql = sprintf("SELECT pg_get_serial_sequence('%s','%s') as seq", $table, $column);
+			$query = $this->query($sql);
+			$row = $query->row();
+			$sql = sprintf("SELECT CURRVAL('%s') as ins_id", $row->seq);
+		}
+		elseif ($table != null)
+		{
+			// seq_name passed in table parameter
+			$sql = sprintf("SELECT CURRVAL('%s') as ins_id", $table);
+		}
+		else
+		{
+			return pg_last_oid($this->result_id);
+		}
+		$query = $this->query($sql);
+		$row = $query->row();
+		return $row->ins_id;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * "Count All" query
+	 *
+	 * Generates a platform-specific query string that counts all records in
+	 * the specified database
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function count_all($table = '')
+	{
+		if ($table == '')
+			return '0';
+
+		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+				
+		if ($query->num_rows() == 0)
+			return '0';
+
+		$row = $query->row();
+		return $row->numrows;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Show table query
+	 *
+	 * Generates a platform-specific query string so that the table names can be fetched
+	 *
+	 * @access	private
+	 * @param	boolean
+	 * @return	string
+	 */
+	function _list_tables($prefix_limit = FALSE)
+	{	
+		$sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'";	
+		
+		if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+		{
+			$sql .= " AND table_name LIKE '".$this->dbprefix."%'";
+		}
+		
+		return $sql;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Show column query
+	 *
+	 * Generates a platform-specific query string so that the column names can be fetched
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string
+	 */
+	function _list_columns($table = '')
+	{
+		return "SELECT column_name FROM information_schema.columns WHERE table_name ='".$table."'";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data query
+	 *
+	 * Generates a platform-specific query so that the column data can be retrieved
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _field_data($table)
+	{
+		return "SELECT * FROM ".$table." LIMIT 1";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message string
+	 *
+	 * @access	private
+	 * @return	string
+	 */
+	function _error_message()
+	{
+		return pg_last_error($this->conn_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message number
+	 *
+	 * @access	private
+	 * @return	integer
+	 */
+	function _error_number()
+	{
+		return '';
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape the SQL Identifiers
+	 *
+	 * This function escapes column and table names
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	string
+	 */
+	function _escape_identifiers($item)
+	{
+		if ($this->_escape_char == '')
+		{
+			return $item;
+		}
+
+		foreach ($this->_reserved_identifiers as $id)
+		{
+			if (strpos($item, '.'.$id) !== FALSE)
+			{
+				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  
+				
+				// remove duplicates if the user already included the escape
+				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+			}		
+		}
+	
+		if (strpos($item, '.') !== FALSE)
+		{
+			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			
+		}
+		else
+		{
+			$str = $this->_escape_char.$item.$this->_escape_char;
+		}
+		
+		// remove duplicates if the user already included the escape
+		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+	}
+			
+	// --------------------------------------------------------------------
+
+	/**
+	 * From Tables
+	 *
+	 * This function implicitly groups FROM tables so there is no confusion
+	 * about operator precedence in harmony with SQL standards
+	 *
+	 * @access	public
+	 * @param	type
+	 * @return	type
+	 */
+	function _from_tables($tables)
+	{
+		if ( ! is_array($tables))
+		{
+			$tables = array($tables);
+		}
+		
+		return implode(', ', $tables);
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Insert statement
+	 *
+	 * Generates a platform-specific insert string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the insert keys
+	 * @param	array	the insert values
+	 * @return	string
+	 */
+	function _insert($table, $keys, $values)
+	{	
+		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Update statement
+	 *
+	 * Generates a platform-specific update string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the update data
+	 * @param	array	the where clause
+	 * @param	array	the orderby clause
+	 * @param	array	the limit clause
+	 * @return	string
+	 */
+	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+	{
+		foreach($values as $key => $val)
+		{
+			$valstr[] = $key." = ".$val;
+		}
+		
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+		
+		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+	
+		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+		$sql .= $orderby.$limit;
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Truncate statement
+	 *
+	 * Generates a platform-specific truncate string from the supplied data
+	 * If the database does not support the truncate() command
+	 * This function maps to "DELETE FROM table"
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string
+	 */	
+	function _truncate($table)
+	{
+		return "TRUNCATE ".$table;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete statement
+	 *
+	 * Generates a platform-specific delete string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the where clause
+	 * @param	string	the limit clause
+	 * @return	string
+	 */	
+	function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+	{
+		$conditions = '';
+
+		if (count($where) > 0 OR count($like) > 0)
+		{
+			$conditions = "\nWHERE ";
+			$conditions .= implode("\n", $this->ar_where);
+
+			if (count($where) > 0 && count($like) > 0)
+			{
+				$conditions .= " AND ";
+			}
+			$conditions .= implode("\n", $like);
+		}
+
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+	
+		return "DELETE FROM ".$table.$conditions.$limit;
+	}
+
+	// --------------------------------------------------------------------
+	/**
+	 * Limit string
+	 *
+	 * Generates a platform-specific LIMIT clause
+	 *
+	 * @access	public
+	 * @param	string	the sql query string
+	 * @param	integer	the number of rows to limit the query to
+	 * @param	integer	the offset value
+	 * @return	string
+	 */
+	function _limit($sql, $limit, $offset)
+	{	
+		$sql .= "LIMIT ".$limit;
+	
+		if ($offset > 0)
+		{
+			$sql .= " OFFSET ".$offset;
+		}
+		
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Close DB Connection
+	 *
+	 * @access	public
+	 * @param	resource
+	 * @return	void
+	 */
+	function _close($conn_id)
+	{
+		@pg_close($conn_id);
+	}
+
+
+}
+
+
+/* End of file postgre_driver.php */
 /* Location: ./system/database/drivers/postgre/postgre_driver.php */
\ No newline at end of file
diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php
index 5b4bcc2..72c2dd7 100644
--- a/system/database/drivers/postgre/postgre_forge.php
+++ b/system/database/drivers/postgre/postgre_forge.php
@@ -1,248 +1,248 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Postgre Forge Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_postgre_forge extends CI_DB_forge {

-

-	/**

-	 * Create database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database($name)

-	{

-		return "CREATE DATABASE ".$name;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		return "DROP DATABASE ".$name;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Create Table

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @param	array	the fields

-	 * @param	mixed	primary key(s)

-	 * @param	mixed	key(s)

-	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL

-	 * @return	bool

-	 */

-	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)

-	{

-		$sql = 'CREATE TABLE ';

-		

-		if ($if_not_exists === TRUE)

-		{

-			$sql .= 'IF NOT EXISTS ';

-		}

-		

-		$sql .= $this->db->_escape_identifiers($table)." (";

-		$current_field_count = 0;

-

-		foreach ($fields as $field=>$attributes)

-		{

-			// Numeric field names aren't allowed in databases, so if the key is

-			// numeric, we know it was assigned by PHP and the developer manually

-			// entered the field information, so we'll simply add it to the list

-			if (is_numeric($field))

-			{

-				$sql .= "\n\t$attributes";

-			}

-			else

-			{

-				$attributes = array_change_key_case($attributes, CASE_UPPER);

-				

-				$sql .= "\n\t".$this->db->_protect_identifiers($field);

-				

-				$sql .=  ' '.$attributes['TYPE'];

-	

-				if (array_key_exists('CONSTRAINT', $attributes))

-				{

-					$sql .= '('.$attributes['CONSTRAINT'].')';

-				}

-	

-				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)

-				{

-					$sql .= ' UNSIGNED';

-				}

-	

-				if (array_key_exists('DEFAULT', $attributes))

-				{

-					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';

-				}

-	

-				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)

-				{

-					$sql .= ' NULL';

-				}

-				else

-				{

-					$sql .= ' NOT NULL';			

-				}

-	

-				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)

-				{

-					$sql .= ' AUTO_INCREMENT';

-				}

-			}

-			

-			// don't add a comma on the end of the last field

-			if (++$current_field_count < count($fields))

-			{

-				$sql .= ',';

-			}

-		}

-

-		if (count($primary_keys) > 0)

-		{

-			$primary_keys = $this->db->_protect_identifiers($primary_keys);

-			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";

-		}

-		

-		if (is_array($keys) && count($keys) > 0)

-		{

-			foreach ($keys as $key)

-			{

-				if (is_array($key))

-				{

-					$key = $this->db->_protect_identifiers($key);	

-				}

-				else

-				{

-					$key = array($this->db->_protect_identifiers($key));

-				}

-				

-				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";

-			}

-		}

-

-		$sql .= "\n);";

-

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop Table

-	 *

-	 * @access	private

-	 * @return	bool

-	 */

-	function _drop_table($table)

-	{

-		return "DROP TABLE ".$this->db->_escape_identifiers($table)." CASCADE";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Alter table query

-	 *

-	 * Generates a platform-specific query so that a table can be altered

-	 * Called by add_column(), drop_column(), and column_alter(),

-	 *

-	 * @access	private

-	 * @param	string	the ALTER type (ADD, DROP, CHANGE)

-	 * @param	string	the column name

-	 * @param	string	the table name

-	 * @param	string	the column definition

-	 * @param	string	the default value

-	 * @param	boolean	should 'NOT NULL' be added

-	 * @param	string	the field after which we should add the new field

-	 * @return	object

-	 */

-	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);

-

-		// DROP has everything it needs now.

-		if ($alter_type == 'DROP')

-		{

-			return $sql;

-		}

-

-		$sql .= " $column_definition";

-

-		if ($default_value != '')

-		{

-			$sql .= " DEFAULT \"$default_value\"";

-		}

-

-		if ($null === NULL)

-		{

-			$sql .= ' NULL';

-		}

-		else

-		{

-			$sql .= ' NOT NULL';

-		}

-

-		if ($after_field != '')

-		{

-			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);

-		}

-		

-		return $sql;

-		

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rename a table

-	 *

-	 * Generates a platform-specific query so that a table can be renamed

-	 *

-	 * @access	private

-	 * @param	string	the old table name

-	 * @param	string	the new table name

-	 * @return	string

-	 */

-	function _rename_table($table_name, $new_table_name)

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);

-		return $sql;

-	}

-

-

-}

-

-/* End of file postgre_forge.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Postgre Forge Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_postgre_forge extends CI_DB_forge {
+
+	/**
+	 * Create database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database($name)
+	{
+		return "CREATE DATABASE ".$name;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		return "DROP DATABASE ".$name;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Create Table
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @param	array	the fields
+	 * @param	mixed	primary key(s)
+	 * @param	mixed	key(s)
+	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL
+	 * @return	bool
+	 */
+	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+	{
+		$sql = 'CREATE TABLE ';
+		
+		if ($if_not_exists === TRUE)
+		{
+			$sql .= 'IF NOT EXISTS ';
+		}
+		
+		$sql .= $this->db->_escape_identifiers($table)." (";
+		$current_field_count = 0;
+
+		foreach ($fields as $field=>$attributes)
+		{
+			// Numeric field names aren't allowed in databases, so if the key is
+			// numeric, we know it was assigned by PHP and the developer manually
+			// entered the field information, so we'll simply add it to the list
+			if (is_numeric($field))
+			{
+				$sql .= "\n\t$attributes";
+			}
+			else
+			{
+				$attributes = array_change_key_case($attributes, CASE_UPPER);
+				
+				$sql .= "\n\t".$this->db->_protect_identifiers($field);
+				
+				$sql .=  ' '.$attributes['TYPE'];
+	
+				if (array_key_exists('CONSTRAINT', $attributes))
+				{
+					$sql .= '('.$attributes['CONSTRAINT'].')';
+				}
+	
+				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+				{
+					$sql .= ' UNSIGNED';
+				}
+	
+				if (array_key_exists('DEFAULT', $attributes))
+				{
+					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+				}
+	
+				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
+				{
+					$sql .= ' NULL';
+				}
+				else
+				{
+					$sql .= ' NOT NULL';			
+				}
+	
+				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+				{
+					$sql .= ' AUTO_INCREMENT';
+				}
+			}
+			
+			// don't add a comma on the end of the last field
+			if (++$current_field_count < count($fields))
+			{
+				$sql .= ',';
+			}
+		}
+
+		if (count($primary_keys) > 0)
+		{
+			$primary_keys = $this->db->_protect_identifiers($primary_keys);
+			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
+		}
+		
+		if (is_array($keys) && count($keys) > 0)
+		{
+			foreach ($keys as $key)
+			{
+				if (is_array($key))
+				{
+					$key = $this->db->_protect_identifiers($key);	
+				}
+				else
+				{
+					$key = array($this->db->_protect_identifiers($key));
+				}
+				
+				$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";
+			}
+		}
+
+		$sql .= "\n);";
+
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop Table
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _drop_table($table)
+	{
+		return "DROP TABLE ".$this->db->_escape_identifiers($table)." CASCADE";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Alter table query
+	 *
+	 * Generates a platform-specific query so that a table can be altered
+	 * Called by add_column(), drop_column(), and column_alter(),
+	 *
+	 * @access	private
+	 * @param	string	the ALTER type (ADD, DROP, CHANGE)
+	 * @param	string	the column name
+	 * @param	string	the table name
+	 * @param	string	the column definition
+	 * @param	string	the default value
+	 * @param	boolean	should 'NOT NULL' be added
+	 * @param	string	the field after which we should add the new field
+	 * @return	object
+	 */
+	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
+
+		// DROP has everything it needs now.
+		if ($alter_type == 'DROP')
+		{
+			return $sql;
+		}
+
+		$sql .= " $column_definition";
+
+		if ($default_value != '')
+		{
+			$sql .= " DEFAULT \"$default_value\"";
+		}
+
+		if ($null === NULL)
+		{
+			$sql .= ' NULL';
+		}
+		else
+		{
+			$sql .= ' NOT NULL';
+		}
+
+		if ($after_field != '')
+		{
+			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+		}
+		
+		return $sql;
+		
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rename a table
+	 *
+	 * Generates a platform-specific query so that a table can be renamed
+	 *
+	 * @access	private
+	 * @param	string	the old table name
+	 * @param	string	the new table name
+	 * @return	string
+	 */
+	function _rename_table($table_name, $new_table_name)
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+		return $sql;
+	}
+
+
+}
+
+/* End of file postgre_forge.php */
 /* Location: ./system/database/drivers/postgre/postgre_forge.php */
\ No newline at end of file
diff --git a/system/database/drivers/postgre/postgre_result.php b/system/database/drivers/postgre/postgre_result.php
index 78b9a60..3206c13 100644
--- a/system/database/drivers/postgre/postgre_result.php
+++ b/system/database/drivers/postgre/postgre_result.php
@@ -1,169 +1,169 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Postgres Result Class

- *

- * This class extends the parent result class: CI_DB_result

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_postgre_result extends CI_DB_result {

-

-	/**

-	 * Number of rows in the result set

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function num_rows()

-	{

-		return @pg_num_rows($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Number of fields in the result set

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function num_fields()

-	{

-		return @pg_num_fields($this->result_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Fetch Field Names

-	 *

-	 * Generates an array of column names

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function list_fields()

-	{

-		$field_names = array();

-		for ($i = 0; $i < $this->num_fields(); $i++)

-		{

-			$field_names[] = pg_field_name($this->result_id, $i);

-		}

-		

-		return $field_names;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data

-	 *

-	 * Generates an array of objects containing field meta-data

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function field_data()

-	{

-		$retval = array();

-		for ($i = 0; $i < $this->num_fields(); $i++)

-		{

-			$F 				= new stdClass();

-			$F->name 		= pg_field_name($this->result_id, $i);

-			$F->type 		= pg_field_type($this->result_id, $i);

-			$F->max_length	= pg_field_size($this->result_id, $i);

-			$F->primary_key = 0;

-			$F->default		= '';

-

-			$retval[] = $F;

-		}

-		

-		return $retval;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Free the result

-	 *

-	 * @return	null

-	 */		

-	function free_result()

-	{

-		if (is_resource($this->result_id))

-		{

-			pg_free_result($this->result_id);

-			$this->result_id = FALSE;

-		}

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Data Seek

-	 *

-	 * Moves the internal pointer to the desired offset.  We call

-	 * this internally before fetching results to make sure the

-	 * result set starts at zero

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _data_seek($n = 0)

-	{

-		return pg_result_seek($this->result_id, $n);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - associative array

-	 *

-	 * Returns the result set as an array

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _fetch_assoc()

-	{

-		return pg_fetch_assoc($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - object

-	 *

-	 * Returns the result set as an object

-	 *

-	 * @access	private

-	 * @return	object

-	 */

-	function _fetch_object()

-	{

-		return pg_fetch_object($this->result_id);

-	}

-	

-}

-

-

-/* End of file postgre_result.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Postgres Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_postgre_result extends CI_DB_result {
+
+	/**
+	 * Number of rows in the result set
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function num_rows()
+	{
+		return @pg_num_rows($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Number of fields in the result set
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function num_fields()
+	{
+		return @pg_num_fields($this->result_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Fetch Field Names
+	 *
+	 * Generates an array of column names
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function list_fields()
+	{
+		$field_names = array();
+		for ($i = 0; $i < $this->num_fields(); $i++)
+		{
+			$field_names[] = pg_field_name($this->result_id, $i);
+		}
+		
+		return $field_names;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data
+	 *
+	 * Generates an array of objects containing field meta-data
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function field_data()
+	{
+		$retval = array();
+		for ($i = 0; $i < $this->num_fields(); $i++)
+		{
+			$F 				= new stdClass();
+			$F->name 		= pg_field_name($this->result_id, $i);
+			$F->type 		= pg_field_type($this->result_id, $i);
+			$F->max_length	= pg_field_size($this->result_id, $i);
+			$F->primary_key = 0;
+			$F->default		= '';
+
+			$retval[] = $F;
+		}
+		
+		return $retval;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Free the result
+	 *
+	 * @return	null
+	 */		
+	function free_result()
+	{
+		if (is_resource($this->result_id))
+		{
+			pg_free_result($this->result_id);
+			$this->result_id = FALSE;
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Data Seek
+	 *
+	 * Moves the internal pointer to the desired offset.  We call
+	 * this internally before fetching results to make sure the
+	 * result set starts at zero
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _data_seek($n = 0)
+	{
+		return pg_result_seek($this->result_id, $n);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - associative array
+	 *
+	 * Returns the result set as an array
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _fetch_assoc()
+	{
+		return pg_fetch_assoc($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - object
+	 *
+	 * Returns the result set as an object
+	 *
+	 * @access	private
+	 * @return	object
+	 */
+	function _fetch_object()
+	{
+		return pg_fetch_object($this->result_id);
+	}
+	
+}
+
+
+/* End of file postgre_result.php */
 /* Location: ./system/database/drivers/postgre/postgre_result.php */
\ No newline at end of file
diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php
index f9b0f22..06292f2 100644
--- a/system/database/drivers/postgre/postgre_utility.php
+++ b/system/database/drivers/postgre/postgre_utility.php
@@ -1,124 +1,124 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * Postgre Utility Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_postgre_utility extends CI_DB_utility {

-

-	/**

-	 * List databases

-	 *

-	 * @access	private

-	 * @return	bool

-	 */

-	function _list_databases()

-	{

-		return "SELECT datname FROM pg_database";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Optimize table query

-	 *

-	 * Is table optimization supported in Postgre?

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _optimize_table($table)

-	{

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Repair table query

-	 *

-	 * Are table repairs supported in Postgre?

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _repair_table($table)

-	{

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Postgre Export

-	 *

-	 * @access	private

-	 * @param	array	Preferences

-	 * @return	mixed

-	 */

-	function _backup($params = array())

-	{

-		// Currently unsupported

-		return $this->db->display_error('db_unsuported_feature');

-	}

-

-	/**

-	 *

-	 * The functions below have been deprecated as of 1.6, and are only here for backwards

-	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation

-	 * is STRONGLY discouraged in favour if using dbforge.

-	 *

-	 */

-

-	/**

-	 * Create database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database($name)

-	{

-		return "CREATE DATABASE ".$name;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		return "DROP DATABASE ".$name;

-	}

-

-

-}

-

-

-/* End of file postgre_utility.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Postgre Utility Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_postgre_utility extends CI_DB_utility {
+
+	/**
+	 * List databases
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _list_databases()
+	{
+		return "SELECT datname FROM pg_database";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Optimize table query
+	 *
+	 * Is table optimization supported in Postgre?
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _optimize_table($table)
+	{
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Repair table query
+	 *
+	 * Are table repairs supported in Postgre?
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _repair_table($table)
+	{
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Postgre Export
+	 *
+	 * @access	private
+	 * @param	array	Preferences
+	 * @return	mixed
+	 */
+	function _backup($params = array())
+	{
+		// Currently unsupported
+		return $this->db->display_error('db_unsuported_feature');
+	}
+
+	/**
+	 *
+	 * The functions below have been deprecated as of 1.6, and are only here for backwards
+	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation
+	 * is STRONGLY discouraged in favour if using dbforge.
+	 *
+	 */
+
+	/**
+	 * Create database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database($name)
+	{
+		return "CREATE DATABASE ".$name;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		return "DROP DATABASE ".$name;
+	}
+
+
+}
+
+
+/* End of file postgre_utility.php */
 /* Location: ./system/database/drivers/postgre/postgre_utility.php */
\ No newline at end of file
diff --git a/system/database/drivers/sqlite/index.html b/system/database/drivers/sqlite/index.html
index 065d2da..c942a79 100644
--- a/system/database/drivers/sqlite/index.html
+++ b/system/database/drivers/sqlite/index.html
@@ -1,10 +1,10 @@
-<html>

-<head>

-	<title>403 Forbidden</title>

-</head>

-<body>

-

-<p>Directory access is forbidden.</p>

-

-</body>

+<html>
+<head>
+	<title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
 </html>
\ No newline at end of file
diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php
index 992e247..058cef7 100644
--- a/system/database/drivers/sqlite/sqlite_driver.php
+++ b/system/database/drivers/sqlite/sqlite_driver.php
@@ -1,612 +1,612 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-

-

-/**

- * SQLite Database Adapter Class

- *

- * Note: _DB is an extender class that the app controller

- * creates dynamically based on whether the active record

- * class is being used or not.

- *

- * @package		CodeIgniter

- * @subpackage	Drivers

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_sqlite_driver extends CI_DB {

-

-	var $dbdriver = 'sqlite';

-	

-	// The character used to escape with - not needed for SQLite

-	var $_escape_char = '';

-

-	/**

-	 * The syntax to count rows is slightly different across different

-	 * database engines, so this string appears in each driver and is

-	 * used for the count_all() and count_all_results() functions.

-	 */

-	var $_count_string = "SELECT COUNT(*) AS ";

-	var $_random_keyword = ' Random()'; // database specific random keyword

-

-	/**

-	 * Non-persistent database connection

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_connect()

-	{

-		if ( ! $conn_id = @sqlite_open($this->database, FILE_WRITE_MODE, $error))

-		{

-			log_message('error', $error);

-			

-			if ($this->db_debug)

-			{

-				$this->display_error($error, '', TRUE);

-			}

-			

-			return FALSE;

-		}

-		

-		return $conn_id;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Persistent database connection

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_pconnect()

-	{

-		if ( ! $conn_id = @sqlite_popen($this->database, FILE_WRITE_MODE, $error))

-		{

-			log_message('error', $error);

-			

-			if ($this->db_debug)

-			{

-				$this->display_error($error, '', TRUE);

-			}

-			

-			return FALSE;

-		}

-		

-		return $conn_id;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Select the database

-	 *

-	 * @access	private called by the base class

-	 * @return	resource

-	 */	

-	function db_select()

-	{

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Set client character set

-	 *

-	 * @access	public

-	 * @param	string

-	 * @param	string

-	 * @return	resource

-	 */

-	function db_set_charset($charset, $collation)

-	{

-		// @todo - add support if needed

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Version number query string

-	 *

-	 * @access	public

-	 * @return	string

-	 */

-	function _version()

-	{

-		return sqlite_libversion();

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Execute the query

-	 *

-	 * @access	private called by the base class

-	 * @param	string	an SQL query

-	 * @return	resource

-	 */	

-	function _execute($sql)

-	{

-		$sql = $this->_prep_query($sql);

-		return @sqlite_query($this->conn_id, $sql);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Prep the query

-	 *

-	 * If needed, each database adapter can prep the query string

-	 *

-	 * @access	private called by execute()

-	 * @param	string	an SQL query

-	 * @return	string

-	 */	

-	function _prep_query($sql)

-	{

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Begin Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_begin($test_mode = FALSE)

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-		

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		// Reset the transaction failure flag.

-		// If the $test_mode flag is set to TRUE transactions will be rolled back

-		// even if the queries produce a successful result.

-		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;

-

-		$this->simple_query('BEGIN TRANSACTION');

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Commit Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_commit()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		$this->simple_query('COMMIT');

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rollback Transaction

-	 *

-	 * @access	public

-	 * @return	bool		

-	 */	

-	function trans_rollback()

-	{

-		if ( ! $this->trans_enabled)

-		{

-			return TRUE;

-		}

-

-		// When transactions are nested we only begin/commit/rollback the outermost ones

-		if ($this->_trans_depth > 0)

-		{

-			return TRUE;

-		}

-

-		$this->simple_query('ROLLBACK');

-		return TRUE;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape String

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function escape_str($str)	

-	{

-		return sqlite_escape_string($str);

-	}

-		

-	// --------------------------------------------------------------------

-

-	/**

-	 * Affected Rows

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function affected_rows()

-	{

-		return sqlite_changes($this->conn_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Insert ID

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function insert_id()

-	{

-		return @sqlite_last_insert_rowid($this->conn_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * "Count All" query

-	 *

-	 * Generates a platform-specific query string that counts all records in

-	 * the specified database

-	 *

-	 * @access	public

-	 * @param	string

-	 * @return	string

-	 */

-	function count_all($table = '')

-	{

-		if ($table == '')

-			return '0';

-	

-		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));

-		

-		if ($query->num_rows() == 0)

-			return '0';

-

-		$row = $query->row();

-		return $row->numrows;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * List table query

-	 *

-	 * Generates a platform-specific query string so that the table names can be fetched

-	 *

-	 * @access	private

-	 * @param	boolean

-	 * @return	string

-	 */

-	function _list_tables($prefix_limit = FALSE)

-	{

-		$sql = "SELECT name from sqlite_master WHERE type='table'";

-

-		if ($prefix_limit !== FALSE AND $this->dbprefix != '')

-		{

-			$sql .= " AND 'name' LIKE '".$this->dbprefix."%'";

-		}

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Show column query

-	 *

-	 * Generates a platform-specific query string so that the column names can be fetched

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string

-	 */

-	function _list_columns($table = '')

-	{

-		// Not supported

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data query

-	 *

-	 * Generates a platform-specific query so that the column data can be retrieved

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _field_data($table)

-	{

-		return "SELECT * FROM ".$table." LIMIT 1";

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message string

-	 *

-	 * @access	private

-	 * @return	string

-	 */

-	function _error_message()

-	{

-		return sqlite_error_string(sqlite_last_error($this->conn_id));

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * The error message number

-	 *

-	 * @access	private

-	 * @return	integer

-	 */

-	function _error_number()

-	{

-		return sqlite_last_error($this->conn_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Escape the SQL Identifiers

-	 *

-	 * This function escapes column and table names

-	 *

-	 * @access	private

-	 * @param	string

-	 * @return	string

-	 */

-	function _escape_identifiers($item)

-	{

-		if ($this->_escape_char == '')

-		{

-			return $item;

-		}

-

-		foreach ($this->_reserved_identifiers as $id)

-		{

-			if (strpos($item, '.'.$id) !== FALSE)

-			{

-				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  

-				

-				// remove duplicates if the user already included the escape

-				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-			}		

-		}

-	

-		if (strpos($item, '.') !== FALSE)

-		{

-			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			

-		}

-		else

-		{

-			$str = $this->_escape_char.$item.$this->_escape_char;

-		}

-		

-		// remove duplicates if the user already included the escape

-		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);

-	}

-			

-	// --------------------------------------------------------------------

-

-	/**

-	 * From Tables

-	 *

-	 * This function implicitly groups FROM tables so there is no confusion

-	 * about operator precedence in harmony with SQL standards

-	 *

-	 * @access	public

-	 * @param	type

-	 * @return	type

-	 */

-	function _from_tables($tables)

-	{

-		if ( ! is_array($tables))

-		{

-			$tables = array($tables);

-		}

-		

-		return '('.implode(', ', $tables).')';

-	}

-

-	// --------------------------------------------------------------------

-	

-	/**

-	 * Insert statement

-	 *

-	 * Generates a platform-specific insert string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the insert keys

-	 * @param	array	the insert values

-	 * @return	string

-	 */

-	function _insert($table, $keys, $values)

-	{	

-		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Update statement

-	 *

-	 * Generates a platform-specific update string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the update data

-	 * @param	array	the where clause

-	 * @param	array	the orderby clause

-	 * @param	array	the limit clause

-	 * @return	string

-	 */

-	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)

-	{

-		foreach($values as $key => $val)

-		{

-			$valstr[] = $key." = ".$val;

-		}

-		

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-		

-		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';

-	

-		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);

-

-		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';

-

-		$sql .= $orderby.$limit;

-		

-		return $sql;

-	}

-

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Truncate statement

-	 *

-	 * Generates a platform-specific truncate string from the supplied data

-	 * If the database does not support the truncate() command

-	 * This function maps to "DELETE FROM table"

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @return	string

-	 */	

-	function _truncate($table)

-	{

-		return $this->_delete($table);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Delete statement

-	 *

-	 * Generates a platform-specific delete string from the supplied data

-	 *

-	 * @access	public

-	 * @param	string	the table name

-	 * @param	array	the where clause

-	 * @param	string	the limit clause

-	 * @return	string

-	 */	

-	function _delete($table, $where = array(), $like = array(), $limit = FALSE)

-	{

-		$conditions = '';

-

-		if (count($where) > 0 OR count($like) > 0)

-		{

-			$conditions = "\nWHERE ";

-			$conditions .= implode("\n", $this->ar_where);

-

-			if (count($where) > 0 && count($like) > 0)

-			{

-				$conditions .= " AND ";

-			}

-			$conditions .= implode("\n", $like);

-		}

-

-		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

-	

-		return "DELETE FROM ".$table.$conditions.$limit;

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Limit string

-	 *

-	 * Generates a platform-specific LIMIT clause

-	 *

-	 * @access	public

-	 * @param	string	the sql query string

-	 * @param	integer	the number of rows to limit the query to

-	 * @param	integer	the offset value

-	 * @return	string

-	 */

-	function _limit($sql, $limit, $offset)

-	{	

-		if ($offset == 0)

-		{

-			$offset = '';

-		}

-		else

-		{

-			$offset .= ", ";

-		}

-		

-		return $sql."LIMIT ".$offset.$limit;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Close DB Connection

-	 *

-	 * @access	public

-	 * @param	resource

-	 * @return	void

-	 */

-	function _close($conn_id)

-	{

-		@sqlite_close($conn_id);

-	}

-

-

-}

-

-

-/* End of file sqlite_driver.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+
+
+/**
+ * SQLite Database Adapter Class
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package		CodeIgniter
+ * @subpackage	Drivers
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_sqlite_driver extends CI_DB {
+
+	var $dbdriver = 'sqlite';
+	
+	// The character used to escape with - not needed for SQLite
+	var $_escape_char = '';
+
+	/**
+	 * The syntax to count rows is slightly different across different
+	 * database engines, so this string appears in each driver and is
+	 * used for the count_all() and count_all_results() functions.
+	 */
+	var $_count_string = "SELECT COUNT(*) AS ";
+	var $_random_keyword = ' Random()'; // database specific random keyword
+
+	/**
+	 * Non-persistent database connection
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_connect()
+	{
+		if ( ! $conn_id = @sqlite_open($this->database, FILE_WRITE_MODE, $error))
+		{
+			log_message('error', $error);
+			
+			if ($this->db_debug)
+			{
+				$this->display_error($error, '', TRUE);
+			}
+			
+			return FALSE;
+		}
+		
+		return $conn_id;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Persistent database connection
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_pconnect()
+	{
+		if ( ! $conn_id = @sqlite_popen($this->database, FILE_WRITE_MODE, $error))
+		{
+			log_message('error', $error);
+			
+			if ($this->db_debug)
+			{
+				$this->display_error($error, '', TRUE);
+			}
+			
+			return FALSE;
+		}
+		
+		return $conn_id;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Select the database
+	 *
+	 * @access	private called by the base class
+	 * @return	resource
+	 */	
+	function db_select()
+	{
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set client character set
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	string
+	 * @return	resource
+	 */
+	function db_set_charset($charset, $collation)
+	{
+		// @todo - add support if needed
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Version number query string
+	 *
+	 * @access	public
+	 * @return	string
+	 */
+	function _version()
+	{
+		return sqlite_libversion();
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Execute the query
+	 *
+	 * @access	private called by the base class
+	 * @param	string	an SQL query
+	 * @return	resource
+	 */	
+	function _execute($sql)
+	{
+		$sql = $this->_prep_query($sql);
+		return @sqlite_query($this->conn_id, $sql);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Prep the query
+	 *
+	 * If needed, each database adapter can prep the query string
+	 *
+	 * @access	private called by execute()
+	 * @param	string	an SQL query
+	 * @return	string
+	 */	
+	function _prep_query($sql)
+	{
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Begin Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_begin($test_mode = FALSE)
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+		
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		// Reset the transaction failure flag.
+		// If the $test_mode flag is set to TRUE transactions will be rolled back
+		// even if the queries produce a successful result.
+		$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+
+		$this->simple_query('BEGIN TRANSACTION');
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Commit Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_commit()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		$this->simple_query('COMMIT');
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rollback Transaction
+	 *
+	 * @access	public
+	 * @return	bool		
+	 */	
+	function trans_rollback()
+	{
+		if ( ! $this->trans_enabled)
+		{
+			return TRUE;
+		}
+
+		// When transactions are nested we only begin/commit/rollback the outermost ones
+		if ($this->_trans_depth > 0)
+		{
+			return TRUE;
+		}
+
+		$this->simple_query('ROLLBACK');
+		return TRUE;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape String
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function escape_str($str)	
+	{
+		return sqlite_escape_string($str);
+	}
+		
+	// --------------------------------------------------------------------
+
+	/**
+	 * Affected Rows
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function affected_rows()
+	{
+		return sqlite_changes($this->conn_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Insert ID
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function insert_id()
+	{
+		return @sqlite_last_insert_rowid($this->conn_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * "Count All" query
+	 *
+	 * Generates a platform-specific query string that counts all records in
+	 * the specified database
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */
+	function count_all($table = '')
+	{
+		if ($table == '')
+			return '0';
+	
+		$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+		
+		if ($query->num_rows() == 0)
+			return '0';
+
+		$row = $query->row();
+		return $row->numrows;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * List table query
+	 *
+	 * Generates a platform-specific query string so that the table names can be fetched
+	 *
+	 * @access	private
+	 * @param	boolean
+	 * @return	string
+	 */
+	function _list_tables($prefix_limit = FALSE)
+	{
+		$sql = "SELECT name from sqlite_master WHERE type='table'";
+
+		if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+		{
+			$sql .= " AND 'name' LIKE '".$this->dbprefix."%'";
+		}
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Show column query
+	 *
+	 * Generates a platform-specific query string so that the column names can be fetched
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string
+	 */
+	function _list_columns($table = '')
+	{
+		// Not supported
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data query
+	 *
+	 * Generates a platform-specific query so that the column data can be retrieved
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _field_data($table)
+	{
+		return "SELECT * FROM ".$table." LIMIT 1";
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message string
+	 *
+	 * @access	private
+	 * @return	string
+	 */
+	function _error_message()
+	{
+		return sqlite_error_string(sqlite_last_error($this->conn_id));
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * The error message number
+	 *
+	 * @access	private
+	 * @return	integer
+	 */
+	function _error_number()
+	{
+		return sqlite_last_error($this->conn_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Escape the SQL Identifiers
+	 *
+	 * This function escapes column and table names
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	string
+	 */
+	function _escape_identifiers($item)
+	{
+		if ($this->_escape_char == '')
+		{
+			return $item;
+		}
+
+		foreach ($this->_reserved_identifiers as $id)
+		{
+			if (strpos($item, '.'.$id) !== FALSE)
+			{
+				$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);  
+				
+				// remove duplicates if the user already included the escape
+				return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+			}		
+		}
+	
+		if (strpos($item, '.') !== FALSE)
+		{
+			$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;			
+		}
+		else
+		{
+			$str = $this->_escape_char.$item.$this->_escape_char;
+		}
+		
+		// remove duplicates if the user already included the escape
+		return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+	}
+			
+	// --------------------------------------------------------------------
+
+	/**
+	 * From Tables
+	 *
+	 * This function implicitly groups FROM tables so there is no confusion
+	 * about operator precedence in harmony with SQL standards
+	 *
+	 * @access	public
+	 * @param	type
+	 * @return	type
+	 */
+	function _from_tables($tables)
+	{
+		if ( ! is_array($tables))
+		{
+			$tables = array($tables);
+		}
+		
+		return '('.implode(', ', $tables).')';
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Insert statement
+	 *
+	 * Generates a platform-specific insert string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the insert keys
+	 * @param	array	the insert values
+	 * @return	string
+	 */
+	function _insert($table, $keys, $values)
+	{	
+		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Update statement
+	 *
+	 * Generates a platform-specific update string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the update data
+	 * @param	array	the where clause
+	 * @param	array	the orderby clause
+	 * @param	array	the limit clause
+	 * @return	string
+	 */
+	function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+	{
+		foreach($values as $key => $val)
+		{
+			$valstr[] = $key." = ".$val;
+		}
+		
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+		
+		$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+	
+		$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+		$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+		$sql .= $orderby.$limit;
+		
+		return $sql;
+	}
+
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Truncate statement
+	 *
+	 * Generates a platform-specific truncate string from the supplied data
+	 * If the database does not support the truncate() command
+	 * This function maps to "DELETE FROM table"
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @return	string
+	 */	
+	function _truncate($table)
+	{
+		return $this->_delete($table);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete statement
+	 *
+	 * Generates a platform-specific delete string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the where clause
+	 * @param	string	the limit clause
+	 * @return	string
+	 */	
+	function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+	{
+		$conditions = '';
+
+		if (count($where) > 0 OR count($like) > 0)
+		{
+			$conditions = "\nWHERE ";
+			$conditions .= implode("\n", $this->ar_where);
+
+			if (count($where) > 0 && count($like) > 0)
+			{
+				$conditions .= " AND ";
+			}
+			$conditions .= implode("\n", $like);
+		}
+
+		$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+	
+		return "DELETE FROM ".$table.$conditions.$limit;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Limit string
+	 *
+	 * Generates a platform-specific LIMIT clause
+	 *
+	 * @access	public
+	 * @param	string	the sql query string
+	 * @param	integer	the number of rows to limit the query to
+	 * @param	integer	the offset value
+	 * @return	string
+	 */
+	function _limit($sql, $limit, $offset)
+	{	
+		if ($offset == 0)
+		{
+			$offset = '';
+		}
+		else
+		{
+			$offset .= ", ";
+		}
+		
+		return $sql."LIMIT ".$offset.$limit;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Close DB Connection
+	 *
+	 * @access	public
+	 * @param	resource
+	 * @return	void
+	 */
+	function _close($conn_id)
+	{
+		@sqlite_close($conn_id);
+	}
+
+
+}
+
+
+/* End of file sqlite_driver.php */
 /* Location: ./system/database/drivers/sqlite/sqlite_driver.php */
\ No newline at end of file
diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php
index 2039525..73630de 100644
--- a/system/database/drivers/sqlite/sqlite_forge.php
+++ b/system/database/drivers/sqlite/sqlite_forge.php
@@ -1,265 +1,265 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * SQLite Forge Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_sqlite_forge extends CI_DB_forge {

-

-	/**

-	 * Create database

-	 *

-	 * @access	public

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database()

-	{

-		// In SQLite, a database is created when you connect to the database.

-		// We'll return TRUE so that an error isn't generated

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		if ( ! @file_exists($this->db->database) OR ! @unlink($this->db->database))

-		{

-			if ($this->db->db_debug)

-			{

-				return $this->db->display_error('db_unable_to_drop');

-			}

-			return FALSE;

-		}

-		return TRUE;

-	}

-	// --------------------------------------------------------------------

-

-	/**

-	 * Create Table

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @param	array	the fields

-	 * @param	mixed	primary key(s)

-	 * @param	mixed	key(s)

-	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL

-	 * @return	bool

-	 */

-	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)

-	{

-		$sql = 'CREATE TABLE ';

-		

-		// IF NOT EXISTS added to SQLite in 3.3.0

-		if ($if_not_exists === TRUE && version_compare($this->_version(), '3.3.0', '>=') === TRUE)

-		{

-			$sql .= 'IF NOT EXISTS ';

-		}

-		

-		$sql .= $this->db->_escape_identifiers($table)."(";

-		$current_field_count = 0;

-

-		foreach ($fields as $field=>$attributes)

-		{

-			// Numeric field names aren't allowed in databases, so if the key is

-			// numeric, we know it was assigned by PHP and the developer manually

-			// entered the field information, so we'll simply add it to the list

-			if (is_numeric($field))

-			{

-				$sql .= "\n\t$attributes";

-			}

-			else

-			{

-				$attributes = array_change_key_case($attributes, CASE_UPPER);

-				

-				$sql .= "\n\t".$this->db->_protect_identifiers($field);

-				

-				$sql .=  ' '.$attributes['TYPE'];

-	

-				if (array_key_exists('CONSTRAINT', $attributes))

-				{

-					$sql .= '('.$attributes['CONSTRAINT'].')';

-				}

-	

-				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)

-				{

-					$sql .= ' UNSIGNED';

-				}

-	

-				if (array_key_exists('DEFAULT', $attributes))

-				{

-					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';

-				}

-	

-				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)

-				{

-					$sql .= ' NULL';

-				}

-				else

-				{

-					$sql .= ' NOT NULL';			

-				}

-	

-				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)

-				{

-					$sql .= ' AUTO_INCREMENT';

-				}

-			}

-			

-			// don't add a comma on the end of the last field

-			if (++$current_field_count < count($fields))

-			{

-				$sql .= ',';

-			}

-		}

-

-		if (count($primary_keys) > 0)

-		{

-			$primary_keys = $this->db->_protect_identifiers($primary_keys);

-			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";

-		}

-

-		if (is_array($keys) && count($keys) > 0)

-		{

-			foreach ($keys as $key)

-			{

-				if (is_array($key))

-				{

-					$key = $this->db->_protect_identifiers($key);	

-				}

-				else

-				{

-					$key = array($this->db->_protect_identifiers($key));

-				}

-				

-				$sql .= ",\n\tUNIQUE (" . implode(', ', $key) . ")";

-			}

-		}

-

-		$sql .= "\n)";

-

-		return $sql;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop Table

-	 *

-	 *  Unsupported feature in SQLite

-	 *

-	 * @access	private

-	 * @return	bool

-	 */

-	function _drop_table($table)

-	{

-		if ($this->db->db_debug)

-		{

-			return $this->db->display_error('db_unsuported_feature');

-		}

-		return array();

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Alter table query

-	 *

-	 * Generates a platform-specific query so that a table can be altered

-	 * Called by add_column(), drop_column(), and column_alter(),

-	 *

-	 * @access	private

-	 * @param	string	the ALTER type (ADD, DROP, CHANGE)

-	 * @param	string	the column name

-	 * @param	string	the table name

-	 * @param	string	the column definition

-	 * @param	string	the default value

-	 * @param	boolean	should 'NOT NULL' be added

-	 * @param	string	the field after which we should add the new field

-	 * @return	object

-	 */

-	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);

-

-		// DROP has everything it needs now.

-		if ($alter_type == 'DROP')

-		{

-			// SQLite does not support dropping columns

-			// http://www.sqlite.org/omitted.html

-			// http://www.sqlite.org/faq.html#q11

-			return FALSE;

-		}

-

-		$sql .= " $column_definition";

-

-		if ($default_value != '')

-		{

-			$sql .= " DEFAULT \"$default_value\"";

-		}

-

-		if ($null === NULL)

-		{

-			$sql .= ' NULL';

-		}

-		else

-		{

-			$sql .= ' NOT NULL';

-		}

-

-		if ($after_field != '')

-		{

-			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);

-		}

-		

-		return $sql;

-		

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Rename a table

-	 *

-	 * Generates a platform-specific query so that a table can be renamed

-	 *

-	 * @access	private

-	 * @param	string	the old table name

-	 * @param	string	the new table name

-	 * @return	string

-	 */

-	function _rename_table($table_name, $new_table_name)

-	{

-		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);

-		return $sql;

-	}

-}

-

-/* End of file sqlite_forge.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * SQLite Forge Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_sqlite_forge extends CI_DB_forge {
+
+	/**
+	 * Create database
+	 *
+	 * @access	public
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database()
+	{
+		// In SQLite, a database is created when you connect to the database.
+		// We'll return TRUE so that an error isn't generated
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		if ( ! @file_exists($this->db->database) OR ! @unlink($this->db->database))
+		{
+			if ($this->db->db_debug)
+			{
+				return $this->db->display_error('db_unable_to_drop');
+			}
+			return FALSE;
+		}
+		return TRUE;
+	}
+	// --------------------------------------------------------------------
+
+	/**
+	 * Create Table
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @param	array	the fields
+	 * @param	mixed	primary key(s)
+	 * @param	mixed	key(s)
+	 * @param	boolean	should 'IF NOT EXISTS' be added to the SQL
+	 * @return	bool
+	 */
+	function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+	{
+		$sql = 'CREATE TABLE ';
+		
+		// IF NOT EXISTS added to SQLite in 3.3.0
+		if ($if_not_exists === TRUE && version_compare($this->_version(), '3.3.0', '>=') === TRUE)
+		{
+			$sql .= 'IF NOT EXISTS ';
+		}
+		
+		$sql .= $this->db->_escape_identifiers($table)."(";
+		$current_field_count = 0;
+
+		foreach ($fields as $field=>$attributes)
+		{
+			// Numeric field names aren't allowed in databases, so if the key is
+			// numeric, we know it was assigned by PHP and the developer manually
+			// entered the field information, so we'll simply add it to the list
+			if (is_numeric($field))
+			{
+				$sql .= "\n\t$attributes";
+			}
+			else
+			{
+				$attributes = array_change_key_case($attributes, CASE_UPPER);
+				
+				$sql .= "\n\t".$this->db->_protect_identifiers($field);
+				
+				$sql .=  ' '.$attributes['TYPE'];
+	
+				if (array_key_exists('CONSTRAINT', $attributes))
+				{
+					$sql .= '('.$attributes['CONSTRAINT'].')';
+				}
+	
+				if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+				{
+					$sql .= ' UNSIGNED';
+				}
+	
+				if (array_key_exists('DEFAULT', $attributes))
+				{
+					$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+				}
+	
+				if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
+				{
+					$sql .= ' NULL';
+				}
+				else
+				{
+					$sql .= ' NOT NULL';			
+				}
+	
+				if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+				{
+					$sql .= ' AUTO_INCREMENT';
+				}
+			}
+			
+			// don't add a comma on the end of the last field
+			if (++$current_field_count < count($fields))
+			{
+				$sql .= ',';
+			}
+		}
+
+		if (count($primary_keys) > 0)
+		{
+			$primary_keys = $this->db->_protect_identifiers($primary_keys);
+			$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
+		}
+
+		if (is_array($keys) && count($keys) > 0)
+		{
+			foreach ($keys as $key)
+			{
+				if (is_array($key))
+				{
+					$key = $this->db->_protect_identifiers($key);	
+				}
+				else
+				{
+					$key = array($this->db->_protect_identifiers($key));
+				}
+				
+				$sql .= ",\n\tUNIQUE (" . implode(', ', $key) . ")";
+			}
+		}
+
+		$sql .= "\n)";
+
+		return $sql;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop Table
+	 *
+	 *  Unsupported feature in SQLite
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _drop_table($table)
+	{
+		if ($this->db->db_debug)
+		{
+			return $this->db->display_error('db_unsuported_feature');
+		}
+		return array();
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Alter table query
+	 *
+	 * Generates a platform-specific query so that a table can be altered
+	 * Called by add_column(), drop_column(), and column_alter(),
+	 *
+	 * @access	private
+	 * @param	string	the ALTER type (ADD, DROP, CHANGE)
+	 * @param	string	the column name
+	 * @param	string	the table name
+	 * @param	string	the column definition
+	 * @param	string	the default value
+	 * @param	boolean	should 'NOT NULL' be added
+	 * @param	string	the field after which we should add the new field
+	 * @return	object
+	 */
+	function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
+
+		// DROP has everything it needs now.
+		if ($alter_type == 'DROP')
+		{
+			// SQLite does not support dropping columns
+			// http://www.sqlite.org/omitted.html
+			// http://www.sqlite.org/faq.html#q11
+			return FALSE;
+		}
+
+		$sql .= " $column_definition";
+
+		if ($default_value != '')
+		{
+			$sql .= " DEFAULT \"$default_value\"";
+		}
+
+		if ($null === NULL)
+		{
+			$sql .= ' NULL';
+		}
+		else
+		{
+			$sql .= ' NOT NULL';
+		}
+
+		if ($after_field != '')
+		{
+			$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+		}
+		
+		return $sql;
+		
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Rename a table
+	 *
+	 * Generates a platform-specific query so that a table can be renamed
+	 *
+	 * @access	private
+	 * @param	string	the old table name
+	 * @param	string	the new table name
+	 * @return	string
+	 */
+	function _rename_table($table_name, $new_table_name)
+	{
+		$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+		return $sql;
+	}
+}
+
+/* End of file sqlite_forge.php */
 /* Location: ./system/database/drivers/sqlite/sqlite_forge.php */
\ No newline at end of file
diff --git a/system/database/drivers/sqlite/sqlite_result.php b/system/database/drivers/sqlite/sqlite_result.php
index 735a073..bed1698 100644
--- a/system/database/drivers/sqlite/sqlite_result.php
+++ b/system/database/drivers/sqlite/sqlite_result.php
@@ -1,179 +1,179 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * SQLite Result Class

- *

- * This class extends the parent result class: CI_DB_result

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_sqlite_result extends CI_DB_result {

-	

-	/**

-	 * Number of rows in the result set

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function num_rows()

-	{

-		return @sqlite_num_rows($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Number of fields in the result set

-	 *

-	 * @access	public

-	 * @return	integer

-	 */

-	function num_fields()

-	{

-		return @sqlite_num_fields($this->result_id);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Fetch Field Names

-	 *

-	 * Generates an array of column names

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function list_fields()

-	{

-		$field_names = array();

-		for ($i = 0; $i < $this->num_fields(); $i++)

-		{

-			$field_names[] = sqlite_field_name($this->result_id, $i);

-		}

-		

-		return $field_names;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Field data

-	 *

-	 * Generates an array of objects containing field meta-data

-	 *

-	 * @access	public

-	 * @return	array

-	 */

-	function field_data()

-	{

-		$retval = array();

-		for ($i = 0; $i < $this->num_fields(); $i++)

-		{

-			$F 				= new stdClass();

-			$F->name 		= sqlite_field_name($this->result_id, $i);

-			$F->type 		= 'varchar';

-			$F->max_length	= 0;

-			$F->primary_key = 0;

-			$F->default		= '';

-

-			$retval[] = $F;

-		}

-		

-		return $retval;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Free the result

-	 *

-	 * @return	null

-	 */		

-	function free_result()

-	{

-		// Not implemented in SQLite

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Data Seek

-	 *

-	 * Moves the internal pointer to the desired offset.  We call

-	 * this internally before fetching results to make sure the

-	 * result set starts at zero

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _data_seek($n = 0)

-	{

-		return sqlite_seek($this->result_id, $n);

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - associative array

-	 *

-	 * Returns the result set as an array

-	 *

-	 * @access	private

-	 * @return	array

-	 */

-	function _fetch_assoc()

-	{

-		return sqlite_fetch_array($this->result_id);

-	}

-	

-	// --------------------------------------------------------------------

-

-	/**

-	 * Result - object

-	 *

-	 * Returns the result set as an object

-	 *

-	 * @access	private

-	 * @return	object

-	 */

-	function _fetch_object()

-	{

-		if (function_exists('sqlite_fetch_object'))

-		{

-			return sqlite_fetch_object($this->result_id);

-		}

-		else

-		{

-			$arr = sqlite_fetch_array($this->result_id, SQLITE_ASSOC);

-			if (is_array($arr))

-			{

-				$obj = (object) $arr;

-				return $obj;

-			} else {

-				return NULL;

-			} 

-		}

-	}

-

-}

-

-

-/* End of file sqlite_result.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * SQLite Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_sqlite_result extends CI_DB_result {
+	
+	/**
+	 * Number of rows in the result set
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function num_rows()
+	{
+		return @sqlite_num_rows($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Number of fields in the result set
+	 *
+	 * @access	public
+	 * @return	integer
+	 */
+	function num_fields()
+	{
+		return @sqlite_num_fields($this->result_id);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Fetch Field Names
+	 *
+	 * Generates an array of column names
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function list_fields()
+	{
+		$field_names = array();
+		for ($i = 0; $i < $this->num_fields(); $i++)
+		{
+			$field_names[] = sqlite_field_name($this->result_id, $i);
+		}
+		
+		return $field_names;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Field data
+	 *
+	 * Generates an array of objects containing field meta-data
+	 *
+	 * @access	public
+	 * @return	array
+	 */
+	function field_data()
+	{
+		$retval = array();
+		for ($i = 0; $i < $this->num_fields(); $i++)
+		{
+			$F 				= new stdClass();
+			$F->name 		= sqlite_field_name($this->result_id, $i);
+			$F->type 		= 'varchar';
+			$F->max_length	= 0;
+			$F->primary_key = 0;
+			$F->default		= '';
+
+			$retval[] = $F;
+		}
+		
+		return $retval;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Free the result
+	 *
+	 * @return	null
+	 */		
+	function free_result()
+	{
+		// Not implemented in SQLite
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Data Seek
+	 *
+	 * Moves the internal pointer to the desired offset.  We call
+	 * this internally before fetching results to make sure the
+	 * result set starts at zero
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _data_seek($n = 0)
+	{
+		return sqlite_seek($this->result_id, $n);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - associative array
+	 *
+	 * Returns the result set as an array
+	 *
+	 * @access	private
+	 * @return	array
+	 */
+	function _fetch_assoc()
+	{
+		return sqlite_fetch_array($this->result_id);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Result - object
+	 *
+	 * Returns the result set as an object
+	 *
+	 * @access	private
+	 * @return	object
+	 */
+	function _fetch_object()
+	{
+		if (function_exists('sqlite_fetch_object'))
+		{
+			return sqlite_fetch_object($this->result_id);
+		}
+		else
+		{
+			$arr = sqlite_fetch_array($this->result_id, SQLITE_ASSOC);
+			if (is_array($arr))
+			{
+				$obj = (object) $arr;
+				return $obj;
+			} else {
+				return NULL;
+			} 
+		}
+	}
+
+}
+
+
+/* End of file sqlite_result.php */
 /* Location: ./system/database/drivers/sqlite/sqlite_result.php */
\ No newline at end of file
diff --git a/system/database/drivers/sqlite/sqlite_utility.php b/system/database/drivers/sqlite/sqlite_utility.php
index 3527b5b..c067403 100644
--- a/system/database/drivers/sqlite/sqlite_utility.php
+++ b/system/database/drivers/sqlite/sqlite_utility.php
@@ -1,141 +1,141 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

-/**

- * CodeIgniter

- *

- * An open source application development framework for PHP 4.3.2 or newer

- *

- * @package		CodeIgniter

- * @author		ExpressionEngine Dev Team

- * @copyright	Copyright (c) 2008, EllisLab, Inc.

- * @license		http://codeigniter.com/user_guide/license.html

- * @link		http://codeigniter.com

- * @since		Version 1.0

- * @filesource

- */

-

-// ------------------------------------------------------------------------

-

-/**

- * SQLite Utility Class

- *

- * @category	Database

- * @author		ExpressionEngine Dev Team

- * @link		http://codeigniter.com/user_guide/database/

- */

-class CI_DB_sqlite_utility extends CI_DB_utility {

-

-	/**

-	 * List databases

-	 *

-	 * I don't believe you can do a database listing with SQLite

-	 * since each database is its own file.  I suppose we could

-	 * try reading a directory looking for SQLite files, but

-	 * that doesn't seem like a terribly good idea

-	 *

-	 * @access	private

-	 * @return	bool

-	 */

-	function _list_databases()

-	{

-		if ($this->db_debug)

-		{

-			return $this->display_error('db_unsuported_feature');

-		}

-		return array();

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Optimize table query

-	 *

-	 * Is optimization even supported in SQLite?

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _optimize_table($table)

-	{

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Repair table query

-	 *

-	 * Are table repairs even supported in SQLite?

-	 *

-	 * @access	private

-	 * @param	string	the table name

-	 * @return	object

-	 */

-	function _repair_table($table)

-	{

-		return FALSE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * SQLite Export

-	 *

-	 * @access	private

-	 * @param	array	Preferences

-	 * @return	mixed

-	 */

-	function _backup($params = array())

-	{

-		// Currently unsupported

-		return $this->db->display_error('db_unsuported_feature');

-	}

-

-	/**

-	 *

-	 * The functions below have been deprecated as of 1.6, and are only here for backwards

-	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation

-	 * is STRONGLY discouraged in favour if using dbforge.

-	 *

-	 */

-

-	/**

-	 * Create database

-	 *

-	 * @access	public

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _create_database()

-	{

-		// In SQLite, a database is created when you connect to the database.

-		// We'll return TRUE so that an error isn't generated

-		return TRUE;

-	}

-

-	// --------------------------------------------------------------------

-

-	/**

-	 * Drop database

-	 *

-	 * @access	private

-	 * @param	string	the database name

-	 * @return	bool

-	 */

-	function _drop_database($name)

-	{

-		if ( ! @file_exists($this->db->database) OR ! @unlink($this->db->database))

-		{

-			if ($this->db->db_debug)

-			{

-				return $this->db->display_error('db_unable_to_drop');

-			}

-			return FALSE;

-		}

-		return TRUE;

-	}

-

-}

-

-/* End of file sqlite_utility.php */

+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * SQLite Utility Class
+ *
+ * @category	Database
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_sqlite_utility extends CI_DB_utility {
+
+	/**
+	 * List databases
+	 *
+	 * I don't believe you can do a database listing with SQLite
+	 * since each database is its own file.  I suppose we could
+	 * try reading a directory looking for SQLite files, but
+	 * that doesn't seem like a terribly good idea
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _list_databases()
+	{
+		if ($this->db_debug)
+		{
+			return $this->display_error('db_unsuported_feature');
+		}
+		return array();
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Optimize table query
+	 *
+	 * Is optimization even supported in SQLite?
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _optimize_table($table)
+	{
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Repair table query
+	 *
+	 * Are table repairs even supported in SQLite?
+	 *
+	 * @access	private
+	 * @param	string	the table name
+	 * @return	object
+	 */
+	function _repair_table($table)
+	{
+		return FALSE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * SQLite Export
+	 *
+	 * @access	private
+	 * @param	array	Preferences
+	 * @return	mixed
+	 */
+	function _backup($params = array())
+	{
+		// Currently unsupported
+		return $this->db->display_error('db_unsuported_feature');
+	}
+
+	/**
+	 *
+	 * The functions below have been deprecated as of 1.6, and are only here for backwards
+	 * compatibility.  They now reside in dbforge().  The use of dbutils for database manipulation
+	 * is STRONGLY discouraged in favour if using dbforge.
+	 *
+	 */
+
+	/**
+	 * Create database
+	 *
+	 * @access	public
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _create_database()
+	{
+		// In SQLite, a database is created when you connect to the database.
+		// We'll return TRUE so that an error isn't generated
+		return TRUE;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Drop database
+	 *
+	 * @access	private
+	 * @param	string	the database name
+	 * @return	bool
+	 */
+	function _drop_database($name)
+	{
+		if ( ! @file_exists($this->db->database) OR ! @unlink($this->db->database))
+		{
+			if ($this->db->db_debug)
+			{
+				return $this->db->display_error('db_unable_to_drop');
+			}
+			return FALSE;
+		}
+		return TRUE;
+	}
+
+}
+
+/* End of file sqlite_utility.php */
 /* Location: ./system/database/drivers/sqlite/sqlite_utility.php */
\ No newline at end of file
diff --git a/system/database/index.html b/system/database/index.html
index 065d2da..c942a79 100644
--- a/system/database/index.html
+++ b/system/database/index.html
@@ -1,10 +1,10 @@
-<html>

-<head>

-	<title>403 Forbidden</title>

-</head>

-<body>

-

-<p>Directory access is forbidden.</p>

-

-</body>

+<html>
+<head>
+	<title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
 </html>
\ No newline at end of file