persistentstorage/sql/SRC/Client/SqlStmtSession.h
changeset 0 08ec8eefde2f
child 11 211563e4b919
--- /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 <e32std.h>
+#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;
+	<Initialize "paramBuf" object>;
+begin:
+	err = sess.Bind(paramBuf);
+	err = sess.Exec();
+	err = sess.Reset();
+	<Now a new set of parameter values can be prepared and the statement can be executed again - from the "begin" label>;
+	
+	sess.Close();
+@endcode
+
+2) SQL statement which returns a record set.
+
+@code
+	RSqlStatementSession sess;
+	TInt err = sess.Prepare(...);
+	...
+	RSqlBufFlat paramBuf;
+	<Initialize "paramBuf" object>;
+	RSqlBufFlat columnBuf;
+	<Initialize "columnBuf" object. The element count must match the columns count>;
+begin:
+	err = sess.Bind(paramBuf);
+	while(sess.Next(columnBuf) == KSqlAtRow)
+		{
+		<process the record data - "columnBuf" set>;
+		}
+	err = sess.Reset();
+	<Now a new set of parameter values can be prepared and the statement can be executed again - from the "begin" label>;
+	
+	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__