diff -r 000000000000 -r b16258d2340f applayerpluginsandutils/uripermissionservices/server/src/sqldbaccessor.cpp --- /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; + }