diff -r 000000000000 -r a2952bb97e68 mmappcomponents/harvester/filehandler/src/mpxharvesterdbtable.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmappcomponents/harvester/filehandler/src/mpxharvesterdbtable.cpp Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,554 @@ +/* +* 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: Encapsulates operations on a table in the db +* +*/ + + +#include +#include +#include "mpxharvesterdbtable.h" +#include "mpxdbcommon.h" +#include "mpxharvesterdbitem.h" + +const TInt KStringLength = 300; + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CMPXHarvesterDatabaseTable::CMPXHarvesterDatabaseTable( RDbStoreDatabase& aDb ) + : iDb( aDb ), + iState( EInvalidState ) + { + } + +// --------------------------------------------------------------------------- +// Two-Phased Constructor +// --------------------------------------------------------------------------- +// +CMPXHarvesterDatabaseTable* CMPXHarvesterDatabaseTable::NewLC( + RDbStoreDatabase& aDb ) + { + CMPXHarvesterDatabaseTable* self = + new( ELeave ) CMPXHarvesterDatabaseTable( aDb ); + CleanupStack::PushL( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// destructor +// --------------------------------------------------------------------------- +// +CMPXHarvesterDatabaseTable::~CMPXHarvesterDatabaseTable() + { + iView.Close(); + } + +// --------------------------------------------------------------------------- +// Open the Table to list all files in the db +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseTable::OpenAllFilesTableL() + { + MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenAllFilesTableL <---"); + + // Close old view just in case + iView.Close(); + + // Open all files query + // select * from files + // + TBuf query; + query.Append( KSelectAll ); + query.Append( KHarvesterMainTable ); + + // Open the view + User::LeaveIfError( iView.Prepare( iDb, query ) ); + User::LeaveIfError( iView.Evaluate() ); + + iState = EAllItems; + + MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenAllFilesTableL --->"); + } + +// --------------------------------------------------------------------------- +// Open the Table to a specific directory ( drive:\\path ) +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseTable::OpenDirectoryL( const TDesC& aDirectory ) + { + MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenDirectoryL <---"); + + // Close old view just in case + iView.Close(); + + HBufC* buffer = HBufC::NewLC(KStringLength); // 255 file path + 45 for single quotes + // magic, this would break if we have > + // 45 single quotes in a file name. + TParsePtrC parse( aDirectory ); + TPtr ptr = buffer->Des(); + FindAndReplaceSingleQuote( parse.DriveAndPath(), ptr ); + + // Open all files query + // select * from files where filepath='aDirectory' + // + TBuf query; + query += KSelectAll; + query += KHarvesterMainTable; + query += KWhere; + query += KHarPathName; + query += KLike; + query += KItemBracket; + query += ptr; + query += KWildcard; + query += KItemBracket; + + // Open the view + TDbQuery sqlQuery( query, EDbCompareFolded ); + User::LeaveIfError( iView.Prepare( iDb, sqlQuery ) ); + User::LeaveIfError( iView.Evaluate() ); + + iState = EDirectory; + CleanupStack::PopAndDestroy(buffer); + MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenDirectoryL --->"); + } + +// --------------------------------------------------------------------------- +// Open the Table to a specific song view +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseTable::OpenItemL( const TDesC& aSongName ) + { + MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenItemL <---"); + + // Close old view just in case + iView.Close(); + + HBufC* buffer = HBufC::NewLC(KStringLength); // 255 file path + 45 for single quotes + // magic, this would break if we have > 45 single quotes in a file name. + TPtr ptr = buffer->Des(); + // Open all files query + // select * from files where path='path' AND filename='aSongName' + // + TParsePtrC parse( aSongName ); + TBuf query; + query += KSelectAll; + query += KHarvesterMainTable; + query += KWhere; + query += KHarFileName; + query += KEquals; + query += KItemBracket; + ptr.Copy( KNullDesC ); + FindAndReplaceSingleQuote( parse.NameAndExt(), ptr ); + query += ptr; + query += KItemBracket; + query += KAnd; + query += KHarPathName; + query += KEquals; + query += KItemBracket; + ptr.Copy( KNullDesC ); + FindAndReplaceSingleQuote( parse.DriveAndPath(), ptr ); + query += ptr; + query += KItemBracket; + + // Open the view + TDbQuery sqlQuery( query, EDbCompareFolded ); + User::LeaveIfError( iView.Prepare( iDb, sqlQuery ) ); + User::LeaveIfError( iView.Evaluate() ); + + iState = EFile; + CleanupStack::PopAndDestroy( buffer ); + MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenItemL --->"); + } + +// --------------------------------------------------------------------------- +// Open a table to list of files with DRM flag set. +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseTable::OpenDrmL() + { + MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenDrmL <---"); + + // Close old view just in case + iView.Close(); + + HBufC* buffer = HBufC::NewLC(KStringLength); // 255 file path + 45 for single quotes + // magic, this would break if we have > 45 single quotes in a file name. + TPtr ptr = buffer->Des(); + // Open all files query + // select * from files where path='path' AND filename='aSongName' + // + TBuf query; + query += KSelectAll; + query += KHarvesterMainTable; + query += KWhere; + query += KHarItemDRM; + query += KEquals; + query += KOn; + + // Open the view + TDbQuery sqlQuery( query, EDbCompareFolded ); + User::LeaveIfError( iView.Prepare( iDb, sqlQuery ) ); + User::LeaveIfError( iView.Evaluate() ); + + iState = EDrm; + CleanupStack::PopAndDestroy( buffer ); + MPX_DEBUG1("CMPXHarvesterDatabaseTable::OpenDrmL --->"); + } + +// --------------------------------------------------------------------------- +// Delete the item pointed to at the current row +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseTable::DeleteItemL(TBool aEndTransaction) + { + MPX_DEBUG1("CMPXHarvesterDatabaseTable::DeleteItemL <---"); + +#ifdef __PRINTDB__ + PrintItemsInTableL(); +#endif //__PRINTDB__ + + if (!iDb.InTransaction()) + { + iDb.Begin(); + } + // Safe row update + TBool found = iView.FirstL(); + if( !found ) + { + if ( aEndTransaction ) + { + iDb.Commit(); + } + User::Leave(KErrNotFound); + } + iView.GetL(); + + TRAPD( err, iView.DeleteL() ); + if( err != KErrNone ) + { + iView.Cancel(); + if ( aEndTransaction ) + { + iDb.Commit(); + } + User::Leave( err ); + } + if ( aEndTransaction ) + { + iDb.Commit(); + } + // DB Compaction + struct RDbDatabase::TSize size = iDb.Size(); + const TInt waterMark = 60; + if (size.iUsage <= waterMark) + { + MPX_DEBUG1( "Compacting DB" ); + iDb.Compact(); + } + + MPX_DEBUG1("CMPXHarvesterDatabaseTable::DeleteItemL --->"); + } + +// --------------------------------------------------------------------------- +// Return the number of rows in the current view +// --------------------------------------------------------------------------- +// +TInt CMPXHarvesterDatabaseTable::CountL() + { + return iView.CountL(); + } + +// --------------------------------------------------------------------------- +// Add an item to the table +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseTable::AddItemL( const TDesC& aPath, + const TDesC& aFileName, + const TTime aLastModTime, + const TInt aColId, + const TBool aDRM ) + { + MPX_DEBUG1("CMPXHarvesterDatabaseTable::AddItemL <---"); + + // Add the item into the db + iView.InsertL(); + iView.SetColL( KHarPathNameColumn, aPath ); + iView.SetColL( KHarFileNameColumn, aFileName ); + iView.SetColL( KHarModTimeColumn, aLastModTime ); + iView.SetColL( KHarColDBIDColumn, aColId ); + iView.SetColL( KHarDRMColumn, (TUint) aDRM ); + + // Safe update to database + TRAPD( err, iView.PutL() ); + if( KErrNone != err ) + { + iView.Cancel(); + User::Leave( err ); + } + +#ifdef __PRINTDB__ + PrintItemsInTableL(); +#endif //__PRINTDB__ + + MPX_DEBUG1("CMPXHarvesterDatabaseTable::AddItemL --->"); + } + +// --------------------------------------------------------------------------- +// Update the current row with the updated info +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseTable::UpdateItemL( const TDesC& /*aPath*/, + const TTime aLastModTime, + const TInt aColId, + const TBool aDrm, + TBool aNewTransaction ) + { + // Safe row update + // + TBool newTransaction = aNewTransaction && !iDb.InTransaction(); + if ( newTransaction ) + { + iDb.Begin(); + } + TBool valid = iView.FirstL(); + if( valid ) + { + iView.UpdateL(); + iView.SetColL( KHarModTimeColumn, aLastModTime ); + iView.SetColL( KHarColDBIDColumn, aColId ); + iView.SetColL( KHarDRMColumn, (TUint) aDrm ); + } + else + { + if( newTransaction ) + { + iDb.Commit(); + } + User::Leave( KErrNotFound ); + } + + TRAPD( err, iView.PutL() ); + if( err != KErrNone ) + { + iView.Cancel(); + if ( newTransaction ) + { + iDb.Commit(); + } + User::Leave( err ); + } + if ( newTransaction ) + { + iDb.Commit(); + } + + // DB Compaction + struct RDbDatabase::TSize size = iDb.Size(); + const TInt waterMark = 60; + if (size.iUsage <= waterMark) + { + if ( newTransaction ) + { + MPX_DEBUG1( "Compacting DB" ); + iDb.Compact(); + } + } + } + +// --------------------------------------------------------------------------- +// Update the current row with the updated info +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseTable::UpdateItemL( const TTime aLastModTime, + const TInt aColId, + TBool aNewTransaction, + const TDesC& aPath ) + { + // Safe row update + // + TBool newTransaction = aNewTransaction && !iDb.InTransaction(); + if( iView.FirstL() ) + { + if ( newTransaction ) + { + iDb.Begin(); + } + iView.UpdateL(); + if ( aPath != KNullDesC ) + { + TParsePtrC parser( aPath ); + iView.SetColL( KHarPathNameColumn, parser.DriveAndPath() ); + iView.SetColL( KHarFileNameColumn, parser.NameAndExt() ); + } + iView.SetColL( KHarModTimeColumn, aLastModTime ); + if ( aColId != KNullUid.iUid ) + { + iView.SetColL( KHarColDBIDColumn, aColId ); + } + } + else + { + User::Leave( KErrNotFound ); + } + + TRAPD( err, iView.PutL() ); + if( err != KErrNone ) + { + iView.Cancel(); + if ( newTransaction ) + { + iDb.Commit(); + } + + User::Leave( err ); + } + if ( newTransaction ) + { + iDb.Commit(); + } + + // DB Compaction + struct RDbDatabase::TSize size = iDb.Size(); + const TInt waterMark = 60; + if (size.iUsage <= waterMark) + { + if ( newTransaction ) + { + MPX_DEBUG1( "Compacting DB" ); + iDb.Compact(); + } + } + } + +// --------------------------------------------------------------------------- +// Local function to cleanup an array +// --------------------------------------------------------------------------- +// +static void CleanupArray( TAny* item ) + { + ((RPointerArray*) item )->ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// Create an array representing the table that is generated +// --------------------------------------------------------------------------- +// +RPointerArray* CMPXHarvesterDatabaseTable::CreateTableRepresentationL() + { + MPX_DEBUG1("CMPXHarvesterDatabaseTable::CreateTableRepresentationL <---"); + + RPointerArray* array = + new (ELeave) RPointerArray; + CleanupStack::PushL( TCleanupItem( CleanupArray, array) ); + + for (iView.FirstL();iView.AtRow();iView.NextL()) + { + // Retrieve the row + iView.GetL(); + + CMPXHarvesterDbItem* item = new(ELeave) CMPXHarvesterDbItem(); + CleanupStack::PushL( item ); + + // Setup the item + HBufC* filepath = ReadLongTextLC( KHarPathNameColumn ); + HBufC* songname = ReadLongTextLC( KHarFileNameColumn ); + item->iFile = HBufC::NewL( filepath->Length() + songname->Length() ); + TPtr buf = item->iFile->Des(); + buf.Append( *filepath ); + buf.Append( *songname ); + CleanupStack::PopAndDestroy( 2, filepath ); + + item->iLastModifiedTime = iView.ColTime( KHarModTimeColumn ); + item->iColId = iView.ColInt( KHarColDBIDColumn ); + item->iDrm = iView.ColUint( KHarDRMColumn ); + + User::LeaveIfError( array->InsertInOrderAllowRepeats( item, + CMPXHarvesterDbItem::Compare ) ); + CleanupStack::Pop( item ); + } + + CleanupStack::Pop(); // cleanup + MPX_DEBUG1("CMPXHarvesterDatabaseTable::CreateTableRepresentationL --->"); + return array; + } + +// --------------------------------------------------------------------------- +// Read out the text at the current row and at a specific column +// --------------------------------------------------------------------------- +// +HBufC* CMPXHarvesterDatabaseTable::ReadLongTextLC( TInt aColumn ) + { + TInt len = iView.ColLength( aColumn ); + + HBufC* buf = HBufC::NewLC(len); + TPtr value( buf->Des() ); + if ( len>0 ) + { + RDbColReadStream strm; + strm.OpenLC(iView, aColumn ); + strm.ReadL( value, len ); + strm.Close(); + CleanupStack::PopAndDestroy( &strm ); + } + return buf; + } + +// --------------------------------------------------------------------------- +// Fixes single quote query issues +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseTable::FindAndReplaceSingleQuote(const TDesC& aSrc, + TDes& aTrg) + { + + TPtrC ch; + + TInt srcLen = aSrc.Length(); + + for (TInt i = 0; i < srcLen; ++i) + { + ch.Set(&aSrc[i], 1); + aTrg.Append(ch); + if ( ch.CompareF(_L("'")) == 0) + { + aTrg.Append(ch); + } + } + } + +#ifdef __PRINTDB__ +// --------------------------------------------------------------------------- +// Print out all items in the current table +// --------------------------------------------------------------------------- +// +void CMPXHarvesterDatabaseTable::PrintItemsInTableL() + { + for (iView.FirstL();iView.AtRow();iView.NextL()) + { + // Retrieve the row + iView.GetL(); + + // Print out each row + HBufC* filepath = ReadLongTextLC( KHarPathNameColumn ); + HBufC* songname = ReadLongTextLC( KHarFileNameColumn ); + TTime time = iView.ColTime( KHarModTimeColumn ); + MPX_DEBUG4("Filepath: %S Filename:%S Time %i", filepath, songname, time.Int64() ); + CleanupStack::PopAndDestroy( 2, filepath ); + } + } +#endif // __PRINTDB__ +