persistentstorage/dbms/utable/UT_STD.H
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/dbms/utable/UT_STD.H	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,843 @@
+// 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 <d32dbms.h>
+#include "D32REC.H"
+#include "D32TABLE.H"
+#include "D32SQL.H"
+#include <s32mem.h>
+
+/**
+@internalComponent
+*/
+enum TTablePanic
+	{
+	EDbInvalidColumn,
+	EDbWrongType,
+	EDbInUpdate,
+	EDbNotInUpdate,
+	EDbInvalidRow,
+	EDbRowNotRead,
+	EDbReadOnly,
+	EDbTableOpen,
+	EDbNotEvaluated,
+	EDbStreamOpen,
+	EDbRowSetConstraintMismatch,
+	EDbBeginNestedTransaction,
+	EDbUpdatesPendingOnCommit,
+	EDbUpdatesPendingOnRollback,
+	EDbNoCurrentTransaction,
+	EDbStreamsPendingOnCommit,
+	EDbStreamsPendingOnRollback,
+	EDbInvalidBookmark
+	};
+
+/**
+@internalComponent
+*/
+GLREF_C void Panic( TTablePanic aPanic );
+
+class Validate
+/**
+@internalComponent
+*/
+	{
+public:
+	static void NameL( const TDesC& aName );
+	static void ColSetL( const CDbColSet& aColSet );
+	static void KeyL( const CDbKey& aKey, const HDbColumnSet& aColumns );
+private:
+	static void UniqueNameL( TDesC const** aNames, TInt aCount, const TDesC& aName );
+	};
+
+class CDbDataSource : public CBase
+/**
+@internalComponent
+*/
+	{
+public:
+	enum TGoto { ESuccess, ENoRow, EExhausted, ESynchFailure };
+	enum TSynch { ESynch, ENoSynch };
+	enum TDelete { EDeletedAtNext, EDeletedAtEnd, EDeletedInLimbo };
+	enum TWrite { EReplace, EAppend };
+protected:
+	enum { EWorkToIterate = 1, EWorkToRead = 16 };
+public:
+	virtual RDbRow* RowBuffer() = 0;
+	virtual TDbColumn Column( TDbColNo aColNo ) = 0;
+	virtual void Reset() = 0;
+	virtual TBool EvaluateL( TInt& aWork, TDbRecordId& aRecordId, TBool& aAtRow ) = 0;
+	virtual TBool Unevaluated() = 0;
+	virtual TInt CountL() = 0;
+	virtual TGoto GotoL( TInt& aWork, TDbPosition aPosition, TDbRecordId& aRecordId ) = 0;
+	TGoto GotoL( TDbPosition aPosition, TDbRecordId& aRecordId );
+	virtual TBool GotoL( TDbRecordId aRecordId ) = 0;
+	virtual void ReadRowL( TDbRecordId aRecordId ) = 0;
+	virtual void NewRowL( TDbRecordId aCopyRecord ) = 0;
+	virtual void PrepareToWriteRowL( TWrite aWrite ) = 0;
+	virtual TDbRecordId WriteRowL( TWrite aWrite, TSynch aSynch = ESynch ) = 0;
+	virtual TDelete DeleteRowL( TDbRecordId& aRecordId, TSynch aSynch = ESynch ) = 0;
+	virtual TInt ColumnCount() const = 0;
+	virtual const TDbColumnDef& ColumnDef( TDbColNo aCol ) const = 0;
+//
+	virtual void SetIndexL( const TDesC* anIndex ) = 0;
+	virtual TBool SeekL( const TDbLookupKey& aKey, RDbTable::TComparison aComparison, TDbRecordId& aRecordId ) = 0;
+	virtual CSqlSearchCondition* ParseConstraintLC( const TDesC& aCondition ) = 0;
+protected:
+	CDbDataSource() {};
+	};
+
+NONSHARABLE_CLASS(CDbTableSource) : public CDbDataSource
+/**
+@internalComponent
+*/
+	{
+public:
+	~CDbTableSource();
+	CDbTableSource();
+	void Construct( CDbTable* aTable );
+	inline void SetIterator( CDbRecordIter* anIter );
+	void ReverseIteratorL();
+	inline const RDbTableRow& Row();
+	inline CDbTable& Table();
+//
+	RDbRow* RowBuffer();
+	TDbColumn Column( TDbColNo aColNo );
+	void Reset();
+	TBool EvaluateL( TInt& aWork, TDbRecordId& aRecordId, TBool& aAtRow );
+	TBool Unevaluated();
+	TInt CountL();
+	TGoto GotoL( TInt& aWork, TDbPosition aPosition, TDbRecordId& aRecordId );
+	TBool GotoL( TDbRecordId aRecordId );
+	void NewRowL( TDbRecordId aCopyRecord );
+	void PrepareToWriteRowL( TWrite aWrite );
+	TDbRecordId WriteRowL( TWrite aWrite, TSynch aSynch );
+	void ReadRowL( TDbRecordId aRecordId );
+	TDelete DeleteRowL( TDbRecordId& aRecordId, TSynch aSynch );
+	TInt ColumnCount() const;
+	const TDbColumnDef& ColumnDef( TDbColNo aCol ) const;
+	void SetIndexL( const TDesC* anIndex );
+	TBool SeekL( const TDbLookupKey& aKey, RDbTable::TComparison aComparison, TDbRecordId& aRecordId );
+	CSqlSearchCondition* ParseConstraintLC( const TDesC& aCondition );
+private:
+	TBool SynchL( TDbRecordId aRecordId );
+	void OpenIteratorL();
+private:
+	CDbRecordIter* iIter;
+	TDbGenerationMark iIterMark;
+	RDbTableRow iRow;
+	TBool iReset;
+	};
+
+NONSHARABLE_CLASS(CDbDataStage) : public CDbDataSource
+/**
+@internalComponent
+*/
+	{
+public:
+	~CDbDataStage();
+	inline void SetSource( CDbDataSource* aSource );
+protected:
+	CDbDataStage() {};
+	inline CDbDataSource& Source();
+	inline const CDbDataSource& Source() const;
+	RDbRow* RowBuffer();
+	TDbColumn Column( TDbColNo aColNo );
+	void Reset();
+	TBool EvaluateL( TInt& aWork, TDbRecordId& aRecordId, TBool& aAtRow );
+	TBool Unevaluated();
+	TInt CountL();
+	TGoto GotoL( TInt& aWork, TDbPosition aPosition, TDbRecordId& aRecordId );
+	TBool GotoL( TDbRecordId aRecordId );
+	void ReadRowL( TDbRecordId aRecordId );
+	void NewRowL( TDbRecordId aCopyRecord );
+	void PrepareToWriteRowL( TWrite aWrite );
+	TDbRecordId WriteRowL( TWrite aWrite, TSynch aSynch );
+	TDelete DeleteRowL( TDbRecordId& aRecordId, TSynch aSynch );
+	TInt ColumnCount() const;
+	const TDbColumnDef& ColumnDef( TDbColNo aCol ) const;
+	void SetIndexL( const TDesC* anIndex );
+	TBool SeekL( const TDbLookupKey& aKey, RDbTable::TComparison aComparison, TDbRecordId& aRecordId );
+	CSqlSearchCondition* ParseConstraintLC( const TDesC& aCondition );
+private:
+	CDbDataSource* iSource;
+	};
+
+NONSHARABLE_CLASS(CDbRestrictStage) : public CDbDataStage
+/**
+@internalComponent
+*/
+	{
+public:
+	CDbRestrictStage( TDbTextComparison aComparison );
+	~CDbRestrictStage();
+	inline void SetRestriction( CSqlSearchCondition* aRestriction );
+private:
+	inline CSqlSearchCondition& Restriction() const;
+	TBool FilterRowL( TDbRecordId aRecordId );
+//
+	TInt CountL();
+	TGoto GotoL( TInt& aWork, TDbPosition aPosition, TDbRecordId& aRecordId );
+	TBool GotoL( TDbRecordId aRecordId );
+	TDelete DeleteRowL( TDbRecordId& aRecordId, TSynch aSynch );
+private:
+	CSqlSearchCondition* iRestriction;
+	const TTextOps& iTextOp;
+	};
+
+class HDbColumnMap;
+
+NONSHARABLE_CLASS(CDbProjectStage) : public CDbDataStage
+/**
+implement restricted column selection
+@internalComponent
+*/
+	{
+public:
+	CDbProjectStage();
+	~CDbProjectStage();
+	void ConstructL( const RSqlColumnList& aSelect, const HDbColumnSet& aColumns );
+private:
+	RDbRow* RowBuffer();
+	TDbColumn Column( TDbColNo aColNo );
+	TInt ColumnCount() const;
+	const TDbColumnDef& ColumnDef( TDbColNo aCol ) const;
+private:
+	HDbColumnMap* iMap;
+	};
+
+NONSHARABLE_CLASS(CDbBasicWindowStage) : public CDbDataStage
+/**
+@internalComponent
+*/
+	{
+private:
+	enum { EWindowArrayGranularity = 32 };	// 128 byte segments
+public:
+	CDbBasicWindowStage( const TDbWindow& aWindow );
+protected:
+// from CDbDataStage
+	void Reset();
+	TBool EvaluateL( TInt& aWork, TDbRecordId& aRecordId, TBool& aAtRow );
+	TInt CountL();
+	TGoto GotoL( TInt& aWork, TDbPosition aPosition, TDbRecordId& aRecordId );
+	TBool GotoL( TDbRecordId aRecordId );
+	void ReadRowL( TDbRecordId aRecordId );
+	TDbRecordId WriteRowL( TWrite aWrite, TSynch aSynch );
+	TDelete DeleteRowL( TDbRecordId& aRecordId, TSynch aSynch );
+private:
+	TBool GetRecord( TDbRecordId& aRecordId );
+	TInt Find( TDbRecordId aRecordId, TInt& aPos );
+	virtual TBool DoEvaluateL( TInt& aWork ) = 0;
+protected:
+	TDbWindow iWindow;		// the window shape
+	CArrayFixSeg<TDbRecordId> iRecords;	// the window itself
+	TInt iPos;				// the iterator over the window
+	};
+
+NONSHARABLE_CLASS(CDbWindowStage) : public CDbBasicWindowStage
+/**
+@internalComponent
+*/
+	{
+private:
+	enum TView { EBeginning, EMiddle, EEnd, EAll };
+	enum TIterPos { EAtBeginning, EAtEnd };
+public:
+	CDbWindowStage( const TDbWindow& aWindow );
+protected:
+	void Reset();
+	TBool DoEvaluateL( TInt& aWork );
+	TBool Unevaluated();
+private:
+	TInt WhatToEvaluate();
+	TDbPosition ResetIterToBeginningL();
+	TDbPosition ResetIterToEndL();
+	TDbPosition SetIteratorL( TInt anEval );
+	void ExtendAtBeginningL( TInt aRecords, TDbPosition aFirst, TInt& aWork );
+	void ExtendAtEndL( TInt aRecords, TDbPosition aFirst, TInt& aWork );
+private:
+	TIterPos iIterPos;		// where the underlying iterator is in our window
+	TView iView;			// what part of the underlying set we see through the window
+	};
+
+NONSHARABLE_CLASS(CDbReorderWindowStage) : public CDbBasicWindowStage
+/**
+@internalComponent
+*/
+	{
+private:
+	enum TState { EReset, EEvaluate, EComplete, EFailed };
+	enum { EGranularity = 32 };
+public:
+	CDbReorderWindowStage();
+	~CDbReorderWindowStage();
+protected:
+	void Reset();
+	TBool DoEvaluateL( TInt& aWork );
+	TBool Unevaluated();
+private:
+	TBool ReadL( TInt& aWork, TDbPosition aNext );
+private:
+	TState iState;
+	RArray<TUint> iRows;
+	};
+
+NONSHARABLE_CLASS(CDbOrderByStage) : public CDbBasicWindowStage
+/**
+@internalComponent
+*/
+	{
+private:
+	class HOrdering;
+	class CKeys;
+	enum TState { EReset, EEvaluate, ESort, EAdd, EComplete, EFailed };
+public:
+	CDbOrderByStage( const RDbTableRow& aRow );
+	~CDbOrderByStage();
+	void ConstructL( const CDbKey& aOrderBy );
+protected:
+	void Reset();
+	TBool DoEvaluateL( TInt& aWork );
+	TBool Unevaluated();
+private:
+	inline const RDbTableRow& Row();
+	inline CKeys& Keys();
+	inline const HOrdering& Order();
+//
+	TBool ReadL( TInt& aWork, TDbPosition aNext );
+private:
+	const RDbTableRow& iRow;
+	TState iState;
+	HOrdering* iOrder;
+	CKeys* iKeys;
+	};
+
+class RDbAccessPlan
+/**
+@internalComponent
+*/
+	{
+public:
+	inline RDbAccessPlan( CSqlQuery* aQuery, TDbTextComparison aComparison );
+	inline RDbAccessPlan();
+	void BuildLC( CDbTableDatabase& aDatabase, RDbRowSet::TAccess aAccess, const TDbWindow& aWindow );
+	void BuildLC( CDbTableDatabase& aDatabase, const TDesC& aTable, RDbRowSet::TAccess aAccess );
+	inline CDbTable& Table();
+	inline CDbDataSource& Source();
+	inline CDbDataSource* Adopt();
+private:
+	class TPlan
+		{
+	public:
+		enum 
+			{
+			EOrder = 0x1, ERestrict = 0x2, EReorder = 0x4,
+			EIndex = 0x8, EBounded = 0x10,
+			EWindow = 0x20, EReverse = 0x40,
+			EMask = 0x1f
+			};
+		enum TType 
+			{
+			EPlanA = 0, EPlanB = 0, EPlanC = 0, EPlanD = 0, EPlanEF = 1, EPlanGH = 7, EPlanIJ = 2,
+			EPlanKL = 5, EPlanMN = 4, EPlanOP = 3, EPlanQR = 6, EPlanST = 8
+			};
+	public:
+		inline TPlan();
+		inline TBool operator!=( const TPlan& aPlan ) const;
+		TType Type() const;
+		static TInt OrderByPlan( const TPlan& aLeft, const TPlan& aRight );
+	public:
+		TUint iFlags;
+		const CDbTableIndexDef* iIndex;
+		CSqlCompPredicate* iLower;
+		CSqlCompPredicate* iUpper;		
+		};	
+private:
+	CDbTableSource* TableLC( CDbTableDatabase& aDatabase, const TDesC& aTable );
+	void Insert( CDbDataStage* aStage );
+	CDbRecordIter* IteratorL( const TPlan& aPlan );
+	CDbRecordIter* BoundedIteratorL( const TPlan& aPlan );
+	void RestrictionL();
+	void OrderByL( const RDbTableRow& aRowBuf );
+	void ProjectionL();
+	void WindowL( const TPlan& aPlan, const TDbWindow& aWindow );
+	static void Cleanup( TAny* aPtr );
+	TBool IsBoundedIteratorL( TPlan& aPlan, const CDbTableIndexDef* aIndex );
+	TBool IsIndexIteratorL( TPlan& aPlan, const CDbTableIndexDef* aIndex );
+	void EvaluateWindowStage( TPlan& aPlan );
+	void EvaluateReorderStage( TPlan& aPlan, const CDbTableIndexDef* aIndex );
+	void EvaluatePlansL();
+	void ChoosePlanL( TPlan& aPlan );
+	void PrepareQueryL( CDbTableSource* aSource );
+	TInt GetTightestRestrictionL( TPlan& aPlan, TPlan::TType aType );
+	TInt GetSmallestKeySize( TPlan& aPlan, TPlan::TType aType );
+	TInt IndexSpanL( const TPlan& aPlan );
+	void ReducePlans();
+	void CreateTableIteratorPlan( TPlan& aPlan );
+	TUint FindMatchL( const CDbTableIndexDef* aIndex );
+	TBool TextKeyL( const CDbKey& anOrder );
+private:
+	enum { EGranularity = 4 };
+	enum { EMatch = 0x1, EReverse = 0x2, ETruncated = 0x4 };
+	//
+	class TBounds;
+	class CDbCompPredicateList;
+private:
+	RArray<TPlan> iPlans;
+	CDbDataSource* iSource;
+	CDbTable* iTable;
+	TDbTextComparison iComparison;
+	CSqlQuery* iQuery;
+	TBool iWindow;
+	RDbRowSet::TAccess iAccess;
+	};
+
+class RDbAccessPlan::TBounds
+	{
+public:
+	TBounds( const TPlan& aPlan );
+private:
+	void GetLookupKey( const CSqlCompPredicate& aCompPredicate, TDbLookupKey& aLookup );
+	void SetLowerBounds();
+	void SetUpperBounds();
+public:
+	CSqlCompPredicate* iLowerPred;
+	CSqlCompPredicate* iUpperPred;		
+	TDbLookupKey iLowerKey;
+	TDbLookupKey iUpperKey;
+	TDbLookupKey* iLower;
+	TDbLookupKey* iUpper;
+	TUint iInclusion;
+	};
+
+class RDbAccessPlan::CDbCompPredicateList : public CArrayFixFlat<CSqlCompPredicate*>
+	{
+public:
+	enum
+		{
+		EAnd = 0x1,
+		ELess = 0x2,
+		ELessEqual = 0x4,
+		EEqual = 0x8,
+		EGreaterEqual = 0x10,
+		EGreater = 0x20,
+		ECompPred = ELess | ELessEqual | EEqual | EGreaterEqual | EGreater,
+		ENone = 0
+		};
+public:
+	static CDbCompPredicateList* NewLC( CSqlQuery& aQuery, TDbTextComparison aComparison, const CDbTableDef& aTableDef );
+	CSqlCompPredicate* CompPredicate( TDbColNo aColNo, TUint aType = ECompPred );
+	TUint Type( CSqlSearchCondition::TType aType ) const;
+	inline TBool IsRestriction();
+private:
+	inline CDbCompPredicateList( const CDbTableDef& aTableDef, TDbTextComparison aComparison );
+	void ConstructL( CSqlSearchCondition& aSeachCondition );
+	TBool IsIndexed( const TDesC& aColumnName );
+private:
+	enum { EGranularity = 4 };
+private:
+	const CDbTableDef& iTableDef;
+	TDbTextComparison iComparison;
+	TBool iRestriction;
+	};
+
+class CDbTable::TValid
+/**
+@internalComponent
+*/
+	{
+public:
+	TValid(CDbTable& aTable);
+	TBool Reset();
+//
+	inline operator TAny*() const;
+	void CheckL() const;
+//
+	inline RDbTransaction& Transaction() const;
+	inline CDbTable& Table() const;
+private:
+	CDbTable& iTable;
+	TDbGenerationMark iRollback;
+	};
+
+NONSHARABLE_CLASS(CDbTableCursor) : public CDbCursor
+/**
+@internalComponent
+*/
+	{
+public:
+	static CDbTableCursor* NewL( RDbAccessPlan& aPlan, RDbRowSet::TAccess aAccess );
+//
+	inline CDbBlobSpace& BlobsL() const;
+	inline void AddSink();
+	inline void ReleaseSink();
+	inline void AddSource();
+	inline void ReleaseSource();
+	void AddBlobSource();
+	void ReleaseBlobSource();
+private:
+	CDbTableCursor( RDbAccessPlan& aPlan, RDbRowSet::TAccess anAccess );
+	~CDbTableCursor();
+//
+	void Reset();
+	TBool EvaluateL();
+	void Evaluate( TRequestStatus& aStatus );
+	TBool Unevaluated();
+//
+	void SetIndexL( const TDesC* anIndex );
+	TBool SeekL( const TDbLookupKey& aKey, RDbTable::TComparison aComparison );
+	CDbRowConstraint* OpenConstraintL( const TDbQuery& aCriteria );
+	TBool MatchL( CDbRowConstraint& aConstraint );
+//
+	TInt CountL( RDbRowSet::TAccuracy aAccuracy );
+	TBool AtBeginning();
+	TBool AtEnd();
+	TBool AtRow();
+	TBool GotoL( RDbRowSet::TPosition aPosition );
+	void Bookmark( TDbBookmark::TMark& aMark );
+	void GotoL( const TDbBookmark::TMark& aMark );
+	void GetL();
+	void InsertL( TInsert aClearRow );
+	void UpdateL();
+	void Cancel();
+	void PutL();
+	void DeleteL();
+//
+	TInt ColumnCount();
+	TDbColType ColumnType( TDbColNo aCol );
+	void ColumnDef( TDbCol& aCol, TDbColNo aColNo );
+//
+	RDbRow* RowBuffer();
+	TDbColumnC ColumnC( TDbColNo aCol );	// non-writeable row buffer
+	TDbColumn Column( TDbColNo aCol );		// writeable row buffer
+	void SetNullL( TDbColNo aCol );
+	TInt ColumnSize( TDbColNo aCol );
+	MStreamBuf* ColumnSourceL( TDbColNo aCol );
+	MStreamBuf* ColumnSinkL( TDbColNo aCol );
+//
+	TDbColType Type( TDbColNo aCol ) const;
+	void ReplaceBlobL( TDbColumn& aColumn );
+	inline TBool InUpdate() const;
+	inline RDbTransaction& Transaction();
+	void CheckStateL() const;
+	void CheckReadL() const;
+	void CheckUpdateL() const;
+	void AssertValidRow() const;
+	void AssertNotInUpdate() const;
+	void AssertInUpdate() const;
+	void AssertNoStreams() const;
+private:
+	enum TState
+		{
+		ERowBeginning,
+		ERowOK,
+		ERowEnd,
+		ERowInvalid,
+		ERowDeletedAtNext,
+		ERowDeletedAtEnd,
+		ERowInLimbo
+		};	// keep these in same order as CDbDataSource::TDelete
+	enum
+		{
+		EUpdatable = 0x01,
+		EReadable = 0x02,
+		ERead = 0x04,
+		EUpdating = 0x08,
+		EInserting = 0x10,
+		EDirty = 0x20,
+		EWriteBuf = 0x40
+		};
+	enum { EMaxReadBuf = 255 };
+	class HColumns;
+	class CConstraint;
+	class HMemBuf;
+	class HWriteBuf;
+	class HReadBuf;
+	class HHeapBuf;
+private:
+	TUint8 iState;
+	TUint8 iFlags;
+	TUint8 iReadBuf;
+	CDbTable::TValid iValid;
+	CDbDataSource* iDataSource;
+	TDbRecordId iRecord;
+	HColumns* iColumns;
+	};
+
+
+NONSHARABLE_CLASS(CDbTableCursor::HWriteBuf) : public TDesBuf
+	{
+public:
+	static HWriteBuf* NewL( CDbTableCursor& aCursor, const TDbColumn& aColumn, TDbColType aType );
+private:
+	inline HWriteBuf( CDbTableCursor& aCursor, const TDbColumn& aColumn, TDbColType aType );
+	virtual inline ~HWriteBuf();
+	void ConstructL();
+//
+	inline TBool IsBinary() const;
+	void FlipL();
+// for MStreamBuf
+	void DoRelease();
+	void DoSynchL();
+	TInt DoReadL( TAny* aPtr, TInt aMaxLength );
+	TStreamTransfer DoReadL( MStreamInput& aInput, TStreamTransfer aTransfer );
+	void DoWriteL( const TAny* aPtr, TInt aLength );
+	TStreamTransfer DoWriteL( MStreamOutput& aOutput, TStreamTransfer aTransfer );
+	TStreamPos DoSeekL( TMark aMark, TStreamLocation aLocation, TInt aOffset );
+private:
+	CDbTableCursor& iCursor;
+	TDbColumn iColumn;
+	TDbColType iType;
+	TDbBlob* iBlob;
+	TPtr8 iInlineBuf;
+	TDbBlobId iBlobId;
+	TInt iSize;
+	MStreamBuf* iOverflowBuf;
+	};
+
+NONSHARABLE_CLASS(CDbTableCursor::HMemBuf) : public TMemBuf
+	{
+public:
+	static HMemBuf* NewL( CDbTableCursor& aCursor, const TDesC8& aDes );
+protected:
+	HMemBuf( CDbTableCursor& aCursor );
+	virtual inline ~HMemBuf();
+private:
+	void DoRelease();
+private:
+	CDbTableCursor& iCursor;
+	};
+
+class CDbTableCursor::HHeapBuf : public CDbTableCursor::HMemBuf
+	{
+public:
+	enum { EMaxBlobBuffer = 0x600 };	// 1.5K to match KDbsStreamBufSize
+public:
+	static HHeapBuf* NewL( CDbTableCursor& aCursor, const TDbBlob& aBlob, TDbColType aType );
+private:
+	inline HHeapBuf( CDbTableCursor& aCursor );
+private:
+	TUint8 iBuf[1];
+	};
+
+NONSHARABLE_CLASS(CDbTableCursor::HReadBuf) : public MStreamBuf
+	{
+public:
+	static HReadBuf* NewLC( CDbTableCursor& aCursor );
+	inline void Set( MStreamBuf* aHost );
+private:
+	inline HReadBuf( CDbTableCursor& aCursor );
+	virtual inline ~HReadBuf();
+// from MStreamBuf
+	void DoRelease();
+	TInt DoReadL( TAny* aPtr, TInt aMaxLength );
+	TStreamTransfer DoReadL( MStreamInput& aInput, TStreamTransfer aTransfer );
+	TStreamPos DoSeekL( TMark aMark, TStreamLocation aLocation, TInt aOffset );
+private:
+	CDbTableCursor& iCursor;
+	MStreamBuf* iHost;
+	};
+
+NONSHARABLE_CLASS(CDbTableDatabase::CIncremental) : public CDbSyncIncremental
+/**
+@internalComponent
+*/
+	{
+protected:
+	enum { ELastStep = 1 };
+	enum TState { ERunning = 0, EFailed, ECommitted };
+public:
+	inline void Construct( CStepper* aStepper );
+protected:
+	CIncremental( RDbTransaction& aTransaction );
+	~CIncremental();
+	inline RDbTransaction& Transaction();
+	inline CDbTableDatabase& Database();
+	inline TBool IsCommitted() const;
+private:
+	TBool NextL( TInt& aStep );
+	virtual TInt DoNextL( TInt aStep );
+	virtual void DoLastL() =0;
+private:
+	RDbTransaction& iTransaction;
+	CStepper* iStepper;
+	TState iState;
+	};
+
+NONSHARABLE_CLASS(CDbTableDatabase::CIncrementalDDL) : public CDbTableDatabase::CIncremental
+/**
+@internalComponent
+*/
+	{
+protected:
+	CIncrementalDDL( RDbTransaction& aTransaction );
+	~CIncrementalDDL();
+// from CIncremental
+	void DoLastL();
+	};
+
+class CDbTableDatabase::CCreateIndex : public CDbTableDatabase::CIncrementalDDL
+/**
+@internalComponent
+*/
+	{
+public:
+	static CCreateIndex* NewLC( RDbTransaction& aTransaction );
+	TInt ConstructL( const CDbTableDef& aTable, const CDbTableIndexDef& anIndex );
+private:
+	inline CCreateIndex( RDbTransaction& aTransaction );
+	};
+
+NONSHARABLE_CLASS(CDbTableDatabase::CDropIndex) : public CDbTableDatabase::CIncrementalDDL
+/**
+@internalComponent
+*/
+	{
+public:
+	static CDropIndex* NewL( RDbTransaction& aTransaction, const CDbTableDef& aTable, CDbTableIndexDef* anIndex, TInt& aStep );
+	~CDropIndex();
+private:
+	inline CDropIndex( RDbTransaction& aTransaction );
+private:
+	CDbTableIndexDef* iDef;
+	};
+
+NONSHARABLE_CLASS(CDbTableDatabase::CDropTable) : public CDbTableDatabase::CIncrementalDDL
+/**
+@internalComponent
+*/
+	{
+public:
+	static CDropTable* NewL( RDbTransaction& aTransaction, CDbTableDef* aTable, TInt& aStep );
+	~CDropTable();
+private:
+	inline CDropTable( RDbTransaction& aTransaction );
+private:
+	CDbTableDef* iDef;
+	};
+
+NONSHARABLE_CLASS(CDbTableDatabase::CAlterTable) : public CDbTableDatabase::CIncrementalDDL
+/**
+@internalComponent
+*/
+	{
+public:
+	static CAlterTable* NewL( RDbTransaction& aTransaction, CDbTableDef& aTable, const CDbColSet& aNewDef, TInt& aStep );
+	~CAlterTable();
+private:
+	inline CAlterTable( RDbTransaction& aTransaction, CDbTableDef& aDef );
+	void ConstructL( const CDbColSet& aNewDef, TInt& aStep );
+// from CIncremental
+	void DoLastL();
+private:
+	CDbTableDef& iDef;
+	HDbColumnSet* iNewSet;
+	};
+
+NONSHARABLE_CLASS(CDbTableDatabase::CUtility) : public CDbTableDatabase::CIncremental
+/**
+@internalComponent
+*/
+	{
+public:
+	static CUtility* NewL( RDbTransaction& aTransaction, CDbDatabase::TUtility aType, TInt& aStep );
+	~CUtility();
+private:
+	inline CUtility( RDbTransaction& aTransaction, CDbDatabase::TUtility aType );
+private:
+	void DoLastL();
+	};
+
+NONSHARABLE_CLASS(CDbIncrementalDML) : public CDbSyncIncremental
+/**
+@internalComponent
+*/
+	{
+public:
+	static CDbIncrementalDML* NewL( CSqlModifyStatement& aStatement, CDbTableDatabase& aDatabase, TDbTextComparison aComparison );
+	~CDbIncrementalDML();
+private:
+	enum TState { EInitialising = 0, EEvaluating, EUpdating, EDeleting, ECommitted, EFailed };
+private:
+	inline CDbIncrementalDML( RDbAccessPlan& aPlan );
+	inline RDbTransaction& Transaction();
+	inline TBool IsUpdate() const;
+	inline void	SetState( TState aState );
+// from CDbSyncIncremental
+	TBool NextL( TInt& aRows );
+private:
+	TState iState;
+	CDbTable& iTable;
+	CDbDataSource* iSource;
+	TDbRecordId iRecord;
+	CSqlValues* iValues;
+	};
+
+NONSHARABLE_CLASS(CDbTableDatabase::CInterface) : public CDbDatabase
+/**
+the interface implementation class for the Table database framework
+@internalComponent
+*/
+	{
+public:
+	CInterface(CDbTableDatabase& aDatabase);
+private:
+	~CInterface();
+	inline CDbTableDatabase& Database();
+	void PrepareDDLL();
+//	from the interface framework
+	TInt Destroy();
+	TInt Begin();
+	TInt Commit();
+	void Rollback();
+	TInt Property( TProperty aProperty );
+	void CreateTableL( const TDesC& aName, const CDbColSet& aColSet, const CDbKey* aPrimaryKey );
+	void TablesL( CDbTableNames& aNames );
+	void ColumnsL( CDbColSet& aColSet, const TDesC& aName );
+	void IndexesL( CDbIndexNames& aNames, const TDesC& aTable );
+	void KeysL( CDbKey& aKey, const TDesC& aName, const TDesC& aTable );
+	CDbNotifier* OpenNotifierL();
+	CDbCursor* PrepareViewL( const TDbQuery& aQuery, const TDbWindow& aWindow, RDbRowSet::TAccess anAccess );
+	CDbCursor* OpenTableL( const TDesC& aName, RDbRowSet::TAccess anAccess );
+	CDbIncremental* OpenDropTableL( const TDesC& aTable, TInt& aStep );
+	CDbIncremental* OpenAlterTableL( const TDesC& aTable, const CDbColSet& aNewDef, TInt& aStep );
+	CDbIncremental* OpenCreateIndexL( const TDesC& aName, const TDesC& aTable, const CDbKey& aKey, TInt& aStep );
+	CDbIncremental* OpenDropIndexL( const TDesC& aName, const TDesC& aTable, TInt& aStep );
+	CDbIncremental* OpenUtilityL( CDbDatabase::TUtility aType, TInt& aStep );
+	CDbIncremental* OpenExecuteL( const TDesC& aSql, TDbTextComparison aComparison, TInt& aInit );
+private:
+	CDbTableDatabase& iDatabase;
+	};
+
+NONSHARABLE_CLASS(CDbTableDatabase::CSource) : public CDbSource
+/**
+@internalComponent
+*/
+	{
+public:
+	CSource( CDbTableDatabase& aDatabase );
+private:
+	~CSource();
+	inline CDbTableDatabase& Database();
+	// from the framework
+	CDbDatabase* AuthenticateL();
+	CDbNotifier* OpenNotifierL();
+private:
+	CDbTableDatabase& iDatabase;
+	};
+
+#include "UT_STD.INL"