1
0
mirror of synced 2024-12-15 07:36:03 +03:00
doctrine2/lib/Doctrine/Connection/Mysql.php

208 lines
7.3 KiB
PHP
Raw Normal View History

2006-08-22 03:16:55 +04:00
<?php
2006-12-29 17:01:31 +03:00
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.org>.
*/
#namespace Doctrine::DBAL::Connections;
2006-08-22 03:16:55 +04:00
/**
* Doctrine_Connection_Mysql
*
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @version $Revision$
* @link www.phpdoctrine.org
* @since 1.0
*/
2006-12-29 17:40:47 +03:00
class Doctrine_Connection_Mysql extends Doctrine_Connection_Common
{
/**
* Driver name.
*
* @var string
*/
protected $_driverName = 'Mysql';
2006-08-22 03:16:55 +04:00
/**
* the constructor
2006-10-31 15:54:58 +03:00
*
* @param Doctrine_Manager $manager
* @param PDO|Doctrine_Adapter $adapter database handler
2006-08-22 03:16:55 +04:00
*/
public function __construct(array $params)
{
parent::__construct($params);
}
/**
* Set the charset on the current connection
*
* @param string charset
*/
2006-12-29 17:40:47 +03:00
public function setCharset($charset)
{
$this->exec('SET NAMES ' . $this->quote($charset));
}
/**
* Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT
* query, except that if there is already a row in the table with the same
* key field values, the REPLACE query just updates its values instead of
* inserting a new row.
*
* The REPLACE type of query does not make part of the SQL standards. Since
* practically only MySQL implements it natively, this type of query is
* emulated through this method for other DBMS using standard types of
* queries inside a transaction to assure the atomicity of the operation.
*
* @access public
*
* @param string $table name of the table on which the REPLACE query will
* be executed.
* @param array $fields associative array that describes the fields and the
* values that will be inserted or updated in the specified table. The
* indexes of the array are the names of all the fields of the table. The
* values of the array are also associative arrays that describe the
* values and other properties of the table fields.
*
* Here follows a list of field properties that need to be specified:
*
* value:
* Value to be assigned to the specified field. This value may be
* of specified in database independent type format as this
* function can perform the necessary datatype conversions.
*
* Default:
* this property is required unless the Null property
* is set to 1.
*
* type
* Name of the type of the field. Currently, all types Metabase
* are supported except for clob and blob.
*
* Default: no type conversion
*
* null
* Boolean property that indicates that the value for this field
* should be set to null.
*
* The default value for fields missing in INSERT queries may be
* specified the definition of a table. Often, the default value
* is already null, but since the REPLACE may be emulated using
* an UPDATE query, make sure that all fields of the table are
* listed in this function argument array.
*
* Default: 0
*
* key
* Boolean property that indicates that this field should be
* handled as a primary key or at least as part of the compound
* unique index of the table that will determine the row that will
* updated if it exists or inserted a new row otherwise.
*
* This function will fail if no key field is specified or if the
* value of a key field is set to null because fields that are
* part of unique index they may not be null.
*
* Default: 0
*
* @return integer the number of affected rows
*/
2008-02-12 15:31:28 +03:00
public function replace($tableName, array $data, array $keys)
2006-12-29 17:40:47 +03:00
{
2008-02-12 15:31:28 +03:00
$count = count($data);
$query = $values = '';
$keys = $colnum = 0;
2008-02-12 15:31:28 +03:00
for (reset($data); $colnum < $count; next($data), $colnum++) {
$name = key($data);
2006-12-29 17:01:31 +03:00
if ($colnum > 0) {
$query .= ',';
$values.= ',';
}
2008-02-12 15:31:28 +03:00
$query .= $name;
2008-02-12 15:31:28 +03:00
if (isset($data[$name]['null']) && $data[$name]['null']) {
$value = 'NULL';
} else {
2008-02-12 15:31:28 +03:00
$type = isset($data[$name]['type']) ? $data[$name]['type'] : null;
$value = $this->quote($data[$name]['value'], $type);
}
$values .= $value;
2008-02-12 15:31:28 +03:00
if (isset($data[$name]['key']) && $data[$name]['key']) {
2006-12-29 17:01:31 +03:00
if ($value === 'NULL') {
2008-02-12 15:31:28 +03:00
throw new Doctrine_Connection_Mysql_Exception('key value '.$name.' may not be NULL.');
2006-12-29 17:01:31 +03:00
}
$keys++;
}
}
2006-12-29 17:01:31 +03:00
if ($keys == 0) {
2008-02-12 15:31:28 +03:00
throw new Doctrine_Connection_Mysql_Exception('Not specified which fields are keys.');
2006-12-29 17:01:31 +03:00
}
2008-02-12 15:31:28 +03:00
$query = 'REPLACE INTO ' . $tableName . ' (' . $query . ') VALUES (' . $values . ')';
return $this->exec($query);
}
/**
* Constructs the MySql PDO DSN.
*
* Overrides Connection#_constructPdoDsn().
*
* @return string The DSN.
*/
protected function _constructPdoDsn()
{
$dsn = 'mysql:';
if (isset($this->_params['host'])) {
$dsn .= 'host=' . $this->_params['host'] . ';';
}
if (isset($this->_params['port'])) {
$dsn .= 'port=' . $this->_params['port'] . ';';
}
if (isset($this->_params['dbname'])) {
$dsn .= 'dbname=' . $this->_params['dbname'] . ';';
}
if (isset($this->_params['unix_socket'])) {
$dsn .= 'unix_socket=' . $this->_params['unix_socket'] . ';';
}
return $dsn;
}
/**
* Gets the DatabasePlatform for the connection.
*
* @return Doctrine::DBAL::Platforms::MySqlPlatform
*/
public function getDatabasePlatform()
{
if ( ! $this->_platform) {
$this->_platform = new Doctrine_DatabasePlatform_MySqlPlatform();
}
return $this->_platform;
}
2007-11-03 18:47:24 +03:00
}