os/persistentdata/persistentstorage/dbms/pcdbms/usql/UQ_STD.H
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include <u32std.h>
sl@0
    17
#include "D32SQL.H"
sl@0
    18
#include "D32TABLE.H"
sl@0
    19
#include <e32math.h>
sl@0
    20
#include <s32mem.h>
sl@0
    21
#include "D32Assert.h"
sl@0
    22
sl@0
    23
//Forward declarations
sl@0
    24
class TSqlParser2;
sl@0
    25
sl@0
    26
// Classes defined
sl@0
    27
class TSqlToken;
sl@0
    28
class TSqlLexer;
sl@0
    29
class TSqlParser;
sl@0
    30
template <class T,class D> class TMatcher;
sl@0
    31
template <class T,class D> class TDesMatcher;
sl@0
    32
template <class T,class D> class TStreamMatcher;
sl@0
    33
template <class T,class D> class HMatcherPattern;
sl@0
    34
class CSqlCreateTableStatement;
sl@0
    35
class CSqlDropTableStatement;
sl@0
    36
class CSqlAlterTableStatement;
sl@0
    37
class CSqlCreateIndexStatement;
sl@0
    38
class CSqlDropIndexStatement;
sl@0
    39
sl@0
    40
/**
sl@0
    41
parser classes
sl@0
    42
@internalComponent
sl@0
    43
*/
sl@0
    44
enum TSqlTokenType
sl@0
    45
	{
sl@0
    46
	ESqlNoToken=0,
sl@0
    47
//
sl@0
    48
	ESqlEos,
sl@0
    49
//
sl@0
    50
	ESqlIdentifier,
sl@0
    51
	ESqlLiteralInt,
sl@0
    52
	ESqlLiteralReal,
sl@0
    53
	ESqlLiteralTime,
sl@0
    54
	ESqlLiteralText,
sl@0
    55
	ESqlLiteralBlob,
sl@0
    56
//
sl@0
    57
	ESqlAsterisk,
sl@0
    58
	ESqlComma,
sl@0
    59
	ESqlLeftBracket,
sl@0
    60
	ESqlRightBracket,
sl@0
    61
	ESqlLess,
sl@0
    62
	ESqlLessEqual,
sl@0
    63
	ESqlEqual,
sl@0
    64
	ESqlGreaterEqual,
sl@0
    65
	ESqlGreater,
sl@0
    66
	ESqlNotEqual
sl@0
    67
	};
sl@0
    68
sl@0
    69
/**
sl@0
    70
@internalComponent
sl@0
    71
*/
sl@0
    72
enum TSqlKeyword
sl@0
    73
	{
sl@0
    74
	ESqlNotKeyword=-1,
sl@0
    75
//
sl@0
    76
#define KEYWORD(s) ESqlKeyword_##s
sl@0
    77
#include "UQ_KEYWD.H"
sl@0
    78
#undef KEYWORD
sl@0
    79
	};
sl@0
    80
sl@0
    81
class TSqlToken
sl@0
    82
/**
sl@0
    83
@internalComponent
sl@0
    84
*/
sl@0
    85
	{
sl@0
    86
	friend class TSqlLexer;
sl@0
    87
public:
sl@0
    88
	inline TBool operator==(TSqlTokenType aType) const;
sl@0
    89
	inline TBool operator!=(TSqlTokenType aType) const;
sl@0
    90
//
sl@0
    91
	inline void SetError(TInt aError);
sl@0
    92
	inline TInt Error() const;
sl@0
    93
//
sl@0
    94
	inline TSqlTokenType Type() const;
sl@0
    95
	inline const RSqlLiteral& Literal() const;
sl@0
    96
	inline RSqlLiteral& Literal();
sl@0
    97
private:
sl@0
    98
	inline TSqlTokenType operator=(TSqlTokenType aType);
sl@0
    99
private:
sl@0
   100
	TInt iType;
sl@0
   101
	RSqlLiteral iLiteral;
sl@0
   102
	};
sl@0
   103
sl@0
   104
class TSqlLexer
sl@0
   105
/**
sl@0
   106
@internalComponent
sl@0
   107
*/
sl@0
   108
	{
sl@0
   109
public:
sl@0
   110
	TSqlLexer(const TDesC& aSql);
sl@0
   111
	inline TSqlTokenType NextToken(TSqlToken& aToken);
sl@0
   112
	static TSqlKeyword Keyword(const TSqlToken& aToken);
sl@0
   113
	static inline TBool IsKeyword(TSqlKeyword aKeyword,const TSqlToken& aToken);
sl@0
   114
	const TText* Next() const;
sl@0
   115
	void Set(const TText* aNext);	
sl@0
   116
private:
sl@0
   117
	TSqlTokenType GetIdentifier(TSqlToken& aToken);
sl@0
   118
	TSqlTokenType GetString(TSqlToken& aToken);
sl@0
   119
	TInt GetInteger(TInt64& aValue);
sl@0
   120
	TSqlTokenType GetNumber(TSqlToken& aToken);
sl@0
   121
	TSqlTokenType GetDate(TSqlToken& aToken);
sl@0
   122
	TSqlTokenType GetNextToken(TSqlToken& aToken);
sl@0
   123
	TSqlTokenType GetBlob(TSqlToken& aToken);
sl@0
   124
//
sl@0
   125
	static inline TSqlTokenType SqlError(TInt aError=KErrArgument);
sl@0
   126
	static TInt CompareKeyword(TInt aKeyword,const RSqlLiteral& aIdentifier);
sl@0
   127
private:
sl@0
   128
	const TText* iNext;
sl@0
   129
	const TText* iEnd;
sl@0
   130
	};
sl@0
   131
sl@0
   132
class TSqlParser
sl@0
   133
/**
sl@0
   134
@internalComponent
sl@0
   135
*/
sl@0
   136
	{
sl@0
   137
	friend class TSqlParser2;
sl@0
   138
public:
sl@0
   139
	TSqlParser(const TDesC& aSql);
sl@0
   140
//
sl@0
   141
	CSqlQuery* QueryLC();
sl@0
   142
	CSqlSearchCondition* SearchConditionLC();
sl@0
   143
	CSqlDDLStatement* DDLStatementLC();
sl@0
   144
	CSqlDMLStatement* DMLStatementLC();
sl@0
   145
	Sql::TStatementType Type();
sl@0
   146
	TInt PatternFilter(const TDesC& aPattern,const TChar aEscape, TText *aNewPatternBuffer );
sl@0
   147
private:
sl@0
   148
	TSqlTokenType NextToken();
sl@0
   149
	CSqlSearchCondition* SqlError();
sl@0
   150
	inline TInt Error() const;
sl@0
   151
	static TSqlTokenType SqlErrorL();
sl@0
   152
//
sl@0
   153
	TSqlTokenType Parse(TSqlKeyword aKeyword);
sl@0
   154
	TSqlTokenType ParseL(TSqlTokenType aToken);
sl@0
   155
	TSqlTokenType ParseL(TSqlKeyword aKeyword);
sl@0
   156
	TSqlKeyword Keyword();
sl@0
   157
	TSqlTokenType RightBracketL();
sl@0
   158
	TSqlTokenType IdentifierL(TPtrC& aIdentifier);
sl@0
   159
	TPtrC IdentifierL();
sl@0
   160
	void EndL();
sl@0
   161
//
sl@0
   162
	TSqlTokenType ColumnNameL(RSqlColumnList& aList);
sl@0
   163
	TSqlTokenType ColumnListL(RSqlColumnList& aList);
sl@0
   164
	CSqlSearchCondition* SearchCondition(TInt aNot);
sl@0
   165
	CSqlSearchCondition* BooleanTerm(TInt aNot);
sl@0
   166
	CSqlSearchCondition* BooleanFactor(TInt aNot);
sl@0
   167
	CSqlSearchCondition* BooleanPrimary(TInt aNot);
sl@0
   168
	CSqlSearchCondition* Predicate(TInt aNot);
sl@0
   169
	void SortSpecificationL(CDbKey& aKey);
sl@0
   170
	CDbKey* SortSpecificationL();
sl@0
   171
	void DoQueryL(CSqlQuery& aQuery);
sl@0
   172
	CSqlSearchCondition* SearchConditionL();
sl@0
   173
//
sl@0
   174
	TSqlTokenType AddColumnSpecL(TDbCol& aDef);
sl@0
   175
	CSqlDDLStatement* CreateTableLC();
sl@0
   176
	CSqlDDLStatement* DropTableLC();
sl@0
   177
	CSqlDDLStatement* AlterTableLC();
sl@0
   178
	CSqlDDLStatement* CreateIndexLC(TBool aUnique);
sl@0
   179
	CSqlDDLStatement* DropIndexLC();
sl@0
   180
//
sl@0
   181
	TSqlTokenType ColumnValueL(CSqlValues& aValues);
sl@0
   182
	CSqlDMLStatement* InsertStatementLC();
sl@0
   183
	CSqlDMLStatement* UpdateStatementLC();
sl@0
   184
	CSqlDMLStatement* DeleteStatementLC();
sl@0
   185
private:
sl@0
   186
	TSqlLexer iSql;
sl@0
   187
	TSqlToken iToken;
sl@0
   188
	};
sl@0
   189
sl@0
   190
sl@0
   191
/**
sl@0
   192
LIKE evaluation support
sl@0
   193
@internalComponent
sl@0
   194
*/
sl@0
   195
enum TSegmentType {ENull,ESuccess,EStop,EBeginning,EEnd,EMiddle,ESkip,EEscape,EMask=0xf,EWild=0x80};
sl@0
   196
/**
sl@0
   197
@internalComponent
sl@0
   198
*/
sl@0
   199
const TInt KPatternGranularity=0x20;
sl@0
   200
sl@0
   201
// If this value is changed class documentation must be updated.
sl@0
   202
// Namely, RDbDatabase and TDbQuery.
sl@0
   203
const TInt KMaxSegmentLength=0xff;
sl@0
   204
sl@0
   205
template <class T,class D>
sl@0
   206
class HMatcherPattern
sl@0
   207
/**
sl@0
   208
@internalComponent
sl@0
   209
*/
sl@0
   210
	{
sl@0
   211
	friend class TMatcher<T,D>;
sl@0
   212
	typedef HMatcherPattern<T,D> TThis;
sl@0
   213
public:
sl@0
   214
	static HMatcherPattern<T,D>* NewL(const D& aPattern,TBool aEscape = EFalse);
sl@0
   215
	TInt MatchL(const D& aDes,const TTextOps& aTextOp) const;
sl@0
   216
	TInt MatchL(MStreamBuf& aBuf,TInt aLength,const TTextOps& aTextOp) const;
sl@0
   217
private:
sl@0
   218
	static TInt Construct(HMatcherPattern<T,D>*& aCell,const D& aPattern,TBool aEscape = EFalse);
sl@0
   219
	static inline HMatcherPattern<T,D>* Realloc(HMatcherPattern<T,D>* aThis,TInt aSize);
sl@0
   220
private:
sl@0
   221
	T iPattern[1];
sl@0
   222
	};
sl@0
   223
sl@0
   224
template <class T,class D>
sl@0
   225
class TMatcher
sl@0
   226
/**
sl@0
   227
@internalComponent
sl@0
   228
*/
sl@0
   229
	{
sl@0
   230
public:
sl@0
   231
	TBool MatchL(const HMatcherPattern<T,D>& aPattern,const TTextOps& aTextOp);
sl@0
   232
private:
sl@0
   233
	virtual const T* UnderflowL(const T*& aEnd,TInt aRetain=0) =0;
sl@0
   234
	};
sl@0
   235
sl@0
   236
template <class T,class D>
sl@0
   237
class TDesMatcher : public TMatcher<T,D>
sl@0
   238
/**
sl@0
   239
@internalComponent
sl@0
   240
*/
sl@0
   241
	{
sl@0
   242
public:
sl@0
   243
	inline TDesMatcher(const D& aDes);
sl@0
   244
private:
sl@0
   245
	const T* UnderflowL(const T*& aEnd,TInt aRetain=0);
sl@0
   246
private:
sl@0
   247
	const T* iPtr;
sl@0
   248
	const T* iEnd;
sl@0
   249
	};
sl@0
   250
sl@0
   251
template <class T,class D>
sl@0
   252
class TStreamMatcher : public TMatcher<T,D>
sl@0
   253
/**
sl@0
   254
@internalComponent
sl@0
   255
*/
sl@0
   256
	{
sl@0
   257
public:
sl@0
   258
	inline TStreamMatcher(MStreamBuf& aStreamBuf,TInt aLength);
sl@0
   259
private:
sl@0
   260
	const T* UnderflowL(const T*& aEnd,TInt aRetain=0);
sl@0
   261
private:
sl@0
   262
	enum {EBufSize=0x200};
sl@0
   263
private:
sl@0
   264
	RReadStream iStream;
sl@0
   265
	TInt iRemain;
sl@0
   266
	T iBuffer[EBufSize];
sl@0
   267
	const T* iEnd;
sl@0
   268
	};
sl@0
   269
sl@0
   270
NONSHARABLE_CLASS(CSqlCreateTableStatement) : public CSqlDDLStatement
sl@0
   271
/**
sl@0
   272
DDL statements
sl@0
   273
@internalComponent
sl@0
   274
*/
sl@0
   275
	{
sl@0
   276
public:
sl@0
   277
private:
sl@0
   278
	CDbIncremental* ExecuteL(CDbDatabase& aDatabase,TDbTextComparison aComparison,TInt& aSteps);
sl@0
   279
public:
sl@0
   280
	TPtrC iName;
sl@0
   281
	CDbColSet iColumns;
sl@0
   282
	};
sl@0
   283
sl@0
   284
NONSHARABLE_CLASS(CSqlDropTableStatement) : public CSqlDDLStatement
sl@0
   285
/**
sl@0
   286
@internalComponent
sl@0
   287
*/
sl@0
   288
	{
sl@0
   289
private:
sl@0
   290
	CDbIncremental* ExecuteL(CDbDatabase& aDatabase,TDbTextComparison aComparison,TInt& aSteps);
sl@0
   291
public:
sl@0
   292
	TPtrC iName;
sl@0
   293
	};
sl@0
   294
sl@0
   295
NONSHARABLE_CLASS(CSqlAlterTableStatement) : public CSqlDDLStatement
sl@0
   296
/**
sl@0
   297
@internalComponent
sl@0
   298
*/
sl@0
   299
	{
sl@0
   300
public:
sl@0
   301
	~CSqlAlterTableStatement();
sl@0
   302
private:
sl@0
   303
	CDbIncremental* ExecuteL(CDbDatabase& aDatabase,TDbTextComparison aComparison,TInt& aSteps);
sl@0
   304
public:
sl@0
   305
	TPtrC iName;
sl@0
   306
	CDbColSet iAdd;
sl@0
   307
	RSqlColumnList iDrop;
sl@0
   308
	};
sl@0
   309
sl@0
   310
NONSHARABLE_CLASS(CSqlCreateIndexStatement) : public CSqlDDLStatement
sl@0
   311
/**
sl@0
   312
@internalComponent
sl@0
   313
*/
sl@0
   314
	{
sl@0
   315
private:
sl@0
   316
	CDbIncremental* ExecuteL(CDbDatabase& aDatabase,TDbTextComparison aComparison,TInt& aSteps);
sl@0
   317
public:
sl@0
   318
	TPtrC iName;
sl@0
   319
	TPtrC iTable;
sl@0
   320
	CDbKey iKey;
sl@0
   321
	};
sl@0
   322
sl@0
   323
NONSHARABLE_CLASS(CSqlDropIndexStatement) : public CSqlDDLStatement
sl@0
   324
/**
sl@0
   325
@internalComponent
sl@0
   326
*/
sl@0
   327
	{
sl@0
   328
private:
sl@0
   329
	CDbIncremental* ExecuteL(CDbDatabase& aDatabase,TDbTextComparison aComparison,TInt& aSteps);
sl@0
   330
public:
sl@0
   331
	TPtrC iName;
sl@0
   332
	TPtrC iTable;
sl@0
   333
	};
sl@0
   334
sl@0
   335
#include "UQ_STD.INL"