• Модуль: perfmon
  • Путь к файлу: ~/bitrix/modules/perfmon/lib/sql/table.php
  • Класс: BitrixPerfmonSqlTable
  • Вызов: Table::create
static function create(Tokenizer $tokenizer)
{
	$tokenizer->skipWhiteSpace();

	if ($tokenizer->testUpperText('IF'))
	{
		$tokenizer->skipWhiteSpace();

		if ($tokenizer->testUpperText('NOT'))
			$tokenizer->skipWhiteSpace();

		if ($tokenizer->testUpperText('EXISTS'))
			$tokenizer->skipWhiteSpace();
	}

	$table = new Table($tokenizer->getCurrentToken()->text);

	$tokenizer->nextToken();
	$tokenizer->skipWhiteSpace();

	if ($tokenizer->testText('('))
	{
		$tokenizer->skipWhiteSpace();

		$token = $tokenizer->getCurrentToken();
		$level = $token->level;
		do
		{
			if (
				$tokenizer->testUpperText('INDEX')
				|| $tokenizer->testUpperText('KEY')
			)
			{
				$tokenizer->skipWhiteSpace();
				$table->createIndex($tokenizer, false);
			}
			elseif ($tokenizer->testUpperText('UNIQUE'))
			{
				$tokenizer->skipWhiteSpace();
				if ($tokenizer->testUpperText('KEY'))
					$tokenizer->skipWhiteSpace();
				elseif ($tokenizer->testUpperText('INDEX'))
					$tokenizer->skipWhiteSpace();
				$table->createIndex($tokenizer, true);
			}
			elseif ($tokenizer->testUpperText('FULLTEXT'))
			{
				$tokenizer->skipWhiteSpace();
				if ($tokenizer->testUpperText('KEY'))
					$tokenizer->skipWhiteSpace();
				elseif ($tokenizer->testUpperText('INDEX'))
					$tokenizer->skipWhiteSpace();
				$table->createIndex($tokenizer, false, true);
			}
			elseif ($tokenizer->testUpperText('PRIMARY'))
			{
				$tokenizer->skipWhiteSpace();
				if (!$tokenizer->testUpperText('KEY'))
					throw new NotSupportedException("'KEY' expected. line:".$tokenizer->getCurrentToken()->line);

				$tokenizer->putBack(); //KEY
				$tokenizer->putBack(); //WS
				$tokenizer->putBack(); //PRIMARY
				$table->createConstraint($tokenizer, false);
			}
			elseif ($tokenizer->testUpperText('CONSTRAINT'))
			{
				$tokenizer->skipWhiteSpace();
				$constraintName = $tokenizer->getCurrentToken()->text;

				$tokenizer->nextToken();
				$tokenizer->skipWhiteSpace();

				if ($tokenizer->testUpperText('PRIMARY') || $tokenizer->testUpperText('UNIQUE'))
				{
					$tokenizer->putBack();
					$table->createConstraint($tokenizer, $constraintName);
				}
				elseif ($tokenizer->testUpperText('FOREIGN'))
				{
					$tokenizer->putBack();
					$table->createConstraint($tokenizer, $constraintName);
				}
				else
				{
					throw new NotSupportedException("'PRIMARY KEY' expected. line:".$tokenizer->getCurrentToken()->line);
				}
			}
			elseif ($tokenizer->testUpperText(')'))
			{
				break;
			}
			else
			{
				$table->createColumn($tokenizer);
			}

			$tokenizer->skipWhiteSpace();

			$token = $tokenizer->getCurrentToken();

			if ($token->level == $level && $token->text == ',')
			{
				$token = $tokenizer->nextToken();
			}
			elseif ($token->level < $level && $token->text == ')')
			{
				$tokenizer->nextToken();
				break;
			}
			else
			{
				throw new NotSupportedException("',' or ')' expected got (".$token->text."). line:".$token->line);
			}

			$tokenizer->skipWhiteSpace();
		}
		while (!$tokenizer->endOfInput() && $token->level >= $level);

		$suffix = '';
		while (!$tokenizer->endOfInput())
		{
			$suffix .= $tokenizer->getCurrentToken()->text;
			$tokenizer->nextToken();
		}
		if ($suffix)
			$table->setBody($suffix);
	}
	else
	{
		throw new NotSupportedException("'(' expected. line:".$tokenizer->getCurrentToken()->line);
	}

	return $table;
}