phonebookengines_old/contactsmodel/tsrc/performance/T_PerfBulkDelete.cpp
changeset 40 b46a585f6909
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines_old/contactsmodel/tsrc/performance/T_PerfBulkDelete.cpp	Fri Jun 11 13:29:23 2010 +0300
@@ -0,0 +1,134 @@
+// Copyright (c) 2004-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:
+//
+
+/**
+@SYMPREQ                  PREQ1132 PREQ1187
+@SYMComponent             app-engines_cntmodel
+@SYMAuthor                Simon Mellor, JamesCl
+@SYMTestStatus            Implemented
+@SYMTestType              CT
+
+@SYMTestCaseDesc          Tests the performance of a bulk delete operation on a corporate-profile 
+						  database of 1000 contacts.
+						  
+@SYMTestActions           Measures the time taken to perform a bulk delete on the contacts database
+						  by passing a CContactIdArray to:
+						  -- CContactDatabase::DeleteContactsL()
+
+@SYMTestExpectedResults   Test case will run without leaving and will output timing information.
+
+*/
+
+#include "T_PerfBulkDelete.h"
+#include "../T_UTILS.H"
+#include <cntitem.h>
+
+// Constants   
+_LIT(KDbPathName,"C:Contacts.cdb");
+const TPtrC KDbPath( (KDbPathName) );
+
+_LIT(KOutputFormat,"Bulk Delete,  deleting %d of %d contacts, took: %d s %03d\n");
+_LIT(KOutputFormat2, "Db size before/after delete: %d / %d bytes\n");
+
+
+CDeleteMany::CDeleteMany()
+	{
+	} 
+
+CDeleteMany::~CDeleteMany()
+	{
+	delete iDb;
+	} 
+	
+CDeleteMany* CDeleteMany::NewLC(RTest& aTest)
+	{
+	CDeleteMany* self = new(ELeave) CDeleteMany();
+	CleanupStack::PushL(self);
+	self->ConstructL(aTest);
+	return(self);
+	}  
+
+void CDeleteMany::ConstructL(RTest& aTest)
+	{
+	iTest = &aTest;
+	iDb = CContactDatabase::OpenL(KDbPath);
+	CCntTest::ProfileReset(0, 59);
+	} 
+
+/*
+	Creates a random array of numbers corresponding to the Contacts Id in the 
+	Contacts model.  No Contact Id is repeated  
+*/
+void CDeleteMany::CreateRandomIdArrayL(CContactIdArray& aUids, TInt aNumIds, TInt aNumEntriesInDb)
+	{
+	TTime now;
+	now.UniversalTime();
+	TInt64 KRandomSeed = now.DateTime().MicroSecond();
+
+	TInt uid(0);
+	for(TInt i = 0; i < aNumIds; ++i)
+		{
+		uid = (Math::Rand(KRandomSeed) % aNumEntriesInDb) + 1;
+		while(aUids.Find(uid) != KErrNotFound)
+			{
+			uid = (Math::Rand(KRandomSeed) % aNumEntriesInDb) + 1;
+			}
+		aUids.AddL(uid);		
+		}
+	}
+	
+/**
+	Static convenience cleanup method copied from CSmlContactsDba  
+*/
+void CDeleteMany::CleanupPtrArray(TAny* aCArrayPtr)
+	{ 
+	CArrayPtr<CContactItem>* array = reinterpret_cast<CArrayPtr<CContactItem>*>(aCArrayPtr);
+	array->ResetAndDestroy();
+	delete array;
+	}	
+	
+	
+/**
+	Main test routine.  Calls and times CContactDatabase::DeleteContactsL
+*/
+void CDeleteMany::DelDataL(TInt aEntryCount, TInt aNumEntriesInDb, TInt aNumMsToGet20ItemsFromView)
+	{
+	TInt dbSizeBefore = iDb->FileSize();
+	
+	CContactIdArray* idArray = CContactIdArray::NewLC();
+	
+	// create an array of random, non-repeating contact ids
+	CreateRandomIdArrayL(*idArray, aEntryCount, aNumEntriesInDb);	
+
+	TCntPerfTimer timer;
+	timer.StartTimer();
+	iDb->DeleteContactsL(*idArray);
+	timer.StopTimer();
+
+	CleanupStack::PopAndDestroy(); // idArray
+	
+	const TInt KTransactionSize(50); // num records deleted in a transaction
+
+ 	// add in number of screen updates need in UI: (time to fetch 20 view items) * number of transactions
+ 	TInt result = timer.Result() +
+ 		(aNumMsToGet20ItemsFromView * ( (aEntryCount / KTransactionSize) + (aEntryCount % 20 ? 1 : 0) ) );
+
+
+	TBuf<64> formattable;
+	formattable.Format(KOutputFormat, aEntryCount, aNumEntriesInDb, result / 1000000, (result / 1000) % 1000);
+	iTest->Printf(formattable);
+    formattable.Format(KOutputFormat2, dbSizeBefore, iDb->FileSize());
+	iTest->Printf(formattable);
+	}