Source for file Mysql.php

Documentation is available at Mysql.php

  1. <?php
  2. /*
  3.  *  $Id: Mysql.php 1773 2007-06-19 23:33:04Z zYne $
  4.  *
  5.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9.  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15.  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16.  *
  17.  * This software consists of voluntary contributions made by many individuals
  18.  * and is licensed under the LGPL. For more information, see
  19.  * <http://www.phpdoctrine.com>.
  20.  */
  21. Doctrine::autoload('Doctrine_Connection_Common');
  22. /**
  23.  * Doctrine_Connection_Mysql
  24.  *
  25.  * @package     Doctrine
  26.  * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
  27.  * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
  28.  * @author      Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
  29.  * @version     $Revision: 1773 $
  30.  * @category    Object Relational Mapping
  31.  * @link        www.phpdoctrine.com
  32.  * @since       1.0
  33.  */
  34. {
  35.     /**
  36.      * @var string $driverName                  the name of this connection driver
  37.      */
  38.     protected $driverName = 'Mysql';
  39.     /**
  40.      * the constructor
  41.      *
  42.      * @param Doctrine_Manager $manager 
  43.      * @param PDO|Doctrine_Adapter$adapter     database handler
  44.      */
  45.     public function __construct(Doctrine_Manager $manager$adapter)
  46.     {
  47.         $this->setAttribute(PDO::ATTR_EMULATE_PREPAREStrue);
  48.         $this->setAttribute(Doctrine::ATTR_DEFAULT_TABLE_TYPE'INNODB');
  49.  
  50.         $this->supported = array(
  51.                           'sequences'            => 'emulated',
  52.                           'indexes'              => true,
  53.                           'affected_rows'        => true,
  54.                           'transactions'         => true,
  55.                           'savepoints'           => false,
  56.                           'summary_functions'    => true,
  57.                           'order_by_text'        => true,
  58.                           'current_id'           => 'emulated',
  59.                           'limit_queries'        => true,
  60.                           'LOBs'                 => true,
  61.                           'replace'              => true,
  62.                           'sub_selects'          => true,
  63.                           'auto_increment'       => true,
  64.                           'primary_key'          => true,
  65.                           'result_introspection' => true,
  66.                           'prepared_statements'  => 'emulated',
  67.                           'identifier_quoting'   => true,
  68.                           'pattern_escaping'     => true
  69.                           );
  70.  
  71.         $this->properties['string_quoting'array('start' => "'",
  72.                                                     'end' => "'",
  73.                                                     'escape' => '\\',
  74.                                                     'escape_pattern' => '\\');
  75.  
  76.         $this->properties['identifier_quoting'array('start' => '`',
  77.                                                         'end' => '`',
  78.                                                         'escape' => '`');
  79.  
  80.         $this->properties['sql_comments'array(
  81.                                             array('start' => '-- ''end' => "\n"'escape' => false),
  82.                                             array('start' => '#''end' => "\n"'escape' => false),
  83.                                             array('start' => '/*''end' => '*/''escape' => false),
  84.                                             );
  85.  
  86.         $this->properties['varchar_max_length'255;
  87.  
  88.         parent::__construct($manager$adapter);
  89.     }
  90.     /**
  91.      * Set the charset on the current connection
  92.      *
  93.      * @param string    charset
  94.      *
  95.      * @return void 
  96.      */
  97.     public function setCharset($charset)
  98.     {
  99.         $query 'SET NAMES '.$this->dbh->quote($charset);
  100.         $this->exec($query);
  101.     }
  102.     /**
  103.      * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT
  104.      * query, except that if there is already a row in the table with the same
  105.      * key field values, the REPLACE query just updates its values instead of
  106.      * inserting a new row.
  107.      *
  108.      * The REPLACE type of query does not make part of the SQL standards. Since
  109.      * practically only MySQL implements it natively, this type of query is
  110.      * emulated through this method for other DBMS using standard types of
  111.      * queries inside a transaction to assure the atomicity of the operation.
  112.      *
  113.      * @access public
  114.      *
  115.      * @param string $table name of the table on which the REPLACE query will
  116.      *   be executed.
  117.      * @param array $fields associative array that describes the fields and the
  118.      *   values that will be inserted or updated in the specified table. The
  119.      *   indexes of the array are the names of all the fields of the table. The
  120.      *   values of the array are also associative arrays that describe the
  121.      *   values and other properties of the table fields.
  122.      *
  123.      *   Here follows a list of field properties that need to be specified:
  124.      *
  125.      *     value:
  126.      *           Value to be assigned to the specified field. This value may be
  127.      *           of specified in database independent type format as this
  128.      *           function can perform the necessary datatype conversions.
  129.      *
  130.      *     Default:
  131.      *           this property is required unless the Null property
  132.      *           is set to 1.
  133.      *
  134.      *     type
  135.      *           Name of the type of the field. Currently, all types Metabase
  136.      *           are supported except for clob and blob.
  137.      *
  138.      *     Default: no type conversion
  139.      *
  140.      *     null
  141.      *           Boolean property that indicates that the value for this field
  142.      *           should be set to null.
  143.      *
  144.      *           The default value for fields missing in INSERT queries may be
  145.      *           specified the definition of a table. Often, the default value
  146.      *           is already null, but since the REPLACE may be emulated using
  147.      *           an UPDATE query, make sure that all fields of the table are
  148.      *           listed in this function argument array.
  149.      *
  150.      *     Default: 0
  151.      *
  152.      *     key
  153.      *           Boolean property that indicates that this field should be
  154.      *           handled as a primary key or at least as part of the compound
  155.      *           unique index of the table that will determine the row that will
  156.      *           updated if it exists or inserted a new row otherwise.
  157.      *
  158.      *           This function will fail if no key field is specified or if the
  159.      *           value of a key field is set to null because fields that are
  160.      *           part of unique index they may not be null.
  161.      *
  162.      *     Default: 0
  163.      *
  164.      * @return integer      the number of affected rows
  165.      */
  166.     public function replace($tablearray $fieldsarray $keys)
  167.     {
  168.         $count count($fields);
  169.         $query $values '';
  170.         $keys $colnum 0;
  171.  
  172.         for (reset($fields)$colnum $countnext($fields)$colnum++{
  173.             $name key($fields);
  174.  
  175.             if ($colnum 0{
  176.                 $query .= ',';
  177.                 $values.= ',';
  178.             }
  179.  
  180.             $query .= $name;
  181.  
  182.             if (isset($fields[$name]['null']&& $fields[$name]['null']{
  183.                 $value 'NULL';
  184.             else {
  185.                 $type = isset($fields[$name]['type']$fields[$name]['type'null;
  186.                 $value $this->quote($fields[$name]['value']$type);
  187.             }
  188.  
  189.             $values .= $value;
  190.  
  191.             if (isset($fields[$name]['key']&& $fields[$name]['key']{
  192.                 if ($value === 'NULL'{
  193.                     throw new Doctrine_Connection_Mysql_Exception('key value '.$name.' may not be NULL');
  194.                 }
  195.                 $keys++;
  196.             }
  197.         }
  198.  
  199.         if ($keys == 0{
  200.             throw new Doctrine_Connection_Mysql_Exception('not specified which fields are keys');
  201.         }
  202.         $query 'REPLACE INTO ' $table ' (' $query ') VALUES (' $values ')';
  203.  
  204.         return $this->exec($query);
  205.     }
  206. }