Merge branch 'develop' of git://github.com/EllisLab/CodeIgniter into develop
diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php
index c5a215b..24c658a 100644
--- a/system/database/drivers/pdo/pdo_driver.php
+++ b/system/database/drivers/pdo/pdo_driver.php
@@ -49,7 +49,7 @@
 
 	function __construct($params)
 	{
-		parent::CI_DB($params);
+		parent::__construct($params);
 		
 		// clause and character used for LIKE escape sequences
 		if(strpos($this->hostname, 'mysql') !== FALSE)
@@ -180,7 +180,14 @@
 		$sql = $this->_prep_query($sql);
 		$result_id = $this->conn_id->query($sql);
 		
-		$this->affect_rows = $result_id->rowCount();
+		if(is_object($result_id))
+		{
+			$this->affect_rows = $result_id->rowCount();
+		}
+		else
+		{
+			$this->affect_rows = 0;
+		}
 		
 		return $result_id;
 	}
@@ -301,10 +308,16 @@
 
 			return $str;
 		}
-
-		// PDO doesn't require escaping
-		$str = remove_invisible_characters($str);
-
+		
+		//Escape the string
+		$str = $this->conn_id->quote($str);
+		
+		//If there are duplicated quotes, trim them away
+		if(strpos($str, "'") === 0)
+		{
+			$str = substr($str, 1, -1);
+		}
+		
 		// escape LIKE condition wildcards
 		if ($like === TRUE)
 		{
@@ -339,7 +352,25 @@
 	 */
 	function insert_id($name=NULL)
 	{
-		return $this->conn_id->lastInsertId($name);
+		//Convenience method for postgres insertid
+		if(strpos($this->hostname, 'pgsql') !== FALSE)
+		{
+			$v = $this->_version();
+
+			$table	= func_num_args() > 0 ? func_get_arg(0) : NULL;
+
+			if ($table == NULL && $v >= '8.1')
+			{
+				$sql='SELECT LASTVAL() as ins_id';
+			}
+			$query = $this->query($sql);
+			$row = $query->row();
+			return $row->ins_id;
+		}
+		else
+		{
+			return $this->conn_id->lastInsertId($name);
+		}
 	}
 
 	// --------------------------------------------------------------------
@@ -538,6 +569,24 @@
 	{
 		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
 	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Insert_batch statement
+	 *
+	 * Generates a platform-specific insert string from the supplied data
+	 *
+	 * @access  public
+	 * @param   string  the table name
+	 * @param   array   the insert keys
+	 * @param   array   the insert values
+	 * @return  string
+	 */
+	function _insert_batch($table, $keys, $values)
+	{
+		return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values);
+	}
 
 	// --------------------------------------------------------------------
 
@@ -573,6 +622,58 @@
 
 		return $sql;
 	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Update_Batch statement
+	 *
+	 * Generates a platform-specific batch update string from the supplied data
+	 *
+	 * @access	public
+	 * @param	string	the table name
+	 * @param	array	the update data
+	 * @param	array	the where clause
+	 * @return	string
+	 */
+	function _update_batch($table, $values, $index, $where = NULL)
+	{
+		$ids = array();
+		$where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : '';
+
+		foreach ($values as $key => $val)
+		{
+			$ids[] = $val[$index];
+
+			foreach (array_keys($val) as $field)
+			{
+				if ($field != $index)
+				{
+					$final[$field][] =  'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field];
+				}
+			}
+		}
+
+		$sql = "UPDATE ".$table." SET ";
+		$cases = '';
+
+		foreach ($final as $k => $v)
+		{
+			$cases .= $k.' = CASE '."\n";
+			foreach ($v as $row)
+			{
+				$cases .= $row."\n";
+			}
+
+			$cases .= 'ELSE '.$k.' END, ';
+		}
+
+		$sql .= substr($cases, 0, -2);
+
+		$sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')';
+
+		return $sql;
+	}
 
 
 	// --------------------------------------------------------------------