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 (#275)
by
unknown
01:48
created

DoctrineDriver::persistedQueue()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

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