Completed
Push — master ( 499251...227237 )
by Agel_Nash
03:19
created

SupportTrait::getFullTableName()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2.0185

Importance

Changes 0
Metric Value
cc 2
eloc 5
nc 2
nop 1
dl 0
loc 9
ccs 5
cts 6
cp 0.8333
crap 2.0185
rs 9.6666
c 0
b 0
f 0
1
<?php namespace AgelxNash\Modx\Evo\Database\Traits;
2
3
use AgelxNash\Modx\Evo\Database\Exceptions;
4
5
trait SupportTrait
6
{
7
    /**
8
     * @param null|string $key
9
     * @return mixed
10
     */
11
    abstract public function getConfig($key = null);
12
13
    /**
14
     * @param string $table
15
     * @return string
16
     * @throws Exceptions\TableNotDefinedException
17
     */
18 6
    public function getFullTableName(string $table) : string
19
    {
20 6
        if (empty($table)) {
21
            throw new Exceptions\TableNotDefinedException($table);
22
        }
23
24 6
        return implode('.', [
25 6
            '`' . $this->getConfig('base') . '`',
26 6
            '`' . $this->getConfig('prefix') . $table . '`'
27
        ]);
28
    }
29
30
    /**
31
     * @param int $timestamp
32
     * @param string $fieldType
33
     * @return bool|false|string
34
     * @deprecated
35
     */
36
    public function prepareDate(int $timestamp, string $fieldType = 'DATETIME')
37
    {
38
        $date = false;
39
        if (! empty($timestamp) && $timestamp > 0) {
40
            switch ($fieldType) {
41
                case 'DATE':
42
                    $date = date('Y-m-d', $timestamp);
43
                    break;
44
                case 'TIME':
45
                    $date = date('H:i:s', $timestamp);
46
                    break;
47
                case 'YEAR':
48
                    $date = date('Y', $timestamp);
49
                    break;
50
                case 'DATETIME':
51
                default:
52
                    $date = date('Y-m-d H:i:s', $timestamp);
53
                    break;
54
            }
55
        }
56
57
        return $date;
58
    }
59
60
    /**
61
     * @param string|array $data
62
     * @return string
63
     */
64 2
    protected function prepareFields($data) : string
65
    {
66 2
        if (\is_array($data)) {
67 1
            $tmp = [];
68 1
            foreach ($data as $alias => $field) {
69 1
                $tmp[] = ($alias !== $field && ! \is_int($alias)) ? ($field . ' as `' . $alias . '`') : $field;
70
            }
71
72 1
            $data = implode(',', $tmp);
73
        }
74 2
        if (empty($data)) {
75
            $data = '*';
76
        }
77
78 2
        return $data;
79
    }
80
81
    /**
82
     * @param string|null $value
83
     * @return string
84
     */
85 4
    protected function prepareNull($value) : string
86
    {
87
        switch (true) {
88 4
            case ($value === null || (\is_scalar($value) && strtolower($value) === 'null')):
89 3
                $value = 'NULL';
90 3
                break;
91 4
            case \is_scalar($value):
92 4
                $value = "'" . $value . "'";
93 4
                break;
94
            default:
95
                throw (new Exceptions\InvaludFieldException('NULL'))
96
                    ->setData($value);
97
        }
98
99 4
        return $value;
100
    }
101
102
    /**
103
     * @param string|array $data
104
     * @param int $level
105
     * @param bool $skipFieldNames
106
     * @return array|string
107
     * @throws Exceptions\TooManyLoopsException
108
     */
109 2
    public function prepareValues($data, $level = 1, $skipFieldNames = false)
110
    {
111 2
        $fields = [];
112 2
        $values = [];
113 2
        $maxLevel = $level;
114 2
        $wrap = false;
115
116 2
        if (\is_array($data)) {
117 2
            foreach ($data as $key => $value) {
118 2
                if (\is_array($value)) {
119 1
                    if ($level > 2) {
120
                        throw new Exceptions\TooManyLoopsException();
121
                    }
122 1
                    $maxLevel++;
123 1
                    $out = $this->prepareValues($value, $level + 1);
124 1
                    if (empty($fields)) {
125 1
                        $fields = $out['fields'];
126 1
                    } elseif ($fields !== $out['fields'] && $skipFieldNames === false) {
127
                        throw (new Exceptions\InvaludFieldException("Don't match field names"))
128
                            ->setData($data);
129
                    }
130 1
                    $wrap = true;
131 1
                    $values[] = $out['values'];
132
                } else {
133 2
                    $fields[] = $key;
134 2
                    $values[] = $this->prepareNull($value);
135
                }
136
            }
137 2
            if (\is_array($values)) {
138 2
                $values = implode(', ', $values);
139
            }
140 2
            if ($wrap === false) {
141 2
                $values = '(' . $values . ')';
142
            }
143
        }
144
145 2
        if (! \is_scalar($values)) {
146
            throw (new Exceptions\InvaludFieldException('values'))
147
                ->setData($values);
148
        }
149
150 2
        if (($fields = $this->checkFields($fields, $maxLevel, $skipFieldNames)) === false) {
151
            throw (new Exceptions\InvaludFieldException('fields name'))
152
                ->setData($data);
153
        }
154
155 2
        if ($level === 2) {
156 1
            return compact('fields', 'values');
157
        }
158
159 2
        return (empty($fields) ? '' : $fields . ' VALUES ') . $values;
160
    }
161
162
    /**
163
     * @param mixed $fields
164
     * @param int $level
165
     * @param bool $skipFieldNames
166
     * @return bool|string
167
     */
168 2
    private function checkFields($fields, $level, bool $skipFieldNames = false)
169
    {
170 2
        if (\is_array($fields) && $skipFieldNames === false) {
171 2
            $onlyNumbers = true;
172 2
            foreach ($fields as $name) {
173 2
                if (! \is_int($name)) {
174 2
                    $onlyNumbers = false;
175 2
                    break;
176
                }
177
            }
178
179 2
            if ($onlyNumbers === true) {
180 1
                $fields = ($level === 2) ? false : '';
181
            } else {
182 2
                $fields = '(`' . implode('`, `', $fields) . '`)';
183
            }
184
        }
185
186 2
        return $fields;
187
    }
188
189
    /**
190
     * @param string|array $data
191
     * @return string
192
     */
193 1
    protected function prepareValuesSet($data) : string
194
    {
195 1
        if (\is_array($data)) {
196 1
            foreach ($data as $key => $value) {
197 1
                $data[$key] = $this->prepareNull($value);
198
            }
199
200 1
            foreach ($data as $key => $value) {
201 1
                $data[$key] = "`{$key}` = " . $value;
202
            }
203 1
            $data = implode(', ', $data);
204
        }
205
206 1
        return $data;
207
    }
208
209
    /**
210
     * @param string|array $data
211
     * @param bool $hasArray
212
     * @return string
213
     * @throws Exceptions\TableNotDefinedException
214
     */
215 4
    protected function prepareFrom($data, bool $hasArray = false) : string
216
    {
217 4
        if (\is_array($data) && $hasArray === true) {
218 2
            $tmp = [];
219 2
            foreach ($data as $table) {
220 2
                $tmp[] = $table;
221
            }
222 2
            $data = implode(' ', $tmp);
223
        }
224 4
        if (! is_scalar($data) || empty($data)) {
225
            throw new Exceptions\TableNotDefinedException($data);
226
        }
227
228 4
        return $data;
229
    }
230
231
    /**
232
     * @param array|string $data
233
     * @return string
234
     */
235 3
    protected function prepareWhere($data) : string
236
    {
237 3
        if (\is_array($data)) {
238 2
            $data = implode(' ', $data);
239
        }
240 3
        $data = trim($data);
241 3
        if (! empty($data) && stripos($data, 'WHERE') !== 0) {
242 3
            $data = "WHERE {$data}";
243
        }
244
245 3
        return $data;
246
    }
247
248
    /**
249
     * @param string $data
250
     * @return string
251
     */
252 3
    protected function prepareOrder($data) : string
253
    {
254 3
        $data = trim($data);
255 3
        if (! empty($data) && stripos($data, 'ORDER') !== 0) {
256 3
            $data = "ORDER BY {$data}";
257
        }
258
259 3
        return $data;
260
    }
261
262
    /**
263
     * @param string $data
264
     * @return string
265
     */
266 3
    protected function prepareLimit($data) : string
267
    {
268 3
        $data = trim($data);
269 3
        if (! empty($data) && stripos($data, 'LIMIT') !== 0) {
270 3
            $data = "LIMIT {$data}";
271
        }
272
273 3
        return $data;
274
    }
275
}
276