mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp
changeset 0 a2952bb97e68
child 9 bee149131e4b
child 25 d881023c13eb
equal deleted inserted replaced
-1:000000000000 0:a2952bb97e68
       
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Harvester database manager
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <e32base.h>
       
    20 #ifdef RD_MULTIPLE_DRIVE
       
    21 #include <pathinfo.h>
       
    22 #include <driveinfo.h>
       
    23 #endif //RD_MULTIPLE_DRIVE
       
    24 #include <mpxlog.h>
       
    25 #include "mpxharvesterdbmanager.h"
       
    26 #include "mpxharvesterdb.h"
       
    27 #include "mpxharvesterdbtable.h"
       
    28 
       
    29 // ---------------------------------------------------------------------------
       
    30 // C++ Constructor
       
    31 // ---------------------------------------------------------------------------
       
    32 //
       
    33 CMPXHarvesterDatabaseManager::CMPXHarvesterDatabaseManager( RFs& aFs )
       
    34                                                                   : iFs( aFs )
       
    35     {
       
    36 
       
    37     }
       
    38 
       
    39 
       
    40 // ---------------------------------------------------------------------------
       
    41 // 2nd Phase Constructor
       
    42 // ---------------------------------------------------------------------------
       
    43 //
       
    44 void CMPXHarvesterDatabaseManager::ConstructL()
       
    45     {
       
    46     User::LeaveIfError( iDBSession.Connect() );
       
    47     }
       
    48 
       
    49 
       
    50 // ---------------------------------------------------------------------------
       
    51 // Two-Phased Constructor
       
    52 // ---------------------------------------------------------------------------
       
    53 //
       
    54 CMPXHarvesterDatabaseManager* CMPXHarvesterDatabaseManager::NewL( RFs& aFs )
       
    55     {
       
    56     CMPXHarvesterDatabaseManager* self =
       
    57                              new( ELeave ) CMPXHarvesterDatabaseManager( aFs );
       
    58     CleanupStack::PushL( self );
       
    59     self->ConstructL();
       
    60     CleanupStack::Pop( self );
       
    61     return self;
       
    62     }
       
    63 
       
    64 
       
    65 // ---------------------------------------------------------------------------
       
    66 // Destructor
       
    67 // ---------------------------------------------------------------------------
       
    68 //
       
    69 CMPXHarvesterDatabaseManager::~CMPXHarvesterDatabaseManager()
       
    70     {
       
    71     iDatabases.ResetAndDestroy();
       
    72     iDatabases.Close();
       
    73     iDBSession.Close();
       
    74     }
       
    75 
       
    76 // ---------------------------------------------------------------------------
       
    77 // CMPXHarvesterDatabaseManager::OpenAllDatabasesL
       
    78 // ---------------------------------------------------------------------------
       
    79 //
       
    80 TInt CMPXHarvesterDatabaseManager::OpenAllDatabasesL()
       
    81     {
       
    82     MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenAllDatabasesL <---");
       
    83 
       
    84     TInt rtn (KErrNone);
       
    85 
       
    86     // Open drives we are interested in.
       
    87     //
       
    88 #ifdef RD_MULTIPLE_DRIVE
       
    89     TDriveList driveList;
       
    90     TInt driveCount(0);
       
    91     User::LeaveIfError( DriveInfo::GetUserVisibleDrives(
       
    92            iFs, driveList, driveCount ) );
       
    93 
       
    94     TInt check(KErrNone);
       
    95     for( TInt driveNum = EDriveA; driveNum <= EDriveZ; driveNum++ )
       
    96         {
       
    97         if (driveList[driveNum] && !IsRemoteDrive(static_cast<TDriveNumber>(driveNum)))
       
    98             {
       
    99             TFileName drivePath;
       
   100             User::LeaveIfError(
       
   101                 PathInfo::GetRootPath( drivePath, driveNum ) );
       
   102             MPX_DEBUG2("CMPXHarvesterDatabaseManager::OpenAllDatabasesL: opening database in %S drive",
       
   103                 &drivePath);
       
   104             TRAP( check, GetDatabaseL(static_cast<TDriveNumber>(driveNum)) );
       
   105             if( check == KErrNotFound )
       
   106                 {
       
   107                 CMPXHarvesterDB* dB = CMPXHarvesterDB::NewL(
       
   108                     static_cast<TDriveNumber>(driveNum), iFs );
       
   109                 CleanupStack::PushL( dB );
       
   110                 TRAPD(openError, rtn |= dB->OpenL() );  //lint !e665
       
   111                 if(openError == KErrNone)
       
   112                     {
       
   113                      iDatabases.AppendL( dB );
       
   114                      CleanupStack::Pop( dB );
       
   115                     }
       
   116                 else
       
   117                     {
       
   118                     CleanupStack::PopAndDestroy( dB );
       
   119                     }
       
   120                 }
       
   121             else if( check == KErrNone )
       
   122                 {
       
   123                 TRAPD(openError, GetDatabaseL(static_cast<TDriveNumber>(driveNum)).OpenL() );
       
   124                 if(openError != KErrNone)
       
   125                     {
       
   126                     TRAP_IGNORE( RemoveDatabaseL(static_cast<TDriveNumber>(driveNum)));
       
   127                     }
       
   128                 }
       
   129             }
       
   130         }
       
   131 #else
       
   132     TInt check(KErrNone);
       
   133     TRAP( check, GetDatabaseL(EDriveC) );
       
   134     if( check == KErrNotFound )
       
   135         {
       
   136         CMPXHarvesterDB* dB = CMPXHarvesterDB::NewL( EDriveC, iFs );
       
   137         CleanupStack::PushL( dB );
       
   138         iDatabases.AppendL( dB );
       
   139         CleanupStack::Pop( dB );
       
   140         TRAP_IGNORE( rtn = dB->OpenL() ); //lint !e665
       
   141         }
       
   142     else if( check == KErrNone )
       
   143         {
       
   144         TRAPD(openError, GetDatabaseL(EDriveC).OpenL() );
       
   145         if(openError != KErrNone)
       
   146             {
       
   147             TRAP_IGNORE( RemoveDatabaseL(EDriveC));
       
   148             }
       
   149         }
       
   150     TRAP( check, GetDatabaseL(EDriveE) );  //lint !e961
       
   151     if( check == KErrNotFound )
       
   152         {
       
   153         CMPXHarvesterDB* dB = CMPXHarvesterDB::NewL( EDriveE, iFs );
       
   154         CleanupStack::PushL( dB );
       
   155         TRAPD(openError, rtn |= dB->OpenL() );  //lint !e665
       
   156         if(openError == KErrNone)
       
   157             {
       
   158              iDatabases.AppendL( dB );
       
   159              CleanupStack::Pop( dB );
       
   160             }
       
   161         else
       
   162             {
       
   163             CleanupStack::PopAndDestroy( dB );
       
   164             }
       
   165         }
       
   166     else if( check == KErrNone )
       
   167         {
       
   168         TRAPD(openError,GetDatabaseL(EDriveE).OpenL() );
       
   169         if(openError != KErrNone)
       
   170             {
       
   171             TRAP_IGNORE( RemoveDatabaseL(EDriveE));
       
   172             }
       
   173         }
       
   174 #endif // RD_MULTIPLE_DRIVE
       
   175 
       
   176     MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenAllDatabasesL --->");  //lint !e961
       
   177     return rtn;
       
   178     }
       
   179 
       
   180 // ---------------------------------------------------------------------------
       
   181 // CMPXHarvesterDatabaseManager::OpenDatabaseL
       
   182 // ---------------------------------------------------------------------------
       
   183 //
       
   184 void CMPXHarvesterDatabaseManager::OpenDatabaseL( TDriveNumber aDrive )
       
   185     {
       
   186     MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenDatabaseL <---");
       
   187 
       
   188     // Re-open a specific database
       
   189     //
       
   190     if (!IsRemoteDrive(aDrive))
       
   191         {
       
   192     TInt count( iDatabases.Count() );
       
   193     for( TInt i=0; i<count; ++i )
       
   194         {
       
   195         CMPXHarvesterDB* db = (CMPXHarvesterDB*) iDatabases[i];
       
   196         if( db->GetDbDrive() == aDrive )
       
   197             {
       
   198             db->OpenL();
       
   199             break;
       
   200             }
       
   201         }
       
   202         }
       
   203     MPX_DEBUG1("CMPXHarvesterDatabaseManager::OpenDatabaseL --->");
       
   204     }
       
   205 
       
   206 // ---------------------------------------------------------------------------
       
   207 // CMPXHarvesterDatabaseManager::CloseAllDatabase
       
   208 // ---------------------------------------------------------------------------
       
   209 //
       
   210 void CMPXHarvesterDatabaseManager::CloseAllDatabase()
       
   211     {
       
   212     // Close all databases for shutdown
       
   213     iDatabases.ResetAndDestroy();
       
   214     }
       
   215 
       
   216 // ---------------------------------------------------------------------------
       
   217 // CMPXHarvesterDatabaseManager::CloseDatabase
       
   218 // ---------------------------------------------------------------------------
       
   219 //
       
   220 void CMPXHarvesterDatabaseManager::CloseDatabase( TDriveNumber aDrive )
       
   221     {
       
   222      if (!IsRemoteDrive(aDrive))
       
   223         {
       
   224         MPX_DEBUG2("CMPXHarvesterDatabaseManager::CloseDatabase drive %d <---", aDrive );
       
   225         TInt count = iDatabases.Count();
       
   226         for ( TInt i=0; i<count; ++i)
       
   227             {
       
   228             CMPXHarvesterDB* db = (CMPXHarvesterDB*) iDatabases[i];
       
   229             if ( db->GetDbDrive() == aDrive)
       
   230                 {
       
   231                 db->Close();
       
   232                 break;
       
   233                 }
       
   234             }
       
   235         }
       
   236     MPX_DEBUG1("CMPXHarvesterDatabaseManager::CloseDatabase --->");
       
   237     }
       
   238 
       
   239 // ---------------------------------------------------------------------------
       
   240 // CMPXHarvesterDatabaseManager::GetDatabase
       
   241 // ---------------------------------------------------------------------------
       
   242 //
       
   243 CMPXHarvesterDB& CMPXHarvesterDatabaseManager::GetDatabaseL( TDriveNumber aDrive )
       
   244     {
       
   245     CMPXHarvesterDB* db( NULL );
       
   246 
       
   247     // Find the database
       
   248     TInt count = iDatabases.Count();
       
   249     for( TInt i=0; i<count; ++i )
       
   250         {
       
   251         CMPXHarvesterDB* tmp = (CMPXHarvesterDB*) iDatabases[i];
       
   252         if( tmp->GetDbDrive() == aDrive )
       
   253             {
       
   254             db = tmp;
       
   255             break;
       
   256             }
       
   257         }
       
   258 
       
   259     // Not found, so we leave
       
   260     if( db == NULL )
       
   261         {
       
   262         User::Leave( KErrNotFound );
       
   263         }
       
   264     return *db;
       
   265     }
       
   266 
       
   267 // ---------------------------------------------------------------------------
       
   268 // CMPXHarvesterDatabaseManager::RemoveDatabase
       
   269 // ---------------------------------------------------------------------------
       
   270 //
       
   271 void CMPXHarvesterDatabaseManager::RemoveDatabaseL( TDriveNumber aDrive )
       
   272     {
       
   273 
       
   274     TBool bFound(EFalse);
       
   275     // Find the database
       
   276     TInt count = iDatabases.Count();
       
   277     for(TInt index=0; index<count; ++index )
       
   278         {
       
   279         if((iDatabases[index]!=NULL) && ( iDatabases[index]->GetDbDrive() == aDrive ))
       
   280             {
       
   281             bFound = ETrue;
       
   282             delete iDatabases[index];
       
   283             iDatabases.Remove(index);
       
   284             break;
       
   285             }
       
   286         }
       
   287 
       
   288     // Not found, so we leave
       
   289     if( !bFound )
       
   290         {
       
   291         User::Leave( KErrNotFound );
       
   292         }
       
   293     }
       
   294 
       
   295 // ---------------------------------------------------------------------------
       
   296 // CMPXHarvesterDatabaseManager::Count
       
   297 // ---------------------------------------------------------------------------
       
   298 //
       
   299 TInt CMPXHarvesterDatabaseManager::Count()
       
   300     {
       
   301     return iDatabases.Count();
       
   302     }
       
   303 
       
   304 // ---------------------------------------------------------------------------
       
   305 // CMPXHarvesterDatabaseManager::GetDatabaseL
       
   306 // ---------------------------------------------------------------------------
       
   307 //
       
   308 CMPXHarvesterDB& CMPXHarvesterDatabaseManager::GetDatabaseL( TInt aDb )
       
   309     {
       
   310     if( aDb > iDatabases.Count() )
       
   311         {
       
   312         User::Leave(KErrNotFound/*KErrArgument*/);
       
   313         }
       
   314     return *iDatabases[aDb];
       
   315     }
       
   316 
       
   317 // ---------------------------------------------------------------------------
       
   318 // CMPXHarvesterDatabaseManager::RecreateDatabase
       
   319 // ---------------------------------------------------------------------------
       
   320 //
       
   321 void CMPXHarvesterDatabaseManager::RecreateDatabases()
       
   322     {
       
   323     MPX_DEBUG1("CMPXHarvesterDatabaseManager::RecreateDatabases <--");
       
   324     TInt count( iDatabases.Count() );
       
   325     for( TInt i=0; i<count; ++i )
       
   326         {
       
   327         // Close db, delete and recreate
       
   328         //
       
   329         MPX_DEBUG2("RecreateDatabasesL() -- %i", i);
       
   330         CMPXHarvesterDB* cur = (CMPXHarvesterDB*)iDatabases[i];
       
   331         cur->Close();
       
   332         cur->DeleteDatabase();
       
   333         // trap leave just in case 1 db had err
       
   334         //
       
   335         TRAP_IGNORE( cur->OpenL() );
       
   336         }
       
   337     }
       
   338 
       
   339 
       
   340 // ---------------------------------------------------------------------------
       
   341 // CMPXHarvesterDatabaseManager::IsRemoteDrive
       
   342 // ---------------------------------------------------------------------------
       
   343 //
       
   344 TBool CMPXHarvesterDatabaseManager::IsRemoteDrive(TDriveNumber aDrive)
       
   345     {
       
   346     TDriveInfo driveInfo;
       
   347     TBool isRemoteDrive(EFalse);
       
   348     if (iFs.Drive(driveInfo, aDrive) == KErrNone)
       
   349         {
       
   350         isRemoteDrive = driveInfo.iDriveAtt & KDriveAttRemote;
       
   351         }
       
   352     return isRemoteDrive;
       
   353     }
       
   354 
       
   355 // ---------------------------------------------------------------------------
       
   356 // CMPXHarvesterDatabaseManager::BeginL
       
   357 // ---------------------------------------------------------------------------
       
   358 // 
       
   359 void CMPXHarvesterDatabaseManager::BeginL()
       
   360     {
       
   361     MPX_DEBUG1("CMPXHarvesterDatabaseManager::BeginL <--");
       
   362     TInt count( iDatabases.Count() );
       
   363     for( TInt i=0; i<count; ++i )
       
   364         {
       
   365         CMPXHarvesterDB* db = (CMPXHarvesterDB*) iDatabases[i];
       
   366         if(!db->InTransaction())
       
   367              {
       
   368         TRAPD(err, db->BeginL());
       
   369         User::LeaveIfError(err);
       
   370              }
       
   371         }
       
   372     MPX_DEBUG1("CMPXHarvesterDatabaseManager::BeginL -->");
       
   373     }
       
   374 
       
   375 // ---------------------------------------------------------------------------
       
   376 // CMPXHarvesterDatabaseManager::CommitL
       
   377 // ---------------------------------------------------------------------------
       
   378 //
       
   379 void CMPXHarvesterDatabaseManager::CommitL()
       
   380     {
       
   381     MPX_DEBUG1("CMPXHarvesterDatabaseManager::CommitL <--");
       
   382     TInt count( iDatabases.Count() );
       
   383     for( TInt i=0; i<count; ++i )
       
   384         {
       
   385         CMPXHarvesterDB* db = (CMPXHarvesterDB*) iDatabases[i];
       
   386         
       
   387         // commit only on databases that are in transaction
       
   388         if(db->InTransaction())
       
   389             {
       
   390             TRAPD(err, db->CommitL());
       
   391             User::LeaveIfError(err);
       
   392             }
       
   393         }
       
   394     MPX_DEBUG1("CMPXHarvesterDatabaseManager::CommitL -->");
       
   395     }
       
   396 
       
   397 // ---------------------------------------------------------------------------
       
   398 // CMPXHarvesterDatabaseManager::Rollback
       
   399 // ---------------------------------------------------------------------------
       
   400 //
       
   401 void CMPXHarvesterDatabaseManager::Rollback()
       
   402     {
       
   403     MPX_DEBUG1("CMPXHarvesterDatabaseManager::Rollback <--");
       
   404     TInt count( iDatabases.Count() );
       
   405     for( TInt i=0; i<count; ++i )
       
   406         {
       
   407         CMPXHarvesterDB* db = (CMPXHarvesterDB*) iDatabases[i];
       
   408         
       
   409         // rollback only on databases that are in transaction
       
   410         if(db->InTransaction())
       
   411             {
       
   412             db->Rollback();
       
   413             }
       
   414         }      
       
   415     MPX_DEBUG1("CMPXHarvesterDatabaseManager::Rollback -->");
       
   416     }
       
   417 
       
   418 // END OF FILE
       
   419