metadataengine/server/src/mdssqlobjectmanipulate.cpp
changeset 20 6dfc5f825351
parent 3 b73a2e62868f
child 21 50bf9db68373
--- 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<TItemId>( CompareTItemIds ) );
+			const TInt error( aRelationIds.InsertInOrder( relationId, TLinearOrder<TItemId>( 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<CMdsNamespaceDef>& 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;
 			}
 		}