diff -r 000000000000 -r 08ec8eefde2f persistentstorage/sql/SRC/Server/SqlSrvDatabase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/sql/SRC/Server/SqlSrvDatabase.h Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,161 @@ +// 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 __SQLSRVDATABASE_H__ +#define __SQLSRVDATABASE_H__ + +#include +#include //RSqlDatabase::TIsolationLevel +#include "SqlSrvSecurityMap.h" +#include "sqlite3.h" +#include "SqliteSymbian.h" //sqlite3SymbianLastOsError() +#include "SqlSrvStatementUtil.h"//Global sql statement related functions +#include "SqlSrvStrings.h" +#include "SqlSrvCollation.h" //User defined collations +#include "SqlSrvDbSysSettings.h"//TSqlDbSysSettings +#include "SqlSecurityImpl.h" //CSqlSecurityPolicy +#include "SqlUtil.h" //TSqlLikeWildcard + +//Forward declarations +class TSqlSrvFileData; +struct TSqlSrvConfigParams; + +////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////// CSqlSrvDatabase class ///////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +SQL database connection manager. (SQL database handle) + +CSqlSrvDatabase is a server side class which processes the client side requests for: +- creating a SQL database (CSqlSrvDatabase::Create()); +- opening an existing SQL database (CSqlSrvDatabase::Open()); +- retrieving the last SQL error message (CSqlSrvDatabase::LastErrorMessage()); +- executing 8-bit and 16-bit SQL statements (CSqlSrvDatabase::ExecL()); +- setting the transaction isolation level (CSqlSrvDatabase::SetIsolationLevelL()); +- retrieving the database security policy (CSqlSrvDatabase::SecurityPolicy()); +- attaching an existing SQL database to current connection (CSqlSrvDatabase::AttachDbL()); +- detaching previously attached SQL database from current connection (CSqlSrvDatabase::DetachDbL()); + +CSqlSrvDatabase class also manages all platform security related activities for secure databases: +- loading/storing database security policies when creating/opening a database connection; +- asserting client rights to perform a specific database operation; +- maintaining security related internal data structures in tact; + +@see CSqlSrvDatabase::Create() +@see CSqlSrvDatabase::Open() +@see CSqlSrvDatabase::LastErrorMessage() +@see CSqlSrvDatabase::ExecL() +@see CSqlSrvDatabase::SetIsolationLevelL() +@see CSqlSrvDatabase::SecurityPolicy() +@see CSqlSrvDatabase::AttachDbL() +@see CSqlSrvDatabase::DetachDbL() +@see CSqlSrvDatabase::LastChangesCount() + +@internalComponent +*/ +NONSHARABLE_CLASS(CSqlSrvDatabase) : public CBase + { +public: + //Object creation methods + static CSqlSrvDatabase* CreateSecureL(const TSqlSrvFileData& aFileData, CSqlSecurityPolicy* aSecurityPolicy); + static CSqlSrvDatabase* CreateL(const TSqlSrvFileData& aFileData); + static CSqlSrvDatabase* OpenL(const TSqlSrvFileData& aFileData); + virtual ~CSqlSrvDatabase(); + //Interface methods + inline TPtrC LastErrorMessage() const; + inline void ExecL(TDes16& aSqlStmt); + inline void ExecL(const TDesC8& aSqlStmt); + inline void SetIsolationLevelL(RSqlDatabase::TIsolationLevel aLevel); + inline sqlite3* RawDbHandle() const; + inline const CSqlSecurityPolicy* SecurityPolicy() const; + void AttachDbL(const TSqlSrvFileData& aFileData, const TDesC& aDbName); + void DetachDbL(const TDesC& aDbName); + inline TInt LastChangesCount(); + inline TInt64 LastInsertedRowId(); + inline TBool InTransaction() const; + TInt64 SizeL(const TDesC& aDbName = KNullDesC); + TInt64 FreeSpaceL(const TDesC& aDbName = KNullDesC); + void QueryConfigL(TDes8& aDest); + TInt CompactL(TInt aSize, const TDesC& aDbName = KNullDesC); + static TInt AuthorizeCallback(void* aDb, TInt aDbOpType, + const char* aDbObjName1, const char* aDbObjName2, + const char* aDbName, const char* aTrgOrViewName); + +private: + CSqlSrvDatabase(); + void CreateNewDbFileL(const TSqlSrvFileData& aFileData); + void OpenExistingDbFileL(const TSqlSrvFileData& aFileData); + void InstallAuthorizerL(); + inline void InstallCollationsL(); + void InstallUDFsL(); + const TUint8* SecurityMapKeyL(const TDesC& aDbFileName); + void UpdateSecurityMapL(TBool aAttachedDb, const TSqlSrvFileData& aFileData, + const TUint8*& aMapKey, const CSqlSecurityPolicy*& aSecurityPolicy); + void RemoveFromMapsL(const TDesC& aDbName); + void InsertInAttachDbMapL(const TDesC& aDbFileName, const TDesC& aDbName); + void InitAttachedDbL(const TSqlSrvFileData& aFileData, const TDesC& aDbName); + TInt FinalizeAttachedDb(const TDesC& aDbName); + static void AttachCleanup(void* aCleanup); + enum TAttachState {EAStNone, EAStDbAttached, EAStSecurityMapUpdated}; + void DoAttachSecureDbL(TAttachState& aState, const TSqlSrvFileData& aFileData, const TDesC& aDbName, const TUint8*& aMapKey); + inline void BasicSecurityPolicyCheckL(const CSqlSecurityPolicy& aSecurityPolicy); + inline void StoreSettingsL(const TDesC& aCollationDllName, TInt aDbConfigFileVersion, TSqlCompactionMode aCompactionMode); + void ProcessSettingsL(const TSqlSrvFileData& aFileData, const TDesC& aDbName); + void ApplyConfigUpdatesL(const TDesC& aStoredCollationDllName, const TInt& aStoredDbConfigFileVersion, + const TSqlSrvFileData& aFileData, const TDesC& aDbName); + void SetConfigL(const TSqlSrvConfigParams& aConfigParams, TBool aSetPageSize, const TDesC& aLogicalDbName = KNullDesC); + void InitCompactionL(TSqlCompactionMode aCompactionMode, TInt aFreePageThresholdKb, + const TDesC& aDbFileName, TSqliteVacuumMode aCurrentVacuumMode, const TDesC& aDbName = KMainDb16); + void NewCompactEntryL(TInt aFreePageThresholdKb, const TDesC& aDbFileName, const TDesC& aDbName); + void ReleaseCompactEntry(const TDesC& aDbName); + static void CompactCleanup(void* aCleanup); + TInt PageSizeL(const TDesC& aDbName = KNullDesC); + //ConstructL() methods + void ConstructCreateSecureL(const TSqlSrvFileData& aFileData, CSqlSecurityPolicy* aSecurityPolicy); + void ConstructCreateL(const TSqlSrvFileData& aFileData); + void DoCommonConstructCreateL(const TSqlSrvFileData& aFileData, TBool aSecureDb); + void ConstructOpenSecureL(const TSqlSrvFileData& aFileData); + void ConstructOpenL(const TSqlSrvFileData& aFileData); + void DoCommonConstructOpenL(const TSqlSrvFileData& aFileData, TBool aSecureDb); + // + static void LikeSqlFunc(sqlite3_context* aContext, int aArgc, sqlite3_value** aArgv); + +private: + sqlite3* iDbHandle;//The database handle, owned by CSqlSrvDatabase. + const CSqlSecurityPolicy* iSecurityPolicy;//The main database security policy, not owned by CSqlSrvDatabase (owned by the CSqlServer::iSecurityMap object). + TUint8 iFileNameBuf[KMaxFileName + 1];//Temporary buffer for storing UTF8 encoded, zero terminated database names. + TBool iAuthorizerInstalled;//If non-zero then the authorizer callback is already installed. + //Fact: the authorizer callback must be installed for each + //secure CSqlSrvDatabase object. But it is possible that + // - there is one secure database object; + // - a second secure database is attached to the first one. + // in this case there is no need to install the authorizer again. + // + //Or there is another situation: non-secure main database + secure attached database. + TBool iAuthorizerDisabled; //See the comments for iAuthorizerInstalled. + //This flag is used only when attaching a secure database. + //Since during this operation the system tables are read/writen, + //The authorizer callback has to be temporary disabled. + RSqlAttachDbMap iAttachDbMap;//["dbName":"dbFileName"] map, owned by CSqlSrvDatabase. + const TUint8* iSecureDbName;//, used as a key in the security map. Not owned by CSqlSrvDatabase. + RSqlCompactDbMap iCompactDbMap; //["dbName":"Compact db entry"] map, owned by CSqlSrvDatabase. + TInt iPageSize; //Main database page size in bytes + + }; + +#include "SqlSrvDatabase.inl" + +#endif//__SQLSRVDATABASE_H__