Passed
Branch master (366c16)
by William
03:30
created

CLI   A

Complexity

Total Complexity 38

Size/Duplication

Total Lines 243
Duplicated Lines 0 %

Test Coverage

Coverage 97.74%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
eloc 128
c 3
b 0
f 0
dl 0
loc 243
rs 9.36
ccs 130
cts 133
cp 0.9774
wmc 38

12 Methods

Rating   Name   Duplication   Size   Complexity  
A usageTokenize() 0 4 1
B runTokenize() 0 46 8
B runHighlight() 0 38 7
B runLint() 0 47 9
A parseLint() 0 15 1
A parseHighlight() 0 28 4
A getopt() 0 3 1
A readStdin() 0 8 1
A mergeLongOpts() 0 6 3
A usageLint() 0 4 1
A parseTokenize() 0 14 1
A usageHighlight() 0 4 1
1
<?php
2
/**
3
 * CLI interface.
4
 */
5
6
declare(strict_types=1);
7
8
namespace PhpMyAdmin\SqlParser\Utils;
9
10
use PhpMyAdmin\SqlParser\Context;
11
use PhpMyAdmin\SqlParser\Lexer;
12
use PhpMyAdmin\SqlParser\Parser;
13
use function count;
14
use function getopt;
15
use function implode;
16
use function in_array;
17
use function rtrim;
18
use function stream_get_contents;
19
use function stream_set_blocking;
20
use function var_export;
21
use const STDIN;
22
23
/**
24
 * CLI interface.
25
 */
26
class CLI
27
{
28 140
    public function mergeLongOpts(&$params, &$longopts)
29
    {
30 140
        foreach ($longopts as $value) {
31 140
            $value = rtrim($value, ':');
32 140
            if (isset($params[$value])) {
33 44
                $params[$value[0]] = $params[$value];
34
            }
35
        }
36 140
    }
37
38 16
    public function usageHighlight()
39
    {
40 16
        echo "Usage: highlight-query --query SQL [--format html|cli|text] [--ansi]\n";
41 16
        echo "       cat file.sql | highlight-query\n";
42 16
    }
43
44 4
    public function getopt($opt, $long)
45
    {
46 4
        return getopt($opt, $long);
47
    }
48
49 60
    public function parseHighlight()
50
    {
51
        $longopts = [
52 60
            'help',
53
            'query:',
54
            'format:',
55
            'ansi',
56
        ];
57 60
        $params = $this->getopt(
58 60
            'hq:f:a',
59 30
            $longopts
60
        );
61 60
        if ($params === false) {
62 8
            return false;
63
        }
64
65 52
        $this->mergeLongOpts($params, $longopts);
66 52
        if (! isset($params['f'])) {
67 28
            $params['f'] = 'cli';
68
        }
69
70 52
        if (! in_array($params['f'], ['html', 'cli', 'text'])) {
71 8
            echo "ERROR: Invalid value for format!\n";
72
73 8
            return false;
74
        }
75
76 44
        return $params;
77
    }
78
79 60
    public function runHighlight()
80
    {
81 60
        $params = $this->parseHighlight();
82 60
        if ($params === false) {
83 16
            return 1;
84
        }
85
86 44
        if (isset($params['h'])) {
87 8
            $this->usageHighlight();
88
89 8
            return 0;
90
        }
91
92 36
        if (! isset($params['q'])) {
93 20
            $stdIn = $this->readStdin();
94
95 20
            if ($stdIn) {
96 12
                $params['q'] = $stdIn;
97
            }
98
        }
99
100 36
        if (isset($params['a'])) {
101
            Context::setMode('ANSI_QUOTES');
102
        }
103 36
        if (isset($params['q'])) {
104 28
            echo Formatter::format(
105 28
                $params['q'],
106 28
                ['type' => $params['f']]
107
            );
108 28
            echo "\n";
109
110 28
            return 0;
111
        }
112
113 8
        echo "ERROR: Missing parameters!\n";
114 8
        $this->usageHighlight();
115
116 8
        return 1;
117
    }
118
119 16
    public function usageLint()
120
    {
121 16
        echo "Usage: lint-query --query SQL [--ansi]\n";
122 16
        echo "       cat file.sql | lint-query\n";
123 16
    }
124
125 52
    public function parseLint()
126
    {
127
        $longopts = [
128 52
            'help',
129
            'query:',
130
            'context:',
131
            'ansi',
132
        ];
133 52
        $params = $this->getopt(
134 52
            'hq:c:a',
135 26
            $longopts
136
        );
137 52
        $this->mergeLongOpts($params, $longopts);
138
139 52
        return $params;
140
    }
141
142 52
    public function runLint()
143
    {
144 52
        $params = $this->parseLint();
145 52
        if ($params === false) {
146 8
            return 1;
147
        }
148
149 44
        if (isset($params['h'])) {
150 8
            $this->usageLint();
151
152 8
            return 0;
153
        }
154
155 36
        if (isset($params['c'])) {
156 8
            Context::load($params['c']);
157
        }
158
159 36
        if (! isset($params['q'])) {
160 20
            $stdIn = $this->readStdin();
161
162 20
            if ($stdIn) {
163 12
                $params['q'] = $stdIn;
164
            }
165
        }
166 36
        if (isset($params['a'])) {
167
            Context::setMode('ANSI_QUOTES');
168
        }
169
170 36
        if (isset($params['q'])) {
171 28
            $lexer = new Lexer($params['q'], false);
172 28
            $parser = new Parser($lexer->list);
173 28
            $errors = Error::get([$lexer, $parser]);
174 28
            if (count($errors) === 0) {
175 12
                return 0;
176
            }
177
178 16
            $output = Error::format($errors);
179 16
            echo implode("\n", $output);
180 16
            echo "\n";
181
182 16
            return 10;
183
        }
184
185 8
        echo "ERROR: Missing parameters!\n";
186 8
        $this->usageLint();
187
188 8
        return 1;
189
    }
190
191 16
    public function usageTokenize()
192
    {
193 16
        echo "Usage: tokenize-query --query SQL [--ansi]\n";
194 16
        echo "       cat file.sql | tokenize-query\n";
195 16
    }
196
197 36
    public function parseTokenize()
198
    {
199
        $longopts = [
200 36
            'help',
201
            'query:',
202
            'ansi',
203
        ];
204 36
        $params = $this->getopt(
205 36
            'hq:a',
206 18
            $longopts
207
        );
208 36
        $this->mergeLongOpts($params, $longopts);
209
210 36
        return $params;
211
    }
212
213 36
    public function runTokenize()
214
    {
215 36
        $params = $this->parseTokenize();
216 36
        if ($params === false) {
217 8
            return 1;
218
        }
219
220 28
        if (isset($params['h'])) {
221 8
            $this->usageTokenize();
222
223 8
            return 0;
224
        }
225
226 20
        if (! isset($params['q'])) {
227 12
            $stdIn = $this->readStdin();
228
229 12
            if ($stdIn) {
230 4
                $params['q'] = $stdIn;
231
            }
232
        }
233
234 20
        if (isset($params['a'])) {
235
            Context::setMode('ANSI_QUOTES');
236
        }
237 20
        if (isset($params['q'])) {
238 12
            $lexer = new Lexer($params['q'], false);
239 12
            foreach ($lexer->list->tokens as $idx => $token) {
240 12
                echo '[TOKEN ', $idx, "]\n";
241 12
                echo 'Type = ', $token->type, "\n";
242 12
                echo 'Flags = ', $token->flags, "\n";
243 12
                echo 'Value = ';
244 12
                var_export($token->value);
245 12
                echo "\n";
246 12
                echo 'Token = ';
247 12
                var_export($token->token);
248 12
                echo "\n";
249 12
                echo "\n";
250
            }
251
252 12
            return 0;
253
        }
254
255 8
        echo "ERROR: Missing parameters!\n";
256 8
        $this->usageTokenize();
257
258 8
        return 1;
259
    }
260
261 12
    public function readStdin()
262
    {
263 12
        stream_set_blocking(STDIN, false);
264 12
        $stdin = stream_get_contents(STDIN);
265
        // restore-default block-mode setting
266 12
        stream_set_blocking(STDIN, true);
267
268 12
        return $stdin;
269
    }
270
}
271