• Модуль: perfmon
  • Путь к файлу: ~/bitrix/modules/perfmon/lib/sql/column.php
  • Класс: BitrixPerfmonSqlColumn
  • Вызов: Column::create
static function create(Tokenizer $tokenizer)
{
	$columnName = $tokenizer->getCurrentToken()->text;

	$tokenizer->nextToken();
	$tokenizer->skipWhiteSpace();
	$token = $tokenizer->getCurrentToken();

	$columnType = $token->upper;
	if (!self::checkType($columnType))
	{
		throw new NotSupportedException("column type expected but [".$tokenizer->getCurrentToken()->text."] found. line: ".$tokenizer->getCurrentToken()->line);
	}

	$column = new self($columnName);
	$column->type = $columnType;

	$level = $token->level;
	$lengthLevel = -1;
	$columnDefinition = '';
	do
	{
		if ($token->level == $level && $token->text == ',')
			break;
		if ($token->level < $level && $token->text == ')')
			break;
		
		$columnDefinition .= $token->text;

		if ($token->upper === 'NOT')
			$column->nullable = false;
		elseif ($token->upper === 'DEFAULT')
			$column->default = false;
		elseif ($column->default === false)
		{
			if ($token->type !== Token::T_WHITESPACE && $token->type !== Token::T_COMMENT)
			{
				$column->default = $token->text;
			}
		}

		$token = $tokenizer->nextToken();

		//parentheses after type
		if ($lengthLevel == -1)
		{
			if ($token->text == '(')
			{
				if ($column->type === 'ENUM')
				{
					$lengthLevel = $token->level;
					while (!$tokenizer->endOfInput())
					{
						$columnDefinition .= $token->text;

						$token = $tokenizer->nextToken();

						if ($token->level == $lengthLevel && $token->text == ')')
							break;

						if ($token->type == Token::T_SINGLE_QUOTE)
						{
							$column->enum[] = trim($token->text, "'");
						}
						elseif ($token->type == Token::T_DOUBLE_QUOTE)
						{
							$column->enum[] = trim($token->text, '"');
						}
					}
				}
				else
				{
					$lengthLevel = $token->level;
					while (!$tokenizer->endOfInput())
					{
						$columnDefinition .= $token->text;

						$token = $tokenizer->nextToken();

						if ($token->level == $lengthLevel && $token->text == ')')
							break;

						if ($token->type == Token::T_STRING)
						{
							if (!$column->length)
							{
								$column->length = (int)$token->text;
							}
							else
							{
								$column->precision = (int)$token->text;
							}
						}
					}
				}
			}
			elseif ($token->type !== Token::T_WHITESPACE && $token->type !== Token::T_COMMENT)
			{
				$lengthLevel = 0;
			}
		}
	}
	while (!$tokenizer->endOfInput());

	$column->setBody($columnDefinition);

	return $column;
}