3namespace Bitrix\Main\DB;
7use Bitrix\Main\ORM\Fields\ScalarField;
38 public function quote($identifier)
40 return parent::quote(mb_strtoupper($identifier));
48 return "(?<!\\*)/(?!\\*)";
54 function forSql($value, $maxLength = 0)
56 if ($maxLength <= 0 || $maxLength > 2000)
59 $value = mb_substr($value, 0, $maxLength);
64 if (preg_match_all(
'%(
66 |[\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
67 |\xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
68 |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
69 |\xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
70 |\xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
71 |[\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
72 |\xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
73 )+%x', $value, $match))
74 $value = implode(
' ', $match[0]);
78 return str_replace(
"'",
"''", $value);
94 return "TRUNC(SYSDATE)";
104 $from = static::getCurrentDateTimeFunction();
107 return '('.$from.
'+'.$seconds.
'/86400)';
115 return 'TRUNC('.$value.
')';
123 $format = str_replace(
"HH",
"HH24", $format);
124 $format = str_replace(
"GG",
"HH24", $format);
126 if (!str_contains($format,
'HH24'))
128 $format = str_replace(
"H",
"HH", $format);
131 $format = str_replace(
"G",
"HH", $format);
133 $format = str_replace(
"MI",
"II", $format);
135 if (str_contains($format,
'MMMM'))
137 $format = str_replace(
"MMMM",
"MONTH", $format);
139 elseif (!str_contains($format,
'MM'))
141 $format = str_replace(
"M",
"MON", $format);
144 $format = str_replace(
"II",
"MI", $format);
146 $format = str_replace(
"TT",
"AM", $format);
147 $format = str_replace(
"T",
"AM", $format);
155 return "TO_CHAR(".$field.
", '".$format.
"')";
164 return implode(
" || ", func_get_args());
172 return "NVL(".$expression.
", ".
$result.
")";
180 return "LENGTH(".$field.
")";
188 return "TO_DATE('".$value.
"', 'YYYY-MM-DD HH24:MI:SS')";
196 return "TO_CHAR(".$fieldName.
", 'YYYY-MM-DD HH24:MI:SS')";
206 foreach ($tableFields as $columnName => $tableField)
212 $binds[$columnName] =
$fields[$columnName];
227 return array($this,
"convertFromDbDateTime");
231 return array($this,
"convertFromDbText");
235 return array($this,
"convertFromDbString");
239 return parent::getConverter($field);
250 if (mb_strlen($value) == 19)
258 $value =
new Type\DateTime($value.
" 00:00:00",
"d-M-y H:i:s");
270 if (is_object($value))
273 $value = $value->load();
284 return empty($value) ?
"NULL" :
"EMPTY_CLOB()";
294 if ((mb_strlen($value) == 19) && preg_match(
"#^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$#", $value))
300 return parent::convertFromDbString($value, $length);
308 return 'TO_CHAR('.$fieldName.
')';
316 return 'dbms_lob.substr('.$fieldName.
', 4000, 1)';
330 $scale = $field->getScale();
331 return 'number'.($scale !==
null?
"(*,".$scale.
")":
"");
347 $values = $field->getValues();
349 if (preg_match(
'/^[0-9]+$/', $values[0]) && preg_match(
'/^[0-9]+$/', $values[1]))
355 $falseLen = mb_strlen($values[0]);
356 $trueLen = mb_strlen($values[1]);
357 if ($falseLen === 1 && $trueLen === 1)
359 return 'char(1 char)';
361 return 'varchar2(' . max($falseLen, $trueLen) .
' char)';
366 return 'varchar2('.max(array_map(
'mb_strlen', $field->getValues())).
' char)';
371 $defaultLength =
false;
376 if ($defaultLength ===
false || $defaultLength > $validator->getMax())
378 $defaultLength = $validator->getMax();
382 return 'varchar2('.($defaultLength > 0? $defaultLength: 255).
' char)';
403 case "BINARY_DOUBLE":
407 if ($parameters[
"precision"] == 0 && $parameters[
"scale"] == -127)
412 if (intval($parameters[
"scale"]) <= 0)
444 $offset = intval($offset);
445 $limit = intval($limit);
447 if ($offset > 0 && $limit <= 0)
448 throw new \Bitrix\Main\ArgumentException(
"Limit must be set if offset is set");
458 "WHERE ROWNUM <= ".$limit;
465 " SELECT rownum_query_alias.*, ROWNUM rownum_alias ".
466 " FROM (".$sql.
") rownum_query_alias ".
467 " WHERE ROWNUM <= ".($offset + $limit).
" ".
469 "WHERE rownum_alias >= ".($offset + 1);
480 return 'ASC NULLS FIRST';
488 return 'DESC NULLS LAST';
498 $updateColumns =
array();
499 $sourceSelectColumns =
array();
500 $targetConnectColumns =
array();
501 $tableFields = $this->connection->getTableFields($tableName);
502 foreach($tableFields as $columnName => $tableField)
504 $quotedName = $this->
quote($columnName);
505 if (in_array($columnName, $primaryFields))
507 $sourceSelectColumns[] = $this->
convertToDb($insertFields[$columnName], $tableField).
" AS ".$quotedName;
508 if($insertFields[$columnName] ===
null)
511 $targetConnectColumns[] =
"(source.".$quotedName.
" IS NULL AND target.".$quotedName.
" IS NULL)";
515 $targetConnectColumns[] =
"(source.".$quotedName.
" = target.".$quotedName.
")";
519 if (isset($updateFields[$columnName]) || array_key_exists($columnName, $updateFields))
521 $updateColumns[] =
"target.".$quotedName.
' = '.$this->
convertToDb($updateFields[$columnName], $tableField);
526 $insert && $insert[0] !=
"" && $insert[1] !=
""
528 && $sourceSelectColumns && $targetConnectColumns
532 MERGE INTO ".$this->quote($tableName).
" target USING (
533 SELECT ".implode(
", ", $sourceSelectColumns).
" FROM dual
537 ".implode(
" AND ", $targetConnectColumns).
"
540 UPDATE SET ".implode(
", ", $updateColumns).
"
541 WHEN NOT MATCHED THEN
542 INSERT (".$insert[0].
")
543 VALUES (".$insert[1].
")
softCastTextToChar($fieldName)
getTopSql($sql, $limit, $offset=0)
getIsNullFunction($expression, $result)
getDateToCharFunction($fieldName)
formatDate($format, $field=null)
getDatetimeToDateFunction($value)
convertFromDbString($value, $length=null)
getFieldByColumnType($name, $type, array $parameters=null)
getColumnTypeByField(ScalarField $field)
getConverter(ScalarField $field)
getLengthFunction($field)
forSql($value, $maxLength=0)
getCurrentDateTimeFunction()
convertFromDbDateTime($value)
addSecondsToDateTime($seconds, $from=null)
getCharToDateFunction($value)
prepareBinds(array $tableFields, array $fields)
prepareMerge($tableName, array $primaryFields, array $insertFields, array $updateFields)
convertFromDbText($value)
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)