// 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:
//

#include "SqlResourceProfiler.h"
#include "SqlPanic.h"
#include "SqlDatabaseImpl.h"


/**
Initializes TSqlResourceProfiler data members with their default values.

@param aDatabase The RSqlDatabase object that will be profiled.
*/
EXPORT_C TSqlResourceProfiler::TSqlResourceProfiler(RSqlDatabase& aDatabase) :
	iDatabase(aDatabase)
	{
	}

#ifdef _SQLPROFILER
	
/**
Starts the specified profiling counter.

@param aCounterType Profiling counter type.
@param aPrm Additional profiling parameters.

@capability None

@return KErrNone, the operation completed successfully;
                  One of the other system-wide error codes may also be returned.

Usage of the IPC call arguments:
 - Arg 0: [out]  profiling counter type, one of the TSqlResourceProfiler::TSqlCounter enum item values.
 
When the counter type is ESqlCounterTrace, then the optional aPrm argument can contain the follwing 
configuration parameters, split with ";":
   - "L0" - [default] tracing level 0. IPC traces disabled;
   - "L1" - tracing level 1. Only the most important IPC calls are traced:
            ESqlSrvDbExec8, ESqlSrvDbExec16, ESqlSrvDbScalarFullSelect16, ESqlSrvStmtExec,
            ESqlSrvStmtAsyncExec, ESqlSrvStmtBindExec, ESqlSrvStmtAsyncBindExec, ESqlSrvStmtNext,
            ESqlSrvStmtBindNext;
   - "L2" - tracing level 2. All IPC calls traced;
   - "S0" - [default] SQL statement tracing is off; 
   - "S1" - SQL statement tracing is on;
*/
EXPORT_C TInt TSqlResourceProfiler::Start(TSqlResourceProfiler::TSqlCounter aCounterType, const TDesC8* aPrm)
	{
	TIpcArgs ipcArgs;
	ipcArgs.Set(0, aCounterType);
    ipcArgs.Set(1, 0);
	if(aPrm)
	    {
        ipcArgs.Set(1, aPrm->Length());
        ipcArgs.Set(2, aPrm);
	    }
	return iDatabase.Impl().Session().SendReceive(ESqlSrvProfilerStart, ipcArgs);
	}
	
/**
Stops the specified profiling counter.

@param aCounterType Profiling counter type.

@capability None

@return KErrNone, the operation completed successfully;
                  One of the other system-wide error codes may also be returned.

Usage of the IPC call arguments:
 - Arg 0: [out]  profiling counter type, one of the TSqlResourceProfiler::TSqlCounter enum item values.
*/
EXPORT_C TInt TSqlResourceProfiler::Stop(TSqlResourceProfiler::TSqlCounter aCounterType)
	{
	return iDatabase.Impl().Session().SendReceive(ESqlSrvProfilerStop, TIpcArgs(aCounterType));
	}
	
/**
Sets to zero the specified profiling counter.

@param aCounterType Profiling counter type.

@capability None

@return KErrNone, the operation completed successfully;
                  One of the other system-wide error codes may also be returned.

Usage of the IPC call arguments:
 - Arg 0: [out]  profiling counter type, one of the TSqlResourceProfiler::TSqlCounter enum item values.
*/
EXPORT_C TInt TSqlResourceProfiler::Reset(TSqlResourceProfiler::TSqlCounter aCounterType)
	{
	return iDatabase.Impl().Session().SendReceive(ESqlSrvProfilerReset, TIpcArgs(aCounterType));
	}
	
/**
Retrieves the profiling counter(s) values for the aCounterType.

@param aCounterType Profiling counter type.
@param aResult Buffer, where the results will be copied.

@capability None

@return KErrNone, the operation completed successfully;
                  One of the other system-wide error codes may also be returned.
                  
@see TSqlResourceProfiler

Usage of the IPC call arguments:
 - Arg 0: [out]  profiling counter type, one of the TSqlResourceProfiler::TSqlCounter enum item values.
 - Arg 1: [out]  the size of the buffer for the profiling counters
 - Arg 2: [in]   the buffer for the profiling counters
*/
EXPORT_C TInt TSqlResourceProfiler::Query(TSqlResourceProfiler::TSqlCounter aCounterType, TDes8& aResult)
	{
	return iDatabase.Impl().Session().SendReceive(ESqlSrvProfilerQuery, TIpcArgs(aCounterType, aResult.MaxLength(), &aResult));
	}

#else //_SQLPROFILER

EXPORT_C TInt TSqlResourceProfiler::Start(TSqlResourceProfiler::TSqlCounter, const TDesC8*)
	{
	return KErrNotSupported;
	}
	
EXPORT_C TInt TSqlResourceProfiler::Stop(TSqlResourceProfiler::TSqlCounter)
	{
	return KErrNotSupported;
	}
	
EXPORT_C TInt TSqlResourceProfiler::Reset(TSqlResourceProfiler::TSqlCounter)
	{
	return KErrNotSupported;
	}
	
EXPORT_C TInt TSqlResourceProfiler::Query(TSqlResourceProfiler::TSqlCounter aCounterType, TDes8& aResult)
	{
	if(aCounterType == TSqlResourceProfiler::ESqlCounterConfig)	
		{
		return iDatabase.Impl().Session().SendReceive(ESqlSrvProfilerQuery, TIpcArgs(aCounterType, aResult.MaxLength(), &aResult));
		}
	return KErrNotSupported;
	}

#endif//_SQLPROFILER
