internetradio2.0/songhistorysrc/irsonghistorydb.cpp
changeset 0 09774dfdd46b
child 3 ee64f059b8e1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/songhistorysrc/irsonghistorydb.cpp	Mon Apr 19 14:01:53 2010 +0300
@@ -0,0 +1,1221 @@
+/*
+* Copyright (c) 2006-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:  Implementation of the songhistory database
+*
+*/
+
+
+/* ---------------------------------------------------------------------------
+*  Version history:
+*  Template version:
+*  <ccm_history>
+*
+* 
+*  Version: 3, Thu Apr 14 12:00:00 2008 by Rohit
+*  Ref:
+*  Pc lint fixes
+*
+*  Version: 2, Thu Apr 10 20:00:00 2008 by Rohit
+*  Ref:
+*  Implemented SongHistory changes for channelwise songs
+*
+*  </ccm_history>
+* ============================================================================
+*/
+
+#include <bautils.h>
+#include <badesca.h>    // CDesCArrayFlat
+#include <s32file.h>    // CFileStore & CPermanentFileStore
+#include <bautils.h>    // file helpers
+#include <eikenv.h>
+
+#include "irsonghistorydb.h"
+#include "irsonghistoryinfo.h"
+#include "irdebug.h"
+#include "irsettings.h"
+
+
+ 
+_LIT( KSongHistoryDBTable,              "ChannelHistoryTable"  );
+_LIT( KSongHistoryDBTable2,             "SongHistoryTable"  );
+_LIT( KSongHistoryDBSongNameColumn,     "SongName"	   );
+_LIT( KSongHistoryDBArtistNameColumn,   "ArtistName"   );
+_LIT( KSongHistoryDBChannelNameColumn,  "ChannelName"  );
+_LIT( KSongHistoryDBChannelUrlColumn,   "ChannelUrl"  );
+_LIT( KSongHistoryDBChannelTypeColumn,   "ChannelType"  );
+_LIT( KSongHistoryDBChannelIdColumn,   "ChannelId"  );
+_LIT( KSongHistoryDBBitrateColumn,   "Bitrate"  );
+_LIT( KSongHistoryDBChannelDescColumn,   "ChannelDescription"  );
+_LIT( KSongHistoryDBImageUrlColumn,   "ImageUrl"  );
+_LIT( KSongHistoryDBMusicStatusColumn,   "MusicStoreStatus"  );
+
+_LIT(KSongHistoryDbFile,"songhistoryDb.db");
+_LIT(KNo , "No") ;
+
+const TInt KMaxSize = 255;
+
+const TInt KMaxColumnLength = 255;
+TBool CIRSongHistoryDb::CompareChannelInfos(const CIRChannelInfo& aFirst,
+						 const CIRChannelInfo& aSecond)
+{
+   return ( aFirst.iChannelName == aSecond.iChannelName && 
+   					aFirst.iChannelUrl == aSecond.iChannelUrl &&
+   					aFirst.iChannelType == aSecond.iChannelType);
+}
+
+ 
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Function : NewL()
+// two phased construction
+// ---------------------------------------------------------------------------
+//
+CIRSongHistoryDb* CIRSongHistoryDb::NewL()
+{
+	IRLOG_DEBUG( "CIRSongHistoryDb::NewL" );
+	CIRSongHistoryDb* self=CIRSongHistoryDb::NewLC();
+	CleanupStack::Pop(self);
+	IRLOG_DEBUG( "CIRSongHistoryDb::NewL - Exiting." );
+	return self;
+}
+
+
+// ---------------------------------------------------------------------------
+// Function : NewLC()
+// Two phased construction
+// ---------------------------------------------------------------------------
+//
+CIRSongHistoryDb* CIRSongHistoryDb::NewLC()
+{
+	IRLOG_DEBUG( "CIRSongHistoryDb::NewLC" );
+	CIRSongHistoryDb *self=new(ELeave)CIRSongHistoryDb;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	IRLOG_DEBUG( "CIRSongHistoryDb::NewLC - Exiting." );
+	return self;
+}
+
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::~CIRSongHistoryDb()
+// default destructor
+// ---------------------------------------------------------------------------
+//
+CIRSongHistoryDb::~CIRSongHistoryDb()
+{
+	IRLOG_DEBUG( "CIRSongHistoryDb::~CIRSongHistoryDb" );
+
+	CloseSongHistoryDb();
+	iFsSession.Close();
+	IRLOG_DEBUG( "CIRSongHistoryDb::~CIRSongHistoryDb - Exiting." );
+}
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::CreateDbCondition()
+// Creates both the dbms files conditionally(only if not yet created)
+// calls CreateSongHistoryDb()
+// ---------------------------------------------------------------------------
+//
+void CIRSongHistoryDb::CreateDbCondition(const TFileName& aSongHistoryDbFile)
+{
+	IRLOG_DEBUG( "CIRSongHistoryDb::CreateDbCondition" );
+
+
+	if( !BaflUtils::FileExists(iFsSession, aSongHistoryDbFile) )
+	{
+		TInt error = CreateSongHistoryDb(aSongHistoryDbFile);
+		if( error )
+		{
+			IRLOG_DEBUG( "CIRSongHistoryDb::CreateDbCondition - Exiting (1)." );
+			
+		}
+	}
+	IRLOG_DEBUG( "CIRSongHistoryDb::CreateDbCondition - Exiting (2)." );
+	
+}
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb:AddToSongHistoryDbL()
+// adds the session log entry into data base
+// Returns ETure if songHistory count exceeds 30, else EFalse
+// ---------------------------------------------------------------------------
+//
+TBool CIRSongHistoryDb::AddToSongHistoryDbL(const TDesC& aSongName,
+											const TDesC& aArtistName, 
+											const TDesC& aChannelName, 
+											const TDesC& aChannelUrl,
+											RBuf& aDelSongName, 
+											RBuf& aDelArtistName, 
+											RBuf& aDelChannelName, 
+											RBuf& aDelChannelUrl,
+											TInt  aChannelType,
+											TInt aChannelId,
+											TInt aBitrate,
+											const TDesC& aChannelDesc,
+											const TDesC& aImageUrl,
+											const TDesC& aMusicFlag
+											)
+{
+	IRLOG_DEBUG( "CIRSongHistoryDb::AddSongHistoryStartL" );
+
+	TBool bRetval = EFalse;
+	TInt error= 0;
+
+	iSongHistoryTable.Reset();
+
+	//if song history entries are  greater than or equal to 30
+	if( iSongHistoryTable.CountL() >= KMaxNoChannelHistoryDbEntries )
+	{
+		//first row is selected
+		iSongHistoryTable.FirstL();
+
+		//the current row is selected
+		iSongHistoryTable.GetL();
+
+		//delete that entry
+		CDbColSet* columns = iSongHistoryTable.ColSetL();
+		TInt songColumn = columns->ColNo( KSongHistoryDBSongNameColumn );
+		TInt artistColumn = columns->ColNo( KSongHistoryDBArtistNameColumn );
+		TInt channelColumn = columns->ColNo( KSongHistoryDBChannelNameColumn );
+		TInt channelUrlColumn = columns->ColNo( KSongHistoryDBChannelUrlColumn );
+
+		delete columns;
+		columns = NULL;
+
+        aDelSongName.Create(iSongHistoryTable.ColDes( songColumn ));
+        aDelArtistName.Create(iSongHistoryTable.ColDes( artistColumn ));
+        aDelChannelName.Create(iSongHistoryTable.ColDes( channelColumn ));
+        aDelChannelUrl.Create(iSongHistoryTable.ColDes( channelUrlColumn ));
+        
+        iSongHistoryTable.DeleteL();
+        Compact();
+
+        bRetval = ETrue;
+	}
+
+    CDbColSet* columns = iSongHistoryTable.ColSetL();
+    CleanupStack::PushL(columns);
+
+	const TPtrC &songName = aSongName.Left(KIRDbMaxStrLen);
+	const TPtrC &artistName = aArtistName.Left(KIRDbMaxStrLen);
+	const TPtrC &channelName = aChannelName.Left(KIRDbMaxStrLen);
+	const TPtrC &channelUrl = aChannelUrl.Left(KIRDbMaxStrLen);
+    const TPtrC &channelDesc = aChannelDesc.Left(KIRDbMaxStrLen);
+    const TPtrC &imageUrl = aImageUrl.Left(KIRDbMaxStrLen);
+	
+	TInt songLen = aSongName.Length();
+	TInt artistLen = aArtistName.Length();
+	if(  songLen + artistLen > KMaxSize )
+	{
+		IRLOG_DEBUG3( "CIRSongHistoryDb::AddSongHistoryStartL - LONG METADATA %d, %d", songLen, artistLen );
+	}
+	
+	TRAP(error,//trap start
+
+  		iSongHistoryTable.InsertL();
+		iSongHistoryTable.SetColL(columns->ColNo( KSongHistoryDBSongNameColumn ), songName);
+		iSongHistoryTable.SetColL(columns->ColNo( KSongHistoryDBArtistNameColumn ), artistName);
+		iSongHistoryTable.SetColL(columns->ColNo( KSongHistoryDBChannelNameColumn ), channelName);
+		iSongHistoryTable.SetColL(columns->ColNo( KSongHistoryDBChannelUrlColumn ), channelUrl);
+		iSongHistoryTable.SetColL(columns->ColNo( KSongHistoryDBChannelTypeColumn ), aChannelType);
+		iSongHistoryTable.SetColL(columns->ColNo( KSongHistoryDBChannelIdColumn ), aChannelId);
+		iSongHistoryTable.SetColL(columns->ColNo( KSongHistoryDBBitrateColumn ), aBitrate);
+        iSongHistoryTable.SetColL(columns->ColNo( KSongHistoryDBChannelDescColumn ), channelDesc);
+        iSongHistoryTable.SetColL(columns->ColNo( KSongHistoryDBImageUrlColumn ), imageUrl);
+        iSongHistoryTable.SetColL(columns->ColNo( KSongHistoryDBMusicStatusColumn ), aMusicFlag);
+		iSongHistoryTable.PutL();
+		);
+
+ 	CleanupStack::PopAndDestroy(columns); 
+ 	if( error!=KErrNone )
+ 	{
+	 	User::LeaveIfError(error);
+ 	}
+    
+ 	iSongHistoryTable.Reset();
+ 	IRLOG_DEBUG( "CIRSongHistoryDb::AddSongHistoryStartL - Exiting." );
+
+	return bRetval;
+}
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb:AddToSongHistoryDb2L()
+// adds the history song into the db
+// Returns ETure if songHistory count exceeds 100, else EFalse
+// ---------------------------------------------------------------------------
+ 
+TBool CIRSongHistoryDb::AddToSongHistoryDb2L( const TDesC& aSongName,
+                                    const TDesC& aArtistName,                                   
+                                    const TDesC& aMusicFlag)
+{
+    IRLOG_DEBUG( "CIRSongHistoryDb::AddToSongHistoryDb2L" );
+
+    TBool bRetval = EFalse;
+    TInt error= 0;
+    TInt songCompareFlag = 0;
+    TInt artistCompareFlag = 0;    
+     
+
+    iSongHistoryTable2.Reset();    
+    
+    CDbColSet* columns = iSongHistoryTable2.ColSetL();
+    CleanupStack::PushL(columns);
+    
+    /* the following is to judge wether the song is already in the db */    
+    if ( iSongHistoryTable2.CountL() >= 1 )
+    {
+        TInt songNameColumn = columns->ColNo( KSongHistoryDBSongNameColumn );
+        TInt artistNameColumn = columns->ColNo( KSongHistoryDBArtistNameColumn );     
+
+        for ( iSongHistoryTable2.LastL(); iSongHistoryTable2.AtRow(); iSongHistoryTable2.PreviousL() )
+        {
+            iSongHistoryTable2.GetL();
+            RBuf songName;
+            RBuf artistName;
+            
+            songName.Create(iSongHistoryTable2.ColDes( songNameColumn ));
+            songName.CleanupClosePushL();
+            
+            artistName.Create(iSongHistoryTable2.ColDes( artistNameColumn ));
+            artistName.CleanupClosePushL();    
+            
+            songCompareFlag = (songName).Compare(aSongName);
+            artistCompareFlag = (artistName).Compare(aArtistName);
+            
+            CleanupStack::PopAndDestroy(&artistName);       
+            CleanupStack::PopAndDestroy(&songName);
+            
+            if( 0 == songCompareFlag && 0 == artistCompareFlag )
+            {
+                CleanupStack::PopAndDestroy(columns); 
+                iSongHistoryTable2.Reset();
+                return bRetval;
+            }
+        }        
+    }
+	/* end  */
+    
+    //if song history entries are  greater than or equal to 100
+    if( iSongHistoryTable2.CountL() >= KMaxNoSongHistoryDbEntries )
+    {
+        //first row is selected
+        iSongHistoryTable2.FirstL();
+        //the current row is selected
+        iSongHistoryTable2.GetL();       
+        //delete the current row
+        iSongHistoryTable2.DeleteL();
+        Compact();     
+        bRetval = ETrue;   
+    }
+    
+    const TPtrC &songName = aSongName.Left(KIRDbMaxStrLen);
+    const TPtrC &artistName = aArtistName.Left(KIRDbMaxStrLen);
+    const TPtrC &musicFlag = aMusicFlag.Left(KIRDbMaxStrLen);
+     
+    
+    TInt songLen = aSongName.Length();
+    TInt artistLen = aArtistName.Length();
+    if(  songLen + artistLen > KMaxSize )
+    {
+        IRLOG_DEBUG3( "CIRSongHistoryDb::AddSongHistoryStartL - LONG METADATA %d, %d", songLen, artistLen );
+    }
+    
+    TRAP(error,//trap start
+
+        iSongHistoryTable2.InsertL();
+        iSongHistoryTable2.SetColL(columns->ColNo( KSongHistoryDBSongNameColumn ), songName);
+        iSongHistoryTable2.SetColL(columns->ColNo( KSongHistoryDBArtistNameColumn ), artistName);        
+        iSongHistoryTable2.SetColL(columns->ColNo( KSongHistoryDBMusicStatusColumn ), musicFlag);
+        iSongHistoryTable2.PutL();
+        );
+
+    CleanupStack::PopAndDestroy(columns); 
+    if( error!=KErrNone )
+    {
+        User::LeaveIfError(error);
+    }
+    
+    iSongHistoryTable2.Reset();
+    IRLOG_DEBUG( "CIRSongHistoryDb::AddSongHistoryStartL - Exiting." );
+
+    return bRetval;  
+}
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::GetAllSongHistoryListL()
+//  gets all the song history entries  into an array
+// ---------------------------------------------------------------------------
+//
+void CIRSongHistoryDb::GetAllSongHistoryListL(RPointerArray<CIRSongHistoryInfo>& aHistoryDataArr)
+{
+ 	IRLOG_DEBUG( "CIRSongHistoryDb::GetAllSongHistoryListL" );
+
+ 	TInt error = KErrNone;
+
+    if(iSongHistoryTable.CountL() < 1)
+    {
+    	return;
+    }
+
+    CDbColSet* columns = iSongHistoryTable.ColSetL();
+    TInt songColumn = columns->ColNo( KSongHistoryDBSongNameColumn );
+    TInt artistColumn = columns->ColNo( KSongHistoryDBArtistNameColumn );
+    TInt channelColumn = columns->ColNo( KSongHistoryDBChannelNameColumn );
+    TInt channelUrlColumn = columns->ColNo( KSongHistoryDBChannelUrlColumn );
+    TInt channelTypeColumn = columns->ColNo( KSongHistoryDBChannelTypeColumn );
+    TInt channelIdColumn = columns->ColNo( KSongHistoryDBChannelIdColumn );
+    TInt bitrateColumn = columns->ColNo( KSongHistoryDBBitrateColumn );
+    TInt channelDescColumn = columns->ColNo( KSongHistoryDBChannelDescColumn );
+    TInt imageUrlColumn = columns->ColNo( KSongHistoryDBImageUrlColumn );
+    TInt musicStatusColumn = columns->ColNo( KSongHistoryDBMusicStatusColumn );
+
+    delete columns;
+    columns = NULL;
+
+	// Comparer function to find channel in channelHistoryArr
+	TIdentityRelation<CIRChannelInfo> comparer( CIRSongHistoryDb::CompareChannelInfos );
+	
+ 	// Find out channels in order
+ 	RPointerArray<CIRChannelInfo> channelHistoryArr;
+    for ( iSongHistoryTable.LastL(); iSongHistoryTable.AtRow(); iSongHistoryTable.PreviousL() )
+    {
+        iSongHistoryTable.GetL();
+
+		CIRChannelInfo *pChannelInfo = new ( ELeave ) CIRChannelInfo;
+		CleanupStack::PushL( pChannelInfo );
+		pChannelInfo->iChannelName.Create(iSongHistoryTable.ColDes( channelColumn ));
+		pChannelInfo->iChannelUrl.Create(iSongHistoryTable.ColDes( channelUrlColumn ));
+		pChannelInfo->iChannelType = iSongHistoryTable.ColUint16( channelTypeColumn );
+       
+		// Verify the channel is not in our list already
+		if( channelHistoryArr.Find(pChannelInfo, comparer) == KErrNotFound )
+		{
+			error = channelHistoryArr.Append( pChannelInfo );
+		 	if( error!=KErrNone )
+		 	{
+		 		CleanupStack::PopAndDestroy( pChannelInfo );
+		 		channelHistoryArr.ResetAndDestroy();
+			 	User::LeaveIfError(error);
+		 	}
+
+			CleanupStack::Pop( pChannelInfo );
+
+
+		}
+		else
+		{
+			CleanupStack::PopAndDestroy( pChannelInfo );
+		}
+	}
+
+	// Find out songs for each channel in order
+
+	TInt song = 0;
+	for( TInt channelIndex = 0; channelIndex < channelHistoryArr.Count(); ++channelIndex )
+	{
+		for ( iSongHistoryTable.LastL(); iSongHistoryTable.AtRow(); iSongHistoryTable.PreviousL() )
+		{
+			iSongHistoryTable.GetL();
+			// Extracting the values from the database.
+			if(song < aHistoryDataArr.Count())
+			{
+				RBuf songName;
+				RBuf artistName;
+				RBuf channelName;
+				RBuf channelUrl;
+				TInt channelType;
+				TInt channelId;
+				TInt bitrate;
+                RBuf channelDesc;
+                RBuf imageUrl;
+                RBuf channelMusicStatus;
+                
+				songName.Create(iSongHistoryTable.ColDes( songColumn ));
+				songName.CleanupClosePushL();
+				
+				artistName.Create(iSongHistoryTable.ColDes( artistColumn ));
+				artistName.CleanupClosePushL();
+				
+				channelName.Create(iSongHistoryTable.ColDes( channelColumn ));
+				channelName.CleanupClosePushL();
+				
+				channelUrl.Create(iSongHistoryTable.ColDes( channelUrlColumn ));
+				channelUrl.CleanupClosePushL();
+				
+				channelType=iSongHistoryTable.ColUint8( channelTypeColumn );
+				
+				channelId=iSongHistoryTable.ColUint16( channelIdColumn );
+				
+				bitrate=iSongHistoryTable.ColUint16( bitrateColumn );
+                
+                channelDesc.Create(iSongHistoryTable.ColDes( channelDescColumn ));
+                channelDesc.CleanupClosePushL();
+
+                imageUrl.Create(iSongHistoryTable.ColDes( imageUrlColumn ));
+                imageUrl.CleanupClosePushL();
+
+                channelMusicStatus.Create(iSongHistoryTable.ColDes( musicStatusColumn ));
+                channelMusicStatus.CleanupClosePushL();
+                
+				if( channelHistoryArr[channelIndex]->iChannelName == channelName && 
+							channelHistoryArr[channelIndex]->iChannelUrl == channelUrl &&
+							channelHistoryArr[channelIndex]->iChannelType == channelType
+							)
+				{
+					aHistoryDataArr[song]->SetHistoryInfo(songName, artistName, channelUrl,
+								 channelName,channelType,channelId,bitrate,channelDesc ,
+								 imageUrl, channelMusicStatus);
+					++song;
+				}
+                
+                CleanupStack::PopAndDestroy(&channelMusicStatus);
+                CleanupStack::PopAndDestroy(&imageUrl);
+				CleanupStack::PopAndDestroy(&channelDesc);
+				CleanupStack::PopAndDestroy(&channelUrl);
+				CleanupStack::PopAndDestroy(&channelName);
+				CleanupStack::PopAndDestroy(&artistName);
+				CleanupStack::PopAndDestroy(&songName);
+
+			}
+			else
+			{
+				//Should not enter this scenario as aHistoryDataArr is suppose to give
+				//required memory allocated. But should it enter here should appendL into
+				//the list and increment "iSong"
+			}
+		}
+	}
+
+	channelHistoryArr.ResetAndDestroy();
+
+	IRLOG_DEBUG( "CIRSongHistoryDb::GetAllSongHistoryListL - Exiting." );
+}
+
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::GetAllSongHistoryList2L()
+//  gets all the song history entries  into an array
+// ---------------------------------------------------------------------------
+//
+void CIRSongHistoryDb::GetAllSongHistoryList2L(RPointerArray<CIRSongHistoryInfo>& aSongEntries)
+{
+    IRLOG_DEBUG( "CIRSongHistoryDb::GetAllSongHistoryList2L" );    
+
+    if(iSongHistoryTable2.CountL() < 1)
+    {
+        return;
+    }
+
+    CDbColSet* columns = iSongHistoryTable2.ColSetL();
+    TInt songColumn = columns->ColNo( KSongHistoryDBSongNameColumn );
+    TInt artistColumn = columns->ColNo( KSongHistoryDBArtistNameColumn );     
+    TInt musicStatusColumn = columns->ColNo( KSongHistoryDBMusicStatusColumn );
+
+    delete columns;
+    columns = NULL;
+    
+    TInt song = 0;
+    
+    for ( iSongHistoryTable2.LastL(); iSongHistoryTable2.AtRow(); iSongHistoryTable2.PreviousL() )
+    {
+        iSongHistoryTable2.GetL();
+         
+        RBuf songName;
+        RBuf artistInfo;
+        RBuf musicStatus;
+        
+        songName.Create(iSongHistoryTable2.ColDes( songColumn ));
+        songName.CleanupClosePushL();
+        
+        artistInfo.Create(iSongHistoryTable2.ColDes( artistColumn ));
+        artistInfo.CleanupClosePushL();
+        
+        musicStatus.Create(iSongHistoryTable2.ColDes(musicStatusColumn));
+        musicStatus.CleanupClosePushL();
+        
+        aSongEntries[song]->SetSongName(songName);
+        aSongEntries[song]->SetArtist(artistInfo);
+        aSongEntries[song]->SetChannelMusicStatus(musicStatus);
+        ++song;         
+        
+        CleanupStack::PopAndDestroy(&musicStatus);
+        CleanupStack::PopAndDestroy(&artistInfo);
+        CleanupStack::PopAndDestroy(&songName);        
+    }
+     
+    IRLOG_DEBUG( "CIRSongHistoryDb::GetAllSongHistoryListL - Exiting." );
+}
+
+// ---------------------------------------------------------------------------
+// Function : ClearAllSongHistoryFromDb
+// delete all the entries from the database.
+// ---------------------------------------------------------------------------
+//
+TInt CIRSongHistoryDb::ClearAllSongHistoryFromDb(/*RPointerArray<CIRSongHistoryInfo>& aSongHistoryInfoArr*/)
+{
+
+	TInt error = KErrNone;
+
+	IRLOG_DEBUG( "CIRSongHistoryDb::ClearAllSongHistoryFromDb - Entering" );
+	TRAP(error, iSongHistoryTable.FirstL());
+	if(error != KErrNone)
+	{
+		return error;
+	}
+
+    while (iSongHistoryTable.AtRow())
+	{
+		TRAPD(error,
+		iSongHistoryTable.GetL();
+		iSongHistoryTable.DeleteL();
+		iSongHistoryTable.NextL(););
+		if(error)
+		{
+		    Compact();
+		    return error;
+		}
+	}
+	
+    Compact();
+    IRLOG_DEBUG( "CIRSongHistoryDb::ClearAllSongHistoryFromDb - Exiting." );
+	return KErrNone;
+
+}
+
+TInt CIRSongHistoryDb::DeleteOneHistory(TInt aIndex)
+{
+    IRLOG_DEBUG( "CIRSongHistoryDb::DeleteOneHistory - Entering" );
+    
+    TInt retValue = 0;
+    TRAPD(error,(retValue = DeleteOneHistoryL(aIndex)));
+    
+    if( KErrNone != error )
+    {
+        return error;
+    }
+    
+    if( KErrNone != retValue)
+    {
+        return retValue;
+    }    
+    IRLOG_DEBUG( "CIRSongHistoryDb::DeleteOneHistory - exiting" );    
+    return KErrNone;
+}
+
+TInt CIRSongHistoryDb::DeleteOneHistoryL(TInt aIndex)
+{
+    IRLOG_DEBUG( "CIRSongHistoryDb::DeleteOneHistoryL - Entering" );
+    TInt totalCount = iSongHistoryTable.CountL();     
+    if (aIndex < 0 || aIndex >= totalCount)
+    {
+        return KErrArgument;
+    }
+    
+    iSongHistoryTable.FirstL();
+    TInt tempIndex = 0;     
+    while (tempIndex < aIndex)
+    {
+        TRAPD(error,iSongHistoryTable.NextL(););
+        if (KErrNone != error)
+        {
+            Compact();
+            return error;
+        }
+        tempIndex++;
+    }
+    
+    iSongHistoryTable.GetL();
+    iSongHistoryTable.DeleteL();
+    IRLOG_DEBUG( "CIRSongHistoryDb::DeleteOneHistoryL - exiting" );   
+    return KErrNone;    
+}
+
+// ---------------------------------------------------------------------------
+// Function : ClearAllSongHistoryFromDb2
+// delete all the entries from the database.
+// ---------------------------------------------------------------------------
+//
+TInt CIRSongHistoryDb::ClearAllSongHistoryFromDb2()
+{
+
+    TInt error = KErrNone;
+
+    IRLOG_DEBUG( "CIRSongHistoryDb::ClearAllSongHistoryFromDb2 - Entering" );
+    TRAP(error, iSongHistoryTable2.FirstL());
+    if(error != KErrNone)
+    {
+        return error;
+    }
+
+    while (iSongHistoryTable2.AtRow())
+    {
+        TRAPD(error,
+        iSongHistoryTable2.GetL();
+        iSongHistoryTable2.DeleteL();
+        iSongHistoryTable2.NextL(););
+        if(error)
+        {
+            Compact();
+            return error;
+        }
+
+    }
+    Compact();
+    IRLOG_DEBUG( "CIRSongHistoryDb::ClearAllSongHistoryFromDb - Exiting." );
+    return KErrNone;
+
+}
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::ConstructL()
+// Standard 2nd phase construction
+// ---------------------------------------------------------------------------
+//
+void CIRSongHistoryDb::ConstructL()
+{
+	IRLOG_DEBUG( "CIRSongHistoryDb::ConstructL" );
+	User::LeaveIfError(iFsSession.Connect());
+
+	CIRSettings* settings = CIRSettings::OpenL();
+
+	TFileName songHistoryDbFile = settings->PrivatePath();
+	songHistoryDbFile.Append(KSongHistoryDbFile);
+
+	CreateDbCondition(songHistoryDbFile);
+	OpenSongHistoryDbL(songHistoryDbFile);
+
+	settings->Close();
+
+	IRLOG_DEBUG( "CIRSongHistoryDb::ConstructL- Exiting." );
+}
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::CloseSongHistoryDb()
+// Closes the database
+// ---------------------------------------------------------------------------
+//
+void CIRSongHistoryDb::CloseSongHistoryDb()
+{
+	IRLOG_DEBUG( "CIRSongHistoryDb::CloseSongHistoryDb" );
+	iSongHistoryTable.Close();
+	iSongHistoryTable2.Close();
+	Close();
+	IRLOG_DEBUG( "CIRSongHistoryDb::CloseSongHistoryDb - Exiting." );
+}
+
+
+/**
+* Function : CreateSongHistoryTablesL()
+* creates songhistory table with three columns
+* log data
+* ---------------------------------------------------------------------------
+* SongHistoryTable
+*---------------------------
+*| SongName | ArtistName | ChannelName | ChannelUrl | ChannelType | ChannelId | Bitrate | ChannelDesc | ImageUrl 
+*---------------------------
+*|EDbColText| EDbColText | EDbColText | EDbColText | EDbColUint8 | EDbColUint16 | EDbColUint16 | EDbColText | EDbColText
+*----------------------------------------------------------------------------
+*/
+void CIRSongHistoryDb::CreateSongHistoryTablesL()
+{
+	IRLOG_DEBUG( "CIRSongHistoryDb::CreateSongHistoryTablesL" );
+    CDbColSet* columns = CDbColSet::NewLC();
+
+    TRAPD( error,
+    columns->AddL( TDbCol( KSongHistoryDBSongNameColumn, EDbColText, KMaxColumnLength ) );
+    columns->AddL( TDbCol( KSongHistoryDBArtistNameColumn, EDbColText, KMaxColumnLength) );
+    columns->AddL( TDbCol( KSongHistoryDBChannelNameColumn, EDbColText, KMaxColumnLength ) );
+    columns->AddL( TDbCol( KSongHistoryDBChannelUrlColumn, EDbColText, KMaxColumnLength ) );
+    columns->AddL( TDbCol( KSongHistoryDBChannelTypeColumn, EDbColUint8 ) );
+    columns->AddL( TDbCol( KSongHistoryDBChannelIdColumn, EDbColUint16 ) );
+    columns->AddL( TDbCol( KSongHistoryDBBitrateColumn, EDbColUint16 ) );
+    columns->AddL( TDbCol( KSongHistoryDBChannelDescColumn, EDbColText, KMaxColumnLength ) );
+    columns->AddL( TDbCol( KSongHistoryDBImageUrlColumn, EDbColText, KMaxColumnLength ) );
+    columns->AddL( TDbCol( KSongHistoryDBMusicStatusColumn, EDbColText, KMaxColumnLength ) );
+    );
+	User::LeaveIfError( error );
+
+    User::LeaveIfError( CreateTable( KSongHistoryDBTable, *columns ) );
+
+    CleanupStack::PopAndDestroy( columns );
+	IRLOG_DEBUG( "CIRSongHistoryDb::CreateSongHistoryTablesL - Exiting." );
+}
+
+/**
+* Function : CreateSongHistoryTables2L()
+* creates songhistory table with three columns
+* log data
+* ---------------------------------------------------------------------------
+* SongHistoryTable
+*---------------------------
+*| SongName | ArtistName | MusicStatusFlag 
+*---------------------------
+*|EDbColText| EDbColText | EDbColText 
+*----------------------------------------------------------------------------
+*/
+void CIRSongHistoryDb::CreateSongHistoryTables2L()
+{
+	IRLOG_DEBUG( "CIRSongHistoryDb::CreateSongHistoryTablesL" );
+    CDbColSet* columns = CDbColSet::NewLC();
+
+    TRAPD( error,
+    columns->AddL( TDbCol( KSongHistoryDBSongNameColumn, EDbColText, KMaxColumnLength ) );
+    columns->AddL( TDbCol( KSongHistoryDBArtistNameColumn, EDbColText, KMaxColumnLength) );     
+    columns->AddL( TDbCol( KSongHistoryDBMusicStatusColumn, EDbColText, KMaxColumnLength ) );
+    );
+	User::LeaveIfError( error );
+
+    User::LeaveIfError( CreateTable( KSongHistoryDBTable2, *columns ) );
+
+    CleanupStack::PopAndDestroy( columns );
+	IRLOG_DEBUG( "CIRSongHistoryDb::CreateSongHistoryTablesL - Exiting." );
+}
+
+
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::OpenSongHistoryDbL()
+// opening the data base
+// ---------------------------------------------------------------------------
+//
+void CIRSongHistoryDb::OpenSongHistoryDbL(const TFileName& aSongHistoryDbFile)
+{
+	IRLOG_DEBUG( "CIRSongHistoryDb::OpenSongHistoryDbL" );
+	CloseSongHistoryDb(); //Ensure that the database is closed before trying to open it.
+
+	 
+    TInt error  = KErrNone;
+ 
+	error = Open(iFsSession,aSongHistoryDbFile);
+	if( error!=KErrNone )
+	{
+		//if database is failed to open then
+		//function leaves
+		IRLOG_ERROR2( "CIRSongHistoryDb::OpenSongHistoryDbL - Opening session database failed (%d)", error );
+		User::LeaveIfError(error);
+	}
+	if( IsDamaged() || !InTransaction() )
+	{
+		//if data base is damaged then
+		//it tried to recover
+		//if recovery is not possible function leaves
+		error = Recover();
+		if ( KErrNone == error)
+			{
+			//if recovered data base is compacted
+			error = Compact();
+			}
+	    User::LeaveIfError(error);
+	}
+
+	//open the table
+	error = iSongHistoryTable.Open(*this, KSongHistoryDBTable, iSongHistoryTable.EUpdatable);
+	if( error )
+	{
+		User::LeaveIfError(error);
+	}
+
+	error = iSongHistoryTable2.Open(*this, KSongHistoryDBTable2, iSongHistoryTable2.EUpdatable);
+	if( error )
+	{
+	    iSongHistoryTable.Close();
+		User::LeaveIfError(error);
+	} 
+
+	IRLOG_DEBUG( "CIRSongHistoryDb::OpenSongHistoryDbL - Exiting." );
+}
+
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::CreateSongHistoryDb()
+// @database filename
+// ---------------------------------------------------------------------------
+//
+TInt CIRSongHistoryDb::CreateSongHistoryDb(const TFileName& aSongHistoryDbFile )
+{
+	IRLOG_DEBUG( "CIRSongHistoryDb::CreateSongHistoryDb" );
+
+
+	TInt error = Replace(iFsSession,aSongHistoryDbFile);
+	if ( error != KErrNone )
+    {
+	    IRLOG_ERROR2( "CIRSongHistoryDb::CreateSongHistoryDb - Creating history database failed (%d)", error );
+	    return error;
+    }
+
+	TRAPD(err1,CreateSongHistoryTablesL());
+	if(err1)
+	{
+	    return err1;
+	}
+
+	//if error, no handling 
+	TRAPD(err2, CreateSongHistoryTables2L());
+	if( err2 )
+	{
+	    return err2;	  
+	}	
+	IRLOG_DEBUG( "CIRSongHistoryDb::CreateSongHistoryDb - Exiting." );
+	return KErrNone;
+}
+
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::CountSongHistoryDb()
+// count the database entries
+// ---------------------------------------------------------------------------
+//
+
+TInt CIRSongHistoryDb::CountSongHistoryDb()
+{
+	IRLOG_DEBUG( "CIRSongHistoryDb::CountSongHistoryDb" );
+	TInt historyCount = 0;
+	iSongHistoryTable.Reset();
+	TRAPD(error,historyCount= iSongHistoryTable.CountL());
+	if(error)
+	{
+		
+	}
+	IRLOG_DEBUG( "CIRSongHistoryDb::CountSongHistoryDb - Exiting." );
+ 	return historyCount;
+
+}
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::CountSongHistoryDb2()
+// count the database entries
+// ---------------------------------------------------------------------------
+//
+TInt CIRSongHistoryDb::CountSongHistoryDb2()
+{
+    IRLOG_DEBUG( "CIRSongHistoryDb::CountSongHistoryDb" );
+    TInt historyCount = 0;
+    iSongHistoryTable2.Reset();
+    TRAPD(error,historyCount= iSongHistoryTable2.CountL());
+    if(error)
+    {
+        historyCount = -1;
+    }
+    IRLOG_DEBUG( "CIRSongHistoryDb::CountSongHistoryDb - Exiting." );
+    return historyCount;
+}
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::GetLastHistoryItemL()
+// Gets the last song history item
+// ---------------------------------------------------------------------------
+//
+void CIRSongHistoryDb::GetLastHistoryItemL(RBuf& aSongName, RBuf& aArtistName,
+				 RBuf& aChannelName, RBuf& aChannelUrl)
+{
+	if( iSongHistoryTable.IsEmptyL() || iSongHistoryTable.LastL() == EFalse)
+	{
+		return;
+	}
+
+	iSongHistoryTable.GetL();
+
+	CDbColSet* columns = iSongHistoryTable.ColSetL();
+	TInt songColumn = columns->ColNo( KSongHistoryDBSongNameColumn );
+	TInt artistColumn = columns->ColNo( KSongHistoryDBArtistNameColumn );
+	TInt channelColumn = columns->ColNo( KSongHistoryDBChannelNameColumn );
+	TInt channelUrlColumn = columns->ColNo( KSongHistoryDBChannelUrlColumn );
+
+	delete columns;
+    columns = NULL;
+
+    aSongName.Create(iSongHistoryTable.ColDes( songColumn ));
+    aArtistName.Create(iSongHistoryTable.ColDes( artistColumn ));
+    aChannelName.Create(iSongHistoryTable.ColDes( channelColumn ));
+    aChannelUrl.Create(iSongHistoryTable.ColDes( channelUrlColumn ));
+
+
+    iSongHistoryTable.Reset();
+}
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::GetChannelSongsCountL()
+// Gets the channel's song count.
+// ---------------------------------------------------------------------------
+//
+
+TUint CIRSongHistoryDb::GetChannelSongsCountL( const RBuf& aChannelName, const RBuf& aChannelUrl )
+{
+	_LIT( strQuery, "Select SongName from SongHistoryTable where ChannelName='%S' AND ChannelUrl='%S'");
+
+	TBuf<KMaxSize>  bufQuery;
+	bufQuery.Format( strQuery, &aChannelName, &aChannelUrl );
+
+	TDbQuery	querySearchChannel( bufQuery );
+	RDbView		dbView;
+
+	TInt error = dbView.Prepare( *this, querySearchChannel );
+	User::LeaveIfError(error);
+
+	error = dbView.Evaluate();	// 0, evaluation is complete 
+	User::LeaveIfError(error);
+
+	TInt cRows = dbView.CountL();
+
+	dbView.Close();
+
+	return cRows;
+}
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::SyncSongHistoryDb()
+// Synchronises the History DB with removed channel entry in the ISDS
+// ---------------------------------------------------------------------------
+//
+
+void CIRSongHistoryDb::SyncSongHistoryDbL(TInt aChannelId)
+{
+ 	IRLOG_DEBUG( "CIRSongHistoryDb::SyncSongHistoryDbL" );
+
+
+    if(iSongHistoryTable.CountL() < 1)
+    {
+    	return;
+    }
+
+    CDbColSet* columns = iSongHistoryTable.ColSetL();
+    TInt songColumn = columns->ColNo( KSongHistoryDBSongNameColumn );
+    TInt artistColumn = columns->ColNo( KSongHistoryDBArtistNameColumn );
+    TInt channelColumn = columns->ColNo( KSongHistoryDBChannelNameColumn );
+    TInt channelUrlColumn = columns->ColNo( KSongHistoryDBChannelUrlColumn );
+    TInt channelTypeColumn = columns->ColNo( KSongHistoryDBChannelTypeColumn );
+    TInt channelIdColumn = columns->ColNo( KSongHistoryDBChannelIdColumn );
+    TInt bitrateColumn = columns->ColNo( KSongHistoryDBBitrateColumn );
+    TInt channelDescColumn = columns->ColNo( KSongHistoryDBChannelDescColumn );
+    TInt imageUrlColumn = columns->ColNo( KSongHistoryDBImageUrlColumn );
+    TInt musicStatusColumn = columns->ColNo( KSongHistoryDBMusicStatusColumn );
+
+    delete columns;
+    columns = NULL;
+
+	// Find out the channel to be changed 
+		for ( iSongHistoryTable.LastL(); iSongHistoryTable.AtRow(); iSongHistoryTable.PreviousL() )
+		{
+			iSongHistoryTable.GetL();
+			// Extracting the values from the database.
+				TInt channelId;
+				RBuf imageUrl;
+                RBuf channelMusicStatus;
+                
+				channelId=iSongHistoryTable.ColUint16( channelIdColumn );
+				imageUrl.Create(iSongHistoryTable.ColDes( imageUrlColumn ));
+				imageUrl.CleanupClosePushL();
+				channelMusicStatus.Create(iSongHistoryTable.ColDes( musicStatusColumn ));
+                channelMusicStatus.CleanupClosePushL();
+
+                
+                if(aChannelId == channelId)
+	                {
+	                iSongHistoryTable.UpdateL();
+		            iSongHistoryTable.SetColL(channelTypeColumn, 0);
+		            iSongHistoryTable.SetColL(channelIdColumn, 0);
+		            iSongHistoryTable.SetColL(imageUrlColumn, KNo);
+		            iSongHistoryTable.SetColL(musicStatusColumn, KNo);
+		            iSongHistoryTable.PutL();
+	                }
+                CleanupStack::PopAndDestroy(&channelMusicStatus);
+                CleanupStack::PopAndDestroy(&imageUrl);
+		}
+	iSongHistoryTable.Reset();
+		
+	IRLOG_DEBUG( "CIRSongHistoryDb::SyncSongHistoryDbL - Exiting." );
+}
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::GetIdPresentInDb()
+// Gets whether that particular channel id is present in Db or not.
+// ---------------------------------------------------------------------------
+//
+
+TBool CIRSongHistoryDb::GetIdPresentInDbL(TInt aChannelId)
+{
+ 	IRLOG_DEBUG( "CIRSongHistoryDb::GetIdPresentInDbL" );
+
+ 	TBool value = EFalse;
+
+    if(iSongHistoryTable.CountL() < 1)
+    {
+    	return value;
+    }
+
+    CDbColSet* columns = iSongHistoryTable.ColSetL();
+    TInt channelIdColumn = columns->ColNo( KSongHistoryDBChannelIdColumn );
+
+    delete columns;
+    columns = NULL;
+
+	// Find out the channel to be changed 
+		for ( iSongHistoryTable.LastL(); iSongHistoryTable.AtRow(); iSongHistoryTable.PreviousL() )
+		{
+			iSongHistoryTable.GetL();
+				TInt channelId;
+				
+				channelId=iSongHistoryTable.ColUint16( channelIdColumn );
+                if(aChannelId == channelId)
+	                {
+	                value = ETrue;
+	                }
+
+		}
+		
+	iSongHistoryTable.Reset();
+	
+	IRLOG_DEBUG( "CIRSongHistoryDb::GetIdPresentInDbL - Exiting." );
+	return value ;
+}
+
+
+
+// ---------------------------------------------------------------------------
+// CIRSongHistoryDb::UpdateSongHistoryDb()
+// Updates the song history DB when there is a channel change in the isds.
+// ---------------------------------------------------------------------------
+//
+
+TInt CIRSongHistoryDb::UpdateSongHistoryDbL(	TInt aChannelId,
+											const TDesC& aChannelName, 
+											const TDesC& aChannelUrl,
+											const TDesC& aImageUrl,
+											const TDesC& aMusicFlag)
+{
+ 	IRLOG_DEBUG( "CIRSongHistoryDb::UpdateSongHistoryDbL" );
+
+ 	TBool channelChanged = EFalse ;
+ 	TInt compFlagName ;
+ 	TInt compFlagUrl ;
+ 	TInt compFlagImageUrl ;
+ 	TInt compFlagMusic ;
+ 	TInt compUrlChange ;
+
+    if(iSongHistoryTable.CountL() < 1)
+    {
+    	return EFalse;
+    }
+
+    CDbColSet* columns = iSongHistoryTable.ColSetL();
+    TInt channelColumn = columns->ColNo( KSongHistoryDBChannelNameColumn );
+    TInt channelUrlColumn = columns->ColNo( KSongHistoryDBChannelUrlColumn );
+    TInt channelTypeColumn = columns->ColNo( KSongHistoryDBChannelTypeColumn );
+    TInt channelIdColumn = columns->ColNo( KSongHistoryDBChannelIdColumn );
+    TInt channelDescColumn = columns->ColNo( KSongHistoryDBChannelDescColumn );
+    TInt imageUrlColumn = columns->ColNo( KSongHistoryDBImageUrlColumn );
+    TInt musicStatusColumn = columns->ColNo( KSongHistoryDBMusicStatusColumn );
+
+    delete columns;
+    columns = NULL;
+
+	// Find out the channel to be changed 
+	
+		for ( iSongHistoryTable.LastL(); iSongHistoryTable.AtRow(); iSongHistoryTable.PreviousL() )
+		{
+			iSongHistoryTable.GetL();
+			// Extracting the values from the database.
+				RBuf channelName;
+				RBuf channelUrl;
+				RBuf imageUrl;
+				TInt channelId;
+                RBuf channelMusicStatus;
+				channelName.Create(iSongHistoryTable.ColDes( channelColumn ));
+				channelName.CleanupClosePushL();
+				
+				channelUrl.Create(iSongHistoryTable.ColDes( channelUrlColumn ));
+				channelUrl.CleanupClosePushL();
+				
+				imageUrl.Create(iSongHistoryTable.ColDes( imageUrlColumn ));
+				imageUrl.CleanupClosePushL();
+
+				channelId=iSongHistoryTable.ColUint16( channelIdColumn );
+                
+                channelMusicStatus.Create(iSongHistoryTable.ColDes( musicStatusColumn ));
+                channelMusicStatus.CleanupClosePushL();
+                
+                if(aChannelId == channelId)
+	                {
+					compFlagName =  (channelName).Compare(aChannelName);
+	                compFlagUrl =   (channelUrl).Compare(aChannelUrl);
+	                compFlagImageUrl = (imageUrl).Compare(aImageUrl);
+	                compFlagMusic = (channelMusicStatus).Compare(aMusicFlag);
+	                if(compFlagName)
+		                {
+	                    iSongHistoryTable.UpdateL();
+		                iSongHistoryTable.SetColL(channelColumn, aChannelName);
+		                iSongHistoryTable.PutL();
+		                channelChanged = ETrue ;
+		                }
+		            compUrlChange = (aChannelUrl).Compare(KNo);
+		                
+	                if(compFlagUrl && compUrlChange)
+		                {
+		                iSongHistoryTable.UpdateL();
+		                iSongHistoryTable.SetColL(channelUrlColumn, aChannelUrl);
+		                iSongHistoryTable.PutL();
+		                channelChanged = ETrue ;
+		                }
+	                if(compFlagImageUrl)
+	                    {
+	                    iSongHistoryTable.UpdateL();
+	                    iSongHistoryTable.SetColL(imageUrlColumn, aImageUrl);
+	                    iSongHistoryTable.PutL();
+	                    channelChanged = ETrue ;
+	                    }
+	                if(compFlagMusic)
+		                {
+		                iSongHistoryTable.UpdateL();
+		                iSongHistoryTable.SetColL(musicStatusColumn, aMusicFlag);
+		                iSongHistoryTable.PutL();
+		                channelChanged = ETrue ;
+		                }
+	                
+	                }
+                CleanupStack::PopAndDestroy(&channelMusicStatus);
+                CleanupStack::PopAndDestroy(&imageUrl);
+				CleanupStack::PopAndDestroy(&channelUrl);
+				CleanupStack::PopAndDestroy(&channelName);
+
+		}
+	iSongHistoryTable.Reset();
+	IRLOG_DEBUG( "CIRSongHistoryDb::UpdateSongHistoryDbL - Exiting." );
+	return channelChanged;
+}
+
+void CIRSongHistoryDb::SearchAndDeleteRecordL(const TDesC& aChannelName, const TDesC& aChannelUrl,
+                                              TInt aChannelType)
+{
+    CDbColSet* columns = iSongHistoryTable.ColSetL();
+    TInt channelNameColumn = columns->ColNo( KSongHistoryDBChannelNameColumn );
+    TInt channelUrlColumn = columns->ColNo( KSongHistoryDBChannelUrlColumn );
+    TInt channelTypeColumn = columns->ColNo( KSongHistoryDBChannelTypeColumn );
+    
+    delete columns;
+    columns = NULL;
+    
+    for (iSongHistoryTable.LastL(); iSongHistoryTable.AtRow(); iSongHistoryTable.PreviousL())
+    {
+        iSongHistoryTable.GetL();
+        TPtrC channelName = iSongHistoryTable.ColDes(channelNameColumn);
+        TPtrC channelUrl  = iSongHistoryTable.ColDes(channelUrlColumn);
+        TInt channelType = iSongHistoryTable.ColInt(channelTypeColumn);
+        
+        if (aChannelName == channelName && aChannelUrl == channelUrl && aChannelType == channelType)
+        {
+            iSongHistoryTable.DeleteL();  
+            return;
+        }
+    }
+}