diff -r 000000000000 -r 08ec8eefde2f persistentstorage/sql/SRC/Client/SqlStmtSession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/sql/SRC/Client/SqlStmtSession.h Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,115 @@ +// Copyright (c) 2005-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 __SQLSTMTSESSION_H__ +#define __SQLSTMTSESSION_H__ + +#include +#include "SqlDbSession.h" //RSqlDbSession +#include "SqlBufFlat.h" //RSqlBufFlat +#include "IPCBuf.h" //HIpcBuf + +/** +RSqlStatementSession class is used for "prepare once execute many times" supplied to PrepareL() SQL +statement. +RSqlStatementSession::PrepareL() must be called for preparing the SQL statement. +If the SQL statement contains parameters, Bind() must be called before calling Next() or Exec() +to bind the parameter values. +RSqlStatementSession class shall not be used for executing a set of SQL statements, separated with ";". +PrepareL() will report this as a KErrArgument error. + +RSqlStatementSession class hides all details about the communication with the database server. +No database specific header files should be seen or used outside the session class. + +Usage patterns: + +1) SQL statement which does not return a record set. + +@code + RSqlStatementSession sess; + TInt err = sess.Prepare(...); + ... + RSqlBufFlat paramBuf; + ; +begin: + err = sess.Bind(paramBuf); + err = sess.Exec(); + err = sess.Reset(); + ; + + sess.Close(); +@endcode + +2) SQL statement which returns a record set. + +@code + RSqlStatementSession sess; + TInt err = sess.Prepare(...); + ... + RSqlBufFlat paramBuf; + ; + RSqlBufFlat columnBuf; + ; +begin: + err = sess.Bind(paramBuf); + while(sess.Next(columnBuf) == KSqlAtRow) + { + ; + } + err = sess.Reset(); + ; + + sess.Close(); +@endcode + +@internalComponent +*/ +NONSHARABLE_CLASS(RSqlStatementSession) + { +public: + inline RSqlStatementSession(); + inline TInt Prepare(RSqlDbSession& aDbSession, const TDesC& aSqlStmt, TInt& aColumnCount, TInt& aParamCount); + inline TInt Prepare(RSqlDbSession& aDbSession, const TDesC8& aSqlStmt, TInt& aColumnCount, TInt& aParamCount); + void Close(); + + inline TInt Reset(); + inline TInt Exec(); + inline void Exec(TRequestStatus& aStatus); + inline TInt BindExec(const RSqlBufFlat& aParamBuf); + inline void BindExec(const RSqlBufFlat& aParamBuf, TRequestStatus& aStatus); + inline TInt Next(RSqlBufFlat& aColumnBuf); + TInt BindNext(const RSqlBufFlat& aParamBuf, RSqlBufFlat& aColumnBuf); + TInt GetNames(TSqlSrvFunction aFunction, RSqlBufFlat& aNameBuf); + inline TInt ReadColumnValue(TInt aColumnIndex, TDes8& aBuf); + + inline MStreamBuf* ColumnSourceL(TInt aColumnIndex); + inline MStreamBuf* ParamSinkL(TSqlSrvFunction aFunction, TInt aParamIndex); + + HBufC* GetDeclColumnTypesL(TInt aColumnCount); + +private: + TInt DoBindNext(TSqlSrvFunction aFunction, TIpcArgs& aIpcArgs, RSqlBufFlat& aColumnBuf); + TInt Retry(RSqlBufFlat& aBufFlat, TInt aSize, TSqlBufFlatType aWhat); + inline RSqlDbSession& DbSession() const; + +private: + TInt iHandle; + RSqlDbSession* iDbSession; + + }; + +#include "SqlStmtSession.inl" + +#endif//__SQLSTMTSESSION_H__