3namespace Bitrix\Main\DB;
65 public function quote($identifier)
67 if (empty($this->idCache[$identifier]))
73 if (str_contains($quotedIdentifier,
'.'))
82 return $this->idCache[$identifier];
100 abstract public function forSql($value, $maxLength = 0);
111 return "'" . $this->
forSql($value) .
"'";
124 return "'" . $this->
forSql($value, $maxLength) .
"'";
228 $sql =
'SUBSTR('.$str.
', '.$from;
230 if (!is_null($length))
231 $sql .=
', '.$length;
330 abstract public function getTopSql($sql, $limit, $offset = 0);
347 $tableFields = $this->connection->getTableFields($tableName);
349 $tableFields = array_change_key_case($tableFields, CASE_UPPER);
352 foreach (
$fields as $columnName => $value)
354 if (isset($tableFields[$columnName]))
356 $columns[] = $this->
quote($columnName);
357 $values[] = $this->
convertToDb($value, $tableFields[$columnName]);
361 trigger_error(
"Column `{$columnName}` is not found in the `{$tableName}` table", E_USER_WARNING);
368 $returnAsArray ? $columns : implode(
", ", $columns),
369 $returnAsArray ? $values : implode(
", ", $values),
386 $tableFields = $this->connection->getTableFields($tableName);
389 $tableFields = array_change_key_case($tableFields, CASE_UPPER);
392 foreach (
$fields as $columnName => $value)
394 if (isset($tableFields[$columnName]))
396 $update[] = $this->
quote($columnName).
' = '.$this->
convertToDb($value, $tableFields[$columnName]);
400 trigger_error(
"Column `{$columnName}` is not found in the `{$tableName}` table", E_USER_WARNING);
407 implode(
", ", $update),
448 $tableField = $this->connection->getTableField($tableName, $columnName);
450 return $this->
quote($columnName).
' = '.$this->
convertToDb($value, $tableField);
470 return $value->compile();
473 if (is_a($field,
'\Bitrix\Main\ORM\Fields\StringField'))
475 $size = $field->getSize();
478 $value = mb_substr($value, 0, $size);
484 $result = $field->convertValueToDb($value);
506 return $field->convertValueFromDb($value);
519 $value = intval($value);
522 $value = max(-32768, min(+32767, $value));
526 $value = max(-2147483648, min(+2147483647, $value));
538 return intval($value);
551 $value = doubleval($value);
552 if(!is_finite($value))
557 return $scale !==
null ?
"'".round($value, $scale).
"'" :
"'".$value.
"'";
568 $value = doubleval($value);
570 return $scale !==
null ? round($value, $scale) : $value;
583 return "'".$this->forSql($value, $length).
"'";
596 $value = mb_substr($value, 0, $length);
599 return strval($value);
677 $value = clone($value);
678 $value->setDefaultTimeZone();
796 return 'case when ' . $this->
getSha1Function($field) .
' = ' .
$hash .
' then ' . $field .
' else ' . $value .
' end';
835 return 'sha1(' . $field .
')';
1002 $insertColumns = array_keys($insertRows[array_key_first($insertRows)] ?? []);
1003 $insertValuesStrings = [];
1004 foreach ($insertRows as $row)
1007 $insertValuesStrings[] = $rowValues;
1010 if (empty($updateFields))
1012 $notPrimaryFields = array_diff($insertColumns, $primaryFields);
1013 if (empty($notPrimaryFields))
1015 trigger_error(
"Only primary fields to update, use getInsertIgnore() or specify fields", E_USER_WARNING);
1017 $updateFields = $notPrimaryFields;
1020 $compatibleUpdateFields = [];
1022 foreach ($updateFields as
$key => $value)
1024 if (is_numeric(
$key) && is_string($value))
1026 $compatibleUpdateFields[$value] =
new SqlExpression(
'?v', $value);
1030 $compatibleUpdateFields[
$key] = $value;
1034 $insertValueString =
'values (' . implode(
'),(', $insertValuesStrings) .
')';
1036 return $this->
prepareMergeSelect($tableName, $primaryFields, $insertColumns, $insertValueString, $compatibleUpdateFields);
1048 return $this->
getOrderByField($field, $values, [$this,
'convertToDbString'], $quote);
1060 return $this->
getOrderByField($field, $values, [$this,
'convertFromDbInteger'], $quote);
1073 return $quote ? $this->
quote($field) : $field;
1087 $singleQuotes =
false;
1088 $doubleQuotes =
false;
1090 $isFrom = [0 =>
false];
1091 $isTable = [0 =>
false];
1092 $isIf = [0 =>
false];
1094 $sql = preg_replace(
'/\s\s+/m',
' ', $sql);
1095 $sql = preg_replace(
'/(HOUR|MINUTE|SECOND|YEAR|QUARTER|WEEK|MICROSECOND)(\s+)FROM/is',
'XXX_FROM', $sql);
1097 foreach (preg_split(
'/([,()"\'\\\\]|\s+)/s', $sql, -1, PREG_SPLIT_DELIM_CAPTURE) as $token)
1099 if ($maxLevel > -1 && $level > $maxLevel)
1104 $token = trim($token,
"` ;\t\n\r");
1105 if ($token ===
'\\')
1107 $escaped = !$escaped;
1111 if ($token ===
'"' && !$escaped)
1113 $doubleQuotes = !$doubleQuotes;
1117 if ($token ===
'\'' && !$escaped)
1119 $singleQuotes = !$singleQuotes;
1123 if ($token && !$doubleQuotes && !$singleQuotes)
1127 $isTable[$level] =
false;
1129 $isFrom[$level] =
false;
1130 $isTable[$level] =
false;
1131 $isIf[$level] =
false;
1135 $isTable[$level] =
false;
1143 switch (strtoupper($token))
1146 $isTable[$level] =
true;
1152 $isFrom[$level] =
true;
1153 $isTable[$level] =
true;
1158 $isFrom[$level] =
true;
1159 $isTable[$level] =
true;
1169 $isFrom[$level] =
false;
1173 case 'STRAIGHT_JOIN':
1174 if ($isFrom[$level])
1176 $isTable[$level] =
true;
1180 $isIf[$level] =
true;
1181 $isTable[$level] =
false;
1184 $isTable[$level] =
false;
1187 if ($isTable[$level])
1189 $tables[$token] = $token;
1190 $isTable[$level] =
false;
softCastTextToChar($fieldName)
getOrderByField(string $field, array $values, callable $callback, bool $quote=true)
prepareMergeMultiple($tableName, array $primaryFields, array $insertRows)
getQueryTables(string $sql, int $maxLevel=-1)
convertToDbBinary($value)
getMatchFunction($field, $value)
getOrderByStringField(string $field, array $values, bool $quote=true)
__construct(Connection $connection)
getTopSql($sql, $limit, $offset=0)
convertToDbString($value, $length=null)
getConverter(ORM\Fields\ScalarField $field)
getIsNullFunction($expression, $result)
getDateToCharFunction($fieldName)
convertFromDbInteger($value)
getIlikeOperator($field, $value)
formatDate($format, $field=null)
getRegexpOperator($field, $regexp)
convertToDbInteger($value, $size=8)
getDatetimeToDateFunction($value)
prepareDeleteLimit($tableName, array $primaryFields, $where, array $order, $limit)
convertDatetimeField($value)
prepareUpdate($tableName, array $fields)
convertToDbFloat($value, $scale=null)
getColumnTypeByField(ORM\Fields\ScalarField $field)
convertFromDbString($value, $length=null)
addDaysToDateTime($days, $from=null)
convertFromDbText($value)
getFieldByColumnType($name, $type, array $parameters=null)
convertFromDb($value, ORM\Fields\IReadable $field)
prepareAssignment($tableName, $columnName, $value)
initRowNumber($variableName)
convertToDbDateTime($value)
prepareInsert($tableName, array $fields, $returnAsArray=false)
convertFromDbFloat($value, $scale=null)
getSubstrFunction($str, $from, $length=null)
getConditionalAssignment($field, string $value)
prepareCorrelatedUpdate($tableName, $tableAlias, $fields, $from, $where)
getMatchAndExpression($values, $prefixSearch=false)
convertToDb($value, ORM\Fields\IReadable $field=null)
getLengthFunction($field)
getMatchOrExpression($values, $prefixSearch=false)
forSql($value, $maxLength=0)
getCurrentDateTimeFunction()
convertToFullText($value, $maxLength=0)
convertFromDbDateTime($value)
addSecondsToDateTime($seconds, $from=null)
convertFromDbDate($value)
prepareMergeSelect($tableName, array $primaryFields, array $selectFields, $select, $updateFields)
getCharToDateFunction($value)
prepareMergeValues(string $tableName, array $primaryFields, array $insertRows, array $updateFields=[])
prepareBinds(array $tableFields, array $fields)
getInsertIgnore($tableName, $fields, $sql)
prepareMerge($tableName, array $primaryFields, array $insertFields, array $updateFields)
getOrderByIntField(string $field, array $values, bool $quote=true)
getRowNumber($variableName)
</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)
if(empty($signedUserToken)) $key