mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbcommon/src/mpxdbmanager.cpp
branchRCL_3
changeset 18 c54d95799c80
parent 11 13afc0e517bd
child 21 a1247965635c
equal deleted inserted replaced
17:c8156a91d13c 18:c54d95799c80
   189 
   189 
   190     iTables.Close();
   190     iTables.Close();
   191     CloseAllDatabases();
   191     CloseAllDatabases();
   192 
   192 
   193     delete iDbFile;
   193     delete iDbFile;
   194 #ifdef __RAMDISK_PERF_ENABLE
       
   195     TInt count(iDatabaseHandles.Count());
       
   196     for (TInt i = 0; i < count; ++i)
       
   197         {
       
   198         RemoveDummyFile(i);
       
   199         }    
       
   200 #endif //__RAMDISK_PERF_ENABLE
       
   201     iDatabaseHandles.Close();
   194     iDatabaseHandles.Close();
   202     }
   195     }
   203 
   196 
   204 // ----------------------------------------------------------------------------
   197 // ----------------------------------------------------------------------------
   205 // Checks if all databases have been initialized.
   198 // Checks if all databases have been initialized.
   283                 {
   276                 {
   284                 // already used
   277                 // already used
   285                 MPX_DEBUG1("CMPXDbManager::CopyDBsToRamL iUseRAMdb already ETrue");
   278                 MPX_DEBUG1("CMPXDbManager::CopyDBsToRamL iUseRAMdb already ETrue");
   286                 continue;
   279                 continue;
   287                 }
   280                 }
   288             iDatabaseHandles[i].iUseRAMdb = ETrue;
   281             CloseDatabaseAtIndexL( i ); // let leave: not much we can't do if we can't close the original DB
   289             TRAPD(err, ret = DoCopyDBToRamL( iDatabaseHandles[i].iDrive, aIsMTPInUse ))
   282             DoCopyDBToRam( i, aIsMTPInUse ); // copies if it can
       
   283             TRAPD( err, OpenDatabaseAtIndexL( i ) );
   290             if ( err != KErrNone )
   284             if ( err != KErrNone )
   291                 {
   285                 {
   292                 MPX_DEBUG2("CMPXDbManager::CopyDBsToRamL error=%d", err);
   286                 MPX_DEBUG2("CMPXDbManager::CopyDBsToRamL OpenDatabaseAtIndexL leave=%d", err);
   293                 // remove dymmy file
       
   294                 RemoveDummyFile(i);
   287                 RemoveDummyFile(i);
   295                 // try to close database that is opened from RAM disk
   288                 if ( iDatabaseHandles[i].iUseRAMdb ) 
   296                 TRAP_IGNORE(CloseDatabaseL( iDatabaseHandles[i].iDrive ));
   289                     {
   297                 iDatabaseHandles[i].iUseRAMdb = EFalse;
   290                     // go back to disk DB
   298                 // reopen database from drive not from RAM
   291                     TRAP_IGNORE(CloseDatabaseAtIndexL( i ));
   299                 OpenDatabaseL( iDatabaseHandles[i].iDrive );
   292                     iDatabaseHandles[i].iUseRAMdb = EFalse;
   300                 continue; // continue to copy for next drive
   293                     OpenDatabaseAtIndexL( i );
   301                 }
   294                     continue;
   302             if ( !ret )
   295                     }
   303                 {
   296                 else
   304                 iDatabaseHandles[i].iUseRAMdb = EFalse;
   297                     {
       
   298                     User::Leave( err );
       
   299                     }
   305                 }
   300                 }
   306             }
   301             }
   307             
   302             
   308         if (transactionCount > 0) 
   303         if (transactionCount > 0) 
   309             {
   304             {
   318 
   313 
   319     }
   314     }
   320 
   315 
   321 
   316 
   322 // ----------------------------------------------------------------------------
   317 // ----------------------------------------------------------------------------
   323 // CMPXDbManager::DoCopyDBsToRamL
   318 // CMPXDbManager::DoCopyDBToRam
   324 // ----------------------------------------------------------------------------
   319 // ----------------------------------------------------------------------------
   325 //
   320 //
   326 TBool CMPXDbManager::DoCopyDBToRamL( TDriveUnit aDrive, TBool aIsMTPInUse )
   321 TBool CMPXDbManager::DoCopyDBToRam( TInt aIndex, TBool aIsMTPInUse )
   327     {
   322     {
   328 #ifdef __RAMDISK_PERF_ENABLE
   323 #ifdef __RAMDISK_PERF_ENABLE
   329     MPX_DEBUG2("-->CMPXDbManager::DoCopyDBsToRamL drive=%d", (TInt)aDrive);
   324     MPX_DEBUG2("-->CMPXDbManager::DoCopyDBsToRam drive=%d", (TInt)iDatabaseHandles[aIndex].iDrive);
   330     TFileName dst;
   325     DatabaseHandle& database = iDatabaseHandles[aIndex];
   331     TFileName src;
   326     TInt err = KErrNone;
   332     dst.Append(iRAMFolder);
   327 
   333     src.Append(aDrive.Name());
   328     delete database.iOrigFullFilePath;
   334     src.Append(KDBFilePath);
   329     database.iOrigFullFilePath = 0;
   335     TRAPD( err, BaflUtils::EnsurePathExistsL( iFs, dst ));
   330     delete database.iTargetFullFilePath;
   336     if ( err != KErrNone )
   331     database.iTargetFullFilePath = 0;
   337         {
   332     TRAP (err, 
       
   333 	      database.iOrigFullFilePath = CreateFullFilenameL( database.iDrive );
       
   334           database.iUseRAMdb = ETrue; // must turn this on to create RAM filename
       
   335           database.iTargetFullFilePath = CreateFullFilenameL( database.iDrive );
       
   336           BaflUtils::EnsurePathExistsL( iFs, *database.iTargetFullFilePath ));
       
   337     database.iUseRAMdb = EFalse;
       
   338     if (err != KErrNone)
       
   339         {
       
   340         MPX_DEBUG1("CMPXDbManager::DoCopyDBsToRamL() CreateFilenameL or EnsurePathExistsL failed");
   338         return EFalse;
   341         return EFalse;
   339         }
   342         }
   340     TFileName filename;            
   343     MPX_DEBUG2("RAMDisk src path=%S", database.iOrigFullFilePath);
   341     filename.Format(KSecurePath, User::Identity().iUid, iDbFile); //x:\private\10281e17\[sldfdsf]mpxv2_5.db
   344     MPX_DEBUG2("RAMDisk dst path=%S", database.iTargetFullFilePath);
   342     src.Append(filename);
   345 
   343     MPX_DEBUG2("RAMDisk src path=%S", &src);
   346     if (!BlockDiskSpace( aIndex, aIsMTPInUse ) )
   344     TEntry entry;
       
   345     iFs.Entry( src, entry );
       
   346     if (!BlockDiskSpace( aDrive, entry.iSize, aIsMTPInUse ) )
       
   347         {
   347         {
   348         MPX_DEBUG1("CMPXDbManager::DoCopyDBsToRamL() BlockDiskSpace failed");
   348         MPX_DEBUG1("CMPXDbManager::DoCopyDBsToRamL() BlockDiskSpace failed");
   349         return EFalse; // continue for next drive
   349         return EFalse; // continue for next drive
   350         }
   350         }
   351     TBuf<2> d;
   351 
   352     d.Append(aDrive.Name());
   352     if ( BaflUtils::CopyFile(iFs, *database.iOrigFullFilePath, *database.iTargetFullFilePath ) != KErrNone )
   353     HBufC* temp = HBufC::NewLC(KMaxFileName);
   353         {
   354     temp->Des().Append(d.Left(1));
   354         RemoveDummyFile( aIndex );
   355     temp->Des().Append(iDbFile->Des());
       
   356     filename.Format(KSecurePath, User::Identity().iUid, temp);
       
   357     CleanupStack::PopAndDestroy(temp);
       
   358     dst.Append(filename);
       
   359     MPX_DEBUG2("RAMDisk dst path=%S", &dst);
       
   360     TInt index( GetDatabaseIndex((TInt)aDrive) );
       
   361     delete iDatabaseHandles[index].iOrigFullFilePath;
       
   362     iDatabaseHandles[index].iOrigFullFilePath = 0;
       
   363     delete iDatabaseHandles[index].iTargetFullFilePath;
       
   364     iDatabaseHandles[index].iTargetFullFilePath = 0;
       
   365     
       
   366     // Save these path so it is convenient to copy back
       
   367     iDatabaseHandles[index].iOrigFullFilePath = HBufC::NewL(src.Length());
       
   368     iDatabaseHandles[index].iTargetFullFilePath = HBufC::NewL(dst.Length());
       
   369         
       
   370     iDatabaseHandles[index].iOrigFullFilePath->Des().Append(src);
       
   371     iDatabaseHandles[index].iTargetFullFilePath->Des().Append(dst);
       
   372 
       
   373     TRAP(err, CloseDatabaseL(aDrive));
       
   374     if ( err != KErrNone )
       
   375         {
       
   376         MPX_DEBUG2("<--CMPXDbManager::DoCopyDBsToRamL error=%d", err);
       
   377         TInt index(GetDatabaseIndex((TInt)aDrive));
       
   378         if ( index >= 0 )
       
   379             {
       
   380             RemoveDummyFile( index );
       
   381             }
       
   382         return EFalse;
   355         return EFalse;
   383         }
   356         }
   384     User::LeaveIfError( BaflUtils::CopyFile(iFs, src, dst ));
   357     MPX_DEBUG2("RAMDisk Database copied=%d", (TInt)database.iDrive);
   385     OpenDatabaseL((TInt)aDrive);
   358     database.iUseRAMdb = ETrue; // succeeded moving DB to RAM
   386 
       
   387     MPX_DEBUG2("RAMDisk Database opened=%d", (TInt)aDrive);
       
   388     MPX_DEBUG1("<--CMPXDbManager::DoCopyDBsToRamL");
   359     MPX_DEBUG1("<--CMPXDbManager::DoCopyDBsToRamL");
   389     return ETrue;    
   360     return ETrue;
       
   361 #else
       
   362     return EFalse;
   390 #endif //__RAMDISK_PERF_ENABLE
   363 #endif //__RAMDISK_PERF_ENABLE
   391     }
   364     }
   392 
   365 
   393 // ----------------------------------------------------------------------------
   366 // ----------------------------------------------------------------------------
   394 // Copy all DBs from RAM disk back to normal drives
   367 // Copy all DBs from RAM disk back to normal drives
   395 // ----------------------------------------------------------------------------
   368 // ----------------------------------------------------------------------------
   396 //
   369 //
   397 EXPORT_C void CMPXDbManager::CopyDBsFromRamL()
   370 EXPORT_C void CMPXDbManager::CopyDBsFromRamL()
   398     {
   371     {
       
   372     MPX_FUNC("CMPXDbManager::CopyDBsFromRamL");
   399 #ifdef __RAMDISK_PERF_ENABLE
   373 #ifdef __RAMDISK_PERF_ENABLE
   400     MPX_DEBUG1("-->CMPXDbManager::CopyDBsFromRamL");
       
   401     if( iRAMDiskPerfEnabled )
   374     if( iRAMDiskPerfEnabled )
   402        {
   375        {
   403         TInt transactionCount = iTransactionCount;
   376         TInt transactionCount = iTransactionCount;
   404         if (iTransactionCount > 0) 
   377         if (iTransactionCount > 0) 
   405             {
   378             {
   406             iTransactionCount = 0;
   379             iTransactionCount = 0;
   407             DoCommitL();
   380             TRAP_IGNORE( DoCommitL() );
   408             }
   381             }
   409 
   382 
   410         TInt count(iDatabaseHandles.Count());
   383         TInt count(iDatabaseHandles.Count());
   411         for (TInt i = 0; i < count && iDatabaseHandles[i].iUseRAMdb; ++i)
   384         TInt leaveError = KErrNone;
   412             {
   385         iRAMInUse = EFalse;
   413             TRAPD(err, DoCopyDBFromRamL(i));
   386         // Should not leave until all the databases have been copied from RAM drive. 
   414             if ( err != KErrNone )
   387         for (TInt i = 0; i < count; ++i)
       
   388             {
       
   389             if ( !iDatabaseHandles[i].iUseRAMdb )
   415                 {
   390                 {
   416                 MPX_DEBUG2("<--CMPXDbManager::CopyDBsFromRamL error=%d", err);                
   391                 continue;
   417                 //anyting wrong, delete the temp file and open database from drive
   392                 }
       
   393             TRAPD( error, CloseDatabaseAtIndexL( i ) );
       
   394             if ( error )
       
   395                 {
       
   396                 // Can't close db on RAM drive, so cleanup.
       
   397                 MPX_DEBUG2("CMPXDbManager::CopyDBsFromRamL CloseDatabaseAtIndexL fail: error = %d", error);
       
   398                 // Delete database on RAM drive.
       
   399                 BaflUtils::DeleteFile(iFs, *iDatabaseHandles[i].iTargetFullFilePath);
       
   400                 // Delete dummy file
   418                 RemoveDummyFile(i);
   401                 RemoveDummyFile(i);
   419                 // delete Db on RAM
   402                 }
   420                 User::LeaveIfError( BaflUtils::DeleteFile(iFs, 
   403             else
   421                     *iDatabaseHandles[i].iTargetFullFilePath));
   404                 {
       
   405                 DoCopyDBFromRam(i);
   422                 }
   406                 }
   423             iDatabaseHandles[i].iUseRAMdb = EFalse;
   407             iDatabaseHandles[i].iUseRAMdb = EFalse;
   424             // open db from drive
   408             // open db from drive
   425             OpenDatabaseL( iDatabaseHandles[i].iDrive );      
   409             TRAP( error, OpenDatabaseAtIndexL( i ) );      
   426             }
   410             if ( error && !leaveError )
       
   411                 {
       
   412                 leaveError = error;
       
   413                 }
       
   414             }
       
   415         
       
   416         // leave if error
       
   417         User::LeaveIfError(leaveError);
   427 
   418 
   428         if (transactionCount > 0) 
   419         if (transactionCount > 0) 
   429             {
   420             {
   430             DoBeginL();
   421             DoBeginL();
   431             iTransactionCount = transactionCount;
   422             iTransactionCount = transactionCount;
   432             }
   423             }
   433         }
   424         }
   434     iRAMInUse = EFalse;
   425 #endif //__RAMDISK_PERF_ENABLE
       
   426     }
       
   427 
       
   428 
       
   429 // ----------------------------------------------------------------------------
       
   430 // CMPXDbManager::DoCopyDBsToRam
       
   431 // ----------------------------------------------------------------------------
       
   432 //
       
   433 void CMPXDbManager::DoCopyDBFromRam( TInt aIndex )
       
   434     {
       
   435 #ifdef __RAMDISK_PERF_ENABLE
       
   436     MPX_DEBUG1("-->CMPXDbManager::DoCopyDBsFromRam");    
       
   437     DatabaseHandle& database = iDatabaseHandles[aIndex];
       
   438 
       
   439     //Copy Db from RAM to replace dummy file
       
   440     TRAPD(error, ReplaceFileL( *database.iTargetFullFilePath, database.iDummyFilePath));
       
   441     MPX_DEBUG2("CMPXDbManager::CopyDBsFromRam RAMDisk copied over dummy, error=%d", error);
       
   442 
       
   443     // done with RAM DB (whether copying succeeded or not) so can delete it
       
   444     // can ignore errors since we cannot do anything if this fails
       
   445     BaflUtils::DeleteFile(iFs, *database.iTargetFullFilePath);
       
   446     MPX_DEBUG1("CMPXDbManager::DoCopyDBsFromRam RAM DB deleted");
   435         
   447         
   436     MPX_DEBUG1("<--CMPXDbManager::CopyDBsFromRamL");
   448     if ( error == KErrNone )
   437 #endif //__RAMDISK_PERF_ENABLE
   449         {
   438     }
   450         // Delete old DB on drive
   439 
   451         // Can ignore error: either original does not exist or something is wrong and can't help it
   440 
   452         BaflUtils::DeleteFile(iFs, *database.iOrigFullFilePath);
   441 // ----------------------------------------------------------------------------
   453         MPX_DEBUG1("CMPXDbManager::DoCopyDBsFromRam old DB on drive deleted");
   442 // CMPXDbManager::DoCopyDBsToRamL
   454 
   443 // ----------------------------------------------------------------------------
   455         // Rename dummy file to be original file name
   444 //
   456         error = BaflUtils::RenameFile(iFs, database.iDummyFilePath, *database.iOrigFullFilePath);
   445 void CMPXDbManager::DoCopyDBFromRamL( TInt aIndex )
   457         MPX_DEBUG2("CMPXDbManager::CopyDBsFromRam dummy file renamed, error=%d", error);
   446     {
   458         if ( error )
   447 #ifdef __RAMDISK_PERF_ENABLE
   459             {
   448     MPX_DEBUG1("-->CMPXDbManager::DoCopyDBsFromRamL");    
   460             // Error renaming dummy file, delete dummy file.
   449     MPX_DEBUG2("-->CMPXDbManager::DoCopyDBsFromRamL Drive %d will be closed before copying db from RAM.",
   461             RemoveDummyFile(aIndex);
   450          iDatabaseHandles[aIndex].iDrive);
   462             }
   451 
   463         }
   452     CloseDatabaseL(iDatabaseHandles[aIndex].iDrive);            
   464     else
   453 
   465         {
   454     // Delete existing DB on drive
   466         RemoveDummyFile(aIndex);
   455     User::LeaveIfError( BaflUtils::DeleteFile(iFs, 
   467         MPX_DEBUG1("CMPXDbManager::DoCopyDBsFromRam dummy file deleted");
   456         *iDatabaseHandles[aIndex].iOrigFullFilePath));
   468         }
   457     MPX_DEBUG1("CMPXDbManager::DoCopyDBsFromRamL old DB on drive deleted");
   469 
   458 
   470     MPX_DEBUG1("<--CMPXDbManager::DoCopyDBsFromRam");
   459     // Rename dummy file to be orignal file name
       
   460     User::LeaveIfError( BaflUtils::RenameFile(iFs, 
       
   461         iDatabaseHandles[aIndex].iDummyFilePath, 
       
   462         *iDatabaseHandles[aIndex].iOrigFullFilePath) );
       
   463     MPX_DEBUG1("CMPXDbManager::CopyDBsFromRamL RAMDisk renamed.");
       
   464 
       
   465     //Copy Db from RAM to replace dummy file
       
   466     ReplaceFileL( *iDatabaseHandles[aIndex].iTargetFullFilePath, *iDatabaseHandles[aIndex].iOrigFullFilePath);
       
   467     
       
   468     MPX_DEBUG1("CMPXDbManager::CopyDBsFromRamL RAMDisk copied back.");
       
   469 
       
   470     // Delete existing DB on RAM
       
   471     User::LeaveIfError( BaflUtils::DeleteFile(iFs, *iDatabaseHandles[aIndex].iTargetFullFilePath));
       
   472     MPX_DEBUG1("CMPXDbManager::DoCopyDBsFromRamL RAMDisk deleted");
       
   473 
       
   474     MPX_DEBUG1("<--CMPXDbManager::DoCopyDBsFromRamL");
       
   475 #endif //__RAMDISK_PERF_ENABLE
   471 #endif //__RAMDISK_PERF_ENABLE
   476     } 
   472     } 
   477 
   473 
   478 // ----------------------------------------------------------------------------
   474 // ----------------------------------------------------------------------------
   479 // CMPXDbManager::ReplaceFileL
   475 // CMPXDbManager::ReplaceFileL
   480 //
   476 //
   481 // Replaces a file with another writing over the destination file.
   477 // Replaces a file with another writing over the destination file.
   482 // Leaves on error.
   478 // Leaves on error.
   483 // Implementation follows CFileMan::Copy except that 
   479 // Implementation follows CFileMan::Copy except that 
   484 //  - we don't resize target file to zero
   480 //  - we don't resize target file to zero
   485 //  - we can assume that files already exist
   481 //  - we can assume that source file already exists
   486 //  - we don't copy file attributes & timestamp
   482 //  - we don't copy file attributes & timestamp
   487 // ----------------------------------------------------------------------------
   483 // ----------------------------------------------------------------------------
   488 //
   484 //
   489 void CMPXDbManager::ReplaceFileL( const TDesC& aSrcName, const TDesC& aDstName )
   485 void CMPXDbManager::ReplaceFileL( const TDesC& aSrcName, const TDesC& aDstName )
   490     {
   486     {
   492     RFile srcFile;
   488     RFile srcFile;
   493     User::LeaveIfError( srcFile.Open(iFs, aSrcName, EFileRead|EFileShareReadersOnly) );
   489     User::LeaveIfError( srcFile.Open(iFs, aSrcName, EFileRead|EFileShareReadersOnly) );
   494     CleanupClosePushL( srcFile );
   490     CleanupClosePushL( srcFile );
   495     
   491     
   496     RFile dstFile;
   492     RFile dstFile;
   497     User::LeaveIfError( dstFile.Open(iFs, aDstName, EFileWrite|EFileWriteDirectIO|EFileShareExclusive) );
   493 	TInt error = dstFile.Open(iFs, aDstName, EFileWrite|EFileWriteDirectIO|EFileShareExclusive);
       
   494 	if (error == KErrNotFound)
       
   495 	   {
       
   496 	   error = dstFile.Create(iFs, aDstName, EFileWrite|EFileWriteDirectIO|EFileShareExclusive);
       
   497 	   }
       
   498 	User::LeaveIfError ( error );
   498     CleanupClosePushL( dstFile );
   499     CleanupClosePushL( dstFile );
   499     
   500     
   500     // resize destination file
   501     // resize destination file
   501     TInt remainingBytes;
   502     TInt remainingBytes;
   502     User::LeaveIfError( srcFile.Size(remainingBytes) );
   503     User::LeaveIfError( srcFile.Size(remainingBytes) );
   547 #ifdef __RAMDISK_PERF_ENABLE
   548 #ifdef __RAMDISK_PERF_ENABLE
   548     MPX_DEBUG1("-->CMPXDbManager::RemoveDummyFile");
   549     MPX_DEBUG1("-->CMPXDbManager::RemoveDummyFile");
   549        
   550        
   550     if ( iDatabaseHandles[index].iDummyFilePath.Length() )
   551     if ( iDatabaseHandles[index].iDummyFilePath.Length() )
   551         {
   552         {
   552         TInt err = BaflUtils::DeleteFile(iFs, iDatabaseHandles[index].iDummyFilePath);
   553         BaflUtils::DeleteFile(iFs, iDatabaseHandles[index].iDummyFilePath);
   553         if ( !err )
   554         iDatabaseHandles[index].iDummyFilePath.Zero();
   554             {
       
   555             iDatabaseHandles[index].iDummyFilePath.Zero();
       
   556             }
       
   557         }
   555         }
   558     MPX_DEBUG1("<--CMPXDbManager::RemoveDummyFile");
   556     MPX_DEBUG1("<--CMPXDbManager::RemoveDummyFile");
   559 #endif //__RAMDISK_PERF_ENABLE
   557 #endif //__RAMDISK_PERF_ENABLE
   560 
   558 
   561     }
   559     }
   648     CloseAllDatabases();
   646     CloseAllDatabases();
   649 
   647 
   650     TDriveUnit cdrive(KRootDrive());
   648     TDriveUnit cdrive(KRootDrive());
   651 
   649 
   652     CreateDatabaseL(cdrive);
   650     CreateDatabaseL(cdrive);
   653     OpenDatabaseL(cdrive);
   651     OpenRootDatabaseL();
   654 
   652 
   655     TInt count(aDrives.Count());
   653     TInt count(aDrives.Count());
   656     for (TInt i = 0; i < count; ++i)
   654     for (TInt i = 0; i < count; ++i)
   657         {
   655         {
   658         TDriveUnit drive(aDrives[i]);
   656         TDriveUnit drive(aDrives[i]);
   671             handle.iTargetFullFilePath = HBufC::NewL(0);
   669             handle.iTargetFullFilePath = HBufC::NewL(0);
   672             handle.iDummyFilePath.Zero();
   670             handle.iDummyFilePath.Zero();
   673             handle.iUseRAMdb = EFalse;
   671             handle.iUseRAMdb = EFalse;
   674 #endif //__RAMDISK_PERF_ENABLE
   672 #endif //__RAMDISK_PERF_ENABLE
   675 
   673 
       
   674             TInt index = iDatabaseHandles.Count();
   676             iDatabaseHandles.AppendL(handle);
   675             iDatabaseHandles.AppendL(handle);
   677 
   676 
   678             TVolumeInfo vol;
   677             TVolumeInfo vol;
   679             if (iFs.Volume(vol, drive) == KErrNone)
   678             if (iFs.Volume(vol, drive) == KErrNone)
   680                 {
   679                 {
   681                 CreateDatabaseL(drive);
   680                 CreateDatabaseL(drive);
   682                 AttachDatabaseL(drive);
   681                 AttachDatabaseL( index );
   683                 }
   682                 }
   684             }
   683             }
   685         }
   684         }
   686 
   685 
   687     iInitialized = ETrue;
   686     iInitialized = ETrue;
   711         for (TInt i = 0; i < count; ++i)
   710         for (TInt i = 0; i < count; ++i)
   712             {
   711             {
   713             if (iDatabaseHandles[i].iDrive == aDrive)
   712             if (iDatabaseHandles[i].iDrive == aDrive)
   714                 {
   713                 {
   715                 MPX_DEBUG2("CMPXDbManager::OpenDatabaseL found %d", aDrive);
   714                 MPX_DEBUG2("CMPXDbManager::OpenDatabaseL found %d", aDrive);
   716                 if (!iDatabaseHandles[i].iOpen)
   715                 TInt transactionCount = iTransactionCount;
       
   716                 if (iTransactionCount > 0) 
   717                     {
   717                     {
   718                     MPX_DEBUG1("CMPXDbManager::OpenDatabaseL not open found");
   718                     iTransactionCount = 0;
   719                     // make sure the database is created
   719                     DoCommitL();
   720 					CreateDatabaseL(drive);
       
   721 
       
   722 					// attach
       
   723                     AttachDatabaseL(drive);
       
   724                     }
   720                     }
   725 
   721                 OpenDatabaseAtIndexL( i );
       
   722                 if (transactionCount > 0) 
       
   723                     {
       
   724                     DoBeginL();
       
   725                     iTransactionCount = transactionCount;
       
   726                     }
   726                 found = ETrue;
   727                 found = ETrue;
   727                 break;
   728                 break;
   728                 }
   729                 }
   729             }
   730             }
   730         }
   731         }
   736 
   737 
   737     // Close all prepared statements if a db is opened
   738     // Close all prepared statements if a db is opened
   738     //
   739     //
   739     ResetPreparedQueries();
   740     ResetPreparedQueries();
   740     }
   741     }
       
   742     
       
   743 void CMPXDbManager::OpenDatabaseAtIndexL( TInt aIndex )
       
   744     {
       
   745     	  DatabaseHandle & database = iDatabaseHandles[aIndex];
       
   746         if (!database.iOpen)
       
   747             {
       
   748             MPX_DEBUG1("CMPXDbManager::OpenDatabaseAtIndexL not open");
       
   749             // make sure the database is created
       
   750             CreateDatabaseL( TDriveUnit(database.iDrive) );
       
   751             AttachDatabaseL( aIndex );
       
   752             }
       
   753     }
   741 
   754 
   742 // ----------------------------------------------------------------------------
   755 // ----------------------------------------------------------------------------
   743 // Closes a specified database.
   756 // Closes a specified database.
   744 // ----------------------------------------------------------------------------
   757 // ----------------------------------------------------------------------------
   745 //
   758 //
   750 
   763 
   751     if (iInitialized == EFalse)
   764     if (iInitialized == EFalse)
   752         {
   765         {
   753         User::Leave(KErrNotReady);
   766         User::Leave(KErrNotReady);
   754         }
   767         }
   755 
   768     
       
   769     TDriveUnit drive(aDrive);
       
   770     TDriveUnit cdrive(KRootDrive());
       
   771     TBool found(EFalse);
       
   772 
       
   773     if ((drive != cdrive) && !IsRemoteDrive(static_cast<TDriveNumber>(aDrive)))
       
   774         {
       
   775         TInt count(iDatabaseHandles.Count());
       
   776         for (TInt i = 0; i < count; ++i)
       
   777             {
       
   778             if (iDatabaseHandles[i].iDrive == aDrive)
       
   779                 {
       
   780                 TInt transactionCount = iTransactionCount;
       
   781                 if (iTransactionCount > 0) 
       
   782                     {
       
   783                     iTransactionCount = 0;
       
   784                     DoCommitL();
       
   785                     }
       
   786                 	
       
   787 #ifdef __RAMDISK_PERF_ENABLE                	
       
   788                 if ( iRAMDiskPerfEnabled && iDatabaseHandles[i].iUseRAMdb )
       
   789             	      {
       
   790                     MPX_DEBUG2("CMPXDbManager::CloseDatabaseL found %d at RAM", aDrive);
       
   791                     TRAPD( err, CloseDatabaseAtIndexL( i ) );
       
   792                     if ( err != KErrNone )
       
   793                         {
       
   794                         // Can't close db on RAM drive, so cleanup.
       
   795                         MPX_DEBUG2("CMPXDbManager::CloseDatabaseL CloseDatabaseAtIndexL fail: error = %d", err);
       
   796                         // Delete dummy file
       
   797                         RemoveDummyFile(i);
       
   798                         iDatabaseHandles[i].iUseRAMdb = EFalse;
       
   799                         // Delete database on RAM drive.
       
   800                         User::LeaveIfError( BaflUtils::DeleteFile(iFs, *iDatabaseHandles[i].iTargetFullFilePath) );
       
   801                         }
       
   802                     else
       
   803                         {
       
   804                         DoCopyDBFromRam(i);
       
   805                         }
       
   806                     iDatabaseHandles[i].iUseRAMdb = EFalse;
       
   807                     }
       
   808                 else
       
   809 #endif
       
   810                     {
       
   811                     MPX_DEBUG2("CMPXDbManager::CloseDatabaseL found %d", aDrive);
       
   812                     CloseDatabaseAtIndexL( i );
       
   813                     }
       
   814                     
       
   815                 if (transactionCount > 0) 
       
   816                     {
       
   817                     DoBeginL();
       
   818                     iTransactionCount = transactionCount;
       
   819                     }
       
   820 
       
   821                 found = ETrue;
       
   822                 break;
       
   823                 }
       
   824             }
       
   825         }
       
   826     if (!found)
       
   827         {
       
   828         MPX_DEBUG1("CMPXDbManager::CloseDatabaseL not found");
       
   829         User::Leave(KErrArgument);
       
   830         }
       
   831 
       
   832     }
       
   833 
       
   834 void CMPXDbManager::CloseDatabaseAtIndexL( TInt aIndex )
       
   835     {
   756     // Close all prepared statements if a db is closed
   836     // Close all prepared statements if a db is closed
   757     //
   837     //
   758     ResetPreparedQueries();
   838     ResetPreparedQueries();
   759 
   839 
   760     TDriveUnit drive(aDrive);
   840     if (iDatabaseHandles[aIndex].iOpen)
   761     TDriveUnit cdrive(KRootDrive());
   841         {
   762     TBool found(EFalse);
   842         MPX_DEBUG1("CMPXDbManager::CloseDatabaseAtIndexL found open");
   763 
   843         DetachDatabaseL( aIndex );
   764     if ((drive != cdrive) && !IsRemoteDrive(static_cast<TDriveNumber>(aDrive)))
   844         }
   765         {
   845 }
   766         TInt count(iDatabaseHandles.Count());
       
   767         for (TInt i = 0; i < count; ++i)
       
   768             {
       
   769             if (iDatabaseHandles[i].iDrive == aDrive)
       
   770                 {
       
   771                 MPX_DEBUG2("CMPXDbManager::CloseDatabaseL found %d", aDrive);
       
   772                 if (iDatabaseHandles[i].iOpen)
       
   773                     {
       
   774                     MPX_DEBUG1("CMPXDbManager::CloseDatabaseL found open");
       
   775                     DetachDatabaseL(drive);
       
   776                     }
       
   777 
       
   778                 found = ETrue;
       
   779                 break;
       
   780                 }
       
   781             }
       
   782         }
       
   783     if (!found)
       
   784         {
       
   785         MPX_DEBUG1("CMPXDbManager::CloseDatabaseL not found");
       
   786         User::Leave(KErrArgument);
       
   787         }
       
   788 
       
   789     }
       
   790 
   846 
   791 // ----------------------------------------------------------------------------
   847 // ----------------------------------------------------------------------------
   792 // Closes all databases.
   848 // Closes all databases.
   793 // ----------------------------------------------------------------------------
   849 // ----------------------------------------------------------------------------
   794 //
   850 //
   804 
   860 
   805         TInt count(iDatabaseHandles.Count());
   861         TInt count(iDatabaseHandles.Count());
   806         for (TInt i = 0; i < count; ++i)
   862         for (TInt i = 0; i < count; ++i)
   807             {
   863             {
   808             delete iDatabaseHandles[i].iAliasname;
   864             delete iDatabaseHandles[i].iAliasname;
       
   865             iDatabaseHandles[i].iAliasname = 0;
   809 #ifdef __RAMDISK_PERF_ENABLE 
   866 #ifdef __RAMDISK_PERF_ENABLE 
       
   867             RemoveDummyFile(i);            	
   810             delete iDatabaseHandles[i].iOrigFullFilePath;
   868             delete iDatabaseHandles[i].iOrigFullFilePath;
       
   869 			iDatabaseHandles[i].iOrigFullFilePath = 0;
   811             delete iDatabaseHandles[i].iTargetFullFilePath;
   870             delete iDatabaseHandles[i].iTargetFullFilePath;
   812             iDatabaseHandles[i].iDummyFilePath.Zero();
   871 			iDatabaseHandles[i].iTargetFullFilePath = 0;
   813 #endif //__RAMDISK_PERF_ENABLE 
   872 #endif //__RAMDISK_PERF_ENABLE 
   814             }
   873             }
   815 
   874 
   816         iDatabaseHandles.Reset();
   875         iDatabaseHandles.Reset();
   817         iDatabase.Close();
   876         iDatabase.Close();
   827     {
   886     {
   828     MPX_FUNC("CMPXDbManager::OpenAllDatabasesL");
   887     MPX_FUNC("CMPXDbManager::OpenAllDatabasesL");
   829 
   888 
   830     if (!iInitialized)
   889     if (!iInitialized)
   831         {
   890         {
   832         TDriveUnit cdrive(KRootDrive());
   891         OpenRootDatabaseL();
   833         OpenDatabaseL(cdrive);
       
   834         }
   892         }
   835 
   893 
   836     TInt count(iDatabaseHandles.Count());
   894     TInt count(iDatabaseHandles.Count());
   837     for (TInt i = 0; i < count; ++i)
   895     for (TInt i = 0; i < count; ++i)
   838         {
   896         {
   839         TVolumeInfo vol;
   897         TVolumeInfo vol;
   840         if (iFs.Volume(vol, iDatabaseHandles[i].iDrive) == KErrNone)
   898         if (iFs.Volume(vol, iDatabaseHandles[i].iDrive) == KErrNone)
   841             {
   899             {
   842             AttachDatabaseL(iDatabaseHandles[i].iDrive);
   900             AttachDatabaseL( i );
   843             }
   901             }
   844         }
   902         }
   845     iInitialized = ETrue;
   903     iInitialized = ETrue;
   846 
   904 
   847     // Close all prepared statements if a db is closed
   905     // Close all prepared statements if a db is closed
   935     if (iInitialized == EFalse)
   993     if (iInitialized == EFalse)
   936         {
   994         {
   937         User::Leave(KErrNotReady);
   995         User::Leave(KErrNotReady);
   938         }
   996         }
   939 
   997 
   940     TBool found(EFalse);
   998     TInt index = KErrNotFound;
   941 
   999 
   942     if (aDrive == EDriveC)
  1000     if (aDrive == EDriveC)
   943         {
  1001         {
   944         found = ETrue;
  1002         index = iDatabaseHandles.Count();
   945         }
  1003         }
   946     else
  1004     else
   947         {
  1005         {
   948         TInt count(iDatabaseHandles.Count());
  1006         TInt count(iDatabaseHandles.Count());
   949         for (TInt i = 0; i < count; ++i)
  1007         for (TInt i = 0; i < count; ++i)
   950             {
  1008             {
   951             if ((iDatabaseHandles[i].iDrive == aDrive) && (iDatabaseHandles[i].iOpen))
  1009             if ((iDatabaseHandles[i].iDrive == aDrive) && (iDatabaseHandles[i].iOpen))
   952                 {
  1010                 {
   953                 found = ETrue;
  1011                 index = i;
   954                 break;
  1012                 break;
   955                 }
  1013                 }
   956             }
  1014             }
   957         }
  1015         }
   958     if (found)
  1016     if ( index >= 0 )
   959         {
  1017         {
   960         HBufC * filename = CreateFilenameL(aDrive);
  1018         HBufC * filename = CreateFilenameL(aDrive);
   961         CleanupStack::PushL(filename);
  1019         CleanupStack::PushL(filename);
   962 
  1020 
   963         TRAPD(err, DoRecreateDatabaseL(filename));
  1021         TRAPD(err, DoRecreateDatabaseL(filename));
   976                 User::LeaveIfError(iDatabase.Open(*filename));
  1034                 User::LeaveIfError(iDatabase.Open(*filename));
   977                 iInitialized = ETrue;
  1035                 iInitialized = ETrue;
   978                 }
  1036                 }
   979             else
  1037             else
   980                 {
  1038                 {
   981                 DetachDatabaseL(drive_unit);
  1039                 DetachDatabaseL( index );
   982 
  1040 
   983                 RSqlDatabase::Delete(*filename);
  1041                 RSqlDatabase::Delete(*filename);
   984                 CreateDatabaseL(drive_unit);
  1042                 CreateDatabaseL(drive_unit);
   985 
  1043 
   986                 AttachDatabaseL(drive_unit);
  1044                 AttachDatabaseL( index );
   987                 }
  1045                 }
   988             }
  1046             }
   989 
  1047 
   990         CleanupStack::PopAndDestroy(filename);
  1048         CleanupStack::PopAndDestroy(filename);
   991         }
  1049         }
  1633 // Resets all prepared queries
  1691 // Resets all prepared queries
  1634 // ----------------------------------------------------------------------------
  1692 // ----------------------------------------------------------------------------
  1635 //
  1693 //
  1636 void CMPXDbManager::ResetPreparedQueries()
  1694 void CMPXDbManager::ResetPreparedQueries()
  1637     {
  1695     {
       
  1696     MPX_FUNC("CMPXDbManager::ResetPreparedQueries");
  1638     iPreparedStatements.Reset();
  1697     iPreparedStatements.Reset();
  1639 
  1698 
  1640     TInt c( iStatements.Count() );
  1699     TInt c( iStatements.Count() );
  1641     for( TInt i=0; i<c; ++i )
  1700     for( TInt i=0; i<c; ++i )
  1642         {
  1701         {
  1671         iTables[i]->CreateTableL(aDatabase, aCorrupt);
  1730         iTables[i]->CreateTableL(aDatabase, aCorrupt);
  1672         }
  1731         }
  1673 	}
  1732 	}
  1674 
  1733 
  1675 // ----------------------------------------------------------------------------
  1734 // ----------------------------------------------------------------------------
  1676 // Opens a specified database.
  1735 // Opens root database on C-drive
  1677 // ----------------------------------------------------------------------------
  1736 // ----------------------------------------------------------------------------
  1678 //
  1737 //
  1679 void CMPXDbManager::OpenDatabaseL(
  1738 void CMPXDbManager::OpenRootDatabaseL()
  1680     TDriveUnit aDrive)
  1739     {
  1681     {
  1740     MPX_FUNC("CMPXDbManager::OpenRootDatabaseL");
  1682     MPX_FUNC("CMPXDbManager::OpenDatabaseL");
  1741         TDriveUnit cdrive(KRootDrive());
  1683 
  1742     HBufC * filename = CreateFilenameL(cdrive);
  1684     HBufC * filename = CreateFilenameL(aDrive);
       
  1685     CleanupStack::PushL(filename);
  1743     CleanupStack::PushL(filename);
  1686     User::LeaveIfError(iDatabase.Open(filename->Des()));
  1744     User::LeaveIfError(iDatabase.Open(*filename));
  1687 
  1745 
  1688     CleanupStack::PopAndDestroy(filename);
  1746     CleanupStack::PopAndDestroy(filename);
  1689     }
  1747     }
  1690 
  1748 
  1691 // ----------------------------------------------------------------------------
  1749 // ----------------------------------------------------------------------------
  1742 
  1800 
  1743 // ----------------------------------------------------------------------------
  1801 // ----------------------------------------------------------------------------
  1744 // Attaches a specified database.
  1802 // Attaches a specified database.
  1745 // ----------------------------------------------------------------------------
  1803 // ----------------------------------------------------------------------------
  1746 //
  1804 //
  1747 void CMPXDbManager::AttachDatabaseL(
  1805 void CMPXDbManager::AttachDatabaseL( TInt aIndex )
  1748     TDriveUnit aDrive)
       
  1749     {
  1806     {
  1750     MPX_FUNC("CMPXDbManager::AttachDatabaseL");
  1807     MPX_FUNC("CMPXDbManager::AttachDatabaseL");
  1751 
  1808     ASSERT( aIndex < iDatabaseHandles.Count() );
  1752     TBool found(EFalse);
  1809     DatabaseHandle & database = iDatabaseHandles[ aIndex ];
  1753 
  1810     if (!database.iOpen)
  1754     TInt count(iDatabaseHandles.Count());
  1811         {
  1755     for (TInt i = 0; i < count; ++i)
  1812         HBufC* filename = CreateFilenameL( database.iDrive );
  1756         {
  1813         CleanupStack::PushL(filename);
  1757         if (iDatabaseHandles[i].iDrive == aDrive)
       
  1758             {
       
  1759             if (!iDatabaseHandles[i].iOpen)
       
  1760                 {
       
  1761                 HBufC* filename = CreateFilenameL(aDrive);
       
  1762                 CleanupStack::PushL(filename);
       
  1763                 
  1814                 
  1764 #ifdef __RAMDISK_PERF_ENABLE
  1815 #ifdef __RAMDISK_PERF_ENABLE
  1765                 if( iDatabaseHandles[i].iUseRAMdb )
  1816         if( database.iUseRAMdb )
  1766                     {
  1817             {
  1767                     delete iDatabaseHandles[i].iAliasname;
  1818             delete database.iAliasname;
  1768                     iDatabaseHandles[i].iAliasname = HBufC::NewL(KAliasName().Length());
  1819             database.iAliasname = HBufC::NewL(KAliasName().Length());
  1769                     HBufC* temp = HBufC::NewLC(2); // form of DE, DF, DX,...
  1820             HBufC* temp = HBufC::NewLC(2); // form of DE, DF, DX,...
  1770                     temp->Des().Append(iRAMDrive); // length == 2
  1821             temp->Des().Append(iRAMDrive); // length == 2
  1771                     TDriveUnit pdrive(aDrive);
  1822             TDriveUnit pdrive( database.iDrive );
  1772                     temp->Des().Append(pdrive.Name().Left(1)); //length == 2+ 1
  1823             temp->Des().Append(pdrive.Name().Left(1)); //length == 2+ 1
  1773                     iDatabaseHandles[i].iAliasname->Des().Format(KRAMAliasName, temp);
  1824             database.iAliasname->Des().Format(KRAMAliasName, temp);
  1774                     MPX_DEBUG2("CMPXDbManager::AttachDatabaseL - RAM change aliasname of %S", iDatabaseHandles[i].iAliasname );
  1825             MPX_DEBUG2("CMPXDbManager::AttachDatabaseL - RAM change aliasname of %S", database.iAliasname );
  1775                     CleanupStack::PopAndDestroy(temp);
  1826             CleanupStack::PopAndDestroy(temp);
  1776                     }
  1827             }
  1777                 else
  1828         else
  1778 #endif //__RAMDISK_PERF_ENABLE
  1829 #endif //__RAMDISK_PERF_ENABLE
  1779                    {
  1830             {
  1780                    delete iDatabaseHandles[i].iAliasname;
  1831             delete database.iAliasname;
  1781                    TDriveUnit drive(aDrive);
  1832             TDriveUnit drive( database.iDrive );
  1782                    const TDesC& driveName = drive.Name();
  1833             const TDesC& driveName = drive.Name();
  1783                    iDatabaseHandles[i].iAliasname = HBufC::NewL(KAliasName().Length());
  1834             database.iAliasname = HBufC::NewL(KAliasName().Length());
  1784                    iDatabaseHandles[i].iAliasname->Des().Format(KAliasName, &driveName);
  1835             database.iAliasname->Des().Format(KAliasName, &driveName);
  1785                    MPX_DEBUG2("CMPXDbManager::AttachDatabaseL - normal change aliasname of %S", iDatabaseHandles[i].iAliasname);
  1836             MPX_DEBUG2("CMPXDbManager::AttachDatabaseL - normal change aliasname of %S", database.iAliasname);
  1786                    }
  1837             }
  1787 
  1838 
  1788                 TInt err = iDatabase.Attach(filename->Des(), *(iDatabaseHandles[i].iAliasname));
  1839         TInt err = iDatabase.Attach( *filename, *database.iAliasname );
  1789                 MPX_DEBUG2("CMPXDbManager::AttachDatabaseL - Attach Error =%d", err);
  1840         MPX_DEBUG2("CMPXDbManager::AttachDatabaseL - Attach Error =%d", err);
  1790                 User::LeaveIfError(err);
  1841         User::LeaveIfError(err);
  1791                 iDatabaseHandles[i].iOpen = ETrue;
  1842         database.iOpen = ETrue;
  1792 
  1843 
  1793                 CleanupStack::PopAndDestroy(filename);
  1844         CleanupStack::PopAndDestroy(filename);
  1794                 }
  1845         }
  1795             else
  1846     else
  1796                 {
  1847         {
  1797                 MPX_DEBUG1("CMPXDbManager::AttachDatabaseL - found already open");    
  1848         MPX_DEBUG1("CMPXDbManager::AttachDatabaseL - found already open");    
  1798                 }
       
  1799             
       
  1800             found = ETrue;
       
  1801             break;
       
  1802             }
       
  1803         }
       
  1804     if (!found)
       
  1805         {
       
  1806         MPX_DEBUG1("CMPXDbManager::AttachDatabaseL - not found");
       
  1807         User::Leave(KErrNotFound);
       
  1808         }
  1849         }
  1809     }
  1850     }
  1810 
  1851 
  1811 // ----------------------------------------------------------------------------
  1852 // ----------------------------------------------------------------------------
  1812 // Detaches a specified database.
  1853 // Detaches a specified database.
  1813 // ----------------------------------------------------------------------------
  1854 // ----------------------------------------------------------------------------
  1814 //
  1855 //
  1815 void CMPXDbManager::DetachDatabaseL(
  1856 void CMPXDbManager::DetachDatabaseL( TInt aIndex )
  1816     TDriveUnit aDrive)
       
  1817     {
  1857     {
  1818     MPX_FUNC("CMPXDbManager::DetachDatabaseL");
  1858     MPX_FUNC("CMPXDbManager::DetachDatabaseL");
  1819 
  1859 
  1820     ASSERT(iInitialized);
  1860     ASSERT( iInitialized && aIndex < iDatabaseHandles.Count() );
  1821     TBool found(EFalse);
  1861     DatabaseHandle & database = iDatabaseHandles[ aIndex ];
  1822 
  1862     if ( database.iOpen )
  1823     TInt count(iDatabaseHandles.Count());
  1863         {
  1824     for (TInt i = 0; i < count; ++i)
  1864         MPX_DEBUG2("CMPXDbManager::DetachDatabaseL iAliasname=%S is open",database.iAliasname );
  1825         {
  1865         TInt err = iDatabase.Detach(*(database.iAliasname));
  1826         if (iDatabaseHandles[i].iDrive == aDrive)
  1866         if ( err )
  1827             {
  1867             {
  1828 #ifdef __RAMDISK_PERF_ENABLE
  1868             MPX_DEBUG2("CMPXDbManager::DetachDatabaseL detach failed Error=%d", err);
  1829             if ( iDatabaseHandles[i].iOpen || iDatabaseHandles[i].iUseRAMdb )
  1869             }
  1830 #else //__RAMDISK_PERF_ENABLE
  1870         User::LeaveIfError(err);
  1831             if ( iDatabaseHandles[i].iOpen )
  1871         database.iOpen = EFalse;
  1832 #endif //__RAMDISK_PERF_ENABLE
       
  1833 
       
  1834                 {
       
  1835                 MPX_DEBUG1("CMPXDbManager::DetachDatabaseL found drive that is opening");
       
  1836                 TInt err = iDatabase.Detach(*(iDatabaseHandles[i].iAliasname));
       
  1837                 if ( err )
       
  1838                     {
       
  1839                     MPX_DEBUG2("CMPXDbManager::DetachDatabaseL detach failed Error=%d", err);
       
  1840                     }
       
  1841                 else
       
  1842                     {
       
  1843                     MPX_DEBUG2("CMPXDbManager::DetachDatabaseL iAliasname=%S", iDatabaseHandles[i].iAliasname);
       
  1844                     }
       
  1845                 User::LeaveIfError(err);
       
  1846                 iDatabaseHandles[i].iOpen = EFalse;
       
  1847                 }
       
  1848 
       
  1849             found = ETrue;
       
  1850             break;
       
  1851             }
       
  1852         }
       
  1853     if (!found)
       
  1854         {
       
  1855         MPX_DEBUG1("CMPXDbManager::DetachDatabaseL drive not found in iDatabaseHandlers");
       
  1856         User::Leave(KErrNotFound);
       
  1857         }
  1872         }
  1858     }
  1873     }
  1859 
  1874 
  1860 // ----------------------------------------------------------------------------
  1875 // ----------------------------------------------------------------------------
  1861 // Creates the absolute database filename on a specified drive.
  1876 // Creates the absolute database filename on a specified drive.
  1879         TFileName path;
  1894         TFileName path;
  1880         path.Append(iRAMDrive);
  1895         path.Append(iRAMDrive);
  1881         path.Append(_L(":"));
  1896         path.Append(_L(":"));
  1882         TBuf<2> d;
  1897         TBuf<2> d;
  1883         d.Append(aDrive.Name());
  1898         d.Append(aDrive.Name());
  1884         HBufC* temp = HBufC::NewLC(KMaxFileName);
  1899         TFileName temp;
  1885         temp->Des().Append(d.Left(1)); // attach original drive name
  1900         temp.Append(d.Left(1)); // attach original drive name
  1886         temp->Des().Append(iDbFile->Des()); 
  1901         temp.Append(iDbFile->Des()); 
  1887         filename->Des().Format(securefilePath, &path, User::Identity().iUid, temp);
  1902         filename->Des().Format(securefilePath, &path, User::Identity().iUid, &temp);
  1888         MPX_DEBUG3("CMPXDbManager::CreateFilenameL - path=%S filename=%S", &path, filename);
  1903         MPX_DEBUG3("CMPXDbManager::CreateFilenameL - path=%S filename=%S", &path, filename);
  1889         CleanupStack::PopAndDestroy(temp);
       
  1890         }
  1904         }
  1891     else
  1905     else
  1892 #endif //__RAMDISK_PERF_ENABLE
  1906 #endif //__RAMDISK_PERF_ENABLE
  1893         {
  1907         {
  1894         MPX_DEBUG1("CMPXDbManager::CreateFilenameL - use normal drive");
  1908         MPX_DEBUG1("CMPXDbManager::CreateFilenameL - use normal drive");
  1895         const TDesC& driveName = aDrive.Name();
  1909         const TDesC& driveName = aDrive.Name();
  1896         filename->Des().Format(securefilePath, &driveName, User::Identity().iUid, iDbFile);
  1910         filename->Des().Format(securefilePath, &driveName, User::Identity().iUid, iDbFile);
  1897 
       
  1898         }
  1911         }
  1899     
  1912     
  1900     MPX_DEBUG2("CMPXDbManager::CreateFilenameL filename = %S", filename); 
  1913     MPX_DEBUG2("CMPXDbManager::CreateFilenameL filename = %S", filename); 
  1901     return filename;
  1914     return filename;
  1902     }
  1915     }
  2050             err = RSqlDatabase::Delete(*filename);
  2063             err = RSqlDatabase::Delete(*filename);
  2051             MPX_DEBUG2("RegenerateAllDatabasesL: Deleted[err=%d]; Creating new DB",err);
  2064             MPX_DEBUG2("RegenerateAllDatabasesL: Deleted[err=%d]; Creating new DB",err);
  2052             TDriveUnit drive(iDatabaseHandles[i].iDrive);
  2065             TDriveUnit drive(iDatabaseHandles[i].iDrive);
  2053             CreateDatabaseL(drive);
  2066             CreateDatabaseL(drive);
  2054             MPX_DEBUG1("RegenerateAllDatabasesL: Attaching new DB");
  2067             MPX_DEBUG1("RegenerateAllDatabasesL: Attaching new DB");
  2055             AttachDatabaseL(drive);    
  2068             AttachDatabaseL( i );    
  2056             MPX_DEBUG1("RegenerateAllDatabasesL: DB regeneration complete");
  2069             MPX_DEBUG1("RegenerateAllDatabasesL: DB regeneration complete");
  2057             CleanupStack::PopAndDestroy(filename);
  2070             CleanupStack::PopAndDestroy(filename);
  2058             }
  2071             }
  2059         else
  2072         else
  2060             {
  2073             {
  2603 
  2616 
  2604 // ---------------------------------------------------------------------------
  2617 // ---------------------------------------------------------------------------
  2605 // CMPXDbManager::BlockDiskSpaceL
  2618 // CMPXDbManager::BlockDiskSpaceL
  2606 // ---------------------------------------------------------------------------
  2619 // ---------------------------------------------------------------------------
  2607 //
  2620 //
  2608 TBool CMPXDbManager::BlockDiskSpace( TDriveUnit aDrive, TInt aOrigDbSize, TBool aIsMTPInUse )
  2621 TBool CMPXDbManager::BlockDiskSpace( TInt aIndex, TBool aIsMTPInUse )
  2609     {
  2622     {
  2610 #ifdef __RAMDISK_PERF_ENABLE
  2623 #ifdef __RAMDISK_PERF_ENABLE
  2611 
  2624 
  2612     MPX_DEBUG2("-->CMPXDbManager::BlockDiskSpaceL %d", (TInt)aDrive );
  2625     MPX_DEBUG2("-->CMPXDbManager::BlockDiskSpaceL %d", aIndex );
  2613     
  2626     DatabaseHandle & database = iDatabaseHandles[aIndex];    
  2614     // if current DB size can not fit in RAM, abort now
  2627     // if current DB size can not fit in RAM, abort now
  2615     TInt ramDrive;
  2628     TInt ramDrive;
  2616     RFs::CharToDrive(iRAMDrive, ramDrive);
  2629     RFs::CharToDrive(iRAMDrive, ramDrive);
  2617     TVolumeInfo vol;
  2630     TVolumeInfo vol;
  2618     TInt err = iFs.Volume( vol, ramDrive );
  2631     TInt err = iFs.Volume( vol, ramDrive );
  2619     if ( vol.iFree <= aOrigDbSize + KMPMinimumRAMSizeToRun )
  2632     TEntry origDb;
       
  2633     iFs.Entry( *database.iOrigFullFilePath, origDb );
       
  2634     if ( vol.iFree <= origDb.iSize + KMPMinimumRAMSizeToRun )
  2620         {
  2635         {
  2621         MPX_DEBUG1("-->CMPXDbManager::BlockDiskSpaceL Not enough even for copy original DB file, leave" );
  2636         MPX_DEBUG1("-->CMPXDbManager::BlockDiskSpaceL Not enough even for copy original DB file, leave" );
  2622         return EFalse;
  2637         return EFalse;
  2623         }
  2638         }
  2624 
  2639 
  2625     // ensure you have the disk volume and database
  2640     // ensure you have the disk volume and database
  2626     err = iFs.Volume( vol, (TInt)aDrive );
  2641     err = iFs.Volume( vol, database.iDrive );
  2627     if (err != KErrNone) 
  2642     if (err != KErrNone) 
  2628         {
  2643         {
  2629         MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Volume not available on drive %d", (TInt)aDrive);
  2644         MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Volume not available on drive %d", database.iDrive);
  2630         return EFalse;
       
  2631         }
       
  2632 
       
  2633     TInt index( GetDatabaseIndex((TInt)aDrive) );
       
  2634     if (index < 0) 
       
  2635         {
       
  2636         MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Database not available for drive %d", (TInt)aDrive);
       
  2637         return EFalse;
  2645         return EFalse;
  2638         }
  2646         }
  2639 
  2647 
  2640     // Check if the drive has enough space to block
  2648     // Check if the drive has enough space to block
  2641     MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Disk total free space in bytes =%Lu", vol.iFree);
  2649     MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Disk total free space in bytes =%Lu", vol.iFree);
  2642     TInt64 blockingSize( CalculateInitalDummyDBSize( vol, aOrigDbSize, aIsMTPInUse ));
  2650     TInt64 blockingSize( CalculateInitalDummyDBSize( vol, origDb.iSize, aIsMTPInUse ));
  2643     MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Disk blocking size =%Lu", blockingSize);
  2651     MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Disk blocking size =%Lu", blockingSize);
  2644     if ( vol.iFree <= blockingSize + 1*KMPMegaByte )
  2652     if ( vol.iFree <= blockingSize + 1*KMPMegaByte )
  2645         {
  2653         {
  2646         MPX_DEBUG1("CMPXDbManager::BlockDiskSpaceL NOk to block");
  2654         MPX_DEBUG1("CMPXDbManager::BlockDiskSpaceL NOk to block");
  2647         return EFalse;
  2655         return EFalse;
  2648         }
  2656         }
  2649 
  2657 
  2650     // Create and resize the dummy file
  2658     // Create and resize the dummy file
  2651     TFileName dummyDbFileName; 
       
  2652     TChar ch;
  2659     TChar ch;
  2653     RFs::DriveToChar((TInt)aDrive, ch );
  2660     RFs::DriveToChar(database.iDrive, ch );
  2654     dummyDbFileName.Format( KDummyDbFile, (TUint)ch);
  2661     database.iDummyFilePath.Format( KDummyDbFile, (TUint)ch);
  2655     RFile dummyDb;
  2662     RFile dummyDb;
  2656     err = dummyDb.Replace( iFs, dummyDbFileName, EFileWrite );
  2663     err = dummyDb.Replace( iFs, database.iDummyFilePath, EFileWrite );
  2657     if (err != KErrNone) 
  2664     if (err != KErrNone) 
  2658         {
  2665         {
  2659         MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Can't open dummy file %d", err);
  2666         MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Can't open dummy file %d", err);
       
  2667         database.iDummyFilePath.Zero();
  2660         return EFalse;
  2668         return EFalse;
  2661         }
  2669         }
  2662     err = dummyDb.SetSize( blockingSize );
  2670     err = dummyDb.SetSize( blockingSize );
  2663     if ( err )
  2671     if ( err )
  2664         {
  2672         {
  2665         MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Can't resize dummy file %d", err);
  2673         MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Can't resize dummy file %d", err);
  2666         dummyDb.Close();
  2674         dummyDb.Close();
       
  2675         RemoveDummyFile(aIndex);
  2667         return EFalse;
  2676         return EFalse;
  2668         }
  2677         }
  2669 
  2678 
  2670     dummyDb.Close();
  2679     dummyDb.Close();
  2671     MPX_DEBUG1("CMPXDbManager::BlockDiskSpaceL Ok to block");
  2680     MPX_DEBUG1("CMPXDbManager::BlockDiskSpaceL Ok to block");
  2672 
       
  2673     iDatabaseHandles[index].iDummyFilePath.Copy(dummyDbFileName);
       
  2674     MPX_DEBUG1("<--CMPXDbManager::BlockDiskSpace");
  2681     MPX_DEBUG1("<--CMPXDbManager::BlockDiskSpace");
  2675 
  2682 
  2676     return ETrue;
  2683     return ETrue;
  2677 #else
  2684 #else
  2678     return EFalse;
  2685     return EFalse;
  2885         }
  2892         }
  2886     
  2893     
  2887     TInt count(iDatabaseHandles.Count());
  2894     TInt count(iDatabaseHandles.Count());
  2888     for (TInt i = 0; i < count && iDatabaseHandles[i].iUseRAMdb ; ++i)
  2895     for (TInt i = 0; i < count && iDatabaseHandles[i].iUseRAMdb ; ++i)
  2889         {
  2896         {
  2890         CloseDatabaseL( iDatabaseHandles[i].iDrive );            
  2897         CloseDatabaseAtIndexL( i );            
  2891 
  2898 
  2892         TInt err= BaflUtils::CopyFile(iFs, 
  2899         TInt err= BaflUtils::CopyFile(iFs, 
  2893             iDatabaseHandles[i].iTargetFullFilePath->Des(), 
  2900             iDatabaseHandles[i].iTargetFullFilePath->Des(), 
  2894             iDatabaseHandles[i].iOrigFullFilePath->Des());
  2901             iDatabaseHandles[i].iOrigFullFilePath->Des());
  2895 
  2902 
  2896         MPX_DEBUG2("CMPXDbManager::BackupDBsL err = %d", err);     
  2903         MPX_DEBUG2("CMPXDbManager::BackupDBsL err = %d", err);     
  2897 
  2904 
  2898         OpenDatabaseL( iDatabaseHandles[i].iDrive );      
  2905         OpenDatabaseAtIndexL( i );      
  2899         }
  2906         }
  2900         
  2907         
  2901     if (transactionCount > 0) 
  2908     if (transactionCount > 0) 
  2902         {
  2909         {
  2903         DoBeginL();
  2910         DoBeginL();
  3001     MPX_DEBUG2("CMPXDbManager::GetTotalRamDatabasesSize - Total Size of Dbs = %d", size);
  3008     MPX_DEBUG2("CMPXDbManager::GetTotalRamDatabasesSize - Total Size of Dbs = %d", size);
  3002 #endif //__RAMDISK_PERF_ENABLE    
  3009 #endif //__RAMDISK_PERF_ENABLE    
  3003     MPX_DEBUG2("CMPXDbManager::GetTotalRamDatabasesSize - Return err = %d", err);
  3010     MPX_DEBUG2("CMPXDbManager::GetTotalRamDatabasesSize - Return err = %d", err);
  3004     return err;
  3011     return err;
  3005     }
  3012     }
  3006     
  3013 
       
  3014 // ----------------------------------------------------------------------------
       
  3015 // Creates the absolute database filename on a specified drive.
       
  3016 // ----------------------------------------------------------------------------
       
  3017 //
       
  3018 HBufC* CMPXDbManager::CreateFullFilenameL(TDriveUnit aDrive)
       
  3019     {
       
  3020     MPX_FUNC("CMPXDbManager::CreateFullFilenameL");
       
  3021 
       
  3022     HBufC* filename = HBufC::NewL(KMaxFileName);
       
  3023     const TDesC& securefilePath = KSecureFilePath;
       
  3024     TDriveUnit cdrive(KRootDrive());
       
  3025 
       
  3026 #ifdef __RAMDISK_PERF_ENABLE
       
  3027     TInt index(GetDatabaseIndex((TInt)aDrive));    
       
  3028     if ( index >=0 && iDatabaseHandles[index].iUseRAMdb && aDrive != cdrive )
       
  3029         {
       
  3030         MPX_DEBUG1("CMPXDbManager::CreateFullFilenameL - use RAMDisk");
       
  3031         TFileName path;
       
  3032         path.Append(iRAMDrive);
       
  3033         path.Append(_L(":"));
       
  3034         path.Append(KDBFilePath);
       
  3035         TBuf<2> d;
       
  3036         d.Append(aDrive.Name());
       
  3037         TFileName temp;
       
  3038         temp.Append(d.Left(1)); // attach original drive name
       
  3039         temp.Append(iDbFile->Des()); 
       
  3040         filename->Des().Format(securefilePath, &path, User::Identity().iUid, &temp);
       
  3041         MPX_DEBUG3("CMPXDbManager::CreateFullFilenameL - path=%S filename=%S", &path, filename);
       
  3042         }
       
  3043     else
       
  3044 #endif //__RAMDISK_PERF_ENABLE
       
  3045         {
       
  3046         MPX_DEBUG1("CMPXDbManager::CreateFullFilenameL - use normal drive");
       
  3047         TFileName dbPath;
       
  3048         dbPath.Append(aDrive.Name());
       
  3049         dbPath.Append(KDBFilePath);
       
  3050         filename->Des().Format(securefilePath, &dbPath, User::Identity().iUid, iDbFile);
       
  3051         }
       
  3052     
       
  3053     MPX_DEBUG2("CMPXDbManager::CreateFullFilenameL filename = %S", filename); 
       
  3054     return filename;
       
  3055     }
       
  3056 
  3007 // End of File
  3057 // End of File