/** * Creates table object from tokens. * <p> * Current position should point to the name of the sequence or 'if not exists' clause. * * @param Tokenizer $tokenizer Tokens collection. * * @return Table * @throws NotSupportedException */ public 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('PRIMARY')) { $tokenizer->skipWhiteSpace(); if (!$tokenizer->testUpperText('KEY')) { throw new NotSupportedException("'KEY' expected. line:" . $tokenizer->getCurrentToken()->line); } $tokenizer->skipWhiteSpace(); $table->createIndex($tokenizer, true); } 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. 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; }