messagingfw/msgsrvnstore/server/inc/msvdbadapter.h
changeset 22 bde600d88860
parent 0 8e480a14352b
--- /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 <msvstd.h>
+#include <msvids.h>
+#include <msvuids.h>
+#include <sqldb.h>
+#include <msvuids.h>
+#include "msvcacheentry.h"
+#include <msvsearchsortquery.h>
+#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<CMsvCacheEntry>& aChildArray);
+	void GetChildrenIdL(TMsvId aParentId, CMsvEntrySelection& aChildArray);
+	void GetChildrenL(const TDesC8& aQueryStr, TMsvId aParentId, RPointerArray<CMsvCacheEntry>& 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<TMsvId>& aIdArray,TInt32 aMtm,TMsvId lastId = 0);
+		void GetAllMimeIdsL(TMsvId aId, RArray<TMsvId>& aIdArray);
+		void GetOwningServiceL(TMsvId aId, TMsvId& aOwningId);
+		void GetAllServiceIDsForMtmL(TInt32 aMtm, RArray<TMsvId>& aIdArray);
+		void GetAllIndexEntryTableIdsL(RArray<TMsvId>& aIdArray);
+		void UpdateVisibleFolderIdL(TMsvId aId, TMsvId visibleId);
+		TInt GetMessageCountL(TMsvId aServiceId);
+		void GetRemainingServiceIdsL(RArray<TMsvId>& aIdArray);
+		void GetVisibleParentL(TMsvId aId, TMsvId& aOwningId);
+		void GetVisibleParentIdL(TMsvId aParentId, TMsvId& aVisibleFolderId);
+		TBool GetParentVisibleFlagL(TMsvId parentId);
+		void GetRemainingIdsL(RArray<TMsvId>& 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<TMsvId>& aIdSelection);
+	TInt AddEntriesfromIndexTableL(const TDesC8& aQuery);
+	void CreateQueryEntryL(const TInt& aQueryId,const TMsvIdWithSortField& aEntry);
+	void GetSearchSortEntriesL(const TInt& aQueryId, RArray<TMsvId>& aEntrySelection, const TBool aOrder = ETrue,const TBool aSortAsInt = EFalse);
+	void GetLastNTMsvIdsfromTableL(const TInt& aQueryId, RArray<TMsvId>& 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<TMsvId>& 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<TUid>& 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<TBool>* 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__