Example #1
0
/*
	* Update // Read by parser
	* <table>
	* SET
	* [<column>, <column>, ...]
	* WHERE <expression>
	*
	* <column> := <columnName> = <expression>
	* <table> := identifier
	*/
void Update::Parse(Lexer& lex)
{
	Token t;

	t = lex.NextToken(TokenType::Identifier);
	SetFrom(t.strData);

	// <column>s
	t = lex.NextToken("set", TokenType::Keyword);
	ReadColumns(lex);

	// Don't allow UPDATE without WHERE clause
	//if (lex.endOfStream())
	//	return;

	t = lex.NextToken("where", TokenType::Keyword);
	//if (t.type == TokenType::Keyword && t.strData == "where")
	//{
	SetWhere(ExpressionPredicate(lex, IOperation::GetStandardOperations()));
	//}
	//else
	//{
	//	lex.PutBackToken(t);
	//}
}
Example #2
0
void Update::ReadColumns(Lexer& lex)
{
	Token t;
	
	do
	{
		// <columnName>
		t = lex.NextToken(TokenType::Identifier);
		string name = t.strData;

		t = lex.NextToken("=", TokenType::Operator);

		// Expression
		// Read the expression
		ExpressionParser p(&lex, IOperation::GetStandardOperations());
		Expression* expr = p.Parse();

		columns[name] = expr;

		t = lex.NextToken();
	}
	while (t.type == TokenType::Separator);
			
	lex.PutBackToken(t);
}
Example #3
0
		/*
		 * CREATE TABLE <name> (
		 *    <columnDefinitions>
		 * )
		 *
		 * <name> == <columnName> == identifier
		 * <columnDefinitions> := <columnName> <columnType> [, <columnDefinitions>]
		 * <columnType> := byte | int | uint | char(<length>)
		 * <length> == int
		 */
		void CreateTable::Parse(Lexer& lex)
		{
			Token t;
			
			// <name>
			t = lex.NextToken(TokenType::Identifier, false);
			name = t.strData;
			
			// (
			lex.NextToken("(", TokenType::Parenthesis);

			string tableName;
			// While not )
			do
			{
				Field f = parseField(lex);
				AddField(f);
			
				// , or )
				t = lex.NextToken();
			}
			while (t.type == TokenType::Separator);

			if (t.type != TokenType::Parenthesis || t.strData != ")")
				throw InvalidTokenException(t);
		}
Example #4
0
		Field CreateTable::parseField(Lexer& lex)
		{
			Field res;
			res.size = 0;
			Token t;

			// <columnName>
			t = lex.NextToken(TokenType::Identifier, false);
			
			if (t.strData.size() >= STORM_SQL_FIELD_NAME_SIZE)
				throw NameTooLong();

			strcpy(res.name, t.strData.c_str());

			// <columnType>
			t = lex.NextToken(TokenType::Keyword);

			if (t.strData == "byte")
				res.type = Field::FieldType::byte;
			else if (t.strData == "int")
				res.type = Field::FieldType::int32;
			else if (t.strData == "uint")
				res.type = Field::FieldType::uint32;
			else if (t.strData == "char")
			{
				res.type = Field::FieldType::fixedchar;

				// (<length>)
				lex.NextToken("(", TokenType::Parenthesis);
				t = lex.NextToken(TokenType::IntValue);
				lex.NextToken(")", TokenType::Parenthesis);

				res.size = t.longIntData;
			}
			else
				throw InvalidTokenException(t);

			return res;
		}
Example #5
0
		/*
		 * DROP TABLE <name>
		 */
		void DropTable::Parse(Lexer& lex)
		{
			Token t = lex.NextToken(TokenType::Identifier, false);
			SetName(t.strData);
		}