upgrade to codeigniter 1.7.2 for f12
[www-register-wizard.git] / database / drivers / mysql / mysql_driver.php
index d10a5f0..fe18598 100644 (file)
@@ -6,7 +6,7 @@
  *
  * @package            CodeIgniter
  * @author             ExpressionEngine Dev Team
- * @copyright  Copyright (c) 2008, EllisLab, Inc.
+ * @copyright  Copyright (c) 2008 - 2009, EllisLab, Inc.
  * @license            http://codeigniter.com/user_guide/license.html
  * @link               http://codeigniter.com
  * @since              Version 1.0
@@ -34,7 +34,11 @@ class CI_DB_mysql_driver extends CI_DB {
 
        // The character used for escaping
        var     $_escape_char = '`';
-       
+
+       // clause and character used for LIKE escape sequences - not used in MySQL
+       var $_like_escape_str = '';
+       var $_like_escape_chr = '';
+
        /**
         * Whether to use the MySQL "delete hack" which allows the number
         * of affected rows to be shown. Uses a preg_replace when enabled,
@@ -86,6 +90,25 @@ class CI_DB_mysql_driver extends CI_DB {
        
        // --------------------------------------------------------------------
 
+       /**
+        * Reconnect
+        *
+        * Keep / reestablish the db connection if no queries have been
+        * sent for a length of time exceeding the server's idle timeout
+        *
+        * @access      public
+        * @return      void
+        */
+       function reconnect()
+       {
+               if (mysql_ping($this->conn_id) === FALSE)
+               {
+                       $this->conn_id = FALSE;
+               }
+       }
+
+       // --------------------------------------------------------------------
+       
        /**
         * Select the database
         *
@@ -256,15 +279,16 @@ class CI_DB_mysql_driver extends CI_DB {
         *
         * @access      public
         * @param       string
+        * @param       bool    whether or not the string will be used in a LIKE condition
         * @return      string
         */
-       function escape_str($str)       
+       function escape_str($str, $like = FALSE)        
        {       
                if (is_array($str))
                {
                        foreach($str as $key => $val)
                        {
-                               $str[$key] = $this->escape_str($val);
+                               $str[$key] = $this->escape_str($val, $like);
                        }
                
                        return $str;
@@ -272,16 +296,24 @@ class CI_DB_mysql_driver extends CI_DB {
 
                if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))
                {
-                       return mysql_real_escape_string($str, $this->conn_id);
+                       $str = mysql_real_escape_string($str, $this->conn_id);
                }
                elseif (function_exists('mysql_escape_string'))
                {
-                       return mysql_escape_string($str);
+                       $str = mysql_escape_string($str);
                }
                else
                {
-                       return addslashes($str);
+                       $str = addslashes($str);
+               }
+               
+               // escape LIKE condition wildcards
+               if ($like === TRUE)
+               {
+                       $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
                }
+               
+               return $str;
        }
                
        // --------------------------------------------------------------------
@@ -325,15 +357,19 @@ class CI_DB_mysql_driver extends CI_DB {
        function count_all($table = '')
        {
                if ($table == '')
-                       return '0';
+               {
+                       return 0;
+               }
        
-               $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
-               
+               $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';
+               {
+                       return 0;
+               }
 
                $row = $query->row();
-               return (int)$row->numrows;
+               return (int) $row->numrows;
        }
 
        // --------------------------------------------------------------------
@@ -353,7 +389,7 @@ class CI_DB_mysql_driver extends CI_DB {
 
                if ($prefix_limit !== FALSE AND $this->dbprefix != '')
                {
-                       $sql .= " LIKE '".$this->dbprefix."%'";
+                       $sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'";
                }
 
                return $sql;
@@ -434,7 +470,18 @@ class CI_DB_mysql_driver extends CI_DB {
                {
                        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;                    
@@ -443,7 +490,7 @@ class CI_DB_mysql_driver extends CI_DB {
                {
                        $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);
        }