4
* This file is part of the Nette Framework (http://nette.org)
6
* Copyright (c) 2004 David Grudl (http://davidgrudl.com)
8
* For the full copyright and license information, please view
9
* the file license.txt that was distributed with this source code.
12
namespace Nette\Database;
20
* Represents a connection between PHP and a database server.
24
* @property IReflection $databaseReflection
25
* @property-read ISupplementalDriver $supplementalDriver
26
* @property-read string $dsn
28
class Connection extends PDO
33
/** @var ISupplementalDriver */
36
/** @var SqlPreprocessor */
37
private $preprocessor;
39
/** @var IReflection */
40
private $databaseReflection;
42
/** @var Nette\Caching\Cache */
45
/** @var array of function(Statement $result, $params); Occurs after query is executed */
49
public function __construct($dsn, $username = NULL, $password = NULL, array $options = NULL, $driverClass = NULL)
51
parent::__construct($this->dsn = $dsn, $username, $password, $options);
52
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
53
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Nette\Database\Statement', array($this)));
55
$driverClass = $driverClass ?: 'Nette\Database\Drivers\\' . ucfirst(str_replace('sql', 'Sql', $this->getAttribute(PDO::ATTR_DRIVER_NAME))) . 'Driver';
56
$this->driver = new $driverClass($this, (array) $options);
57
$this->preprocessor = new SqlPreprocessor($this);
61
public function getDsn()
67
/** @return ISupplementalDriver */
68
public function getSupplementalDriver()
75
* Sets database reflection.
78
public function setDatabaseReflection(IReflection $databaseReflection)
80
$databaseReflection->setConnection($this);
81
$this->databaseReflection = $databaseReflection;
86
/** @return IReflection */
87
public function getDatabaseReflection()
89
if (!$this->databaseReflection) {
90
$this->setDatabaseReflection(new Reflection\ConventionalReflection);
92
return $this->databaseReflection;
97
* Sets cache storage engine.
100
public function setCacheStorage(Nette\Caching\IStorage $storage = NULL)
102
$this->cache = $storage ? new Nette\Caching\Cache($storage, 'Nette.Database.' . md5($this->dsn)) : NULL;
107
public function getCache()
114
* Generates and executes SQL query.
115
* @param string statement
116
* @param mixed [parameters, ...]
119
public function query($statement)
121
$args = func_get_args();
122
return $this->queryArgs(array_shift($args), $args);
127
* Generates and executes SQL query.
128
* @param string statement
129
* @param mixed [parameters, ...]
130
* @return int number of affected rows
132
public function exec($statement)
134
$args = func_get_args();
135
return $this->queryArgs(array_shift($args), $args)->rowCount();
140
* @param string statement
144
public function queryArgs($statement, $params)
146
foreach ($params as $value) {
147
if (is_array($value) || is_object($value)) {
151
if (isset($need) && $this->preprocessor !== NULL) {
152
list($statement, $params) = $this->preprocessor->process($statement, $params);
155
return $this->prepare($statement)->execute($params);
159
/********************* shortcuts ****************d*g**/
163
* Shortcut for query()->fetch()
164
* @param string statement
165
* @param mixed [parameters, ...]
168
public function fetch($args)
170
$args = func_get_args();
171
return $this->queryArgs(array_shift($args), $args)->fetch();
176
* Shortcut for query()->fetchField()
177
* @param string statement
178
* @param mixed [parameters, ...]
181
public function fetchField($args)
183
$args = func_get_args();
184
return $this->queryArgs(array_shift($args), $args)->fetchField();
189
* Shortcut for query()->fetchColumn()
190
* @param string statement
191
* @param mixed [parameters, ...]
194
public function fetchColumn($args)
196
$args = func_get_args();
197
return $this->queryArgs(array_shift($args), $args)->fetchColumn();
202
* Shortcut for query()->fetchPairs()
203
* @param string statement
204
* @param mixed [parameters, ...]
207
public function fetchPairs($args)
209
$args = func_get_args();
210
return $this->queryArgs(array_shift($args), $args)->fetchPairs();
215
* Shortcut for query()->fetchAll()
216
* @param string statement
217
* @param mixed [parameters, ...]
220
public function fetchAll($args)
222
$args = func_get_args();
223
return $this->queryArgs(array_shift($args), $args)->fetchAll();
227
/********************* selector ****************d*g**/
231
* Creates selector for table.
233
* @return Nette\Database\Table\Selection
235
public function table($table)
237
return new Table\Selection($table, $this);
241
/********************* Nette\Object behaviour ****************d*g**/
245
* @return Nette\Reflection\ClassType
247
public static function getReflection()
249
return new Nette\Reflection\ClassType(get_called_class());
253
public function __call($name, $args)
255
return ObjectMixin::call($this, $name, $args);
259
public function &__get($name)
261
return ObjectMixin::get($this, $name);
265
public function __set($name, $value)
267
return ObjectMixin::set($this, $name, $value);
271
public function __isset($name)
273
return ObjectMixin::has($this, $name);
277
public function __unset($name)
279
ObjectMixin::remove($this, $name);