Http::getRequestRead()   C
last analyzed

Complexity

Conditions 13
Paths 128

Size

Total Lines 62
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 22
CRAP Score 13.0976

Importance

Changes 7
Bugs 0 Features 1
Metric Value
cc 13
eloc 25
c 7
b 0
f 1
nc 128
nop 3
dl 0
loc 62
ccs 22
cts 24
cp 0.9167
crap 13.0976
rs 6.3833

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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
     * Http constructor.
0 ignored issues
show
introduced by
Documentation comment contains forbidden comment "Http constructor.".
Loading history...
100
     * @param string $host
0 ignored issues
show
introduced by
Expected 1 lines between description and annotations, found 0.
Loading history...
101
     * @param int $port
0 ignored issues
show
Coding Style introduced by
Expected 4 spaces after parameter type; 1 found
Loading history...
102 68
     * @param string $username
103
     * @param string $password
104 68
     * @param int $authMethod
0 ignored issues
show
Coding Style introduced by
Expected 4 spaces after parameter type; 1 found
Loading history...
105
     */
106 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...
Coding Style introduced by
Expected 1 blank line before function; 0 found
Loading history...
107 68
    {
108 68
        $this->setHost($host, $port);
109
110
        $this->_username = $username;
111
        $this->_password = $password;
112 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...
113
            $this->_authMethod = $authMethod;
114 68
        }
115 68
116
        $this->_settings = new Settings();
117
118 68
        $this->setCurler();
119
    }
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line after function; 2 found
Loading history...
120 68
121 68
122
    public function setCurler() : void
0 ignored issues
show
introduced by
There must be no whitespace between closing parenthesis and return type colon.
Loading history...
123
    {
124
        $this->_curler = new CurlerRolling();
125
    }
126
127
    /**
128
     * @param CurlerRolling $curler
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setDirtyCurler() has useless @param annotation for parameter $curler.
Loading history...
129
     */
130
    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...
131
    {
132
        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...
133
            $this->_curler = $curler;
134
        }
135
    }
136
137
    /**
138
     * @return CurlerRolling
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getCurler() has useless @return annotation.
Loading history...
139
     */
140
    public function getCurler(): ?CurlerRolling
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getCurler() does not need documentation comment.
Loading history...
141
    {
142
        return $this->_curler;
143
    }
144
145 68
    /**
146
     * @param string $host
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setHost() has useless @param annotation for parameter $host.
Loading history...
147 68
     * @param int $port
0 ignored issues
show
Coding Style introduced by
Expected 4 spaces after parameter type; 1 found
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::setHost() has useless @param annotation for parameter $port.
Loading history...
148 68
     */
149
    public function setHost(string $host, int $port = -1) : void
0 ignored issues
show
introduced by
There must be no whitespace between closing parenthesis and return type colon.
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::setHost() does not need documentation comment.
Loading history...
150
    {
151 68
        if ($port > 0) {
152 68
            $this->_port = $port;
153
        }
154
155
        $this->_host = $host;
156
    }
157
158
    /**
159
     * Sets client SSL certificate for Yandex Cloud
160
     *
161
     * @param string $caPath
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setSslCa() has useless @param annotation for parameter $caPath.
Loading history...
162
     */
163
    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...
164
    {
165
        $this->sslCA = $caPath;
166
    }
167 55
168
    /**
169 55
     * @return string
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getUri() has useless @return annotation.
Loading history...
170 55
     */
171 1
    public function getUri(): string
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getUri() does not need documentation comment.
Loading history...
172
    {
173 55
        $proto = 'http';
174 55
        if ($this->settings()->isHttps()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
175 1
            $proto = 'https';
176
        }
177 55
        $uri = $proto . '://' . $this->_host;
178 55
        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...
179
            return $uri;
180 1
        }
181
        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...
182
            return $uri . ':' . $this->_port;
183
        }
184
        return $uri;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
185
    }
186 68
187
    /**
188 68
     * @return Settings
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::settings() has useless @return annotation.
Loading history...
189
     */
190
    public function settings(): Settings
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::settings() does not need documentation comment.
Loading history...
191
    {
192
        return $this->_settings;
193
    }
194
195
    /**
196
     * @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...
197
     * @return bool
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::verbose() has useless @return annotation.
Loading history...
198
     */
199
    public function verbose(bool $flag): bool
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::verbose() does not need documentation comment.
Loading history...
200
    {
201
        $this->_verbose = $flag;
202
        return $flag;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
203
    }
204
205 45
    /**
206
     * @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...
207 45
     * @return string
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getUrl() has useless @return annotation.
Loading history...
208
     */
209 45
    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...
210 45
    {
211
        $settings = $this->settings()->getSettings();
212
213
        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...
214 45
            $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...
215
        }
216
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
217
218
        if ($this->settings()->isReadOnlyUser()) {
219
            unset($settings['extremes']);
220
            unset($settings['readonly']);
221
            unset($settings['enable_http_compression']);
222 45
            unset($settings['max_execution_time']);
223
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
224
        }
225 45
226
        unset($settings['https']);
227
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
228
229
        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...
230
    }
231
232 45
    /**
233
     * @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...
234 45
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::newRequest() has useless @return annotation.
Loading history...
235
     */
236 45
    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...
237 45
    {
238
        $new = new CurlerRequest();
239
240
        switch ($this->_authMethod) {
241
            case self::AUTH_METHOD_QUERY_STRING:
242
                /* @todo: Move this implementation to CurlerRequest class. Possible options: the authentication method
243
                 *        should be applied in method `CurlerRequest:prepareRequest()`.
244 45
                 */
245
                $this->settings()->set('user', $this->_username);
246
                $this->settings()->set('password', $this->_password);
247
                break;
248
            case self::AUTH_METHOD_BASIC_AUTH:
249 45
                $new->authByBasicAuth($this->_username, $this->_password);
250 45
                break;
251
            default:
252
                // Auth with headers by default
253 45
                $new->authByHeaders($this->_username, $this->_password);
254
                break;
255 45
        }
256 45
257
        $new->POST()->setRequestExtendedInfo($extendinfo);
258 45
259 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

259
        $new->httpCompression(/** @scrutinizer ignore-type */ $this->settings()->isEnableHttpCompression());
Loading history...
260
261 45
        if ($this->settings()->getSessionId()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
262
            $new->persistent();
263
        }
264
        if ($this->sslCA) {
265 45
            $new->setSslCa($this->sslCA);
266 45
        }
267 45
268
        $new->timeOut($this->settings()->getTimeOut());
269 45
        $new->connectTimeOut($this->_connectTimeOut);//->keepAlive(); // one sec
270
        $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...
271
272
        return $new;
273
    }
274
275
    /**
276
     * @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...
277
     * @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...
278
     * @param bool $query_as_string
0 ignored issues
show
Coding Style introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
introduced by
Method \ClickHouseDB\Transport\Http::makeRequest() has useless @param annotation for parameter $query_as_string.
Loading history...
279 45
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::makeRequest() has useless @return annotation.
Loading history...
280
     * @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...
281 45
     */
282
    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...
283 45
    {
284 1
        $sql = $query->toSql();
285
286
        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...
287
            $urlParams['query'] = $sql;
288 45
        }
289 45
290 45
        $extendInfo = [
291
            'sql' => $sql,
292
            'query' => $query,
293 45
            'format' => $query->getFormat()
0 ignored issues
show
introduced by
Multi-line arrays must have a trailing comma after the last element.
Loading history...
294
        ];
295
296
        $new = $this->newRequest($extendInfo);
297
298
        /*
299 45
         * Build URL after request making, since URL may contain auth data. This will not matter after the
300 45
         * implantation of the todo in the `HTTP:newRequest()` method.
301
         */
302
303 45
        if ($query->isUseInUrlBindingsParams()) {
304 45
            $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...
305
        }
306 45
307 45
        $url = $this->getUrl($urlParams);
308
        $new->url($url);
309
310 45
        if (!$query_as_string) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
Coding Style introduced by
The variable $query_as_string should be in camel caps format.
Loading history...
Coding Style introduced by
Expected 1 space after NOT operator; 0 found
Loading history...
311
            $new->parameters_json($sql);
312
        }
313
        $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

313
        $new->httpCompression(/** @scrutinizer ignore-type */ $this->settings()->isEnableHttpCompression());
Loading history...
314
315
        return $new;
316
    }
317 3
318
    /**
319
     * @param resource $stream
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
320 3
     * @return void
321 1
     */
322
    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...
323 2
    {
324
        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...
325
            $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...
326
        }
327 3
328 3
    }
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...
329 3
330
    /**
331
     * @param string|Query $sql
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
332 3
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::writeStreamData() has useless @return annotation.
Loading history...
333
     */
334
    public function writeStreamData($sql): CurlerRequest
335
    {
0 ignored issues
show
Coding Style introduced by
Expected 0 blank lines after opening function brace; 1 found
Loading history...
336
337
        if ($sql instanceof Query) {
338 3
            $query = $sql;
339 3
        } else {
340 3
            $query = new Query($sql);
341
        }
342
343 3
        $extendInfo = [
344 3
            'sql' => $sql,
345
            'query' => $query,
346
            'format' => $query->getFormat()
0 ignored issues
show
introduced by
Multi-line arrays must have a trailing comma after the last element.
Loading history...
347
        ];
348
349
        $request = $this->newRequest($extendInfo);
350
351
        /*
352
         * Build URL after request making, since URL may contain auth data. This will not matter after the
353
         * implantation of the todo in the `HTTP:newRequest()` method.
354 8
         */
355
        $url = $this->getUrl([
356 8
            'readonly' => 0,
357
            'query' => $query->toSql()
0 ignored issues
show
introduced by
Multi-line arrays must have a trailing comma after the last element.
Loading history...
358
        ]);
359 8
360 8
        $request->url($url);
361 8
        return $request;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
362
    }
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line after function; 2 found
Loading history...
363
364 8
365
    /**
366
     * @param string $sql
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
367
     * @param string $file_name
368
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::writeAsyncCSV() has useless @return annotation.
Loading history...
369
     * @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...
370 8
     */
371 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...
372 8
    {
373
        $query = new Query($sql);
374
375 8
        $extendinfo = [
376
            'sql' => $sql,
377 8
            'query' => $query,
378 8
            'format' => $query->getFormat()
0 ignored issues
show
introduced by
Multi-line arrays must have a trailing comma after the last element.
Loading history...
379 8
        ];
380 8
381
        $request = $this->newRequest($extendinfo);
382 8
383
        /*
384 8
         * Build URL after request making, since URL may contain auth data. This will not matter after the
385 8
         * implantation of the todo in the `HTTP:newRequest()` method.
386
         */
387 8
        $url = $this->getUrl([
388
            'readonly' => 0,
389
            'query' => $query->toSql()
0 ignored issues
show
introduced by
Multi-line arrays must have a trailing comma after the last element.
Loading history...
390
        ]);
391
392
        $request->url($url);
393
394
        $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...
395 12
            $handle = $request->getInfileHandle();
396
            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...
397 12
                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...
398
            }
399
        });
400
401
        $request->setInfile($file_name);
0 ignored issues
show
Coding Style introduced by
The variable $file_name should be in camel caps format.
Loading history...
402
        $this->_curler->addQueLoop($request);
403
404
        return new Statement($request);
405 2
    }
406
407 2
    /**
408 2
     * get Count Pending Query in Queue
409
     *
410
     * @return int
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getCountPendingQueue() has useless @return annotation.
Loading history...
411
     */
412
    public function getCountPendingQueue(): int
413
    {
414
        return $this->_curler->countPending();
415 38
    }
416
417 38
    /**
418
     * set Connect TimeOut in seconds [CURLOPT_CONNECTTIMEOUT] ( int )
419
     *
420
     * @param float $connectTimeOut
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setConnectTimeOut() has useless @param annotation for parameter $connectTimeOut.
Loading history...
421 1
     */
422
    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...
423 1
    {
424
        $this->_connectTimeOut = $connectTimeOut;
425
    }
426 1
427 1
    /**
428 1
     * get ConnectTimeOut in seconds
429 1
     *
430
     * @return float
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getConnectTimeOut() has useless @return annotation.
Loading history...
431
     */
432
    public function getConnectTimeOut(): float
433 1
    {
434 1
        return $this->_connectTimeOut;
435
    }
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line after function; 2 found
Loading history...
436
437
438 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...
439 1
    {
440
        $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...
441
442
        // Search X-ClickHouse-Progress
443 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...
444 1
            $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...
445
            $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...
446 1
            if (!$header_size) {
0 ignored issues
show
Coding Style introduced by
The variable $header_size should be in camel caps format.
Loading history...
Coding Style introduced by
Expected 1 space after NOT operator; 0 found
Loading history...
447
                return false;
448 1
            }
449
450
            $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...
451 1
            if (!$header) {
0 ignored issues
show
Coding Style introduced by
Expected 1 space after NOT operator; 0 found
Loading history...
452
                return false;
453
            }
454
455
            $match = [];
456
            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...
457
                $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...
458 1
                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...
459
460
                    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...
461
                        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...
462
                    } else {
463
                        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...
464
                    }
465
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
466
                }
467
            }
468 40
        }
469
        return false;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
470 40
    }
471 40
472
    /**
473 40
     * @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...
474
     * @param null|WhereInFile $whereInFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WhereInFile".
Loading history...
475 1
     * @param null|WriteToFile $writeToFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WriteToFile".
Loading history...
476
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getRequestRead() has useless @return annotation.
Loading history...
477 1
     * @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...
478 1
     */
479
    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...
480
    {
481
        $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...
482 40
        $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...
483 1
        // ---------------------------------------------------------------------------------
484 1
        if ($whereInFile instanceof WhereInFile && $whereInFile->size()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
485
            // $request = $this->prepareSelectWhereIn($request, $whereInFile);
486
            $structure = $whereInFile->fetchUrlParams();
487
            // $structure = [];
488 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...
489
            $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...
490
        }
491 40
        // ---------------------------------------------------------------------------------
492 1
        // if result to file
493
        if ($writeToFile instanceof WriteToFile && $writeToFile->fetchFormat()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
494
            $query->setFormat($writeToFile->fetchFormat());
495
            unset($urlParams['extremes']);
496 40
        }
497
        // ---------------------------------------------------------------------------------
498 1
        // makeRequest read
499 1
        $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...
500
        // ---------------------------------------------------------------------------------
501 1
        // attach files
502
        if ($whereInFile instanceof WhereInFile && $whereInFile->size()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
503 1
            $request->attachFiles($whereInFile->fetchFiles());
504
        }
505
        // ---------------------------------------------------------------------------------
506
        // result to file
507
        if ($writeToFile instanceof WriteToFile && $writeToFile->fetchFormat()) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
508
509
            $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...
510
            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...
511
512
                $isGz = $writeToFile->getGzip();
513
514
                if ($isGz) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 2.
Loading history...
515
                    // write gzip header
516 1
                    // "\x1f\x8b\x08\x00\x00\x00\x00\x00"
517
                    // fwrite($fout, "\x1F\x8B\x08\x08".pack("V", time())."\0\xFF", 10);
518 1
                    // write the original file name
519
                    // $oname = str_replace("\0", "", basename($writeToFile->fetchFile()));
520
                    // fwrite($fout, $oname."\0", 1+strlen($oname));
521 40
522 1
                    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...
523
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
524
                }
525 40
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
526
527
                $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...
528
                    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...
529 1
                });
530
            }
531 1
        }
532 1
533
        if ($this->stdErrOut) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
534
            $request->setStdErrOut($this->stdErrOut);
535 68
        }
536
        if ($this->xClickHouseProgress) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
537 68
            $request->setFunctionProgress([$this, '__findXClickHouseProgress']);
538 68
        }
539
        // ---------------------------------------------------------------------------------
540
        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...
541
542
    }
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...
543
544
    public function cleanQueryDegeneration(): bool
545
    {
546 27
        $this->_query_degenerations = [];
0 ignored issues
show
Coding Style introduced by
Member variable "_query_degenerations" is not in valid camel caps format
Loading history...
547
        return true;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
548 27
    }
549 27
550
    public function addQueryDegeneration(Degeneration $degeneration): bool
551
    {
552
        $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...
553
        return true;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
554
    }
555 38
556
    /**
557 38
     * @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...
558 38
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::getRequestWrite() has useless @return annotation.
Loading history...
559 38
     * @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...
560
     */
561 38
    public function getRequestWrite(Query $query): CurlerRequest
562
    {
563
        $urlParams = ['readonly' => 0];
564
        return $this->makeRequest($query, $urlParams);
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
565
    }
566
567
    /**
568
     * @throws TransportException
569 46
     */
570
    public function ping(): bool
571
    {
572
        $request = new CurlerRequest();
573 46
        $request->url($this->getUri())->verbose(false)->GET()->connectTimeOut($this->getConnectTimeOut());
574 46
        $this->_curler->execOne($request);
575
576
        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...
577 46
    }
578
579
    /**
580
     * @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...
581
     * @param mixed[] $bindings
582
     * @return Query
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::prepareQuery() has useless @return annotation.
Loading history...
583
     */
584
    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...
585
    {
0 ignored issues
show
Coding Style introduced by
Expected 0 blank lines after opening function brace; 1 found
Loading history...
586
587
        // add Degeneration query
588
        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...
589 39
            $degeneration->bindParams($bindings);
590
        }
591 39
592
        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...
593
    }
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line after function; 2 found
Loading history...
594 39
595 39
596 39
    /**
597
     * @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...
598
     * @param mixed[] $bindings
0 ignored issues
show
Coding Style introduced by
Expected 10 spaces after parameter type; 1 found
Loading history...
599
     * @param null|WhereInFile $whereInFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WhereInFile".
Loading history...
600
     * @param null|WriteToFile $writeToFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WriteToFile".
Loading history...
601
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::prepareSelect() has useless @return annotation.
Loading history...
602
     * @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...
603
     */
604
    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...
605
    {
606 28
        if ($sql instanceof Query) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
607
            return $this->getRequestWrite($sql);
608 28
        }
609
        $query = $this->prepareQuery($sql, $bindings);
610
        $query->setFormat('JSON');
611
        return $this->getRequestRead($query, $whereInFile, $writeToFile);
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
612 28
    }
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line after function; 2 found
Loading history...
613 27
614
615
    /**
616
     * @param Query|string $sql
0 ignored issues
show
introduced by
Incorrect annotations group.
Loading history...
617
     * @param mixed[] $bindings
0 ignored issues
show
Coding Style introduced by
Expected 6 spaces after parameter type; 1 found
Loading history...
618
     * @return CurlerRequest
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::prepareWrite() has useless @return annotation.
Loading history...
619
     * @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...
620 10
     */
621
    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...
622 10
    {
623
        if ($sql instanceof Query) {
624
            return $this->getRequestWrite($sql);
625
        }
626
627
        $query = $this->prepareQuery($sql, $bindings);
628
629
        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...
630
            return $this->getRequestWrite($query);
631
        }
632
633
        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...
634 32
            $query->setFormat('JSON');
635
        }
636 32
637 32
        return $this->getRequestWrite($query);
638 32
    }
639
640
    /**
641
     * @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...
642
     * @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...
643
     */
644
    public function executeAsync(): bool
645
    {
646
        return $this->_curler->execLoopWait();
647
    }
648
649
    /**
650 7
     * @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...
651
     * @param mixed[] $bindings
0 ignored issues
show
Coding Style introduced by
Expected 10 spaces after parameter type; 1 found
Loading history...
652 7
     * @param null|WhereInFile $whereInFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WhereInFile".
Loading history...
653 7
     * @param null|WriteToFile $writeToFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WriteToFile".
Loading history...
654 7
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::select() has useless @return annotation.
Loading history...
655
     * @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...
656
     * @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...
657
     */
658
    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...
659
    {
660 1
        $request = $this->prepareSelect($sql, $bindings, $whereInFile, $writeToFile);
661
        $this->_curler->execOne($request);
662 1
        return new Statement($request);
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
663 1
    }
664
665
    /**
666
     * @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...
667
     * @param mixed[] $bindings
0 ignored issues
show
Coding Style introduced by
Expected 10 spaces after parameter type; 1 found
Loading history...
668
     * @param null|WhereInFile $whereInFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WhereInFile".
Loading history...
669
     * @param null|WriteToFile $writeToFile
0 ignored issues
show
introduced by
Null type hint should be on last position in "null|WriteToFile".
Loading history...
670
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::selectAsync() has useless @return annotation.
Loading history...
671
     * @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...
672 28
     * @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...
673
     */
674 28
    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...
675 27
    {
676 27
        $request = $this->prepareSelect($sql, $bindings, $whereInFile, $writeToFile);
677 27
        $this->_curler->addQueLoop($request);
678 27
        return new Statement($request);
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
679 3
    }
680
681
    /**
682 25
     * @param callable $callback
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::setProgressFunction() has useless @param annotation for parameter $callback.
Loading history...
683
     */
684
    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...
685
    {
686
        $this->xClickHouseProgress = $callback;
687
    }
688
689
    /**
690
     * @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...
691 2
     * @param mixed[] $bindings
692
     * @param bool $exception
0 ignored issues
show
Coding Style introduced by
Expected 4 spaces after parameter type; 1 found
Loading history...
693 2
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::write() has useless @return annotation.
Loading history...
694 2
     * @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...
695
     */
696
    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...
697
    {
698
        $request = $this->prepareWrite($sql, $bindings);
699
        $this->_curler->execOne($request);
700 2
        $response = new Statement($request);
701
        if ($exception) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
702
            if ($response->isError()) {
703
                $response->error();
704
            }
705
        }
706
        return $response;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
707
    }
708
709
    /**
710
     * @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...
711
     * @param CurlerRequest $request
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::streaming() has useless @param annotation for parameter $request.
Loading history...
712
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::streaming() has useless @return annotation.
Loading history...
713 2
     * @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...
714
     */
715 1
    private function streaming(Stream $streamRW, CurlerRequest $request): Statement
716 1
    {
717 1
        $callable = $streamRW->getClosure();
718
        $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...
719
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
720
721
        try {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
introduced by
Expected 0 lines after "try", found 2.
Loading history...
722
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
723
724
            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...
725 2
                if ($streamRW->isWrite()) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
726
727
                    $callable = function ($ch, $fd, $length) use ($stream) {
0 ignored issues
show
introduced by
Closure not using "$this" should be declared static.
Loading history...
728 2
                        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...
729 1
                    };
730
                } else {
731 1
                    $callable = function ($ch, $fd) use ($stream) {
0 ignored issues
show
introduced by
Closure not using "$this" should be declared static.
Loading history...
732
                        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...
733
                    };
734
                }
735
            }
736
737
            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...
738 2
739 2
                if ($streamRW->isWrite()) {
0 ignored issues
show
introduced by
Expected 0 lines after "if", found 1.
Loading history...
740 2
                    $request->header('Content-Encoding', 'gzip');
741
                    $request->header('Content-Type', 'application/x-www-form-urlencoded');
742
                } else {
743 2
                    $request->header('Accept-Encoding', 'gzip');
744
                }
745 2
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
746 2
            }
747
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
748
749
            $request->header('Transfer-Encoding', 'chunked');
750
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
751
752
            if ($streamRW->isWrite()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 2.
Loading history...
753
                $request->setReadFunction($callable);
754
            } else {
755
                $request->setWriteFunction($callable);
756
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
757
758
//                $request->setHeaderFunction($callableHead);
759
            }
760 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...
761
762 1
            $this->_curler->execOne($request, true);
763 1
            $response = new Statement($request);
764 1
            if ($response->isError()) {
0 ignored issues
show
introduced by
Expected 1 lines after "if", found 0.
Loading history...
765
                $response->error();
766
            }
767
            return $response;
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
768
        } finally {
769
            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...
770
                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...
771
        }
772
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
773
774
    }
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...
775 1
776
777 1
    /**
778 1
     * @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...
779 1
     * @param string $sql
0 ignored issues
show
Coding Style introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
780
     * @param mixed[] $bindings
781
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::streamRead() has useless @return annotation.
Loading history...
782
     * @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...
783
     */
784
    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...
785
    {
786
        $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...
787
        $request = $this->getRequestRead($sql);
788
        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...
789
790
    }
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...
791
792
    /**
793
     * @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...
794
     * @param string $sql
0 ignored issues
show
Coding Style introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
795
     * @param mixed[] $bindings
796
     * @return Statement
0 ignored issues
show
introduced by
Method \ClickHouseDB\Transport\Http::streamWrite() has useless @return annotation.
Loading history...
797
     * @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...
798
     */
799
    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...
800
    {
801
        $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...
802
        $request = $this->writeStreamData($sql);
803
        return $this->streaming($streamWrite, $request);
0 ignored issues
show
introduced by
Expected 1 lines before "return", found 0.
Loading history...
804
    }
805
}
806