61 |
61 |
62 _LIT(KLargeFileName, "e:\\test\\DeleteMe"); |
62 _LIT(KLargeFileName, "e:\\test\\DeleteMe"); |
63 |
63 |
64 #endif |
64 #endif |
65 |
65 |
66 const TInt KTestRecordsCount = 350; |
66 _LIT8(KDatabasePageSizeConfig, "page_size=1024"); |
|
67 |
|
68 const TInt KMaxTestRecordsCount = 350; |
|
69 TInt TestRecordsCount = 0; |
67 |
70 |
68 /////////////////////////////////////////////////////////////////////////////////////// |
71 /////////////////////////////////////////////////////////////////////////////////////// |
69 |
72 |
70 //Assemblesd a file name from "aFileName" and "aFileNumber" parameters and places the resulting string in "aResultPath". |
73 //Assemblesd a file name from "aFileName" and "aFileNumber" parameters and places the resulting string in "aResultPath". |
71 void AssembleLargeFileName(const TDesC& aFileName, TInt aFileNumber, TDes& aResultPath) |
74 void AssembleLargeFileName(const TDesC& aFileName, TInt aFileNumber, TDes& aResultPath) |
200 } |
203 } |
201 diskSpace = ::FreeDiskSpace(); |
204 diskSpace = ::FreeDiskSpace(); |
202 RDebug::Print(_L("CreateLargeFile: free space after = %ld\r\n"), diskSpace); |
205 RDebug::Print(_L("CreateLargeFile: free space after = %ld\r\n"), diskSpace); |
203 } |
206 } |
204 |
207 |
|
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 |
205 //Creates and fills with some records a test database |
218 //Creates and fills with some records a test database |
206 void CreateAndFillTestDatabase(RSqlDatabase& aDb) |
219 void CreateAndFillTestDatabase(RSqlDatabase& aDb) |
207 { |
220 { |
208 TInt err = aDb.Create(KTestDatabase); |
221 TInt err = aDb.Create(KTestDatabase, &KDatabasePageSizeConfig); |
209 TEST2(err, KErrNone); |
222 TEST2(err, KErrNone); |
210 err = aDb.Exec(_L("CREATE TABLE A(Id INTEGER, Data TEXT)")); |
223 err = aDb.Exec(_L("CREATE TABLE A(Id INTEGER, Data TEXT)")); |
211 TEST(err >= 0); |
224 TEST(err >= 0); |
212 err = aDb.Exec(_L("BEGIN TRANSACTION")); |
225 |
213 TEST(err >= 0); |
226 // |
214 for(TInt i=0;i<KTestRecordsCount;++i) |
227 // Find the page size of the database on this media |
215 { |
228 // |
216 TBuf<200> sql; |
229 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 { |
217 sql.Format(_L("INSERT INTO A(Id, Data) VALUES(%d, 'A0123456789B0123456789C0123456789D0123456789E0123456789F0123456789G0123456789H0123456789')"), i + 1); |
261 sql.Format(_L("INSERT INTO A(Id, Data) VALUES(%d, 'A0123456789B0123456789C0123456789D0123456789E0123456789F0123456789G0123456789H0123456789')"), i + 1); |
218 err = aDb.Exec(sql); |
262 err = aDb.Exec(sql); |
219 TEST2(err, 1); |
263 TEST2(err, 1); |
220 } |
264 |
221 err = aDb.Exec(_L("COMMIT TRANSACTION")); |
265 TInt size = aDb.Size(); |
222 TEST(err >= 0); |
266 TInt numberOfPages = size/pageSize; |
|
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 |
223 } |
280 } |
224 |
281 |
225 //Tries to delete test database records |
282 //Tries to delete test database records |
226 TInt DeleteTestRecords(RSqlDatabase& aDb) |
283 TInt DeleteTestRecords(RSqlDatabase& aDb) |
227 { |
284 { |
228 TInt err = aDb.Exec(_L("BEGIN TRANSACTION")); |
285 TInt err = aDb.Exec(_L("BEGIN TRANSACTION")); |
229 TEST(err >= 0); |
286 TEST(err >= 0); |
230 for(TInt i=0;i<KTestRecordsCount;++i) |
287 for(TInt i=0;i<TestRecordsCount;++i) |
231 { |
288 { |
232 TBuf<100> sql; |
289 TBuf<100> sql; |
233 sql.Format(_L("DELETE FROM A WHERE Id = %d"), i + 1); |
290 sql.Format(_L("DELETE FROM A WHERE Id = %d"), i + 1); |
234 err = aDb.Exec(sql);// May fail with KErrDiskFull |
291 err = aDb.Exec(sql);// May fail with KErrDiskFull |
235 if(err < 0) |
292 if(err < 0) |
248 //RSqlDatabase::ReleaseReserveAccess() methods and checks the return values. |
305 //RSqlDatabase::ReleaseReserveAccess() methods and checks the return values. |
249 //It might be usefull for debugging in case if something gets wrong. |
306 //It might be usefull for debugging in case if something gets wrong. |
250 void SimpleCallsTest() |
307 void SimpleCallsTest() |
251 { |
308 { |
252 RSqlDatabase db, db2; |
309 RSqlDatabase db, db2; |
253 TInt err = db.Create(KTestDatabase); |
310 TInt err = db.Create(KTestDatabase, &KDatabasePageSizeConfig); |
254 TEST2(err, KErrNone); |
311 TEST2(err, KErrNone); |
255 |
312 |
256 err = db2.Open(KTestDatabase); |
313 err = db2.Open(KTestDatabase); |
257 TEST2(err, KErrNone); |
314 TEST2(err, KErrNone); |
258 |
315 |