diff -r 08008ce8a6df -r bde600d88860 messagingfw/msgsrvnstore/server/inc/msvdbadapter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgsrvnstore/server/inc/msvdbadapter.h Fri Jun 04 10:32:16 2010 +0100 @@ -0,0 +1,402 @@ +// 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: +// + +#ifndef __MSVDBADAPTER_H__ +#define __MSVDBADAPTER_H__ + +#include +#include +#include +#include +#include +#include "msvcacheentry.h" +#include +#include "msvsearchsortconstants.h" + +#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB) +#include "msvmessagedbadapter.h" +#endif + +/** + * CONSTANT DEFINITIONS + */ +#define KMaxNumberOfDrives 8 + +#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB) +class TStatusMtmIdTable; +class TConversionResumeStatus; +#endif + +/** +@internalComponent +@prototype +*/ + +NONSHARABLE_CLASS (CMsvDBAdapter) : public CBase + { +public: + ~CMsvDBAdapter(); + void BeginTransactionL(); + void CommitTransactionL(); + void RollbackTransactionL(); + void CreateEntryL(const TMsvEntry& aNewEntry, const TMsvId aImmediateVisibleFolder); + void UpdateEntryL(const TMsvEntry& aEntry, const TMsvId aImmediateVisibleFolderconst, TBool aIsParentIdUpdated = ETrue); + void GetEntryL(TMsvId aId, CMsvCacheEntry*& aEntry, TMsvId& aVisibleParentEntryId); + void GetChildrenL(TMsvId aParentId, RPointerArray& aChildArray); + void GetChildrenIdL(TMsvId aParentId, CMsvEntrySelection& aChildArray); + void GetChildrenL(const TDesC8& aQueryStr, TMsvId aParentId, RPointerArray& aChildArray); + void DeleteEntryL(TMsvId aEntryId); + void DeleteEntryL(const CMsvEntrySelection& aEntryIdList); + void GetVisibleFolderIdL(TMsvId aParentId, TMsvId& aVisibleFolderId); + TBool EntryExistsL(TMsvId aId); + TBool GetNextSiblingL(TMsvId aId,TMsvId aParentId,TMsvId& aNextSiblingId); + TBool GetFirstChildIdL(TMsvId aParentId,TMsvId& aFirstChild); + TBool GetVisibleFlagL(TMsvId aEntryId); + void UpdateVisibleFolderL(CMsvEntrySelection* aEntryList, TMsvId aNewVisibleFolderId); + void UpdateOwnerStatusL(TMsvId aId, const TMsvEntry& aParent, TBool aSet); + inline RSqlDatabase& GetDbPointer(); + + +#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT) + static CMsvDBAdapter* NewL(); + void DetachDBL(TUint aDriveId); + inline TBool IsVisibleFolder(TInt32 aData); + static void ValidateDatabaseL(TDriveNumber aDriveNumber); + void GetInPreparationIdL(CMsvEntrySelection& aSelection, TUint aDriveId=0); + + #if (defined SYMBIAN_MESSAGESTORE_UNIT_TESTCODE) + static void CreateDBL(TDriveNumber aDriveNumber, TBool aCreateVersionTable=ETrue, TBool aInvalid = EFalse); + #else + static void CreateDBL(TDriveNumber aDriveNumber); + #endif + #if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB) + static CMsvDBAdapter* OpenL(const TFileName& aDbFileName); + void ConstructOpenDBL(const TFileName& aDbFileName); + void InitializeLConverterStatementL(); + void CreateConversionStatusTableL(); + void RemoveConversionStatusTableL(); + void GetConversionStatusL(TConversionResumeStatus& aConversionResumeStatus); + void CreateIndexEntryL(const TMsvEntry& aNewEntry, const TMsvId aImmediateVisibleFolder); + void AddConversionStatusEntryL(TConversionResumeStatus& aConversionResumeStatus); + void UpdateConversionStatusEntryL(TConversionResumeStatus& aConversionResumeStatus); + void RemoveConversionStatusEntriesL(); + void ChangeVersionL(TInt aVersion); + void GetAllMessageIdsL(TMsvId aServiceId,RArray& aIdArray,TInt32 aMtm,TMsvId lastId = 0); + void GetAllMimeIdsL(TMsvId aId, RArray& aIdArray); + void GetOwningServiceL(TMsvId aId, TMsvId& aOwningId); + void GetAllServiceIDsForMtmL(TInt32 aMtm, RArray& aIdArray); + void GetAllIndexEntryTableIdsL(RArray& aIdArray); + void UpdateVisibleFolderIdL(TMsvId aId, TMsvId visibleId); + TInt GetMessageCountL(TMsvId aServiceId); + void GetRemainingServiceIdsL(RArray& aIdArray); + void GetVisibleParentL(TMsvId aId, TMsvId& aOwningId); + void GetVisibleParentIdL(TMsvId aParentId, TMsvId& aVisibleFolderId); + TBool GetParentVisibleFlagL(TMsvId parentId); + void GetRemainingIdsL(RArray& aIdArray); + void DeleteTableL(TUid aMtmId); + void DeleteSearchSortTable(); + #endif +#else // #if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT) + static CMsvDBAdapter* NewL(const TFileName& aDbFileName); + static CMsvDBAdapter* OpenL(const TFileName& aDbFileName); + static TInt DeleteDB(const TFileName& aDbFileName); + void GetMaxTMsvIdL(TMsvId& aMaxTMsvId); + void GetInPreparationIdL(CMsvEntrySelection& aSelection); + inline TInt Size(); + static void ValidateDatabaseL(const TFileName& aDbFile); +#endif // #if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT) + + void SearchTMsvIdL(const TDesC8& aQuery, RArray& aIdSelection); + TInt AddEntriesfromIndexTableL(const TDesC8& aQuery); + void CreateQueryEntryL(const TInt& aQueryId,const TMsvIdWithSortField& aEntry); + void GetSearchSortEntriesL(const TInt& aQueryId, RArray& aEntrySelection, const TBool aOrder = ETrue,const TBool aSortAsInt = EFalse); + void GetLastNTMsvIdsfromTableL(const TInt& aQueryId, RArray& aIdResult, TInt aLastCount, TBool aOrder = EFalse, TBool aSortAsInt = EFalse); + void DeleteTMsvIdFromQueryL(const TInt& aQueryId,const TMsvId& aId); + void DeleteTMsvIdFromAllQueriesL(const TMsvId& aIdSelection); + void DeleteQueryFromTableL(const TInt& aQueryId); + TInt ReturnIdCountInDBL(const TInt& aQueryId); + TInt GetNextL(TMsvId& aId); + TInt GetPrevL(TMsvId& aId); + void GetFolderIdsL(const TMsvId aParentId, RArray& aFolderIdList); + void ReturnIdsInIteratorL(const TInt& aQueryId, const TBool aOrder = ETrue,const TBool aSortAsInt = EFalse, const TInt aLimit = 1); + void ClearDBContentsL(); + void ConstructSortTableL(); + void InitializeSortTableL(); +#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB) + void GetMtmIdsL(const TDesC8& aQuery, RArray& aMtmIdArray); + void AttachDBL(TDriveUnit aDriveUnit, TUint aDriveId, TMsvId& aMaxId, CMsvMessageDBAdapter* iMessageDBAdapter = NULL); +#else + void AttachDBL(TDriveUnit aDriveUnit, TUint aDriveId, TMsvId& aMaxId); +#endif // #if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB) + +private: + + CMsvDBAdapter(); + void InitializeL(); + void LoadEntryFromStatementL(RSqlStatement& aStmt, TInt aIndex, TMsvId& aVisibleParentEntryId, CMsvCacheEntry& aEntry); + +#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT) + void ConstructL(); + TMsvId MaxTMsvIdL(TUint aDriveId); + static void CreateRootEntryL(RSqlDatabase& tempDB); + void DoGetInPreparationIdL(CMsvEntrySelection& aSelection, TUint aDriveId); +#else + void ConstructNewL(const TFileName& aDbFileName, TBool& aIsDBCreated); + void ConstructOpenL(const TFileName& aDbFileName); +#endif // #if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT) + + + +// DATA +private: + + + enum iStatementType + { + ECreateEntry = 0, + EUpdateEntry, + EUpdateEntryNoParent, + EGetEntry, + EGetChildEntries, + EGetVisibleId, + EEntryExists, + EGetChildIds, + EIndexSentinel + }; + + enum + { + KMsvEntryHighPriority= 0x00000002, + KMsvEntryMediumPriority= 0x00000001, + KMsvEntryLowPriority= 0x00000000, + KMsvEntryNewFlag= 0x00000010, + KMsvEntryUnreadFlag= 0x00000020, + }; + + RSqlDatabase iDatabase; + TBool isTransactionOpen; + RSqlStatement iStatement[EIndexSentinel]; + + // column indices + TInt iIdIndex[EIndexSentinel]; + TInt iParentIdIndex[EIndexSentinel]; + TInt iDataIndex[EIndexSentinel]; + TInt iPcSyncCountIndex[EGetVisibleId]; + TInt iReservedIndex[EGetVisibleId]; + TInt iRelatedIdIndex[EGetVisibleId]; + TInt iTypeIndex[EIndexSentinel]; + TInt iDateIndex[EGetVisibleId]; + TInt iSizeIndex[EGetVisibleId]; + TInt iErrorIndex[EGetVisibleId]; + TInt iBiotypeIndex[EGetVisibleId]; + TInt iMtmData1Index[EGetVisibleId]; + TInt iMtmData2Index[EGetVisibleId]; + TInt iMtmData3Index[EGetVisibleId]; + TInt iServiceIdIndex[EGetVisibleId]; + TInt iMtmIdIndex[EGetVisibleId]; + TInt iDescriptionIndex[EGetVisibleId]; + TInt iDetailsIndex[EGetVisibleId]; + TInt iVisibleParent[EEntryExists]; + + enum + { + EQueryCreateEntry = 0, + EQueryGetEntryAsc, + EQueryGetEntryDesc, + EQueryGetEntryNumAsc, + EQueryGetEntryNumDesc, + EQueryGetLastNIdsAsc, + EQueryGetLastNIdsDesc, + EQueryGetLastNIdsNumAsc, + EQueryGetLastNIdsNumDesc, + EQueryCount, + EGetFolderIds, + EQueryIteratorNumAsc, + EQueryIteratorNumDesc, + EQueryIteratorAsc, + EQueryIteratorDesc, + EQuerySentinel + }; + + RSqlStatement iQueryStatement[EQuerySentinel]; + + // column indices + TInt iQIdQueryIndex[EQuerySentinel]; + TInt iIdQueryIndex[EQuerySentinel]; + TInt iSortfieldQueryIndex[EQuerySentinel]; + TInt iRowIdIndex[EQuerySentinel]; + TInt iIterOffset[EQuerySentinel]; + TInt iIterLimit[EQuerySentinel]; + TInt iParentIdfield; + TInt iTMsvidfield; + TInt iIdColumnIndex; + + // Iterator Variables + TInt iOffsetValue; + TInt iIterQuery; + TInt iQueryId; + TInt iLimit; + + /**************** Converter Statements ************************/ +#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB) + enum + { + ECreateConversionStatusEntry = 0, + EUpdateConversionStatusEntry + }; + +#endif + + +#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT) + //Data structure to store maximum Ids on a given driveId. + TBool iDbPtrInitialized; + RArray* iDatabasePresent; +#endif + + friend class TSearchSortDbWrapper; +#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB) + friend class CMsvMessageDBAdapter; + friend class CMessageConverterManager; +#endif + +#if (defined SYMBIAN_MESSAGESTORE_UNIT_TESTCODE) + friend class CTestDbAdapter; + friend class CTestSearchSortDBadapter; + friend class CTestVersion0Version1Converter; + friend class CTestVersion1Version2Converter; + friend class CTestConverterDBAdapter; + friend class CTestSmsMessageV1toV2Converter; +#endif + }; + + + +inline RSqlDatabase& CMsvDBAdapter::GetDbPointer() + { + return iDatabase; + } + + +/** + * Local Functions + */ + + +//Get the index of the given parameter name +inline TInt GetParamIndexL(RSqlStatement& aStatement, const TDesC& aParameterName) + { + TInt index = aStatement.ParameterIndex(aParameterName); + User::LeaveIfError(index); + return index; + } + + + + +//Get the index of the given column name +inline TInt GetColumnIndexL(RSqlStatement& aStatement, const TDesC& aColumnName) + { + TInt index = aStatement.ColumnIndex(aColumnName); + User::LeaveIfError(index); + return index; + } + + + + +//Binds the given value with the index given in the sql statement +inline void BindIntL(RSqlStatement& aStatement, TInt aIndex, TInt32 aId) + { + User::LeaveIfError(aStatement.BindInt(aIndex, aId)); + } + + + + +//Binds the given value with the index given in the sql statement +inline void BindInt64L(RSqlStatement& aStatement, TInt aIndex, TInt64 aId) + { + User::LeaveIfError(aStatement.BindInt64(aIndex, aId)); + } + + + + +inline void BindTextL(RSqlStatement& aStatement,TInt aIndex, const TDesC& aParameterText) + { + User::LeaveIfError(aStatement.BindText(aIndex,aParameterText)); + } + + + + +//Gets the value of Int32 column +inline TInt ColumnInt(RSqlStatement& aStatement, TInt aIndex) + { + return aStatement.ColumnInt(aIndex); + } + + + +//Gets the value of Int64 column +inline TInt64 ColumnInt64(RSqlStatement& aStatement, TInt aIndex) + { + return aStatement.ColumnInt64(aIndex); + } + + + + +//Get the value of text column +inline HBufC* ColumnTextL(RSqlStatement& aStatement, TInt aIndex) + { + TInt size = aStatement.ColumnSize(aIndex); + HBufC* data = HBufC::NewL(size); + + TPtr ptrData(data->Des()); + TInt err = aStatement.ColumnText(aIndex,ptrData); + + if(err != KErrNone) + { + delete data; + User::Leave(err); + } + return data; +} + + +#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT) + + +inline TBool CMsvDBAdapter::IsVisibleFolder(TInt32 aData) + { + TMsvEntry dummy; + dummy.iData = aData; + return dummy.Visible(); + } + +#else // #if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT) + + + +inline TInt CMsvDBAdapter::Size() + { + return iDatabase.Size(); + } + +#endif // #if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT) + +#endif // #ifndef __MSVDBADAPTER_H__