--- /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<CDbTableIndexDef> 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<CDbTableDef> 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<CDbTable> 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