metadataengine/server/src/mdssqlobjectmanipulate.cpp
changeset 20 6dfc5f825351
parent 3 b73a2e62868f
child 21 50bf9db68373
equal deleted inserted replaced
3:b73a2e62868f 20:6dfc5f825351
   189     {
   189     {
   190     }
   190     }
   191 
   191 
   192 void CMdSSqlObjectManipulate::ConstructL( )
   192 void CMdSSqlObjectManipulate::ConstructL( )
   193     {
   193     {
   194     
       
   195 	iGenerator = CMdSIdentifierGenerator::NewL();
   194 	iGenerator = CMdSIdentifierGenerator::NewL();
   196 
   195 
   197 	iNamespaceDef = NULL;
   196 	iNamespaceDef = NULL;
   198 	
   197 	
   199 	TLockBuffer lockBuffer;
       
   200 	lockBuffer.iLock = EFalse;
       
   201 	for (TInt i = 0; i < KMaxBuffers; ++i)
   198 	for (TInt i = 0; i < KMaxBuffers; ++i)
   202 		{
   199 		{
   203 	    CMdsClauseBuffer* buffer = CMdsClauseBuffer::NewLC( 1024 );
   200 	    TLockBuffer lockBuffer;
   204 		lockBuffer.iBuffer = buffer;
   201 	    lockBuffer.iLock = EFalse;
       
   202 	    lockBuffer.iBuffer = CMdsClauseBuffer::NewLC( 1024 );
   205 		iBuffers.AppendL( lockBuffer );
   203 		iBuffers.AppendL( lockBuffer );
   206 		CleanupStack::Pop(); // buffer
   204 		CleanupStack::Pop(); // buffer
   207 		}
   205 		}
   208 
       
   209     }
   206     }
   210 
   207 
   211 TBool CMdSSqlObjectManipulate::GarbageCollectionL()
   208 TBool CMdSSqlObjectManipulate::GarbageCollectionL()
   212 	{
   209 	{
   213 	return DoGarbageCollectionL();
   210 	return DoGarbageCollectionL();
  2055 			prevId = objectId;
  2052 			prevId = objectId;
  2056 			}
  2053 			}
  2057 		if (!dataRow.Column(1).IsNull())
  2054 		if (!dataRow.Column(1).IsNull())
  2058 			{
  2055 			{
  2059 			dataRow.Column(1).Get( relationId );
  2056 			dataRow.Column(1).Get( relationId );
  2060 			aRelationIds.InsertInOrder( relationId, TLinearOrder<TItemId>( CompareTItemIds ) );
  2057 			const TInt error( aRelationIds.InsertInOrder( relationId, TLinearOrder<TItemId>( CompareTItemIds ) ) );
       
  2058 			if( error == KErrNoMemory )
       
  2059 			    {
       
  2060 			    User::Leave( error );
       
  2061 			    }
  2061 			}
  2062 			}
  2062 		else
  2063 		else
  2063 			{
  2064 			{
  2064 			dataRow.Column(1).Set( relationId );
  2065 			dataRow.Column(1).Set( relationId );
  2065 			}
  2066 			}
  2090 			}
  2091 			}
  2091 		buffer.AppendL( KCollectEnd );
  2092 		buffer.AppendL( KCollectEnd );
  2092 
  2093 
  2093 		__LOGQUERY_16( _L("Remove objects:"), buffer.ConstBufferL(), dataRow);
  2094 		__LOGQUERY_16( _L("Remove objects:"), buffer.ConstBufferL(), dataRow);
  2094 		connection.ExecuteL( buffer.ConstBufferL(), dataRow );
  2095 		connection.ExecuteL( buffer.ConstBufferL(), dataRow );
       
  2096 		
       
  2097 #ifdef MDS_PLAYLIST_HARVESTING_ENABLED
       
  2098 		_LIT( KSetPlaylistItemsRemoved, "UPDATE Object%u SET Flags=Flags|? WHERE ObjectId IN (SELECT ObjectId FROM AudioPlaylistItem%u WHERE AudioObjectID IN(?" );
       
  2099 		_LIT( KPlaylistCollectEnd,    "));" );
       
  2100 
       
  2101 		buffer.ReserveSpaceL( KSetPlaylistItemsRemoved().Length() + KMaxUintValueLength +
       
  2102                                (removeObjectCount-1) * KCollectMiddle().Length() +
       
  2103                                KPlaylistCollectEnd().Length() );
       
  2104 
       
  2105 		TDefId nameSpaceDefID = iNamespaceDef->GetId();
       
  2106         buffer.BufferL().Format( KSetPlaylistItemsRemoved, nameSpaceDefID, nameSpaceDefID );
       
  2107 
       
  2108         dataRow.Free();
       
  2109         dataRow.Reset();
       
  2110         dataRow.AppendL( TColumn( EMdEObjectFlagRemoved ) );
       
  2111 
       
  2112         for (TInt i = 0; i < removeObjectCount; ++i)
       
  2113             {
       
  2114             if(i>0)
       
  2115                 {
       
  2116                 buffer.AppendL( KCollectMiddle );
       
  2117                 }
       
  2118             dataRow.AppendL( TColumn( aObjectIds[i] ) );
       
  2119             }
       
  2120         buffer.AppendL( KPlaylistCollectEnd );
       
  2121 
       
  2122         __LOGQUERY_16( _L("Remove playlist items:"), buffer.ConstBufferL(), dataRow);
       
  2123         connection.ExecuteL( buffer.ConstBufferL(), dataRow );
       
  2124 #endif
  2095 		}
  2125 		}
  2096 
  2126 
  2097 	// mark relations as removed
  2127 	// mark relations as removed
  2098 	// remove only item that are OK to remove (not removed earlier)
  2128 	// remove only item that are OK to remove (not removed earlier)
  2099 	const TInt removeRelationCount = aRelationIds.Count();
  2129 	const TInt removeRelationCount = aRelationIds.Count();
  3252 
  3282 
  3253    	// empryRow, rowDataDelContext, rowDataUpdRel, rowDataDelRel, rowDataUpd, 
  3283    	// empryRow, rowDataDelContext, rowDataUpdRel, rowDataDelRel, rowDataUpd, 
  3254    	// rowDataDel, commonClauseOne
  3284    	// rowDataDel, commonClauseOne
  3255 	CleanupStack::PopAndDestroy( 7, &commonClauseOne );
  3285 	CleanupStack::PopAndDestroy( 7, &commonClauseOne );
  3256 
  3286 
       
  3287 #ifdef MDS_PLAYLIST_HARVESTING_ENABLED	
       
  3288 	if( updateResult == 0 )
       
  3289 	    {
       
  3290 	    updateResult = CleanPlaylistsL();
       
  3291 	    }
       
  3292 #endif
       
  3293 
  3257 	return updateResult != 0;
  3294 	return updateResult != 0;
  3258 	}
  3295 	}
       
  3296 
       
  3297 #ifdef MDS_PLAYLIST_HARVESTING_ENABLED
       
  3298 TInt CMdSSqlObjectManipulate::CleanPlaylistsL()
       
  3299     {
       
  3300     _LIT( KDeleteWholePlaylists, "DELETE FROM Object%u WHERE ObjectId IN (SELECT ObjectId FROM AudioPlaylistItem%u WHERE PlaylistID NOT IN (SELECT ObjectId FROM Object%u));" );
       
  3301     
       
  3302     RClauseBuffer commonClauseOne(*this, KDeleteWholePlaylists().Length());
       
  3303     CleanupClosePushL( commonClauseOne );
       
  3304     CMdsClauseBuffer& buffer = commonClauseOne.BufferL();
       
  3305 
       
  3306     RRowData rowDataDel;
       
  3307     CleanupClosePushL( rowDataDel );
       
  3308 
       
  3309     const RPointerArray<CMdsNamespaceDef>& namespaceDefs = 
       
  3310         iSchema.NamespaceDefs();
       
  3311 
       
  3312     CMdSSqLiteConnection& connection = MMdSDbConnectionPool::GetDefaultDBL();
       
  3313     const TInt updateResult = 0; // once all files to be cleaned are handled, no need to continue
       
  3314     
       
  3315     const TInt count = namespaceDefs.Count();
       
  3316     
       
  3317     for( TInt i = 0; i < count; ++i )
       
  3318         {
       
  3319         const TDefId nmspId = namespaceDefs[i]->GetId();
       
  3320 
       
  3321         buffer.BufferL().Format( KDeleteWholePlaylists, nmspId, nmspId, nmspId );
       
  3322         User::LeaveIfError( connection.ExecuteL( 
       
  3323                 buffer.ConstBufferL(), rowDataDel ) );    
       
  3324         }
       
  3325 
       
  3326     // rowDataDel, commonClauseOne
       
  3327     CleanupStack::PopAndDestroy( 2, &commonClauseOne );
       
  3328     
       
  3329     return updateResult;
       
  3330     }
       
  3331 #endif
  3259 
  3332 
  3260 CMdSSqlObjectManipulate::RClauseBuffer::RClauseBuffer( CMdSSqlObjectManipulate& aSOM, TInt aSize )
  3333 CMdSSqlObjectManipulate::RClauseBuffer::RClauseBuffer( CMdSSqlObjectManipulate& aSOM, TInt aSize )
  3261 	: iBuffers( aSOM.iBuffers ), iBuffer( NULL ), iNr( -1 ), iSize( aSize )
  3334 	: iBuffers( aSOM.iBuffers ), iBuffer( NULL ), iNr( -1 ), iSize( aSize )
  3262 	{
  3335 	{
  3263 	// search for available buffer
  3336 	// search for available buffer
  3264 	// or create new one
  3337 	// or create new one
  3265 	for (TInt i = 0; i < iBuffers.Count(); ++i)
  3338 	for (TInt i = 0; i < iBuffers.Count(); ++i)
  3266 		{
  3339 		{
  3267 		if (!iBuffers[i].iLock)
  3340 		if (!iBuffers[i].iLock)
  3268 			{
  3341 			{
  3269 			iBuffers[i].iLock = ETrue;
  3342 		    iBuffers[i].iLock = ETrue;
  3270 			iBuffer = iBuffers[i].iBuffer;
  3343             CMdsClauseBuffer* oldBuffer( iBuffer );
       
  3344             iBuffer = iBuffers[i].iBuffer;
       
  3345             TRAPD( error, iBuffer->ReserveSpaceL(aSize) );
       
  3346             if( error != KErrNone )
       
  3347                 {
       
  3348                 iBuffer = oldBuffer;
       
  3349                 iBuffers[i].iLock = EFalse;
       
  3350                 continue;
       
  3351                 }		
       
  3352             TRAP_IGNORE( iBuffer->BufferL().Zero() );			
  3271 			iNr = i;
  3353 			iNr = i;
  3272 			TRAP_IGNORE( iBuffer->ReserveSpaceL(aSize) );
       
  3273 			TRAP_IGNORE( iBuffer->BufferL().Zero() );
       
  3274 			return;
  3354 			return;
  3275 			}
  3355 			}
  3276 		}
  3356 		}
  3277 	}
  3357 	}
  3278 
  3358