diff -r 000000000000 -r 08ec8eefde2f persistentstorage/dbms/sdbms/SD_STD.H --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/dbms/sdbms/SD_STD.H Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,860 @@ +// 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: +// DBMS Client/Server architecture +// +// + + +#include "U32STD.H" +#include "D32SRV.H" +#include "D32DRVR.H" +#include +#include +#include "D32VER.H" +#include "D32Map.h" +#include "Sd_DbProps.h" +#include "Sd_PolicyProxy.h" +#include "Sd_DriveSpace.h" + +// other classes referenced +class HDbsColumns; +struct TDbProps; + +// classes defined +class TDbsParam; +class RDbsObject; +class CDbsDatabase; +class CDbsIncremental; +class CDbsCursor; +class CDbsConstraint; +class CDbsNotifier; +class CDbsSource; +class RDbsSources; +class CDbsServer; +class CDbsSession; +class HDbsStream; + +#if defined(_DEBUG) +/** +@internalComponent +*/ +#define _SMALL_BUFFER +#endif + +using namespace DBSC; + +/** +@internalComponent +*/ +enum TDbsPanic + { + EDbsUnimplemented, //0 + EDbsInvalidColumn, + EDbsWrongType, + EDbsNoRowData, + EDbsNotInUpdate, + EDbsBadDescriptor, + EDbsBadHandle, + EDbsStreamMarkInvalid, + EDbsStreamLocationInvalid, + EDbsObserverRequestPending, + EDbsInvalidDrive //10 + }; + +/** +used by proxy classes +@internalComponent +*/ +GLREF_C void Panic(TDbsPanic aPanic); + +/** +@internalComponent +*/ +GLREF_C void ExternalizeL(const TDbCol& aCol,RWriteStream& aStream); +GLREF_C void ExternalizeL(const CDbColSet& aColSet,RWriteStream& aStream); +GLREF_C void InternalizeL(CDbColSet& aColSet,RReadStream& aStream); +GLREF_C void ExternalizeL(const CDbKey& aKey,RWriteStream& aStream); +GLREF_C void InternalizeL(CDbKey& aKey,RReadStream& aStream); +GLREF_C void ExternalizeL(const CDbNames& aNames,RWriteStream& aStream); +GLREF_C void InternalizeL(CDbNames& aNames,RReadStream& aStream); +GLREF_C void ExternalizeL(const CDbStrings& aNames,RWriteStream& aStream); +GLREF_C void InternalizeL(CDbStrings& aNames,RReadStream& aStream); + +/** +@internalComponent +*/ +_LIT(KDbsServerName,"!DBMS server"); +_LIT(KDbsServerImg,"EDBSRV"); // DLL/EXE name +const TUid KDbsServerUid3={0x100012a5}; + + +/** +@internalComponent +*/ +const TInt KDbsExitDelay=4*0x100000; // ~4 seconds +const TInt KDbsLeavePanic=~(1<<20); +const TInt KTablePolicyMaskBit = 1024; //Used in RDbs::GetPolicy() methods + +/** +shared classes +@internalComponent +*/ +enum TDbsType {EDbsFree,EDbsDatabase,EDbsIncremental,EDbsCursor,EDbsConstraint,EDbsStream,EDbsObserver,EDbsMaxType=EDbsObserver,EDbsSession=EDbsFree}; + +/** +Make sure that KDbsFunc2SecurityPolicyMask array in SD_PolicyProxy.cpp gets updated if +new enum items are going to be added to TDbsFunction. +@internalComponent +*/ +enum TDbsFunction + { +// Session functions + EDbsResourceMark, //0 + EDbsResourceCheck, + EDbsResourceCount, + EDbsSetHeapFailure, + EDbsOpenDatabase, +// common functions + EDbsClose, +// Database functions + EDbsDatabaseAuthenticate, //Not used in SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version + EDbsDatabaseDestroy, + EDbsDatabaseBegin, + EDbsDatabaseCommit, + EDbsDatabaseRollback, //10 + EDbsDatabaseProperty, + EDbsDatabaseCreateTable, + EDbsDatabaseTables, + EDbsDatabaseColumns, + EDbsDatabaseIndexes, + EDbsDatabaseKeys, + EDbsDatabaseOpenObserver, + EDbsDatabaseOpenUtility, + EDbsDatabaseOpenDropTable, + EDbsDatabaseOpenAlterTable, //20 + EDbsDatabaseOpenCreateIndex, + EDbsDatabaseOpenDropIndex, + EDbsDatabaseExecute, + EDbsDatabasePrepareView, + EDbsDatabaseOpenTable, +// Observer functions + EDbsObserverNotify, + EDbsObserverCancel, +// Incremental functions + EDbsIncrementalNext, +// Cursor functions + EDbsCursorColumnTypes, + EDbsCursorReset, //30 + EDbsCursorEvaluate, + EDbsCursorUnevaluated, + EDbsCursorSetIndex, + EDbsCursorSeek, + EDbsCursorAtBeginning, + EDbsCursorAtEnd, + EDbsCursorAtRow, + EDbsCursorCount, + EDbsCursorGotoPos, + EDbsCursorBookmark, //40 + EDbsCursorGotoBookmark, + EDbsCursorGet, + EDbsCursorInsert, + EDbsCursorUpdate, + EDbsCursorRetrieveRow, + EDbsCursorCancel, + EDbsCursorPut, + EDbsCursorDelete, + EDbsCursorColumns, + EDbsCursorColumnDef, //50 + EDbsCursorSetNull, + EDbsCursorColumnSize, + EDbsCursorColumnSource, + EDbsCursorColumnSink, + EDbsCursorOpenConstraint, + EDbsCursorMatch, + EDbsCursorFind, +// stream functions + EDbsStreamRead, + EDbsStreamWrite, + EDbsStreamSize, //60 + EDbsStreamSynch, +// Session functions + EDbsCreateDatabase, + EDbsDatabaseList, + EDbsCopyDatabase, + EDbsDeleteDatabase, + EDbsGetSecurityPolicy, +// reserved disk space handling functions + EDbsReserveDriveSpace, + EDbsFreeReservedSpace, + EDbsReserveGetAccess, + EDbsReserveReleaseAccess, //70 +// + EDbsGetBackupPath, + EDbsGetBackupPaths, + //Insert new functuions here + EDbsLast + }; + +/** +@internalComponent +*/ +const TInt KDbsTypeBits=4; +const TInt KDbsMagicBits=4; +const TInt KDbsIndexBits=14; +const TInt KDbsFunctionBits=9; +const TInt KDbsHandleBits=KDbsTypeBits+KDbsMagicBits+KDbsIndexBits; +const TInt KDbsTypeMask=(1<& aStep,TRequestStatus& aStatus); +private: + RDbsObject iObject; + }; + +/** +@internalComponent +*/ +NONSHARABLE_CLASS(CDbsCursor) : public CDbCursor + { +public: + static CDbsCursor* NewL(const RDbsObject& aDbs,TDbsFunction aFunction,TIpcArgs& aArgs); + ~CDbsCursor(); +private: + CDbsCursor(); + void ConstructL(const RDbsObject& aDbs,TDbsFunction aFunction,TIpcArgs& aArgs); +// + TDbColType Type(TDbColNo aCol) const; + void ReplaceBlobL(TDbColumn& aCol); + TBool RetrieveL(TDbsFunction aFunction,TInt aArg0=0); +// from CDbCursor + void Reset(); + TBool EvaluateL(); + void Evaluate(TRequestStatus& aStatus); + TBool Unevaluated(); + void SetIndexL(const TDesC* anIndex); + TBool SeekL(const TDbLookupKey& aKey,RDbTable::TComparison aComparison); + TBool AtBeginning(); + TBool AtEnd(); + TBool AtRow(); + TInt CountL(RDbRowSet::TAccuracy aAccuracy); + 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(); + void ColumnsL(CDbColSet& aColSet); + void ColumnDef(TDbCol& aCol,TDbColNo aColNo); + TDbColType ColumnType(TDbColNo aCol); + RDbRow* RowBuffer(); + TDbColumnC ColumnC(TDbColNo aCol); // non-writeable column + TDbColumn Column(TDbColNo aCol); // writeable column + void SetNullL(TDbColNo aCol); + TInt ColumnSize(TDbColNo aCol); + MStreamBuf* ColumnSourceL(TDbColNo aCol); + MStreamBuf* ColumnSinkL(TDbColNo aCol); + CDbRowConstraint* OpenConstraintL(const TDbQuery& aCriteria); + TBool MatchL(CDbRowConstraint& aCursor); + TInt FindL(RDbRowSet::TDirection aDirection,const TDbQuery& aCriteria); +private: + enum TState {EUnknown,EAtBeginning,EAtEnd,EAtRow,ERetrieve,ERead,EWrite}; +private: + RDbsObject iObject; + TState iState; + TBool iChangedBlob; + HDbsColumns* iColumns; + RDbRow iRow; + }; + +/** +@internalComponent +*/ +NONSHARABLE_CLASS(CDbsConstraint) : public CDbRowConstraint + { + friend class CDbsCursor; +private: + inline CDbsConstraint(); + ~CDbsConstraint(); +private: + RDbsObject iObject; + }; + +/** +@internalComponent +*/ +NONSHARABLE_CLASS(HDbsBuf) : public TStreamBuf + { +public: + static HDbsBuf* NewL(const RDbsObject& aObject,TDbsFunction aFunction,TIpcArgs& aArgs); + static HDbsBuf* NewLC(const RDbsObject& aObject,TDbsFunction aFunction,TIpcArgs& aArgs); + static HDbsBuf* NewLC(const RDbs& aDbSession, TDbsFunction aFunction, TIpcArgs& aArgs); + virtual inline ~HDbsBuf(); +private: + inline HDbsBuf(); + void ConstructL(const RDbsObject& aObject,TDbsFunction aFunction,TIpcArgs& aArgs); + void ConstructL(const RDbs& aDbSession, TDbsFunction aFunction, TIpcArgs& aArgs); +// from TStreamBuf + TInt UnderflowL(TInt aMaxLength); + void OverflowL(); + void DoRelease(); + void DoSynchL(); + TInt DoReadL(TAny* aPtr,TInt aMaxLength); + void DoWriteL(const TAny* aPtr,TInt aLength); + TStreamPos DoSeekL(TMark aMark,TStreamLocation aLocation,TInt anOffset); +private: + inline void SetPos(TRead,TInt aPos); + inline void SetPos(TWrite,TInt aPos); + inline TInt Pos(TRead) const; + inline TInt Pos(TWrite) const; + inline TInt MovePos(TRead,TInt anOffset); + inline TInt MovePos(TWrite,TInt anOffset); + TInt IpcReadL(TAny* aPtr,TInt aMaxLength); + void IpcWriteL(const TAny* aPtr,TInt aLength); + TInt EndL(); +// + inline TInt Lag(TRead) const; + inline TInt Lag(TWrite) const; + inline TInt Mark(TRead) const; + inline TInt Mark(TWrite) const; +private: + RDbsObject iIpc; + TInt iRPos; + TInt iWPos; + TDbsStreamBuf iBuf; + }; + +/** +@internalComponent +*/ +NONSHARABLE_CLASS(HDbsReadBuf) : public TMemBuf + { +public: + static HDbsReadBuf* NewL(const TDesC8& aDes); +protected: + inline HDbsReadBuf(const TDesC8& aDes); + void DoRelease(); + }; + +/** +@internalComponent +*/ +NONSHARABLE_CLASS(CDbsObserver) : public CActive + { +public: + /** + @internalComponent + */ + class HObserver + { + friend class CDbsObserver; + public: + ~HObserver(); + void Notify(const RMessage2& aMessage); + void Cancel(); + private: + inline HObserver(); + void Complete(TInt aStatus); + void Event(TInt aEvent); + private: + TDblQueLink iLink; + TInt iPending; + RMessagePtr2 iMessage; + }; + friend class HObserver; +public: + static CDbsObserver* NewL(CDbsSource& aSource); + static CDbsObserver* Collect(CDbsObserver* aNotifier); + HObserver* ObserverL(); +private: + inline CDbsObserver(CDbsSource& aSource); + ~CDbsObserver(); +// + void Queue(); +// from CActive + void RunL(); + void DoCancel(); +private: + CDbsSource& iSource; + CDbNotifier* iNotifier; + TDblQue iQueue; + }; + +/** +@internalComponent +*/ +NONSHARABLE_CLASS(CDbsConnection) : public CDbContext + { + friend class RDbsSources; +public: + inline CDbsSource& Source() const; + static inline const CDbsConnection& Connection(const CDbObject& aObject); + static inline CDbsSource& Source(const CDbObject& aObject); +private: + inline CDbsConnection() {} + ~CDbsConnection(); + inline void Set(CDbsSource& aSource); +private: + CDbsSource* iSource; + }; + +/** +@internalComponent +*/ +class CDbsDatabaseStub : public CDbObject + { +public: + static CDbsDatabaseStub* NewL(); + CDbDatabase* AuthenticateL(); +private: + inline CDbsDatabaseStub(); + }; + +/** +@internalComponent +*/ +NONSHARABLE_CLASS(CDbsSource) : public CBase + { + friend class CDbsConnection; + friend class CDbsObserver; +public: + static CDbsSource* NewL(RFs& aFs,const TDesC& aSource); +// + static inline TInt LinkOffset(); + TBool Is(const TDesC& aSource) const; +// + inline CDbSource& Source(); + CDbsObserver::HObserver* ObserverL(); +private: + inline CDbsSource(const TDbFormat& aFormat); + ~CDbsSource(); + void Closed(); +// + inline void Open(); + void Close(); +private: + TDblQueLink iLink; + HBufC* iName; + const TDbFormat& iFormat; + TInt iConnections; + CDbSource* iSource; + CDbsObserver* iObserver; + }; + +/** +@internalComponent +*/ +class RDbsSources + { +private: + typedef TDblQueIter TIter; +public: + inline RDbsSources(RDbCache& aCache); + inline void Close(); +// + CDbsConnection* OpenLC(RFs& aFs,const TDesC& aSource,const TDesC& aFormat); +private: + TDblQue iSources; + RDbCache iDrivers; + }; + +/** +@internalComponent +*/ +NONSHARABLE_CLASS(CDbsServer) : public CServer2 + { +public: + static CDbsServer* NewL(); +// + inline TDes& Name0(); + inline TDes& Name1(); + inline TDes& FileName(); + inline RDbsSources& Sources(); + inline RFs& Fs(); + inline RDriveSpaceCol& DriveSpaceCol(); + void RemoveSession(); +// + static CDbsServer* Instance(); + void Panic(const TDesC& aCategory,TInt aCode); // .. panic client! + + inline CPolicyProxy& PolicyProxy() const; + inline RDbPropsFactory& DbPropsFactory(); + +private: + inline CDbsServer(); + ~CDbsServer(); + void ConstructL(); +// from CServer + CSession2* NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const; +private: + enum {ECacheSize=8}; + enum {EServerPriority=0}; +private: + RDbCache iCache; + RDbsSources iSources; + TDbName iName0; // used for message servicing + TDbName iName1; + TFileName iFileName; + RFs iFs; + CPolicyProxy* iPolicyProxy; + RDbPropsFactory iDbPropsFactory; + RDriveSpaceCol iDriveSpaceCol; +}; + +/** +@internalComponent +*/ +NONSHARABLE_CLASS(CDbsSession) : public CSession2 + { +private: +#if !defined(_SMALL_BUFFER) + enum {EIndexGranularity=8}; +#else + enum {EIndexGranularity=1}; +#endif + struct TEntry + { + union + { + TAny* iObject; + TInt iNext; + }; + TUint8 iType; + const MPolicy* iPolicy; + TUint8 iMagic; + public: + void Release(); + DECLARE_DB_DUMP3(aFile) + // + inline TDbsType Type() const; + inline CDbsDatabaseStub& DatabaseStub(); + inline CDbDatabase& Database(); + inline CDbIncremental& Incremental(); + inline CDbCursor& Cursor(); + inline CDbRowConstraint& Constraint(); + inline HDbsStream& Stream(); + inline CDbsObserver::HObserver& Observer(); + }; +public: + CDbsSession(); + virtual ~CDbsSession(); +private: +//From CSession2 + virtual void CreateL(); +// from CSession + void ServiceL(const RMessage2& aMessage); + TInt ExtServiceL(const RMessage2& aMessage, TDbsFunction aDbsFunction); + void ServiceError(const RMessage2& aMessage,TInt aError); + TInt CountResources(); +// + inline CDbsServer& Server() const; + inline RDbsSources& Sources(); +// + const TDesC& ReadName0L(TInt aIndex,const RMessage2& aMessage); + const TDesC& ReadName1L(TInt aIndex,const RMessage2& aMessage); + const TDesC& ReadFileNameL(TInt aIndex, const RMessage2& aMessage); + HBufC* ReadHBufLC(TInt aIndex,const RMessage2& aMessage); + HBufC8* ReadHBuf8LC(TInt aIndex,const RMessage2& aMessage); + CDbColSet* ColSetLC(TInt aIndex,const RMessage2& aMessage); + CDbKey* KeyLC(TInt aIndex,const RMessage2& aMessage); + TDbLookupKey* LookupKeyLC(TInt aIndex,TInt aSize,const RMessage2& aMessage); + CDbObject* DoAuthenticateL(CDbsConnection* aDbsConnection, const RMessage2& aMessage); + TInt DoOpenDatabaseL(const RMessage2& aMessage, const TDbProps& aDbProps); + + TDbProps* ExtractDbPropsLC(const RMessage2& aMessage); + TInt OpenDatabaseL(const RMessage2& aMessage); + TInt CreateDatabaseL(const RMessage2& aMessage); + TInt DoCreateDatabaseL(const RMessage2& aMessage, const TDbProps& aDbProps); + void CopyDatabaseL(const RMessage2& aMessage); + void DeleteDatabaseL(const RMessage2& aMessage); + TInt GetDatabaseListL(const RMessage2& aMessage); + void GetSecurityPolicyL(const RMessage2& aMessage); + void ReadRowL(RDbRow& aRow,TInt aSize,const RMessage2& aMessage); + void PutRowL(CDbCursor& aCursor,const RMessage2& aMessage); + TInt WriteRowL(const RDbRow& aRow,const RMessage2& aMessage); + TInt RetrieveRowL(CDbCursor& aCursor,const RMessage2& aMessage); + TInt NewCursorL(CDbCursor* aCursor,const RMessage2& aMessage,const MPolicy* aTblSecurityPolicy); + TInt NewIncrementalL(CDbIncremental* aCursor,TInt& aInit,const RMessage2& aMessage,const MPolicy* aPolicy); + TInt NewStreamL(MStreamBuf* aHost,const RMessage2& aMessage,const MPolicy* aPolicy,TInt aExtent=-1); + TInt NewStreamL(TAny* aPtr,TExternalizeFunction aExter,const RMessage2& aMessage,const MPolicy* aPolicy); + void NewDbEntryL(CDbObject* aDbObject, const TDbPolicyRequest& aDbPolicyRequest, TInt& aDbHandle); + +#ifdef __DBDUMP__ + void Dump(); +#endif + + void ReserveDriveSpaceL(TDriveNumber aDrive); + void FreeReservedSpace(TDriveNumber aDrive); + void GetReserveAccessL(TDriveNumber aDrive); + void ReleaseReserveAccess(TDriveNumber aDrive); + + void GetBackupPathL(const RMessage2& aMessage); + TInt GetBackupPathsL(const RMessage2& aMessage); + + inline TInt Add(CDbIncremental* aIncremental, const MPolicy* aPolicy); + inline TInt Add(CDbCursor* aCursor, const MPolicy* aPolicy); + inline TInt Add(CDbRowConstraint* aConstraint, const MPolicy* aPolicy); + inline TInt Add(HDbsStream* aStream, const MPolicy* aPolicy); + inline TInt Add(CDbsObserver::HObserver* aObserver, const MPolicy* aPolicy); + + TEntry& Object(TInt aHandle); + void AllocL(); + TInt DoAdd(TAny* aObject,TDbsType aType, const MPolicy* aPolicy); + void Free(TEntry& aEntry); + +private: + TEntry* iIx; + TInt iSize; + TInt iFree; + RMap iDbPolicyRqColl; + CDbsSessDriveSpace* iSessDriveSpace; + }; + +/** +@internalComponent +*/ +class HDbsStream + { +public: + inline HDbsStream(MStreamBuf* aHost,TInt aReadPos); + inline ~HDbsStream(); +// + TInt ReadL(const RMessage2& aMessage); + void WriteL(const RMessage2& aMessage); + inline TInt SizeL(); + inline void SynchL(); +private: + MStreamBuf& iHost; + TInt iRPos; + TInt iWPos; + }; + +/** +@internalComponent +*/ +NONSHARABLE_CLASS(HBufBuf) : public TBufBuf + { + enum {EGranularity=512}; +public: + static HBufBuf* NewLC(); +private: + inline HBufBuf(); + virtual inline ~HBufBuf(); + void DoRelease(); +private: + CBufBase* iBuf; + }; + +#include "SD_STD.INL" + + +