diff -r b73a2e62868f -r 6dfc5f825351 metadataengine/server/src/mdssqlobjectmanipulate.cpp --- a/metadataengine/server/src/mdssqlobjectmanipulate.cpp Tue Feb 02 00:24:33 2010 +0200 +++ b/metadataengine/server/src/mdssqlobjectmanipulate.cpp Fri Mar 19 09:38:01 2010 +0200 @@ -191,21 +191,18 @@ void CMdSSqlObjectManipulate::ConstructL( ) { - iGenerator = CMdSIdentifierGenerator::NewL(); iNamespaceDef = NULL; - TLockBuffer lockBuffer; - lockBuffer.iLock = EFalse; for (TInt i = 0; i < KMaxBuffers; ++i) { - CMdsClauseBuffer* buffer = CMdsClauseBuffer::NewLC( 1024 ); - lockBuffer.iBuffer = buffer; + TLockBuffer lockBuffer; + lockBuffer.iLock = EFalse; + lockBuffer.iBuffer = CMdsClauseBuffer::NewLC( 1024 ); iBuffers.AppendL( lockBuffer ); CleanupStack::Pop(); // buffer } - } TBool CMdSSqlObjectManipulate::GarbageCollectionL() @@ -2057,7 +2054,11 @@ if (!dataRow.Column(1).IsNull()) { dataRow.Column(1).Get( relationId ); - aRelationIds.InsertInOrder( relationId, TLinearOrder( CompareTItemIds ) ); + const TInt error( aRelationIds.InsertInOrder( relationId, TLinearOrder( CompareTItemIds ) ) ); + if( error == KErrNoMemory ) + { + User::Leave( error ); + } } else { @@ -2092,6 +2093,35 @@ __LOGQUERY_16( _L("Remove objects:"), buffer.ConstBufferL(), dataRow); connection.ExecuteL( buffer.ConstBufferL(), dataRow ); + +#ifdef MDS_PLAYLIST_HARVESTING_ENABLED + _LIT( KSetPlaylistItemsRemoved, "UPDATE Object%u SET Flags=Flags|? WHERE ObjectId IN (SELECT ObjectId FROM AudioPlaylistItem%u WHERE AudioObjectID IN(?" ); + _LIT( KPlaylistCollectEnd, "));" ); + + buffer.ReserveSpaceL( KSetPlaylistItemsRemoved().Length() + KMaxUintValueLength + + (removeObjectCount-1) * KCollectMiddle().Length() + + KPlaylistCollectEnd().Length() ); + + TDefId nameSpaceDefID = iNamespaceDef->GetId(); + buffer.BufferL().Format( KSetPlaylistItemsRemoved, nameSpaceDefID, nameSpaceDefID ); + + dataRow.Free(); + dataRow.Reset(); + dataRow.AppendL( TColumn( EMdEObjectFlagRemoved ) ); + + for (TInt i = 0; i < removeObjectCount; ++i) + { + if(i>0) + { + buffer.AppendL( KCollectMiddle ); + } + dataRow.AppendL( TColumn( aObjectIds[i] ) ); + } + buffer.AppendL( KPlaylistCollectEnd ); + + __LOGQUERY_16( _L("Remove playlist items:"), buffer.ConstBufferL(), dataRow); + connection.ExecuteL( buffer.ConstBufferL(), dataRow ); +#endif } // mark relations as removed @@ -3254,9 +3284,52 @@ // rowDataDel, commonClauseOne CleanupStack::PopAndDestroy( 7, &commonClauseOne ); +#ifdef MDS_PLAYLIST_HARVESTING_ENABLED + if( updateResult == 0 ) + { + updateResult = CleanPlaylistsL(); + } +#endif + return updateResult != 0; } +#ifdef MDS_PLAYLIST_HARVESTING_ENABLED +TInt CMdSSqlObjectManipulate::CleanPlaylistsL() + { + _LIT( KDeleteWholePlaylists, "DELETE FROM Object%u WHERE ObjectId IN (SELECT ObjectId FROM AudioPlaylistItem%u WHERE PlaylistID NOT IN (SELECT ObjectId FROM Object%u));" ); + + RClauseBuffer commonClauseOne(*this, KDeleteWholePlaylists().Length()); + CleanupClosePushL( commonClauseOne ); + CMdsClauseBuffer& buffer = commonClauseOne.BufferL(); + + RRowData rowDataDel; + CleanupClosePushL( rowDataDel ); + + const RPointerArray& namespaceDefs = + iSchema.NamespaceDefs(); + + CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL(); + const TInt updateResult = 0; // once all files to be cleaned are handled, no need to continue + + const TInt count = namespaceDefs.Count(); + + for( TInt i = 0; i < count; ++i ) + { + const TDefId nmspId = namespaceDefs[i]->GetId(); + + buffer.BufferL().Format( KDeleteWholePlaylists, nmspId, nmspId, nmspId ); + User::LeaveIfError( connection.ExecuteL( + buffer.ConstBufferL(), rowDataDel ) ); + } + + // rowDataDel, commonClauseOne + CleanupStack::PopAndDestroy( 2, &commonClauseOne ); + + return updateResult; + } +#endif + CMdSSqlObjectManipulate::RClauseBuffer::RClauseBuffer( CMdSSqlObjectManipulate& aSOM, TInt aSize ) : iBuffers( aSOM.iBuffers ), iBuffer( NULL ), iNr( -1 ), iSize( aSize ) { @@ -3266,11 +3339,18 @@ { if (!iBuffers[i].iLock) { - iBuffers[i].iLock = ETrue; - iBuffer = iBuffers[i].iBuffer; + iBuffers[i].iLock = ETrue; + CMdsClauseBuffer* oldBuffer( iBuffer ); + iBuffer = iBuffers[i].iBuffer; + TRAPD( error, iBuffer->ReserveSpaceL(aSize) ); + if( error != KErrNone ) + { + iBuffer = oldBuffer; + iBuffers[i].iLock = EFalse; + continue; + } + TRAP_IGNORE( iBuffer->BufferL().Zero() ); iNr = i; - TRAP_IGNORE( iBuffer->ReserveSpaceL(aSize) ); - TRAP_IGNORE( iBuffer->BufferL().Zero() ); return; } }