10namespace Bitrix\Main\DB;
14use Bitrix\Main\ORM\Fields\ScalarField;
76 $from = static::getCurrentDateTimeFunction();
79 return 'DATE_ADD('.$from.
', INTERVAL '.$seconds.
' SECOND)';
89 $from = static::getCurrentDateTimeFunction();
92 return 'DATE_ADD('.$from.
', INTERVAL '.$days.
' DAY)';
100 return 'DATE('.$value.
')';
108 static $search =
array(
122 static $replace =
array(
137 $format = str_replace($search, $replace, $format);
139 if (!str_contains($format,
'%H'))
141 $format = str_replace(
"H",
"%h", $format);
144 if (!str_contains($format,
'%M'))
146 $format = str_replace(
"M",
"%b", $format);
155 return "DATE_FORMAT(".$field.
", '".$format.
"')";
164 $str = implode(
", ", func_get_args());
167 $str =
"CONCAT(".$str.
")";
177 return "IFNULL(".$expression.
", ".
$result.
")";
185 return "LENGTH(".$field.
")";
193 return "'".$value.
"'";
211 return array($this,
"convertFromDbDateTime");
215 return array($this,
"convertFromDbDate");
219 return parent::getConverter($field);
228 if($value !==
null && $value !=
'0000-00-00 00:00:00')
241 if($value !==
null && $value !=
'0000-00-00')
254 return 'CAST('.$fieldName.
' AS char)';
272 switch ($field->getSize())
285 $defaultPrecision = 18;
288 $precision = $field->getPrecision() > 0 ? $field->getPrecision() : $defaultPrecision;
289 $scale = $field->getScale() > 0 ? $field->getScale() : $defaultScale;
294 $scale = $defaultScale;
297 return "decimal($precision, $scale)";
313 return $field->isLong() ?
'longtext' :
'text';
317 $values = $field->getValues();
319 if (preg_match(
'/^[0-9]+$/', $values[0]) && preg_match(
'/^[0-9]+$/', $values[1]))
325 $falseLen = mb_strlen($values[0]);
326 $trueLen = mb_strlen($values[1]);
327 if ($falseLen === 1 && $trueLen === 1)
331 return 'varchar(' . max($falseLen, $trueLen) .
')';
336 return 'varchar('.max(array_map(
'mb_strlen', $field->getValues())).
')';
341 $defaultLength =
false;
346 if ($defaultLength ===
false || $defaultLength > $validator->getMax())
348 $defaultLength = $validator->getMax();
352 return 'varchar('.($defaultLength > 0? $defaultLength: 255).
')';
361 $offset = intval($offset);
362 $limit = intval($limit);
364 if ($offset > 0 && $limit <= 0)
365 throw new \Bitrix\Main\ArgumentException(
"Limit must be set if offset is set");
369 $sql .=
"\nLIMIT ".$offset.
", ".$limit.
"\n";
383 if (!empty($insert[0]) && !empty($insert[1]) && !empty($update[0]))
386 INSERT INTO ".$this->quote($tableName).
" (".$insert[0].
")
387 VALUES (".$insert[1].
")
388 ON DUPLICATE KEY UPDATE ".$update[0].
"
404 public function forSql($value, $maxLength = 0)
407 $value = mb_substr($value, 0, $maxLength);
409 $con = $this->connection->getResource();
411 return $con->real_escape_string($value);
421 case MYSQLI_TYPE_TINY:
422 case MYSQLI_TYPE_SHORT:
425 case MYSQLI_TYPE_LONG:
426 case MYSQLI_TYPE_INT24:
427 case MYSQLI_TYPE_CHAR:
430 case MYSQLI_TYPE_LONGLONG:
433 case MYSQLI_TYPE_DECIMAL:
434 case MYSQLI_TYPE_NEWDECIMAL:
435 case MYSQLI_TYPE_FLOAT:
436 case MYSQLI_TYPE_DOUBLE:
439 case MYSQLI_TYPE_DATETIME:
440 case MYSQLI_TYPE_TIMESTAMP:
443 case MYSQLI_TYPE_DATE:
444 case MYSQLI_TYPE_NEWDATE:
464 $field->setConnection($this->connection);
474 return 'INSERT IGNORE INTO ' . $tableName .
$fields . $sql;
482 return $field .
' regexp ' . $regexp;
490 return $field .
' LIKE ' . $value;
498 return 'VALUES(' . $this->
quote($identifier) .
')';
503 return "MATCH (" . $field .
") AGAINST (" . $value .
" IN BOOLEAN MODE)";
510 foreach ($values as
$i => $searchTerm)
512 $values[
$i] = $searchTerm .
'*';
515 return '+' . implode(
' +', $values);
522 foreach ($values as
$i => $searchTerm)
524 $values[
$i] = $searchTerm .
'*';
527 return implode(
' ', $values);
537 $maxBodySize = 1024*1024;
540 foreach ($insertRows as $insertFields)
543 if (!$head && $insert && $insert[0])
545 $head =
'REPLACE INTO ' . $this->
quote($tableName) .
' (' . $insert[0] .
') VALUES ';
547 if ($insert && $insert[1])
549 $values =
'(' . $insert[1] .
')';
550 $bodySize += mb_strlen($values) + 4;
552 if ($bodySize > $maxBodySize)
554 $result[] = $head.implode(
', ', $body);
562 $result[] = $head.implode(
', ', $body);
575 $tableFields = $this->connection->getTableFields($tableName);
577 $tableFields = array_change_key_case($tableFields, CASE_UPPER);
578 $updateFields = array_change_key_case($updateFields, CASE_UPPER);
579 foreach ($updateFields as $columnName => $value)
581 if (isset($tableFields[$columnName]))
583 $update[] = $this->
quote($columnName) .
' = '. $this->
convertToDb($value, $tableFields[$columnName]);
587 trigger_error(
"Column `{$columnName}` is not found in the `{$tableName}` table", E_USER_WARNING);
591 $sql =
'INSERT INTO ' . $this->
quote($tableName) .
' (' . implode(
',', array_map([$this,
'quote'],
$selectFields)) .
') ';
593 $sql .=
' ON DUPLICATE KEY UPDATE ' . implode(
',', $update);
604 foreach (
$order as $columnName => $sort)
606 $orderColumns[] = $this->
quote($columnName) .
' ' . $sort;
608 $sqlOrder = $orderColumns ?
' ORDER BY ' . implode(
', ', $orderColumns) :
'';
609 return 'DELETE FROM ' . $this->
quote($tableName) .
' WHERE ' . $where . $sqlOrder .
' LIMIT ' . intval($limit);
614 return 'set @' . $variableName .
' = 0';
619 return '@' . $variableName .
':=' .
'@' . $variableName .
' + 1';
627 $dml =
"UPDATE " . $tableName .
' AS ' . $tableAlias .
",\n";
628 $dml .= $from .
"\n";
631 foreach (
$fields as $fieldName => $fieldValue)
633 $set .= ($set ?
',' :
'') . $tableAlias .
'.' . $fieldName .
' = ' .$fieldValue .
"\n";
635 $dml .=
'SET ' . $set;
636 $dml .=
'WHERE ' . $where .
"\n";
641 protected function getOrderByField(
string $field,
array $values, callable $callback,
bool $quote =
true): string
643 $field = $quote ? $this->
quote($field) : $field;
644 $values = implode(
',', array_map($callback, $values));
646 return "FIELD({$field}, {$values})";
656 MYSQLI_TYPE_TINY_BLOB, MYSQLI_TYPE_MEDIUM_BLOB, MYSQLI_TYPE_LONG_BLOB, MYSQLI_TYPE_BLOB =>
true,
660 if (!
$result && defined(
'MYSQLI_TYPE_JSON'))
softCastTextToChar($fieldName)
getOrderByField(string $field, array $values, callable $callback, bool $quote=true)
prepareMergeMultiple($tableName, array $primaryFields, array $insertRows)
getMatchFunction($field, $value)
getTopSql($sql, $limit, $offset=0)
getIsNullFunction($expression, $result)
getDateToCharFunction($fieldName)
getIlikeOperator($field, $value)
formatDate($format, $field=null)
getRegexpOperator($field, $regexp)
getDatetimeToDateFunction($value)
prepareDeleteLimit($tableName, array $primaryFields, $where, array $order, $limit)
addDaysToDateTime($days, $from=null)
getFieldByColumnType($name, $type, array $parameters=null)
getColumnTypeByField(ScalarField $field)
initRowNumber($variableName)
getConverter(ScalarField $field)
prepareCorrelatedUpdate($tableName, $tableAlias, $fields, $from, $where)
getMatchAndExpression($values, $prefixSearch=false)
getLengthFunction($field)
getMatchOrExpression($values, $prefixSearch=false)
forSql($value, $maxLength=0)
getCurrentDateTimeFunction()
convertFromDbDateTime($value)
addSecondsToDateTime($seconds, $from=null)
convertFromDbDate($value)
prepareMergeSelect($tableName, array $primaryFields, array $selectFields, $select, $updateFields)
getCharToDateFunction($value)
getInsertIgnore($tableName, $fields, $sql)
prepareMerge($tableName, array $primaryFields, array $insertFields, array $updateFields)
getRowNumber($variableName)
prepareUpdate($tableName, array $fields)
prepareInsert($tableName, array $fields, $returnAsArray=false)
convertToDb($value, ORM\Fields\IReadable $field=null)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)