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 ( 967239...06466a )
by Márk
02:52
created

Driver::popMessage()   A

Complexity

Conditions 4
Paths 7

Size

Total Lines 23

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

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