diff -r 000000000000 -r bde4ae8d615e os/persistentdata/persistentstorage/dbms/tdbms/t_dbpanic.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/persistentdata/persistentstorage/dbms/tdbms/t_dbpanic.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,204 @@ +// Copyright (c) 2003-2009 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: +// + +#include +#include +#include +#include +#include + +LOCAL_D RTest test(_L("t_dbpanic - Panic test when cancelling two blobs transactions")); +LOCAL_D CTrapCleanup* TheTrapCleanup; +LOCAL_D RDbTable TheTables[2]; +LOCAL_D RFs TheFs; +LOCAL_D RDbs TheDbs; +LOCAL_D RDbNamedDatabase TheDatabase; + +const TPtrC KTestDatabase=_L("\\DBMS-TST\\T_PANIC.DB"); + +/** +@SYMTestCaseID SYSLIB-DBMS-CT-0641 +@SYMTestCaseDesc Tests for creating the database and tables +@SYMTestPriority Medium +@SYMTestActions Tests for creating the tables.Leave on error. +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +LOCAL_C void PreTestL() + { + test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0641 ")); + // Create the database: + User::LeaveIfError(TheDatabase.Replace(TheFs,KTestDatabase)); + CleanupClosePushL(TheDatabase); + + // Create tables in the database: + User::LeaveIfError(TheDatabase.Execute(_L("create table ta (a integer, b Long Varbinary)"))); + User::LeaveIfError(TheDatabase.Execute(_L("create table tb (a integer, b Long Varbinary)"))); + + // Open the tables: + User::LeaveIfError(TheTables[0].Open(TheDatabase, _L("ta"))); + CleanupClosePushL(TheTables[0]); + User::LeaveIfError(TheTables[1].Open(TheDatabase, _L("tb"))); + CleanupClosePushL(TheTables[1]); + } + +/** +@SYMTestCaseID SYSLIB-DBMS-CT-0642 +@SYMTestCaseDesc Tests for transaction of large data +@SYMTestPriority Medium +@SYMTestActions Tests for streaming of blob data +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +LOCAL_C void TestL() + { + test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0642 ")); + // Start a transaction: + TheDatabase.Begin(); + + // Create a new row on each table: + TheTables[0].InsertL(); + TheTables[1].InsertL(); + + for(TInt i = 0; i < 2; ++i) + { + // Setting to null sets the dirty flag: + TheTables[i].SetColNullL(1); + + // Create a blob of data: + _LIT8(blobdata, "abcdefghijklmnopqrstuvwxyz"); + CBufFlat * blobbuff = CBufFlat::NewL(32); + CleanupStack::PushL(blobbuff); + blobbuff->InsertL(0, blobdata()); + + // Open a read stream on the blob: + RBufReadStream blobstream; + blobstream.Open(*blobbuff, 0); + CleanupClosePushL(blobstream); + + // Open a write stream on the table: + RDbColWriteStream blobwrite; + blobwrite.OpenLC(TheTables[i], 2); + + // Stream data from the read stream to the write stream: + blobwrite.WriteL(blobstream); + blobwrite.CommitL(); + + // Close the write stream: + CleanupStack::PopAndDestroy(); + // Close the read stream: + CleanupStack::PopAndDestroy(); + // Delete the blob of data: + CleanupStack::PopAndDestroy(blobbuff); + } + + TheTables[0].Cancel(); + TheTables[1].Cancel(); //This call to cancel panics. + + + // End the transaction: + TheDatabase.Commit(); + } + +/** +@SYMTestCaseID SYSLIB-DBMS-CT-0643 +@SYMTestCaseDesc Tests for closing of tables +@SYMTestPriority Medium +@SYMTestActions Tests for closing of tables and database +@SYMTestExpectedResults Test must not fail +@SYMREQ REQ0000 +*/ +LOCAL_C void PostTestL() + { + test.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0643 ")); + // Close the tables: + TheTables[0].Close(); + CleanupStack::Pop(); // Table close + TheTables[1].Close(); + CleanupStack::Pop(); // Table close + + // Close the database: + CleanupStack::PopAndDestroy(); + } + +void doTestL() + { + test.Start(_L("bang")); + + // Open a connection to the DBMS server: + User::LeaveIfError(TheDbs.Connect()); + CleanupClosePushL(TheDbs); + + PreTestL(); + TestL(); + PostTestL(); + + CleanupStack::PopAndDestroy(); // TheDbs close + } + +LOCAL_C void DeleteDataFile(const TDesC& aFullName) + { + RFs fsSession; + TInt err = fsSession.Connect(); + if(err == KErrNone) + { + TEntry entry; + if(fsSession.Entry(aFullName, entry) == KErrNone) + { + RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName); + err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly); + if(err != KErrNone) + { + RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName); + } + err = fsSession.Delete(aFullName); + if(err != KErrNone) + { + RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName); + } + } + fsSession.Close(); + } + else + { + RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName); + } + } + +// +// Test streaming conversions. +// +GLDEF_C TInt E32Main() + { + test.Title(); + TheTrapCleanup=CTrapCleanup::New(); + + TInt r=TheFs.Connect(); + test(r==KErrNone); + r=TheFs.MkDir(KTestDatabase); + test(r==KErrNone || r==KErrAlreadyExists); + + TRAP(r, doTestL()); + test(r == KErrNone); + + ::DeleteDataFile(KTestDatabase); + + test.End(); + + TheFs.Close(); + delete TheTrapCleanup; + test.Close(); + return r; + }