persistentstorage/sql/SRC/Client/SqlDatabaseImpl.inl
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/sql/SRC/Client/SqlDatabaseImpl.inl	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,402 @@
+// 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:
+//
+
+/**
+*/
+inline CSqlDatabaseImpl::CSqlDatabaseImpl()
+	{
+	}
+	
+/**
+Attaches a secure or non-secure database.
+
+Implements RSqlDatabase::Attach().
+
+@param aDbFileName The name of the file that hosts the database. If this is
+                   a secure database, then the format of the name must be:
+                   \<drive\>:\<[SID]database file name excluding the path\>.
+                   If this is a private or shared non-secure database, then aDbFileName has to be the full 
+                   database file name. "[SID]" refers to SID of the application which created the attached database.
+@param aDbName Logical database name. It must be unique (per database connection). This is the name which can
+               be used for accessing tables in the attached database. The syntax is "database-name.table-name".
+
+@return KErrNone, the operation has completed successfully;
+        KErrNoMemory, an out of memory condition has occurred;
+        KErrBadName, the file name is invalid - it has either a zero length or it is the name of a directory;
+        KErrNotReady, the drive does not exist or is not ready;
+        KErrInUse, the file is already open;
+        KErrNotFound, database file not found;
+        KErrGeneral, missing or invalid security policies (if the database to be opened is a secure database);
+        KErrPermissionDenied, the caller does not satisfy the relevant database security policies;
+        KErrNotSupported, incompatible SQL security version (if the database to be opened is a secure database).
+                      Note that database specific errors categorised as ESqlDbError, and
+                      other system-wide error codes may also be returned.
+                      
+@see RSqlDatabase
+@see RSqlDatabase::Attach()
+*/
+inline TInt CSqlDatabaseImpl::Attach(const TDesC& aDbFileName, const TDesC& aDbName)
+	{
+	return Session().Attach(aDbFileName, aDbName);
+	}
+	
+/**
+Detaches previously attached database.
+
+Implements RSqlDatabase::Detach().
+
+@param aDbName Logical database name. The logical name of the database to be detached.
+
+@return KErrNone, the operation has completed successfully;
+        KErrNotFound, no attached database with aDbName name;
+                      Note that database specific errors categorised as ESqlDbError, and
+                      other system-wide error codes may also be returned.
+
+@see RSqlDatabase
+@see RSqlDatabase::Detach()
+*/
+inline TInt CSqlDatabaseImpl::Detach(const TDesC& aDbName)
+	{
+	return Session().Detach(aDbName);
+	}
+
+/**
+Copies a database file to the specified location.
+
+Implements RSqlDatabase::Copy().
+
+@param aSrcDbFileName Source database file name.
+					  If this is a secure database, then the format of the name must be:
+					  \<drive\>:\<[SID]database file name excluding the path\>.
+					  If this is a non-secure database, then aDbFileName has to be the full database file name.
+					  "[SID]" refers to SID of the application which created the database.
+@param aDestDbFileName Destination database file name.
+					  If this is a secure database, then the format of the name must be:
+					  \<drive\>:\<[SID]database file name excluding the path\>.
+					  If this is a non-secure database, then aDbFileName has to be the full database file name.
+					  "[SID]" refers to SID of the application which performs the copying operation.
+
+The allowed copying operations are:
+- secure to secure database. Only the application created the database is allowed to copy it.
+- non-secure to non-secure database. No restrictions apply to this operation.
+
+@return KErrNone, the operation completed has successfully;
+        KErrBadName, the file name is invalid - it has either a zero length or it is the name of a directory;
+        KErrNotReady, the drive does not exist or is not ready;
+        KErrInUse, the file is already open;
+        KErrNotFound, database file not found;
+        KErrPermissionDenied, the SID of the calling application does not match the SID of source or destination database.
+                      Note that other system-wide error codes may also be returned.
+
+@see RSqlDatabase
+@see RSqlDatabase::Copy()
+*/
+inline TInt CSqlDatabaseImpl::Copy(const TDesC& aSrcDbFileName, const TDesC& aDestDbFileName)
+	{
+	return RSqlDbSession::CopyDatabase(aSrcDbFileName, aDestDbFileName);
+	}
+	
+/**
+Deletes the specified database file.
+
+Implements RSqlDatabase::Delete().
+
+@param aDbFileName The name of the database file.
+				   If this is a secure database, then the format of the name must be:
+				   \<drive\>:\<[SID]database file name excluding the path\>.
+				   If this is a private or shared non-secure database, then aDbFileName has to be the 
+				   full database file name. "[SID]" refers to SID of the application which created the database.
+
+@return KErrNone, the operation has completed successfully;
+        KErrBadName, the file name is invalid - it has either a zero length or it is the name of a directory;
+        KErrNotReady, the drive does not exist or is not ready;
+        KErrInUse, the database file is in use;
+        KErrNotFound, the database file cannot be found;
+        KErrAccessDenied, access to the database file is denied (e.g. it might be a read-only file);
+        KErrPermissionDenied, the SID of the calling application does not match the SID of the database;
+                      Note that other system-wide error codes may also be returned.
+
+@see RSqlDatabase
+@see RSqlDatabase::Delete()
+*/
+inline TInt CSqlDatabaseImpl::Delete(const TDesC& aDbFileName)
+	{
+	return RSqlDbSession::DeleteDatabase(aDbFileName);
+	}
+	
+/**
+Sets the transaction isolation level for the database.
+
+Implements RSqlDatabase::SetIsolationLevel().
+
+@param aIsolationLevel The isolation level to be set.
+					   Allowed isolation level values are:
+					   - RSqlDatabase::EReadUncommitted;
+					   - RSqlDatabase::ESerializable;
+                       
+@return KErrNone, if the operation has completed successfully;
+		KErrNotSupported, invalid (not supported) transaction isolation level;
+
+@see RSqlDatabase
+@see RSqlDatabase::SetIsolationLevel()
+*/
+inline TInt CSqlDatabaseImpl::SetIsolationLevel(RSqlDatabase::TIsolationLevel aIsolationLevel)
+	{
+	return Session().SetIsolationLevel(aIsolationLevel);
+	}
+	
+/**
+Executes one or more 16-bit DDL/DML SQL statements.
+
+Implements RSqlDatabase::Exec().
+
+@param aSqlStmt A string of 16-bit wide characters containing one or more DDL/DML SQL statements;
+                each statement is separated by a ';' character.
+
+@return >=0, The operation has completed successfully. The number of database rows that were 
+			 changed/inserted/deleted by the most recently completed DDL/DML sql statement.
+			 Exception: If the executed statement is "DELETE FROM <table>", then the function returns 0 
+			 if the operation has completed successfully (disregarding the number of the deleted rows);
+        KErrNoMemory, an out of memory condition has occured;
+        KSqlErrGeneral, a syntax error has occurred - text describing the problem
+                        can be obtained by calling 	RSqlDatabase::LastErrorMessage();
+        KErrPermissionDenied, the caller does not satisfy the relevant database security policies.
+                      Note that database specific errors categorised as ESqlDbError, and
+                      other system-wide error codes may also be returned.
+
+@see RSqlDatabase
+@see RSqlDatabase::Exec()
+*/
+inline TInt CSqlDatabaseImpl::Exec(const TDesC16& aSqlStmt)
+	{
+	return Session().Exec(aSqlStmt);
+	}
+	
+/**
+Executes one or more 8-bit DDL/DML SQL statements.
+
+Implements RSqlDatabase::Exec().
+
+@param aSqlStmt A string of 8-bit wide characters containing one or more DDL/DML SQL statements;
+                each statement is separated by a ';' character.
+
+@return >=0, The operation has completed successfully. The number of database rows that were 
+			 changed/inserted/deleted by the most recently completed DDL/DML sql statement.
+			 Exception: If the executed statement is "DELETE FROM <table>", then the function returns 0 
+			 if the operation has completed successfully (disregarding the number of the deleted rows);
+        KErrNoMemory, an out of memory condition has occured;
+        KSqlErrGeneral, a syntax error has occurred - text describing the problem
+                        can be obtained by calling 	RSqlDatabase::LastErrorMessage();
+        KErrPermissionDenied, the caller does not satisfy the relevant database security policies.
+                      Note that database specific errors categorised as ESqlDbError, and
+                      other system-wide error codes may also be returned.
+
+@see RSqlDatabase
+@see RSqlDatabase::Exec()
+*/
+inline TInt CSqlDatabaseImpl::Exec(const TDesC8& aSqlStmt)
+	{
+	return Session().Exec(aSqlStmt);
+	}
+
+/**
+Executes one or more 16-bit DDL/DML SQL statements asynchronously.
+
+Implements RSqlDatabase::Exec().
+
+@param aSqlStmt A string of 16-bit wide characters containing one or more DDL/DML SQL statements;
+                each statement is separated by a ';' character.
+@param aStatus Completion status of asynchronous request, one of the following:
+@code
+			- >=0, The operation has completed successfully. The number of database rows that were 
+			   	   changed/inserted/deleted by the most recently completed DDL/DML sql statement.
+			 	Exception: If the executed statement is "DELETE FROM <table>", then the function returns 0 
+			 	if the operation has completed successfully (disregarding the number of the deleted rows);
+        	- KErrNoMemory,  an out of memory condition has occured;
+        	- KSqlErrGeneral, a syntax error has occurred - text describing the problem
+                        can be obtained by calling 	RSqlDatabase::LastErrorMessage();
+        	- KErrPermissionDenied, the caller does not satisfy the relevant database security policies;
+                      Note that aStatus may be set with database specific errors categorised as ESqlDbError, 
+                      and other system-wide error codes.
+@endcode
+
+@see RSqlDatabase
+@see RSqlDatabase::Exec()
+*/
+inline void CSqlDatabaseImpl::Exec(const TDesC16& aSqlStmt, TRequestStatus& aStatus)
+	{
+	Session().Exec(aSqlStmt, aStatus);
+	}
+	
+/**
+Executes one or more 8-bit DDL/DML SQL statements asynchronously.
+
+Implements RSqlDatabase::Exec().
+
+@param aSqlStmt A string of 8-bit wide characters containing one or more DDL/DML SQL statements;
+                each statement is separated by a ';' character.
+@param aStatus Completion status of asynchronous request, one of the following:
+@code
+			- >=0, The operation has completed successfully. The number of database rows that were 
+			   	   changed/inserted/deleted by the most recently completed DDL/DML sql statement.
+			 	Exception: If the executed statement is "DELETE FROM <table>", then the function returns 0 
+			 	if the operation has completed successfully (disregarding the number of the deleted rows);
+        	- KErrNoMemory,  an out of memory condition has occured;
+        	- KSqlErrGeneral, a syntax error has occurred - text describing the problem
+                        can be obtained by calling 	RSqlDatabase::LastErrorMessage();
+        	- KErrPermissionDenied, the caller does not satisfy the relevant database security policies;
+                      Note that aStatus may be set with database specific errors categorised as ESqlDbError, 
+                      and other system-wide error codes.
+@endcode
+
+@see RSqlDatabase
+@see RSqlDatabase::Exec()
+*/
+inline void CSqlDatabaseImpl::Exec(const TDesC8& aSqlStmt, TRequestStatus& aStatus)
+	{
+	Session().Exec(aSqlStmt, aStatus);
+	}
+	
+/**
+Retrieves a reference to the textual description of the error returned by the
+most recent call.
+
+Implements RSqlDatabase::LastErrorMessage().
+
+@return A non-modifiable pointer descriptor representing the most recent error
+        message. Note that message may be NULL, i.e. the descriptor may have
+        zero length.
+
+@see RSqlDatabase
+@see RSqlDatabase::LastErrorMessage()
+*/
+inline TPtrC CSqlDatabaseImpl::LastErrorMessage()
+	{
+	return Session().LastErrorMessage();
+	}
+
+/**
+Returns the ROWID of the most recent successful INSERT into the database 
+from this database connection.
+
+Implements RSqlDatabase::LastInsertedRowId().
+
+@return >0, the ROWID of the most recent successful INSERT into the database
+			from this database connection;
+		0, 	if no successful INSERTs have ever occurred from this database connection
+		<0, if one of the system-wide error codes is returned
+
+@see RSqlDatabase::LastInsertedRowId()
+*/
+inline TInt64 CSqlDatabaseImpl::LastInsertedRowId()
+	{
+	return Session().LastInsertedRowId();
+	}
+
+/**
+@return A reference to RSqlDbSession instance.
+*/
+inline RSqlDbSession& CSqlDatabaseImpl::Session()
+	{
+	return iDbSession;
+	}
+
+/**
+Sends a command to the server to Execute a SELECT query which is expected to return a single row consisting of
+a single column value and copies that value to the place refered by aRes parameter.
+
+@param aSqlStmt 16-bit SELECT sql query
+@param aType    The expected column type
+@param aRes     Output parameter. Refers to the place where the result must be copied
+
+@return KErrNone, if the function completes successfully,
+		Positive value, The column value length, in case if the receiving buffer 
+						is not big enough. This return result is possible only with text or binary columns.
+		          
+@leave  The function may leave with database specific errors categorised as ESqlDbError and
+  		other system-wide error codes.
+*/
+inline TInt CSqlDatabaseImpl::ExecScalarFullSelectL(const TDesC16& aSqlStmt, TSqlColumnType aType, TDes8& aRes)
+	{
+	TInt rc = Session().ExecScalarFullSelect(aSqlStmt, aType, aRes);
+	__SQLLEAVE_IF_ERROR(rc);
+	return rc;
+	}
+
+/**
+Sends a command to the server to Execute a SELECT query which is expected to return a single row consisting of
+a single column value and copies that value to the place refered by aRes parameter.
+
+@param aSqlStmt 8-bit SELECT sql query
+@param aType    The expected column type
+@param aRes     Output parameter. Refers to the place where the result must be copied
+
+@return KErrNone, if the function completes successfully,
+		Positive value, The column value length, in case if the receiving buffer 
+						is not big enough. This return result is possible only with text or binary columns.
+		          
+@leave  The function may leave with database specific errors categorised as ESqlDbError and
+  		other system-wide error codes.
+*/
+inline TInt CSqlDatabaseImpl::ExecScalarFullSelectL(const TDesC8& aSqlStmt, TSqlColumnType aType, TDes8& aRes)
+	{
+	TInt rc = Session().ExecScalarFullSelect(aSqlStmt, aType, aRes);
+	__SQLLEAVE_IF_ERROR(rc);
+	return rc;
+	}
+
+/**
+@return True, if the database is in transaction, false otherwise.
+*/
+inline TBool CSqlDatabaseImpl::InTransaction()
+	{
+	return 	Session().SendReceive(ESqlSrvDbInTransaction) != 0;
+	}
+
+/**
+@return >= 0, 		  the operation has completed successfully. The number is the size of the main
+					  database file,
+        KErrNoMemory, an out of memory condition has occurred;
+        KErrTooBig,   the database is too big and the size cannot fit into 32-bit signed integer;
+                      Note that database specific errors categorised as ESqlDbError, and
+                      other system-wide error codes may also be returned.
+*/
+inline TInt CSqlDatabaseImpl::Size()
+	{
+	return Session().SendReceive(ESqlSrvDbSize);
+	}
+
+/**
+Returns the database file size and free space, in bytes.
+
+@param aSize An output parameter. If the call was successfull the aSize object will contain information
+			 about the database size and database free space.
+@param aDbName The attached database name or KNullDesC for the main database
+
+@return KErrNone, The operation has completed succesfully;
+                  Note that database specific errors categorised as ESqlDbError, and
+                  other system-wide error codes may also be returned.
+
+Usage of the IPC call arguments:
+Arg 0: [in/out]	Points to a RSqldatabase::TSize object, where the database size and free space values
+			    will be copied.
+Arg 1: [out]	The database name length in characters
+Arg 2: [out]	The attached database name or KNullDesC for the main database
+*/
+inline TInt CSqlDatabaseImpl::Size(RSqlDatabase::TSize& aSize, const TDesC& aDbName)
+	{
+	TPtr8 ptr(reinterpret_cast <TUint8*> (&aSize), sizeof(aSize));
+	return Session().SendReceive(ESqlSrvDbSize2, TIpcArgs(&ptr, aDbName.Length(), &aDbName));
+	}