DatabasePanel::subscribe()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 25

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 0
dl 0
loc 25
ccs 18
cts 18
cp 1
crap 2
rs 9.52
c 0
b 0
f 0
1
<?php
2
3
namespace Recca0120\LaravelTracy\Panels;
4
5
use Exception;
6
use PDO;
7
use Recca0120\LaravelTracy\Contracts\IAjaxPanel;
8
9
class DatabasePanel extends AbstractSubscriablePanel implements IAjaxPanel
10
{
11
    /**
12
     * $queries.
13
     *
14
     * @var array
15
     */
16
    protected $queries = [];
17
18
    /**
19
     * $totalTime.
20
     *
21
     * @var float
22
     */
23
    protected $totalTime = 0.0;
24
25
    /**
26
     * $counter.
27
     *
28
     * @var int
29
     */
30
    protected $counter = 0;
31
32
    /**
33
     * logQuery.
34
     *
35
     * @param string $sql
36
     * @param array $bindings
37
     * @param int $time
38
     * @param string $name
39
     * @param PDO $pdo
40
     * @param string $driver
41
     * @return $this
42
     */
43 2
    public function logQuery($sql, $bindings = [], $time = 0, $name = null, PDO $pdo = null, $driver = 'mysql')
44
    {
45 2
        $this->counter++;
46 2
        $this->totalTime += $time;
47 2
        $source = static::findSource();
48 2
        $editorLink = static::editorLink($source);
49 2
        $this->queries[] = [
50 2
            'sql' => $sql,
51 2
            'bindings' => $bindings,
52 2
            'time' => $time,
53 2
            'name' => $name,
54 2
            'pdo' => $pdo,
55 2
            'driver' => $driver,
56 2
            'source' => $source,
57 2
            'editorLink' => $editorLink,
58
            'hightlight' => null,
59
        ];
60
61 2
        return $this;
62
    }
63
64
    /**
65
     * subscribe.
66
     */
67 2
    protected function subscribe()
68
    {
69 2
        $events = $this->laravel['events'];
70 2
        if (version_compare($this->laravel->version(), 5.2, '>=') === true) {
71
            $events->listen('Illuminate\Database\Events\QueryExecuted', function ($event) {
72 1
                $this->logQuery(
73 1
                    $event->sql,
74 1
                    $event->bindings,
75 1
                    $event->time,
76 1
                    $event->connectionName,
77 1
                    $event->connection->getPdo()
78
                );
79 1
            });
80
        } else {
81
            $events->listen('illuminate.query', function ($sql, $bindings, $time, $connectionName) {
82 1
                $this->logQuery(
83 1
                    $sql,
84 1
                    $bindings,
85 1
                    $time,
86 1
                    $connectionName,
87 1
                    $this->laravel['db']->connection($connectionName)->getPdo()
88
                );
89 1
            });
90
        }
91 2
    }
92
93
    /**
94
     * getAttributes.
95
     *
96
     * @return array
97
     */
98 2
    protected function getAttributes()
99
    {
100 2
        $queries = [];
101 2
        foreach ($this->queries as $query) {
102 2
            $sql = $query['sql'];
103 2
            $bindings = $query['bindings'];
104 2
            $pdo = $query['pdo'];
105 2
            $driver = $query['driver'];
106 2
            $version = 0;
107
108 2
            $hightlight = Helper::hightlight($sql, $bindings, $pdo);
109 2
            $explains = [];
110 2
            $hints = [];
111 2
            if ($pdo instanceof PDO) {
112 2
                $driver = $this->getDatabaseDriver($pdo);
113 2
                if ($driver === 'mysql') {
114 1
                    $version = $this->getDatabaseVersion($pdo);
115 1
                    $explains = Helper::explain($pdo, $sql, $bindings);
116 1
                    $hints = Helper::performQueryAnalysis($sql, $version, $driver);
117
                }
118
            }
119
120 2
            $queries[] = array_merge($query, compact('hightlight', 'explains', 'hints', 'driver', 'version'));
121
        }
122
123
        return [
124 2
            'counter' => $this->counter,
125 2
            'totalTime' => $this->totalTime,
126 2
            'queries' => $queries,
127
        ];
128
    }
129
130
    /**
131
     * getDatabaseDriver.
132
     *
133
     * @param \PDO $pdo
134
     * @return string
135
     */
136 2
    protected function getDatabaseDriver(PDO $pdo)
137
    {
138
        try {
139 2
            $driver = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
140 1
        } catch (Exception $e) {
141 1
            $driver = null;
142
        }
143
144 2
        return $driver;
145
    }
146
147
    /**
148
     * getDatabaseVersion.
149
     *
150
     * @param \PDO $pdo
151
     * @return string
152
     */
153 1
    protected function getDatabaseVersion(PDO $pdo)
154
    {
155
        try {
156 1
            $version = $pdo->getAttribute(PDO::ATTR_SERVER_VERSION);
157 1
        } catch (Exception $e) {
158 1
            $version = 0;
159
        }
160
161 1
        return $version;
162
    }
163
}
164