persistentstorage/sql/SRC/Server/SqlSrvSession.h
changeset 0 08ec8eefde2f
child 10 fa9941cf3867
--- /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 <e32base.h>				//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<CSqlSrvStatement>	iStatements;			//Container for SQL statement handles
+	RDbObjContainer<HIpcStream>			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__