// Copyright (c) 2008-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 __SQLSRVRESOURCEPROFILER_H__
#define __SQLSRVRESOURCEPROFILER_H__

#include <e32cmn.h>
#include "SqlUtil.h"

#ifdef _SQLPROFILER

///////////////////////////////// Heap max alloc /////////////////////////////////////

extern TBool TheSqlSrvProfilerMaxAllocEnabled;
extern TInt  TheSqlSrvProfilerMaxAllocSize;

#define SQLPROFILER_REPORT_ALLOC(size) 													\
	do																					\
		{																				\
		if(TheSqlSrvProfilerMaxAllocEnabled && (size) > TheSqlSrvProfilerMaxAllocSize) 	\
			{																			\
			TheSqlSrvProfilerMaxAllocSize = (size);										\
			}																			\
		}																				\
	while(0)

///////////////////////////////// IPC counters ///////////////////////////////////////

enum TSqlIpcType
		{
		ESqlIpcRq,
		ESqlIpcRead,
		ESqlIpcWrite,
		//	
		ESqlIpcLast
		};

extern TBool TheSqlSrvProfilerIpcEnabled;
extern TInt  TheSqlSrvProfilerIpc[];
extern TInt64 TheSqlSrvProfilerIpcBytes[];

#define SQLPROFILER_REPORT_IPC(type, bytes) 				\
		do													\
			{												\
			if(TheSqlSrvProfilerIpcEnabled)					\
				{											\
				++TheSqlSrvProfilerIpc[type];				\
				TheSqlSrvProfilerIpcBytes[type] += bytes;	\
				}											\
			}												\
		while(0)

////////////////////////// IPC & SQL tracing related /////////////////////////////////

//Every time, when the SQL server starts, the time is stored in TheSqlSrvStartTime variable.
//It is used later to calculate and trace the time offset of particular trace. 
extern TTime TheSqlSrvStartTime;

//Level 1 IPC calls count. IPC calls types included:
// ESqlSrvDbExec8, ESqlSrvDbExec16, ESqlSrvDbScalarFullSelect16, ESqlSrvStmtExec,
// ESqlSrvStmtAsyncExec, ESqlSrvStmtBindExec, ESqlSrvStmtAsyncBindExec, ESqlSrvStmtNext,
// ESqlSrvStmtBindNext;
const TInt KIpcTraceTypeCount = 10; 

//A TSqlIpcTraceData array of KIpcTraceTypeCount elements is a member of the CSqlSrvSession class.
//During the tracing, if level 1 or level 2 is enabled, all relevant information is summarized there.
struct TSqlSrvIpcTraceData
    {
    TInt64  iExecutionTime;     //The summary of the execution time spent in particular level 1 IPC call
    TInt    iCount;             //The IPC call count for particular level 1 call               
    };

///////////////////  IPC & SQL tracing functions and macros ///////////////////////////////

void   SqlIpcStart(TUint& aIpcCounter, TUint32& aStartTicks, TUint aDbHandle);
void   SqlIpcEnd(TUint aIpcCounter, TUint32 aStartTicks, TSqlSrvFunction aFuncCode, 
                 TUint aDbHandle, TSqlSrvIpcTraceData aIpcTraceData[], TInt aRetCode);
void   SqlIpcError(TUint aIpcCounter, TSqlSrvFunction aFuncCode, TUint aDbHandle, TInt aError);
void   SqlPrintSql16(TUint aDbHandle, const TDesC& aSql, TBool aPrepare);
void   SqlPrintSql8(TUint aDbHandle, const TDesC8& aSql, TBool aPrepare);

void   SqlPrintDbCreate(TUint aDbHandle, const TDesC& aDbName);
void   SqlPrintDbOpen(TUint aDbHandle, const TDesC& aDbName);
void   SqlPrintDbClose(TUint aDbHandle);

void   SqlPrintServerStart();
void   SqlPrintServerStop();

#define SQLPROFILER_IPC_START(aIpcCounter, aDbHandle) \
    TUint32 startTicks = 0;\
    SqlIpcStart(aIpcCounter, startTicks, aDbHandle)

#define SQLPROFILER_IPC_END(aIpcCounter, aFuncCode, aDbHandle, aIpcTraceData, aRetCode) \
    SqlIpcEnd(aIpcCounter, startTicks, aFuncCode, aDbHandle, aIpcTraceData, aRetCode)

#define SQLPROFILER_IPC_ERROR(aIpcCounter, aFuncCode, aDbHandle, aError) \
    SqlIpcError(aIpcCounter, aFuncCode, aDbHandle, aError)

#define SQLPROFILER_SQL16_PRINT(aDbHandle, aSql, aPrepare) \
    SqlPrintSql16(aDbHandle, aSql, aPrepare)

#define SQLPROFILER_SQL8_PRINT(aDbHandle, aSql, aPrepare) \
    SqlPrintSql8(aDbHandle, aSql, aPrepare)

#define SQLPROFILER_DB_CREATE(aDbHandle, aDbName) \
    SqlPrintDbCreate(aDbHandle, aDbName)

#define SQLPROFILER_DB_OPEN(aDbHandle, aDbName) \
    SqlPrintDbOpen(aDbHandle, aDbName)

#define SQLPROFILER_DB_CLOSE(aDbHandle) \
    SqlPrintDbClose(aDbHandle)

#define SQLPROFILER_SERVER_START() \
    SqlPrintServerStart()

#define SQLPROFILER_SERVER_STOP() \
    SqlPrintServerStop()

///////////////////////////////////////////////////////////////////////////////////////

#else//_SQLPROFILER

#define SQLPROFILER_REPORT_ALLOC(size) do {} while(0)
#define SQLPROFILER_REPORT_IPC(type, bytes) do {} while(0)

#define SQLPROFILER_IPC_START(aIpcCounter, aDbHandle) do {} while(0)
#define SQLPROFILER_IPC_END(aIpcCounter, aFuncCode, aDbHandle, aIpcTraceData, aRetCode) do {} while(0)
#define SQLPROFILER_IPC_ERROR(aIpcCounter, aFuncCode, aDbHandle, aError) do {} while(0)
#define SQLPROFILER_SQL16_PRINT(aDbHandle, aSql, aPrepare) do {} while(0)
#define SQLPROFILER_SQL8_PRINT(aDbHandle, aSql, aPrepare) do {} while(0)

#define SQLPROFILER_DB_CREATE(aDbHandle, aDbName) do {} while(0)
#define SQLPROFILER_DB_OPEN(aDbHandle, aDbName) do {} while(0)
#define SQLPROFILER_DB_CLOSE(aDbHandle) do {} while(0)

#define SQLPROFILER_SERVER_START() do {} while(0) 
#define SQLPROFILER_SERVER_STOP() do {} while(0)

#endif//_SQLPROFILER

/**
This class can be used for collecting information regarding the SQL server resources usage.

@see TSqlResourceProfiler
@internalComponent
*/
NONSHARABLE_CLASS(TSqlSrvResourceProfiler)
	{
public:
	static void StartL(const RMessage2&);
	static void StopL(const RMessage2&);
	static void ResetL(const RMessage2&);
	static void QueryL(const RMessage2&);
	
	};
	
#endif//__SQLSRVRESOURCEPROFILER_H__
