1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
mysqlisqlhelper.php
См. документацию.
1<?php
2
9
10namespace Bitrix\Main\DB;
11
12use Bitrix\Main\Type;
13use Bitrix\Main\ORM;
14use Bitrix\Main\ORM\Fields\ScalarField;
15
20{
24 public function getLeftQuote()
25 {
26 return '`';
27 }
28
32 public function getRightQuote()
33 {
34 return '`';
35 }
36
40 public function getAliasLength()
41 {
42 return 256;
43 }
44
48 public function getQueryDelimiter()
49 {
50 return ';';
51 }
52
57 {
58 return "NOW()";
59 }
60
64 public function getCurrentDateFunction()
65 {
66 return "CURDATE()";
67 }
68
72 public function addSecondsToDateTime($seconds, $from = null)
73 {
74 if ($from === null)
75 {
76 $from = static::getCurrentDateTimeFunction();
77 }
78
79 return 'DATE_ADD('.$from.', INTERVAL '.$seconds.' SECOND)';
80 }
81
85 public function addDaysToDateTime($days, $from = null)
86 {
87 if ($from === null)
88 {
89 $from = static::getCurrentDateTimeFunction();
90 }
91
92 return 'DATE_ADD('.$from.', INTERVAL '.$days.' DAY)';
93 }
94
98 public function getDatetimeToDateFunction($value)
99 {
100 return 'DATE('.$value.')';
101 }
102
106 public function formatDate($format, $field = null)
107 {
108 static $search = array(
109 "YYYY",
110 "MMMM",
111 "MM",
112 "MI",
113 "DD",
114 "HH",
115 "GG",
116 "G",
117 "SS",
118 "TT",
119 "T",
120 "W",
121 );
122 static $replace = array(
123 "%Y",
124 "%M",
125 "%m",
126 "%i",
127 "%d",
128 "%H",
129 "%h",
130 "%l",
131 "%s",
132 "%p",
133 "%p",
134 "%w",
135 );
136
137 $format = str_replace($search, $replace, $format);
138
139 if (!str_contains($format, '%H'))
140 {
141 $format = str_replace("H", "%h", $format);
142 }
143
144 if (!str_contains($format, '%M'))
145 {
146 $format = str_replace("M", "%b", $format);
147 }
148
149 if($field === null)
150 {
151 return $format;
152 }
153 else
154 {
155 return "DATE_FORMAT(".$field.", '".$format."')";
156 }
157 }
158
162 public function getConcatFunction()
163 {
164 $str = implode(", ", func_get_args());
165 if ($str != '')
166 {
167 $str = "CONCAT(".$str.")";
168 }
169 return $str;
170 }
171
175 public function getIsNullFunction($expression, $result)
176 {
177 return "IFNULL(".$expression.", ".$result.")";
178 }
179
183 public function getLengthFunction($field)
184 {
185 return "LENGTH(".$field.")";
186 }
187
191 public function getCharToDateFunction($value)
192 {
193 return "'".$value."'";
194 }
195
199 public function getDateToCharFunction($fieldName)
200 {
201 return $fieldName;
202 }
203
207 public function getConverter(ScalarField $field)
208 {
209 if($field instanceof ORM\Fields\DatetimeField)
210 {
211 return array($this, "convertFromDbDateTime");
212 }
213 elseif($field instanceof ORM\Fields\DateField)
214 {
215 return array($this, "convertFromDbDate");
216 }
217 else
218 {
219 return parent::getConverter($field);
220 }
221 }
222
226 public function convertFromDbDateTime($value)
227 {
228 if($value !== null && $value != '0000-00-00 00:00:00')
229 {
230 return new Type\DateTime($value, "Y-m-d H:i:s");
231 }
232
233 return null;
234 }
235
239 public function convertFromDbDate($value)
240 {
241 if($value !== null && $value != '0000-00-00')
242 {
243 return new Type\Date($value, "Y-m-d");
244 }
245
246 return null;
247 }
248
252 public function castToChar($fieldName)
253 {
254 return 'CAST('.$fieldName.' AS char)';
255 }
256
260 public function softCastTextToChar($fieldName)
261 {
262 return $fieldName;
263 }
264
268 public function getColumnTypeByField(ScalarField $field)
269 {
270 if ($field instanceof ORM\Fields\IntegerField)
271 {
272 switch ($field->getSize())
273 {
274 case 2:
275 return 'smallint';
276 case 4:
277 return 'int';
278 case 8:
279 return 'bigint';
280 }
281 return 'int';
282 }
283 elseif ($field instanceof ORM\Fields\DecimalField)
284 {
285 $defaultPrecision = 18;
286 $defaultScale = 2;
287
288 $precision = $field->getPrecision() > 0 ? $field->getPrecision() : $defaultPrecision;
289 $scale = $field->getScale() > 0 ? $field->getScale() : $defaultScale;
290
291 if ($scale >= $precision)
292 {
293 $precision = $defaultPrecision;
294 $scale = $defaultScale;
295 }
296
297 return "decimal($precision, $scale)";
298 }
299 elseif ($field instanceof ORM\Fields\FloatField)
300 {
301 return 'double';
302 }
303 elseif ($field instanceof ORM\Fields\DatetimeField)
304 {
305 return 'datetime';
306 }
307 elseif ($field instanceof ORM\Fields\DateField)
308 {
309 return 'date';
310 }
311 elseif ($field instanceof ORM\Fields\TextField)
312 {
313 return $field->isLong() ? 'longtext' : 'text';
314 }
315 elseif ($field instanceof ORM\Fields\BooleanField)
316 {
317 $values = $field->getValues();
318
319 if (preg_match('/^[0-9]+$/', $values[0]) && preg_match('/^[0-9]+$/', $values[1]))
320 {
321 return 'int';
322 }
323 else
324 {
325 $falseLen = mb_strlen($values[0]);
326 $trueLen = mb_strlen($values[1]);
327 if ($falseLen === 1 && $trueLen === 1)
328 {
329 return 'char(1)';
330 }
331 return 'varchar(' . max($falseLen, $trueLen) . ')';
332 }
333 }
334 elseif ($field instanceof ORM\Fields\EnumField)
335 {
336 return 'varchar('.max(array_map('mb_strlen', $field->getValues())).')';
337 }
338 else
339 {
340 // string by default
341 $defaultLength = false;
342 foreach ($field->getValidators() as $validator)
343 {
344 if ($validator instanceof ORM\Fields\Validators\LengthValidator)
345 {
346 if ($defaultLength === false || $defaultLength > $validator->getMax())
347 {
348 $defaultLength = $validator->getMax();
349 }
350 }
351 }
352 return 'varchar('.($defaultLength > 0? $defaultLength: 255).')';
353 }
354 }
355
359 public function getTopSql($sql, $limit, $offset = 0)
360 {
361 $offset = intval($offset);
362 $limit = intval($limit);
363
364 if ($offset > 0 && $limit <= 0)
365 throw new \Bitrix\Main\ArgumentException("Limit must be set if offset is set");
366
367 if ($limit > 0)
368 {
369 $sql .= "\nLIMIT ".$offset.", ".$limit."\n";
370 }
371
372 return $sql;
373 }
374
378 public function prepareMerge($tableName, array $primaryFields, array $insertFields, array $updateFields)
379 {
380 $insert = $this->prepareInsert($tableName, $insertFields);
381 $update = $this->prepareUpdate($tableName, $updateFields);
382
383 if (!empty($insert[0]) && !empty($insert[1]) && !empty($update[0]))
384 {
385 $sql = "
386 INSERT INTO ".$this->quote($tableName)." (".$insert[0].")
387 VALUES (".$insert[1].")
388 ON DUPLICATE KEY UPDATE ".$update[0]."
389 ";
390 }
391 else
392 {
393 $sql = "";
394 }
395
396 return array(
397 $sql
398 );
399 }
400
404 public function forSql($value, $maxLength = 0)
405 {
406 if ($maxLength > 0)
407 $value = mb_substr($value, 0, $maxLength);
408
409 $con = $this->connection->getResource();
410
411 return $con->real_escape_string($value);
412 }
413
417 public function getFieldByColumnType($name, $type, array $parameters = null)
418 {
419 switch($type)
420 {
421 case MYSQLI_TYPE_TINY:
422 case MYSQLI_TYPE_SHORT:
423 $field = (new ORM\Fields\IntegerField($name))->configureSize(2);
424 break;
425 case MYSQLI_TYPE_LONG:
426 case MYSQLI_TYPE_INT24:
427 case MYSQLI_TYPE_CHAR:
428 $field = (new ORM\Fields\IntegerField($name))->configureSize(4);
429 break;
430 case MYSQLI_TYPE_LONGLONG:
431 $field = ((new ORM\Fields\IntegerField($name)))->configureSize(8);
432 break;
433 case MYSQLI_TYPE_DECIMAL:
434 case MYSQLI_TYPE_NEWDECIMAL:
435 case MYSQLI_TYPE_FLOAT:
436 case MYSQLI_TYPE_DOUBLE:
437 $field = new ORM\Fields\FloatField($name);
438 break;
439 case MYSQLI_TYPE_DATETIME:
440 case MYSQLI_TYPE_TIMESTAMP:
441 $field = new ORM\Fields\DatetimeField($name);
442 break;
443 case MYSQLI_TYPE_DATE:
444 case MYSQLI_TYPE_NEWDATE:
445 $field = new ORM\Fields\DateField($name);
446 break;
447 default:
448 $field = new ORM\Fields\StringField($name);
449 }
450 //MYSQLI_TYPE_BIT
451 //MYSQLI_TYPE_TIME
452 //MYSQLI_TYPE_YEAR
453 //MYSQLI_TYPE_INTERVAL
454 //MYSQLI_TYPE_ENUM
455 //MYSQLI_TYPE_SET
456 //MYSQLI_TYPE_TINY_BLOB
457 //MYSQLI_TYPE_MEDIUM_BLOB
458 //MYSQLI_TYPE_LONG_BLOB
459 //MYSQLI_TYPE_BLOB
460 //MYSQLI_TYPE_VAR_STRING
461 //MYSQLI_TYPE_STRING
462 //MYSQLI_TYPE_GEOMETRY
463
464 $field->setConnection($this->connection);
465
466 return $field;
467 }
468
472 public function getInsertIgnore($tableName, $fields, $sql)
473 {
474 return 'INSERT IGNORE INTO ' . $tableName . $fields . $sql;
475 }
476
480 public function getRegexpOperator($field, $regexp)
481 {
482 return $field . ' regexp ' . $regexp;
483 }
484
488 public function getIlikeOperator($field, $value)
489 {
490 return $field . ' LIKE ' . $value;
491 }
492
496 public function values($identifier)
497 {
498 return 'VALUES(' . $this->quote($identifier) . ')';
499 }
500
501 public function getMatchFunction($field, $value)
502 {
503 return "MATCH (" . $field . ") AGAINST (" . $value . " IN BOOLEAN MODE)";
504 }
505
506 public function getMatchAndExpression($values, $prefixSearch = false)
507 {
508 if ($prefixSearch)
509 {
510 foreach ($values as $i => $searchTerm)
511 {
512 $values[$i] = $searchTerm . '*';
513 }
514 }
515 return '+' . implode(' +', $values);
516 }
517
518 public function getMatchOrExpression($values, $prefixSearch = false)
519 {
520 if ($prefixSearch)
521 {
522 foreach ($values as $i => $searchTerm)
523 {
524 $values[$i] = $searchTerm . '*';
525 }
526 }
527 return implode(' ', $values);
528 }
529
533 public function prepareMergeMultiple($tableName, array $primaryFields, array $insertRows)
534 {
535 $result = [];
536 $head = '';
537 $maxBodySize = 1024*1024; //1 Mb
538 $body = [];
539 $bodySize = 0;
540 foreach ($insertRows as $insertFields)
541 {
542 $insert = $this->prepareInsert($tableName, $insertFields);
543 if (!$head && $insert && $insert[0])
544 {
545 $head = 'REPLACE INTO ' . $this->quote($tableName) . ' (' . $insert[0] . ') VALUES ';
546 }
547 if ($insert && $insert[1])
548 {
549 $values = '(' . $insert[1] . ')';
550 $bodySize += mb_strlen($values) + 4;
551 $body[] = $values;
552 if ($bodySize > $maxBodySize)
553 {
554 $result[] = $head.implode(', ', $body);
555 $body = [];
556 $bodySize = 0;
557 }
558 }
559 }
560 if ($body)
561 {
562 $result[] = $head.implode(', ', $body);
563 }
564
565 return $result;
566 }
567
571 public function prepareMergeSelect($tableName, array $primaryFields, array $selectFields, $select, $updateFields)
572 {
573 $update = [];
574
575 $tableFields = $this->connection->getTableFields($tableName);
576 // one registry
577 $tableFields = array_change_key_case($tableFields, CASE_UPPER);
578 $updateFields = array_change_key_case($updateFields, CASE_UPPER);
579 foreach ($updateFields as $columnName => $value)
580 {
581 if (isset($tableFields[$columnName]))
582 {
583 $update[] = $this->quote($columnName) . ' = '. $this->convertToDb($value, $tableFields[$columnName]);
584 }
585 else
586 {
587 trigger_error("Column `{$columnName}` is not found in the `{$tableName}` table", E_USER_WARNING);
588 }
589 }
590
591 $sql = 'INSERT INTO ' . $this->quote($tableName) . ' (' . implode(',', array_map([$this, 'quote'], $selectFields)) . ') ';
592 $sql .= $select;
593 $sql .= ' ON DUPLICATE KEY UPDATE ' . implode(',', $update);
594
595 return $sql;
596 }
597
601 public function prepareDeleteLimit($tableName, array $primaryFields, $where, array $order, $limit)
602 {
603 $orderColumns = [];
604 foreach ($order as $columnName => $sort)
605 {
606 $orderColumns[] = $this->quote($columnName) . ' ' . $sort;
607 }
608 $sqlOrder = $orderColumns ? ' ORDER BY ' . implode(', ', $orderColumns) : '';
609 return 'DELETE FROM ' . $this->quote($tableName) . ' WHERE ' . $where . $sqlOrder . ' LIMIT ' . intval($limit);
610 }
611
612 public function initRowNumber($variableName)
613 {
614 return 'set @' . $variableName . ' = 0';
615 }
616
617 public function getRowNumber($variableName)
618 {
619 return '@' . $variableName . ':=' . '@' . $variableName . ' + 1';
620 }
621
625 public function prepareCorrelatedUpdate($tableName, $tableAlias, $fields, $from, $where)
626 {
627 $dml = "UPDATE " . $tableName . ' AS ' . $tableAlias . ",\n";
628 $dml .= $from . "\n";
629
630 $set = '';
631 foreach ($fields as $fieldName => $fieldValue)
632 {
633 $set .= ($set ? ',' : '') . $tableAlias . '.' . $fieldName . ' = ' .$fieldValue . "\n";
634 }
635 $dml .= 'SET ' . $set;
636 $dml .= 'WHERE ' . $where . "\n";
637
638 return $dml;
639 }
640
641 protected function getOrderByField(string $field, array $values, callable $callback, bool $quote = true): string
642 {
643 $field = $quote ? $this->quote($field) : $field;
644 $values = implode(',', array_map($callback, $values));
645
646 return "FIELD({$field}, {$values})";
647 }
648
652 public function isBigType($type): bool
653 {
654 $result = match ($type)
655 {
656 MYSQLI_TYPE_TINY_BLOB, MYSQLI_TYPE_MEDIUM_BLOB, MYSQLI_TYPE_LONG_BLOB, MYSQLI_TYPE_BLOB => true,
657 default => false,
658 };
659
660 if (!$result && defined('MYSQLI_TYPE_JSON'))
661 {
662 $result = ($type === MYSQLI_TYPE_JSON);
663 }
664
665 return $result;
666 }
667}
$con
Определения admin_tab.php:7
$type
Определения options.php:106
softCastTextToChar($fieldName)
Определения mysqlisqlhelper.php:260
getOrderByField(string $field, array $values, callable $callback, bool $quote=true)
Определения mysqlisqlhelper.php:641
prepareMergeMultiple($tableName, array $primaryFields, array $insertRows)
Определения mysqlisqlhelper.php:533
getMatchFunction($field, $value)
Определения mysqlisqlhelper.php:501
getTopSql($sql, $limit, $offset=0)
Определения mysqlisqlhelper.php:359
getIsNullFunction($expression, $result)
Определения mysqlisqlhelper.php:175
getDateToCharFunction($fieldName)
Определения mysqlisqlhelper.php:199
getIlikeOperator($field, $value)
Определения mysqlisqlhelper.php:488
formatDate($format, $field=null)
Определения mysqlisqlhelper.php:106
getRegexpOperator($field, $regexp)
Определения mysqlisqlhelper.php:480
getDatetimeToDateFunction($value)
Определения mysqlisqlhelper.php:98
prepareDeleteLimit($tableName, array $primaryFields, $where, array $order, $limit)
Определения mysqlisqlhelper.php:601
castToChar($fieldName)
Определения mysqlisqlhelper.php:252
addDaysToDateTime($days, $from=null)
Определения mysqlisqlhelper.php:85
getFieldByColumnType($name, $type, array $parameters=null)
Определения mysqlisqlhelper.php:417
getColumnTypeByField(ScalarField $field)
Определения mysqlisqlhelper.php:268
initRowNumber($variableName)
Определения mysqlisqlhelper.php:612
getConverter(ScalarField $field)
Определения mysqlisqlhelper.php:207
prepareCorrelatedUpdate($tableName, $tableAlias, $fields, $from, $where)
Определения mysqlisqlhelper.php:625
getMatchAndExpression($values, $prefixSearch=false)
Определения mysqlisqlhelper.php:506
getLengthFunction($field)
Определения mysqlisqlhelper.php:183
getMatchOrExpression($values, $prefixSearch=false)
Определения mysqlisqlhelper.php:518
forSql($value, $maxLength=0)
Определения mysqlisqlhelper.php:404
convertFromDbDateTime($value)
Определения mysqlisqlhelper.php:226
addSecondsToDateTime($seconds, $from=null)
Определения mysqlisqlhelper.php:72
convertFromDbDate($value)
Определения mysqlisqlhelper.php:239
prepareMergeSelect($tableName, array $primaryFields, array $selectFields, $select, $updateFields)
Определения mysqlisqlhelper.php:571
getCharToDateFunction($value)
Определения mysqlisqlhelper.php:191
values($identifier)
Определения mysqlisqlhelper.php:496
getInsertIgnore($tableName, $fields, $sql)
Определения mysqlisqlhelper.php:472
prepareMerge($tableName, array $primaryFields, array $insertFields, array $updateFields)
Определения mysqlisqlhelper.php:378
getRowNumber($variableName)
Определения mysqlisqlhelper.php:617
prepareUpdate($tableName, array $fields)
Определения sqlhelper.php:382
prepareInsert($tableName, array $fields, $returnAsArray=false)
Определения sqlhelper.php:342
convertToDb($value, ORM\Fields\IReadable $field=null)
Определения sqlhelper.php:461
quote($identifier)
Определения sqlhelper.php:65
getValidators()
Определения field.php:236
Определения date.php:9
$str
Определения commerceml2.php:63
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$select
Определения iblock_catalog_list.php:194
$selectFields
Определения iblock_catalog_list.php:160
$name
Определения menu_edit.php:35
$order
Определения payment.php:8
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$i
Определения factura.php:643
$precision
Определения template.php:403
$fields
Определения yandex_run.php:501