Source of file Adapter.php
Size: 13,503 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/Db/Adapter/Adapter.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389 | <?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; use Zend\Db\ResultSet; /** * @property Driver\DriverInterface $driver * @property Platform\PlatformInterface $platform */ class Adapter implements AdapterInterface, Profiler\ProfilerAwareInterface { /** * Query Mode Constants */ const QUERY_MODE_EXECUTE = 'execute'; const QUERY_MODE_PREPARE = 'prepare'; /** * Prepare Type Constants */ const PREPARE_TYPE_POSITIONAL = 'positional'; const PREPARE_TYPE_NAMED = 'named'; const FUNCTION_FORMAT_PARAMETER_NAME = 'formatParameterName'; const FUNCTION_QUOTE_IDENTIFIER = 'quoteIdentifier'; const FUNCTION_QUOTE_VALUE = 'quoteValue'; const VALUE_QUOTE_SEPARATOR = 'quoteSeparator'; /** * @var Driver\DriverInterface */ protected $driver = null; /** * @var Platform\PlatformInterface */ protected $platform = null; /** * @var Profiler\ProfilerInterface */ protected $profiler = null; /** * @var ResultSet\ResultSetInterface */ protected $queryResultSetPrototype = null; /** * @var Driver\StatementInterface */ protected $lastPreparedStatement = null; /** * @param Driver\DriverInterface|array $driver * @param Platform\PlatformInterface $platform * @param ResultSet\ResultSetInterface $queryResultPrototype * @param Profiler\ProfilerInterface $profiler * @throws Exception\InvalidArgumentException */ public function __construct($driver, Platform\PlatformInterface $platform = null, ResultSet\ResultSetInterface $queryResultPrototype = null, Profiler\ProfilerInterface $profiler = null) { // first argument can be an array of parameters $parameters = array(); if (is_array($driver)) { $parameters = $driver; if ($profiler === null && isset($parameters['profiler'])) { $profiler = $this->createProfiler($parameters); } $driver = $this->createDriver($parameters); } elseif (!$driver instanceof Driver\DriverInterface) { throw new Exception\InvalidArgumentException( 'The supplied or instantiated driver object does not implement Zend\Db\Adapter\Driver\DriverInterface' ); } $driver->checkEnvironment(); $this->driver = $driver; if ($platform == null) { $platform = $this->createPlatform($parameters); } $this->platform = $platform; $this->queryResultSetPrototype = ($queryResultPrototype) ?: new ResultSet\ResultSet(); if ($profiler) { $this->setProfiler($profiler); } } /** * @param Profiler\ProfilerInterface $profiler * @return Adapter */ public function setProfiler(Profiler\ProfilerInterface $profiler) { $this->profiler = $profiler; if ($this->driver instanceof Profiler\ProfilerAwareInterface) { $this->driver->setProfiler($profiler); } return $this; } /** * @return null|Profiler\ProfilerInterface */ public function getProfiler() { return $this->profiler; } /** * getDriver() * * @throws Exception\RuntimeException * @return Driver\DriverInterface */ public function getDriver() { if ($this->driver == null) { throw new Exception\RuntimeException('Driver has not been set or configured for this adapter.'); } return $this->driver; } /** * @return Platform\PlatformInterface */ public function getPlatform() { return $this->platform; } /** * @return ResultSet\ResultSetInterface */ public function getQueryResultSetPrototype() { return $this->queryResultSetPrototype; } public function getCurrentSchema() { return $this->driver->getConnection()->getCurrentSchema(); } /** * query() is a convenience function * * @param string $sql * @param string|array|ParameterContainer $parametersOrQueryMode * @throws Exception\InvalidArgumentException * @return Driver\StatementInterface|ResultSet\ResultSet */ public function query($sql, $parametersOrQueryMode = self::QUERY_MODE_PREPARE, ResultSet\ResultSetInterface $resultPrototype = null) { if (is_string($parametersOrQueryMode) && in_array($parametersOrQueryMode, array(self::QUERY_MODE_PREPARE, self::QUERY_MODE_EXECUTE))) { $mode = $parametersOrQueryMode; $parameters = null; } elseif (is_array($parametersOrQueryMode) || $parametersOrQueryMode instanceof ParameterContainer) { $mode = self::QUERY_MODE_PREPARE; $parameters = $parametersOrQueryMode; } else { throw new Exception\InvalidArgumentException('Parameter 2 to this method must be a flag, an array, or ParameterContainer'); } if ($mode == self::QUERY_MODE_PREPARE) { $this->lastPreparedStatement = null; $this->lastPreparedStatement = $this->driver->createStatement($sql); $this->lastPreparedStatement->prepare(); if (is_array($parameters) || $parameters instanceof ParameterContainer) { $this->lastPreparedStatement->setParameterContainer((is_array($parameters)) ? new ParameterContainer($parameters) : $parameters); $result = $this->lastPreparedStatement->execute(); } else { return $this->lastPreparedStatement; } } else { $result = $this->driver->getConnection()->execute($sql); } if ($result instanceof Driver\ResultInterface && $result->isQueryResult()) { $resultSet = clone ($resultPrototype ?: $this->queryResultSetPrototype); $resultSet->initialize($result); return $resultSet; } return $result; } /** * Create statement * * @param string $initialSql * @param ParameterContainer $initialParameters * @return Driver\StatementInterface */ public function createStatement($initialSql = null, $initialParameters = null) { $statement = $this->driver->createStatement($initialSql); if ($initialParameters == null || !$initialParameters instanceof ParameterContainer && is_array($initialParameters)) { $initialParameters = new ParameterContainer((is_array($initialParameters) ? $initialParameters : array())); } $statement->setParameterContainer($initialParameters); return $statement; } public function getHelpers(/* $functions */) { $functions = array(); $platform = $this->platform; foreach (func_get_args() as $arg) { switch ($arg) { case self::FUNCTION_QUOTE_IDENTIFIER: $functions[] = function ($value) use ($platform) { return $platform->quoteIdentifier($value); }; break; case self::FUNCTION_QUOTE_VALUE: $functions[] = function ($value) use ($platform) { return $platform->quoteValue($value); }; break; } } } /** * @param $name * @throws Exception\InvalidArgumentException * @return Driver\DriverInterface|Platform\PlatformInterface */ public function __get($name) { switch (strtolower($name)) { case 'driver': return $this->driver; case 'platform': return $this->platform; default: throw new Exception\InvalidArgumentException('Invalid magic property on adapter'); } } /** * @param array $parameters * @return Driver\DriverInterface * @throws \InvalidArgumentException * @throws Exception\InvalidArgumentException */ protected function createDriver($parameters) { if (!isset($parameters['driver'])) { throw new Exception\InvalidArgumentException(__FUNCTION__ . ' expects a "driver" key to be present inside the parameters'); } if ($parameters['driver'] instanceof Driver\DriverInterface) { return $parameters['driver']; } if (!is_string($parameters['driver'])) { throw new Exception\InvalidArgumentException(__FUNCTION__ . ' expects a "driver" to be a string or instance of DriverInterface'); } $options = array(); if (isset($parameters['options'])) { $options = (array) $parameters['options']; unset($parameters['options']); } $driverName = strtolower($parameters['driver']); switch ($driverName) { case 'mysqli': $driver = new Driver\Mysqli\Mysqli($parameters, null, null, $options); break; case 'sqlsrv': $driver = new Driver\Sqlsrv\Sqlsrv($parameters); break; case 'oci8': $driver = new Driver\Oci8\Oci8($parameters); break; case 'pgsql': $driver = new Driver\Pgsql\Pgsql($parameters); break; case 'ibmdb2': $driver = new Driver\IbmDb2\IbmDb2($parameters); break; case 'pdo': default: if ($driverName == 'pdo' || strpos($driverName, 'pdo') === 0) { $driver = new Driver\Pdo\Pdo($parameters); } } if (!isset($driver) || !$driver instanceof Driver\DriverInterface) { throw new Exception\InvalidArgumentException('DriverInterface expected', null, null); } return $driver; } /** * @param Driver\DriverInterface $driver * @return Platform\PlatformInterface */ protected function createPlatform($parameters) { if (isset($parameters['platform'])) { $platformName = $parameters['platform']; } elseif ($this->driver instanceof Driver\DriverInterface) { $platformName = $this->driver->getDatabasePlatformName(Driver\DriverInterface::NAME_FORMAT_CAMELCASE); } else { throw new Exception\InvalidArgumentException('A platform could not be determined from the provided configuration'); } // currently only supported by the IbmDb2 & Oracle concrete implementations $options = (isset($parameters['platform_options'])) ? $parameters['platform_options'] : array(); switch ($platformName) { case 'Mysql': // mysqli or pdo_mysql driver $driver = ($this->driver instanceof Driver\Mysqli\Mysqli || $this->driver instanceof Driver\Pdo\Pdo) ? $this->driver : null; return new Platform\Mysql($driver); case 'SqlServer': // PDO is only supported driver for quoting values in this platform return new Platform\SqlServer(($this->driver instanceof Driver\Pdo\Pdo) ? $this->driver : null); case 'Oracle': // oracle does not accept a driver as an option, no driver specific quoting available return new Platform\Oracle($options); case 'Sqlite': // PDO is only supported driver for quoting values in this platform return new Platform\Sqlite(($this->driver instanceof Driver\Pdo\Pdo) ? $this->driver : null); case 'Postgresql': // pgsql or pdo postgres driver $driver = ($this->driver instanceof Driver\Pgsql\Pgsql || $this->driver instanceof Driver\Pdo\Pdo) ? $this->driver : null; return new Platform\Postgresql($driver); case 'IbmDb2': // ibm_db2 driver escaping does not need an action connection return new Platform\IbmDb2($options); default: return new Platform\Sql92(); } } protected function createProfiler($parameters) { if ($parameters['profiler'] instanceof Profiler\ProfilerInterface) { $profiler = $parameters['profiler']; } elseif (is_bool($parameters['profiler'])) { $profiler = ($parameters['profiler'] == true) ? new Profiler\Profiler : null; } else { throw new Exception\InvalidArgumentException( '"profiler" parameter must be an instance of ProfilerInterface or a boolean' ); } return $profiler; } /** * @param array $parameters * @return Driver\DriverInterface * @throws \InvalidArgumentException * @throws Exception\InvalidArgumentException * @deprecated */ protected function createDriverFromParameters(array $parameters) { return $this->createDriver($parameters); } /** * @param Driver\DriverInterface $driver * @return Platform\PlatformInterface * @deprecated */ protected function createPlatformFromDriver(Driver\DriverInterface $driver) { return $this->createPlatform($driver); } } |