applayerpluginsandutils/uripermissionservices/server/src/sqldbaccessor.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerpluginsandutils/uripermissionservices/server/src/sqldbaccessor.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,249 @@
+// Copyright (c) 2007-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 "sqldbaccessor.h"
+#include "sqldbtransaction.h"
+#include "urilist.h"
+#include "tldlist.h"
+
+#if defined (TESTDBNAME)
+	_LIT( KDatabaseName, "[A00026FF]URIList.dat" );
+#else
+	_LIT( KDatabaseName, "[20009D70]URIList.dat" );	
+#endif
+
+CSqlDbAccessor::CSqlDbAccessor ()
+	{
+		
+	}
+
+CSqlDbAccessor::~CSqlDbAccessor ()
+	{
+	iDatabase.Close ();
+	}
+
+MDBAccessor* CSqlDbAccessor::NewL ( const RStringPool& aStringPool )
+	{
+	CSqlDbAccessor* self = new ( ELeave ) CSqlDbAccessor ();
+	CleanupStack::PushL ( self );
+	self->ConstructL ( aStringPool );
+	CleanupStack::Pop ();
+	
+	return self;	
+	}
+
+void CSqlDbAccessor::ConstructL ( const RStringPool& aStringPool )
+	{
+	TInt result = iDatabase.Open ( KDatabaseName() );
+	if ( result == KErrNotFound )
+		{
+		// Database is not existing. Create one.
+		CreateL ( aStringPool );			
+		}
+	else 
+		{
+		User::LeaveIfError ( result );
+		}
+	}
+
+/**
+Creates a new database and its schemas.
+*/		
+void CSqlDbAccessor::CreateL ( const RStringPool& aStringPool )
+	{
+	// Create the URI List database. 
+	
+	// First create security policy	
+	RSqlSecurityPolicy securityPolicy;
+	CleanupClosePushL ( securityPolicy );
+	
+	// Create security policies container object using a default security policy.
+	TSecurityPolicy defaultPolicy ( TSecurityPolicy::EAlwaysPass );
+	User::LeaveIfError (securityPolicy.Create ( defaultPolicy )); 
+	
+	// Set up policy to apply to database schema and assign it
+	TSecurityPolicy schemaPolicy ( TSecurityPolicy::EAlwaysPass );
+	User::LeaveIfError (securityPolicy.SetDbPolicy ( RSqlSecurityPolicy::ESchemaPolicy, schemaPolicy ) );
+	
+	// Set up policy to apply to write activity on the database and assign it
+	TSecurityPolicy writePolicy ( TSecurityPolicy::EAlwaysPass );
+	User::LeaveIfError (securityPolicy.SetDbPolicy ( RSqlSecurityPolicy::EWritePolicy, writePolicy ));
+	
+	// Set up policy to apply to write activity to the database table named "URIList" and assign it
+	TSecurityPolicy readPolicy ( TSecurityPolicy::EAlwaysPass );
+	User::LeaveIfError (securityPolicy.SetDbPolicy(RSqlSecurityPolicy::EReadPolicy, readPolicy));
+	
+	User::LeaveIfError ( iDatabase.Create ( KDatabaseName, securityPolicy ) );	
+	
+	CreateSchemaL ( aStringPool );
+	
+	CleanupStack::PopAndDestroy (); // securityPolicy
+	}
+ 
+/**
+Creates the schemas for the database. We create 2 tables ( URITbl & URIPropsTbl ), 1 view based 
+on those 2 tables for easy retrieval of data and the triggers to update the view. In SQLite the
+view updation is done via the triggers. By default in SQLite views are read-only
+*/		
+void CSqlDbAccessor::CreateSchemaL ( const RStringPool& aStringPool )
+	{
+	RBuf8 stmtBuf;
+	CleanupClosePushL ( stmtBuf );
+	stmtBuf.CreateL ( KMaxDbStmtLen );
+
+	const TDesC8& id ( aStringPool.String (URILIST::EId,URILIST::Table).DesC() );
+	const TDesC8& scheme ( aStringPool.String (URILIST::EScheme,URILIST::Table).DesC() );
+	const TDesC8& userInfo ( aStringPool.String (URILIST::EUserInfo,URILIST::Table).DesC() );
+	const TDesC8& host ( aStringPool.String (URILIST::EHost,URILIST::Table).DesC() );
+	const TDesC8& port ( aStringPool.String (URILIST::EPort,URILIST::Table).DesC() );
+	const TDesC8& path ( aStringPool.String (URILIST::EPath,URILIST::Table).DesC() );
+	const TDesC8& query ( aStringPool.String (URILIST::EQuery,URILIST::Table).DesC() );
+	const TDesC8& fragments ( aStringPool.String (URILIST::EFragments,URILIST::Table).DesC() );
+	
+	const TDesC8& RefId ( aStringPool.String (URILIST::EURIRefId,URILIST::Table).DesC() );
+	const TDesC8& propId ( aStringPool.String (URILIST::EPropId,URILIST::Table).DesC() );
+	const TDesC8& serviceType (aStringPool.String (URILIST::EServiceType,URILIST::Table).DesC());
+	const TDesC8& listType (aStringPool.String (URILIST::EListType,URILIST::Table).DesC());
+	const TDesC8& permission (aStringPool.String (URILIST::EPermission,URILIST::Table).DesC());
+	const TDesC8& favouriteName (aStringPool.String (URILIST::EFavouriteName,URILIST::Table).DesC());
+	
+	const TDesC8& KTldname ( aStringPool.String (TLDLIST::ETLDName,TLDLIST::Table).DesC() );
+	const TDesC8& KTldListType ( aStringPool.String (TLDLIST::EListType,TLDLIST::Table).DesC() );
+	const TDesC8& KCharacterSet ( aStringPool.String (TLDLIST::ECharacterSet,TLDLIST::Table).DesC() );
+
+	_LIT8 ( KURITblCreateStmt, "CREATE TABLE %S ( \
+								%S INTEGR, \
+								%S TEXT,\
+								%S TEXT, \
+								%S TEXT, \
+								%S TEXT, \
+								%S TEXT, \
+								%S TEXT, \
+								%S TEXT );" );
+
+	_LIT8 ( KURIPropTblCreateStmt, "CREATE TABLE %S ( \
+									%S INTEGER, \
+									%S INTEGER,\
+									%S INTEGER, \
+									%S INTEGER, \
+									%S INTEGER, \
+									%S TEXT );" );
+
+	_LIT8 ( KTldTblCreateStmt, "CREATE TABLE %S ( \
+								%S TEXT,\
+								%S INTEGER,\
+								%S BLOB );" );
+								
+	
+	_LIT8 ( KViewStmt, "CREATE VIEW %S AS SELECT \
+					T1.%S %S, T1.%S %S, T1.%S %S, T1.%S %S, T1.%S %S, T1.%S %S, T1.%S %S, T1.%S %S, \
+					T2.%S %S, T2.%S %S, T2.%S %S, T2.%S %S, T2.%S %S \
+					FROM \
+					%S T1, %S T2 \
+					WHERE \
+					T1.%S = T2.%S;" );
+
+	_LIT8 ( KTriggerInsertStmt, "CREATE TRIGGER %S INSTEAD OF INSERT ON %S \
+							BEGIN \
+							INSERT INTO %S \
+							VALUES ( new.%S, new.%S, new.%S, new.%S, new.%S, new.%S, new.%S, new.%S, \
+							new.%S, new.%S, new.%S, new.%S, new.%S); \
+							END;" );
+	
+
+	_LIT8 ( KTriggerUpdateStmt, "CREATE TRIGGER %S INSTEAD OF UPDATE ON %S \
+								BEGIN \
+								UPDATE %S SET %S=new.%S, %S=new.%S \
+								WHERE %S=old.%S; \
+								END;" );
+	_LIT8 ( KTriggerDeleteStmt, "CREATE TRIGGER %S INSTEAD OF DELETE ON %S \
+								BEGIN \
+								DELETE FROM %S WHERE %S=old.%S; \
+								END;" );
+							
+	_LIT8 ( KTldTableIndexStmt, "CREATE INDEX %S ON %S ( %S, %S )" );
+					
+	stmtBuf.Format ( KURITblCreateStmt(), &(KUriTblName()), &id, &scheme, &userInfo, &host, &port, &path, &query, &fragments );
+	ExecuteL ( stmtBuf );
+	stmtBuf.Format ( KURIPropTblCreateStmt(), &(KUriPropsTblName()), &RefId, &propId, &serviceType, &listType, &permission, &favouriteName );	
+	ExecuteL ( stmtBuf );
+	stmtBuf.Format ( KViewStmt(), &(KViewName()), &id, &id, &scheme, &scheme, &userInfo, &userInfo, &host, &host, &port, &port,
+					 &path, &path, &query, &query, &fragments, &fragments, &propId, &propId, &serviceType, &serviceType, 
+					 &listType, &listType, &permission, &permission, &favouriteName, &favouriteName, &(KUriTblName()), &(KUriPropsTblName()), &id, &propId );
+	ExecuteL ( stmtBuf );
+	stmtBuf.Format ( KTriggerInsertStmt(), &(KTriggerInsertView()), &(KViewName()), &(KViewName()), &id, &scheme, &userInfo, &host, &port, &path, &query, &fragments, &propId, &serviceType, &listType, &permission, &favouriteName );
+	ExecuteL ( stmtBuf );
+	stmtBuf.Format ( KTriggerUpdateStmt(), &(KTriggerUpdateView()), &(KViewName()), &(KViewName()), &listType, &listType, &favouriteName, &favouriteName, &propId, &propId );
+	ExecuteL ( stmtBuf );
+	stmtBuf.Format ( KTriggerDeleteStmt(), &(KTriggerDeleteView()), &(KViewName()), &(KViewName()), &propId, &propId );		
+	ExecuteL ( stmtBuf );
+	
+	stmtBuf.Format ( KTldTblCreateStmt(), &(KTldTblName()), &KTldname, &KTldListType, &KCharacterSet );
+	ExecuteL ( stmtBuf );
+	
+	stmtBuf.Format ( KTldTableIndexStmt(), &(KTldTblIndex()), &(KTldTblName()), &KTldname, &KTldListType );
+	ExecuteL ( stmtBuf );
+	
+	CleanupStack::PopAndDestroy ( ); // stmtBuf	
+	}
+
+/**
+Executes the SQL statement and leave incase of error
+*/
+void CSqlDbAccessor::ExecuteL ( const TDesC8& aStmt )
+	{
+	User::LeaveIfError ( iDatabase.Exec ( aStmt ) );
+	}
+
+/**
+Prepares a new SQL transaction object by providing a SQL statement.
+*/
+MDBTransaction* CSqlDbAccessor::PrepareTransactionL ( const TDesC8& aQueryStmt )
+	{
+	return CSqlDbTransaction::NewL ( iDatabase, aQueryStmt );
+	}
+
+/**
+Scalar queries are queries which returns a single value upon completion. This function
+executes a scalar query and returns the result
+*/
+TInt CSqlDbAccessor::ExecuteScalarQueryL ( const TDesC8& aQueryStmt )
+	{
+	TSqlScalarFullSelectQuery selectQuery ( iDatabase );
+	return 	selectQuery.SelectIntL ( aQueryStmt );
+	}
+
+void CSqlDbAccessor::BeginTransactionL ()
+	{
+	_LIT8 ( KBeginTrans, "BEGIN TRANSACTION;" );
+	ExecuteL ( KBeginTrans() );
+	}
+
+void CSqlDbAccessor::CommitTransactionL ()
+	{
+	_LIT8 ( KCommitTrans, "COMMIT TRANSACTION;" );
+	ExecuteL ( KCommitTrans() );			
+	}
+
+void CSqlDbAccessor::RollbackTransaction ()
+	{
+	_LIT8 ( KRollbackTrans, "ROLLBACK TRANSACTION;" );
+	TInt err = iDatabase.Exec ( KRollbackTrans() );			
+	}
+
+void CSqlDbAccessor::Release ()
+	{
+	delete this;			
+	}