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
Pull Request — master (#282)
by Henrik
03:40 queued 01:55
created

DoctrineDriver::createQueue()   B

Complexity

Conditions 3
Paths 2

Size

Total Lines 25
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 25
rs 8.8571
cc 3
eloc 14
nc 2
nop 1
1
<?php
2
3
namespace Bernard\Driver;
4
5
use Doctrine\DBAL\Connection;
6
use Doctrine\DBAL\Exception\ConstraintViolationException;
7
8
/**
9
 * Driver supporting Doctrine DBAL
10
 *
11
 * @package Bernard
12
 */
13
class DoctrineDriver implements \Bernard\Driver
14
{
15
    protected $connection;
16
17
    /**
18
     * {@inheritdoc}
19
     */
20
    public function __construct(Connection $connection)
21
    {
22
        $this->connection = $connection;
23
    }
24
25
    /**
26
     * {@inheritdoc}
27
     */
28
    public function listQueues()
29
    {
30
        $statement = $this->connection->prepare('SELECT name FROM bernard_queues');
31
        $statement->execute();
32
33
        return $statement->fetchAll(\PDO::FETCH_COLUMN);
34
    }
35
36
    /**
37
     * {@inheritDoc}
38
     */
39
    public function createQueue($queueName)
40
    {
41
        try {
42
            $this->connection->transactional(function () use ($queueName) {
43
                $queueExistsQb = $this->connection->createQueryBuilder();
44
45
                $queueExists = $queueExistsQb
46
                    ->select('name')
47
                    ->from('bernard_queues')
48
                    ->where($queueExistsQb->expr()->eq('name', ':name'))
49
                    ->setParameter('name', $queueName)
50
                    ->execute();
51
52
                if ($queueExists->fetch()) {
53
                    // queue was already created
54
                    return;
55
                }
56
57
                $this->connection->insert('bernard_queues', array('name' => $queueName));
58
            });
59
        } catch (ConstraintViolationException $ignored) {
60
            // Because SQL server does not support a portable INSERT ON IGNORE syntax
61
            // this ignores error based on primary key.
62
        }
63
    }
64
65
    /**
66
     * {@inheritdoc}
67
     */
68
    public function countMessages($queueName)
69
    {
70
        $query = 'SELECT COUNT(id) FROM bernard_messages WHERE queue = :queue AND visible = :visible';
71
72
        return (integer) $this->connection->fetchColumn($query, [
73
            'queue' => $queueName,
74
            'visible' => true,
75
        ]);
76
    }
77
78
    /**
79
     * {@inheritdoc}
80
     */
81
    public function pushMessage($queueName, $message)
82
    {
83
        $types = ['string', 'string', 'datetime'];
84
        $data = [
85
            'queue' => $queueName,
86
            'message' => $message,
87
            'sentAt' => new \DateTime(),
88
        ];
89
90
        $this->createQueue($queueName);
91
        $this->connection->insert('bernard_messages', $data, $types);
92
    }
93
94
    /**
95
     * {@inheritdoc}
96
     */
97
    public function popMessage($queueName, $duration = 5)
98
    {
99
        $runtime = microtime(true) + $duration;
100
101
        while (microtime(true) < $runtime) {
102
            $this->connection->beginTransaction();
103
104
            try {
105
                $message = $this->doPopMessage($queueName);
106
107
                $this->connection->commit();
108
            } catch (\Exception $e) {
109
                $this->connection->rollback();
110
            }
111
112
            if (isset($message)) {
113
                return $message;
114
            }
115
116
            //sleep for 10 ms
117
            usleep(10000);
118
        }
119
    }
120
    /**
121
     * {@inheritdoc}
122
     */
123
    public function acknowledgeMessage($queueName, $receipt)
124
    {
125
        $this->connection->delete('bernard_messages', ['id' => $receipt, 'queue' => $queueName]);
126
    }
127
128
    /**
129
     * {@inheritdoc}
130
     */
131
    public function peekQueue($queueName, $index = 0, $limit = 20)
132
    {
133
        $parameters = [$queueName, $limit, $index];
134
        $types = ['string', 'integer', 'integer'];
135
136
        $query = 'SELECT message FROM bernard_messages WHERE queue = ? ORDER BY sentAt LIMIT ? OFFSET ?';
137
138
        return $this
139
            ->connection
140
            ->executeQuery($query, $parameters, $types)
141
            ->fetchAll(\PDO::FETCH_COLUMN)
142
        ;
143
    }
144
145
    /**
146
     * {@inheritdoc}
147
     */
148
    public function removeQueue($queueName)
149
    {
150
        $this->connection->delete('bernard_messages', ['queue' => $queueName]);
151
        $this->connection->delete('bernard_queues', ['name' => $queueName]);
152
    }
153
154
    /**
155
     * {@inheritdoc}
156
     */
157
    public function info()
158
    {
159
        $params = $this->connection->getParams();
160
161
        unset($params['user'], $params['password']);
162
163
        return $params;
164
    }
165
166
    /**
167
     * Execute the actual query and process the response
168
     *
169
     * @param string $queueName
170
     *
171
     * @return array|null
172
     */
173
    protected function doPopMessage($queueName)
174
    {
175
        $query = 'SELECT id, message FROM bernard_messages
176
                  WHERE queue = :queue AND visible = :visible
177
                  ORDER BY sentAt LIMIT 1 ' . $this->connection->getDatabasePlatform()->getForUpdateSql();
178
179
        list($id, $message) = $this->connection->fetchArray($query, [
180
            'queue' => $queueName,
181
            'visible' => true,
182
        ]);
183
184
        if ($id) {
185
            $this->connection->update('bernard_messages', ['visible' => 0], compact('id'));
186
187
            return [$message, $id];
188
        }
189
    }
190
}
191