Passed
Pull Request — master (#220)
by
unknown
09:01
created

Http::streamWrite()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
eloc 3
c 2
b 0
f 0
nc 1
nop 3
dl 0
loc 5
ccs 0
cts 0
cp 0
crap 2
rs 10
1
<?php
0 ignored issues
show
introduced by
Missing declare(strict_types=1).
Loading history...
2
3
namespace ClickHouseDB\Transport;
4
5
use ClickHouseDB\Exception\TransportException;
6
use ClickHouseDB\Query\Degeneration;
7
use ClickHouseDB\Query\Query;
8
use ClickHouseDB\Query\WhereInFile;
9
use ClickHouseDB\Query\WriteToFile;
10
use ClickHouseDB\Settings;
11
use ClickHouseDB\Statement;
12
use const PHP_EOL;
0 ignored issues
show
introduced by
Expected 1 lines between different types of use statement, found 0.
Loading history...
introduced by
Type PHP_EOL is not used in this file.
Loading history...
13
14
class Http
15
{
16
    const AUTH_METHOD_HEADER       = 1;
0 ignored issues
show
introduced by
Constant \ClickHouseDB\Transport\Http::AUTH_METHOD_HEADER visibility missing.
Loading history...
17
    const AUTH_METHOD_QUERY_STRING = 2;
0 ignored issues
show
introduced by
Constant \ClickHouseDB\Transport\Http::AUTH_METHOD_QUERY_STRING visibility missing.
Loading history...
18
    const AUTH_METHOD_BASIC_AUTH   = 3;
0 ignored issues
show
introduced by
Constant \ClickHouseDB\Transport\Http::AUTH_METHOD_BASIC_AUTH visibility missing.
Loading history...
19
20
    const AUTH_METHODS_LIST = [
0 ignored issues
show
introduced by
Constant \ClickHouseDB\Transport\Http::AUTH_METHODS_LIST visibility missing.
Loading history...
21
        self::AUTH_METHOD_HEADER,
22
        self::AUTH_METHOD_QUERY_STRING,
23
        self::AUTH_METHOD_BASIC_AUTH,
24
    ];
25
26
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\Http::$_username with single line content, use one-line comment instead.
Loading history...
27
     * @var string
28
     */
29
    private $_username = null;
30
31
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\Http::$_password with single line content, use one-line comment instead.
Loading history...
32
     * @var string
33
     */
34
    private $_password = null;
35
36
    /**
37
     * The username and password can be indicated in one of three ways:
38
     *  - Using HTTP Basic Authentication.
39
     *  - In the ‘user’ and ‘password’ URL parameters.
40
     *  - Using ‘X-ClickHouse-User’ and ‘X-ClickHouse-Key’ headers (by default)
41
     *
42
     * @see https://clickhouse.tech/docs/en/interfaces/http/
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
43
     * @var int
44
     */
45
    private $_authMethod = self::AUTH_METHOD_HEADER;
46
47
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\Http::$_host with single line content, use one-line comment instead.
Loading history...
48
     * @var string
49
     */
50
    private $_host = '';
51
52
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\Http::$_port with single line content, use one-line comment instead.
Loading history...
53
     * @var int
54
     */
55
    private $_port = 0;
56
57
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\Http::$_verbose with single line content, use one-line comment instead.
Loading history...
58
     * @var bool|int
59
     */
60
    private $_verbose = false;
61
62
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\Http::$_curler with single line content, use one-line comment instead.
Loading history...
63
     * @var CurlerRolling
64
     */
65
    private $_curler = null;
66
67
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\Http::$_settings with single line content, use one-line comment instead.
Loading history...
68
     * @var Settings
69
     */
70
    private $_settings = null;
71
72
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\Http::$_query_degenerations with single line content, use one-line comment instead.
Loading history...
73
     * @var array
0 ignored issues
show
introduced by
@var annotation of property \ClickHouseDB\Transport\Http::$_query_degenerations does not specify type hint for its items.
Loading history...
74
     */
75
    private $_query_degenerations = [];
0 ignored issues
show
Coding Style introduced by
Member variable "_query_degenerations" is not in valid camel caps format
Loading history...
76
77
    /**
78
     * Count seconds (int)
79
     *
80
     * @var float
81
     */
82
    private $_connectTimeOut = 5.0;
83
84
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\Http::$xClickHouseProgress with single line content, use one-line comment instead.
Loading history...
85
     * @var callable
86
     */
87
    private $xClickHouseProgress = null;
88
89
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\Http::$sslCA with single line content, use one-line comment instead.
Loading history...
90
     * @var null|string
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|string".
Loading history...
91
     */
92
    private $sslCA = null;
93
94
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\Http::$stdErrOut with single line content, use one-line comment instead.
Loading history...
95
     * @var null|resource
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|resource".
Loading history...
96
     */
97
    private $stdErrOut = null;
98
99
    /**
0 ignored issues
show
introduced by
Found multi-line comment for property \ClickHouseDB\Transport\Http::$handle with single line content, use one-line comment instead.
Loading history...
100
     * @var null|resource
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|resource".
Loading history...
101
     */
102 68
    private $handle = null;
103
104 68
    /**
105
     * Http constructor.
0 ignored issues
show
introduced by
Documentation comment contains forbidden comment "Http constructor.".
Loading history...
106 68
     * @param string $host
0 ignored issues
show
introduced by
Expected 1 lines between description and annotations, found 0.
Loading history...
107 68
     * @param int $port
0 ignored issues
show
Coding Style introduced by
Expected 4 spaces after parameter type; 1 found
Loading history...
108 68
     * @param string $username
109
     * @param string $password
110
     * @param int $authMethod
0 ignored issues
show
Coding Style introduced by
Expected 4 spaces after parameter type; 1 found
Loading history...
111
     */
112 68
    public function __construct($host, $port, $username, $password, $authMethod = null)
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::__construct() does not have native type hint for its parameter $host but it should be possible to add it based on @param annotation "string".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::__construct() does not have native type hint for its parameter $port but it should be possible to add it based on @param annotation "int".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::__construct() does not have native type hint for its parameter $username but it should be possible to add it based on @param annotation "string".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::__construct() does not have native type hint for its parameter $password but it should be possible to add it based on @param annotation "string".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::__construct() does not have native type hint for its parameter $authMethod but it should be possible to add it based on @param annotation "int".
Loading history...
113
    {
114 68
        $this->setHost($host, $port);
115 68
116
        $this->_username = $username;
117
        $this->_password = $password;
118 68
        if ($authMethod) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $authMethod of type integer|null is loosely compared to true; this is ambiguous if the integer can be 0. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
119
            $this->_authMethod = $authMethod;
120 68
        }
121 68
122
        $this->_settings = new Settings();
123
124
        $this->setCurler();
125
        $this->setHandle();
126
    }
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line after function; 2 found
Loading history...
127
128
129
    public function setCurler() : void
0 ignored issues
show
introduced by
There must be no whitespace between closing parenthesis and return type colon.
Loading history...
130
    {
131
        $this->_curler = new CurlerRolling();
132
    }
133
134
    /**
135
     * @param CurlerRolling $curler
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setDirtyCurler() has useless @param annotation for parameter $curler.
Loading history...
136
     */
137
    public function setDirtyCurler(CurlerRolling $curler) : void
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setDirtyCurler() does not need documentation comment.
Loading history...
introduced by
There must be no whitespace between closing parenthesis and return type colon.
Loading history...
138
    {
139
        if ($curler instanceof CurlerRolling) {
0 ignored issues
show
introduced by
$curler is always a sub-type of ClickHouseDB\Transport\CurlerRolling.
Loading history...
introduced by
Use early exit to reduce code nesting.
Loading history...
140
            $this->_curler = $curler;
141
        }
142
    }
143
144
    /**
145 68
     * @return CurlerRolling
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getCurler() has useless @return annotation.
Loading history...
146
     */
147 68
    public function getCurler(): ?CurlerRolling
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getCurler() does not need documentation comment.
Loading history...
148 68
    {
149
        return $this->_curler;
150
    }
151 68
152 68
    /**
153
     * @param string $host
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setHost() has useless @param annotation for parameter $host.
Loading history...
154
     * @param int $port
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setHost() has useless @param annotation for parameter $port.
Loading history...
Coding Style introduced by
Expected 4 spaces after parameter type; 1 found
Loading history...
155
     */
156
    public function setHost(string $host, int $port = -1) : void
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setHost() does not need documentation comment.
Loading history...
introduced by
There must be no whitespace between closing parenthesis and return type colon.
Loading history...
157
    {
158
        if ($port > 0) {
159
            $this->_port = $port;
160
        }
161
162
        $this->_host = $host;
163
    }
164
165
    /**
166
     * Sets client SSL certificate for Yandex Cloud
167 55
     *
168
     * @param string $caPath
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setSslCa() has useless @param annotation for parameter $caPath.
Loading history...
169 55
     */
170 55
    public function setSslCa(string $caPath) : void
0 ignored issues
show
introduced by
There must be no whitespace between closing parenthesis and return type colon.
Loading history...
171 1
    {
172
        $this->sslCA = $caPath;
173 55
    }
174 55
175 1
    /**
176
     * @return string
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getUri() has useless @return annotation.
Loading history...
177 55
     */
178 55
    public function getUri(): string
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getUri() does not need documentation comment.
Loading history...
179
    {
180 1
        $proto = 'http';
181
        if ($this->settings()->isHttps()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
182
            $proto = 'https';
183
        }
184
        $uri = $proto . '://' . $this->_host;
185
        if (stripos($this->_host, '/') !== false || stripos($this->_host, ':') !== false) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
introduced by
Function stripos() should not be referenced via a fallback global name, but via a use statement.
Loading history...
186 68
            return $uri;
187
        }
188 68
        if (intval($this->_port) > 0) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
introduced by
Function intval() should not be referenced via a fallback global name, but via a use statement.
Loading history...
189
            return $uri . ':' . $this->_port;
190
        }
191
        return $uri;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
192
    }
193
194
    /**
195
     * @return Settings
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::settings() has useless @return annotation.
Loading history...
196
     */
197
    public function settings(): Settings
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::settings() does not need documentation comment.
Loading history...
198
    {
199
        return $this->_settings;
200
    }
201
202
    /**
203
     * @param bool $flag
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::verbose() has useless @param annotation for parameter $flag.
Loading history...
204
     * @return bool
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::verbose() has useless @return annotation.
Loading history...
205 45
     */
206
    public function verbose(bool $flag): bool
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::verbose() does not need documentation comment.
Loading history...
207 45
    {
208
        $this->_verbose = $flag;
209 45
        return $flag;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
210 45
    }
211
212
    /**
213
     * @param array $params
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
introduced by
@param annotation of method \ClickHouseDB\Transport\Http::getUrl() does not specify type hint for items of its traversable parameter $params.
Loading history...
214 45
     * @return string
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getUrl() has useless @return annotation.
Loading history...
215
     */
216
    private function getUrl($params = []): string
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getUrl() does not have native type hint for its parameter $params but it should be possible to add it based on @param annotation "array".
Loading history...
217
    {
218
        $settings = $this->settings()->getSettings();
219
220
        if (is_array($params) && sizeof($params)) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 2.
Loading history...
introduced by
Function is_array() should not be referenced via a fallback global name, but via a use statement.
Loading history...
introduced by
Function sizeof() should not be referenced via a fallback global name, but via a use statement.
Loading history...
Coding Style introduced by
The use of function sizeof() is forbidden; use count() instead
Loading history...
221
            $settings = array_merge($settings, $params);
0 ignored issues
show
introduced by
Function array_merge() should not be referenced via a fallback global name, but via a use statement.
Loading history...
222 45
        }
223
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
224
225 45
        if ($this->settings()->isReadOnlyUser()) {
226
            unset($settings['extremes']);
227
            unset($settings['readonly']);
228
            unset($settings['enable_http_compression']);
229
            unset($settings['max_execution_time']);
230
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
231
        }
232 45
233
        unset($settings['https']);
234 45
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
235
236 45
        return $this->getUri() . '?' . http_build_query($settings);
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 2.
Loading history...
introduced by
Function http_build_query() should not be referenced via a fallback global name, but via a use statement.
Loading history...
237 45
    }
238
239
    /**
240
     * @param array $extendinfo
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
introduced by
@param annotation of method \ClickHouseDB\Transport\Http::newRequest() does not specify type hint for items of its traversable parameter $extendinfo.
Loading history...
241
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::newRequest() has useless @return annotation.
Loading history...
242
     */
243
    private function newRequest($extendinfo): CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::newRequest() does not have native type hint for its parameter $extendinfo but it should be possible to add it based on @param annotation "array".
Loading history...
244 45
    {
245
        $new = new CurlerRequest(false, $this->handle);
246
247
        switch ($this->_authMethod) {
248
            case self::AUTH_METHOD_QUERY_STRING:
249 45
                /* @todo: Move this implementation to CurlerRequest class. Possible options: the authentication method
250 45
                 *        should be applied in method `CurlerRequest:prepareRequest()`.
251
                 */
252
                $this->settings()->set('user', $this->_username);
253 45
                $this->settings()->set('password', $this->_password);
254
                break;
255 45
            case self::AUTH_METHOD_BASIC_AUTH:
256 45
                $new->authByBasicAuth($this->_username, $this->_password);
257
                break;
258 45
            default:
259 1
                // Auth with headers by default
260
                $new->authByHeaders($this->_username, $this->_password);
261 45
                break;
262
        }
263
264
        $new->POST()->setRequestExtendedInfo($extendinfo);
265 45
266 45
        $new->httpCompression($this->settings()->isEnableHttpCompression());
0 ignored issues
show
Bug introduced by
It seems like $this->settings()->isEnableHttpCompression() can also be of type null; however, parameter $flag of ClickHouseDB\Transport\C...uest::httpCompression() does only seem to accept boolean, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

266
        $new->httpCompression(/** @scrutinizer ignore-type */ $this->settings()->isEnableHttpCompression());
Loading history...
267 45
268
        if ($this->settings()->getSessionId()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
269 45
            $new->persistent();
270
        }
271
        if ($this->sslCA) {
272
            $new->setSslCa($this->sslCA);
273
        }
274
275
        $new->timeOut($this->settings()->getTimeOut());
276
        $new->connectTimeOut($this->_connectTimeOut);
277
        $new->keepAlive();
278
        $new->verbose(boolval($this->_verbose));
0 ignored issues
show
introduced by
Function boolval() should not be referenced via a fallback global name, but via a use statement.
Loading history...
279 45
280
        return $new;
281 45
    }
282
283 45
    /**
284 1
     * @param Query $query
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::makeRequest() has useless @param annotation for parameter $query.
Loading history...
285
     * @param array $urlParams
0 ignored issues
show
introduced by
@param annotation of method \ClickHouseDB\Transport\Http::makeRequest() does not specify type hint for items of its traversable parameter $urlParams.
Loading history...
286
     * @param bool $query_as_string
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::makeRequest() has useless @param annotation for parameter $query_as_string.
Loading history...
Coding Style introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
287
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::makeRequest() has useless @return annotation.
Loading history...
288 45
     * @throws \ClickHouseDB\Exception\TransportException
0 ignored issues
show
introduced by
Class \ClickHouseDB\Exception\TransportException should not be referenced via a fully qualified name, but via a use statement.
Loading history...
289 45
     */
290 45
    private function makeRequest(Query $query, array $urlParams = [], bool $query_as_string = false): CurlerRequest
0 ignored issues
show
Coding Style introduced by
The variable $query_as_string should be in camel caps format.
Loading history...
291
    {
292
        $sql = $query->toSql();
293 45
294
        if ($query_as_string) {
0 ignored issues
show
Coding Style introduced by
The variable $query_as_string should be in camel caps format.
Loading history...
295
            $urlParams['query'] = $sql;
296
        }
297
298
        $extendInfo = [
299 45
            'sql' => $sql,
300 45
            'query' => $query,
301
            'format' => $query->getFormat()
0 ignored issues
show
introduced by
Multi-line arrays must have a trailing comma after the last element.
Loading history...
302
        ];
303 45
304 45
        $new = $this->newRequest($extendInfo);
305
306 45
        /*
307 45
         * Build URL after request making, since URL may contain auth data. This will not matter after the
308
         * implantation of the todo in the `HTTP:newRequest()` method.
309
         */
310 45
311
        if ($query->isUseInUrlBindingsParams()) {
312
            $urlParams = array_replace_recursive($urlParams, $query->getUrlBindingsParams());
0 ignored issues
show
introduced by
Function array_replace_recursive() should not be referenced via a fallback global name, but via a use statement.
Loading history...
313
        }
314
315
        $url = $this->getUrl($urlParams);
316
        $new->url($url);
317 3
318
        if (!$query_as_string) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
Coding Style introduced by
Expected 1 space after NOT operator; 0 found
Loading history...
Coding Style introduced by
The variable $query_as_string should be in camel caps format.
Loading history...
319
            $new->parameters_json($sql);
320 3
        }
321 1
        $new->httpCompression($this->settings()->isEnableHttpCompression());
0 ignored issues
show
Bug introduced by
It seems like $this->settings()->isEnableHttpCompression() can also be of type null; however, parameter $flag of ClickHouseDB\Transport\C...uest::httpCompression() does only seem to accept boolean, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

321
        $new->httpCompression(/** @scrutinizer ignore-type */ $this->settings()->isEnableHttpCompression());
Loading history...
322
323 2
        return $new;
324
    }
325
326
    /**
327 3
     * @param resource $stream
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
328 3
     * @return void
329 3
     */
330
    public function setStdErrOut($stream)
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setStdErrOut() does not have native return type hint for its return value but it should be possible to add it based on @return annotation "void".
Loading history...
331
    {
332 3
        if (is_resource($stream)) {
0 ignored issues
show
introduced by
Expected 0 lines after "if", found 1.
Loading history...
introduced by
Use early exit to reduce code nesting.
Loading history...
introduced by
Function is_resource() should not be referenced via a fallback global name, but via a use statement.
Loading history...
333
            $this->stdErrOut=$stream;
0 ignored issues
show
Coding Style introduced by
Expected at least 1 space before "="; 0 found
Loading history...
Coding Style introduced by
Expected at least 1 space after "="; 0 found
Loading history...
Coding Style introduced by
Equals sign not aligned correctly; expected 1 space but found 0 spaces
Loading history...
334
        }
335
336
    }
0 ignored issues
show
Coding Style introduced by
Function closing brace must go on the next line following the body; found 1 blank lines before brace
Loading history...
337
338 3
    /**
339 3
     * @param string|Query $sql
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
340 3
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::writeStreamData() has useless @return annotation.
Loading history...
341
     */
342
    public function writeStreamData($sql): CurlerRequest
343 3
    {
0 ignored issues
show
Coding Style introduced by
Expected 0 blank lines after opening function brace; 1 found
Loading history...
344 3
345
        if ($sql instanceof Query) {
346
            $query = $sql;
347
        } else {
348
            $query = new Query($sql);
349
        }
350
351
        $extendInfo = [
352
            'sql' => $sql,
353
            'query' => $query,
354 8
            'format' => $query->getFormat()
0 ignored issues
show
introduced by
Multi-line arrays must have a trailing comma after the last element.
Loading history...
355
        ];
356 8
357
        $request = $this->newRequest($extendInfo);
358
359 8
        /*
360 8
         * Build URL after request making, since URL may contain auth data. This will not matter after the
361 8
         * implantation of the todo in the `HTTP:newRequest()` method.
362
         */
363
        $url = $this->getUrl([
364 8
            'readonly' => 0,
365
            'query' => $query->toSql()
0 ignored issues
show
introduced by
Multi-line arrays must have a trailing comma after the last element.
Loading history...
366
        ]);
367
368
        $request->url($url);
369
        return $request;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
370 8
    }
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line after function; 2 found
Loading history...
371 8
372 8
373
    /**
374
     * @param string $sql
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
375 8
     * @param string $file_name
376
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::writeAsyncCSV() has useless @return annotation.
Loading history...
377 8
     * @throws \ClickHouseDB\Exception\TransportException
0 ignored issues
show
introduced by
Class \ClickHouseDB\Exception\TransportException should not be referenced via a fully qualified name, but via a use statement.
Loading history...
378 8
     */
379 8
    public function writeAsyncCSV($sql, $file_name): Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::writeAsyncCSV() does not have native type hint for its parameter $sql but it should be possible to add it based on @param annotation "string".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::writeAsyncCSV() does not have native type hint for its parameter $file_name but it should be possible to add it based on @param annotation "string".
Loading history...
Coding Style introduced by
The variable $file_name should be in camel caps format.
Loading history...
380 8
    {
381
        $query = new Query($sql);
382 8
383
        $extendinfo = [
384 8
            'sql' => $sql,
385 8
            'query' => $query,
386
            'format' => $query->getFormat()
0 ignored issues
show
introduced by
Multi-line arrays must have a trailing comma after the last element.
Loading history...
387 8
        ];
388
389
        $request = $this->newRequest($extendinfo);
390
391
        /*
392
         * Build URL after request making, since URL may contain auth data. This will not matter after the
393
         * implantation of the todo in the `HTTP:newRequest()` method.
394
         */
395 12
        $url = $this->getUrl([
396
            'readonly' => 0,
397 12
            'query' => $query->toSql()
0 ignored issues
show
introduced by
Multi-line arrays must have a trailing comma after the last element.
Loading history...
398
        ]);
399
400
        $request->url($url);
401
402
        $request->setCallbackFunction(function (CurlerRequest $request) {
0 ignored issues
show
introduced by
Closure not using "$this" should be declared static.
Loading history...
introduced by
Closure does not have void return type hint.
Loading history...
403
            $handle = $request->getInfileHandle();
404
            if (is_resource($handle)) {
0 ignored issues
show
introduced by
Use early exit to reduce code nesting.
Loading history...
introduced by
Function is_resource() should not be referenced via a fallback global name, but via a use statement.
Loading history...
405 2
                fclose($handle);
0 ignored issues
show
introduced by
Function fclose() should not be referenced via a fallback global name, but via a use statement.
Loading history...
406
            }
407 2
        });
408 2
409
        $request->setInfile($file_name);
0 ignored issues
show
Coding Style introduced by
The variable $file_name should be in camel caps format.
Loading history...
410
        $this->_curler->addQueLoop($request);
411
412
        return new Statement($request);
413
    }
414
415 38
    /**
416
     * get Count Pending Query in Queue
417 38
     *
418
     * @return int
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getCountPendingQueue() has useless @return annotation.
Loading history...
419
     */
420
    public function getCountPendingQueue(): int
421 1
    {
422
        return $this->_curler->countPending();
423 1
    }
424
425
    /**
426 1
     * set Connect TimeOut in seconds [CURLOPT_CONNECTTIMEOUT] ( int )
427 1
     *
428 1
     * @param float $connectTimeOut
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setConnectTimeOut() has useless @param annotation for parameter $connectTimeOut.
Loading history...
429 1
     */
430
    public function setConnectTimeOut(float $connectTimeOut)
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setConnectTimeOut() does not have void return type hint.
Loading history...
431
    {
432
        $this->_connectTimeOut = $connectTimeOut;
433 1
    }
434 1
435
    /**
436
     * get ConnectTimeOut in seconds
437
     *
438 1
     * @return float
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getConnectTimeOut() has useless @return annotation.
Loading history...
439 1
     */
440
    public function getConnectTimeOut(): float
441
    {
442
        return $this->_connectTimeOut;
443 1
    }
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line after function; 2 found
Loading history...
444 1
445
446 1
    public function __findXClickHouseProgress($handle): bool
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::__findXClickHouseProgress() does not have parameter type hint nor @param annotation for its parameter $handle.
Loading history...
447
    {
448 1
        $code = curl_getinfo($handle, CURLINFO_HTTP_CODE);
0 ignored issues
show
introduced by
Function curl_getinfo() should not be referenced via a fallback global name, but via a use statement.
Loading history...
introduced by
Constant CURLINFO_HTTP_CODE should not be referenced via a fallback global name, but via a use statement.
Loading history...
449
450
        // Search X-ClickHouse-Progress
451 1
        if ($code == 200) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
introduced by
Operator == is disallowed, use === instead.
Loading history...
452
            $response = curl_multi_getcontent($handle);
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 4 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
introduced by
Function curl_multi_getcontent() should not be referenced via a fallback global name, but via a use statement.
Loading history...
453
            $header_size = curl_getinfo($handle, CURLINFO_HEADER_SIZE);
0 ignored issues
show
Coding Style introduced by
The variable $header_size should be in camel caps format.
Loading history...
introduced by
Function curl_getinfo() should not be referenced via a fallback global name, but via a use statement.
Loading history...
introduced by
Constant CURLINFO_HEADER_SIZE should not be referenced via a fallback global name, but via a use statement.
Loading history...
454
            if (!$header_size) {
0 ignored issues
show
Coding Style introduced by
Expected 1 space after NOT operator; 0 found
Loading history...
Coding Style introduced by
The variable $header_size should be in camel caps format.
Loading history...
455
                return false;
456
            }
457
458 1
            $header = substr($response, 0, $header_size);
0 ignored issues
show
introduced by
Function substr() should not be referenced via a fallback global name, but via a use statement.
Loading history...
Coding Style introduced by
The variable $header_size should be in camel caps format.
Loading history...
459
            if (!$header) {
0 ignored issues
show
Coding Style introduced by
Expected 1 space after NOT operator; 0 found
Loading history...
460
                return false;
461
            }
462
463
            $match = [];
464
            if (preg_match_all('/^X-ClickHouse-(?:Progress|Summary):(.*?)$/im', $header, $match)) {
0 ignored issues
show
introduced by
Function preg_match_all() should not be referenced via a fallback global name, but via a use statement.
Loading history...
465
                $data = @json_decode(end($match[1]), true);
0 ignored issues
show
introduced by
Function json_decode() should not be referenced via a fallback global name, but via a use statement.
Loading history...
introduced by
Function end() should not be referenced via a fallback global name, but via a use statement.
Loading history...
466
                if ($data && is_callable($this->xClickHouseProgress)) {
0 ignored issues
show
introduced by
Function is_callable() should not be referenced via a fallback global name, but via a use statement.
Loading history...
Coding Style introduced by
Blank line found at start of control structure
Loading history...
467
468 40
                    if (is_array($this->xClickHouseProgress)) {
0 ignored issues
show
introduced by
Expected 0 lines after "if", found 1.
Loading history...
introduced by
Function is_array() should not be referenced via a fallback global name, but via a use statement.
Loading history...
469
                        call_user_func_array($this->xClickHouseProgress, [$data]);
0 ignored issues
show
introduced by
Function call_user_func_array() should not be referenced via a fallback global name, but via a use statement.
Loading history...
470 40
                    } else {
471 40
                        call_user_func($this->xClickHouseProgress, $data);
0 ignored issues
show
introduced by
Function call_user_func() should not be referenced via a fallback global name, but via a use statement.
Loading history...
472
                    }
473 40
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
474
                }
475 1
            }
476
        }
477 1
        return false;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
478 1
    }
479
480
    /**
481
     * @param Query $query
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::getRequestRead() has useless @param annotation for parameter $query.
Loading history...
Coding Style introduced by
Expected 12 spaces after parameter type; 1 found
Loading history...
482 40
     * @param null|WhereInFile $whereInFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WhereInFile".
Loading history...
483 1
     * @param null|WriteToFile $writeToFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WriteToFile".
Loading history...
484 1
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getRequestRead() has useless @return annotation.
Loading history...
485
     * @throws \Exception
0 ignored issues
show
introduced by
Class \Exception should not be referenced via a fully qualified name, but via a use statement.
Loading history...
486
     */
487
    public function getRequestRead(Query $query, $whereInFile = null, $writeToFile = null): CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getRequestRead() does not have native type hint for its parameter $whereInFile but it should be possible to add it based on @param annotation "null|WhereInFile".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::getRequestRead() does not have native type hint for its parameter $writeToFile but it should be possible to add it based on @param annotation "null|WriteToFile".
Loading history...
488 40
    {
489
        $urlParams = ['readonly' => 2];
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 7 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
490
        $query_as_string = false;
0 ignored issues
show
Coding Style introduced by
The variable $query_as_string should be in camel caps format.
Loading history...
491 40
        // ---------------------------------------------------------------------------------
492 1
        if ($whereInFile instanceof WhereInFile && $whereInFile->size()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
493
            // $request = $this->prepareSelectWhereIn($request, $whereInFile);
494
            $structure = $whereInFile->fetchUrlParams();
495
            // $structure = [];
496 40
            $urlParams = array_merge($urlParams, $structure);
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 7 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
introduced by
Function array_merge() should not be referenced via a fallback global name, but via a use statement.
Loading history...
497
            $query_as_string = true;
0 ignored issues
show
Coding Style introduced by
The variable $query_as_string should be in camel caps format.
Loading history...
498 1
        }
499 1
        // ---------------------------------------------------------------------------------
500
        // if result to file
501 1
        if ($writeToFile instanceof WriteToFile && $writeToFile->fetchFormat()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
502
            $query->setFormat($writeToFile->fetchFormat());
503 1
            unset($urlParams['extremes']);
504
        }
505
        // ---------------------------------------------------------------------------------
506
        // makeRequest read
507
        $request = $this->makeRequest($query, $urlParams, $query_as_string);
0 ignored issues
show
Coding Style introduced by
The variable $query_as_string should be in camel caps format.
Loading history...
508
        // ---------------------------------------------------------------------------------
509
        // attach files
510
        if ($whereInFile instanceof WhereInFile && $whereInFile->size()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
511
            $request->attachFiles($whereInFile->fetchFiles());
512
        }
513
        // ---------------------------------------------------------------------------------
514
        // result to file
515
        if ($writeToFile instanceof WriteToFile && $writeToFile->fetchFormat()) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
516 1
517
            $fout = fopen($writeToFile->fetchFile(), 'w');
0 ignored issues
show
introduced by
Function fopen() should not be referenced via a fallback global name, but via a use statement.
Loading history...
518 1
            if (is_resource($fout)) {
0 ignored issues
show
introduced by
Function is_resource() should not be referenced via a fallback global name, but via a use statement.
Loading history...
Coding Style introduced by
Blank line found at start of control structure
Loading history...
519
520
                $isGz = $writeToFile->getGzip();
521 40
522 1
                if ($isGz) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 2.
Loading history...
523
                    // write gzip header
524
                    // "\x1f\x8b\x08\x00\x00\x00\x00\x00"
525 40
                    // fwrite($fout, "\x1F\x8B\x08\x08".pack("V", time())."\0\xFF", 10);
526
                    // write the original file name
527
                    // $oname = str_replace("\0", "", basename($writeToFile->fetchFile()));
528
                    // fwrite($fout, $oname."\0", 1+strlen($oname));
529 1
530
                    fwrite($fout, "\x1f\x8b\x08\x00\x00\x00\x00\x00");
0 ignored issues
show
introduced by
Function fwrite() should not be referenced via a fallback global name, but via a use statement.
Loading history...
531 1
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
532 1
                }
533
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
534
535 68
                $request->setResultFileHandle($fout, $isGz)->setCallbackFunction(function (CurlerRequest $request) {
0 ignored issues
show
introduced by
Closure not using "$this" should be declared static.
Loading history...
introduced by
Closure does not have void return type hint.
Loading history...
536
                    fclose($request->getResultFileHandle());
0 ignored issues
show
introduced by
Function fclose() should not be referenced via a fallback global name, but via a use statement.
Loading history...
537 68
                });
538 68
            }
539
        }
540
541
        if ($this->stdErrOut) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
542
            $request->setStdErrOut($this->stdErrOut);
543
        }
544
        if ($this->xClickHouseProgress) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
545
            $request->setFunctionProgress([$this, '__findXClickHouseProgress']);
546 27
        }
547
        // ---------------------------------------------------------------------------------
548 27
        return $request;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
introduced by
Expected 0 lines after "return", found 1.
Loading history...
549 27
550
    }
0 ignored issues
show
Coding Style introduced by
Function closing brace must go on the next line following the body; found 1 blank lines before brace
Loading history...
551
552
    public function cleanQueryDegeneration(): bool
553
    {
554
        $this->_query_degenerations = [];
0 ignored issues
show
Coding Style introduced by
Member variable "_query_degenerations" is not in valid camel caps format
Loading history...
555 38
        return true;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
556
    }
557 38
558 38
    public function addQueryDegeneration(Degeneration $degeneration): bool
559 38
    {
560
        $this->_query_degenerations[] = $degeneration;
0 ignored issues
show
Coding Style introduced by
Member variable "_query_degenerations" is not in valid camel caps format
Loading history...
561 38
        return true;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
562
    }
563
564
    /**
565
     * @param Query $query
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::getRequestWrite() has useless @param annotation for parameter $query.
Loading history...
566
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getRequestWrite() has useless @return annotation.
Loading history...
567
     * @throws \ClickHouseDB\Exception\TransportException
0 ignored issues
show
introduced by
Class \ClickHouseDB\Exception\TransportException should not be referenced via a fully qualified name, but via a use statement.
Loading history...
568
     */
569 46
    public function getRequestWrite(Query $query): CurlerRequest
570
    {
571
        $urlParams = ['readonly' => 0];
572
        return $this->makeRequest($query, $urlParams);
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
573 46
    }
574 46
575
    /**
576
     * @throws TransportException
577 46
     */
578
    public function ping(): bool
579
    {
580
        $request = new CurlerRequest(false, $this->handle);
581
        $request->url($this->getUri())->verbose(false)->GET()->connectTimeOut($this->getConnectTimeOut());
582
        $this->_curler->execOne($request);
583
584
        return trim($request->response()->body()) === 'Ok.';
0 ignored issues
show
introduced by
Function trim() should not be referenced via a fallback global name, but via a use statement.
Loading history...
585
    }
586
587
    /**
588
     * @param string $sql
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
Coding Style introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
589 39
     * @param mixed[] $bindings
590
     * @return Query
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::prepareQuery() has useless @return annotation.
Loading history...
591 39
     */
592
    private function prepareQuery($sql, $bindings): Query
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::prepareQuery() does not have native type hint for its parameter $sql but it should be possible to add it based on @param annotation "string".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::prepareQuery() does not have native type hint for its parameter $bindings but it should be possible to add it based on @param annotation "mixed[]".
Loading history...
593
    {
0 ignored issues
show
Coding Style introduced by
Expected 0 blank lines after opening function brace; 1 found
Loading history...
594 39
595 39
        // add Degeneration query
596 39
        foreach ($this->_query_degenerations as $degeneration) {
0 ignored issues
show
Coding Style introduced by
Member variable "_query_degenerations" is not in valid camel caps format
Loading history...
597
            $degeneration->bindParams($bindings);
598
        }
599
600
        return new Query($sql, $this->_query_degenerations);
0 ignored issues
show
Coding Style introduced by
Member variable "_query_degenerations" is not in valid camel caps format
Loading history...
601
    }
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line after function; 2 found
Loading history...
602
603
604
    /**
605
     * @param Query|string $sql
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
Coding Style introduced by
Expected 5 spaces after parameter type; 1 found
Loading history...
606 28
     * @param mixed[] $bindings
0 ignored issues
show
Coding Style introduced by
Expected 10 spaces after parameter type; 1 found
Loading history...
607
     * @param null|WhereInFile $whereInFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WhereInFile".
Loading history...
608 28
     * @param null|WriteToFile $writeToFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WriteToFile".
Loading history...
609
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::prepareSelect() has useless @return annotation.
Loading history...
610
     * @throws \Exception
0 ignored issues
show
introduced by
Class \Exception should not be referenced via a fully qualified name, but via a use statement.
Loading history...
611
     */
612 28
    private function prepareSelect($sql, $bindings, $whereInFile, $writeToFile = null): CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::prepareSelect() does not have native type hint for its parameter $bindings but it should be possible to add it based on @param annotation "mixed[]".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::prepareSelect() does not have native type hint for its parameter $whereInFile but it should be possible to add it based on @param annotation "null|WhereInFile".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::prepareSelect() does not have native type hint for its parameter $writeToFile but it should be possible to add it based on @param annotation "null|WriteToFile".
Loading history...
613 27
    {
614
        if ($sql instanceof Query) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
615
            return $this->getRequestWrite($sql);
616
        }
617
        $query = $this->prepareQuery($sql, $bindings);
618
        $query->setFormat('JSON');
619
        return $this->getRequestRead($query, $whereInFile, $writeToFile);
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
620 10
    }
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line after function; 2 found
Loading history...
621
622 10
623
    /**
624
     * @param Query|string $sql
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
625
     * @param mixed[] $bindings
0 ignored issues
show
Coding Style introduced by
Expected 6 spaces after parameter type; 1 found
Loading history...
626
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::prepareWrite() has useless @return annotation.
Loading history...
627
     * @throws \ClickHouseDB\Exception\TransportException
0 ignored issues
show
introduced by
Class \ClickHouseDB\Exception\TransportException should not be referenced via a fully qualified name, but via a use statement.
Loading history...
628
     */
629
    private function prepareWrite($sql, $bindings = []): CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::prepareWrite() does not have native type hint for its parameter $bindings but it should be possible to add it based on @param annotation "mixed[]".
Loading history...
630
    {
631
        if ($sql instanceof Query) {
632
            return $this->getRequestWrite($sql);
633
        }
634 32
635
        $query = $this->prepareQuery($sql, $bindings);
636 32
637 32
        if (strpos($sql, 'ON CLUSTER') === false) {
0 ignored issues
show
introduced by
Function strpos() should not be referenced via a fallback global name, but via a use statement.
Loading history...
638 32
            return $this->getRequestWrite($query);
639
        }
640
641
        if (strpos($sql, 'CREATE') === 0 || strpos($sql, 'DROP') === 0 || strpos($sql, 'ALTER') === 0) {
0 ignored issues
show
introduced by
Function strpos() should not be referenced via a fallback global name, but via a use statement.
Loading history...
642
            $query->setFormat('JSON');
643
        }
644
645
        return $this->getRequestWrite($query);
646
    }
647
648
    /**
649
     * @return bool
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::executeAsync() has useless @return annotation.
Loading history...
650 7
     * @throws \ClickHouseDB\Exception\TransportException
0 ignored issues
show
introduced by
Class \ClickHouseDB\Exception\TransportException should not be referenced via a fully qualified name, but via a use statement.
Loading history...
651
     */
652 7
    public function executeAsync(): bool
653 7
    {
654 7
        return $this->_curler->execLoopWait();
655
    }
656
657
    /**
658
     * @param Query|string $sql
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
Coding Style introduced by
Expected 5 spaces after parameter type; 1 found
Loading history...
659
     * @param mixed[] $bindings
0 ignored issues
show
Coding Style introduced by
Expected 10 spaces after parameter type; 1 found
Loading history...
660 1
     * @param null|WhereInFile $whereInFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WhereInFile".
Loading history...
661
     * @param null|WriteToFile $writeToFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WriteToFile".
Loading history...
662 1
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::select() has useless @return annotation.
Loading history...
663 1
     * @throws \ClickHouseDB\Exception\TransportException
0 ignored issues
show
introduced by
Class \ClickHouseDB\Exception\TransportException should not be referenced via a fully qualified name, but via a use statement.
Loading history...
664
     * @throws \Exception
0 ignored issues
show
introduced by
Class \Exception should not be referenced via a fully qualified name, but via a use statement.
Loading history...
665
     */
666
    public function select($sql, array $bindings = [], $whereInFile = null, $writeToFile = null): Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::select() does not have native type hint for its parameter $whereInFile but it should be possible to add it based on @param annotation "null|WhereInFile".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::select() does not have native type hint for its parameter $writeToFile but it should be possible to add it based on @param annotation "null|WriteToFile".
Loading history...
667
    {
668
        $request = $this->prepareSelect($sql, $bindings, $whereInFile, $writeToFile);
669
        $this->_curler->execOne($request);
670
        return new Statement($request);
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
671
    }
672 28
673
    /**
674 28
     * @param Query|string $sql
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
Coding Style introduced by
Expected 5 spaces after parameter type; 1 found
Loading history...
675 27
     * @param mixed[] $bindings
0 ignored issues
show
Coding Style introduced by
Expected 10 spaces after parameter type; 1 found
Loading history...
676 27
     * @param null|WhereInFile $whereInFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WhereInFile".
Loading history...
677 27
     * @param null|WriteToFile $writeToFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WriteToFile".
Loading history...
678 27
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::selectAsync() has useless @return annotation.
Loading history...
679 3
     * @throws \ClickHouseDB\Exception\TransportException
0 ignored issues
show
introduced by
Class \ClickHouseDB\Exception\TransportException should not be referenced via a fully qualified name, but via a use statement.
Loading history...
680
     * @throws \Exception
0 ignored issues
show
introduced by
Class \Exception should not be referenced via a fully qualified name, but via a use statement.
Loading history...
681
     */
682 25
    public function selectAsync($sql, array $bindings = [], $whereInFile = null, $writeToFile = null): Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::selectAsync() does not have native type hint for its parameter $whereInFile but it should be possible to add it based on @param annotation "null|WhereInFile".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::selectAsync() does not have native type hint for its parameter $writeToFile but it should be possible to add it based on @param annotation "null|WriteToFile".
Loading history...
683
    {
684
        $request = $this->prepareSelect($sql, $bindings, $whereInFile, $writeToFile);
685
        $this->_curler->addQueLoop($request);
686
        return new Statement($request);
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
687
    }
688
689
    /**
690
     * @param callable $callback
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setProgressFunction() has useless @param annotation for parameter $callback.
Loading history...
691 2
     */
692
    public function setProgressFunction(callable $callback) : void
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setProgressFunction() does not need documentation comment.
Loading history...
introduced by
There must be no whitespace between closing parenthesis and return type colon.
Loading history...
693 2
    {
694 2
        $this->xClickHouseProgress = $callback;
695
    }
696
697
    /**
698
     * @param string $sql
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
Coding Style introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
699
     * @param mixed[] $bindings
700 2
     * @param bool $exception
0 ignored issues
show
Coding Style introduced by
Expected 4 spaces after parameter type; 1 found
Loading history...
701
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::write() has useless @return annotation.
Loading history...
702
     * @throws \ClickHouseDB\Exception\TransportException
0 ignored issues
show
introduced by
Class \ClickHouseDB\Exception\TransportException should not be referenced via a fully qualified name, but via a use statement.
Loading history...
703
     */
704
    public function write($sql, array $bindings = [], $exception = true): Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::write() does not have native type hint for its parameter $sql but it should be possible to add it based on @param annotation "string".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::write() does not have native type hint for its parameter $exception but it should be possible to add it based on @param annotation "bool".
Loading history...
705
    {
706
        $request = $this->prepareWrite($sql, $bindings);
707
        $this->_curler->execOne($request);
708
        $response = new Statement($request);
709
        if ($exception) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
710
            if ($response->isError()) {
711
                $response->error();
712
            }
713 2
        }
714
        return $response;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
715 1
    }
716 1
717 1
    /**
718
     * @param Stream $streamRW
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::streaming() has useless @param annotation for parameter $streamRW.
Loading history...
Coding Style introduced by
Expected 8 spaces after parameter type; 1 found
Loading history...
719
     * @param CurlerRequest $request
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::streaming() has useless @param annotation for parameter $request.
Loading history...
720
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::streaming() has useless @return annotation.
Loading history...
721
     * @throws \ClickHouseDB\Exception\TransportException
0 ignored issues
show
introduced by
Class \ClickHouseDB\Exception\TransportException should not be referenced via a fully qualified name, but via a use statement.
Loading history...
722
     */
723
    private function streaming(Stream $streamRW, CurlerRequest $request): Statement
724
    {
725 2
        $callable = $streamRW->getClosure();
726
        $stream = $streamRW->getStream();
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 3 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
727
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
728 2
729 1
        try {
0 ignored issues
show
introduced by
Expected 0 lines after "try", found 2.
Loading history...
Coding Style introduced by
Blank line found at start of control structure
Loading history...
730
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
731 1
732
            if (!is_callable($callable)) {
0 ignored issues
show
Coding Style introduced by
Expected 1 space after NOT operator; 0 found
Loading history...
introduced by
Function is_callable() should not be referenced via a fallback global name, but via a use statement.
Loading history...
733
                if ($streamRW->isWrite()) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
734
735
                    $callable = function ($ch, $fd, $length) use ($stream) {
0 ignored issues
show
introduced by
Closure not using "$this" should be declared static.
Loading history...
736
                        return ($line = fread($stream, $length)) ? $line : '';
0 ignored issues
show
introduced by
Function fread() should not be referenced via a fallback global name, but via a use statement.
Loading history...
737
                    };
738 2
                } else {
739 2
                    $callable = function ($ch, $fd) use ($stream) {
0 ignored issues
show
introduced by
Closure not using "$this" should be declared static.
Loading history...
740 2
                        return fwrite($stream, $fd);
0 ignored issues
show
introduced by
Function fwrite() should not be referenced via a fallback global name, but via a use statement.
Loading history...
741
                    };
742
                }
743 2
            }
744
745 2
            if ($streamRW->isGzipHeader()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 2.
Loading history...
Coding Style introduced by
Blank line found at start of control structure
Loading history...
746 2
747
                if ($streamRW->isWrite()) {
0 ignored issues
show
introduced by
Expected 0 lines after "if", found 1.
Loading history...
748
                    $request->header('Content-Encoding', 'gzip');
749
                    $request->header('Content-Type', 'application/x-www-form-urlencoded');
750
                } else {
751
                    $request->header('Accept-Encoding', 'gzip');
752
                }
753
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
754
            }
755
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
756
757
            $request->header('Transfer-Encoding', 'chunked');
758
759
            if ($streamRW->isWrite()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 2.
Loading history...
760 1
                $request->setReadFunction($callable);
761
            } else {
762 1
                $request->setWriteFunction($callable);
763 1
764 1
//                $request->setHeaderFunction($callableHead);
765
            }
766
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
767
768
            $this->_curler->execOne($request);
769
            $response = new Statement($request);
770
            if ($response->isError()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
771
                $response->error();
772
            }
773
            return $response;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
774
        } finally {
775 1
            if ($streamRW->isWrite())
0 ignored issues
show
Coding Style Best Practice introduced by
It is generally a best practice to always use braces with control structures.

Adding braces to control structures avoids accidental mistakes as your code changes:

// Without braces (not recommended)
if (true)
    doSomething();

// Recommended
if (true) {
    doSomething();
}
Loading history...
776
                fclose($stream);
0 ignored issues
show
introduced by
Function fclose() should not be referenced via a fallback global name, but via a use statement.
Loading history...
777 1
        }
778 1
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
779 1
780
    }
0 ignored issues
show
Coding Style introduced by
Function closing brace must go on the next line following the body; found 2 blank lines before brace
Loading history...
Coding Style introduced by
Expected 1 blank line after function; 2 found
Loading history...
781
782
783
    /**
784
     * @param Stream $streamRead
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::streamRead() has useless @param annotation for parameter $streamRead.
Loading history...
Coding Style introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
785
     * @param string $sql
0 ignored issues
show
Coding Style introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
786
     * @param mixed[] $bindings
787
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::streamRead() has useless @return annotation.
Loading history...
788
     * @throws \ClickHouseDB\Exception\TransportException
0 ignored issues
show
introduced by
Class \ClickHouseDB\Exception\TransportException should not be referenced via a fully qualified name, but via a use statement.
Loading history...
789
     */
790
    public function streamRead(Stream $streamRead, $sql, $bindings = []): Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::streamRead() does not have native type hint for its parameter $sql but it should be possible to add it based on @param annotation "string".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::streamRead() does not have native type hint for its parameter $bindings but it should be possible to add it based on @param annotation "mixed[]".
Loading history...
791
    {
792
        $sql = $this->prepareQuery($sql, $bindings);
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 5 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
793
        $request = $this->getRequestRead($sql);
794
        return $this->streaming($streamRead, $request);
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
introduced by
Expected 0 lines after "return", found 1.
Loading history...
795
796
    }
0 ignored issues
show
Coding Style introduced by
Function closing brace must go on the next line following the body; found 1 blank lines before brace
Loading history...
797
798
    /**
799
     * @param Stream $streamWrite
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::streamWrite() has useless @param annotation for parameter $streamWrite.
Loading history...
Coding Style introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
800
     * @param string $sql
0 ignored issues
show
Coding Style introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
801
     * @param mixed[] $bindings
802
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::streamWrite() has useless @return annotation.
Loading history...
803
     * @throws \ClickHouseDB\Exception\TransportException
0 ignored issues
show
introduced by
Class \ClickHouseDB\Exception\TransportException should not be referenced via a fully qualified name, but via a use statement.
Loading history...
804
     */
805
    public function streamWrite(Stream $streamWrite, $sql, $bindings = []): Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::streamWrite() does not have native type hint for its parameter $sql but it should be possible to add it based on @param annotation "string".
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::streamWrite() does not have native type hint for its parameter $bindings but it should be possible to add it based on @param annotation "mixed[]".
Loading history...
806
    {
807
        $sql = $this->prepareQuery($sql, $bindings);
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 5 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
808
        $request = $this->writeStreamData($sql);
809
        return $this->streaming($streamWrite, $request);
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
810
    }
811
812
    public function __destruct()
813
    {
814
        if ($this->handle) {
0 ignored issues
show
introduced by
Use early exit to reduce code nesting.
Loading history...
815
            curl_close($this->handle);
0 ignored issues
show
introduced by
Function curl_close() should not be referenced via a fallback global name, but via a use statement.
Loading history...
816
        }
817
    }
818
819
    public function setHandle()
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setHandle() does not have void return type hint.
Loading history...
820
    {
821
        $this->handle = curl_init();
0 ignored issues
show
Documentation Bug introduced by
It seems like curl_init() can also be of type CurlHandle. However, the property $handle is declared as type null|resource. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
introduced by
Function curl_init() should not be referenced via a fallback global name, but via a use statement.
Loading history...
822
    }
0 ignored issues
show
Coding Style introduced by
Expected 0 blank lines after function; 1 found
Loading history...
823
824
}
0 ignored issues
show
introduced by
There must be exactly 0 empty lines before class closing brace.
Loading history...
825