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