<?php
/**
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
* @link https://cakephp.org CakePHP(tm) Project
* @since 3.0.0
* @license https://opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Database\Driver;
use Cake\Database\Query;
use Cake\Database\Statement\PDOStatement;
use PDO;
use PDOException;
/**
* PDO driver trait
*
* @deprecated 3.6.0 The methods of this trait have been added to `Driver` class.
*/
trait PDODriverTrait
{
/**
* Instance of PDO.
*
* @var \PDO|null
*/
protected $_connection;
/**
* Establishes a connection to the database server
*
* @param string $dsn A Driver-specific PDO-DSN
* @param array $config configuration to be used for creating connection
* @return bool true on success
*/
protected function _connect($dsn, array $config)
{
$connection = new PDO(
$dsn,
$config['username'],
$config['password'],
$config['flags']
);
$this->connection($connection);
return true;
}
/**
* Returns correct connection resource or object that is internally used
* If first argument is passed, it will set internal connection object or
* result to the value passed
*
* @param \PDO|null $connection The PDO connection instance.
* @return \PDO connection object used internally
*/
public function connection($connection = null)
{
if ($connection !== null) {
$this->_connection = $connection;
}
return $this->_connection;
}
/**
* Disconnects from database server
*
* @return void
*/
public function disconnect()
{
$this->_connection = null;
}
/**
* Checks whether or not the driver is connected.
*
* @return bool
*/
public function isConnected()
{
if ($this->_connection === null) {
$connected = false;
} else {
try {
$connected = $this->_connection->query('SELECT 1');
} catch (PDOException $e) {
$connected = false;
}
}
return (bool)$connected;
}
/**
* Prepares a sql statement to be executed
*
* @param string|\Cake\Database\Query $query The query to turn into a prepared statement.
* @return \Cake\Database\StatementInterface
*/
public function prepare($query)
{
$this->connect();
$isObject = $query instanceof Query;
$statement = $this->_connection->prepare($isObject ? $query->sql() : $query);
return new PDOStatement($statement, $this);
}
/**
* Starts a transaction
*
* @return bool true on success, false otherwise
*/
public function beginTransaction()
{
$this->connect();
if ($this->_connection->inTransaction()) {
return true;
}
return $this->_connection->beginTransaction();
}
/**
* Commits a transaction
*
* @return bool true on success, false otherwise
*/
public function commitTransaction()
{
$this->connect();
if (!$this->_connection->inTransaction()) {
return false;
}
return $this->_connection->commit();
}
/**
* Rollback a transaction
*
* @return bool true on success, false otherwise
*/
public function rollbackTransaction()
{
$this->connect();
if (!$this->_connection->inTransaction()) {
return false;
}
return $this->_connection->rollBack();
}
/**
* Returns a value in a safe representation to be used in a query string
*
* @param mixed $value The value to quote.
* @param string $type Type to be used for determining kind of quoting to perform
* @return string
*/
public function quote($value, $type)
{
$this->connect();
return $this->_connection->quote($value, $type);
}
/**
* Returns last id generated for a table or sequence in database
*
* @param string|null $table table name or sequence to get last insert value from
* @param string|null $column the name of the column representing the primary key
* @return string|int
*/
public function lastInsertId($table = null, $column = null)
{
$this->connect();
return $this->_connection->lastInsertId($table);
}
/**
* Checks if the driver supports quoting, as PDO_ODBC does not support it.
*
* @return bool
*/
public function supportsQuoting()
{
$this->connect();
return $this->_connection->getAttribute(PDO::ATTR_DRIVER_NAME) !== 'odbc';
}
}