diff -r 608f67c22514 -r 896e9dbc5f19 internetradio2.0/irsessionlog/src/irsessiondb.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/internetradio2.0/irsessionlog/src/irsessiondb.cpp Wed Aug 18 09:40:26 2010 +0300 @@ -0,0 +1,430 @@ +/* +* Copyright (c) 2009 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: The implementation for presentation elements. +* +*/ + + +#include + +#include "irdebug.h" +#include "irsessiondb.h" +#include "irsessionloggerutility.h" + +_LIT( KSessionTable, "Session" ); +_LIT( KID, "id" ); +_LIT( KSessionLogCol, "SessionData" ); +_LIT( KSessionIndex, "SessionIndex" ); + +const TInt KMaxNoSession = 15; + + +// --------------------------------------------------------------------------- +// Function : NewL() +// two phased construction +// --------------------------------------------------------------------------- +// + CIRSessionDb* CIRSessionDb::NewL() + { + IRLOG_DEBUG( "CIRSessionDb::NewL" ); + CIRSessionDb* self; + self = CIRSessionDb::NewLC(); + CleanupStack::Pop( self ); + IRLOG_DEBUG( "CIRSessionDb::NewL - Exiting." ); + return self; + } + +// --------------------------------------------------------------------------- +// Function : NewLC() +// Two phased construction +// --------------------------------------------------------------------------- +// + CIRSessionDb* CIRSessionDb::NewLC() + { + IRLOG_DEBUG( "CIRSessionDb::NewLC" ); + CIRSessionDb *self; + self = new( ELeave )CIRSessionDb; + CleanupStack::PushL( self ); + self->ConstructL(); + IRLOG_DEBUG( "CIRSessionDb::NewLC - Exiting." ); + return self; + } + +// --------------------------------------------------------------------------- +// CIRSessionDb::~CIRSessionDb() +// default destructor +// --------------------------------------------------------------------------- +// +CIRSessionDb::~CIRSessionDb() + { + IRLOG_DEBUG( "CIRSessionDb::~CIRSessionDb" ); + CloseDb(); + iFsSession.Close(); + IRLOG_DEBUG( "CIRSessionDb::~CIRSessionDb - Exiting." ); + } + +// --------------------------------------------------------------------------- +// CIRSessionDb::CreateDbConditional() +// Creates both the dbms files conditionally( only if not yet created ) +// calls CreateDbL() +// --------------------------------------------------------------------------- +// + TInt CIRSessionDb::CreateDbConditional( TFileName &aSession ) + { + IRLOG_DEBUG( "CIRSessionDb::CreateDbConditional" ); + iDbFile.Copy( aSession ); + if ( !BaflUtils::FileExists( iFsSession, iDbFile ) ) + { + TRAPD( error, CreateDbL( iDbFile ) ); + if ( error ) + { + IRLOG_DEBUG( "CIRSessionDb::CreateDbConditional - Exiting ( 1 )." ); + return error; + } + } + IRLOG_DEBUG( "CIRSessionDb::CreateDbConditional - Exiting ( 2 )." ); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CIRSessionDb:AddSessionStartL() +// adds the session log entry into data base +// --------------------------------------------------------------------------- +// +void CIRSessionDb::AddSessionStartL( CIRSessionLogger& aSession ) + { + IRLOG_DEBUG( "CIRSessionDb::AddSessionStartL" ); + OpenDbL(); + RDbTable sessionlogtable; + TInt error=sessionlogtable.Open( iSessionDb, KSessionTable, sessionlogtable. + EUpdatable ); + CleanupClosePushL( sessionlogtable ); + if ( error ) + { + CloseDb(); + User::LeaveIfError( error ); + } + + //! arrange the presets in incresing order of index + sessionlogtable.SetIndex( KSessionIndex ); + sessionlogtable.Reset(); + + //if session log is greater or equal to than 5 + if ( sessionlogtable.CountL() >= KMaxNoSession ) + { + //first row is selected + sessionlogtable.FirstL(); + //the current row is selected + sessionlogtable.GetL(); + //delete that entry + sessionlogtable.DeleteL(); + } + CleanupStack::PopAndDestroy( &sessionlogtable ); + //Algorithm : else condition need not handle seperatly + //Algorithm : add sessionid and informations like + //starttime,connectedfrom,sessionid,connectiontype,channelid + //currentnetwork,homenetwork,sessiontable + //Algorithm: if no. of session is greater than 5 + + _LIT( query, "SELECT * FROM %S" ); + HBufC* sqlStr = HBufC::NewLC( query().Length() + KSessionTable().Length() ); + sqlStr->Des().Format( query, &KSessionTable ); + + // Create a view on the database + RDbView view; + error = view.Prepare( iSessionDb, *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 ), aSession.SessionId() ); + //!open stream + writeStream.OpenLC( view, columns->ColNo( KSessionLogCol ) ); + aSession.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( "CIRSessionDb::AddSessionStartL - Exiting." ); + } + +// --------------------------------------------------------------------------- +// CIRSessionDb::GetAllPresetL() +// gets all the preset into an array +// --------------------------------------------------------------------------- +// +void CIRSessionDb::GetAllSessionL( + CArrayPtrFlat& aSessionDataList ) + { + IRLOG_DEBUG( "CIRSessionDb::GetAllSessionL" ); + OpenDbL(); + //not sure about this resetanddestroy + //! Open for preset master + aSessionDataList.ResetAndDestroy(); + //! temp item for holding the retrived data + CIRSessionLogger *item; + RDbColReadStream instream; + RDbTable table; + TInt error = table.Open( iSessionDb, KSessionTable, 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( KSessionIndex ); + table.Reset(); + //! recursively retrive the preset data from the master table + for ( table.FirstL(); table.AtRow(); table.NextL() ) + { + item = CIRSessionLogger::NewL(); + CleanupStack::PushL( item ); + table.GetL(); + instream.OpenLC( table, colSet->ColNo( KSessionLogCol ) ); + item->InternalizeL( instream ); + //update sessionid + aSessionDataList.AppendL( item ); + CleanupStack::PopAndDestroy( &instream ); + CleanupStack::Pop( item ); + } + + CleanupStack::PopAndDestroy( colSet ); + //!close the master table + CleanupStack::PopAndDestroy( &table ); + CloseDb(); + IRLOG_DEBUG( "CIRSessionDb::GetAllSessionL - Exiting." ); + } + +// --------------------------------------------------------------------------- +// Function : DeleteAllSession +// delete all the session from session log entry +// --------------------------------------------------------------------------- +// +void CIRSessionDb::DeleteAllSessionL() + { + IRLOG_DEBUG( "CIRSessionDb::DeleteAllSessionL" ); + //opening a data base + OpenDbL(); + RDbTable sessionlogtable; + //data base table opened + TInt error = sessionlogtable.Open( iSessionDb, KSessionTable, sessionlogtable. + EUpdatable ); + CleanupClosePushL( sessionlogtable ); + if ( error != KErrNone ) + { + //if error we leave + CloseDb(); + User::LeaveIfError( error ); + } + //data base begin + error = iSessionDb.Begin(); + if ( error != KErrNone ) + { + //if open fails function leaves + CloseDb(); + User::LeaveIfError( error ); + } + + //! arrange the presets in incresing order of index + sessionlogtable.SetIndex( KSessionIndex ); + sessionlogtable.Reset(); + sessionlogtable.FirstL(); + while( sessionlogtable.AtRow() ) + { + //deleting all the rows in the table + sessionlogtable.GetL(); + sessionlogtable.DeleteL(); + sessionlogtable.FirstL(); + } + //saving the change + CleanupStack::PopAndDestroy( &sessionlogtable ); + iSessionDb.Commit(); + CloseDb(); + IRLOG_DEBUG( "CIRSessionDb::DeleteAllSessionL - Exiting." ); + } + +// --------------------------------------------------------------------------- +// CIRSessionDb::ConstructL() +// Standard 2nd phase construction +// --------------------------------------------------------------------------- +// +void CIRSessionDb::ConstructL() + { + IRLOG_DEBUG( "CIRSessionDb::ConstructL" ); + User::LeaveIfError( iFsSession.Connect() ); + IRLOG_DEBUG( "CIRSessionDb::ConstructL- Exiting." ); + } + +// --------------------------------------------------------------------------- +// CIRSessionDb::CloseDb() +// Closes the database +// --------------------------------------------------------------------------- +// +void CIRSessionDb::CloseDb() + { + IRLOG_DEBUG( "CIRSessionDb::CloseDb" ); + iSessionDb.Close(); + IRLOG_DEBUG( "CIRSessionDb::CloseDb - Exiting." ); + } + +// --------------------------------------------------------------------------- +// Function : CreateSessionTableL +// creates sessionlogtable with two column one is sessionid and rest of session +// log data +// --------------------------------------------------------------------------- +//SessionTable +//--------------------------- +//| KID | KSessionLogCol | +//--------------------------- +//|TInt32 | EDbColLongText8 | +//--------------------------- +// +void CIRSessionDb::CreateSessionTableL() + { + IRLOG_DEBUG( "CIRSessionDb::CreateSessionTableL" ); + //start time of session + TDbCol sessionid( KID, EDbColInt32 ); + sessionid.iAttributes = TDbCol::ENotNull; + + //!this column is used to store preset data + //!The column stores a potentially large amount of non-Unicode text data. + TDbCol sessionlogcol( KSessionLogCol, EDbColLongText8 ); + sessionlogcol.iAttributes = TDbCol::ENotNull; + + CDbColSet* sessionlogcolset = CDbColSet::NewLC(); + sessionlogcolset->AddL( sessionid ); + sessionlogcolset->AddL( sessionlogcol ); + + // Create the sessionlog table with two columns + + User::LeaveIfError( iSessionDb.CreateTable( KSessionTable, + *sessionlogcolset ) ); + + //Create the KeyIndex for the table + CreateSessionIndexL(); + CleanupStack::PopAndDestroy( sessionlogcolset ); + IRLOG_DEBUG( "CIRSessionDb::CreateSessionTableL - Exiting." ); + } + +// --------------------------------------------------------------------------- +// Function : CreateSessionIndexL +// sets sessionid as the primary key +// --------------------------------------------------------------------------- +// +void CIRSessionDb::CreateSessionIndexL() + { + IRLOG_DEBUG( "CIRSessionDb::CreateSessionIndexL" ); + TDbKeyCol sessionid( KID ); + CDbKey* index = CDbKey::NewLC(); + index->AddL( sessionid ); + User::LeaveIfError( iSessionDb.CreateIndex( KSessionIndex, KSessionTable, + *index ) ); + CleanupStack::PopAndDestroy( index ); + IRLOG_DEBUG( "CIRSessionDb::CreateSessionIndexL - Exiting." ); + } + +// --------------------------------------------------------------------------- +// CIRSessionDb::OpenDbL() +// opening the data base +// --------------------------------------------------------------------------- +// + void CIRSessionDb::OpenDbL() + { + IRLOG_DEBUG( "CIRSessionDb::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 = iSessionDb.Open( iFsSession, iDbFile ); + if ( error != KErrNone ) + { + //if database is failed to open then + //function leaves + IRLOG_ERROR2( "CIRSessionDb::OpenDbL - Opening session database failed ( %d )", error ); + User::LeaveIfError( error ); + } + if ( iSessionDb.IsDamaged() || !iSessionDb.InTransaction() ) + { + //if data base is damaged then + //it tried to recover + //if recovery is not possible function leaves + error = iSessionDb.Recover(); + if ( KErrNone == error ) + { + //if recovered data base is compacted + error = iSessionDb.Compact(); + } + User::LeaveIfError( error ); + } + IRLOG_DEBUG( "CIRSessionDb::OpenDbL - Exiting." ); + } + +// --------------------------------------------------------------------------- +// CIRSessionDb::CreateDbL() +// Creates both the dbms files +// calls CreateFavMasterTableL(),CreateFavUrlTableL +// database filename +// --------------------------------------------------------------------------- +// + void CIRSessionDb::CreateDbL( TFileName& aSession ) + { + IRLOG_DEBUG( "CIRSessionDb::CreateDbL" ); + CloseDb(); + TInt error = iSessionDb.Replace( iFsSession, aSession ); + if ( error != KErrNone ) + { + IRLOG_ERROR2( "CIRSessionDb::CreateDbL - Creating session database failed ( %d )", error ); + } + User::LeaveIfError( error ); + CreateSessionTableL(); + IRLOG_DEBUG( "CIRSessionDb::CreateDbL - Exiting." ); + }