diff -r 000000000000 -r a2952bb97e68 mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,419 @@ +/* +* Copyright (c) 2006 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: Harvester database manager +* +*/ + + +#include +#ifdef RD_MULTIPLE_DRIVE +#include +#include +#endif //RD_MULTIPLE_DRIVE +#include +#include "mpxharvesterdbmanager.h" +#include "mpxharvesterdb.h" +#include "mpxharvesterdbtable.h" + +// --------------------------------------------------------------------------- +// C++ Constructor +// --------------------------------------------------------------------------- +// +CMPXHarvesterDatabaseManager::CMPXHarvesterDatabaseManager( RFs& aFs ) + : iFs( aFs ) + { + + } + + +// --------------------------------------------------------------------------- +// 2nd Phase Constructor +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseManager::ConstructL() + { + User::LeaveIfError( iDBSession.Connect() ); + } + + +// --------------------------------------------------------------------------- +// Two-Phased Constructor +// --------------------------------------------------------------------------- +// +CMPXHarvesterDatabaseManager* CMPXHarvesterDatabaseManager::NewL( RFs& aFs ) + { + CMPXHarvesterDatabaseManager* self = + new( ELeave ) CMPXHarvesterDatabaseManager( aFs ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CMPXHarvesterDatabaseManager::~CMPXHarvesterDatabaseManager() + { + iDatabases.ResetAndDestroy(); + iDatabases.Close(); + iDBSession.Close(); + } + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::OpenAllDatabasesL +// --------------------------------------------------------------------------- +// +TInt CMPXHarvesterDatabaseManager::OpenAllDatabasesL() + { + MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenAllDatabasesL <---"); + + TInt rtn (KErrNone); + + // Open drives we are interested in. + // +#ifdef RD_MULTIPLE_DRIVE + TDriveList driveList; + TInt driveCount(0); + User::LeaveIfError( DriveInfo::GetUserVisibleDrives( + iFs, driveList, driveCount ) ); + + TInt check(KErrNone); + for( TInt driveNum = EDriveA; driveNum <= EDriveZ; driveNum++ ) + { + if (driveList[driveNum] && !IsRemoteDrive(static_cast(driveNum))) + { + TFileName drivePath; + User::LeaveIfError( + PathInfo::GetRootPath( drivePath, driveNum ) ); + MPX_DEBUG2("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: opening database in %S drive", + &drivePath); + TRAP( check, GetDatabaseL(static_cast(driveNum)) ); + if( check == KErrNotFound ) + { + CMPXHarvesterDB* dB = CMPXHarvesterDB::NewL( + static_cast(driveNum), iFs ); + CleanupStack::PushL( dB ); + TRAPD(openError, rtn |= dB->OpenL() ); //lint !e665 + if(openError == KErrNone) + { + iDatabases.AppendL( dB ); + CleanupStack::Pop( dB ); + } + else + { + CleanupStack::PopAndDestroy( dB ); + } + } + else if( check == KErrNone ) + { + TRAPD(openError, GetDatabaseL(static_cast(driveNum)).OpenL() ); + if(openError != KErrNone) + { + TRAP_IGNORE( RemoveDatabaseL(static_cast(driveNum))); + } + } + } + } +#else + TInt check(KErrNone); + TRAP( check, GetDatabaseL(EDriveC) ); + if( check == KErrNotFound ) + { + CMPXHarvesterDB* dB = CMPXHarvesterDB::NewL( EDriveC, iFs ); + CleanupStack::PushL( dB ); + iDatabases.AppendL( dB ); + CleanupStack::Pop( dB ); + TRAP_IGNORE( rtn = dB->OpenL() ); //lint !e665 + } + else if( check == KErrNone ) + { + TRAPD(openError, GetDatabaseL(EDriveC).OpenL() ); + if(openError != KErrNone) + { + TRAP_IGNORE( RemoveDatabaseL(EDriveC)); + } + } + TRAP( check, GetDatabaseL(EDriveE) ); //lint !e961 + if( check == KErrNotFound ) + { + CMPXHarvesterDB* dB = CMPXHarvesterDB::NewL( EDriveE, iFs ); + CleanupStack::PushL( dB ); + TRAPD(openError, rtn |= dB->OpenL() ); //lint !e665 + if(openError == KErrNone) + { + iDatabases.AppendL( dB ); + CleanupStack::Pop( dB ); + } + else + { + CleanupStack::PopAndDestroy( dB ); + } + } + else if( check == KErrNone ) + { + TRAPD(openError,GetDatabaseL(EDriveE).OpenL() ); + if(openError != KErrNone) + { + TRAP_IGNORE( RemoveDatabaseL(EDriveE)); + } + } +#endif // RD_MULTIPLE_DRIVE + + MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenAllDatabasesL --->"); //lint !e961 + return rtn; + } + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::OpenDatabaseL +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseManager::OpenDatabaseL( TDriveNumber aDrive ) + { + MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenDatabaseL <---"); + + // Re-open a specific database + // + if (!IsRemoteDrive(aDrive)) + { + TInt count( iDatabases.Count() ); + for( TInt i=0; iGetDbDrive() == aDrive ) + { + db->OpenL(); + break; + } + } + } + MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenDatabaseL --->"); + } + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::CloseAllDatabase +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseManager::CloseAllDatabase() + { + // Close all databases for shutdown + iDatabases.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::CloseDatabase +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseManager::CloseDatabase( TDriveNumber aDrive ) + { + if (!IsRemoteDrive(aDrive)) + { + MPX_DEBUG2("CMPXHarvesterDatabaseManager::CloseDatabase drive %d <---", aDrive ); + TInt count = iDatabases.Count(); + for ( TInt i=0; iGetDbDrive() == aDrive) + { + db->Close(); + break; + } + } + } + MPX_DEBUG1("CMPXHarvesterDatabaseManager::CloseDatabase --->"); + } + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::GetDatabase +// --------------------------------------------------------------------------- +// +CMPXHarvesterDB& CMPXHarvesterDatabaseManager::GetDatabaseL( TDriveNumber aDrive ) + { + CMPXHarvesterDB* db( NULL ); + + // Find the database + TInt count = iDatabases.Count(); + for( TInt i=0; iGetDbDrive() == aDrive ) + { + db = tmp; + break; + } + } + + // Not found, so we leave + if( db == NULL ) + { + User::Leave( KErrNotFound ); + } + return *db; + } + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::RemoveDatabase +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseManager::RemoveDatabaseL( TDriveNumber aDrive ) + { + + TBool bFound(EFalse); + // Find the database + TInt count = iDatabases.Count(); + for(TInt index=0; indexGetDbDrive() == aDrive )) + { + bFound = ETrue; + delete iDatabases[index]; + iDatabases.Remove(index); + break; + } + } + + // Not found, so we leave + if( !bFound ) + { + User::Leave( KErrNotFound ); + } + } + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::Count +// --------------------------------------------------------------------------- +// +TInt CMPXHarvesterDatabaseManager::Count() + { + return iDatabases.Count(); + } + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::GetDatabaseL +// --------------------------------------------------------------------------- +// +CMPXHarvesterDB& CMPXHarvesterDatabaseManager::GetDatabaseL( TInt aDb ) + { + if( aDb > iDatabases.Count() ) + { + User::Leave(KErrNotFound/*KErrArgument*/); + } + return *iDatabases[aDb]; + } + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::RecreateDatabase +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseManager::RecreateDatabases() + { + MPX_DEBUG1("CMPXHarvesterDatabaseManager::RecreateDatabases <--"); + TInt count( iDatabases.Count() ); + for( TInt i=0; iClose(); + cur->DeleteDatabase(); + // trap leave just in case 1 db had err + // + TRAP_IGNORE( cur->OpenL() ); + } + } + + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::IsRemoteDrive +// --------------------------------------------------------------------------- +// +TBool CMPXHarvesterDatabaseManager::IsRemoteDrive(TDriveNumber aDrive) + { + TDriveInfo driveInfo; + TBool isRemoteDrive(EFalse); + if (iFs.Drive(driveInfo, aDrive) == KErrNone) + { + isRemoteDrive = driveInfo.iDriveAtt & KDriveAttRemote; + } + return isRemoteDrive; + } + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::BeginL +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseManager::BeginL() + { + MPX_DEBUG1("CMPXHarvesterDatabaseManager::BeginL <--"); + TInt count( iDatabases.Count() ); + for( TInt i=0; iInTransaction()) + { + TRAPD(err, db->BeginL()); + User::LeaveIfError(err); + } + } + MPX_DEBUG1("CMPXHarvesterDatabaseManager::BeginL -->"); + } + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::CommitL +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseManager::CommitL() + { + MPX_DEBUG1("CMPXHarvesterDatabaseManager::CommitL <--"); + TInt count( iDatabases.Count() ); + for( TInt i=0; iInTransaction()) + { + TRAPD(err, db->CommitL()); + User::LeaveIfError(err); + } + } + MPX_DEBUG1("CMPXHarvesterDatabaseManager::CommitL -->"); + } + +// --------------------------------------------------------------------------- +// CMPXHarvesterDatabaseManager::Rollback +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseManager::Rollback() + { + MPX_DEBUG1("CMPXHarvesterDatabaseManager::Rollback <--"); + TInt count( iDatabases.Count() ); + for( TInt i=0; iInTransaction()) + { + db->Rollback(); + } + } + MPX_DEBUG1("CMPXHarvesterDatabaseManager::Rollback -->"); + } + +// END OF FILE +