diff -r 000000000000 -r 08ec8eefde2f persistentstorage/sql/SRC/Server/SqlSrvSession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/sql/SRC/Server/SqlSrvSession.h Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,145 @@ +// Copyright (c) 2005-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: +// + +#ifndef __SQLSRVSESSION_H__ +#define __SQLSRVSESSION_H__ + +#include //CSession2 +#include "IPCStream.h" //HIpcStream +#include "SqlUtil.h" //TSqlSrvFunction +#include "SqlSrvObjContainer.h" //RDbObjContainer +#include "SqlSrvDatabase.h" //CSqlSrvDatabase +#include "SqlSrvResourceProfiler.h" + +//Forward declarations +class CSqlServer; +class CSqlSrvStatement; +class MStreamBuf; +class RMessage2; +class CSqlSecurityPolicy; + +/** +SQL server side session class. + +All client side requests come through a CSqlSrvSession instance which unpacks the client data, +performs the requested operation invoking the appropriate server side objects and functions and +packs and returns back to the client the results from the performed operation. + +CSqlSrvSession class owns the following set of data: +- A CSqlSrvDatabase instance - one per session; +- A RDbObjContainer instance - container for statement handles (CSqlSrvStatement class); +- A RDbObjContainer instance - container for IPC stream hadles (large data block transfer operations) + (HIpcStream class); + +CSqlSrvSession instances shall never be created via a direct call of CSqlSrvSession::NewL(). +It is always the server, which creates a new session instance as a responce to the creation of a client side +session instance (CSqlServer::NewSessionL() function). + +@see CSqlSrvDatabase +@see CSqlSrvStatement +@see RDbObjContainer +@see HIpcStream +@see CSqlServer +@see CSqlServer::NewSessionL() +@see CSession2 + +@internalComponent +*/ +NONSHARABLE_CLASS(CSqlSrvSession) : public CSession2 + { +public: + static CSqlSrvSession* NewL(); + virtual ~CSqlSrvSession(); + inline CSqlServer& Server(); + +private: + inline CSqlSrvSession(); + inline void ConstructL(); + //CSession2::ServiceL() implementation and overriden CSession2::ServiceError(). + virtual void ServiceL(const RMessage2& aMessage); + virtual void ServiceError(const RMessage2& aMessage, TInt aError); + //Profiler operations + void ProfilerQueryL(const RMessage2& aMessage); + //Database operations + void DbCreateObjectL(const RMessage2& aMessage, TSqlSrvFunction aFunction); + void DbCreateObjectFromHandleL(const RMessage2& aMessage); + void DbAttachL(const RMessage2& aMessage); + void DbAttachFromHandleL(const RMessage2& aMessage); + void DbDetachL(const RMessage2& aMessage); + inline void DbDestroyObject(); + void DbCopyFileL(const RMessage2& aMessage); + void DbDeleteFileL(const RMessage2& aMessage); + TInt DbLastErrorMessageL(const RMessage2& aMessage); + void DbLastInsertedRowIdL(const RMessage2& aMessage); + inline TInt DbExecSql8L(const RMessage2& aMessage); + inline TInt DbExecSql16L(const RMessage2& aMessage); + inline void DbSetIsolationLevelL(const RMessage2& aMessage); + TInt DbGetSecurityPolicyL(const RMessage2& aMessage); + TInt DbScalarFullSelectL(const RMessage2& aMessage, TBool aIsText16); + TInt DbBlobSourceL(const RMessage2& aMessage); + TBool DbInTransaction(const RMessage2& aMessage); + TInt DbSizeL(const RMessage2& aMessage); + void DbSize2L(const RMessage2& aMessage); + TInt DbCompactL(const RMessage2& aMessage); + void DbReserveDriveSpaceL(); + void DbFreeReservedSpace(); + void DbGetReserveAccessL(); + void DbReleaseReserveAccess(); + //Statement operations + TInt StmtPrepareL(const RMessage2& aMessage, TBool aIsText16); + TInt StmtExecL(const RMessage2& aMessage, TInt aStmtHandle, TSqlSrvFunction aFunction); + TInt StmtNextL(const RMessage2& aMessage, TInt aStmtHandle, TSqlSrvFunction aFunction); + TInt StmtNamesL(const RMessage2& aMessage, TInt aStmtHandle, TSqlSrvFunction aFunction); + TInt StmtColumnSourceL(const RMessage2& aMessage, TInt aStmtHandle); + TInt StmtParamSinkL(const RMessage2& aMessage, TInt aStmtHandle, TSqlSrvFunction aFunction); + void StmtGetBufFlatL(const RMessage2& aMessage, TInt aStmtHandle); + void StmtColumnValueL(const RMessage2& aMessage, TInt aStmtHandle); + void DoStmtBindL(const RMessage2& aMessage, CSqlSrvStatement& aStmt); + void StmtDeclColumnTypesL(const RMessage2& aMessage, TInt aStmtHandle); + //Helper methods + TInt NewOutputStreamL(const RMessage2& aMessage, MStreamBuf* aStreamBuf); + TDes8& ReadString8ZL(const RMessage2& aMessage, TInt aArgNum, TInt aByteLen); + TDes16& ReadString16ZL(const RMessage2& aMessage, TInt aArgNum, TInt aCharLen); + TDes16& ReadString16L(const RMessage2& aMessage, TInt aArgNum, TInt aCharLen); + CSqlSecurityPolicy* InternalizeSecurityPolicyL(const RMessage2& aMessage); + virtual TInt CountResources(); + void Extract(const RMessage2& aMessage, TSqlSrvFunction& aFunction, TInt& aHandle); + TInt GetColumnValueL(const RMessage2& aMessage, CSqlSrvStatement& aStmt, TSqlColumnType aColType); + void ExtractNameL(RDesReadStream& aStrm, TDes8& aNameOut, const TDesC& aEmptyNameSubstitute = KNullDesC); + //Resource allocation testing related + inline TBool ActivateDbTestMode(TInt aHeapFailureMode, TInt aFailedAllocNumber); + inline void StopDbTestMode(); + inline void DbResourceMark(); + inline void DbResourceEnd(const RMessage2& aMessage); + inline void DbSetAllocFail(TInt aHeapFailureMode, TInt aFailedAllocNumber); + inline void DbSetDelayedAllocFail(); +private: + CSqlSrvDatabase* iDatabase; //The database object (one per session) + RDbObjContainer iStatements; //Container for SQL statement handles + RDbObjContainer iIpcStreams; //Container for IPC stream hansdles + TInt iDbResourceTestMode; //Non-zero if this session is in test mode (memory leaks simulation/detection) + TInt iFailedAllocNumber; //The failing allocation number - If iDbResourceTestMode is OR-ed with 0x1000 + TBool iDriveSpaceReserved; //True if this session reserved drive space + TBool iDriveSpaceInUse; //True if the client has been given an access to the reserved drive space + TDriveNumber iDrive; //the drive number, where the database file is +#ifdef _SQLPROFILER + TUint iIpcCounter; + TSqlSrvIpcTraceData iIpcTraceData[KIpcTraceTypeCount]; +#endif + }; + +#include "SqlSrvSession.inl" + +#endif//__SQLSRVSESSION_H__