persistentstorage/sqlite3api/OsLayer/SqliteUtil.cpp
branchRCL_3
changeset 23 26645d81f48d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/sqlite3api/OsLayer/SqliteUtil.cpp	Tue Aug 31 16:57:14 2010 +0300
@@ -0,0 +1,167 @@
+// Copyright (c) 2010 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 <e32debug.h>
+#include "SqliteUtil.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "SqliteUtilTraces.h"
+#endif
+#include "SqliteTraceDef.h"
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#define UNUSED_ARG(arg) arg = arg
+#define UNUSED_DES(arg) arg
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#if defined OST_TRACE_COMPILER_IN_USE &&  defined _SQLITE_RDEBUG_PRINT
+
+/**
+This class has been added here to avoid the crashes when _SQLITE_RDEBUG_PRINT macro is defined but the
+data to be printed out is too big and cannot fit into the buffer with size KSqliteMaxPrnStrLen.
+@internalComponent   
+*/
+class TSqliteDes16Overflow : public TDes16Overflow
+    {
+public:    
+    virtual void Overflow(TDes16& /*aDes*/)
+        {
+        }
+    };
+
+//Replaces:
+// "%lld" with "%ld"
+//These are the differences in format specification between RDebig::Print and OST functions.
+//The new format spec length should be less or equal than the old format spec length.
+static void ReplaceFmtSpec(TDes& aFormat, const TDesC& aFmtSpec, const TDesC& aNewFmtSpec)
+	{
+	TInt fmtLength = aFormat.Length();
+	const TInt KDiff = aFmtSpec.Length() - aNewFmtSpec.Length();
+    TPtr ptr((TText*)aFormat.Ptr(), fmtLength, fmtLength);
+    TInt pos;
+    while((pos = ptr.Find(aFmtSpec)) >= 0)
+    	{
+		ptr.Replace(pos, aFmtSpec.Length(), aNewFmtSpec);
+		fmtLength -= KDiff;
+		ptr.Set(ptr.MidTPtr(pos));
+    	}
+    aFormat.SetLength(fmtLength);
+	}
+
+void SqlitePrintf(TInt /*aGroupName*/, TInt /*aTraceName*/, const char* aFormat, ...)
+    {
+    VA_LIST list;
+    VA_START(list, aFormat);
+    TBuf<128> format;
+    _LIT(KTraceIdent, "Sqlite3;");
+    format.Copy(TPtrC8((const TUint8*)aFormat));
+    format.Insert(0, KTraceIdent);
+    format.Append(_L("\r\n"));
+    _LIT(KOstI64Fmt, "%lld");
+    _LIT(KDbgPrnI64Fmt, "%ld");
+    ReplaceFmtSpec(format, KOstI64Fmt, KDbgPrnI64Fmt);
+    TBuf<KSqliteMaxPrnStrLen> buf;
+    TSqliteDes16Overflow overflowHandler;
+    buf.AppendFormatList(format, list, &overflowHandler);
+#ifdef _SQLITE_RDEBUG_PRINT    
+    RDebug::RawPrint(buf);
+#endif
+    }
+
+#endif//defined OST_TRACE_COMPILER_IN_USE &&  defined _SQLITE_RDEBUG_PRINT 
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+SQLite panic category.
+
+@internalComponent
+*/
+_LIT(KSqlitePanicCategory, "Sqlite3");
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+Panics the caller with aPanicCode panic code.
+The call will terminate the thread where it is called from.
+
+@param aPanicCode Panic code.
+
+@internalComponent
+*/
+static void SqlitePanic(TSqlitePanic aPanicCode)
+	{
+	User::Panic(KSqlitePanicCategory, aPanicCode);
+	}
+	
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+The function prints out a "SQLite" panic message to the console and panics the thread where it is called from.
+It gives a useful information about the found error together with the source file name and line number where
+it occurred.
+
+Note: this function  will output information regarding the panic only if _SQLITE_PANIC_TRACE_ENABLED macro is defined  
+
+@param aFile Source file name
+@param aLine Source line number
+@param aPanicCode Panic code
+@param aHandle Numeric value, uniquely identfying the leaving location (the "this" pointer for example)
+
+@return KErrNone
+
+@internalComponent
+*/  
+TInt TSqliteUtil::Panic(const TText* aFile, TInt aLine, TInt aPanicCode, TUint aHandle)
+    {
+#if defined OST_TRACE_COMPILER_IN_USE && defined _SQLITE_PANIC_TRACE_ENABLED
+    TPtrC fname(FileName(aFile));
+    OstTraceExt5(TRACE_FATAL, TSQLUTIL_PANIC, "Panic;0x%X;%S;%d;%S;%d", aHandle, __SQLITEPRNSTR(fname), aLine, __SQLITEPRNSTR(KSqlitePanicCategory), aPanicCode);
+#else
+    UNUSED_ARG(aFile);
+    UNUSED_ARG(aLine);
+    UNUSED_ARG(aHandle);
+#endif      
+    ::SqlitePanic(static_cast <TSqlitePanic> (aPanicCode));
+    return KErrNone;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#if defined OST_TRACE_COMPILER_IN_USE && defined _SQLITE_PANIC_TRACE_ENABLED
+
+/**
+The function creates and returns TPtrC object which points to aFile parameter.
+
+@param aFile File name
+@return TPtrC object pointing to aFile parameter.
+
+@internalComponent
+*/	
+TPtrC TSqliteUtil::FileName(const TText* aFile)
+	{
+	TPtrC p(aFile);
+	TInt ix = p.LocateReverse('\\');
+	if(ix<0)
+		ix=p.LocateReverse('/');
+	if(ix>=0)
+		p.Set(p.Mid(1+ix));
+	return p;
+	}
+
+#endif //defined OST_TRACE_COMPILER_IN_USE && defined _SQLITE_PANIC_TRACE_ENABLED
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////