sl@0: // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: LOCAL_D RTest test(_L("t_dbwindow: Testing the 'window' stage")); sl@0: LOCAL_D CTrapCleanup* TheTrapCleanup; sl@0: LOCAL_D CFileStore* TheStore; sl@0: LOCAL_D RDbStoreDatabase TheDatabase; sl@0: LOCAL_D RDbView TheView; sl@0: LOCAL_D RFs TheFs; sl@0: sl@0: const TInt KTestCleanupStack=0x20; sl@0: const TPtrC KTestDir=_S("C:\\DBMS-TST\\"); sl@0: const TPtrC KTestFile=_S("T_WINDOW.DB"); sl@0: const TPtrC KTableName=_S("TestTable"); sl@0: const TPtrC KColumnID=_S("id"); sl@0: const TPtrC KIndexName=_S("TestIndex"); sl@0: const TInt KRecords=10; sl@0: const TPtrC KCreateTable=_L("CREATE TABLE TestTable (id INTEGER NOT NULL)"); sl@0: const TPtrC KCreateIndex=_L("CREATE UNIQUE INDEX TestIndex ON TestTable (id)"); sl@0: const TPtrC KEmptyQuery=_L("select * from TestTable where id is null"); sl@0: const TPtrC KOrderQuery=_L("select * from TestTable order by id"); sl@0: const TDbWindow KSingleSlotWindow(0,0); sl@0: const TDbWindow KSmallWindow(2,2); sl@0: const TDbWindow KLargeWindow(20,0); sl@0: sl@0: // sl@0: // Create the database-in-a-store sl@0: // sl@0: LOCAL_C void CreateDatabaseL() sl@0: { sl@0: CFileStore* store=CPermanentFileStore::ReplaceLC(TheFs,KTestFile,EFileRead|EFileWrite); sl@0: store->SetTypeL(KPermanentFileStoreLayoutUid); sl@0: TStreamId id; sl@0: id=TheDatabase.CreateL(store); sl@0: store->SetRootL(id); sl@0: store->CommitL(); sl@0: CleanupStack::Pop(); sl@0: TheStore=store; sl@0: } sl@0: sl@0: LOCAL_C void CloseDatabaseL() sl@0: { sl@0: // cannot evaluate size info for store database sl@0: RDbDatabase::TSize size=TheDatabase.Size(); sl@0: test (size.iSize<0); sl@0: test (size.iUsage<0); sl@0: test (TheDatabase.UpdateStats()==KErrNone); sl@0: size=TheDatabase.Size(); sl@0: test (size.iSize<0); sl@0: test (size.iUsage<0); sl@0: TheDatabase.Close(); sl@0: delete TheStore; sl@0: } sl@0: sl@0: LOCAL_C void CreateTableL() sl@0: { sl@0: TheDatabase.Begin(); sl@0: test(TheDatabase.Execute(KCreateTable)==KErrNone); sl@0: RDbTable table; sl@0: test(table.Open(TheDatabase,KTableName,table.EInsertOnly)==KErrNone); sl@0: for (TInt ii=0;ii=KErrNone); sl@0: TInt ii=TheView.CountL()-cc; sl@0: test(ii>=0); sl@0: cc+=ii; sl@0: while (--ii>=0) sl@0: { sl@0: test(TheView.AtRow()); sl@0: TheView.NextL(); sl@0: } sl@0: test(!TheView.AtRow()); sl@0: } sl@0: test(cc==KRecords); sl@0: test.Next(_L("Insert")); sl@0: // The new records should go on the end of the set sl@0: TheView.InsertL(); sl@0: TheView.SetColL(1,TInt(-1)); sl@0: TheView.PutL(); sl@0: test(TheView.CountL()==KRecords+1); sl@0: test(TheView.LastL()); sl@0: TheView.GetL(); sl@0: test(TheView.ColInt(1)==-1); sl@0: // because of order, it should appear at beginning on re-evaluation sl@0: TheView.Reset(); sl@0: test(TheView.EvaluateAll()==KErrNone); sl@0: test(TheView.CountL()==KRecords+1); sl@0: test(TheView.FirstL()); sl@0: TheView.GetL(); sl@0: test(TheView.ColInt(1)==-1); sl@0: test.Next(_L("Update")); sl@0: // updated records should not move (or disappear) in the set sl@0: TheView.UpdateL(); sl@0: TheView.SetColL(1,KRecords); sl@0: TheView.PutL(); sl@0: test(TheView.CountL()==KRecords+1); sl@0: test(TheView.FirstL()); sl@0: TheView.GetL(); sl@0: test(TheView.ColInt(1)==KRecords); sl@0: // because of order, it should appear at end on re-evaluation sl@0: TheView.Reset(); sl@0: test(TheView.EvaluateAll()==KErrNone); sl@0: test(TheView.CountL()==KRecords+1); sl@0: test(TheView.LastL()); sl@0: TheView.GetL(); sl@0: test(TheView.ColInt(1)==KRecords); sl@0: test.Next(_L("Bookmarks")); sl@0: TDbBookmark mark=TheView.Bookmark(); sl@0: TheView.BeginningL(); sl@0: TRAPD(r,TheView.GotoL(mark)); sl@0: test(r==KErrNone); sl@0: TheView.GetL(); sl@0: test(TheView.ColInt(1)==KRecords); sl@0: test(!TheView.NextL()); sl@0: test(TheView.PreviousL()); sl@0: test.Next(_L("Delete")); sl@0: // should disappear from the set sl@0: TheView.DeleteL(); sl@0: test(TheView.CountL()==KRecords); sl@0: for (TheView.BeginningL();TheView.NextL();) sl@0: { sl@0: TheView.GetL(); sl@0: test(TheView.ColInt(1)!=KRecords); sl@0: } sl@0: TRAP(r,TheView.GotoL(mark)); sl@0: test(r!=KErrNone); sl@0: TheView.Reset(); sl@0: test(TheView.EvaluateAll()==KErrNone); sl@0: test(TheView.CountL()==KRecords); sl@0: for (TheView.BeginningL();TheView.NextL();) sl@0: { sl@0: TheView.GetL(); sl@0: test(TheView.ColInt(1)!=KRecords); sl@0: } sl@0: TRAP(r,TheView.GotoL(mark)); sl@0: test(r!=KErrNone); sl@0: test.End(); sl@0: TheView.Close(); sl@0: } sl@0: sl@0: // sl@0: // do as much incremental evaluation as possible sl@0: // sl@0: LOCAL_C void Evaluate() sl@0: { sl@0: test(TheView.EvaluateAll()==KErrNone); sl@0: } sl@0: sl@0: // sl@0: // get to the true end of set sl@0: // sl@0: LOCAL_C void GotoEndL() sl@0: { sl@0: for (;;) sl@0: { sl@0: while (TheView.AtRow()) sl@0: TheView.NextL(); sl@0: if (!TheView.Unevaluated()) sl@0: break; sl@0: Evaluate(); sl@0: } sl@0: } sl@0: sl@0: LOCAL_C void CheckWindowL(TInt forward,TInt back) sl@0: { sl@0: TInt ii; sl@0: for (ii=0;ii0;i--)\ sl@0: CleanupStack::PushL((TAny*)0);\ sl@0: CleanupStack::Pop(KTestCleanupStack);\ sl@0: }); sl@0: test(r==KErrNone); sl@0: } sl@0: sl@0: LOCAL_C void DeleteDataFile(const TDesC& aFullName) sl@0: { sl@0: RFs fsSession; sl@0: TInt err = fsSession.Connect(); sl@0: if(err == KErrNone) sl@0: { sl@0: TEntry entry; sl@0: if(fsSession.Entry(aFullName, entry) == KErrNone) sl@0: { sl@0: RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName); sl@0: err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly); sl@0: if(err != KErrNone) sl@0: { sl@0: RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName); sl@0: } sl@0: err = fsSession.Delete(aFullName); sl@0: if(err != KErrNone) sl@0: { sl@0: RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName); sl@0: } sl@0: } sl@0: fsSession.Close(); sl@0: } sl@0: else sl@0: { sl@0: RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName); sl@0: } sl@0: } sl@0: sl@0: // sl@0: // Test streaming conversions. sl@0: // sl@0: GLDEF_C TInt E32Main() sl@0: { sl@0: test.Title(); sl@0: setupTestDirectory(); sl@0: setupCleanup(); sl@0: // sl@0: test.Start(_L("TDbWindow - database test")); sl@0: TRAPD(err, TestL()); sl@0: test(err == KErrNone); sl@0: sl@0: //deletion of data files must be done before call to end - DEF047652 sl@0: _LIT(KTestDbName, "C:\\DBMS-TST\\T_WINDOW.DB"); sl@0: ::DeleteDataFile(KTestDbName); sl@0: test.End(); sl@0: // sl@0: sl@0: delete TheTrapCleanup; sl@0: TheFs.Close(); sl@0: test.Close(); sl@0: return 0; sl@0: }