diff -r 780c925249c1 -r 51035f0751c2 mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp --- a/mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp Wed Mar 31 22:26:09 2010 +0300 +++ b/mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp Wed Apr 14 16:28:17 2010 +0300 @@ -168,6 +168,7 @@ TRAP( check, GetDatabaseL(static_cast(driveNum)) ); if( check == KErrNotFound ) { + MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: re-creating database"); CMPXHarvesterDB* dB = CMPXHarvesterDB::NewL( static_cast(driveNum), iFs ); CleanupStack::PushL( dB ); @@ -179,6 +180,7 @@ } else { + MPX_DEBUG2("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: opening failed, error=%d, removing database", openError); CleanupStack::PopAndDestroy( dB ); } } @@ -187,6 +189,7 @@ TRAPD(openError, GetDatabaseL(static_cast(driveNum)).OpenL() ); if(openError != KErrNone) { + MPX_DEBUG2("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: opening failed, error=%d, removing database", openError); TRAP_IGNORE( RemoveDatabaseL(static_cast(driveNum))); } } @@ -293,6 +296,19 @@ if ( db->GetDbDrive() == aDrive) { db->Close(); +#ifdef __RAMDISK_PERF_ENABLE + if( iRAMDiskPerfEnabled && db->IsUseRamDrive() ) + { + MPX_DEBUG1("CMPXHarvesterDatabaseManager::CloseDatabase DB is on RAM"); + db->SetRamDriveInfo( iRAMDrive, EFalse ); + TRAPD( err, DoCopyDBFromRamL(aDrive) ); + if ( err ) + { + MPX_DEBUG2("CMPXHarvesterDatabaseManager::CloseDatabase DB copy error=%d", err); + RemoveDummyFile(i); + } + } +#endif break; } } @@ -589,6 +605,8 @@ if( iRAMDiskPerfEnabled ) { + // Should not leave until all the databases have been copied from RAM drive. + TInt leaveError = KErrNone; TInt count(iDatabases.Count()); for (TInt i = 0; i < count; ++i) { @@ -605,8 +623,19 @@ iDatabases[i]->SetRamDriveInfo( iRAMDrive, EFalse ); // Get the db state in order to restore it later. TDbState dbState = iDatabases[i]->GetDbState(); - iDatabases[i]->SetDbStateL(EDbClose); - TRAP( err, DoCopyDBFromRamL(drive) ); + TRAP( err, iDatabases[i]->SetDbStateL(EDbClose) ); + if ( err == KErrNone ) + { + TRAP( err, DoCopyDBFromRamL(drive) ); + } + else + { + // Error closing db on RAM drive, try to delete it. + TFileName ramDB; + ramDB = GenerateHarvesterDbName( drive, ETrue ); + BaflUtils::DeleteFile(iFs, ramDB); + } + if ( err ) { MPX_DEBUG2("CMPXHarvesterDatabaseManager::CopyDBsFromRamL copy error=%d", err); @@ -615,8 +644,13 @@ } // Restore the db state. - iDatabases[i]->SetDbStateL( dbState ); + TRAPD( error, iDatabases[i]->SetDbStateL( dbState ) ); + if ( error && !leaveError ) + { + leaveError = error; + } } + User::LeaveIfError( leaveError ); } } @@ -635,14 +669,13 @@ src = GenerateHarvesterDbName( aDriveUnit, ETrue ); MPX_DEBUG3("CMPXHarvesterDatabaseManager::DoCopyDBFromRamL from %S to %S", &src, &dst ); - // Rename the temp file into real Db name TFileName dummyDbFileName = GenerateDummyDbName( aDriveUnit ); //Copy Db from RAM to replace dummy file err = BaflUtils::CopyFile(iFs, src, dummyDbFileName); MPX_DEBUG2("CMPXHarvesterDatabaseManager::DoCopyDBFromRamL database copied from ram drive err=%d.", err); - // delete db in ram drive. + // delete db on ram drive. TInt delErr = BaflUtils::DeleteFile(iFs, src); MPX_DEBUG3("CMPXHarvesterDatabaseManager::DoCopyDBFromRamL db on ram drive deleted file=%S, err=%d", &src, delErr);