ACC SHELL
<?php
/**
* This file is part of the Nette Framework (http://nette.org)
*
* Copyright (c) 2004 David Grudl (http://davidgrudl.com)
*
* For the full copyright and license information, please view
* the file license.txt that was distributed with this source code.
*/
namespace Nette\Database;
use Nette,
Nette\ObjectMixin,
PDO;
/**
* Represents a connection between PHP and a database server.
*
* @author David Grudl
*
* @property IReflection $databaseReflection
* @property-read ISupplementalDriver $supplementalDriver
* @property-read string $dsn
*/
class Connection extends PDO
{
/** @var string */
private $dsn;
/** @var ISupplementalDriver */
private $driver;
/** @var SqlPreprocessor */
private $preprocessor;
/** @var IReflection */
private $databaseReflection;
/** @var Nette\Caching\Cache */
private $cache;
/** @var array of function(Statement $result, $params); Occurs after query is executed */
public $onQuery;
public function __construct($dsn, $username = NULL, $password = NULL, array $options = NULL, $driverClass = NULL)
{
parent::__construct($this->dsn = $dsn, $username, $password, $options);
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Nette\Database\Statement', array($this)));
$driverClass = $driverClass ?: 'Nette\Database\Drivers\\' . ucfirst(str_replace('sql', 'Sql', $this->getAttribute(PDO::ATTR_DRIVER_NAME))) . 'Driver';
$this->driver = new $driverClass($this, (array) $options);
$this->preprocessor = new SqlPreprocessor($this);
}
public function getDsn()
{
return $this->dsn;
}
/** @return ISupplementalDriver */
public function getSupplementalDriver()
{
return $this->driver;
}
/**
* Sets database reflection.
* @return self
*/
public function setDatabaseReflection(IReflection $databaseReflection)
{
$databaseReflection->setConnection($this);
$this->databaseReflection = $databaseReflection;
return $this;
}
/** @return IReflection */
public function getDatabaseReflection()
{
if (!$this->databaseReflection) {
$this->setDatabaseReflection(new Reflection\ConventionalReflection);
}
return $this->databaseReflection;
}
/**
* Sets cache storage engine.
* @return self
*/
public function setCacheStorage(Nette\Caching\IStorage $storage = NULL)
{
$this->cache = $storage ? new Nette\Caching\Cache($storage, 'Nette.Database.' . md5($this->dsn)) : NULL;
return $this;
}
public function getCache()
{
return $this->cache;
}
/**
* Generates and executes SQL query.
* @param string statement
* @param mixed [parameters, ...]
* @return Statement
*/
public function query($statement)
{
$args = func_get_args();
return $this->queryArgs(array_shift($args), $args);
}
/**
* Generates and executes SQL query.
* @param string statement
* @param mixed [parameters, ...]
* @return int number of affected rows
*/
public function exec($statement)
{
$args = func_get_args();
return $this->queryArgs(array_shift($args), $args)->rowCount();
}
/**
* @param string statement
* @param array
* @return Statement
*/
public function queryArgs($statement, $params)
{
foreach ($params as $value) {
if (is_array($value) || is_object($value)) {
$need = TRUE; break;
}
}
if (isset($need) && $this->preprocessor !== NULL) {
list($statement, $params) = $this->preprocessor->process($statement, $params);
}
return $this->prepare($statement)->execute($params);
}
/********************* shortcuts ****************d*g**/
/**
* Shortcut for query()->fetch()
* @param string statement
* @param mixed [parameters, ...]
* @return Row
*/
public function fetch($args)
{
$args = func_get_args();
return $this->queryArgs(array_shift($args), $args)->fetch();
}
/**
* Shortcut for query()->fetchField()
* @param string statement
* @param mixed [parameters, ...]
* @return mixed
*/
public function fetchField($args)
{
$args = func_get_args();
return $this->queryArgs(array_shift($args), $args)->fetchField();
}
/**
* Shortcut for query()->fetchColumn()
* @param string statement
* @param mixed [parameters, ...]
* @return mixed
*/
public function fetchColumn($args)
{
$args = func_get_args();
return $this->queryArgs(array_shift($args), $args)->fetchColumn();
}
/**
* Shortcut for query()->fetchPairs()
* @param string statement
* @param mixed [parameters, ...]
* @return array
*/
public function fetchPairs($args)
{
$args = func_get_args();
return $this->queryArgs(array_shift($args), $args)->fetchPairs();
}
/**
* Shortcut for query()->fetchAll()
* @param string statement
* @param mixed [parameters, ...]
* @return array
*/
public function fetchAll($args)
{
$args = func_get_args();
return $this->queryArgs(array_shift($args), $args)->fetchAll();
}
/********************* selector ****************d*g**/
/**
* Creates selector for table.
* @param string
* @return Nette\Database\Table\Selection
*/
public function table($table)
{
return new Table\Selection($table, $this);
}
/********************* Nette\Object behaviour ****************d*g**/
/**
* @return Nette\Reflection\ClassType
*/
public static function getReflection()
{
return new Nette\Reflection\ClassType(get_called_class());
}
public function __call($name, $args)
{
return ObjectMixin::call($this, $name, $args);
}
public function &__get($name)
{
return ObjectMixin::get($this, $name);
}
public function __set($name, $value)
{
return ObjectMixin::set($this, $name, $value);
}
public function __isset($name)
{
return ObjectMixin::has($this, $name);
}
public function __unset($name)
{
ObjectMixin::remove($this, $name);
}
}
ACC SHELL 2018