diff -r 000000000000 -r 08ec8eefde2f persistentstorage/sql/SRC/Common/SqlBufIterator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/sql/SRC/Common/SqlBufIterator.cpp Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,224 @@ +// Copyright (c) 2006-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 //Math class +#include //TMemBuf +#include "SqlBufIterator.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////// TSqlBufIterator class ///////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +@return Represents the content of the current flat buffer field as integer value. +*/ +inline TInt TSqlBufRIterator::AsInt() const + { + __SQLASSERT(iCurrent >= iBegin && iCurrent < iEnd, ESqlPanicInternalError); + return *reinterpret_cast (reinterpret_cast (iBegin) + iCurrent->iPos); + } + +/** +@return Represents the content of the current flat buffer field as 64 bit integer value. +*/ +inline TInt64 TSqlBufRIterator::AsInt64() const + { + __SQLASSERT(iCurrent >= iBegin && iCurrent < iEnd, ESqlPanicInternalError); + return *reinterpret_cast (reinterpret_cast (iBegin) + iCurrent->iPos); + } + +/** +@return Represents the content of the current flat buffer field as real value. +*/ +inline TReal TSqlBufRIterator::AsReal() const + { + __SQLASSERT(iCurrent >= iBegin && iCurrent < iEnd, ESqlPanicInternalError); + return *reinterpret_cast (reinterpret_cast (iBegin) + iCurrent->iPos); + } + +/** +@return Represents the content of the current flat buffer field as integer value. + If the current flat buffer field type does not refer to an integer, then + the function will do a data conversion as described in the table which can be found + in SqlBufIterator.h file. +*/ +TInt TSqlBufRIterator::Int() const + { + __SQLASSERT(iCurrent >= iBegin && iCurrent < iEnd, ESqlPanicInternalError); + switch(Type()) + { + case ESqlInt64: + { + TInt64 val = AsInt64(); + return val == (TInt)val ? (TInt)val : (val < KMinTInt ? KMinTInt : KMaxTInt); + } + case ESqlReal: + { + TReal roundVal; + TInt err = Math::Round(roundVal, AsReal(), 0); + if(err != KErrNone) + { + return KMinTInt; + } + TRealX val(roundVal); + return static_cast (val); + } + case ESqlNull: + case ESqlText: + case ESqlBinary: + return 0; + case ESqlZeroBlob: + return AsInt(); + default: + return AsInt(); + } + } + +/** +@return Represents the content of the current flat buffer field as 64 bit integer value. + If the current flat buffer field type does not refer to a 64 bit integer, then + the function will do a data conversion as described in the table which can be found + in SqlBufIterator.h file. +*/ +TInt64 TSqlBufRIterator::Int64() const + { + __SQLASSERT(iCurrent >= iBegin && iCurrent < iEnd, ESqlPanicInternalError); + switch(Type()) + { + case ESqlInt: + case ESqlZeroBlob: + return AsInt(); + case ESqlReal: + { + TReal roundVal; + TInt err = Math::Round(roundVal, AsReal(), 0); + if(err != KErrNone) + { + return KMinTInt64; + } + TRealX val(roundVal); + return static_cast (val); + } + case ESqlNull: + case ESqlText: + case ESqlBinary: + return 0; + default: + return AsInt64(); + } + } + +/** +@return Represents the content of the current flat buffer field as real value. + If the current flat buffer field type does not refer to a real, then + the function will do a data conversion as described in the table which can be found + in SqlBufIterator.h file. +*/ +TReal TSqlBufRIterator::Real() const + { + __SQLASSERT(iCurrent >= iBegin && iCurrent < iEnd, ESqlPanicInternalError); + switch(Type()) + { + case ESqlInt: + case ESqlZeroBlob: + { + TRealX val(AsInt()); + return static_cast (val); + } + case ESqlInt64: + { + TRealX val(AsInt64()); + return static_cast (val); + } + case ESqlNull: + case ESqlText: + case ESqlBinary: + return 0.0; + default: + return AsReal(); + } + } + +/** +@return Represents the content of the current flat buffer field as binary (8 bit) descriptor. + If the current flat buffer field type does not refer to a binary block of data, then + the function will do a data conversion as described in the table which can be found + in SqlBufIterator.h file. +*/ +TPtrC8 TSqlBufRIterator::Binary() const + { + __SQLASSERT(iCurrent >= iBegin && iCurrent < iEnd, ESqlPanicInternalError); + TInt size = Size(); + if(Type() != ESqlBinary || size == 0) + { + return TPtrC8(); + } + return TPtrC8(reinterpret_cast (iBegin) + iCurrent->iPos, size); + } + +/** +@return Represents the content of the current flat buffer field as text (16 bit) descriptor. + If the current flat buffer field type does not refer to a text block of data, then + the function will do a data conversion as described in the table which can be found + in SqlBufIterator.h file. +*/ +TPtrC16 TSqlBufRIterator::Text() const + { + __SQLASSERT(iCurrent >= iBegin && iCurrent < iEnd, ESqlPanicInternalError); + TInt size = Size(); + if(Type() != ESqlText || size == 0) + { + return TPtrC16(); + } + return TPtrC16(reinterpret_cast (reinterpret_cast (iBegin) + iCurrent->iPos), size); + } + +/** +An instance of the class is used to get a read-only access to the content of a text or binary column +via a stream object. + +@internalComponent +*/ +class HReadOnlyBuf : public TMemBuf + { +public: + static HReadOnlyBuf* NewL(const TUint8* aFrom, TInt aLen) + { + __SQLASSERT(aLen >= 0, ESqlPanicBadArgument); + HReadOnlyBuf* self = new (ELeave) HReadOnlyBuf; + TUint8* p = const_cast (aFrom); + self->Set(p, p + aLen, MStreamBuf::ERead); + return self; + } + +private: + virtual void DoRelease() + { + delete this; + } + +}; + +/** +@return Represents the content of a text or a binary field as a stream of bytes. + +@leave KErrNoMemory, out of memory condition has occured; +*/ +MStreamBuf* TSqlBufRIterator::StreamL() const + { + __SQLASSERT(iCurrent >= iBegin && iCurrent < iEnd, ESqlPanicInternalError); + __SQLASSERT(::IsSequenceSqlType(Type()), ESqlPanicInternalError); + return HReadOnlyBuf::NewL(reinterpret_cast (iBegin) + iCurrent->iPos, iCurrent->Size()); + }