Пример #1
0
 /**
  * Returns a column type according to ScalarField object.
  *
  * @param Entity\ScalarField $field Type "source".
  *
  * @return string
  */
 public function getColumnTypeByField(Entity\ScalarField $field)
 {
     if ($field instanceof Entity\IntegerField) {
         return 'number(18)';
     } elseif ($field instanceof Entity\FloatField) {
         $scale = $field->getScale();
         return 'number' . ($scale !== null ? "(*," . $scale . ")" : "");
     } elseif ($field instanceof Entity\DatetimeField) {
         return 'date';
     } elseif ($field instanceof Entity\DateField) {
         return 'date';
     } elseif ($field instanceof Entity\TextField) {
         return 'clob';
     } elseif ($field instanceof Entity\BooleanField) {
         $values = $field->getValues();
         if (preg_match('/^[0-9]+$/', $values[0]) && preg_match('/^[0-9]+$/', $values[1])) {
             return 'number(1)';
         } else {
             return 'varchar2(' . max(strlen($values[0]), strlen($values[1])) . ' char)';
         }
     } elseif ($field instanceof Entity\EnumField) {
         return 'varchar2(' . max(array_map('strlen', $field->getValues())) . ' char)';
     } else {
         // string by default
         $defaultLength = false;
         foreach ($field->getValidators() as $validator) {
             if ($validator instanceof Entity\Validator\Length) {
                 if ($defaultLength === false || $defaultLength > $validator->getMax()) {
                     $defaultLength = $validator->getMax();
                 }
             }
         }
         return 'varchar2(' . ($defaultLength > 0 ? $defaultLength : 255) . ' char)';
     }
 }
Пример #2
0
 /**
  * Converts values to the string according to the column type to use it in a SQL query.
  *
  * @param mixed $value Value to be converted.
  * @param Entity\ScalarField $field Type "source".
  *
  * @return string Value to write to column.
  * @throws \Bitrix\Main\ArgumentTypeException
  */
 public function convertToDb($value, Entity\ScalarField $field)
 {
     if ($value === null) {
         return "NULL";
     }
     if ($value instanceof SqlExpression) {
         return $value->compile();
     }
     if ($field instanceof Entity\DatetimeField) {
         if (empty($value)) {
             $result = "NULL";
         } elseif ($value instanceof Type\Date) {
             if ($value instanceof Type\DateTime) {
                 $value = clone $value;
                 $value->setDefaultTimeZone();
             }
             $result = $this->getCharToDateFunction($value->format("Y-m-d H:i:s"));
         } else {
             throw new Main\ArgumentTypeException('value', '\\Bitrix\\Main\\Type\\Date');
         }
     } elseif ($field instanceof Entity\DateField) {
         if (empty($value)) {
             $result = "NULL";
         } elseif ($value instanceof Type\Date) {
             $result = $this->getCharToDateFunction($value->format("Y-m-d"));
         } else {
             throw new Main\ArgumentTypeException('value', '\\Bitrix\\Main\\Type\\Date');
         }
     } elseif ($field instanceof Entity\IntegerField) {
         $result = "'" . intval($value) . "'";
     } elseif ($field instanceof Entity\FloatField) {
         if (($scale = $field->getScale()) !== null) {
             $result = "'" . round(doubleval($value), $scale) . "'";
         } else {
             $result = "'" . doubleval($value) . "'";
         }
     } elseif ($field instanceof Entity\StringField) {
         $result = "'" . $this->forSql($value, $field->getSize()) . "'";
     } else {
         $result = "'" . $this->forSql($value) . "'";
     }
     return $result;
 }