GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 0cd075...2229bb )
by Andreas
02:36
created

DbHandler::getChannelEntriesCount()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 7
ccs 5
cts 5
cp 1
rs 9.4285
cc 1
eloc 4
nc 1
nop 1
crap 1
1
<?php
2
/**
3
 * Starlit Db.
4
 *
5
 * @copyright Copyright (c) 2016 Starweb / Ehandelslogik i Lund AB
6
 * @license   BSD 3-Clause
7
 */
8
9
namespace Starlit\Db\Monolog;
10
11
use Monolog\Handler\AbstractProcessingHandler;
12
use Monolog\Logger;
13
use Starlit\Db\Db;
14
15
/**
16
 * Monolog handler to log to a database table.
17
 *
18
 * Use a table structure like this for compatibility:
19
 *
20
 * CREATE TABLE `log` (
21
 *   `log_entry_id` BIGINT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
22
 *   `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
23
 *   `channel` VARCHAR(64) NOT NULL,
24
 *   `level` VARCHAR(10) NOT NULL,
25
 *   `message` TEXT NOT NULL,
26
 *   PRIMARY KEY (`log_entry_id`),
27
 *   KEY `time` (`time`),
28
 *   KEY `channel` (`channel`),
29
 *   KEY `level` (`level`)
30
 * );
31
 *
32
 * @author Andreas Nilsson <http://github.com/jandreasn>
33
 */
34
class DbHandler extends AbstractProcessingHandler
35
{
36
    /**
37
     * @var Db
38
     */
39
    protected $db;
40
41
    /**
42
     * @var string
43
     */
44
    protected $table;
45
46
    /**
47
     * @var array
48
     */
49
    protected $additionalFields;
50
51
    /**
52
     * @var int
53
     */
54
    protected $maxEntries;
55
56
    /**
57
     * @var int
58
     */
59
    protected $cleanDivisor = 100;
60
61
    /**
62
     * Default probability of table being cleaned (1/100 = 1%).
63
     *
64
     * @var int
65
     */
66
    protected $cleanProbability = 1;
67
68
    /**
69
     * @param Db        $db
70
     * @param int       $maxEntries
71
     * @param array     $additionalFields
72
     * @param int       $level
73
     * @param bool      $bubble
74
     * @param string    $table
75
     */
76 5
    public function __construct(
77
        Db $db,
78
        $maxEntries = null,
79
        array $additionalFields = [],
80
        $level = Logger::DEBUG,
81
        $bubble = true,
82
        $table = 'log'
83
    ) {
84 5
        parent::__construct($level, $bubble);
85
86 5
        $this->db = $db;
87 5
        $this->maxEntries = $maxEntries;
88 5
        $this->additionalFields = $additionalFields;
89 5
        $this->table = $table;
90 5
    }
91
92
    /**
93
     * {@inheritdoc}
94
     */
95 5
    protected function processRecord(array $record)
96
    {
97 5
        $record = parent::processRecord($record);
98
99 5
        $record['additionalFieldsData'] = [];
100 5
        foreach ($this->additionalFields as $field) {
101 5
            foreach (['context', 'extra'] as $sourceKey) {
102 5
                if (isset($record[$sourceKey][$field])) {
103 1
                    $record['additionalFieldsData'][$field] = $record[$sourceKey][$field];
104 1
                    unset($record[$sourceKey][$field]);
105
106 1
                }
107 5
            }
108 5
        }
109
110 5
        return $record;
111
    }
112
113
    /**
114
     * {@inheritdoc}
115
     */
116 5
    protected function write(array $record)
117
    {
118
        $dbData = [
119 5
            'channel' => $record['channel'],
120 5
            'level'   => $record['level_name'],
121 5
            'message' => $record['formatted'],
122 5
        ] + $record['additionalFieldsData'];
123
124 5
        $this->db->insert($this->table, $dbData);
125
126 5
        $this->clean($record['channel']);
127 5
    }
128
129
    /**
130
     * @param string $channel
131
     */
132 5
    protected function clean($channel)
133
    {
134 5
        if ($this->maxEntries && mt_rand(1, $this->cleanDivisor) <= $this->cleanProbability) {
135 2
            $currentCount = $this->getChannelEntriesCount($channel);
136 2
            if ($currentCount > $this->maxEntries) {
137 1
                $entriesToDelete = $currentCount - $this->maxEntries;
138 1
                $this->deleteXOldestChannelEntries($channel, $entriesToDelete);
139 1
            }
140 2
        }
141 5
    }
142
143
    /**
144
     * @param string $channel
145
     * @return int
146
     */
147 2
    protected function getChannelEntriesCount($channel)
148
    {
149 2
        return $this->db->fetchOne(
150 2
            'SELECT COUNT(*) FROM `' . $this->table . '` WHERE `channel` = ?',
151 2
            [$channel]
152 2
        );
153
    }
154
155
    /**
156
     * @param $channel
157
     * @param $entriesToDelete
158
     */
159 1
    protected function deleteXOldestChannelEntries($channel, $entriesToDelete)
160
    {
161 1
        $this->db->exec(
162 1
            sprintf(
163 1
                'DELETE FROM `%s` WHERE `channel` = ?  ORDER BY `time` ASC LIMIT %d',
164 1
                $this->table,
165
                (int) $entriesToDelete
166 1
            ),
167 1
            [$channel]
168 1
        );
169 1
    }
170
171
    /**
172
     * @param Logger $logger
173
     */
174
    public function clear(Logger $logger)
175
    {
176
        $this->db->exec(sprintf('DELETE FROM `%s` WHERE `channel` = ?', $this->table), [$logger->getName()]);
177
    }
178
179
    /**
180
     * {@inheritdoc}
181
     */
182 5
    protected function getDefaultFormatter()
183
    {
184 5
        return new DbFormatter();
185
    }
186
187
    /**
188
     * @see setCleanProbability()
189
     * @param int $cleanDivisor
190
     */
191 1
    public function setCleanDivisor($cleanDivisor)
192
    {
193 1
        $this->cleanDivisor = $cleanDivisor;
194 1
    }
195
196
    /**
197
     * Sets the probability that log table is cleaned on log write.
198
     *
199
     * The clean probability together with clean divisor is used to calculate the probability.
200
     * With a clean probability of 1 and a divisor of 100, there's a 1% chance (1/100) the table
201
     * will be cleaned.
202
     *
203
     * @param int $cleanProbability
204
     */
205 3
    public function setCleanProbability($cleanProbability)
206
    {
207 3
        $this->cleanProbability = $cleanProbability;
208 3
    }
209
}
210