Source of file Connection.php
Size: 12,389 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/Db/Adapter/Driver/Pdo/Connection.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 | <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\Db\Adapter\Driver\Pdo; use Zend\Db\Adapter\Driver\ConnectionInterface; use Zend\Db\Adapter\Exception; use Zend\Db\Adapter\Profiler; class Connection implements ConnectionInterface, Profiler\ProfilerAwareInterface { /** * @var Pdo */ protected $driver = null; /** * @var Profiler\ProfilerInterface */ protected $profiler = null; /** * @var string */ protected $driverName = null; /** * @var array */ protected $connectionParameters = array(); /** * @var \PDO */ protected $resource = null; /** * @var bool */ protected $inTransaction = false; /** * @var string */ protected $dsn = null; /** * Constructor * * @param array|\PDO|null $connectionParameters * @throws Exception\InvalidArgumentException */ public function __construct($connectionParameters = null) { if (is_array($connectionParameters)) { $this->setConnectionParameters($connectionParameters); } elseif ($connectionParameters instanceof \PDO) { $this->setResource($connectionParameters); } elseif (null !== $connectionParameters) { throw new Exception\InvalidArgumentException('$connection must be an array of parameters, a PDO object or null'); } } /** * Set driver * * @param Pdo $driver * @return Connection */ public function setDriver(Pdo $driver) { $this->driver = $driver; return $this; } /** * @param Profiler\ProfilerInterface $profiler * @return Connection */ public function setProfiler(Profiler\ProfilerInterface $profiler) { $this->profiler = $profiler; return $this; } /** * @return null|Profiler\ProfilerInterface */ public function getProfiler() { return $this->profiler; } /** * Get driver name * * @return null|string */ public function getDriverName() { return $this->driverName; } /** * Set connection parameters * * @param array $connectionParameters * @return void */ public function setConnectionParameters(array $connectionParameters) { $this->connectionParameters = $connectionParameters; if (isset($connectionParameters['dsn'])) { $this->driverName = substr($connectionParameters['dsn'], 0, strpos($connectionParameters['dsn'], ':') ); } elseif (isset($connectionParameters['pdodriver'])) { $this->driverName = strtolower($connectionParameters['pdodriver']); } elseif (isset($connectionParameters['driver'])) { $this->driverName = strtolower(substr( str_replace(array('-', '_', ' '), '', $connectionParameters['driver']), 3 )); } } /** * Get connection parameters * * @return array */ public function getConnectionParameters() { return $this->connectionParameters; } /** * Get the dsn string for this connection * @throws \Zend\Db\Adapter\Exception\RunTimeException * @return string */ public function getDsn() { if (!$this->dsn) { throw new Exception\RunTimeException("The DSN has not been set or constructed from parameters in connect() for this Connection"); } return $this->dsn; } /** * Get current schema * * @return string */ public function getCurrentSchema() { if (!$this->isConnected()) { $this->connect(); } switch ($this->driverName) { case 'mysql': $sql = 'SELECT DATABASE()'; break; case 'sqlite': return 'main'; case 'sqlsrv': case 'dblib': $sql = 'SELECT SCHEMA_NAME()'; break; case 'pgsql': default: $sql = 'SELECT CURRENT_SCHEMA'; break; } /** @var $result \PDOStatement */ $result = $this->resource->query($sql); if ($result instanceof \PDOStatement) { return $result->fetchColumn(); } return false; } /** * Set resource * * @param \PDO $resource * @return Connection */ public function setResource(\PDO $resource) { $this->resource = $resource; $this->driverName = strtolower($this->resource->getAttribute(\PDO::ATTR_DRIVER_NAME)); return $this; } /** * Get resource * * @return \PDO */ public function getResource() { if (!$this->isConnected()) { $this->connect(); } return $this->resource; } /** * Connect * * @return Connection * @throws Exception\InvalidConnectionParametersException * @throws Exception\RuntimeException */ public function connect() { if ($this->resource) { return $this; } $dsn = $username = $password = $hostname = $database = null; $options = array(); foreach ($this->connectionParameters as $key => $value) { switch (strtolower($key)) { case 'dsn': $dsn = $value; break; case 'driver': $value = strtolower($value); if (strpos($value, 'pdo') === 0) { $pdoDriver = strtolower(substr(str_replace(array('-', '_', ' '), '', $value), 3)); } break; case 'pdodriver': $pdoDriver = (string) $value; break; case 'user': case 'username': $username = (string) $value; break; case 'pass': case 'password': $password = (string) $value; break; case 'host': case 'hostname': $hostname = (string) $value; break; case 'port': $port = (int) $value; break; case 'database': case 'dbname': $database = (string) $value; break; case 'charset': $charset = (string) $value; break; case 'driver_options': case 'options': $value = (array) $value; $options = array_diff_key($options, $value) + $value; break; default: $options[$key] = $value; break; } } if (!isset($dsn) && isset($pdoDriver)) { $dsn = array(); switch ($pdoDriver) { case 'sqlite': $dsn[] = $database; break; case 'sqlsrv': if (isset($database)) { $dsn[] = "database={$database}"; } if (isset($hostname)) { $dsn[] = "server={$hostname}"; } break; default: if (isset($database)) { $dsn[] = "dbname={$database}"; } if (isset($hostname)) { $dsn[] = "host={$hostname}"; } if (isset($port)) { $dsn[] = "port={$port}"; } if (isset($charset)) { $dsn[] = "charset={$charset}"; } break; } $dsn = $pdoDriver . ':' . implode(';', $dsn); } elseif (!isset($dsn)) { throw new Exception\InvalidConnectionParametersException( 'A dsn was not provided or could not be constructed from your parameters', $this->connectionParameters ); } $this->dsn = $dsn; try { $this->resource = new \PDO($dsn, $username, $password, $options); $this->resource->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $this->driverName = strtolower($this->resource->getAttribute(\PDO::ATTR_DRIVER_NAME)); } catch (\PDOException $e) { $code = $e->getCode(); if (!is_long($code)) { $code = null; } throw new Exception\RuntimeException('Connect Error: ' . $e->getMessage(), $code, $e); } return $this; } /** * Is connected * * @return bool */ public function isConnected() { return ($this->resource instanceof \PDO); } /** * Disconnect * * @return Connection */ public function disconnect() { if ($this->isConnected()) { $this->resource = null; } return $this; } /** * Begin transaction * * @return Connection */ public function beginTransaction() { if (!$this->isConnected()) { $this->connect(); } $this->resource->beginTransaction(); $this->inTransaction = true; return $this; } /** * In transaction * * @return bool */ public function inTransaction() { return $this->inTransaction; } /** * Commit * * @return Connection */ public function commit() { if (!$this->isConnected()) { $this->connect(); } $this->resource->commit(); $this->inTransaction = false; return $this; } /** * Rollback * * @return Connection * @throws Exception\RuntimeException */ public function rollback() { if (!$this->isConnected()) { throw new Exception\RuntimeException('Must be connected before you can rollback'); } if (!$this->inTransaction) { throw new Exception\RuntimeException('Must call beginTransaction() before you can rollback'); } $this->resource->rollBack(); return $this; } /** * Execute * * @param $sql * @return Result * @throws Exception\InvalidQueryException */ public function execute($sql) { if (!$this->isConnected()) { $this->connect(); } if ($this->profiler) { $this->profiler->profilerStart($sql); } $resultResource = $this->resource->query($sql); if ($this->profiler) { $this->profiler->profilerFinish($sql); } if ($resultResource === false) { $errorInfo = $this->resource->errorInfo(); throw new Exception\InvalidQueryException($errorInfo[2]); } $result = $this->driver->createResult($resultResource, $sql); return $result; } /** * Prepare * * @param string $sql * @return Statement */ public function prepare($sql) { if (!$this->isConnected()) { $this->connect(); } $statement = $this->driver->createStatement($sql); return $statement; } /** * Get last generated id * * @param string $name * @return string|null|false */ public function getLastGeneratedValue($name = null) { if ($name === null && $this->driverName == 'pgsql') { return null; } try { return $this->resource->lastInsertId($name); } catch (\Exception $e) { // do nothing } return false; } } |