persistentstorage/dbms/tdbms/t_dbbig.cpp
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/dbms/tdbms/t_dbbig.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,568 @@
+// Copyright (c) 1998-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:
+//
+
+// MSVC++ up to 5.0 has problems with expanding inline functions
+// This disables the mad warnings for the whole project
+#if defined(NDEBUG) && defined(__VC32__) && _MSC_VER<=1100
+#pragma warning(disable : 4710)			// function not expanded. MSVC 5.0 is stupid
+#endif
+
+#include <d32dbms.h>
+#include <s32file.h>
+#include <e32test.h>
+#include <e32math.h>
+#include <hal.h>
+
+class TTimer
+	{
+public:
+	void Start(const TDesC& aDes);
+	void Stop();
+private:
+	TUint iTicks;
+	};
+
+LOCAL_D RTest test(_L("t_dbbig - Test Large DBMS objects"));
+LOCAL_D CTrapCleanup* TheTrapCleanup;
+LOCAL_D CFileStore* TheStore;
+LOCAL_D RDbStoreDatabase TheDatabase;
+LOCAL_D RDbTable TheTable;
+LOCAL_D RFs TheFs;
+
+const TInt KTestCleanupStack=0x20;
+const TPtrC KTestDir=_L("C:\\DBMS-TST\\");
+const TPtrC KTestFile=_L("T_BIG.DB");
+const TPtrC KTableName(_S("table"));
+const TPtrC KIndexText=_S("text");
+const TPtrC KIndexInt=_S("int");
+const TPtrC KColumnText=_S("text");
+const TPtrC KColumnInt=_S("int");
+const TPtrC KIncFormat=_S("%5d\r");
+const TInt KRecords=1000;
+const TPtrC KOtherTable=_S("extra");
+
+static TTimer TheTimer;
+
+void TTimer::Start(const TDesC& aDes)
+	{
+	test.Printf(_L("  %S: "),&aDes);
+	iTicks=User::FastCounter();
+	}
+
+void TTimer::Stop()
+	{
+	TUint ticks = User::FastCounter() - iTicks;
+	TInt freq = 0;
+	test(HAL::Get(HAL::EFastCounterFrequency, freq) == KErrNone);
+	const TInt KMicroSecIn1Sec = 1000000;
+	const TInt KMsIn1Sec = 1000;
+	double v = ((double)ticks * KMicroSecIn1Sec) / (double)freq; TInt v2 = (TInt)v;
+	test.Printf(_L("%d ms\r\n"),v2/KMsIn1Sec);
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-DBMS-CT-1309
+@SYMTestCaseDesc        Create the database-in-a-store
+@SYMTestPriority        Medium
+@SYMTestActions        	Calls up RDbStoreDatabase::CreateL() function
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void CreateDatabaseL()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1309 "));
+	CFileStore* store=CPermanentFileStore::ReplaceLC(TheFs,KTestFile,EFileRead|EFileWrite);
+	store->SetTypeL(KPermanentFileStoreLayoutUid);
+	TStreamId id;
+		id=TheDatabase.CreateL(store);
+	store->SetRootL(id);
+	store->CommitL();
+	CleanupStack::Pop();
+	TheStore=store;
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-DBMS-CT-1310
+@SYMTestCaseDesc        Open the database-in-a-store
+@SYMTestPriority        Medium
+@SYMTestActions        	Call up RDbStoreDatabase::OpenL()
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void OpenDatabaseL()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1310 "));
+	CFileStore* store=CPermanentFileStore::OpenLC(TheFs,KTestFile,EFileRead|EFileWrite);
+		TheDatabase.OpenL(store,store->Root());
+	CleanupStack::Pop();
+	TheStore=store;
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-DBMS-CT-1311
+@SYMTestCaseDesc        Close the database in store
+@SYMTestPriority        Medium
+@SYMTestActions        	Test for RDbStoreDatabase::Close() function
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void CloseDatabase()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1311 "));
+	TheDatabase.Close();
+	delete TheStore;
+	}
+
+LOCAL_C void CreateTableL()
+	{
+	CDbColSet *cs=CDbColSet::NewLC();
+	TDbCol col1(KColumnInt,EDbColInt32);
+	col1.iAttributes=TDbCol::ENotNull;
+	cs->AddL(col1);
+	TDbCol col2(KColumnText,EDbColText,200/sizeof(TText));
+	col2.iAttributes=TDbCol::ENotNull;
+	cs->AddL(col2);
+	test(TheDatabase.CreateTable(KTableName,*cs)==KErrNone);
+	CleanupStack::PopAndDestroy();
+	}
+
+LOCAL_C void WriteRecordsL(TInt aCount)
+	{
+	TBuf<10> text;
+	TInt jj=0;
+	for (TInt ii=0;ii<aCount;++ii)
+		{
+		TheTable.InsertL();
+		jj=(jj+23);
+		if (jj>=aCount)
+			jj-=aCount;
+		TheTable.SetColL(1,jj);
+		text.Num(jj);
+		TheTable.SetColL(2,text);
+		TheTable.PutL();
+		}
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-DBMS-CT-1312
+@SYMTestCaseDesc        Create a table in database
+@SYMTestPriority        Medium
+@SYMTestActions        	Build a table and write records into the table.Test for commiting the transactions.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void BuildTableL(TInt aCount)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1312 "));
+	TheTimer.Start(_L("build"));
+	CreateTableL();
+	TheDatabase.Begin();
+	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
+	WriteRecordsL(aCount);
+	test(TheDatabase.Commit()==KErrNone);
+	TheTable.Close();
+	TheTimer.Stop();
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-DBMS-CT-1313
+@SYMTestCaseDesc        Tests for total rows in the rowset
+@SYMTestPriority        Medium
+@SYMTestActions        	Iterate through the table.Test for the total numbers of rows available
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void IterateL(RDbTable::TPosition aDirection)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1313 "));
+	TheTimer.Start(_L("iterate"));
+	TInt cc=0;
+	while (TheTable.GotoL(aDirection))
+		{
+		++cc;
+		TheTable.GetL();
+		}
+	TheTimer.Stop();
+	test(cc=TheTable.CountL());
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-DBMS-CT-0580
+@SYMTestCaseDesc        Tests the database definition and enquiry functions
+@SYMTestPriority        Medium
+@SYMTestActions        	Tests by setting an active index for the table.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestIndexL(const TDesC& aName,const CDbKey& aKey)
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0580 "));
+	TheTimer.Start(_L("build"));
+	test(TheDatabase.CreateIndex(aName,KTableName,aKey)==KErrNone);
+	TheTimer.Stop();
+	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
+	test(TheTable.SetIndex(aName)==KErrNone);
+	IterateL(TheTable.ENext);
+	TheTable.Close();
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-DBMS-CT-0581
+@SYMTestCaseDesc        Tests the database definition and enquiry functions
+@SYMTestPriority        Medium
+@SYMTestActions        	Tests for bookmark which saves the current location of a rowset.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestBookmarkL()
+	{
+	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0581 creating alien bookmark "));
+	CDbColSet* cs=CDbColSet::NewLC();
+	TDbCol col(_L("column"),EDbColUint8);
+	col.iAttributes=TDbCol::ENotNull+TDbCol::EAutoIncrement;
+	cs->AddL(col);
+	test (TheDatabase.CreateTable(KOtherTable,*cs)==KErrNone);
+	CleanupStack::PopAndDestroy();
+	RDbTable extra;
+	test (extra.Open(TheDatabase,KOtherTable)==KErrNone);
+	extra.InsertL();
+	extra.PutL();
+	TDbBookmark alien=extra.Bookmark();
+	extra.Close();
+//
+	test.Next(_L("Alien bookmark"));
+	test (TheTable.Open(TheDatabase,KTableName)==KErrNone);
+	TRAPD(r,TheTable.GotoL(alien));
+	test (r==KErrNotFound);
+	test (TheTable.SetIndex(KIndexInt)==KErrNone);
+	TRAP(r,TheTable.GotoL(alien));
+	test (r==KErrNotFound);
+	test (TheTable.SetIndex(KIndexText)==KErrNone);
+	TRAP(r,TheTable.GotoL(alien));
+	test (r==KErrNotFound);
+//
+	test.Next(_L("Cross-view bookmarks"));
+	TheTable.LastL();	// indexed view
+	TheTable.PreviousL();
+	TDbBookmark mark=TheTable.Bookmark();
+	test (extra.Open(TheDatabase,KTableName)==KErrNone);
+	TRAP(r,extra.GotoL(mark));
+	test (r==KErrNone);
+	test (extra.PreviousL());
+	TRAP(r,TheTable.GotoL(extra.Bookmark()));
+	test (r==KErrNone);
+	extra.Close();
+//
+	test.Next(_L("Bookmark persistence"));
+	TheTable.Close();
+	test (TheTable.Open(TheDatabase,KTableName)==KErrNone);
+	TRAP(r,TheTable.GotoL(mark));
+	test (r==KErrNone);
+	TheTable.Close();
+//
+	test.Next(_L("Delete alien record"));
+	test (extra.Open(TheDatabase,KOtherTable)==KErrNone);
+	TRAP(r, extra.GotoL(mark));
+	test (r==KErrNotFound);
+	TRAP(r,extra.GotoL(alien));
+	test (r==KErrNone);
+	extra.DeleteL();
+	TRAP(r,extra.GotoL(alien));
+	test (r==KErrNotFound);
+	extra.Close();
+//
+	test.Next(_L("Delete extra table"));
+	test (TheDatabase.DropTable(KOtherTable)==KErrNone);
+	test (TheTable.Open(TheDatabase,KTableName)==KErrNone);
+	TRAP(r,TheTable.GotoL(alien));
+	test (r==KErrNotFound);
+	TheTable.Close();
+//
+	test.End();
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-DBMS-CT-1314
+@SYMTestCaseDesc        Discarding indexes belonging to the table on database
+@SYMTestPriority        Medium
+@SYMTestActions        	Tests for RDbIncremental::DropTable(),RDbIncremental::Next() function.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void BreakIndex()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1314 "));
+	TheTimer.Start(_L("break"));
+	TInt step;
+	RDbIncremental drop;
+	test(drop.DropTable(TheDatabase,KTableName,step)==KErrNone);
+	test(drop.Next(step)==KErrNone);
+	test(step>0);
+	drop.Close();	// abort the drop
+	test(TheDatabase.IsDamaged());
+	TheTimer.Stop();
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-DBMS-CT-1315
+@SYMTestCaseDesc        Database recovery test
+@SYMTestPriority        Medium
+@SYMTestActions        	Calls up RDbStoreDatabase::Recover() function
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void Recover()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1315 "));
+	TheTimer.Start(_L("recover"));
+	test(TheDatabase.Recover()==KErrNone);
+	TheTimer.Stop();
+	test(!TheDatabase.IsDamaged());
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-DBMS-CT-1316
+@SYMTestCaseDesc        Tests for dropping an index
+@SYMTestPriority        Medium
+@SYMTestActions        	Drop an integer and text index from the table. Test for damage of database
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void DropIndexes()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1316 "));
+	TheTimer.Start(_L("drop Int[32]"));
+	test(TheDatabase.DropIndex(KIndexInt,KTableName)==KErrNone);
+	TheTimer.Stop();
+	TheTimer.Start(_L("drop Text[200]"));
+	test(TheDatabase.DropIndex(KIndexText,KTableName)==KErrNone);
+	TheTimer.Stop();
+	test(!TheDatabase.IsDamaged());
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-DBMS-CT-1317
+@SYMTestCaseDesc        Deleting a table from the database
+@SYMTestPriority        Medium
+@SYMTestActions        	Delete the rows from the rowset.Check for empty rows in the rowset.
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void DeleteTableL()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-1317 "));
+	const TInt KTenthRecords=KRecords/10;
+
+	test (TheTable.Open(TheDatabase,KTableName)==KErrNone);
+	TheDatabase.Begin();
+	TInt ii;
+	for (ii=0;ii<15;++ii)
+		{
+		TheTable.NextL();
+		TheTable.DeleteL();
+		}
+	TheTable.NextL();
+	TDbBookmark mark=TheTable.Bookmark();
+	TheTable.Close();
+	TheDatabase.Commit();
+	CloseDatabase();
+	OpenDatabaseL();
+	TheTimer.Start(_L("delete table"));
+	test (TheTable.Open(TheDatabase,KTableName)==KErrNone);
+	TheDatabase.Begin();
+	TheTable.GotoL(mark);
+	TheTable.DeleteL();
+	for (ii=0;ii<KTenthRecords*2-16;++ii)
+		{
+		TheTable.NextL();
+		TheTable.DeleteL();
+		}
+	TheTable.EndL();
+	for (ii=0;ii<KTenthRecords*2;++ii)
+		{
+		TheTable.PreviousL();
+		TheTable.DeleteL();
+		}
+	TheTable.BeginningL();
+	for (ii=0;ii<KTenthRecords*3;++ii)
+		TheTable.NextL();
+	for (ii=0;ii<KTenthRecords*2;++ii)
+		{
+		TheTable.NextL();
+		TheTable.DeleteL();
+		}
+	for (ii=0;ii<KTenthRecords*2;++ii)
+		{
+		TheTable.PreviousL();
+		TheTable.DeleteL();
+		}
+	for (ii=0;ii<KTenthRecords;++ii)
+		{
+		TheTable.NextL();
+		TheTable.DeleteL();
+		}
+	for (ii=0;ii<KTenthRecords;++ii)
+		{
+		TheTable.PreviousL();
+		TheTable.DeleteL();
+		}
+	test (TheTable.CountL()==0);
+	test (!TheTable.NextL());
+	test (!TheTable.PreviousL());
+	test (TheDatabase.Commit()==KErrNone);
+	TheTable.Close();
+	TheTimer.Stop();
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-DBMS-CT-0579
+@SYMTestCaseDesc        Tests the database definition and enquiry functions
+@SYMTestPriority        Medium
+@SYMTestActions        	Executes the index and bookmark tests
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void BigTestL()
+	{
+	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0579 Table "));
+	CreateDatabaseL();
+	BuildTableL(KRecords);
+	test(TheTable.Open(TheDatabase,KTableName)==KErrNone);
+	TheTable.EndL();
+	IterateL(TheTable.EPrevious);
+	TheTable.BeginningL();
+	IterateL(TheTable.ENext);
+	TheTable.EndL();
+	IterateL(TheTable.EPrevious);
+	TheTable.Close();
+	test.Next(_L("Int32 Index"));
+	CDbKey *key=CDbKey::NewLC();
+	key->AddL(KColumnInt);
+	key->MakeUnique();
+	TestIndexL(KIndexInt,*key);
+	test.Next(_L("Text[200] Index"));
+	key->Clear();
+	key->AddL(KColumnText);
+	key->MakeUnique();
+	TestIndexL(KIndexText,*key);
+	test.Next(_L("Bookmarks"));
+	TestBookmarkL();
+	test.Next(_L("Int32 Index"));
+	TheTimer.Start(_L("drop"));
+	test(TheDatabase.DropIndex(KIndexInt,KTableName)==KErrNone);
+	TheTimer.Stop();
+	key->Clear();
+	key->AddL(KColumnInt);
+	key->MakeUnique();
+	TestIndexL(KIndexInt,*key);
+	CleanupStack::PopAndDestroy();
+	test.Next(_L("Break & Recover"));
+	BreakIndex();
+	Recover();
+	test.Next(_L("Drop Indexes"));
+	DropIndexes();
+	test.Next(_L("Delete all records"));
+	DeleteTableL();
+	CloseDatabase();
+	test.End();
+	}
+
+//
+// Prepare the test directory.
+//
+LOCAL_C void setupTestDirectory()
+    {
+	TInt r=TheFs.Connect();
+	test(r==KErrNone);
+	r=TheFs.MkDir(KTestDir);
+	test(r==KErrNone || r==KErrAlreadyExists);
+	r=TheFs.SetSessionPath(KTestDir);
+	test(r==KErrNone);
+	}
+
+//
+// Initialise the cleanup stack.
+//
+LOCAL_C void setupCleanup()
+    {
+	TheTrapCleanup=CTrapCleanup::New();
+	test(TheTrapCleanup!=NULL);
+	TRAPD(r,\
+		{\
+		for (TInt i=KTestCleanupStack;i>0;i--)\
+			CleanupStack::PushL((TAny*)0);\
+		CleanupStack::Pop(KTestCleanupStack);\
+		});
+	test(r==KErrNone);
+	}
+
+LOCAL_C void DeleteDataFile(const TDesC& aFullName)
+	{
+	RFs fsSession;
+	TInt err = fsSession.Connect();
+	if(err == KErrNone)
+		{
+		TEntry entry;
+		if(fsSession.Entry(aFullName, entry) == KErrNone)
+			{
+			RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName);
+			err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly);
+			if(err != KErrNone)
+				{
+				RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName);
+				}
+			err = fsSession.Delete(aFullName);
+			if(err != KErrNone)
+				{
+				RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName);
+				}
+			}
+		fsSession.Close();
+		}
+	else
+		{
+		RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName);
+		}
+	}
+
+//
+// Test streaming conversions.
+//
+GLDEF_C TInt E32Main()
+    {
+	test.Title();
+	setupTestDirectory();
+	setupCleanup();
+	__UHEAP_MARK;
+//
+	test.Start(_L("Standard database"));
+	TRAPD(r,BigTestL();)
+	test(r==KErrNone);
+
+	// clean up data files used by this test - must be done before call to End() - DEF047652
+	_LIT(KTestDbName, "C:\\DBMS-TST\\T_BIG.DB");
+	::DeleteDataFile(KTestDbName);
+
+	test.End();
+//
+	__UHEAP_MARKEND;
+	delete TheTrapCleanup;
+
+
+
+	TheFs.Close();
+	test.Close();
+	return 0;
+    }