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 ( 1144b4...828920 )
by Márk
07:09 queued 04:40
created

Driver::createQueue()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

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