persistentstorage/sql/INC/SqlResourceProfiler.h
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/sql/INC/SqlResourceProfiler.h	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,244 @@
+// 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:
+// Symbian SQL Resource Profiler header file
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+#ifndef __SQLRESOURCEPROFILER_H__
+#define __SQLRESOURCEPROFILER_H__
+
+#include <sqldb.h>
+
+/**
+Symbian SQL profiling interface.
+TSqlResourceProfiler class is used for:
+
+@code
+
+ -	Retrieving the current state of the SQL server heap and SQLite heap stats.
+   	Example:
+		RSqlDatabase db;
+		//initialize the db object....
+		...
+		TSqlResourceProfiler profiler(db);
+		profiler.Start(TSqlResourceProfiler::ESqlCounterMemory);//Start the profiling
+		profiler.Reset(TSqlResourceProfiler::ESqlCounterMemory);//Zero the porfiling counters
+		....
+		profiler.Stop(TSqlResourceProfiler::ESqlCounterMemory); //Stop the profiling
+		TBuf8<128> res;
+		profiler.Query(TSqlResourceProfiler::ESqlCounterMemory, res);
+	The format of the retrieved counters is:   
+		"<Allocated cells count>;<Allocated size>;<Free space>;<Largest block size>;
+		 <SQLite: allocated cnt>;<SQLite: reallocated cnt>;<SQLite: freed cnt>;
+		 <SQLite: allocated bytes>;<SQLite: freed bytes>;
+		 <SQLite: time spent in alloc(), us>;<SQLite: time spent in realloc(), us>;<SQLite: time spent in free(), us>;";
+	This service can be used only if the SQL code is compiled with the _SQLPROFILER macro.
+		
+ - Retrieving the size of the biggest memory block ever allocated by the Symbian SQL server and SQLite.
+   	Example:
+		RSqlDatabase db;
+		//initialize the db object....
+		...
+		TSqlResourceProfiler profiler(db);
+		.....
+		profiler.Start(TSqlResourceProfiler::ESqlCounterMaxAlloc);//Start the profiling
+		.....
+		TBuf8<32> res;
+		profiler.Query(TSqlResourceProfiler::ESqlCounterMaxAlloc, res);
+		...
+		profiler.Reset(TSqlResourceProfiler::ESqlCounterMaxAlloc);//Reset the profiling 
+		....
+		profiler.Stop(TSqlResourceProfiler::ESqlCounterMaxAlloc);
+	The format of the retrieved counters is: 
+		"<SQL server - max alloc size>;<SQLite - max alloc size>";
+	This service can be used only if the SQL code is compiled with the _SQLPROFILER macro.
+
+ - Retrieving the number of the file system calls made by the OS porting layer and the amount of written/read data.
+  	Example:
+		RSqlDatabase db;
+		//initialize the db object....
+		...
+		TSqlResourceProfiler profiler(db);
+		.....
+		profiler.Start(TSqlResourceProfiler::ESqlCounterFileIO);//Start the profiling
+		.....
+		TBuf8<300> res;
+		profiler.Query(TSqlResourceProfiler::ESqlCounterFileIO, res);
+		.....
+		profiler.Reset(TSqlResourceProfiler::ESqlCounterFileIO);//Reset the profiling 
+		....
+		profiler.Stop(TSqlResourceProfiler::ESqlCounterFileIO);
+	The format of the retrieved data is: 
+	"<RFileBuf64::Create() cnt>;<RFileBuf64::Open() cnt>;<RFileBuf64::Close() cnt>;<RFs::Delete() cnt>;
+	 <RFileBuf64::Read() cnt>;<RFileBuf64::Write() cnt>;<RFileBuf64::Seek() cnt>;<RFileBuf64::Size() cnt>;<RFileBuf64::SetSize() cnt>;
+	 <RFileBuf64::Flush() cnt>;<RFile64::Drive() cnt>;<RFileBuf64::AdoptFromClient() cnt>;<RFs::Close() cnt>;
+	 <RFs::Connect() cnt>;<RFs::GetSystemDrive() cnt>;<RFs::CreatePrivatePath() cnt>;<RFs::PrivatePath() cnt>;
+	 <RFs::VolumeIoParam() cnt>;<RFs::Entry() cnt>;<RFs::Att() cnt>;<RFileBuf64::Temp() cnt>;<0>;
+	 <bytes written>;<bytes read>;"
+	Note that currently the file operations are buffered, so the retrieved results will be about the operations executed on a
+	RFileBuf64 objects.
+	This service can be used only if the SQL code is compiled with the _SQLPROFILER macro.
+
+ - Retrieving information regading the current SQL/SQLite configuration.
+  	Example:
+		RSqlDatabase db;
+		//initialize the db object....
+		...
+		TSqlResourceProfiler profiler(db);
+		TBuf8<128> res;
+		profiler.Query(TSqlResourceProfiler::ESqlCounterConfig, res);
+	The format of the retrieved numbers is:   
+		"<Cache size in pages>;<Page size in bytes>;<Database encoding>;<Default soft heap limit>;<SQLite vacuum mode>";
+
+ - Retrieving the number of the OS porting layer calls made by SQLite.
+  	Example:
+		RSqlDatabase db;
+		//initialize the db object....
+		...
+		TSqlResourceProfiler profiler(db);
+		.....
+		profiler.Start(TSqlResourceProfiler::ESqlCounterOsCall);//Start the profiling
+		.....
+		TBuf8<300> res;
+		profiler.Query(TSqlResourceProfiler::ESqlCounterOsCall, res);
+		.....
+		profiler.Reset(TSqlResourceProfiler::ESqlCounterOsCall);//Reset the profiling 
+		....
+		profiler.Stop(TSqlResourceProfiler::ESqlCounterOsCall);
+	The format of the retrieved data is: 
+	"<file close cnt>;<file read cnt>;<file write cnt>;<file truncate cnt>;
+	 <file sync cnt>;<file size cnt>;<file lock cnt>;<file unlock cnt>;<file check reserved lock cnt>;
+	 <file i/o control cnt>;<file sector size cnt>;<file device characteristics cnt>;<vfs open cnt>;
+	 <vfs delete cnt>;<vfs access cnt>;<vfs full path name cnt>;<vfs randomness cnt>;
+	 <vfs sleep cnt>;<vfs current time cnt>;<vfs get last error cnt>;"
+	This service can be used only if the SQL code is compiled with the _SQLPROFILER macro.
+   	
+ - Retrieving the OS porting layer call times in microseconds per call type.
+  	Example:
+		RSqlDatabase db;
+		//initialize the db object....
+		...
+		TSqlResourceProfiler profiler(db);
+		.....
+		profiler.Start(TSqlResourceProfiler::ESqlCounterOsCallTime);//Start the profiling
+		.....
+		TBuf8<300> res;
+		profiler.Query(TSqlResourceProfiler::ESqlCounterOsCallTime, res);
+		.....
+		profiler.Reset(TSqlResourceProfiler::ESqlCounterOsCallTime);//Reset the profiling 
+		....
+		profiler.Stop(TSqlResourceProfiler::ESqlCounterOsCallTime);
+	The format of the retrieved data is: 
+	"<file close time>;<file read time>;<file write time>;<file truncate time>;
+	 <file sync time>;<file size time>;<file lock time>;<file unlock time>;<file check reserved lock time>;
+	 <file i/o control time>;<file sector size time>;<file device characteristics time>;<vfs open time>;
+	 <vfs delete time>;<vfs access time>;<vfs full path name time>;<vfs randomness time>;
+	 <vfs sleep time>;<vfs current time time>;<vfs get last error time>;"
+	This service can be used only if the SQL code is compiled with the _SQLPROFILER macro.
+
+ - Retrieving the OS porting layer call times in microseconds per call type plus adding a log entry 
+   for each call. The returned information is the same as for the previous profiling type.
+   But for each OS porting layer call an entry is added to the log file (epocwind.out).
+   The format of the log entry is:
+   	<'M'/'J'>,<'Call Id'>,<#Counter>,<Call Counter>,<File Offset>,<Bytes>,<Ticks>,<Bytes Total>,<Ticks Total>
+   Note: ESqlCounterOsCallDetails and ESqlCounterOsCallTime profiles cannot be used together.
+
+ - Retrieving the number of the IPC calls and IPC read/write operations.
+  	Example:
+		RSqlDatabase db;
+		//initialize the db object....
+		...
+		TSqlResourceProfiler profiler(db);
+		.....
+		profiler.Start(TSqlResourceProfiler::ESqlCounterIpc);//Start the profiling
+		.....
+		TBuf8<300> res;
+		profiler.Query(TSqlResourceProfiler::ESqlCounterIpc, res);
+		.....
+		profiler.Reset(TSqlResourceProfiler::ESqlCounterIpc);//Reset the profiling 
+		....
+		profiler.Stop(TSqlResourceProfiler::ESqlCounterIpc);
+	The format of the retrieved data is: 
+	"<IPC call cnt>;<IPC write cnt>;<IPC read cnt>;<IPC write bytes>;<IPC read bytes>;
+	This service can be used only if the SQL code is compiled with the _SQLPROFILER macro.
+   	
+ - Tracing the executed SQL statements and IPC calls.
+   The folowing tracing configurations can be used (pased as a configuration parameter in TSqlResourceProfiler::Start()):
+   - "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;
+    Example:
+        RSqlDatabase db;
+        //initialize the db object....
+        ...
+        TSqlResourceProfiler profiler(db);
+        .....
+        _LIT8(KConfig, "<config string>");
+        profiler.Start(TSqlResourceProfiler::ESqlCounterTrace, &KConfig);//Start the profiling
+        .....
+        profiler.Stop(TSqlResourceProfiler::ESqlCounterTrace);
+    The format of the traces is:
+    - SQL statement trace:
+      <DbHandle>¬<TimeFromStart>¬SQL¬Prepare/Exec¬<SQL statemment>
+    - "Database create" trace:
+      <DbHandle>¬<TimeFromStart>¬CRE¬<database file path>
+    - "Database open" trace:
+      <DbHandle>¬<TimeFromStart>¬OPN¬<database file path>
+    - "Database close" trace:
+      <DbHandle>¬<TimeFromStart>¬CSE
+    - "IPC call error" trace:
+      <DbHandle>¬<TimeFromStart>¬ERR¬<IPC counter>¬<IPC call name>¬err=<error code>
+    - "IPC call level 1 or level 2" trace:
+      <DbHandle>¬<TimeFromStart>¬IPC¬<IPC counter>¬<IPC call name>¬<TotalExecTime>¬<ExecTime>¬<ThisCallIpcCount>¬..¬rc=<ret code>
+    This service can be used only if the SQL code is compiled with the _SQLPROFILER macro.
+@endcode
+
+@internalComponent
+*/
+class TSqlResourceProfiler
+	{
+public:
+	enum TSqlCounter
+		{
+		ESqlCounterFileIO,
+		ESqlCounterOsCall,
+		ESqlCounterOsCallTime,
+		ESqlCounterOsCallDetails,
+		ESqlCounterIpc,
+		ESqlCounterMemory,
+		ESqlCounterMaxAlloc,
+		ESqlCounterConfig,
+		ESqlCounterTrace
+		};
+	IMPORT_C TSqlResourceProfiler(RSqlDatabase& aDatabase);
+	IMPORT_C TInt Start(TSqlCounter aCounterType, const TDesC8* aParam = NULL);
+	IMPORT_C TInt Stop(TSqlCounter aCounterType);
+	IMPORT_C TInt Reset(TSqlCounter aCounterType);
+	IMPORT_C TInt Query(TSqlCounter aCounterType, TDes8& aResult);
+	
+private:	
+	RSqlDatabase iDatabase;
+	
+	};
+
+#endif //__SQLRESOURCEPROFILER_H__