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