Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 /*
|
Chris@0
|
4 * This file is part of the Symfony package.
|
Chris@0
|
5 *
|
Chris@0
|
6 * (c) Fabien Potencier <fabien@symfony.com>
|
Chris@0
|
7 *
|
Chris@0
|
8 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
9 * file that was distributed with this source code.
|
Chris@0
|
10 */
|
Chris@0
|
11
|
Chris@0
|
12 namespace Symfony\Component\VarDumper\Caster;
|
Chris@0
|
13
|
Chris@0
|
14 use Symfony\Component\VarDumper\Cloner\Stub;
|
Chris@0
|
15
|
Chris@0
|
16 /**
|
Chris@0
|
17 * Casts PDO related classes to array representation.
|
Chris@0
|
18 *
|
Chris@0
|
19 * @author Nicolas Grekas <p@tchwork.com>
|
Chris@0
|
20 */
|
Chris@0
|
21 class PdoCaster
|
Chris@0
|
22 {
|
Chris@17
|
23 private static $pdoAttributes = [
|
Chris@17
|
24 'CASE' => [
|
Chris@0
|
25 \PDO::CASE_LOWER => 'LOWER',
|
Chris@0
|
26 \PDO::CASE_NATURAL => 'NATURAL',
|
Chris@0
|
27 \PDO::CASE_UPPER => 'UPPER',
|
Chris@17
|
28 ],
|
Chris@17
|
29 'ERRMODE' => [
|
Chris@0
|
30 \PDO::ERRMODE_SILENT => 'SILENT',
|
Chris@0
|
31 \PDO::ERRMODE_WARNING => 'WARNING',
|
Chris@0
|
32 \PDO::ERRMODE_EXCEPTION => 'EXCEPTION',
|
Chris@17
|
33 ],
|
Chris@0
|
34 'TIMEOUT',
|
Chris@0
|
35 'PREFETCH',
|
Chris@0
|
36 'AUTOCOMMIT',
|
Chris@0
|
37 'PERSISTENT',
|
Chris@0
|
38 'DRIVER_NAME',
|
Chris@0
|
39 'SERVER_INFO',
|
Chris@17
|
40 'ORACLE_NULLS' => [
|
Chris@0
|
41 \PDO::NULL_NATURAL => 'NATURAL',
|
Chris@0
|
42 \PDO::NULL_EMPTY_STRING => 'EMPTY_STRING',
|
Chris@0
|
43 \PDO::NULL_TO_STRING => 'TO_STRING',
|
Chris@17
|
44 ],
|
Chris@0
|
45 'CLIENT_VERSION',
|
Chris@0
|
46 'SERVER_VERSION',
|
Chris@0
|
47 'STATEMENT_CLASS',
|
Chris@0
|
48 'EMULATE_PREPARES',
|
Chris@0
|
49 'CONNECTION_STATUS',
|
Chris@0
|
50 'STRINGIFY_FETCHES',
|
Chris@17
|
51 'DEFAULT_FETCH_MODE' => [
|
Chris@0
|
52 \PDO::FETCH_ASSOC => 'ASSOC',
|
Chris@0
|
53 \PDO::FETCH_BOTH => 'BOTH',
|
Chris@0
|
54 \PDO::FETCH_LAZY => 'LAZY',
|
Chris@0
|
55 \PDO::FETCH_NUM => 'NUM',
|
Chris@0
|
56 \PDO::FETCH_OBJ => 'OBJ',
|
Chris@17
|
57 ],
|
Chris@17
|
58 ];
|
Chris@0
|
59
|
Chris@0
|
60 public static function castPdo(\PDO $c, array $a, Stub $stub, $isNested)
|
Chris@0
|
61 {
|
Chris@17
|
62 $attr = [];
|
Chris@0
|
63 $errmode = $c->getAttribute(\PDO::ATTR_ERRMODE);
|
Chris@0
|
64 $c->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
|
Chris@0
|
65
|
Chris@0
|
66 foreach (self::$pdoAttributes as $k => $v) {
|
Chris@0
|
67 if (!isset($k[0])) {
|
Chris@0
|
68 $k = $v;
|
Chris@17
|
69 $v = [];
|
Chris@0
|
70 }
|
Chris@0
|
71
|
Chris@0
|
72 try {
|
Chris@17
|
73 $attr[$k] = 'ERRMODE' === $k ? $errmode : $c->getAttribute(\constant('PDO::ATTR_'.$k));
|
Chris@0
|
74 if ($v && isset($v[$attr[$k]])) {
|
Chris@0
|
75 $attr[$k] = new ConstStub($v[$attr[$k]], $attr[$k]);
|
Chris@0
|
76 }
|
Chris@0
|
77 } catch (\Exception $e) {
|
Chris@0
|
78 }
|
Chris@0
|
79 }
|
Chris@0
|
80 if (isset($attr[$k = 'STATEMENT_CLASS'][1])) {
|
Chris@0
|
81 if ($attr[$k][1]) {
|
Chris@0
|
82 $attr[$k][1] = new ArgsStub($attr[$k][1], '__construct', $attr[$k][0]);
|
Chris@0
|
83 }
|
Chris@0
|
84 $attr[$k][0] = new ClassStub($attr[$k][0]);
|
Chris@0
|
85 }
|
Chris@0
|
86
|
Chris@0
|
87 $prefix = Caster::PREFIX_VIRTUAL;
|
Chris@17
|
88 $a += [
|
Chris@0
|
89 $prefix.'inTransaction' => method_exists($c, 'inTransaction'),
|
Chris@0
|
90 $prefix.'errorInfo' => $c->errorInfo(),
|
Chris@0
|
91 $prefix.'attributes' => new EnumStub($attr),
|
Chris@17
|
92 ];
|
Chris@0
|
93
|
Chris@0
|
94 if ($a[$prefix.'inTransaction']) {
|
Chris@0
|
95 $a[$prefix.'inTransaction'] = $c->inTransaction();
|
Chris@0
|
96 } else {
|
Chris@0
|
97 unset($a[$prefix.'inTransaction']);
|
Chris@0
|
98 }
|
Chris@0
|
99
|
Chris@0
|
100 if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) {
|
Chris@0
|
101 unset($a[$prefix.'errorInfo']);
|
Chris@0
|
102 }
|
Chris@0
|
103
|
Chris@0
|
104 $c->setAttribute(\PDO::ATTR_ERRMODE, $errmode);
|
Chris@0
|
105
|
Chris@0
|
106 return $a;
|
Chris@0
|
107 }
|
Chris@0
|
108
|
Chris@0
|
109 public static function castPdoStatement(\PDOStatement $c, array $a, Stub $stub, $isNested)
|
Chris@0
|
110 {
|
Chris@0
|
111 $prefix = Caster::PREFIX_VIRTUAL;
|
Chris@0
|
112 $a[$prefix.'errorInfo'] = $c->errorInfo();
|
Chris@0
|
113
|
Chris@0
|
114 if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) {
|
Chris@0
|
115 unset($a[$prefix.'errorInfo']);
|
Chris@0
|
116 }
|
Chris@0
|
117
|
Chris@0
|
118 return $a;
|
Chris@0
|
119 }
|
Chris@0
|
120 }
|