internetradio2.0/sessionlogsrc/irnmslogdb.cpp
changeset 0 09774dfdd46b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/sessionlogsrc/irnmslogdb.cpp	Mon Apr 19 14:01:53 2010 +0300
@@ -0,0 +1,449 @@
+/*
+* Copyright (c) 2006-2007 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:  ?Description
+*
+*/
+
+
+#include <bautils.h>
+
+#include "irdebug.h" 
+#include "irnmslogdb.h"
+#include "irnmslogger.h"
+
+_LIT(KNmsLogTable,"NmsLog"); 
+_LIT(KID,"id");
+_LIT(KNmsLogCol,  "NmsLogData");
+_LIT(KNmsLogIndex,"NmsLogIndex");
+
+const TInt KMaxNoNmsLog = 15;
+
+
+// ======== LOCAL FUNCTIONS ========
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Function : NewL()
+// two phased construction
+// ---------------------------------------------------------------------------
+//
+  CIRNmsLogDb* CIRNmsLogDb::NewL()
+	{
+	IRLOG_DEBUG( "CIRNmsLogDb::NewL" );
+	CIRNmsLogDb* self;
+	self=CIRNmsLogDb::NewLC();
+	CleanupStack::Pop(self);
+	IRLOG_DEBUG( "CIRNmsLogDb::NewL - Exiting." );
+	return self;
+	}
+ 
+ 
+// ---------------------------------------------------------------------------
+// Function : NewLC()
+// Two phased construction
+// ---------------------------------------------------------------------------
+//
+  CIRNmsLogDb* CIRNmsLogDb::NewLC()
+	{
+	IRLOG_DEBUG( "CIRNmsLogDb::NewLC" );
+	CIRNmsLogDb *self;
+	self=new(ELeave)CIRNmsLogDb;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	IRLOG_DEBUG( "CIRNmsLogDb::NewLC - Exiting." );
+	return self;
+	}
+ 
+
+// ---------------------------------------------------------------------------
+// CIRNmsLogDb::~CIRNmsLogDb()
+// default destructor
+// ---------------------------------------------------------------------------
+//
+CIRNmsLogDb::~CIRNmsLogDb()
+	{
+	IRLOG_DEBUG( "CIRNmsLogDb::~CIRNmsLogDb" );
+	CloseDb();
+	iFsSession.Close();
+	IRLOG_DEBUG( "CIRNmsLogDb::~CIRNmsLogDb - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNmsLogDb::CreateDbConditional()
+// Creates both the dbms files conditionally(only if not yet created)
+// calls CreateDbL()
+// ---------------------------------------------------------------------------
+//
+ TInt CIRNmsLogDb::CreateDbConditional(TFileName &aNmsLog)
+	{
+	IRLOG_DEBUG( "CIRNmsLogDb::CreateDbConditional" );
+	iDbFile.Copy(aNmsLog);
+	if( !BaflUtils::FileExists(iFsSession, iDbFile) )
+		{
+		TRAPD(error,CreateDbL(iDbFile));
+		if( error )
+			{
+			IRLOG_DEBUG( "CIRNmsLogDb::CreateDbConditional - Exiting (1)." );
+			return error;
+			}	
+		}
+	IRLOG_DEBUG( "CIRNmsLogDb::CreateDbConditional - Exiting (2)." );
+	return KErrNone;
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNmsLogDb:AddNmsLogStartL()
+// adds the NmsLog log entry into data base
+// ---------------------------------------------------------------------------
+//
+void CIRNmsLogDb::AddNmsLogStartL(CIRNmsLogger& aNmsLog)
+	{
+	IRLOG_DEBUG( "CIRNmsLogDb::AddNmsLogStartL" );
+	OpenDbL();
+	RDbTable nmsLogtable;
+	TInt error=nmsLogtable.Open(iNmsLogDb,KNmsLogTable,nmsLogtable.
+		EUpdatable);
+	CleanupClosePushL(nmsLogtable);
+	if( error )
+		{
+		CloseDb();
+		User::LeaveIfError(error);	
+		}
+	
+	//! arrange the presets in incresing order of index
+	nmsLogtable.SetIndex(KNmsLogIndex);
+	nmsLogtable.Reset();
+
+	//if NmsLog log is greater or equal to than 5
+	if( nmsLogtable.CountL() >= KMaxNoNmsLog )
+		{
+		//first row is selected
+		nmsLogtable.FirstL();
+		//the current row is selected
+		nmsLogtable.GetL();
+		//delete that entry
+		nmsLogtable.DeleteL();
+		}	
+    CleanupStack::PopAndDestroy(&nmsLogtable);
+	//Algorithm : else condition need not handle seperatly
+	//Algorithm : add NmsLogid and informations like
+	//starttime,connectedfrom,NmsLogid,connectiontype,channelid
+	//currentnetwork,homenetwork,NmsLogtable 
+	//Algorithm: if no. of NmsLog is greater than 5
+
+	_LIT(query,"SELECT * FROM %S");	
+    HBufC* sqlStr=HBufC::NewLC(query().Length() + KNmsLogTable().Length());
+	sqlStr->Des().Format(query,&KNmsLogTable);
+	
+	// Create a view on the database
+    RDbView view;     
+    error = view.Prepare(iNmsLogDb,*sqlStr);
+    if( error )
+		{
+		CloseDb();
+		User::LeaveIfError(error);	
+		}
+    CleanupStack::PopAndDestroy(sqlStr);     
+    CleanupClosePushL(view);
+    error = view.EvaluateAll();
+    if( error )
+		{
+		CloseDb();
+		User::LeaveIfError(error);	
+		}
+    CDbColSet* columns = view.ColSetL();
+    CleanupStack::PushL(columns);
+    
+    RDbColWriteStream writeStream;
+	TRAP(error,//trap start
+	   // Insert a row. Column order matches sql select statement
+	    view.InsertL();
+		//get index
+		view.SetColL(columns->ColNo(KID), aNmsLog.NmsLogId());	
+		//!open stream
+		writeStream.OpenLC(view,columns->ColNo(KNmsLogCol));
+		aNmsLog.ExternalizeL(writeStream);
+		writeStream.CommitL();
+		CleanupStack::PopAndDestroy(&writeStream);
+ 		);
+ 		
+ 	CleanupStack::PopAndDestroy(columns);
+ 	if( error!=KErrNone )
+	 	{
+	 	CloseDb();
+	 	User::LeaveIfError(error);
+	 	}
+	view.PutL();
+ 	CleanupStack::PopAndDestroy(&view);
+ 	CloseDb();
+ 	IRLOG_DEBUG( "CIRNmsLogDb::AddNmsLogStartL - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNmsLogDb::GetAllNmsLogL()
+// gets all the preset into an array 
+// ---------------------------------------------------------------------------
+//
+void CIRNmsLogDb::GetAllNmsLogL(
+	CArrayPtrFlat<CIRNmsLogger>& aNmsLogDataList)
+	{
+	IRLOG_DEBUG( "CIRNmsLogDb::GetAllNmsLogL" );
+	OpenDbL();
+	//not sure about this resetanddestroy
+	 //! Open for preset master
+	aNmsLogDataList.ResetAndDestroy();	    
+	//! temp item for holding the retrived data
+	CIRNmsLogger *item;
+	RDbColReadStream instream;    
+	RDbTable table;
+	TInt error = table.Open(iNmsLogDb, KNmsLogTable, table.EReadOnly);
+	CleanupClosePushL(table);
+	if( error!=KErrNone )
+	 	{
+	 	//if open fails function leaves
+	 	CloseDb();
+	 	User::LeaveIfError(error);
+	 	}
+
+	CDbColSet* colSet = table.ColSetL();
+	CleanupStack::PushL(colSet);
+
+	//! arrange the presets in incresing order of index
+	table.SetIndex(KNmsLogIndex);
+	table.Reset();
+	//! recursively retrive the preset data from the master table
+	for (table.FirstL(); table.AtRow(); table.NextL())
+	    {
+	    item=CIRNmsLogger::NewL();
+	    CleanupStack::PushL(item);
+	    table.GetL();
+	    instream.OpenLC( table, colSet->ColNo( KNmsLogCol ) );
+		item->InternalizeL(instream);
+		//update NmsLogid
+	    aNmsLogDataList.AppendL(item);
+	    CleanupStack::PopAndDestroy(&instream);
+	    CleanupStack::Pop(item);
+	    }
+	    
+	CleanupStack::PopAndDestroy(colSet);
+	//!close the master table
+	CleanupStack::PopAndDestroy(&table);
+	CloseDb();
+	IRLOG_DEBUG( "CIRNmsLogDb::GetAllNmsLogL - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// Function : DeleteAllNmsLog
+// delete all the NmsLog from NmsLog log entry
+// ---------------------------------------------------------------------------
+//
+void CIRNmsLogDb::DeleteAllNmsLogL()
+	{ 
+	IRLOG_DEBUG( "CIRNmsLogDb::DeleteAllNmsLogL" ); 
+	//opening a data base 
+	OpenDbL();
+	RDbTable nmsLogtable;
+	//data base table opened
+    TInt error=nmsLogtable.Open(iNmsLogDb,KNmsLogTable,nmsLogtable.
+    	EUpdatable);
+    CleanupClosePushL(nmsLogtable);
+    if( error!=KErrNone )
+	 	{
+	 	//if error we leave
+	 	CloseDb();
+	 	User::LeaveIfError(error);
+	 	}
+	//data base begin 	
+    error = iNmsLogDb.Begin();
+    if( error!=KErrNone )
+	 	{
+	 	//if open fails function leaves
+	 	CloseDb();
+	 	User::LeaveIfError(error);
+	 	}
+
+    //! arrange the presets in incresing order of index
+    nmsLogtable.SetIndex(KNmsLogIndex);
+    nmsLogtable.Reset();
+    nmsLogtable.FirstL();
+    while(nmsLogtable.AtRow())
+	    {
+	    //deleting all the rows in the table
+	    nmsLogtable.GetL();
+	    nmsLogtable.DeleteL();
+		nmsLogtable.FirstL();
+	    }
+	//saving the change
+	CleanupStack::PopAndDestroy(&nmsLogtable);
+    iNmsLogDb.Commit();
+    CloseDb();	
+    IRLOG_DEBUG( "CIRNmsLogDb::DeleteAllNmsLogL - Exiting." );
+	}   
+
+// ---------------------------------------------------------------------------
+// CIRNmsLogDb::ConstructL()
+// Standard 2nd phase construction
+// ---------------------------------------------------------------------------
+//
+void CIRNmsLogDb::ConstructL()
+	{
+	IRLOG_DEBUG( "CIRNmsLogDb::ConstructL" );
+	User::LeaveIfError(iFsSession.Connect());
+	IRLOG_DEBUG( "CIRNmsLogDb::ConstructL- Exiting." );	
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNmsLogDb::CloseDb()
+// Closes the database 
+// ---------------------------------------------------------------------------
+//
+void CIRNmsLogDb::CloseDb()
+	{
+	IRLOG_DEBUG( "CIRNmsLogDb::CloseDb" );
+	iNmsLogDb.Close();
+	IRLOG_DEBUG( "CIRNmsLogDb::CloseDb - Exiting." );
+	}
+
+
+// ---------------------------------------------------------------------------
+// Function : CreateNmsLogTableL
+// creates NmsLogtable with two column one is NmsLogid and rest of NmsLog
+// log data
+// ---------------------------------------------------------------------------
+//NmsLogTable
+//---------------------------
+//| KID   |	 KNmsLogCol |
+//---------------------------
+//|TInt32 | EDbColLongText8 |
+//---------------------------
+//
+void CIRNmsLogDb::CreateNmsLogTableL()
+	{
+	IRLOG_DEBUG( "CIRNmsLogDb::CreateNmsLogTableL" );
+	//start time of NmsLog
+	TDbCol nmsLogid(KID, EDbColInt32);
+	nmsLogid.iAttributes = TDbCol::ENotNull; 
+	
+    //!this column is used to store preset data
+    //!The column stores a potentially large amount of non-Unicode text data.
+    TDbCol nmsLogcol(KNmsLogCol, EDbColLongText8);
+   	nmsLogcol.iAttributes = TDbCol::ENotNull; 
+   	
+	CDbColSet* nmsLogcolset = CDbColSet::NewLC();
+	nmsLogcolset->AddL(nmsLogid);
+	nmsLogcolset->AddL(nmsLogcol);
+
+	// Create the NmsLoglog table with two columns
+	
+	User::LeaveIfError(iNmsLogDb.CreateTable(KNmsLogTable,
+		 *nmsLogcolset));
+	
+	//Create the KeyIndex for the table
+	CreateNmsLogIndexL();
+	CleanupStack::PopAndDestroy(nmsLogcolset);
+	IRLOG_DEBUG( "CIRNmsLogDb::CreateNmsLogTableL - Exiting." );	
+	}
+
+// ---------------------------------------------------------------------------
+// Function : CreateNmsLogIndexL
+// sets NmsLogid as the primary key
+// ---------------------------------------------------------------------------
+//
+void CIRNmsLogDb::CreateNmsLogIndexL()
+	{
+	IRLOG_DEBUG( "CIRNmsLogDb::CreateNmsLogIndexL" );
+	TDbKeyCol nmsLogid(KID);
+	CDbKey* index = CDbKey::NewLC();
+	index->AddL(nmsLogid);
+	User::LeaveIfError(iNmsLogDb.CreateIndex( KNmsLogIndex, KNmsLogTable,
+		*index));
+	CleanupStack::PopAndDestroy(index);
+	IRLOG_DEBUG( "CIRNmsLogDb::CreateNmsLogIndexL - Exiting." );
+	}
+	
+// ---------------------------------------------------------------------------
+// CIRNmsLogDb::OpenDbL()
+// opening the data base 
+// ---------------------------------------------------------------------------
+//
+ void CIRNmsLogDb::OpenDbL()
+	{
+	IRLOG_DEBUG( "CIRNmsLogDb::OpenDbL" );
+	CloseDb();
+	TInt error = KErrNone;
+	if( !BaflUtils::FileExists(iFsSession, iDbFile) )
+	    {
+	    //if file doesn't exist function leaves with error code
+	    //KErrNotFound
+	    error = KErrNotFound;
+	    User::LeaveIfError(error);
+	    }
+
+	error = iNmsLogDb.Open(iFsSession,iDbFile);	
+	if( error!=KErrNone )
+		{
+		//if database is failed to open then 
+		//function leaves
+		IRLOG_ERROR2( "CIRNmsLogDb::OpenDbL - Opening NmsLog database failed (%d)", error );
+		User::LeaveIfError(error);
+		}
+	if( iNmsLogDb.IsDamaged() || !iNmsLogDb.InTransaction() )
+		{
+		//if data base is damaged then 
+		//it tried to recover
+		//if recovery is not possible function leaves
+		error = iNmsLogDb.Recover();
+		if ( KErrNone == error)
+			{
+			//if recovered data base is compacted
+			error = iNmsLogDb.Compact();	
+			}
+	    User::LeaveIfError(error);	
+		}
+	IRLOG_DEBUG( "CIRNmsLogDb::OpenDbL - Exiting." );
+	}
+	
+
+// ---------------------------------------------------------------------------
+// CIRNmsLogDb::CreateDbL()
+// Creates both the dbms files 
+// calls CreateFavMasterTableL(),CreateFavUrlTableL
+// database filename
+// ---------------------------------------------------------------------------
+//
+ void CIRNmsLogDb::CreateDbL(TFileName& aNmsLog)
+	{
+	IRLOG_DEBUG( "CIRNmsLogDb::CreateDbL" );
+	CloseDb();
+	TInt error = iNmsLogDb.Replace(iFsSession,aNmsLog);
+	if ( error != KErrNone )
+	    {
+	    IRLOG_ERROR2( "CIRNmsLogDb::CreateDbL - Creating NmsLog database failed (%d)", error );
+	    }
+	User::LeaveIfError(error);
+	CreateNmsLogTableL();
+	IRLOG_DEBUG( "CIRNmsLogDb::CreateDbL - Exiting." );
+	}
+
+
+
+
+
+
+
+
+
+