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