persistentstorage/dbms/usql/UQ_STD.H
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/dbms/usql/UQ_STD.H	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,331 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "U32STD.H"
+#include "D32SQL.H"
+#include "D32TABLE.H"
+#include <e32math.h>
+#include <s32mem.h>
+
+//Forward declarations
+class TSqlParser2;
+
+// Classes defined
+class TSqlToken;
+class TSqlLexer;
+class TSqlParser;
+template <class T,class D> class TMatcher;
+template <class T,class D> class TDesMatcher;
+template <class T,class D> class TStreamMatcher;
+template <class T,class D> class HMatcherPattern;
+class CSqlCreateTableStatement;
+class CSqlDropTableStatement;
+class CSqlAlterTableStatement;
+class CSqlCreateIndexStatement;
+class CSqlDropIndexStatement;
+
+/**
+parser classes
+@internalComponent
+*/
+enum TSqlTokenType
+	{
+	ESqlNoToken=0,
+//
+	ESqlEos,
+//
+	ESqlIdentifier,
+	ESqlLiteralInt,
+	ESqlLiteralReal,
+	ESqlLiteralTime,
+	ESqlLiteralText,
+//
+	ESqlAsterisk,
+	ESqlComma,
+	ESqlLeftBracket,
+	ESqlRightBracket,
+	ESqlLess,
+	ESqlLessEqual,
+	ESqlEqual,
+	ESqlGreaterEqual,
+	ESqlGreater,
+	ESqlNotEqual
+	};
+
+/**
+@internalComponent
+*/
+enum TSqlKeyword
+	{
+	ESqlNotKeyword=-1,
+//
+#define KEYWORD(s) ESqlKeyword_##s
+#include "UQ_KEYWD.H"
+#undef KEYWORD
+	};
+
+class TSqlToken
+/**
+@internalComponent
+*/
+	{
+	friend class TSqlLexer;
+public:
+	inline TBool operator==(TSqlTokenType aType) const;
+	inline TBool operator!=(TSqlTokenType aType) const;
+//
+	inline void SetError(TInt aError);
+	inline TInt Error() const;
+//
+	inline TSqlTokenType Type() const;
+	inline const RSqlLiteral& Literal() const;
+	inline RSqlLiteral& Literal();
+private:
+	inline TSqlTokenType operator=(TSqlTokenType aType);
+private:
+	TInt iType;
+	RSqlLiteral iLiteral;
+	};
+
+class TSqlLexer
+/**
+@internalComponent
+*/
+	{
+public:
+	TSqlLexer(const TDesC& aSql);
+	inline TSqlTokenType NextToken(TSqlToken& aToken);
+	static TSqlKeyword Keyword(const TSqlToken& aToken);
+	static inline TBool IsKeyword(TSqlKeyword aKeyword,const TSqlToken& aToken);
+	const TText* Next() const;
+	void Set(const TText* aNext);	
+private:
+	TSqlTokenType GetIdentifier(TSqlToken& aToken);
+	TSqlTokenType GetString(TSqlToken& aToken);
+	TInt GetInteger(TInt64& aValue);
+	TSqlTokenType GetNumber(TSqlToken& aToken);
+	TSqlTokenType GetDate(TSqlToken& aToken);
+	TSqlTokenType GetNextToken(TSqlToken& aToken);
+//
+	static inline TSqlTokenType SqlError(TInt aError=KErrArgument);
+	static TInt CompareKeyword(TInt aKeyword,const RSqlLiteral& aIdentifier);
+private:
+	const TText* iNext;
+	const TText* iEnd;
+	};
+
+class TSqlParser
+/**
+@internalComponent
+*/
+	{
+	friend class TSqlParser2;
+public:
+	TSqlParser(const TDesC& aSql);
+//
+	CSqlQuery* QueryLC();
+	CSqlSearchCondition* SearchConditionLC();
+	CSqlDDLStatement* DDLStatementLC();
+	CSqlDMLStatement* DMLStatementLC();
+	Sql::TStatementType Type();
+	TInt PatternFilter(const TDesC& aPattern,const TChar aEscape, TText *aNewPatternBuffer );
+private:
+	TSqlTokenType NextToken();
+	CSqlSearchCondition* SqlError();
+	inline TInt Error() const;
+	static TSqlTokenType SqlErrorL();
+//
+	TSqlTokenType Parse(TSqlKeyword aKeyword);
+	TSqlTokenType ParseL(TSqlTokenType aToken);
+	TSqlTokenType ParseL(TSqlKeyword aKeyword);
+	TSqlKeyword Keyword();
+	TSqlTokenType RightBracketL();
+	TSqlTokenType IdentifierL(TPtrC& aIdentifier);
+	TPtrC IdentifierL();
+	void EndL();
+//
+	TSqlTokenType ColumnNameL(RSqlColumnList& aList);
+	TSqlTokenType ColumnListL(RSqlColumnList& aList);
+	CSqlSearchCondition* SearchCondition(TInt aNot);
+	CSqlSearchCondition* BooleanTerm(TInt aNot);
+	CSqlSearchCondition* BooleanFactor(TInt aNot);
+	CSqlSearchCondition* BooleanPrimary(TInt aNot);
+	CSqlSearchCondition* Predicate(TInt aNot);
+	void SortSpecificationL(CDbKey& aKey);
+	CDbKey* SortSpecificationL();
+	void DoQueryL(CSqlQuery& aQuery);
+	CSqlSearchCondition* SearchConditionL();
+//
+	TSqlTokenType AddColumnSpecL(TDbCol& aDef);
+	CSqlDDLStatement* CreateTableLC();
+	CSqlDDLStatement* DropTableLC();
+	CSqlDDLStatement* AlterTableLC();
+	CSqlDDLStatement* CreateIndexLC(TBool aUnique);
+	CSqlDDLStatement* DropIndexLC();
+//
+	TSqlTokenType ColumnValueL(CSqlValues& aValues);
+	CSqlDMLStatement* InsertStatementLC();
+	CSqlDMLStatement* UpdateStatementLC();
+	CSqlDMLStatement* DeleteStatementLC();
+private:
+	TSqlLexer iSql;
+	TSqlToken iToken;
+	};
+
+
+/**
+LIKE evaluation support
+@internalComponent
+*/
+enum TSegmentType {ENull,ESuccess,EStop,EBeginning,EEnd,EMiddle,ESkip,EEscape,EMask=0xf,EWild=0x80};
+/**
+@internalComponent
+*/
+const TInt KPatternGranularity=0x20;
+
+// If this value is changed class documentation must be updated.
+// Namely, RDbDatabase and TDbQuery.
+const TInt KMaxSegmentLength=0xff;
+
+template <class T,class D>
+class HMatcherPattern
+/**
+@internalComponent
+*/
+	{
+	friend class TMatcher<T,D>;
+	typedef HMatcherPattern<T,D> TThis;
+public:
+	static HMatcherPattern<T,D>* NewL(const D& aPattern,TBool aEscape = EFalse);
+	TInt MatchL(const D& aDes,const TTextOps& aTextOp) const;
+	TInt MatchL(MStreamBuf& aBuf,TInt aLength,const TTextOps& aTextOp) const;
+private:
+	static TInt Construct(HMatcherPattern<T,D>*& aCell,const D& aPattern,TBool aEscape = EFalse);
+	static inline HMatcherPattern<T,D>* Realloc(HMatcherPattern<T,D>* aThis,TInt aSize);
+private:
+	T iPattern[1];
+	};
+
+template <class T,class D>
+class TMatcher
+/**
+@internalComponent
+*/
+	{
+public:
+	TBool MatchL(const HMatcherPattern<T,D>& aPattern,const TTextOps& aTextOp);
+private:
+	virtual const T* UnderflowL(const T*& aEnd,TInt aRetain=0) =0;
+	};
+
+template <class T,class D>
+class TDesMatcher : public TMatcher<T,D>
+/**
+@internalComponent
+*/
+	{
+public:
+	inline TDesMatcher(const D& aDes);
+private:
+	const T* UnderflowL(const T*& aEnd,TInt aRetain=0);
+private:
+	const T* iPtr;
+	const T* iEnd;
+	};
+
+template <class T,class D>
+class TStreamMatcher : public TMatcher<T,D>
+/**
+@internalComponent
+*/
+	{
+public:
+	inline TStreamMatcher(MStreamBuf& aStreamBuf,TInt aLength);
+private:
+	const T* UnderflowL(const T*& aEnd,TInt aRetain=0);
+private:
+	enum {EBufSize=0x200};
+private:
+	RReadStream iStream;
+	TInt iRemain;
+	T iBuffer[EBufSize];
+	const T* iEnd;
+	};
+
+NONSHARABLE_CLASS(CSqlCreateTableStatement) : public CSqlDDLStatement
+/**
+DDL statements
+@internalComponent
+*/
+	{
+private:
+	CDbIncremental* ExecuteL(CDbDatabase& aDatabase,TDbTextComparison aComparison,TInt& aSteps);
+public:
+	TPtrC iName;
+	CDbColSet iColumns;
+	};
+
+NONSHARABLE_CLASS(CSqlDropTableStatement) : public CSqlDDLStatement
+/**
+@internalComponent
+*/
+	{
+private:
+	CDbIncremental* ExecuteL(CDbDatabase& aDatabase,TDbTextComparison aComparison,TInt& aSteps);
+public:
+	TPtrC iName;
+	};
+
+NONSHARABLE_CLASS(CSqlAlterTableStatement) : public CSqlDDLStatement
+/**
+@internalComponent
+*/
+	{
+public:
+	~CSqlAlterTableStatement();
+private:
+	CDbIncremental* ExecuteL(CDbDatabase& aDatabase,TDbTextComparison aComparison,TInt& aSteps);
+public:
+	TPtrC iName;
+	CDbColSet iAdd;
+	RSqlColumnList iDrop;
+	};
+
+NONSHARABLE_CLASS(CSqlCreateIndexStatement) : public CSqlDDLStatement
+/**
+@internalComponent
+*/
+	{
+private:
+	CDbIncremental* ExecuteL(CDbDatabase& aDatabase,TDbTextComparison aComparison,TInt& aSteps);
+public:
+	TPtrC iName;
+	TPtrC iTable;
+	CDbKey iKey;
+	};
+
+NONSHARABLE_CLASS(CSqlDropIndexStatement) : public CSqlDDLStatement
+/**
+@internalComponent
+*/
+	{
+private:
+	CDbIncremental* ExecuteL(CDbDatabase& aDatabase,TDbTextComparison aComparison,TInt& aSteps);
+public:
+	TPtrC iName;
+	TPtrC iTable;
+	};
+
+#include "UQ_STD.INL"