diff -r 04ec7606545c -r fcc16690f446 persistentstorage/sql/TEST/t_sqlperformance5.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/sql/TEST/t_sqlperformance5.cpp Tue May 25 14:35:19 2010 +0300 @@ -0,0 +1,421 @@ +// Copyright (c) 2010 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: MDS harvesting performance test +// +#include +#include +#include +#include +#include +#include "t_sqlcmdlineutil.h" + +RTest TheTest(_L("t_sqlperformance5 test")); +RSqlDatabase TheDb; + +_LIT(KDbName, "c:\\test\\t_sqlperformance5.db"); + +TFileName TheDbFileName; +TBuf<200> TheTestTitle; +TCmdLineParams TheCmdLineParams(TCmdLineParams::EDbUtf16, 16384, 32); +TBuf8<200> TheSqlConfigString; + +_LIT(KUtf8, "UTF8 "); +_LIT(KUtf16, "UTF16"); + +const TInt KThumbnailCount = 60; +const TInt KMaxThumbnailSize = 40 * 1024; + +const TInt KThumbnailSizes[KThumbnailCount] = + { + //1 2 3 4 5 6 7 8 9 10 + 22054, 24076, 33281, 24733, 33094, 31443, 29264, 28725, 31798, 29322, //1 + 25002, 26926, 31097, 21988, 33659, 29081, 33050, 36857, 37686, 24034, //2 + 21093, 28314, 20186, 27222, 28600, 32735, 27279, 31898, 31380, 36316, //3 + 34295, 31642, 21829, 32912, 31584, 32557, 36601, 22744, 32808, 26130, //4 + 31222, 21545, 35899, 22257, 25856, 31169, 34893, 23496, 23034, 30381, //5 + 25810, 27123, 33442, 22275, 30260, 31028, 32415, 27345, 26614, 33704 //6 + }; + +TInt TheFastCounterFreq = 0; + +TInt TheCreateDbTime = 0; +TInt TheCreateTablesTime = 0; +TInt TheBindParamsTime = 0; +TInt TheStmtExecTime = 0; +TInt TheStmtResetTime = 0; +TInt ThePopulateTempTableTime = 0; +TInt TheFlushTime = 0; + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +void TestEnvDestroy() + { + TheDb.Close(); + (void)RSqlDatabase::Delete(TheDbFileName); + ResetSoftHeapLimit(); + } + +/////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////// +//Test macros and functions +void Check1(TInt aValue, TInt aLine) + { + if(!aValue) + { + TestEnvDestroy(); + TheTest.Printf(_L("*** Line %d\r\n"), aLine); + TheTest(EFalse, aLine); + } + } +void Check2(TInt aValue, TInt aExpected, TInt aLine) + { + if(aValue != aExpected) + { + TSqlRetCodeClass cl = SqlRetCodeClass(aValue); + if(cl == ESqlDbError) + { + TPtrC errmsg = TheDb.LastErrorMessage(); + TheTest.Printf(_L("*** SQLite err=\"%S\"\r\n"), &errmsg); + } + TestEnvDestroy(); + TheTest.Printf(_L("*** Line %d, Expected error: %d, got: %d\r\n"), aLine, aExpected, aValue); + TheTest(EFalse, aLine); + } + } +#define TEST(arg) ::Check1((arg), __LINE__) +#define TEST2(aValue, aExpected) ::Check2(aValue, aExpected, __LINE__) + +/////////////////////////////////////////////////////////////////////////////////////// + +void TestEnvInit() + { + RFs fs; + TInt err = fs.Connect(); + TEST2(err, KErrNone); + err = fs.MkDirAll(TheDbFileName); + TEST(err == KErrNone || err == KErrAlreadyExists); + fs.Close(); + } + +TInt TimeDiffUs(TUint32 aStartTicks, TUint32 aEndTicks) + { + if(TheFastCounterFreq == 0) + { + TEST2(HAL::Get(HAL::EFastCounterFrequency, TheFastCounterFreq), KErrNone); + TheTest.Printf(_L("==Fast counter frequency: %d Hz\r\n"), TheFastCounterFreq); + } + TInt64 diffTicks = (TInt64)aEndTicks - (TInt64)aStartTicks; + if(diffTicks < 0) + { + diffTicks = KMaxTUint32 + diffTicks + 1; + } + const TInt KMicroSecIn1Sec = 1000000; + TInt us = (diffTicks * KMicroSecIn1Sec) / TheFastCounterFreq; + return us; + } + +void PrintTime(const TDesC& aFmt, TUint32 aStartTicks, TUint32 aEndTicks) + { + TInt us = TimeDiffUs(aStartTicks, aEndTicks); + TheTest.Printf(aFmt, us); + } + +//============================================================================= + +/** +@SYMTestCaseID PDS-SQL-CT-4205 +@SYMTestCaseDesc Thumbnail database performance test. +@SYMTestPriority Medium +@SYMTestActions The test executes statements to create the thumbnail database. +@SYMTestExpectedResults The test must not fail +@SYMDEF ou1cimx1#362240 +*/ +void CreateDb() + { + (void)RSqlDatabase::Delete(TheDbFileName); + + TUint32 fc1 = User::FastCounter(); + + TInt err = TheDb.Create(TheDbFileName, &TheSqlConfigString); + + TUint32 fc2 = User::FastCounter(); + TheCreateDbTime = TimeDiffUs(fc1, fc2); + + TEST2(err, KErrNone); + + fc1 = User::FastCounter(); + + err = TheDb.Exec(_L("CREATE TABLE ThumbnailInfo (Path TEXT COLLATE NOCASE,TNId INTEGER,Size INTEGER,Format INTEGER,TNPath TEXT COLLATE NOCASE,Width INTEGER,Height INTEGER,OrigWidth INTEGER,OrigHeight INTEGER,Flags INTEGER,VideoPosition INTEGER,Orientation INTEGER,humbFromPath INTEGER,Modified LARGEINT);")); + TEST(err >= 0); + + err = TheDb.Exec(_L("CREATE TABLE ThumbnailInfoData(Data BLOB);")); + TEST(err >= 0); + + err = TheDb.Exec(_L("CREATE TABLE ThumbnailDeleted(Path TEXT UNIQUE COLLATE NOCASE);")); + TEST(err >= 0); + + err = TheDb.Exec(_L("CREATE INDEX idx1 ON ThumbnailInfo(Path, Size);")); + TEST(err >= 0); + + err = TheDb.Exec(_L("CREATE INDEX idx4 ON ThumbnailDeleted(Path);")); + TEST(err >= 0); + + err = TheDb.Exec(_L("CREATE TABLE ThumbnailVersion (Major INTEGER,Minor INTEGER,IMEI TEXT COLLATE NOCASE);")); + TEST(err >= 0); + + fc2 = User::FastCounter(); + TheCreateTablesTime = TimeDiffUs(fc1, fc2); + + TheDb.Close(); + } + +void PoulateTempTables(RSqlStatement& aStmt1, RSqlStatement& aStmt2) + { + HBufC8* thumbnailBuf = HBufC8::New(KMaxThumbnailSize); + TEST(thumbnailBuf != NULL); + TPtr8 thumbnailData = thumbnailBuf->Des(); + thumbnailData.SetLength(KMaxThumbnailSize); + thumbnailData.Fill(TChar('A')); + + TUint32 fc3 = User::FastCounter(); + + for(TInt i=0;i= 0); + TInt err = aStmt1.BindText(paramIndex, _L("c:\\test\\abcdefgh123456789.jpg")); + TEST2(err, KErrNone); + + paramIndex = aStmt1.ParameterIndex(_L(":Width")); + TEST(paramIndex >= 0); + err = aStmt1.BindInt(paramIndex, 50); + TEST2(err, KErrNone); + + paramIndex = aStmt1.ParameterIndex(_L(":Height")); + TEST(paramIndex >= 0); + err = aStmt1.BindInt(paramIndex, 40); + TEST2(err, KErrNone); + + paramIndex = aStmt1.ParameterIndex(_L(":OrigWidth")); + TEST(paramIndex >= 0); + err = aStmt1.BindInt(paramIndex, 1000); + TEST2(err, KErrNone); + + paramIndex = aStmt1.ParameterIndex(_L(":OrigHeight")); + TEST(paramIndex >= 0); + err = aStmt1.BindInt(paramIndex, 2000); + TEST2(err, KErrNone); + + paramIndex = aStmt1.ParameterIndex(_L(":Format")); + TEST(paramIndex >= 0); + err = aStmt1.BindInt(paramIndex, 10); + TEST2(err, KErrNone); + + paramIndex = aStmt1.ParameterIndex(_L(":Flags")); + TEST(paramIndex >= 0); + err = aStmt1.BindInt(paramIndex, 0x1E); + TEST2(err, KErrNone); + + paramIndex = aStmt1.ParameterIndex(_L(":Size")); + TEST(paramIndex >= 0); + err = aStmt1.BindInt(paramIndex, 1200); + TEST2(err, KErrNone); + + paramIndex = aStmt1.ParameterIndex(_L(":Orient")); + TEST(paramIndex >= 0); + err = aStmt1.BindInt(paramIndex, 2); + TEST2(err, KErrNone); + + paramIndex = aStmt1.ParameterIndex(_L(":ThumbFromPath")); + TEST(paramIndex >= 0); + err = aStmt1.BindInt(paramIndex, 1); + TEST2(err, KErrNone); + + paramIndex = aStmt1.ParameterIndex(_L(":Modified")); + TEST(paramIndex >= 0); + err = aStmt1.BindInt64(paramIndex, 3212398543392LL); + TEST2(err, KErrNone); + + TUint32 fc2 = User::FastCounter(); + TheBindParamsTime += TimeDiffUs(fc1, fc2); + + fc1 = User::FastCounter(); + err = aStmt1.Exec(); + fc2 = User::FastCounter(); + TheStmtExecTime += TimeDiffUs(fc1, fc2); + + TEST2(err, 1); + + fc1 = User::FastCounter(); + err = aStmt1.Reset(); + fc2 = User::FastCounter(); + TheStmtResetTime += TimeDiffUs(fc1, fc2); + + TEST2(err, KErrNone); + + thumbnailData.SetLength(KThumbnailSizes[i]); + + fc1 = User::FastCounter(); + paramIndex = aStmt2.ParameterIndex(_L(":Data")); + TEST(paramIndex >= 0); + err = aStmt2.BindBinary(paramIndex, thumbnailData); + TEST2(err, KErrNone); + fc2 = User::FastCounter(); + TheBindParamsTime += TimeDiffUs(fc1, fc2); + + fc1 = User::FastCounter(); + err = aStmt2.Exec(); + fc2 = User::FastCounter(); + TheStmtExecTime += TimeDiffUs(fc1, fc2); + + TEST2(err, 1); + + fc1 = User::FastCounter(); + err = aStmt2.Reset(); + fc2 = User::FastCounter(); + TheStmtResetTime += TimeDiffUs(fc1, fc2); + + TEST2(err, KErrNone); + } + + TUint32 fc4 = User::FastCounter(); + ThePopulateTempTableTime += TimeDiffUs(fc3, fc4); + + delete thumbnailBuf; + } + +void FlushTemptTables() + { + TUint32 fc1 = User::FastCounter(); + + TInt err = TheDb.Exec(_L("BEGIN TRANSACTION")); + TEST(err >= 0); + + err = TheDb.Exec(_L("INSERT INTO ThumbnailInfo SELECT * FROM TempThumbnailInfo;")); + TEST2(err, KThumbnailCount); + + err = TheDb.Exec(_L("INSERT INTO ThumbnailInfoData SELECT * FROM TempThumbnailInfoData;")); + TEST2(err, KThumbnailCount); + + err = TheDb.Exec(_L("DELETE FROM TempThumbnailInfo;")); + TEST(err >= 0); + + err = TheDb.Exec(_L("DELETE FROM TempThumbnailInfoData;")); + TEST(err >= 0); + + err = TheDb.Exec(_L("COMMIT;")); + TEST(err >= 0); + + TUint32 fc2 = User::FastCounter(); + TheFlushTime += TimeDiffUs(fc1, fc2); + } + +/** +@SYMTestCaseID PDS-SQL-CT-4206 +@SYMTestCaseDesc Thumbnail database performance test. +@SYMTestPriority Medium +@SYMTestActions The test inserts 60 thumbnails with summary size of 1.7Mb into the thumbnail database. +@SYMTestExpectedResults The test must not fail +@SYMDEF ou1cimx1#362240 +*/ +void PopulateDb() + { + TInt dataToCommit = 0; + for(TInt i=0;i= 0); + + err = TheDb.Exec(_L("CREATE TEMP TABLE TempThumbnailInfoData (Data BLOB);")); + TEST(err >= 0); + + RSqlStatement stmt1; + err = stmt1.Prepare(TheDb, _L("INSERT INTO TempThumbnailInfo(Path,Size,Format,Width,Height,OrigWidth,OrigHeight,Flags,Orientation,ThumbFromPath,Modified) VALUES (:Path,:Size,:Format,:Width,:Height,:OrigWidth,:OrigHeight,:Flags,:Orient,:ThumbFromPath,:Modified);")); + TEST2(err, KErrNone); + + RSqlStatement stmt2; + err = stmt2.Prepare(TheDb, _L("INSERT INTO TempThumbnailInfoData (Data) VALUES (:Data);")); + TEST2(err, KErrNone); + + PoulateTempTables(stmt1, stmt2); + FlushTemptTables(); + + stmt2.Close(); + stmt1.Close(); + TheDb.Close(); + + TheTest.Printf(_L("==Create database, time=%d microseconds\r\n"), TheCreateDbTime); + TheTest.Printf(_L("==Create tables, time=%d microseconds\r\n"), TheCreateTablesTime); + TheTest.Printf(_L("==Bind parameters time, time=%d microseconds\r\n"), TheBindParamsTime); + TheTest.Printf(_L("==Temp tables, statement exec, time=%d microseconds\r\n"), TheStmtExecTime); + TheTest.Printf(_L("==Temp tables, statement reset, time=%d microseconds\r\n"), TheStmtResetTime); + TheTest.Printf(_L("==Populate temp tables, time=%d microseconds\r\n"), ThePopulateTempTableTime); + TheTest.Printf(_L("==Copy temp tables to main tables, time=%d microseconds\r\n"), TheFlushTime); + } + +void DoTestsL() + { + TheTestTitle.Format(_L("@SYMTestCaseID:PDS-SQL-CT-4205 Create database, encoding: \"%S\", page size: %d\r\n"), + TheCmdLineParams.iDbEncoding == TCmdLineParams::EDbUtf16 ? &KUtf16 : &KUtf8, TheCmdLineParams.iPageSize); + TheTest.Start(TheTestTitle); + CreateDb(); + + TheTestTitle.Format(_L("@SYMTestCaseID:PDS-SQL-CT-4206 Populate database, encoding: \"%S\", page size: %d\r\n"), + TheCmdLineParams.iDbEncoding == TCmdLineParams::EDbUtf16 ? &KUtf16 : &KUtf8, TheCmdLineParams.iPageSize); + TheTest.Next(TheTestTitle); + PopulateDb(); + + (void)RSqlDatabase::Delete(TheDbFileName); + } + +TInt E32Main() + { + TheTest.Title(); + + CTrapCleanup* tc = CTrapCleanup::New(); + TheTest(tc != NULL); + + __UHEAP_MARK; + + GetCmdLineParamsAndSqlConfigString(TheTest, _L("t_sqlperformance5"), TheCmdLineParams, TheSqlConfigString); + PrepareDbName(KDbName, TheCmdLineParams.iDriveName, TheDbFileName); + SetSoftHeapLimit(TheCmdLineParams.iSoftHeapLimitKb); + + TheTest.Printf(_L("==Databases: %S\r\n"), &TheDbFileName); + + TestEnvDestroy(); + TestEnvInit(); + TRAPD(err, DoTestsL()); + TestEnvDestroy(); + TEST2(err, KErrNone); + + __UHEAP_MARKEND; + + TheTest.End(); + TheTest.Close(); + + delete tc; + + User::Heap().Check(); + return KErrNone; + }