1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
sql.php
См. документацию.
1<?php
2
4{
14 public static function GetList($arSelect, $arFilter, $arOrder, $bGroup, $arNavStartParams = false)
15 {
16 global $DB;
17
18 if (!is_array($arSelect))
19 {
20 $arSelect = [];
21 }
22 if (count($arSelect) < 1)
23 {
24 $arSelect = [
25 'ID',
26 ];
27 }
28
29 if (!is_array($arOrder))
30 {
31 $arOrder = [];
32 }
33 if (count($arOrder) < 1)
34 {
35 $arOrder = [
36 'HIT_ID' => 'DESC',
37 'NN' => 'ASC',
38 ];
39 }
40
41 $arQueryOrder = [];
42 foreach ($arOrder as $strColumn => $strDirection)
43 {
44 $strColumn = mb_strtoupper($strColumn);
45 $strDirection = mb_strtoupper($strDirection) === 'ASC' ? 'ASC' : 'DESC';
46 switch ($strColumn)
47 {
48 case 'ID':
49 case 'HIT_ID':
50 case 'NN':
51 case 'MODULE_NAME':
52 case 'COMPONENT_NAME':
53 case 'NODE_ID':
54 $arSelect[] = $strColumn;
55 $arQueryOrder[$strColumn] = $strColumn . ' ' . $strDirection;
56 break;
57 case 'SQL_TEXT':
58 case 'QUERY_TIME':
59 if (!$bGroup)
60 {
61 $arSelect[] = $strColumn;
62 $arQueryOrder[$strColumn] = $strColumn . ' ' . $strDirection;
63 }
64 break;
65 case 'MAX_QUERY_TIME':
66 case 'MIN_QUERY_TIME':
67 case 'AVG_QUERY_TIME':
68 case 'SUM_QUERY_TIME':
69 case 'COUNT':
70 if ($bGroup)
71 {
72 $arSelect[] = $strColumn;
73 $arQueryOrder[$strColumn] = $strColumn . ' ' . $strDirection;
74 }
75 break;
76 }
77 }
78
79 $arQueryGroup = [];
80 $arQuerySelect = [];
81 foreach ($arSelect as $strColumn)
82 {
83 $strColumn = mb_strtoupper($strColumn);
84 switch ($strColumn)
85 {
86 case 'ID':
87 case 'HIT_ID':
88 case 'NN':
89 case 'MODULE_NAME':
90 case 'COMPONENT_NAME':
91 case 'NODE_ID':
92 case 'SELECTED_ROWS':
93 case 'SELECTED_FIELDS':
94 case 'FETCHED_ROWS':
95 case 'FETCHED_LENGTH':
96 case 'HAS_BIG_FIELDS':
97 if ($bGroup)
98 {
99 $arQueryGroup[$strColumn] = 's.' . $strColumn;
100 }
101 $arQuerySelect[$strColumn] = 's.' . $strColumn;
102 break;
103 case 'SQL_TEXT':
104 case 'QUERY_TIME':
105 if (!$bGroup)
106 {
107 $arQuerySelect[$strColumn] = 's.' . $strColumn;
108 }
109 break;
110 case 'MAX_QUERY_TIME':
111 case 'MIN_QUERY_TIME':
112 case 'AVG_QUERY_TIME':
113 case 'SUM_QUERY_TIME':
114 if ($bGroup)
115 {
116 $arQuerySelect[$strColumn] = mb_substr($strColumn, 0, 3) . '(s.' . mb_substr($strColumn, 4) . ') ' . $strColumn;
117 }
118 break;
119 case 'COUNT':
120 // if ($bGroup)
121 // {
122 $arQuerySelect[$strColumn] = 'COUNT(s.ID) ' . $strColumn;
123 // }
124 break;
125 }
126 }
127
128 $obQueryWhere = new CSQLWhere;
129 $obQueryWhere->SetFields([
130 'HIT_ID' => [
131 'TABLE_ALIAS' => 's',
132 'FIELD_NAME' => 's.HIT_ID',
133 'FIELD_TYPE' => 'int',
134 'JOIN' => false,
135 ],
136 'COMPONENT_ID' => [
137 'TABLE_ALIAS' => 's',
138 'FIELD_NAME' => 's.COMPONENT_ID',
139 'FIELD_TYPE' => 'int',
140 'JOIN' => false,
141 ],
142 'ID' => [
143 'TABLE_ALIAS' => 's',
144 'FIELD_NAME' => 's.ID',
145 'FIELD_TYPE' => 'int',
146 'JOIN' => false,
147 ],
148 'QUERY_TIME' => [
149 'TABLE_ALIAS' => 's',
150 'FIELD_NAME' => 's.QUERY_TIME',
151 'FIELD_TYPE' => 'double',
152 'JOIN' => false,
153 ],
154 'SUGGEST_ID' => [
155 'TABLE_ALIAS' => 'iss',
156 'FIELD_NAME' => 'iss.SUGGEST_ID',
157 'FIELD_TYPE' => 'int',
158 'JOIN' => 'INNER JOIN b_perf_index_suggest_sql iss on iss.SQL_ID = s.ID',
159 'LEFT_JOIN' => 'LEFT JOIN b_perf_index_suggest_sql is on is.SQL_ID = s.ID',
160 ],
161 'NODE_ID' => [
162 'TABLE_ALIAS' => 's',
163 'FIELD_NAME' => 's.NODE_ID',
164 'FIELD_TYPE' => 'int',
165 'JOIN' => false,
166 ],
167 'SELECTED_ROWS' => [
168 'TABLE_ALIAS' => 's',
169 'FIELD_NAME' => 's.SELECTED_ROWS',
170 'FIELD_TYPE' => 'int',
171 'JOIN' => false,
172 ],
173 'SELECTED_FIELDS' => [
174 'TABLE_ALIAS' => 's',
175 'FIELD_NAME' => 's.SELECTED_FIELDS',
176 'FIELD_TYPE' => 'int',
177 'JOIN' => false,
178 ],
179 'FETCHED_ROWS' => [
180 'TABLE_ALIAS' => 's',
181 'FIELD_NAME' => 's.FETCHED_ROWS',
182 'FIELD_TYPE' => 'int',
183 'JOIN' => false,
184 ],
185 'FETCHED_LENGTH' => [
186 'TABLE_ALIAS' => 's',
187 'FIELD_NAME' => 's.FETCHED_LENGTH',
188 'FIELD_TYPE' => 'int',
189 'JOIN' => false,
190 ],
191 'HAS_BIG_FIELDS' => [
192 'TABLE_ALIAS' => 's',
193 'FIELD_NAME' => 's.HAS_BIG_FIELDS',
194 'FIELD_TYPE' => 'string',
195 'JOIN' => false,
196 ],
197 ]);
198
199 if (empty($arQuerySelect))
200 {
201 $arQuerySelect = ['ID' => 's.ID'];
202 }
203
204 if (!is_array($arFilter))
205 {
206 $arFilter = [];
207 }
208 $strQueryWhere = $obQueryWhere->GetQuery($arFilter);
209
210 if (is_array($arNavStartParams) && isset($arNavStartParams['nOffset']) && isset($arNavStartParams['nTopCount']))
211 {
213 $sqlHelper = $connection->getSqlHelper();
214 $strSql = '
215 SELECT ' . implode(', ', $arQuerySelect) . '
216 FROM b_perf_sql s
217 ' . $obQueryWhere->GetJoins() . '
218 ' . ($strQueryWhere ? 'WHERE ' . $strQueryWhere : '') . '
219 ' . ($bGroup ? 'GROUP BY ' . implode(', ', $arQueryGroup) : '') . '
220 ' . (count($arQueryOrder) ? 'ORDER BY ' . implode(', ', $arQueryOrder) : '') . '
221 ';
222 $strSql = $sqlHelper->getTopSql($strSql, $arNavStartParams['nTopCount'], $arNavStartParams['nOffset']);
223
224 $res = $DB->Query($strSql);
225 }
226 elseif (is_array($arNavStartParams) && ($arNavStartParams['nTopCount'] ?? 0) > 0)
227 {
228 $strSql = $DB->TopSQL('
229 SELECT ' . implode(', ', $arQuerySelect) . '
230 FROM b_perf_sql s
231 ' . $obQueryWhere->GetJoins() . '
232 ' . ($strQueryWhere ? 'WHERE ' . $strQueryWhere : '') . '
233 ' . ($bGroup ? 'GROUP BY ' . implode(', ', $arQueryGroup) : '') . '
234 ' . (count($arQueryOrder) ? 'ORDER BY ' . implode(', ', $arQueryOrder) : '') . '
235 ', $arNavStartParams['nTopCount']);
236 $res = $DB->Query($strSql);
237 }
238 elseif (is_array($arNavStartParams))
239 {
240 $strSql = "
241 SELECT count('x') CNT
242 FROM b_perf_sql s
243 " . $obQueryWhere->GetJoins() . '
244 ' . ($strQueryWhere ? 'WHERE ' . $strQueryWhere : '') . '
245 ' . ($bGroup ? 'GROUP BY ' . implode(', ', $arQueryGroup) : '') . '
246 ';
247 $res_cnt = $DB->Query($strSql);
248 $ar_cnt = $res_cnt->Fetch();
249
250 $strSql = '
251 SELECT ' . implode(', ', $arQuerySelect) . '
252 FROM b_perf_sql s
253 ' . $obQueryWhere->GetJoins() . '
254 ' . ($strQueryWhere ? 'WHERE ' . $strQueryWhere : '') . '
255 ' . ($bGroup ? 'GROUP BY ' . implode(', ', $arQueryGroup) : '') . '
256 ' . (count($arQueryOrder) ? 'ORDER BY ' . implode(', ', $arQueryOrder) : '') . '
257 ';
258 $res = new CDBResult();
259 $res->NavQuery($strSql, $ar_cnt['CNT'], $arNavStartParams);
260 }
261 else
262 {
263 $strSql = '
264 SELECT ' . implode(', ', $arQuerySelect) . '
265 FROM b_perf_sql s
266 ' . $obQueryWhere->GetJoins() . '
267 ' . ($strQueryWhere ? 'WHERE ' . $strQueryWhere : '') . '
268 ' . ($bGroup ? 'GROUP BY ' . implode(', ', $arQueryGroup) : '') . '
269 ' . (count($arQueryOrder) ? 'ORDER BY ' . implode(', ', $arQueryOrder) : '') . '
270 ';
271 $res = $DB->Query($strSql);
272 }
273
274 return $res;
275 }
276
277 public static function GetBacktraceList($sql_id)
278 {
279 global $DB;
280 return $DB->Query('
281 SELECT *
282 FROM b_perf_sql_backtrace
283 WHERE SQL_ID = ' . intval($sql_id) . '
284 AND NN > 0
285 ORDER BY NN
286 ');
287 }
288
289 public static function Format($strSql)
290 {
291 $strSql = preg_replace("/[\\n\\r\\t ]+/", ' ', $strSql);
292 $strSql = preg_replace('/^ +/', '', $strSql);
293 $strSql = preg_replace('/ (INNER JOIN|OUTER JOIN|LEFT JOIN|SET|LIMIT) /i', "\n\\1 ", $strSql);
294 $strSql = preg_replace('/(INSERT INTO [A-Z_0-9]+?)\\s/i', "\\1\n", $strSql);
295 $strSql = preg_replace('/(INSERT INTO [A-Z_0-9]+?)([(])/i', "\\1\n\\2", $strSql);
296 $strSql = preg_replace('/([\\s)])(VALUES)([\\s(])/i', "\\1\n\\2\n\\3", $strSql);
297 $strSql = preg_replace('/ (FROM|WHERE|ORDER BY|GROUP BY|HAVING) /i', "\n\\1\n", $strSql);
298 $arMatch = [];
299
300 if (preg_match('/.*WHERE(.+)\\s(ORDER BY|GROUP BY|HAVING|$)/is', $strSql . ' ', $arMatch))
301 {
302 $strWhere = $arMatch[1];
303 $len = mb_strlen($strWhere);
304 $res = '';
305 $group = 0;
306 for ($i = 0; $i < $len; $i++)
307 {
308 $char = mb_substr($strWhere, $i, 1);
309 if ($char === '(')
310 {
311 $group++;
312 }
313 elseif ($char === ')')
314 {
315 $group--;
316 }
317 elseif ($group == 0)
318 {
319 $match = [];
320 if (preg_match('/^(\\s)(AND|OR|NOT)([\\s(])/is', mb_substr($strWhere, $i), $match))
321 {
322 $char = "\n " . $match[2];
323 $i += mb_strlen($match[1] . $match[2]) - 1;
324 }
325 }
326 $res .= $char;
327 }
328 $strSql = str_replace($arMatch[1], $res, $strSql);
329 }
330
331 if (preg_match('/.*?SELECT(.+)\\s(FROM)/is', $strSql . ' ', $arMatch))
332 {
333 $strWhere = $arMatch[1];
334 $len = mb_strlen($strWhere);
335 $res = '';
336 $group = 0;
337 for ($i = 0; $i < $len; $i++)
338 {
339 $char = mb_substr($strWhere, $i, 1);
340 if ($char === '(')
341 {
342 $group++;
343 }
344 elseif ($char === ')')
345 {
346 $group--;
347 }
348 elseif ($group === 0 && $char === ',')
349 {
350 $char = "\n " . $char;
351 }
352 $res .= $char;
353 }
354 $strSql = str_replace($arMatch[1], $res, $strSql);
355 }
356
357 if (preg_match('/.*?UPDATE\\s.+?\\sSET\\s(.+?)WHERE/is', $strSql . ' ', $arMatch))
358 {
359 $strWhere = $arMatch[1];
360 $len = mb_strlen($strWhere);
361 $res = '';
362 $group = 0;
363 for ($i = 0; $i < $len; $i++)
364 {
365 $char = mb_substr($strWhere, $i, 1);
366 if ($char === '(')
367 {
368 $group++;
369 }
370 elseif ($char === ')')
371 {
372 $group--;
373 }
374 elseif ($group === 0 && $char === ',')
375 {
376 $char = "\n " . $char;
377 }
378 $res .= $char;
379 }
380 $strSql = str_replace($arMatch[1], $res, $strSql);
381 }
382 return $strSql;
383 }
384
385 public static function Clear()
386 {
387 global $DB;
388 $res = $DB->Query('TRUNCATE TABLE b_perf_sql_backtrace');
389 if ($res)
390 {
391 $res = $DB->Query('TRUNCATE TABLE b_perf_index_suggest_sql');
392 }
393 if ($res)
394 {
395 $res = $DB->Query('TRUNCATE TABLE b_perf_sql');
396 }
397 return $res;
398 }
399}
$connection
Определения actionsdefinitions.php:38
static getConnection($name="")
Определения application.php:638
SetFields($arFields)
Определения sqlwhere.php:239
Определения sql.php:4
static GetBacktraceList($sql_id)
Определения sql.php:277
static Clear()
Определения sql.php:385
static GetList($arSelect, $arFilter, $arOrder, $bGroup, $arNavStartParams=false)
Определения sql.php:14
static Format($strSql)
Определения sql.php:289
Определения sqlwhere.php:1359
$res
Определения filter_act.php:7
global $DB
Определения cron_frame.php:29
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$i
Определения factura.php:643
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$arFilter
Определения user_search.php:106