summaryrefslogtreecommitdiffstats
path: root/system/database/drivers
diff options
context:
space:
mode:
authorPhil Sturgeon <email@philsturgeon.co.uk>2011-10-07 15:55:07 +0200
committerPhil Sturgeon <email@philsturgeon.co.uk>2011-10-07 15:55:07 +0200
commita8b5a9f81d649aa1f583b818905f333d478eba9c (patch)
treef45af5da4353a3f600f203232c294e52b9955578 /system/database/drivers
parent0252fc7ddf80262f915b20100107ec79ba3ccf01 (diff)
parentd66915344f1a09c799dda935cf5c56930c044d34 (diff)
Merge pull request #527 from timw4mail/develop
PDO Driver improvements.
Diffstat (limited to 'system/database/drivers')
-rw-r--r--system/database/drivers/pdo/pdo_driver.php121
1 files changed, 111 insertions, 10 deletions
diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php
index c5a215b82..19e069b06 100644
--- a/system/database/drivers/pdo/pdo_driver.php
+++ b/system/database/drivers/pdo/pdo_driver.php
@@ -49,15 +49,15 @@ class CI_DB_pdo_driver extends CI_DB {
function __construct($params)
{
- parent::CI_DB($params);
+ parent::__construct($params);
// clause and character used for LIKE escape sequences
- if(strpos($this->hostname, 'mysql') !== FALSE)
+ if (strpos($this->hostname, 'mysql') !== FALSE)
{
$this->_like_escape_str = '';
$this->_like_escape_chr = '';
}
- else if(strpos($this->hostname, 'odbc') !== FALSE)
+ else if (strpos($this->hostname, 'odbc') !== FALSE)
{
$this->_like_escape_str = " {escape '%s'} ";
$this->_like_escape_chr = '!';
@@ -180,7 +180,14 @@ class CI_DB_pdo_driver extends CI_DB {
$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 @@ class CI_DB_pdo_driver extends CI_DB {
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 @@ class CI_DB_pdo_driver extends CI_DB {
*/
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 @@ class CI_DB_pdo_driver extends CI_DB {
{
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 @@ class CI_DB_pdo_driver extends CI_DB {
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;
+ }
// --------------------------------------------------------------------
@@ -642,7 +743,7 @@ class CI_DB_pdo_driver extends CI_DB {
*/
function _limit($sql, $limit, $offset)
{
- if(strpos($this->hostname, 'cubrid') !== FALSE || strpos($this->hostname, 'sqlite') !== FALSE)
+ if (strpos($this->hostname, 'cubrid') !== FALSE || strpos($this->hostname, 'sqlite') !== FALSE)
{
if ($offset == 0)
{