Completed
Push — master ( aa806b...35216b )
by Daniel
02:36
created

MySQLiByDanielGPqueries::sQueryMySqlTables()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 18
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 18
rs 9.4285
cc 1
eloc 16
nc 1
nop 1
1
<?php
2
3
/**
4
 *
5
 * The MIT License (MIT)
6
 *
7
 * Copyright (c) 2015 Daniel Popiniuc
8
 *
9
 * Permission is hereby granted, free of charge, to any person obtaining a copy
10
 * of this software and associated documentation files (the "Software"), to deal
11
 * in the Software without restriction, including without limitation the rights
12
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
 * copies of the Software, and to permit persons to whom the Software is
14
 * furnished to do so, subject to the following conditions:
15
 *
16
 * The above copyright notice and this permission notice shall be included in all
17
 * copies or substantial portions of the Software.
18
 *
19
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
 * SOFTWARE.
26
 *
27
 */
28
29
namespace danielgp\common_lib;
30
31
/**
32
 * Queries for the MySQL module
33
 *
34
 * @author Daniel Popiniuc
35
 */
36
trait MySQLiByDanielGPqueries
37
{
38
39
    private function sCleanParameters(&$parameters)
40
    {
41
        if (is_array($parameters)) {
42
            $tmpArray = [];
43
            foreach ($parameters as &$value) {
44
                $tmpArray[] = filter_var($value, FILTER_SANITIZE_STRING);
45
            }
46
            $parameters = $tmpArray;
47
        } else {
48
            $parameters = filter_var($parameters, FILTER_SANITIZE_STRING);
49
        }
50
    }
51
52
    /**
53
     * Internal function to manage concatenation for filters
54
     *
55
     * @param type $filterValue
56
     * @return string
57
     */
58
    private function sGlueFilterValueIntoWhereString($filterValue)
59
    {
60
        if (is_array($filterValue)) {
61
            return 'IN ("' . implode('", "', $filterValue) . '")';
62
        }
63
        return $this->sGlueFilterValueIntoWhereStringFinal($filterValue);
64
    }
65
66
    private function sGlueFilterValueIntoWhereStringFinal($filterValue)
67
    {
68
        $kFields = [
69
            'CONNECTION_ID()|CURDATE()|CURRENT_USER|CURRENT_USER()|CURRENT_DATETIME|DATABASE()|NOW()|USER()',
70
            'IS NULL|IS NOT NULL',
71
            'NOT NULL|NULL',
72
        ];
73
        if (in_array($filterValue, explode('|', $kFields[0]))) {
74
            return '= ' . $filterValue;
75
        } elseif (in_array($filterValue, explode('|', $kFields[1]))) {
76
            return $filterValue;
77
        } elseif (in_array($filterValue, explode('|', $kFields[2]))) {
78
            return 'IS ' . $filterValue;
79
        }
80
        return '= "' . $filterValue . '"';
81
    }
82
83
    /**
84
     * Internal function to concatenate filters
85
     *
86
     * @param array $filters
87
     * @return type
88
     */
89
    private function sGlueFiltersIntoWhereArrayFilter($filters)
90
    {
91
        return '(' . implode(') AND (', $filters) . ')';
92
    }
93
94
    /**
95
     * Internal function to manage the filters passed to the query
96
     *
97
     * @param array $filterArray
98
     * @param string $tableToApplyFilterTo
99
     * @return string
100
     */
101
    private function sManageDynamicFilters($filterArray = null, $tableToApplyFilterTo = '')
102
    {
103
        $filters = [];
104
        if (!is_null($filterArray) && is_array($filterArray)) {
105
            foreach ($filterArray as $key => $value) {
106
                $filters[] = '`' . $tableToApplyFilterTo . '`.`' . $key . '` '
107
                        . $this->sGlueFilterValueIntoWhereString($value);
108
            }
109
        }
110
        return $this->sManageDynamicFiltersFinal($filters);
111
    }
112
113
    private function sManageDynamicFiltersFinal($filters)
114
    {
115
        if (count($filters) > 0) {
116
            $sReturn = ['WHERE', $this->sGlueFiltersIntoWhereArrayFilter($filters)];
117
            return implode(' ', $sReturn) . ' ';
118
        }
119
        return '';
120
    }
121
122
    /**
123
     * Query to list Databases
124
     *
125
     * @param type $excludeSystemDbs
126
     * @return type
127
     */
128
    protected function sQueryMySqlActiveDatabases($excludeSystemDbs = true)
129
    {
130
        $sDBs = 'WHERE `SCHEMA_NAME` NOT IN ("'
131
                . implode('", "', ['information_schema', 'mysql', 'performance_schema', 'sys']) . '") ';
132
        return 'SELECT '
133
                . '`SCHEMA_NAME` As `Db`, '
134
                . '`DEFAULT_CHARACTER_SET_NAME` AS `DbCharset`, '
135
                . '`DEFAULT_COLLATION_NAME` AS `DbCollation` '
136
                . 'FROM `information_schema`.`SCHEMATA` '
137
                . ($excludeSystemDbs ? $sDBs : '')
138
                . 'GROUP BY `SCHEMA_NAME`;';
139
    }
140
141
    /**
142
     * Query to list MySQL engines
143
     *
144
     * @param string $onlyActiveOnes
145
     * @return type
146
     */
147
    protected function sQueryMySqlActiveEngines($onlyActiveOnes = true)
148
    {
149
        return 'SELECT '
150
                . '`ENGINE` AS `Engine`, '
151
                . '`SUPPORT` AS `Support`, '
152
                . '`COMMENT` AS `Comment` '
153
                . 'FROM `information_schema`.`ENGINES` '
154
                . ($onlyActiveOnes ? 'WHERE (`SUPPORT` IN ("DEFAULT", "YES")) ' : '')
155
                . 'GROUP BY `ENGINE`;';
156
    }
157
158
    protected function sQueryMySqlColumns($filterArray = null)
159
    {
160
        return 'SELECT ' . $this->sQueryMySqlColumnsColumns() . ' '
161
                . 'FROM `information_schema`.`COLUMNS` `C` '
162
                . 'LEFT JOIN `information_schema`.`KEY_COLUMN_USAGE` `KCU` ON ((' . implode(') AND (', [
163
                    '`C`.`TABLE_SCHEMA` = `KCU`.`TABLE_SCHEMA`',
164
                    '`C`.`TABLE_NAME` = `KCU`.`TABLE_NAME`',
165
                    '`C`.`COLUMN_NAME` = `KCU`.`COLUMN_NAME`',
166
                ]) . ')) '
167
                . $this->sManageDynamicFilters($filterArray, 'C')
168
                . 'GROUP BY `C`.`TABLE_SCHEMA`, `C`.`TABLE_NAME`, `C`.`COLUMN_NAME` '
169
                . 'ORDER BY `C`.`TABLE_SCHEMA`, `C`.`TABLE_NAME`, `C`.`ORDINAL_POSITION`;';
170
    }
171
172
    protected function sQueryMySqlColumnsColumns()
173
    {
174
        return '`C`.`TABLE_SCHEMA`, `C`.`TABLE_NAME`, `C`.`COLUMN_NAME`, `C`.`ORDINAL_POSITION` '
175
                . ', `C`.`COLUMN_DEFAULT`, `C`.`IS_NULLABLE`, `C`.`DATA_TYPE`, `C`.`CHARACTER_MAXIMUM_LENGTH` '
176
                . ', `C`.`NUMERIC_PRECISION`, `C`.`NUMERIC_SCALE`, `C`.`DATETIME_PRECISION` '
177
                . ', `C`.`CHARACTER_SET_NAME`, `C`.`COLLATION_NAME`, `C`.`COLUMN_TYPE` '
178
                . ', `C`.`COLUMN_KEY`, `C`.`COLUMN_COMMENT`, `C`.`EXTRA`';
179
    }
180
181
    protected function sQueryGenericSelectKeyValue($parameters)
182
    {
183
        $this->sCleanParameters($parameters);
184
        return implode(' ', [
185
            'SELECT',
186
            $parameters[0] . ',' . $parameters[1],
187
            'FROM',
188
            $parameters[2],
189
            'GROUP BY',
190
            $parameters[1] . ';'
191
        ]);
192
    }
193
194
    /**
195
     * Query to list Global Variables
196
     *
197
     * @return string
198
     */
199
    protected function sQueryMySqlGlobalVariables()
200
    {
201
        return 'SHOW GLOBAL VARIABLES;';
202
    }
203
204
    /**
205
     * Query
206
     *
207
     * @param array $filterArray
208
     * @return string
209
     */
210
    protected function sQueryMySqlIndexes($filterArray = null)
211
    {
212
        return 'SELECT ' . $this->sQueryMySqlIndexesColumns() . ' '
213
                . 'FROM `information_schema`.`KEY_COLUMN_USAGE` `KCU` '
214
                . 'INNER JOIN `information_schema`.`COLUMNS` `C` ON ((' . implode(') AND (', [
215
                    '`C`.`TABLE_SCHEMA` = `KCU`.`TABLE_SCHEMA`',
216
                    '`C`.`TABLE_NAME` = `KCU`.`TABLE_NAME`',
217
                    '`C`.`COLUMN_NAME` = `KCU`.`COLUMN_NAME`',
218
                ]) . ')) '
219
                . 'LEFT JOIN `information_schema`.`REFERENTIAL_CONSTRAINTS` `RC` ON ((' . implode(') AND (', [
220
                    '`KCU`.`CONSTRAINT_SCHEMA` = `RC`.`CONSTRAINT_SCHEMA`',
221
                    '`KCU`.`CONSTRAINT_NAME` = `RC`.`CONSTRAINT_NAME`',
222
                ]) . ')) '
223
                . $this->sManageDynamicFilters($filterArray, 'KCU')
224
                . 'ORDER BY `KCU`.`TABLE_SCHEMA`, `KCU`.`TABLE_NAME`'
225
                . $this->xtraSoring($filterArray, 'COLUMN_NAME') . ';';
226
    }
227
228
    protected function sQueryMySqlIndexesColumns()
229
    {
230
        return '`KCU`.`CONSTRAINT_SCHEMA`, `KCU`.`CONSTRAINT_NAME`, `KCU`.`TABLE_SCHEMA`, `KCU`.`TABLE_NAME`, '
231
                . '`KCU`.`COLUMN_NAME`, `C`.`ORDINAL_POSITION` AS `COLUMN_POSITION`, `KCU`.`ORDINAL_POSITION`, '
232
                . '`KCU`.`POSITION_IN_UNIQUE_CONSTRAINT`, `KCU`.`REFERENCED_TABLE_SCHEMA`, '
233
                . '`KCU`.`REFERENCED_TABLE_NAME`, `KCU`.`REFERENCED_COLUMN_NAME`, '
234
                . '`RC`.`UPDATE_RULE`, `RC`.`DELETE_RULE`';
235
    }
236
237
    /**
238
     * The MySQL server time
239
     *
240
     * @return string
241
     */
242
    protected function sQueryMySqlServerTime()
243
    {
244
        return 'SELECT NOW();';
245
    }
246
247
    protected function sQueryMySqlStatisticTSFSPE()
248
    {
249
        return '(SELECT COUNT(*) AS `No. of records` FROM `information_schema`.`TRIGGERS` `T` '
250
                . 'WHERE (`T`.`EVENT_OBJECT_SCHEMA` = `S`.`SCHEMA_NAME`)) '
251
                . 'AS `Triggers`, '
252
                . '(SELECT COUNT(*) AS `No. of records` FROM `information_schema`.`ROUTINES` `R` '
253
                . 'WHERE (`R`.`ROUTINE_SCHEMA` = `S`.`SCHEMA_NAME`) AND (`R`.`ROUTINE_TYPE` = "Function")) '
254
                . 'AS `Stored Functions`, '
255
                . '(SELECT COUNT(*) AS `No. of records` FROM `information_schema`.`ROUTINES` `R` '
256
                . 'WHERE (`R`.`ROUTINE_SCHEMA` = `S`.`SCHEMA_NAME`) AND (`R`.`ROUTINE_TYPE` = "Procedure")) '
257
                . 'AS `Stored Procedure`, '
258
                . '(SELECT COUNT(*) AS `No. of records` FROM `information_schema`.`EVENTS` `E` '
259
                . 'WHERE (`E`.`EVENT_SCHEMA` = `S`.`SCHEMA_NAME`)) '
260
                . 'AS `Events` ';
261
    }
262
263
    protected function sQueryMySqlStatisticTVC()
264
    {
265
        return '(SELECT COUNT(*) AS `No. of records` FROM `information_schema`.`TABLES` `T` '
266
                . 'WHERE (`T`.`TABLE_SCHEMA` = `S`.`SCHEMA_NAME`) AND (`T`.`TABLE_TYPE` = "BASE TABLE")) '
267
                . 'AS `Tables`, '
268
                . '(SELECT COUNT(*) AS `No. of records` FROM `information_schema`.`TABLES` `T` '
269
                . 'WHERE (`T`.`TABLE_SCHEMA` = `S`.`SCHEMA_NAME`) AND (`T`.`TABLE_TYPE` = "VIEW")) '
270
                . 'AS `Views`, '
271
                . '(SELECT COUNT(*) AS `No. of records` FROM `information_schema`.`COLUMNS` `C` '
272
                . 'WHERE (`C`.`TABLE_SCHEMA` = `S`.`SCHEMA_NAME`)) '
273
                . 'AS `Columns`, ';
274
    }
275
276
    protected function sQueryMySqlStatistics($filterArray = null)
277
    {
278
        return 'SELECT '
279
                . '`S`.`SCHEMA_NAME`, '
280
                . $this->sQueryMySqlStatisticTVC()
281
                . $this->sQueryMySqlStatisticTSFSPE()
282
                . 'FROM `information_schema`.`SCHEMATA` `S` '
283
                . 'WHERE (`S`.`SCHEMA_NAME` NOT IN ("information_schema", "mysql", "performance_schema", "sys")) '
284
                . str_replace('WHERE|AND', $this->sManageDynamicFilters($filterArray, 'S'))
285
                . 'ORDER BY `S`.`SCHEMA_NAME`;';
286
    }
287
288
    /**
289
     * Query to get list of tables
290
     *
291
     * @param type $filterArray
292
     * @return string
293
     */
294
    protected function sQueryMySqlTables($filterArray = null)
295
    {
296
        return 'SELECT `T`.`TABLE_SCHEMA` '
297
                . ', `T`.`TABLE_NAME` '
298
                . ', `T`.`TABLE_TYPE` '
299
                . ', `T`.`ENGINE` '
300
                . ', `T`.`VERSION` '
301
                . ', `T`.`ROW_FORMAT` '
302
                . ', `T`.`AUTO_INCREMENT` '
303
                . ', `T`.`TABLE_COLLATION` '
304
                . ', `T`.`CREATE_TIME` '
305
                . ', `T`.`CREATE_OPTIONS` '
306
                . ', `T`.`TABLE_COMMENT` '
307
                . 'FROM `information_schema`.`TABLES` `T` '
308
                . $this->sManageDynamicFilters($filterArray, 'T')
309
                . $this->xtraSoring($filterArray, 'TABLE_SCHEMA')
310
                . ';';
311
    }
312
313
    /**
314
     * Get all the row details from a table based on given filter
315
     *
316
     * @param array $parameters
317
     * @return string
318
     */
319
    protected function sQueryRowsFromTable($parameters)
320
    {
321
        $this->sCleanParameters($parameters);
322
        return 'SELECT * '
323
                . 'FROM `' . $parameters[0] . '` '
324
                . 'WHERE ' . $parameters[1] . ';';
325
    }
326
327
    protected function sQueryToDeleteSingleIdentifier($parameters)
328
    {
329
        $this->sCleanParameters($parameters);
330
        return 'DELETE '
331
                . 'FROM `' . $parameters[0] . '` '
332
                . 'WHERE `' . $parameters[1] . '` = "' . $parameters[2] . '";';
333
    }
334
335
    private function xtraSoring($filterArray, $filterValueToDecide)
336
    {
337
        $defaults = [
338
            'COLUMN_NAME'  => [
339
                ', `C`.`ORDINAL_POSITION`, `KCU`.`CONSTRAINT_NAME`',
340
                '',
341
            ],
342
            'TABLE_SCHEMA' => [
343
                'ORDER BY `T`.`TABLE_SCHEMA`, `T`.`TABLE_NAME`',
344
                'ORDER BY `T`.`TABLE_NAME`',
345
            ],
346
        ];
347
        if (!is_null($filterArray) && is_array($filterArray) && array_key_exists($filterValueToDecide, $filterArray)) {
348
            return $defaults[$filterValueToDecide][1];
349
        }
350
        return $defaults[$filterValueToDecide][0];
351
    }
352
}
353