diff -r 000000000000 -r 08ec8eefde2f persistentstorage/dbms/tdbms/t_dbwindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/dbms/tdbms/t_dbwindow.cpp Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,516 @@ +// 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: +// + +#include +#include +#include + +LOCAL_D RTest test(_L("t_dbwindow: Testing the 'window' stage")); +LOCAL_D CTrapCleanup* TheTrapCleanup; +LOCAL_D CFileStore* TheStore; +LOCAL_D RDbStoreDatabase TheDatabase; +LOCAL_D RDbView TheView; +LOCAL_D RFs TheFs; + +const TInt KTestCleanupStack=0x20; +const TPtrC KTestDir=_S("C:\\DBMS-TST\\"); +const TPtrC KTestFile=_S("T_WINDOW.DB"); +const TPtrC KTableName=_S("TestTable"); +const TPtrC KColumnID=_S("id"); +const TPtrC KIndexName=_S("TestIndex"); +const TInt KRecords=10; +const TPtrC KCreateTable=_L("CREATE TABLE TestTable (id INTEGER NOT NULL)"); +const TPtrC KCreateIndex=_L("CREATE UNIQUE INDEX TestIndex ON TestTable (id)"); +const TPtrC KEmptyQuery=_L("select * from TestTable where id is null"); +const TPtrC KOrderQuery=_L("select * from TestTable order by id"); +const TDbWindow KSingleSlotWindow(0,0); +const TDbWindow KSmallWindow(2,2); +const TDbWindow KLargeWindow(20,0); + +// +// Create the database-in-a-store +// +LOCAL_C void CreateDatabaseL() + { + 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; + } + +LOCAL_C void CloseDatabaseL() + { + // cannot evaluate size info for store database + RDbDatabase::TSize size=TheDatabase.Size(); + test (size.iSize<0); + test (size.iUsage<0); + test (TheDatabase.UpdateStats()==KErrNone); + size=TheDatabase.Size(); + test (size.iSize<0); + test (size.iUsage<0); + TheDatabase.Close(); + delete TheStore; + } + +LOCAL_C void CreateTableL() + { + TheDatabase.Begin(); + test(TheDatabase.Execute(KCreateTable)==KErrNone); + RDbTable table; + test(table.Open(TheDatabase,KTableName,table.EInsertOnly)==KErrNone); + for (TInt ii=0;ii=KErrNone); + TInt ii=TheView.CountL()-cc; + test(ii>=0); + cc+=ii; + while (--ii>=0) + { + test(TheView.AtRow()); + TheView.NextL(); + } + test(!TheView.AtRow()); + } + test(cc==KRecords); + test.Next(_L("Insert")); +// The new records should go on the end of the set + TheView.InsertL(); + TheView.SetColL(1,TInt(-1)); + TheView.PutL(); + test(TheView.CountL()==KRecords+1); + test(TheView.LastL()); + TheView.GetL(); + test(TheView.ColInt(1)==-1); +// because of order, it should appear at beginning on re-evaluation + TheView.Reset(); + test(TheView.EvaluateAll()==KErrNone); + test(TheView.CountL()==KRecords+1); + test(TheView.FirstL()); + TheView.GetL(); + test(TheView.ColInt(1)==-1); + test.Next(_L("Update")); +// updated records should not move (or disappear) in the set + TheView.UpdateL(); + TheView.SetColL(1,KRecords); + TheView.PutL(); + test(TheView.CountL()==KRecords+1); + test(TheView.FirstL()); + TheView.GetL(); + test(TheView.ColInt(1)==KRecords); +// because of order, it should appear at end on re-evaluation + TheView.Reset(); + test(TheView.EvaluateAll()==KErrNone); + test(TheView.CountL()==KRecords+1); + test(TheView.LastL()); + TheView.GetL(); + test(TheView.ColInt(1)==KRecords); + test.Next(_L("Bookmarks")); + TDbBookmark mark=TheView.Bookmark(); + TheView.BeginningL(); + TRAPD(r,TheView.GotoL(mark)); + test(r==KErrNone); + TheView.GetL(); + test(TheView.ColInt(1)==KRecords); + test(!TheView.NextL()); + test(TheView.PreviousL()); + test.Next(_L("Delete")); +// should disappear from the set + TheView.DeleteL(); + test(TheView.CountL()==KRecords); + for (TheView.BeginningL();TheView.NextL();) + { + TheView.GetL(); + test(TheView.ColInt(1)!=KRecords); + } + TRAP(r,TheView.GotoL(mark)); + test(r!=KErrNone); + TheView.Reset(); + test(TheView.EvaluateAll()==KErrNone); + test(TheView.CountL()==KRecords); + for (TheView.BeginningL();TheView.NextL();) + { + TheView.GetL(); + test(TheView.ColInt(1)!=KRecords); + } + TRAP(r,TheView.GotoL(mark)); + test(r!=KErrNone); + test.End(); + TheView.Close(); + } + +// +// do as much incremental evaluation as possible +// +LOCAL_C void Evaluate() + { + test(TheView.EvaluateAll()==KErrNone); + } + +// +// get to the true end of set +// +LOCAL_C void GotoEndL() + { + for (;;) + { + while (TheView.AtRow()) + TheView.NextL(); + if (!TheView.Unevaluated()) + break; + Evaluate(); + } + } + +LOCAL_C void CheckWindowL(TInt forward,TInt back) + { + TInt ii; + for (ii=0;ii0;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(); +// + test.Start(_L("TDbWindow - database test")); + TRAPD(err, TestL()); + test(err == KErrNone); + + //deletion of data files must be done before call to end - DEF047652 + _LIT(KTestDbName, "C:\\DBMS-TST\\T_WINDOW.DB"); + ::DeleteDataFile(KTestDbName); + test.End(); +// + + delete TheTrapCleanup; + TheFs.Close(); + test.Close(); + return 0; + }