"Fossies" - the Fresh Open Source Software Archive 
Member "icingaweb2-2.11.4/library/vendor/Zend/Db/Adapter/Pdo/Abstract.php" (26 Jan 2023, 11568 Bytes) of package /linux/www/icingaweb2-2.11.4.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) PHP source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
See also the last
Fossies "Diffs" side-by-side code changes report for "Abstract.php":
2.10.3_vs_2.11.0.
1 <?php
2 /**
3 * Zend Framework
4 *
5 * LICENSE
6 *
7 * This source file is subject to the new BSD license that is bundled
8 * with this package in the file LICENSE.txt.
9 * It is also available through the world-wide-web at this URL:
10 * http://framework.zend.com/license/new-bsd
11 * If you did not receive a copy of the license and are unable to
12 * obtain it through the world-wide-web, please send an email
13 * to license@zend.com so we can send you a copy immediately.
14 *
15 * @category Zend
16 * @package Zend_Db
17 * @subpackage Adapter
18 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
19 * @license http://framework.zend.com/license/new-bsd New BSD License
20 * @version $Id$
21 */
22
23
24 /**
25 * @see Zend_Db_Adapter_Abstract
26 */
27
28
29 /**
30 * @see Zend_Db_Statement_Pdo
31 */
32
33
34 /**
35 * Class for connecting to SQL databases and performing common operations using PDO.
36 *
37 * @category Zend
38 * @package Zend_Db
39 * @subpackage Adapter
40 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
41 * @license http://framework.zend.com/license/new-bsd New BSD License
42 */
43 abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract
44 {
45
46 /**
47 * Default class name for a DB statement.
48 *
49 * @var string
50 */
51 protected $_defaultStmtClass = 'Zend_Db_Statement_Pdo';
52
53 /**
54 * Creates a PDO DSN for the adapter from $this->_config settings.
55 *
56 * @return string
57 */
58 protected function _dsn()
59 {
60 // baseline of DSN parts
61 $dsn = $this->_config;
62
63 // don't pass the username, password, charset, persistent and driver_options in the DSN
64 unset($dsn['username']);
65 unset($dsn['password']);
66 unset($dsn['options']);
67 unset($dsn['charset']);
68 unset($dsn['persistent']);
69 unset($dsn['driver_options']);
70
71 // use all remaining parts in the DSN
72 foreach ($dsn as $key => $val) {
73 $dsn[$key] = "$key=$val";
74 }
75
76 return $this->_pdoType . ':' . implode(';', $dsn);
77 }
78
79 /**
80 * Creates a PDO object and connects to the database.
81 *
82 * @return void
83 * @throws Zend_Db_Adapter_Exception
84 */
85 protected function _connect()
86 {
87 // if we already have a PDO object, no need to re-connect.
88 if ($this->_connection) {
89 return;
90 }
91
92 // get the dsn first, because some adapters alter the $_pdoType
93 $dsn = $this->_dsn();
94
95 // check for PDO extension
96 if (!extension_loaded('pdo')) {
97 /**
98 * @see Zend_Db_Adapter_Exception
99 */
100 throw new Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded');
101 }
102
103 // check the PDO driver is available
104 if (!in_array($this->_pdoType, PDO::getAvailableDrivers())) {
105 /**
106 * @see Zend_Db_Adapter_Exception
107 */
108 throw new Zend_Db_Adapter_Exception('The ' . $this->_pdoType . ' driver is not currently installed');
109 }
110
111 // create PDO connection
112 $q = $this->_profiler->queryStart('connect', Zend_Db_Profiler::CONNECT);
113
114 // add the persistence flag if we find it in our config array
115 if (isset($this->_config['persistent']) && ($this->_config['persistent'] == true)) {
116 $this->_config['driver_options'][PDO::ATTR_PERSISTENT] = true;
117 }
118
119 try {
120 $this->_connection = new PDO(
121 $dsn,
122 $this->_config['username'],
123 $this->_config['password'],
124 $this->_config['driver_options']
125 );
126
127 $this->_profiler->queryEnd($q);
128
129 // set the PDO connection to perform case-folding on array keys, or not
130 $this->_connection->setAttribute(PDO::ATTR_CASE, $this->_caseFolding);
131
132 // always use exceptions.
133 $this->_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
134
135 } catch (PDOException $e) {
136 $message = $e->getMessage();
137 if ($e->getPrevious() !== null && preg_match('~^SQLSTATE\[HY000\] \[\d{1,4}\]\s$~', $message)) {
138 // See https://bugs.php.net/bug.php?id=76604
139 $message .= $e->getPrevious()->getMessage();
140 }
141
142 /**
143 * @see Zend_Db_Adapter_Exception
144 */
145 throw new Zend_Db_Adapter_Exception($message, $e->getCode(), $e);
146 }
147
148 }
149
150 /**
151 * Test if a connection is active
152 *
153 * @return boolean
154 */
155 public function isConnected()
156 {
157 return ((bool) ($this->_connection instanceof PDO));
158 }
159
160 /**
161 * Force the connection to close.
162 *
163 * @return void
164 */
165 public function closeConnection()
166 {
167 $this->_connection = null;
168 }
169
170 /**
171 * Prepares an SQL statement.
172 *
173 * @param string $sql The SQL statement with placeholders.
174 * @param array $bind An array of data to bind to the placeholders.
175 * @return PDOStatement
176 */
177 public function prepare($sql)
178 {
179 $this->_connect();
180 $stmtClass = $this->_defaultStmtClass;
181 if (!class_exists($stmtClass)) {
182 Zend_Loader::loadClass($stmtClass);
183 }
184 $stmt = new $stmtClass($this, $sql);
185 $stmt->setFetchMode($this->_fetchMode);
186 return $stmt;
187 }
188
189 /**
190 * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
191 *
192 * As a convention, on RDBMS brands that support sequences
193 * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
194 * from the arguments and returns the last id generated by that sequence.
195 * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
196 * returns the last value generated for such a column, and the table name
197 * argument is disregarded.
198 *
199 * On RDBMS brands that don't support sequences, $tableName and $primaryKey
200 * are ignored.
201 *
202 * @param string $tableName OPTIONAL Name of table.
203 * @param string $primaryKey OPTIONAL Name of primary key column.
204 * @return string
205 */
206 public function lastInsertId($tableName = null, $primaryKey = null)
207 {
208 $this->_connect();
209 return $this->_connection->lastInsertId();
210 }
211
212 /**
213 * Special handling for PDO query().
214 * All bind parameter names must begin with ':'
215 *
216 * @param string|Zend_Db_Select $sql The SQL statement with placeholders.
217 * @param array $bind An array of data to bind to the placeholders.
218 * @return Zend_Db_Statement_Pdo
219 * @throws Zend_Db_Adapter_Exception To re-throw PDOException.
220 */
221 public function query($sql, $bind = array())
222 {
223 if (empty($bind) && $sql instanceof Zend_Db_Select) {
224 $bind = $sql->getBind();
225 }
226
227 if (is_array($bind)) {
228 foreach ($bind as $name => $value) {
229 if (!is_int($name) && !preg_match('/^:/', $name)) {
230 $newName = ":$name";
231 unset($bind[$name]);
232 $bind[$newName] = $value;
233 }
234 }
235 }
236
237 try {
238 return parent::query($sql, $bind);
239 } catch (PDOException $e) {
240 /**
241 * @see Zend_Db_Statement_Exception
242 */
243 throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e);
244 }
245 }
246
247 /**
248 * Executes an SQL statement and return the number of affected rows
249 *
250 * @param mixed $sql The SQL statement with placeholders.
251 * May be a string or Zend_Db_Select.
252 * @return integer Number of rows that were modified
253 * or deleted by the SQL statement
254 */
255 public function exec($sql)
256 {
257 if ($sql instanceof Zend_Db_Select) {
258 $sql = $sql->assemble();
259 }
260
261 try {
262 $affected = $this->getConnection()->exec($sql);
263
264 if ($affected === false) {
265 $errorInfo = $this->getConnection()->errorInfo();
266 /**
267 * @see Zend_Db_Adapter_Exception
268 */
269 throw new Zend_Db_Adapter_Exception($errorInfo[2]);
270 }
271
272 return $affected;
273 } catch (PDOException $e) {
274 /**
275 * @see Zend_Db_Adapter_Exception
276 */
277 throw new Zend_Db_Adapter_Exception($e->getMessage(), $e->getCode(), $e);
278 }
279 }
280
281 /**
282 * Quote a raw string.
283 *
284 * @param string $value Raw string
285 * @return string Quoted string
286 */
287 protected function _quote($value)
288 {
289 if ($value === null) {
290 $value = '';
291 } elseif (is_int($value) || is_float($value)) {
292 return $value;
293 }
294 $this->_connect();
295 return $this->_connection->quote($value);
296 }
297
298 /**
299 * Begin a transaction.
300 */
301 protected function _beginTransaction()
302 {
303 $this->_connect();
304 $this->_connection->beginTransaction();
305 }
306
307 /**
308 * Commit a transaction.
309 */
310 protected function _commit()
311 {
312 $this->_connect();
313 $this->_connection->commit();
314 }
315
316 /**
317 * Roll-back a transaction.
318 */
319 protected function _rollBack() {
320 $this->_connect();
321 $this->_connection->rollBack();
322 }
323
324 /**
325 * Set the PDO fetch mode.
326 *
327 * @todo Support FETCH_CLASS and FETCH_INTO.
328 *
329 * @param int $mode A PDO fetch mode.
330 * @return void
331 * @throws Zend_Db_Adapter_Exception
332 */
333 public function setFetchMode($mode)
334 {
335 //check for PDO extension
336 if (!extension_loaded('pdo')) {
337 /**
338 * @see Zend_Db_Adapter_Exception
339 */
340 throw new Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded');
341 }
342 switch ($mode) {
343 case PDO::FETCH_LAZY:
344 case PDO::FETCH_ASSOC:
345 case PDO::FETCH_NUM:
346 case PDO::FETCH_BOTH:
347 case PDO::FETCH_NAMED:
348 case PDO::FETCH_OBJ:
349 $this->_fetchMode = $mode;
350 break;
351 default:
352 /**
353 * @see Zend_Db_Adapter_Exception
354 */
355 throw new Zend_Db_Adapter_Exception("Invalid fetch mode '$mode' specified");
356 break;
357 }
358 }
359
360 /**
361 * Check if the adapter supports real SQL parameters.
362 *
363 * @param string $type 'positional' or 'named'
364 * @return bool
365 */
366 public function supportsParameters($type)
367 {
368 switch ($type) {
369 case 'positional':
370 case 'named':
371 default:
372 return true;
373 }
374 }
375
376 /**
377 * Retrieve server version in PHP style
378 *
379 * @return string
380 */
381 public function getServerVersion()
382 {
383 $this->_connect();
384 try {
385 $version = $this->_connection->getAttribute(PDO::ATTR_SERVER_VERSION);
386 } catch (PDOException $e) {
387 // In case of the driver doesn't support getting attributes
388 return null;
389 }
390 $matches = null;
391 if (preg_match('/((?:[0-9]{1,2}\.){1,3}[0-9]{1,2})/', $version, $matches)) {
392 return $matches[1];
393 } else {
394 return null;
395 }
396 }
397 }