- Модуль: 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;
}