diff -r 000000000000 -r 08ec8eefde2f persistentstorage/dbms/pcdbms/inc/D32TABLE.H --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/dbms/pcdbms/inc/D32TABLE.H Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,590 @@ +// 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: +// + +#if !defined(__D32TABLE_H__) +#define __D32TABLE_H__ +#if !defined(__D32DBAS_H__) +#include "D32DBAS.H" +#endif +#if !defined(__D32REC_H__) +#include "D32REC.H" +#endif +#if !defined(__D32CACHE_H__) +#include "D32CACHE.H" +#endif + +// classes defined in this file +class TDbGenerationMark; +class TDbColumnDef; +class HDbColumnSet; +class CDbTableIndexDef; +class RDbIndexes; +class RDbTableSchema; +class CDbTableDef; +class RDbTableRow; +class CDbTable; +class RDbTables; +class RDbTransaction; +class CDbTableDatabase; + +// classes also referenced +class CDbTableSource; +class CDbBlobCleanup; + +/** +@internalComponent +*/ +const TInt KDbTableMaxIndexes = 32; + +/** +@internalComponent +*/ +class CDbTableIndexDef : public CBase + { + friend class RDbIndexes; +public: + IMPORT_C CDbTableIndexDef(); + IMPORT_C ~CDbTableIndexDef(); + IMPORT_C void ConstructL( const TDesC& aName ); + inline const TDesC& Name() const; + inline const CDbKey& Key() const; + inline CDbKey& Key(); +private: + TSglQueLink iLink; + HBufC* iName; + CDbKey iKey; + }; + +/** +@internalComponent +*/ +class RDbIndexes + { + friend class CDbTableDef; +public: + inline void Add( CDbTableIndexDef* aDef ); + inline void Remove( CDbTableIndexDef* aDef ); + inline const TSglQueBase& AsQue() const; + CDbTableIndexDef* Find( const TDesC& aName ) const; + CDbTableIndexDef& FindL( const TDesC& aName ) const; + IMPORT_C TInt Count() const; +private: + inline RDbIndexes(); + void Close(); +private: + TSglQue iRep; + }; + +/** +@internalComponent +*/ +class TDbColumnDef + { +public: + IMPORT_C void SetL( const TDbCol& aCol ); + IMPORT_C void SetL( const TDbColumnDef& aCol ); + void AsTDbCol( TDbCol& aColumn ) const; + inline TDbColType Type() const; +private: +// don't allow copies + void operator=( const TDbColumnDef& ); +public: + // flags used by AlterTable + enum { EDropped = 0x1, EChangedType = 0x2, EChangedLen = 0x4, EAdded = 0x8 }; +public: + HBufC* iName; + TInt iMaxLength; + TUint8 iType; + TUint8 iAttributes; + TUint8 iFlags; + TUint8 iReserved; + }; + +/** +@internalComponent +*/ +class HDbColumnSet + { +private: + enum { ELongColumns = 0x1, EAutoIncrement = 0x2 }; +public: + typedef TDbColumnDef* TIterator; + typedef const TDbColumnDef* TIteratorC; +public: + static HDbColumnSet* NewL( TInt aCount ); + ~HDbColumnSet(); +// + inline TIterator Begin(); + void Complete(); + IMPORT_C TInt Count() const; + inline TIteratorC Begin() const; + inline TIteratorC End() const; + inline const TDbColumnDef& operator[]( TDbColNo anIndex ) const; + IMPORT_C TIteratorC ColumnL( const TDesC& aColumn ) const; + inline TIterator ColumnL( const TDesC& aColumn ); + IMPORT_C TDbColNo ColNoL( const TDesC& aColumn ) const; + inline TBool HasLongColumns() const; + inline TBool HasAutoIncrement() const; +private: + HDbColumnSet( TInt aCount ); + const TIteratorC* IndexL() const; +private: + TUint iAttributes; + TIteratorC* iIndex; + const TDbColumnDef* const iEnd; + TDbColumnDef iColumns[1]; // at least one + }; + +/** +@internalComponent +*/ +class CDbTableDef : public CBase + { + friend class RDbTableSchema; +public: + IMPORT_C ~CDbTableDef(); + inline const TDesC& Name() const; + inline HDbColumnSet& Columns(); + inline const HDbColumnSet& Columns() const; + inline RDbIndexes& Indexes(); + inline const RDbIndexes& Indexes() const; + IMPORT_C virtual void Changed(); +// + inline const CDbTableIndexDef* Key( const TDesC& aColumn ) const; + inline TBool IsIndexed( const TDesC& aColumn ) const; +// + virtual void AlteredColumnSetL( HDbColumnSet& aSet, const CDbColSet& aChange, const CDbColSet& aAdd ) = 0; + void ExchangeColumnSet( HDbColumnSet* aSet ); +protected: + IMPORT_C CDbTableDef(); + IMPORT_C void ConstructL( const TDesC& aName, TInt aColumnCount ); +private: + const CDbTableIndexDef* FindKey( const TDesC& aColumn, TBool aFirstColumn ) const; +private: + TSglQueLink iLink; + HBufC* iName; + HDbColumnSet* iColumns; + RDbIndexes iIndexes; + }; + +/** +@internalComponent +*/ +class RDbTableSchema + { + friend class CDbTableDatabase; +public: + inline void Loaded(); + inline operator TSglQueBase&(); + inline void Add( CDbTableDef* aDef ); +// + inline TBool IsEmpty() const; + CDbTableDef* Find( const TDesC& aTable ); + CDbTableDef& FindL( const TDesC& aTable ); +private: + inline RDbTableSchema(); + void Close(); +// + inline TBool IsLoaded() const; + void Discard(); + inline void Remove( CDbTableDef* aDef ); +private: + TSglQue iRep; + TBool iLoaded; + }; + +/** +@internalComponent +*/ +typedef TUint TDbGeneration; + +/** +@internalComponent +*/ +class TDbGenerationMark + { +public: + inline void Construct( const TDbGeneration& aGeneration ); + inline void Mark(); + inline TBool Changed() const; +private: + const TDbGeneration* iGeneration; + TDbGeneration iMark; + }; + +/** +@internalComponent +*/ +class CDbTable : public CBase + { + friend class RDbTables; +public: + class TValid; + friend class TValid; + enum { EUnavailableSpan = -1, EFullIndexSpan = 100 }; +protected: + IMPORT_C CDbTable( CDbTableDatabase& aDatabase, const CDbTableDef& aDef ); + IMPORT_C ~CDbTable(); +public: + void Open(); + void Close(); + void FlushL(); + void Abandon(); + void Release(); + void Idle(); +// + inline TBool IsActive() const; + inline TBool IsIdle() const; + inline const CDbTableDef& Def() const; + inline CDbTableDatabase& Database(); +// + inline const TDbGeneration& Generation() const; + TBool ExistsL( TDbRecordId aRecordId ); + void NewRowL( RDbRow& aRow ); + void ReadRowL( RDbRow& aRow, TDbRecordId aRecordId ); + void PrepareReplaceL( const RDbTableRow& aRow, TDbRecordId aRecordId ); + void ReplaceRowL( RDbTableRow& aRow, TDbRecordId aRecordId ); + void PrepareAppendL( const RDbTableRow& aRow ); + TDbRecordId AppendRowL( const RDbTableRow& aRow ); + void DeleteRowL( RDbTableRow& aRow, TDbRecordId aRecordId ); + void DuplicateBlobsL( RDbRow& aRow ); + IMPORT_C void DiscardBlobsL( RDbRow& aRow ); +// + IMPORT_C CDbRecordSpace& RecordsL(); + IMPORT_C CDbRecordIndex& IndexL( const CDbTableIndexDef& anIndex ); + IMPORT_C CDbBlobSpace* BlobsL(); + virtual CDbRecordIndex* RecordIndexL( const CDbTableIndexDef& anIndex ) = 0; +// + CDbRecordIter* IteratorL(); + IMPORT_C virtual TInt IndexSpanL( const CDbTableIndexDef& aIndex, TUint aInclusion, const TDbLookupKey* aLowerBound, const TDbLookupKey* aUpperBound ); + CDbRecordIter* IteratorL( const CDbTableIndexDef& aIndex, TUint aInclusion = 0, const TDbLookupKey* aLowerBound = 0, const TDbLookupKey* aUpperBound = 0 ); + CDbRecordIter* IteratorL( const TDesC& aIndex ); +private: + typedef void ( *TBlobFuncL )( CDbBlobSpace& aBlobStore, TDbBlob& aBlob, TDbColType aType, CDbBlobCleanup* aCleanup ); +private: + inline void Discard(); + void Disconnect(); + inline TBool InUse() const; + inline RDbCache& Cache(); +// + void ApplyToBlobsL( RDbRow& aRow, TBlobFuncL aFuncL, CDbBlobCleanup* aCleanup = 0 ); + void ApplyToComponentsL( void ( *anOperationL )( CDbRecordBase* ) ); + void EnsureIndexesL(); + void ValidateL( const RDbRow& aRow ); + void CheckInliningL( RDbRow& aRow ); + void DoReplaceRowL( const RDbRow& aRow, TDbRecordId aRecordId ); +// + virtual CDbRecordSpace* RecordSpaceL() = 0; + virtual CDbBlobSpace* BlobSpaceL() = 0; +// + virtual void CopyToRowL( RDbRow& aRow, const TDesC8& aRecord ) = 0; + virtual TInt RecordLength( const RDbRow& aRow ) = 0; + virtual void CopyFromRow( TUint8* aRecord, const RDbRow& aRow ) = 0; +private: + enum { EIdle = -1, ECached = -2 }; +private: + TSglQueLink iLink; + TInt iRef; + CDbTableDatabase* iDatabase; + const CDbTableDef* iDef; + TDbGeneration iGeneration; + CDbRecordSpace* iRecords; + CDbBlobSpace* iBlobs; + CDbRecordIndex* iIndexes[KDbTableMaxIndexes]; + CDbRecordIndex** iIndexesEnd; + TUint32 iUpdateMap; + }; + +/** +@internalComponent +*/ +class RDbTableRow : public RDbRow + { +public: + inline RDbTableRow(); + void Open( CDbTable* aTable ); + void Close(); +// + inline CDbTable& Table() const; + IMPORT_C void ReadL( TDbRecordId aRecordId ); + void NewL( TDbRecordId aCopyRecord ); + void PrepareAppendL(); + TDbRecordId AppendL(); + void PrepareReplaceL(); + TDbRecordId ReplaceL(); + void DeleteL( TDbRecordId aRecordId ); +private: + TDbGenerationMark iMark; + TDbRecordId iRecord; + CDbTable* iTable; + }; + +/** +implementation class +@internalComponent +*/ +class RDbTables + { +public: + inline RDbTables(); + void Close(); +// + inline TBool IsEmpty() const; + inline void Add( CDbTable& aTable ); + inline void Remove( CDbTable& aTable ); + CDbTable* Find( const TDesC& aTable ); + inline operator TSglQueBase&(); +private: + TSglQue iRep; + }; + +/** +@internalComponent +*/ +enum TDbLockType { EDbReadLock = 0, EDbXReadLock, EDbWriteLock, EDbCompactLock, EDbRecoveryLock, EDbSchemaLock }; + +/** +implementation class +@internalComponent +*/ +class RDbTransaction + { +private: + class CNotifier; + friend class CNotifier; +public: + inline RDbTransaction(); + inline void Open( CDbTableDatabase& aDatabase ); + void Close(); +// + inline const TDbGeneration& RollbackGeneration() const; + inline CDbTableDatabase& Database(); +// + void BeginL( const CDbObject& aObject ); + void CommitL( const CDbObject& aObject ); + void Rollback( const CDbObject& aObject ); +// + void ReadPrepareL( const CDbObject& aObject ); + void ReadBegin( const CDbObject& aObject ); + void ReadRelease( const CDbObject& aObject ); +// + void DMLCheckL(); + void DMLPrepareL( const CDbObject& aObject ); + void DMLBegin(); + void DMLTouch(); + void DMLBeginLC(); + void DMLCommitL(); + void DMLRollback(); +// + void DDLPrepareL( const CDbObject& aObject ); + void DDLBegin(); + void DDLBeginLC(); + void DDLCommitL(); + void DDLRollback(); +// + void UtilityPrepareL( const CDbObject& aObject ); + void UtilityBegin( CDbDatabase::TUtility aType ); + void UtilityCommitL(); + void UtilityRollback(); +// + inline TBool IsLocked() const; + inline void ReadyL() const; + TBool InTransaction( const CDbObject& aObject ); +// + CDbNotifier* NotifierL(); +#ifdef _ASSERTIONS + void _Invariant() const; +#endif +private: + typedef const CDbContext* THolder; + struct TLock + { + THolder iHolder; + TUint iState; + }; + enum { ELockListGranularity = 4 }; + enum { ETransactionLock = 0x80000000 }; + enum { EState = 0x7f, EFailed = 0x80 }; + enum { EMaxLock = 255 }; +private: + inline TDbLockType LockState() const; + void PrepareSLockL( const CDbObject& aObject, TUint aInitState ); + void PrepareXLockL( const CDbObject& aObject ); + void Unlock( RDbNotifier::TEvent aEvent ); + void Unlock( TLock& aLock ); + TLock* GetLock( const CDbObject& aObject ); + void Event( RDbNotifier::TEvent aEvent ); +// + void DoCommitL(); + void DoRollback(); + static void DMLAbandon( TAny* aPtr ); + static void DDLAbandon( TAny* aPtr ); +private: + CDbTableDatabase* iDatabase; + TUint8 iAction; + TUint8 iLockState; + TUint8 iLockCount; + TUint8 iMaxLock; + TInt iUpdaters; + TLock iPrimary; + TLock* iSharers; + TDbGeneration iRollback; + CNotifier* iNotifier; + }; + +/** +@internalComponent +*/ +class CDbTableDatabase : public CBase + { +private: + class CIncremental; + class CIncrementalDDL; + class CCreateIndex; + class CDropIndex; + class CDropTable; + class CAlterTable; + class CUtility; + class CInterface; + class CSource; +// + friend class RDbTransaction; + friend class CInterface; + friend class CSource; + friend class CDbTable; + friend class CIncremental; +public: + /** + @internalComponent + */ + class CStepper : public CBase + { + protected: + CStepper() {} + public: + virtual TInt StepL( TInt aStep ) = 0; + }; + + /** + @internalComponent + */ + class CMultiStepper : public CStepper + { + private: + struct SStepper + { + CStepper* iStepper; + TInt iStep; + }; + public: + ~CMultiStepper(); + IMPORT_C static CMultiStepper* NewL( TInt aStepperCount ); + IMPORT_C void AddStepper( CStepper* aStepper, TInt aSteps ); + IMPORT_C TInt TotalSteps(); + TInt StepL( TInt aStep ); + private: + inline CMultiStepper( TInt aStepperCount ); + private: + SStepper* iStepper; + SStepper* iEnd; + SStepper iSteppers[1]; // one or more + }; + + /** + @internalComponent + */ + class CBuildIndex : public CStepper + { + private: + enum { ERecordsPerStep = 16 }; + public: + IMPORT_C static CBuildIndex* NewL( CDbTableDatabase& aDatabase, const CDbTableDef& aTable, const CDbTableIndexDef& anIndex ); + ~CBuildIndex(); + IMPORT_C static TInt Steps( TInt aCardinality ); + inline CDbRecordIndex& Index(); + IMPORT_C TInt StepsL(); + // from CStepper + TInt StepL( TInt aStep ); + private: + CBuildIndex(); + private: + CDbTableSource* iSource; + TDbPosition iNext; + CDbRecordIndex* iIndex; + }; +protected: + IMPORT_C CDbTableDatabase(); + IMPORT_C ~CDbTableDatabase(); +public: + inline RDbTransaction& Transaction(); +// + IMPORT_C CDbDatabase* InterfaceL(); + IMPORT_C CDbSource* SourceL(); +// + inline RDbTableSchema& Schema(); + IMPORT_C RDbTableSchema& SchemaL(); +// + CDbTableSource* TableSourceL( const TDesC& aTableName ); + void Release( const CDbTableDef& aDef ); +// framework functions + virtual CStepper* TableAlterL( CDbTableDef& aTable, const HDbColumnSet& aNewSet, TInt& aStep ) = 0; + virtual CStepper* RecordDiscarderL( const CDbTableDef& aTable, TInt& aStep ) = 0; + virtual CStepper* IndexDiscarderL( const CDbTableDef& aTable, const CDbTableIndexDef& anIndex, TInt& aStep ) = 0; + IMPORT_C virtual CStepper* UtilityL( CDbDatabase::TUtility aType, TInt& aStep ); +protected: +// framework + IMPORT_C virtual TInt Property( CDbDatabase::TProperty aProperty ); +private: +//framework + virtual void AuthenticateL() = 0; + IMPORT_C virtual void Idle(); + virtual void LoadSchemaL() = 0; + virtual void SynchL( TDbLockType aLock ) = 0; + virtual void Revert( TDbLockType aLock ) = 0; + virtual CDbTable* TableL( const CDbTableDef& aDef ) = 0; + virtual CDbTableDef* CreateTableL( const TDesC& aName, const CDbColSet& aColSet, const CDbKey* aPrimaryKey ) = 0; + virtual CDbTableIndexDef* CreateIndexL( const CDbTableDef& aTable, const TDesC& aName, const CDbKey& aKey ) = 0; + virtual void DestroyL() = 0; +// + inline void Open(); + void Close(); + inline void AddTable( CDbTable& aTable ); + void RemoveTable( CDbTable& aTable ); +// + void CheckIdle(); + void FlushL( TDbLockType aLock ); + void Abandon( TDbLockType aLock ); + void Release(); + + void DoCreateTableL( const TDesC& aName, const CDbColSet& aColSet, const CDbKey* aPrimaryKey ); + CIncremental* OpenCreateIndexL( const TDesC& aName, const TDesC& aTable, const CDbKey& aKey, TInt& aStep ); + CIncremental* OpenDropIndexL( const TDesC& aName, const TDesC& aTable, TInt& aStep ); + CIncremental* OpenDropTableL( const TDesC& aTable, TInt& aStep ); + CIncremental* OpenAlterTableL( const TDesC& aTable, const CDbColSet& aNewDef, TInt& aStep ); + CDbCursor* PrepareViewL( const TDbQuery& aQuery, const TDbWindow& aWindow, RDbRowSet::TAccess anAccess ); + CDbCursor* PrepareTableL( const TDesC& aTable, RDbRowSet::TAccess anAccess ); +// reserved virtual function space + IMPORT_C virtual void Reserved_1(); + IMPORT_C virtual void Reserved_2(); +private: + TInt iRef; + RDbCache iCache; + RDbTransaction iTransaction; + RDbTableSchema iSchema; + RDbTables iTables; + }; + +#include "D32TABLE.INL" +#endif