Completed
Push — master ( 21732b...5af230 )
by Daniel
02:34
created

MySQLiByDanielGPqueries   A

Complexity

Total Complexity 30

Size/Duplication

Total Lines 228
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 14
Bugs 0 Features 1
Metric Value
wmc 30
c 14
b 0
f 1
lcom 1
cbo 1
dl 0
loc 228
rs 10

15 Methods

Rating   Name   Duplication   Size   Complexity  
A getForeignKeysQuery() 0 12 2
A sGlueFilterValIntoWhereStr() 0 7 2
A sGlueFilterValueIntoWhereStringFinal() 0 16 4
A sGlueFiltersIntoWhereArrayFilter() 0 4 1
A sManageDynamicFilters() 0 14 4
A sManageDynamicFiltersFinal() 0 8 2
A sManageLimit() 0 7 2
A sQueryMySqlColumns() 0 17 1
A sQueryMySqlColumnsColumns() 0 8 1
A sQueryMySqlIndexes() 0 19 1
A sQueryMySqlIndexesColumns() 0 8 1
A sQueryMySqlStatisticPattern() 0 8 3
A sQueryMySqlStatistics() 0 16 1
A sQueryMySqlTables() 0 10 1
A xtraSoring() 0 17 4
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
    use MySQLiByDanielGPqueriesBasic;
40
41
    /**
42
     * prepares the query to detect FKs
43
     *
44
     * @param array $value
45
     * @return string
46
     */
47
    protected function getForeignKeysQuery($value)
48
    {
49
        $flt = [
50
            'TABLE_SCHEMA' => $value['REFERENCED_TABLE_SCHEMA'],
51
            'TABLE_NAME'   => $value['REFERENCED_TABLE_NAME'],
52
            'DATA_TYPE'    => ['char', 'varchar', 'text'],
53
        ];
54
        if (array_key_exists('LIMIT', $value)) {
55
            $flt['LIMIT'] = $value['LIMIT'];
56
        }
57
        return $this->sQueryMySqlColumns($flt);
58
    }
59
60
    /**
61
     * Internal function to manage concatenation for filters
62
     *
63
     * @param type $filterValue
64
     * @return string
65
     */
66
    private function sGlueFilterValIntoWhereStr($filterValue)
67
    {
68
        if (is_array($filterValue)) {
69
            return 'IN ("' . implode('", "', $filterValue) . '")';
70
        }
71
        return $this->sGlueFilterValueIntoWhereStringFinal($filterValue);
72
    }
73
74
    private function sGlueFilterValueIntoWhereStringFinal($filterValue)
75
    {
76
        $kFields = [
77
            'CONNECTION_ID()|CURDATE()|CURRENT_USER|CURRENT_USER()|CURRENT_DATETIME|DATABASE()|NOW()|USER()',
78
            'IS NULL|IS NOT NULL',
79
            'NOT NULL|NULL',
80
        ];
81
        if (in_array($filterValue, explode('|', $kFields[0]))) {
82
            return '= ' . $filterValue;
83
        } elseif (in_array($filterValue, explode('|', $kFields[1]))) {
84
            return $filterValue;
85
        } elseif (in_array($filterValue, explode('|', $kFields[2]))) {
86
            return 'IS ' . $filterValue;
87
        }
88
        return '= "' . $filterValue . '"';
89
    }
90
91
    /**
92
     * Internal function to concatenate filters
93
     *
94
     * @param array $filters
95
     * @return type
96
     */
97
    private function sGlueFiltersIntoWhereArrayFilter($filters)
98
    {
99
        return '(' . implode(') AND (', $filters) . ')';
100
    }
101
102
    /**
103
     * Internal function to manage the filters passed to the query
104
     *
105
     * @param array $filterArray
106
     * @param string $tableToApplyFilterTo
107
     * @return string
108
     */
109
    private function sManageDynamicFilters($filterArray = null, $tableToApplyFilterTo = '')
110
    {
111
        if (is_null($filterArray)) {
112
            return '';
113
        }
114
        $fltr = [];
115
        if (is_array($filterArray)) {
116
            unset($filterArray['LIMIT']);
117
            foreach ($filterArray as $key => $value) {
118
                $fltr[] = '`' . $tableToApplyFilterTo . '`.`' . $key . '` ' . $this->sGlueFilterValIntoWhereStr($value);
119
            }
120
        }
121
        return $this->sManageDynamicFiltersFinal($fltr);
122
    }
123
124
    private function sManageDynamicFiltersFinal($filters)
125
    {
126
        if (count($filters) > 0) {
127
            $sReturn = ['WHERE', $this->sGlueFiltersIntoWhereArrayFilter($filters)];
128
            return implode(' ', $sReturn) . ' ';
129
        }
130
        return '';
131
    }
132
133
    private function sManageLimit($filters)
134
    {
135
        if (array_key_exists('LIMIT', $filters)) {
136
            return 'LIMIT ' . $filters['LIMIT'];
137
        }
138
        return '';
139
    }
140
141
    protected function sQueryMySqlColumns($filterArray = null)
142
    {
143
        return 'SELECT '
144
                . '`C`.`TABLE_SCHEMA`, '
145
                . $this->sQueryMySqlColumnsColumns() . ' '
146
                . 'FROM `information_schema`.`COLUMNS` `C` '
147
                . 'LEFT JOIN `information_schema`.`KEY_COLUMN_USAGE` `KCU` ON ((' . implode(') AND (', [
148
                    '`C`.`TABLE_SCHEMA` = `KCU`.`TABLE_SCHEMA`',
149
                    '`C`.`TABLE_NAME` = `KCU`.`TABLE_NAME`',
150
                    '`C`.`COLUMN_NAME` = `KCU`.`COLUMN_NAME`',
151
                ]) . ')) '
152
                . $this->sManageDynamicFilters($filterArray, 'C')
153
                . 'GROUP BY `C`.`TABLE_SCHEMA`, `C`.`TABLE_NAME`, `C`.`COLUMN_NAME` '
154
                . 'ORDER BY `C`.`TABLE_SCHEMA`, `C`.`TABLE_NAME`, `C`.`ORDINAL_POSITION` '
155
                . $this->sManageLimit($filterArray)
156
                . ';';
157
    }
158
159
    private function sQueryMySqlColumnsColumns()
160
    {
161
        return '`C`.`TABLE_NAME`, `C`.`COLUMN_NAME`, `C`.`ORDINAL_POSITION` '
162
                . ', `C`.`COLUMN_DEFAULT`, `C`.`IS_NULLABLE`, `C`.`DATA_TYPE`, `C`.`CHARACTER_MAXIMUM_LENGTH` '
163
                . ', `C`.`NUMERIC_PRECISION`, `C`.`NUMERIC_SCALE`, `C`.`DATETIME_PRECISION` '
164
                . ', `C`.`CHARACTER_SET_NAME`, `C`.`COLLATION_NAME`, `C`.`COLUMN_TYPE` '
165
                . ', `C`.`COLUMN_KEY`, `C`.`COLUMN_COMMENT`, `C`.`EXTRA`';
166
    }
167
168
    /**
169
     * Query
170
     *
171
     * @param array $filterArray
172
     * @return string
173
     */
174
    protected function sQueryMySqlIndexes($filterArray = null)
175
    {
176
        return 'SELECT '
177
                . '`KCU`.`CONSTRAINT_SCHEMA`, '
178
                . $this->sQueryMySqlIndexesColumns() . ' '
179
                . 'FROM `information_schema`.`KEY_COLUMN_USAGE` `KCU` '
180
                . 'INNER JOIN `information_schema`.`COLUMNS` `C` ON ((' . implode(') AND (', [
181
                    '`C`.`TABLE_SCHEMA` = `KCU`.`TABLE_SCHEMA`',
182
                    '`C`.`TABLE_NAME` = `KCU`.`TABLE_NAME`',
183
                    '`C`.`COLUMN_NAME` = `KCU`.`COLUMN_NAME`',
184
                ]) . ')) '
185
                . 'LEFT JOIN `information_schema`.`REFERENTIAL_CONSTRAINTS` `RC` ON ((' . implode(') AND (', [
186
                    '`KCU`.`CONSTRAINT_SCHEMA` = `RC`.`CONSTRAINT_SCHEMA`',
187
                    '`KCU`.`CONSTRAINT_NAME` = `RC`.`CONSTRAINT_NAME`',
188
                ]) . ')) '
189
                . $this->sManageDynamicFilters($filterArray, 'KCU')
190
                . 'ORDER BY `KCU`.`TABLE_SCHEMA`, `KCU`.`TABLE_NAME`'
191
                . $this->xtraSoring($filterArray, 'COLUMN_NAME') . ';';
192
    }
193
194
    private function sQueryMySqlIndexesColumns()
195
    {
196
        return '`KCU`.`CONSTRAINT_NAME`, `KCU`.`TABLE_SCHEMA`, `KCU`.`TABLE_NAME`, '
197
                . '`KCU`.`COLUMN_NAME`, `C`.`ORDINAL_POSITION` AS `COLUMN_POSITION`, `KCU`.`ORDINAL_POSITION`, '
198
                . '`KCU`.`POSITION_IN_UNIQUE_CONSTRAINT`, `KCU`.`REFERENCED_TABLE_SCHEMA`, '
199
                . '`KCU`.`REFERENCED_TABLE_NAME`, `KCU`.`REFERENCED_COLUMN_NAME`, '
200
                . '`RC`.`UPDATE_RULE`, `RC`.`DELETE_RULE`';
201
    }
202
203
    private function sQueryMySqlStatisticPattern($tblName, $lnkDbCol, $adtnlCol = null, $adtnlFltr = null)
204
    {
205
        $tblAls = substr($tblName, 0, 1);
206
        return '(SELECT COUNT(*) AS `No. of records` FROM `information_schema`.`' . $tblName . '` `' . $tblAls . '` '
207
                . 'WHERE (`' . $tblAls . '`.`' . $lnkDbCol . '` = `S`.`SCHEMA_NAME`)'
208
                . (!is_null($adtnlCol) ? ' AND (`' . $tblAls . '`.`' . $adtnlCol . '` = "' . $adtnlFltr . '")' : '')
209
                . ') AS `' . ucwords(strtolower((is_null($adtnlCol) ? $tblName : $adtnlFltr))) . '`';
210
    }
211
212
    protected function sQueryMySqlStatistics($filterArray = null)
213
    {
214
        return 'SELECT '
215
                . '`S`.`SCHEMA_NAME`, '
216
                . $this->sQueryMySqlStatisticPattern('TABLES', 'TABLE_SCHEMA', 'TABLE_TYPE', 'BASE TABLE') . ', '
217
                . $this->sQueryMySqlStatisticPattern('TABLES', 'TABLE_SCHEMA', 'TABLE_TYPE', 'VIEW') . ', '
218
                . $this->sQueryMySqlStatisticPattern('COLUMNS', 'TABLE_SCHEMA') . ', '
219
                . $this->sQueryMySqlStatisticPattern('TRIGGERS', 'EVENT_OBJECT_SCHEMA') . ', '
220
                . $this->sQueryMySqlStatisticPattern('ROUTINES', 'ROUTINE_SCHEMA', 'ROUTINE_TYPE', 'Function') . ', '
221
                . $this->sQueryMySqlStatisticPattern('ROUTINES', 'ROUTINE_SCHEMA', 'ROUTINE_TYPE', 'Procedure') . ', '
222
                . $this->sQueryMySqlStatisticPattern('EVENTS', 'EVENT_SCHEMA') . ' '
223
                . 'FROM `information_schema`.`SCHEMATA` `S` '
224
                . 'WHERE (`S`.`SCHEMA_NAME` NOT IN ("information_schema", "mysql", "performance_schema", "sys")) '
225
                . str_replace('WHERE', 'AND', $this->sManageDynamicFilters($filterArray, 'S'))
226
                . 'ORDER BY `S`.`SCHEMA_NAME`;';
227
    }
228
229
    /**
230
     * Query to get list of tables
231
     *
232
     * @param type $filterArray
233
     * @return string
234
     */
235
    protected function sQueryMySqlTables($filterArray = null)
236
    {
237
        return 'SELECT '
238
                . '`T`.`TABLE_SCHEMA`, `T`.`TABLE_NAME`, `T`.`TABLE_TYPE`, `T`.`ENGINE`, `T`.`VERSION` '
239
                . ', `T`.`ROW_FORMAT`, `T`.`AUTO_INCREMENT`, `T`.`TABLE_COLLATION`, `T`.`CREATE_TIME` '
240
                . ', `T`.`CREATE_OPTIONS`, `T`.`TABLE_COMMENT` '
241
                . 'FROM `information_schema`.`TABLES` `T` '
242
                . $this->sManageDynamicFilters($filterArray, 'T')
243
                . $this->xtraSoring($filterArray, 'TABLE_SCHEMA') . ';';
244
    }
245
246
    private function xtraSoring($filterArray, $filterValueToDecide)
247
    {
248
        $defaults = [
249
            'COLUMN_NAME'  => [
250
                ', `C`.`ORDINAL_POSITION`, `KCU`.`CONSTRAINT_NAME`',
251
                '',
252
            ],
253
            'TABLE_SCHEMA' => [
254
                'ORDER BY `T`.`TABLE_SCHEMA`, `T`.`TABLE_NAME`',
255
                'ORDER BY `T`.`TABLE_NAME`',
256
            ],
257
        ];
258
        if (!is_null($filterArray) && is_array($filterArray) && array_key_exists($filterValueToDecide, $filterArray)) {
259
            return $defaults[$filterValueToDecide][1];
260
        }
261
        return $defaults[$filterValueToDecide][0];
262
    }
263
}
264