persistentstorage/sql/TEST/t_sqlood.cpp
branchRCL_3
changeset 24 cc28652e0254
parent 23 26645d81f48d
equal deleted inserted replaced
23:26645d81f48d 24:cc28652e0254
    61 
    61 
    62 	_LIT(KLargeFileName, "e:\\test\\DeleteMe");
    62 	_LIT(KLargeFileName, "e:\\test\\DeleteMe");
    63 
    63 
    64 #endif
    64 #endif
    65 
    65 
    66 _LIT8(KDatabasePageSizeConfig, "page_size=1024");
    66 const TInt KTestRecordsCount = 350;
    67 
       
    68 const TInt KMaxTestRecordsCount = 350;
       
    69 TInt TestRecordsCount = 0;
       
    70 
    67 
    71 ///////////////////////////////////////////////////////////////////////////////////////
    68 ///////////////////////////////////////////////////////////////////////////////////////
    72 
    69 
    73 //Assemblesd a file name from "aFileName" and "aFileNumber" parameters and places the resulting string in "aResultPath".
    70 //Assemblesd a file name from "aFileName" and "aFileNumber" parameters and places the resulting string in "aResultPath".
    74 void AssembleLargeFileName(const TDesC& aFileName, TInt aFileNumber, TDes& aResultPath)
    71 void AssembleLargeFileName(const TDesC& aFileName, TInt aFileNumber, TDes& aResultPath)
   203 		}
   200 		}
   204 	diskSpace = ::FreeDiskSpace();
   201 	diskSpace = ::FreeDiskSpace();
   205 	RDebug::Print(_L("CreateLargeFile: free space after = %ld\r\n"), diskSpace);
   202 	RDebug::Print(_L("CreateLargeFile: free space after = %ld\r\n"), diskSpace);
   206 	}
   203 	}
   207 
   204 
   208 
       
   209 // Number of bytes in the default journal header size.
       
   210 const TInt KJournalHeaderSize = 0x200;
       
   211 
       
   212 // Number of bytes added to each database page in the journal.
       
   213 const TInt KJournalPageOverhead = 8; 
       
   214 
       
   215 // The default amount of reserved space provided by the ReserveDriveSpace API
       
   216 const TInt KReserveDriveSpaceAmount = 64*1024;
       
   217 
       
   218 //Creates and fills with some records a test database
   205 //Creates and fills with some records a test database
   219 void CreateAndFillTestDatabase(RSqlDatabase& aDb)
   206 void CreateAndFillTestDatabase(RSqlDatabase& aDb)
   220 	{
   207 	{
   221 	TInt err = aDb.Create(KTestDatabase, &KDatabasePageSizeConfig);
   208 	TInt err = aDb.Create(KTestDatabase);
   222 	TEST2(err, KErrNone);
   209 	TEST2(err, KErrNone);
   223 	err = aDb.Exec(_L("CREATE TABLE A(Id INTEGER, Data TEXT)"));
   210 	err = aDb.Exec(_L("CREATE TABLE A(Id INTEGER, Data TEXT)"));
   224 	TEST(err >= 0);
   211 	TEST(err >= 0);
   225 
   212 	err = aDb.Exec(_L("BEGIN TRANSACTION"));
   226 	//
   213 	TEST(err >= 0);
   227 	// Find the page size of the database on this media
   214 	for(TInt i=0;i<KTestRecordsCount;++i)
   228 	//
   215 		{
   229 	TBuf<200> sql;
   216 		TBuf<200> sql;
   230 	sql.Copy(_L("PRAGMA page_size"));
       
   231 	TSqlScalarFullSelectQuery q(aDb);
       
   232 	TInt pageSize = 0;
       
   233 	TRAP(err, pageSize = q.SelectIntL(sql););
       
   234 	//RDebug::Print(_L("Error %d Page Size %d"),err,pageSize);
       
   235 	TEST2(err, KErrNone);
       
   236 	TEST(pageSize > 0);
       
   237 	//RDebug::Print(_L("Page Size %d"),pageSize);
       
   238 	
       
   239 	//
       
   240 	// Find the sector size of this media
       
   241 	//
       
   242 	TDriveInfo driveInfo;
       
   243 	err = TheFs.Drive(driveInfo, KTestDrive);
       
   244 	TEST2(err, KErrNone);
       
   245 	TVolumeIOParamInfo volumeInfo;
       
   246 	err = TheFs.VolumeIOParam(KTestDrive, volumeInfo);
       
   247 	TEST2(err, KErrNone);
       
   248 	TInt sectorSize = volumeInfo.iBlockSize;
       
   249 	//RDebug::Print(_L("Sector Size %d"),sectorSize);	
       
   250 
       
   251 	TInt journalHeaderSize = Max(sectorSize, KJournalHeaderSize);
       
   252 	//RDebug::Print(_L("Journal Header Size %d"),journalHeaderSize);
       
   253 
       
   254 	//
       
   255 	// Keep adding to database until it is a size such that all the data can still be deleted within the reserved disk space size. 
       
   256 	// Do this piece-wise not in a transaction.
       
   257 	//
       
   258 	TInt i;
       
   259 	for(i=0;i<KMaxTestRecordsCount;++i)
       
   260 		{
       
   261 		sql.Format(_L("INSERT INTO A(Id, Data) VALUES(%d, 'A0123456789B0123456789C0123456789D0123456789E0123456789F0123456789G0123456789H0123456789')"), i + 1);
   217 		sql.Format(_L("INSERT INTO A(Id, Data) VALUES(%d, 'A0123456789B0123456789C0123456789D0123456789E0123456789F0123456789G0123456789H0123456789')"), i + 1);
   262 		err = aDb.Exec(sql);
   218 		err = aDb.Exec(sql);
   263 		TEST2(err, 1);
   219 		TEST2(err, 1);
   264 
   220 		}
   265 		TInt size = aDb.Size();
   221 	err = aDb.Exec(_L("COMMIT TRANSACTION"));
   266 		TInt numberOfPages = size/pageSize;
   222 	TEST(err >= 0);
   267 		TInt predictedJournalSize = journalHeaderSize + numberOfPages * (pageSize + KJournalPageOverhead);
       
   268 		//RDebug::Print(_L("Size %d, Pages %d, predictedJournalSize %d"),size, numberOfPages, predictedJournalSize);
       
   269 		
       
   270 		// Will another page take us over the limit ?
       
   271 		if ((predictedJournalSize + (pageSize + KJournalPageOverhead)) >= (KReserveDriveSpaceAmount))
       
   272 			{
       
   273 			break;
       
   274 			}
       
   275 		}
       
   276 	TestRecordsCount = i + 1;
       
   277 	
       
   278 	//RDebug::Print(_L("TestRecordsCount %d"),TestRecordsCount);
       
   279 	
       
   280 	}
   223 	}
   281 
   224 
   282 //Tries to delete test database records
   225 //Tries to delete test database records
   283 TInt DeleteTestRecords(RSqlDatabase& aDb)
   226 TInt DeleteTestRecords(RSqlDatabase& aDb)
   284 	{
   227 	{
   285 	TInt err = aDb.Exec(_L("BEGIN TRANSACTION"));
   228 	TInt err = aDb.Exec(_L("BEGIN TRANSACTION"));
   286 	TEST(err >= 0);
   229 	TEST(err >= 0);
   287 	for(TInt i=0;i<TestRecordsCount;++i)
   230 	for(TInt i=0;i<KTestRecordsCount;++i)
   288 		{
   231 		{
   289 		TBuf<100> sql;
   232 		TBuf<100> sql;
   290 		sql.Format(_L("DELETE FROM A WHERE Id = %d"), i + 1);
   233 		sql.Format(_L("DELETE FROM A WHERE Id = %d"), i + 1);
   291 		err = aDb.Exec(sql);// May fail with KErrDiskFull
   234 		err = aDb.Exec(sql);// May fail with KErrDiskFull
   292 		if(err < 0)
   235 		if(err < 0)
   305 //RSqlDatabase::ReleaseReserveAccess() methods and checks the return values.
   248 //RSqlDatabase::ReleaseReserveAccess() methods and checks the return values.
   306 //It might be usefull for debugging in case if something gets wrong.
   249 //It might be usefull for debugging in case if something gets wrong.
   307 void SimpleCallsTest()
   250 void SimpleCallsTest()
   308 	{
   251 	{
   309 	RSqlDatabase db, db2;
   252 	RSqlDatabase db, db2;
   310 	TInt err = db.Create(KTestDatabase, &KDatabasePageSizeConfig);
   253 	TInt err = db.Create(KTestDatabase);
   311 	TEST2(err, KErrNone);
   254 	TEST2(err, KErrNone);
   312 
   255 
   313 	err = db2.Open(KTestDatabase);
   256 	err = db2.Open(KTestDatabase);
   314 	TEST2(err, KErrNone);
   257 	TEST2(err, KErrNone);
   315 	
   258