persistentstorage/sqlite3api/TEST/t_sqliteperf2.cpp
changeset 0 08ec8eefde2f
child 23 26645d81f48d
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include <e32test.h>
       
    17 #include <bautils.h>
       
    18 #include <e32math.h>
       
    19 #include <hal.h>
       
    20 #include <sqlite3.h>
       
    21 #include <string.h>
       
    22 #include <stdio.h>
       
    23 
       
    24 ///////////////////////////////////////////////////////////////////////////////////////
       
    25 
       
    26 enum TPerfTestType
       
    27 	{
       
    28 	EPerfTestMultiInsert,
       
    29 	EPerfTestMultiUpdate,
       
    30 	EPerfTestMultiDelete,
       
    31 	EPerfTestMultiSelect,
       
    32 	EPerfTestSingleInsert,
       
    33 	EPerfTestSingleUpdate,
       
    34 	EPerfTestSingleDelete,
       
    35 	EPerfTestSingleSelect,
       
    36 	//
       
    37 	EPerfTestTypeCnt
       
    38 	};
       
    39 
       
    40 //The performance test case results are stored in the ThePerfTestResult array.
       
    41 static TUint32 ThePerfTestResult[EPerfTestTypeCnt];
       
    42 
       
    43 static RTest TheTest(_L("t_sqliteperf2 test"));
       
    44 
       
    45 _LIT(KTestDir,              "c:\\test\\");
       
    46 _LIT(KTestDbName,           "c:\\test\\t_sqliteperf2.db");
       
    47 const char KTestDbName8[] = "c:\\test\\t_sqliteperf2.db";
       
    48 
       
    49 RFs TheFs;
       
    50 
       
    51 sqlite3* TheDb = 0;
       
    52 
       
    53 const TInt KInsertRecCnt = 1000;
       
    54 
       
    55 const TInt KUpdateRecCnt = KInsertRecCnt / 10;
       
    56 const TInt KDeleteRecCnt = KInsertRecCnt / 10;
       
    57 const TInt KSelectRecCnt = KInsertRecCnt / 10;
       
    58 
       
    59 const TInt KInsertRecIds[KInsertRecCnt] = 
       
    60 	{
       
    61 	18920,515,22944,32238,20164,9592,32360,29280,6219,26241,11175,15824,20409,14659,30084,4630,21646,24582,12976,21104,1834,
       
    62 	23425,15260,9692,8601,12375,10729,2244,4784,9697,11296,8672,3929,25134,16803,24153,20011,1864,29411,6442,8510,
       
    63 	13753,22996,20940,25149,6222,3742,13842,25788,23835,19606,850,25292,16319,25452,709,6093,2282,18597,9520,32132,
       
    64 	10012,23884,452,24430,17583,15333,15427,14419,32535,8867,5733,3613,9065,19931,12410,16363,5146,22199,15696,31330,
       
    65 	15369,27183,11607,17987,12992,27701,5379,25923,30199,23344,21106,28951,23642,1964,13903,28878,9613,29776,13302,22627,
       
    66 	19308,29200,23769,9875,30871,19620,11042,5356,18478,6968,24474,3623,13017,2405,30409,24247,19724,11360,31071,21410,
       
    67 	14985,14449,11218,15248,31526,10919,24905,32289,29904,15051,30137,15748,24272,10642,13133,13894,29261,16150,9996,20839,
       
    68 	1042,3463,10422,7347,27538,19486,6638,7503,23337,24147,8350,12435,3493,23376,24728,28439,27909,10661,30841,17937,
       
    69 	5761,829,17875,15070,24522,30097,13451,3294,16786,12827,7551,10629,19279,17166,30828,9903,1084,30788,25872,14132,
       
    70 	23969,8312,20363,19901,6741,25269,13323,25046,20353,19470,17832,2884,25254,26000,31885,26520,10466,26229,20313,32260,
       
    71 	2927,22170,7109,5486,21868,13620,646,12483,3808,30654,14965,9614,2300,30006,7917,201,32672,4488,32116,11762,
       
    72 	29729,15691,26270,5218,9546,7595,1583,7899,18592,28838,18048,24928,26858,380,17188,20809,3569,16736,20170,17302,
       
    73 	4485,22644,4197,9604,17856,17140,31627,9054,20623,20145,10267,12694,24685,3266,19747,11284,7794,2934,25345,32718,
       
    74 	397,27789,12488,4761,26382,18661,23870,5223,10492,14594,27601,1587,19534,28970,14398,12407,21532,9774,4901,5160,
       
    75 	9497,13128,3816,19950,11740,16127,8450,552,10058,28058,18992,5776,30968,29015,1760,29188,30287,32119,15445,4463,
       
    76 	28916,14875,23282,10548,31499,8933,6568,22293,13214,12741,17781,17318,12867,11280,10795,30721,22009,30835,15292,31572,
       
    77 	3942,19729,3864,24026,24900,15722,5499,10412,14873,3395,1057,31337,17181,29131,26894,24655,28321,1500,24135,3235,
       
    78 	25831,21374,32065,19539,13111,5805,9882,32731,28975,7516,29191,7013,20571,26809,23182,29236,18950,29619,31477,20802,
       
    79 	24399,17081,28282,11560,8063,8389,10692,26431,26777,11674,24602,28165,5683,8522,18643,15554,4741,26874,22797,32363,
       
    80 	32192,233,17826,22470,24481,12207,24920,7375,5957,1731,11096,30043,32063,19520,8674,13563,27624,12777,11582,27171,
       
    81 	8694,32106,14070,26763,13136,1505,16706,21206,31777,10908,4804,26482,18987,10020,19061,5311,12383,26747,28640,6259,
       
    82 	14506,18339,21390,11837,26641,19807,21441,4520,18688,25406,22885,22339,28639,5588,8515,24831,11751,19531,29144,26164,
       
    83 	6427,15141,9399,14619,2069,14441,19095,31165,3494,13964,29671,8668,31578,17533,10544,14318,7583,5880,23408,26316,
       
    84 	14367,12518,27517,19297,16745,4135,31647,13200,22619,4367,2789,9725,7578,29700,12598,4035,27492,1432,14052,19895,
       
    85 	18886,4597,19076,23280,29455,10110,18686,18567,31876,27827,19424,25243,30549,3413,29176,9880,7632,715,5665,28345,
       
    86 	24789,15301,26717,30412,27018,26399,7460,7734,25423,26120,9980,2870,8693,10595,11850,4974,30762,32365,15208,3487,
       
    87 	21048,3745,18167,28852,26864,5849,9335,25602,8416,6581,31509,9422,27085,4416,16579,25871,12893,25553,27534,1910,
       
    88 	17427,8240,19756,23724,7040,17658,19669,17883,4280,5959,29525,24687,25604,19593,32094,7966,726,3000,26658,29733,
       
    89 	6402,2476,11297,28885,16938,17610,6720,32335,28538,9186,3868,5004,21910,31832,28829,3232,30417,17282,10702,1855,
       
    90 	7584,28498,6380,26752,23374,18997,9149,28641,24305,15930,26146,14492,23415,12016,25048,23766,7593,16124,1043,31819,
       
    91 	13594,32373,32383,962,22216,7287,6554,22607,22467,19676,24738,9162,6103,6230,345,17791,32619,29371,22790,15143,
       
    92 	5289,2975,21180,5656,27615,3368,31454,20664,30501,15646,27619,6199,31041,13378,30807,24190,8135,8161,13858,18530,
       
    93 	2181,16808,20237,13853,8634,14978,5120,14324,9984,17555,31074,2379,2496,1599,11228,27564,21618,13040,22712,16520,
       
    94 	26319,24391,26278,9758,12074,9500,6577,23454,3587,18625,13170,12431,6106,17287,25476,878,10561,22404,7224,5016,
       
    95 	309,4243,8073,10858,21934,22171,22610,24486,5749,29973,21438,32024,21046,15304,28416,17786,29142,7383,3397,8854,
       
    96 	15878,27646,27111,32426,25369,8985,23268,19728,26386,20454,6030,1566,17922,3851,6732,10385,14427,24032,8340,26842,
       
    97 	8277,17586,17439,22908,4845,7342,13597,749,27536,13601,8437,19218,28258,8234,30110,15117,18122,18214,29772,22359,
       
    98 	20272,9068,22352,15886,1541,28475,3897,32656,21508,25328,23360,25928,1976,21116,16611,6856,10815,9935,27928,4429,
       
    99 	12589,5891,5198,21108,27699,15199,31650,24882,28266,14901,13547,16697,8948,13826,12168,22678,21371,7123,1568,29161,
       
   100 	4208,10600,29255,18437,12973,30787,31557,2465,8280,536,17745,22794,15587,20156,20917,3376,951,681,1520,5078,
       
   101 	5278,22108,22739,32389,14749,10621,17753,643,24374,31027,5357,22242,6921,5171,27844,6164,13191,5047,31615,2889,
       
   102 	9720,22901,20304,11257,19906,22367,14268,4328,13897,5228,11362,13777,11327,15541,27712,17995,7128,22298,31944,9167,
       
   103 	19254,4479,4957,12551,18927,22130,25701,13453,22721,26125,26783,22774,31105,30238,3254,28175,15189,7558,20326,5923,
       
   104 	3807,4096,5132,28745,26210,22490,27546,3471,3847,6089,19570,7769,2177,22343,8226,27389,2907,5088,14373,25035,
       
   105 	29096,27416,21853,23996,20037,554,11952,1646,1392,23339,29032,31060,3801,24280,13282,16801,7676,13202,138,1896,
       
   106 	9391,1447,3335,14849,25591,9427,29106,14766,32544,6919,30029,17534,17677,8296,16626,10866,9164,4251,4169,3295,
       
   107 	31341,17728,12798,11539,15637,31164,27762,3643,8014,7228,6833,28293,14497,12279,5541,22375,9395,15753,26061,30172,
       
   108 	18314,14239,14321,1397,12526,13350,5256,1140,21483,20615,32673,4537,4780,27087,5988,29403,31809,29537,24569,16503,
       
   109 	6047,9709,1701,11464,24552,6812,24630,6264,21997,9869,9890,27062,19186,2693,14827,22921,18609,19170,26693,11108,
       
   110 	15009,17361,379,762,15479,19905,14735,12781,1560,7841,27168,3011,4132,9745,7756,24068,25172,5352,24787
       
   111 	};
       
   112 
       
   113 const TInt KUpdateRecIds[KUpdateRecCnt] = 
       
   114 	{
       
   115 	6638,22607,5776,31477,10815,6919,32116,31041,18609,7224,18167,12992,11751,22721,29619,21048,22170,30084,23408,26278,
       
   116 	8437,9164,31509,552,16786,10544,29776,9604,26061,18314,23360,2884,11762,25134,31526,17826,29131,15753,12827,4035,5849,
       
   117 	8073,25788,27789,7516,19905,18478,2465,5289,13601,4784,13453,7583,309,9725,16503,14321,30835,14849,29236,19539,27087,
       
   118 	32365,29176,138,23642,9745,9880,28175,17555,12867,22921,17987,17318,15117,6554,17781,3569,23337,380,27085,24522,17583,
       
   119 	27844,19676,21618,30137,9520,24272,1541,32718,6030,25604,28282,15333,20037,10858,31777,18048,16706
       
   120 	};
       
   121 
       
   122 const TInt KSelectRecIds[KSelectRecCnt] = 
       
   123 	{
       
   124 	5683,4367,1432,9725,15824,6030,16697,5379,26520,1447,21116,17728,2927,11362,30172,11228,32260,15930,25292,17753,12867,
       
   125 	17534,12488,26164,3745,31164,30287,6230,16319,27909,6577,3471,5988,24272,2069,26270,21532,7769,23344,18987,6921,536,6164,
       
   126 	30199,11108,3847,4597,28266,31509,31819,8510,12777,14449,31650,9996,7460,30412,24147,10908,19906,31876,24247,6732,5957,
       
   127 	10815,17995,23337,7584,12383,26858,5665,11850,5749,5088,5486,643,13826,32094,15886,21910,4520,4630,7516,10110,24687,7558,
       
   128 	22627,27171,14492,11175,18688,27546,27087,29772,20353,9520,15878,25046,15696,22921,
       
   129 	};
       
   130 
       
   131 const TInt KDeleteRecIds[KDeleteRecCnt] = 
       
   132 	{
       
   133 	20623,19095,26210,18048,8416,18167,13200,22944,1057,31337,17875,29973,1140,23374,24552,19931,13017,10385,10058,11360,
       
   134 	30029,6581,22170,15824,2300,32389,25345,3494,17302,3807,19728,17832,11362,27909,30006,17361,28266,16319,22908,27564,
       
   135 	13853,24026,17586,25269,646,15141,15753,24655,22644,9882,9725,26763,6968,29191,27087,26864,13620,23884,27789,8161,643,
       
   136 	27062,1447,14506,29619,24153,8312,32544,31060,18530,13753,13826,8933,23408,20615,7013,18122,233,27712,536,3942,28852,
       
   137 	22921,31876,9613,397,26717,18997,23835,15292,5891,30968,24685,30835,29537,15051,13128,31477,28416,8135
       
   138 	};
       
   139 
       
   140 const TInt KInsertRecId = 6184;
       
   141 const TInt KUpdateRecId = 26658;
       
   142 const TInt KSelectRecId = 9592;
       
   143 const TInt KDeleteRecId = 24481;
       
   144 
       
   145 const char KMultiInsertSql[] = "INSERT INTO Tbl VALUES(:Id, 9234567890, 99.998, 'TEXT VALUE', x'AABBCCDDEEFF')";
       
   146 const char KMultiUpdateSql[] = "UPDATE Tbl SET D=11.113 WHERE I IN";
       
   147 const char KMultiDeleteSql[] = "DELETE FROM Tbl WHERE I IN";
       
   148 const char KMultiSelectSql[] = "SELECT I64,D,T,B FROM Tbl WHERE I IN";
       
   149 
       
   150 const char KSingleInsertSql[] = "INSERT INTO Tbl VALUES(%d, 9234567890, 99.998, 'TEXT VALUE', x'AABBCCDDEEFF')";
       
   151 const char KSingleUpdateSql[] = "UPDATE Tbl SET D=11.113 WHERE I=";
       
   152 const char KSingleDeleteSql[] = "DELETE FROM Tbl WHERE I=";
       
   153 const char KSingleSelectSql[] = "SELECT I64,D,T,B FROM Tbl WHERE I=";
       
   154 
       
   155 //This buffer is used for SQL statement formatting. 2000 bytes should be enough as a buffer max length.
       
   156 static char TheSqlBuf[2000];
       
   157 //This buffer is used for printf related formatting. 500 characters should be enough.
       
   158 static TBuf<500> ThePrintBuf;
       
   159 
       
   160 #define UNUSED_VAR(a) (a) = (a)
       
   161 #define UNUSED_PTR(a) a.Set(a)
       
   162 
       
   163 ///////////////////////////////////////////////////////////////////////////////////////
       
   164 
       
   165 static void DeleteTestFiles()
       
   166 	{
       
   167 	(void)TheFs.Delete(KTestDbName);
       
   168 	}
       
   169 
       
   170 ///////////////////////////////////////////////////////////////////////////////////////
       
   171 static void PrintSqliteErrMsg()
       
   172 	{
       
   173 	if(TheDb)
       
   174 		{
       
   175 		const char* msg = sqlite3_errmsg(TheDb);
       
   176 		TBuf<200> buf;
       
   177 		buf.Copy(TPtrC8((const TUint8*)msg));
       
   178 		TheTest.Printf(_L("*** SQLite error message: \"%S\"\r\n"), &buf);
       
   179 		}
       
   180 	}
       
   181 
       
   182 //Test macros and functions
       
   183 static void Check(TInt aValue, TInt aLine)
       
   184 	{
       
   185 	if(!aValue)
       
   186 		{
       
   187 		DeleteTestFiles();
       
   188 		PrintSqliteErrMsg();
       
   189 		TheTest(EFalse, aLine);
       
   190 		}
       
   191 	}
       
   192 static void Check(TInt aValue, TInt aExpected, TInt aLine)
       
   193 	{
       
   194 	if(aValue != aExpected)
       
   195 		{
       
   196 		DeleteTestFiles();
       
   197 		RDebug::Print(_L("*** Expected error: %d, got: %d\r\n"), aExpected, aValue);
       
   198 		PrintSqliteErrMsg();
       
   199 		TheTest(EFalse, aLine);
       
   200 		}
       
   201 	}
       
   202 #define TEST(arg) ::Check((arg), __LINE__)
       
   203 #define TEST2(aValue, aExpected) ::Check(aValue, aExpected, __LINE__)
       
   204 
       
   205 ///////////////////////////////////////////////////////////////////////////////////////
       
   206 
       
   207 static TInt TheCounterFreq = -10000000;
       
   208 const TInt KMicroSecIn1Sec = 1000000;
       
   209 
       
   210 //Prints aFastCount parameter (converted to us)
       
   211 static TInt FcDiff2Us(TUint32 aFastCount)
       
   212 	{
       
   213 	double v = ((double)aFastCount * KMicroSecIn1Sec) / (double)TheCounterFreq;
       
   214 	TInt v2 = (TInt)v;
       
   215 	return v2;
       
   216 	}
       
   217 
       
   218 static void GetFastCounterFrequency()
       
   219 	{
       
   220 	TEST2(HAL::Get(HAL::EFastCounterFrequency, TheCounterFreq), KErrNone);
       
   221 	TheTest.Printf(_L("Counter frequency=%d\r\n"), TheCounterFreq);
       
   222 	}
       
   223 
       
   224 TUint32 FastCounterValue(void)
       
   225 	{
       
   226 	return User::FastCounter();
       
   227 	}
       
   228 
       
   229 void StorePerfTestResult(TPerfTestType aType, TUint32 aStartTicks, TUint32 aEndTicks)
       
   230 	{
       
   231 	TInt64 diffTicks = (TInt64)aEndTicks - (TInt64)aStartTicks;
       
   232 	if(diffTicks < 0)
       
   233 		{
       
   234 		diffTicks = KMaxTUint32 + diffTicks + 1;
       
   235 		}
       
   236 	ThePerfTestResult[aType] = (TUint32)diffTicks;
       
   237 	}
       
   238 
       
   239 static void PrintPerfTestResults()
       
   240 	{
       
   241 	TInt r = FcDiff2Us(ThePerfTestResult[EPerfTestMultiInsert]);
       
   242 	TheTest.Printf(_L("###Mutli Insert:  %8dus\r\n"), r);
       
   243 
       
   244 	r = FcDiff2Us(ThePerfTestResult[EPerfTestMultiUpdate]);
       
   245 	TheTest.Printf(_L("###Mutli Update:  %8dus\r\n"), r);
       
   246 
       
   247 	r = FcDiff2Us(ThePerfTestResult[EPerfTestMultiSelect]);
       
   248 	TheTest.Printf(_L("###Mutli Select:  %8dus\r\n"), r);
       
   249 
       
   250 	r = FcDiff2Us(ThePerfTestResult[EPerfTestMultiDelete]);
       
   251 	TheTest.Printf(_L("###Mutli Delete:  %8dus\r\n"), r);
       
   252 
       
   253 
       
   254 	r = FcDiff2Us(ThePerfTestResult[EPerfTestSingleInsert]);
       
   255 	TheTest.Printf(_L("##Single Insert:  %8dus\r\n"), r);
       
   256 
       
   257 	r = FcDiff2Us(ThePerfTestResult[EPerfTestSingleUpdate]);
       
   258 	TheTest.Printf(_L("##Single Update:  %8dus\r\n"), r);
       
   259 
       
   260 	r = FcDiff2Us(ThePerfTestResult[EPerfTestSingleSelect]);
       
   261 	TheTest.Printf(_L("##Single Select:  %8dus\r\n"), r);
       
   262 
       
   263 	r = FcDiff2Us(ThePerfTestResult[EPerfTestSingleDelete]);
       
   264 	TheTest.Printf(_L("##Single Delete:  %8dus\r\n"), r);
       
   265 	}
       
   266 
       
   267 ///////////////////////////////////////////////////////////////////////////////////////
       
   268 
       
   269 static void CreateTestDir()
       
   270     {
       
   271 	TInt err = TheFs.MkDir(KTestDir);
       
   272 	TEST(err == KErrNone || err == KErrAlreadyExists);
       
   273 	}
       
   274 
       
   275 static void CreateTestDatabase()
       
   276 	{
       
   277 	(void)TheFs.Delete(KTestDbName);
       
   278 
       
   279 	const char* ver = sqlite3_libversion();
       
   280 	TBuf<20> buf;
       
   281 	buf.Copy(TPtrC8((const TUint8*)ver));
       
   282 	TheTest.Printf(_L("*** SQLite library version: \"%S\"\r\n"), &buf);
       
   283 
       
   284 	TInt err = sqlite3_open(KTestDbName8, &TheDb);
       
   285 	TEST2(err, SQLITE_OK);
       
   286 
       
   287 	err = sqlite3_exec(TheDb, "CREATE TABLE Tbl(I INTEGER PRIMARY KEY, I64 BIGINT, D DOUBLE, T TEXT, B BINARY)", 0, 0, 0);
       
   288 	TEST2(err, SQLITE_OK);
       
   289 
       
   290 	sqlite3_close(TheDb);
       
   291 	TheDb = 0;
       
   292 	}
       
   293 
       
   294 ///////////////////////////////////////////////////////////////////////////////////////
       
   295 
       
   296 /**
       
   297 @SYMTestCaseID			PDS-SQLITE3-UT-4030
       
   298 @SYMTestCaseDesc		SQLite library multi-insert performance test.
       
   299 						The test inserts 1000 records in a single transaction and stores 
       
   300 						the execution time for later use (comparison and printing).
       
   301 						The main purpose of this test is - regression performance testing.
       
   302 @SYMTestPriority		High
       
   303 @SYMTestActions			SQLite library multi-insert performance test.
       
   304 @SYMTestExpectedResults Test must not fail
       
   305 @SYMREQ					REQ10424
       
   306 */
       
   307 static void SqliteMultiInsertTest()
       
   308 	{
       
   309 	const char* tail = 0;
       
   310 	sqlite3_stmt* stmt = 0;
       
   311 
       
   312 	TEST(!TheDb);
       
   313 	TInt err = sqlite3_open(KTestDbName8, &TheDb);
       
   314 	TEST2(err, SQLITE_OK);
       
   315 
       
   316 	err = sqlite3_prepare(TheDb, KMultiInsertSql, -1, &stmt, &tail);
       
   317 	TEST2(err, SQLITE_OK);
       
   318 	
       
   319 	TUint32 fc = FastCounterValue();
       
   320 	err = sqlite3_exec(TheDb, "BEGIN", 0, 0, 0);
       
   321 	TEST2(err, SQLITE_OK);
       
   322 
       
   323 	for(TInt i=0;i<KInsertRecCnt;++i)
       
   324 		{
       
   325 		err = sqlite3_bind_int(stmt, 1, KInsertRecIds[i]);
       
   326 		TEST2(err, SQLITE_OK);
       
   327 
       
   328 		err = sqlite3_step(stmt);
       
   329 		TEST2(err, SQLITE_DONE);
       
   330 		
       
   331 		err = sqlite3_reset(stmt);		
       
   332 		TEST2(err, SQLITE_OK);
       
   333 		}
       
   334 		
       
   335 	err = sqlite3_exec(TheDb, "COMMIT", 0, 0, 0);
       
   336 	TEST2(err, SQLITE_OK);
       
   337 	
       
   338 	StorePerfTestResult(EPerfTestMultiInsert, fc, FastCounterValue());
       
   339 
       
   340 	sqlite3_finalize(stmt);	
       
   341 	sqlite3_close(TheDb);
       
   342 	TheDb = 0;
       
   343 	}
       
   344 
       
   345 static void FormatSqlStmt(const char aSql[], const TInt aRecIds[], const TInt aRecCnt)
       
   346 	{
       
   347 	strcpy(TheSqlBuf, aSql);
       
   348 	strcat(TheSqlBuf, "(");
       
   349 	for(TInt i=0;i<aRecCnt;++i)
       
   350 		{
       
   351 		char tmp[10];
       
   352 		sprintf(tmp, "%d,", aRecIds[i]);
       
   353 		strcat(TheSqlBuf, tmp);
       
   354 		}
       
   355 	TheSqlBuf[strlen(TheSqlBuf) - 1] = ')';
       
   356 	}
       
   357 
       
   358 /**
       
   359 @SYMTestCaseID			PDS-SQLITE3-UT-4031
       
   360 @SYMTestCaseDesc		SQLite library multi-update performance test.
       
   361 						The test updates 100 records and stores 
       
   362 						the execution time for later use (comparison and printing).
       
   363 						The main purpose of this test is - regression performance testing.
       
   364 @SYMTestPriority		High
       
   365 @SYMTestActions			SQLite library multi-update performance test.
       
   366 @SYMTestExpectedResults Test must not fail
       
   367 @SYMREQ					REQ10424
       
   368 */
       
   369 static void SqliteMultiUpdateTest()
       
   370 	{
       
   371 	TEST(!TheDb);
       
   372 	TInt err = sqlite3_open(KTestDbName8, &TheDb);
       
   373 	TEST2(err, SQLITE_OK);
       
   374 
       
   375 	FormatSqlStmt(KMultiUpdateSql, KUpdateRecIds, KUpdateRecCnt);
       
   376 
       
   377 	TUint32 fc = FastCounterValue();
       
   378 	
       
   379 	err = sqlite3_exec(TheDb, TheSqlBuf, 0, 0, 0);
       
   380 	TEST2(err, SQLITE_OK);
       
   381 	
       
   382 	StorePerfTestResult(EPerfTestMultiUpdate, fc, FastCounterValue());
       
   383 	
       
   384 	TInt cnt = sqlite3_changes(TheDb);
       
   385 	TEST2(cnt, KUpdateRecCnt);
       
   386 	
       
   387 	sqlite3_close(TheDb);
       
   388 	TheDb = 0;
       
   389 	}
       
   390 
       
   391 /**
       
   392 @SYMTestCaseID			PDS-SQLITE3-UT-4032
       
   393 @SYMTestCaseDesc		SQLite library multi-select performance test.
       
   394 						The test selects 100 records and stores 
       
   395 						the execution time for later use (comparison and printing).
       
   396 						The main purpose of this test is - regression performance testing.
       
   397 @SYMTestPriority		High
       
   398 @SYMTestActions			SQLite library multi-select performance test.
       
   399 @SYMTestExpectedResults Test must not fail
       
   400 @SYMREQ					REQ10424
       
   401 */
       
   402 static void SqliteMultiSelectTest()
       
   403 	{
       
   404 	const char* tail = 0;
       
   405 	sqlite3_stmt* stmt = 0;
       
   406 	
       
   407 	TEST(!TheDb);
       
   408 	TInt err = sqlite3_open(KTestDbName8, &TheDb);
       
   409 	TEST2(err, SQLITE_OK);
       
   410 
       
   411 	FormatSqlStmt(KMultiSelectSql, KSelectRecIds, KSelectRecCnt);
       
   412 
       
   413 	err = sqlite3_prepare(TheDb, TheSqlBuf, -1, &stmt, &tail);
       
   414 	TEST2(err, SQLITE_OK);
       
   415 	
       
   416 	TUint32 fc = FastCounterValue();
       
   417 	
       
   418 	TInt recCnt = 0;
       
   419 	while((err = sqlite3_step(stmt)) == SQLITE_ROW)
       
   420 		{
       
   421 		__int64 i64;
       
   422 		double d;
       
   423 		const unsigned short* t;
       
   424 		const unsigned char* b;
       
   425 		
       
   426 		i64 = sqlite3_column_int64(stmt, 0);
       
   427 		UNUSED_VAR(i64);
       
   428 		d = sqlite3_column_double(stmt, 1);
       
   429 		UNUSED_VAR(d);
       
   430 		t = (const unsigned short*)sqlite3_column_text16(stmt, 2);
       
   431 		UNUSED_VAR(t);
       
   432 		b = (const unsigned char*)sqlite3_column_blob(stmt, 3);
       
   433 		UNUSED_VAR(b);
       
   434 		++recCnt;
       
   435 		}
       
   436 	TEST2(err, SQLITE_DONE);
       
   437 	TEST2(recCnt, KSelectRecCnt);
       
   438 		
       
   439 	StorePerfTestResult(EPerfTestMultiSelect, fc, FastCounterValue());
       
   440 	
       
   441 	sqlite3_finalize(stmt);	
       
   442 	sqlite3_close(TheDb);
       
   443 	TheDb = 0;
       
   444 	}
       
   445 
       
   446 /**
       
   447 @SYMTestCaseID			PDS-SQLITE3-UT-4033
       
   448 @SYMTestCaseDesc		SQLite library multi-delete performance test.
       
   449 						The test deletes 100 records and stores 
       
   450 						the execution time for later use (comparison and printing).
       
   451 						The main purpose of this test is - regression performance testing.
       
   452 @SYMTestPriority		High
       
   453 @SYMTestActions			SQLite library multi-delete performance test.
       
   454 @SYMTestExpectedResults Test must not fail
       
   455 @SYMREQ					REQ10424
       
   456 */
       
   457 static void SqliteMultiDeleteTest()
       
   458 	{
       
   459 	TEST(!TheDb);
       
   460 	TInt err = sqlite3_open(KTestDbName8, &TheDb);
       
   461 	TEST2(err, SQLITE_OK);
       
   462 
       
   463 	FormatSqlStmt(KMultiDeleteSql, KDeleteRecIds, KDeleteRecCnt);
       
   464 
       
   465 	TUint32 fc = FastCounterValue();
       
   466 	
       
   467 	err = sqlite3_exec(TheDb, TheSqlBuf, 0, 0, 0);
       
   468 	TEST2(err, SQLITE_OK);
       
   469 	
       
   470 	StorePerfTestResult(EPerfTestMultiDelete, fc, FastCounterValue());
       
   471 
       
   472 	TInt cnt = sqlite3_changes(TheDb);
       
   473 	TEST2(cnt, KDeleteRecCnt);
       
   474 	
       
   475 	sqlite3_close(TheDb);
       
   476 	TheDb = 0;
       
   477 	}
       
   478 	
       
   479 /**
       
   480 @SYMTestCaseID			PDS-SQLITE3-UT-4034
       
   481 @SYMTestCaseDesc		SQLite library single-insert performance test.
       
   482 						The test inserts one record and stores 
       
   483 						the execution time for later use (comparison and printing).
       
   484 						The main purpose of this test is - regression performance testing.
       
   485 @SYMTestPriority		High
       
   486 @SYMTestActions			SQLite library single-insert performance test.
       
   487 @SYMTestExpectedResults Test must not fail
       
   488 @SYMREQ					REQ10424
       
   489 */
       
   490 static void SqliteSingleInsertTest()
       
   491 	{
       
   492 	TEST(!TheDb);
       
   493 	TInt err = sqlite3_open(KTestDbName8, &TheDb);
       
   494 	TEST2(err, SQLITE_OK);
       
   495 
       
   496 	sprintf(TheSqlBuf, KSingleInsertSql, KInsertRecId);
       
   497 	
       
   498 	TUint32 fc = FastCounterValue();
       
   499 	
       
   500 	err = sqlite3_exec(TheDb, TheSqlBuf, 0, 0, 0);
       
   501 	TEST2(err, SQLITE_OK);
       
   502 	
       
   503 	StorePerfTestResult(EPerfTestSingleInsert, fc, FastCounterValue());
       
   504 
       
   505 	TInt cnt = sqlite3_changes(TheDb);
       
   506 	TEST2(cnt, 1);
       
   507 	
       
   508 	sqlite3_close(TheDb);
       
   509 	TheDb = 0;
       
   510 	}	
       
   511 
       
   512 /**
       
   513 @SYMTestCaseID			PDS-SQLITE3-UT-4035
       
   514 @SYMTestCaseDesc		SQLite library single-update performance test.
       
   515 						The test updates one record and stores 
       
   516 						the execution time for later use (comparison and printing).
       
   517 						The main purpose of this test is - regression performance testing.
       
   518 @SYMTestPriority		High
       
   519 @SYMTestActions			SQLite library single-update performance test.
       
   520 @SYMTestExpectedResults Test must not fail
       
   521 @SYMREQ					REQ10424
       
   522 */
       
   523 static void SqliteSingleUpdateTest()
       
   524 	{	
       
   525 	TEST(!TheDb);
       
   526 	TInt err = sqlite3_open(KTestDbName8, &TheDb);
       
   527 	TEST2(err, SQLITE_OK);
       
   528 
       
   529 	char tmp[10];
       
   530 	sprintf(tmp, "%d", KUpdateRecId);
       
   531 	strcpy(TheSqlBuf, KSingleUpdateSql);
       
   532 	strcat(TheSqlBuf, tmp);
       
   533 	
       
   534 	TUint32 fc = FastCounterValue();
       
   535 	
       
   536 	err = sqlite3_exec(TheDb, TheSqlBuf, 0, 0, 0);
       
   537 	TEST2(err, SQLITE_OK);
       
   538 	
       
   539 	StorePerfTestResult(EPerfTestSingleUpdate, fc, FastCounterValue());
       
   540 	
       
   541 	TInt cnt = sqlite3_changes(TheDb);
       
   542 	TEST2(cnt, 1);
       
   543 	
       
   544 	sqlite3_close(TheDb);
       
   545 	TheDb = 0;
       
   546 	}
       
   547 
       
   548 /**
       
   549 @SYMTestCaseID			PDS-SQLITE3-UT-4036
       
   550 @SYMTestCaseDesc		SQLite library single-select performance test.
       
   551 						The test selects one record and stores 
       
   552 						the execution time for later use (comparison and printing).
       
   553 						The main purpose of this test is - regression performance testing.
       
   554 @SYMTestPriority		High
       
   555 @SYMTestActions			SQLite library single-select performance test.
       
   556 @SYMTestExpectedResults Test must not fail
       
   557 @SYMREQ					REQ10424
       
   558 */
       
   559 static void SqliteSingleSelectTest()
       
   560 	{
       
   561 	const char* tail = 0;
       
   562 	sqlite3_stmt* stmt = 0;
       
   563 	
       
   564 	TEST(!TheDb);
       
   565 	TInt err = sqlite3_open(KTestDbName8, &TheDb);
       
   566 	TEST2(err, SQLITE_OK);
       
   567 
       
   568 	char tmp[10];
       
   569 	sprintf(tmp, "%d", KSelectRecId);
       
   570 	strcpy(TheSqlBuf, KSingleSelectSql);
       
   571 	strcat(TheSqlBuf, tmp);
       
   572 	
       
   573 	err = sqlite3_prepare(TheDb, TheSqlBuf, -1, &stmt, &tail);
       
   574 	TEST2(err, SQLITE_OK);
       
   575 	
       
   576 	TUint32 fc = FastCounterValue();
       
   577 	
       
   578 	TInt recCnt = 0;
       
   579 	while((err = sqlite3_step(stmt)) == SQLITE_ROW)
       
   580 		{
       
   581 		__int64 i64;
       
   582 		double d;
       
   583 		const unsigned short* t;
       
   584 		const unsigned char* b;
       
   585 		
       
   586 		i64 = sqlite3_column_int64(stmt, 0);
       
   587 		UNUSED_VAR(i64);
       
   588 		d = sqlite3_column_double(stmt, 1);
       
   589 		UNUSED_VAR(d);
       
   590 		t = (const unsigned short*)sqlite3_column_text16(stmt, 2);
       
   591 		UNUSED_VAR(t);
       
   592 		b = (const unsigned char*)sqlite3_column_blob(stmt, 3);
       
   593 		UNUSED_VAR(b);
       
   594 		++recCnt;
       
   595 		}
       
   596 	TEST2(err, SQLITE_DONE);
       
   597 	TEST2(recCnt, 1);
       
   598 
       
   599 	StorePerfTestResult(EPerfTestSingleSelect, fc, FastCounterValue());
       
   600 
       
   601 	sqlite3_finalize(stmt);	
       
   602 	sqlite3_close(TheDb);
       
   603 	TheDb = 0;
       
   604 	}
       
   605 
       
   606 /**
       
   607 @SYMTestCaseID			PDS-SQLITE3-UT-4037
       
   608 @SYMTestCaseDesc		SQLite library single-delete performance test.
       
   609 						The test deletes one record and stores 
       
   610 						the execution time for later use (comparison and printing).
       
   611 						The main purpose of this test is - regression performance testing.
       
   612 @SYMTestPriority		High
       
   613 @SYMTestActions			SQLite library single-delete performance test.
       
   614 @SYMTestExpectedResults Test must not fail
       
   615 @SYMREQ					REQ10424
       
   616 */
       
   617 void SqliteSingleDeleteTest()
       
   618 	{
       
   619 	TEST(!TheDb);
       
   620 	TInt err = sqlite3_open(KTestDbName8, &TheDb);
       
   621 	TEST2(err, SQLITE_OK);
       
   622 
       
   623 	char tmp[10];
       
   624 	sprintf(tmp, "%d", KDeleteRecId);
       
   625 	strcpy(TheSqlBuf, KSingleDeleteSql);
       
   626 	strcat(TheSqlBuf, tmp);
       
   627 	
       
   628 	TUint32 fc = FastCounterValue();
       
   629 	
       
   630 	err = sqlite3_exec(TheDb, TheSqlBuf, 0, 0, 0);
       
   631 	TEST2(err, SQLITE_OK);
       
   632 	
       
   633 	StorePerfTestResult(EPerfTestSingleDelete, fc, FastCounterValue());
       
   634 	
       
   635 	TInt cnt = sqlite3_changes(TheDb);
       
   636 	TEST2(cnt, 1);
       
   637 	
       
   638 	sqlite3_close(TheDb);
       
   639 	TheDb = 0;
       
   640 	}
       
   641 
       
   642 ///////////////////////////////////////////////////////////////////////////////////////
       
   643 
       
   644 static void DoTests()
       
   645 	{
       
   646 	TheTest.Start(_L("Get fast counter frequency"));
       
   647 	GetFastCounterFrequency();
       
   648 
       
   649 	TheTest.Next( _L("SQLite: Create the test database"));
       
   650 	CreateTestDatabase();
       
   651 
       
   652 	TBuf<100> msgbuf;
       
   653 
       
   654 	msgbuf.Format(_L("@SYMTestCaseID:PDS-SQLITE3-UT-4030: Insert %d records in a single transaction"), KInsertRecCnt);
       
   655 	TheTest.Next(msgbuf);
       
   656 	SqliteMultiInsertTest();
       
   657 
       
   658 	msgbuf.Format(_L("@SYMTestCaseID:PDS-SQLITE3-UT-4031: Update %d records in a single transaction"), KUpdateRecCnt);
       
   659 	TheTest.Next(msgbuf);
       
   660 	SqliteMultiUpdateTest();
       
   661 
       
   662 	msgbuf.Format(_L("@SYMTestCaseID:PDS-SQLITE3-UT-4032: Select %d records"), KSelectRecCnt);
       
   663 	TheTest.Next(msgbuf);
       
   664 	SqliteMultiSelectTest();
       
   665 
       
   666 	msgbuf.Format(_L("@SYMTestCaseID:PDS-SQLITE3-UT-4033: Delete %d records in a single transaction"), KDeleteRecCnt);
       
   667 	TheTest.Next(msgbuf);
       
   668 	SqliteMultiDeleteTest();
       
   669 
       
   670 	msgbuf.Format(_L("@SYMTestCaseID:PDS-SQLITE3-UT-4034: Insert a single record"));
       
   671 	TheTest.Next(msgbuf);
       
   672 	SqliteSingleInsertTest();
       
   673 
       
   674 	msgbuf.Format(_L("@SYMTestCaseID:PDS-SQLITE3-UT-4035: Update a single record"));
       
   675 	TheTest.Next(msgbuf);
       
   676 	SqliteSingleUpdateTest();
       
   677 
       
   678 	msgbuf.Format(_L("@SYMTestCaseID:PDS-SQLITE3-UT-4036: Select a single record"));
       
   679 	TheTest.Next(msgbuf);
       
   680 	SqliteSingleSelectTest();
       
   681 
       
   682 	msgbuf.Format(_L("@SYMTestCaseID:PDS-SQLITE3-UT-4037: Delete a single record"));
       
   683 	TheTest.Next(msgbuf);
       
   684 	SqliteSingleDeleteTest();
       
   685 
       
   686 	(void)TheFs.Delete(KTestDbName);
       
   687 
       
   688 	PrintPerfTestResults();
       
   689 	}
       
   690 
       
   691 TInt E32Main()
       
   692 	{
       
   693 	TheTest.Title();
       
   694 
       
   695 	CTrapCleanup* tc = CTrapCleanup::New();
       
   696 
       
   697 	__UHEAP_MARK;
       
   698 
       
   699 	TInt err = TheFs.Connect();
       
   700 	TheTest(err == KErrNone);
       
   701 
       
   702 	CreateTestDir();
       
   703 	DeleteTestFiles();
       
   704 	DoTests();
       
   705 	DeleteTestFiles();
       
   706 
       
   707 	__UHEAP_MARKEND;
       
   708 
       
   709 	TheFs.Close();
       
   710 	TheTest.End();
       
   711 	TheTest.Close();
       
   712 
       
   713 	delete tc;
       
   714 
       
   715 	User::Heap().Check();
       
   716 	return KErrNone;
       
   717 	}