sl@0: // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "LOGDUP.H" sl@0: #include "LOGFILTQ.H" sl@0: #include "LOGQUERY.H" sl@0: #include "logservpanic.h" sl@0: #include "LogServDatabaseTransactionInterface.h" sl@0: #include "LogServResourceInterpreter.h" sl@0: #include "LogServDatabaseChangeInterface.h" sl@0: #include "LogServSqlStrings.h" sl@0: sl@0: CLogDuplicate::CLogDuplicate(MLogServDatabaseTransactionInterface& aDatabase, TInt aPriority) : sl@0: CLogActive(aPriority), sl@0: iDatabase(aDatabase) sl@0: { sl@0: } sl@0: sl@0: CLogDuplicate::~CLogDuplicate() sl@0: { sl@0: Cancel(); sl@0: delete iFilterList; sl@0: } sl@0: sl@0: void CLogDuplicate::ConstructL() sl@0: { sl@0: iFilterList = new(ELeave) CLogFilterList; sl@0: } sl@0: sl@0: CLogDuplicate* CLogDuplicate::NewL(MLogServDatabaseTransactionInterface& aDatabase, TInt aPriority) sl@0: { sl@0: CLogDuplicate* self = new(ELeave) CLogDuplicate(aDatabase, aPriority); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: TBool CLogDuplicate::StartL(TLogId aId, TLogRecentList aRecentList, const CLogFilter& aFilter, TRequestStatus& aStatus) sl@0: { sl@0: if (aRecentList == KLogNullRecentList) sl@0: return EFalse; sl@0: sl@0: iId = aId; sl@0: iRecentList = aRecentList; sl@0: iFilterList->Reset(); sl@0: iFilterList->AppendL(&aFilter); sl@0: sl@0: Queue(aStatus); sl@0: TRequestStatus* status = &iStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: SetActive(); sl@0: return ETrue; sl@0: } sl@0: sl@0: void CLogDuplicate::DoRunL() sl@0: { sl@0: RLogDynBuf expr; sl@0: TLogFilterExprBuilder exprBuilder(iDatabase); sl@0: exprBuilder.BuildExprLC(expr, *iFilterList, KLogAnd); sl@0: TheSql.Format(KLogSqlSelectDuplicateString, iRecentList, &expr.DesC(), iId); sl@0: CleanupStack::PopAndDestroy(&expr); sl@0: sl@0: RLogDbView view; sl@0: view.PrepareLC(iDatabase.DTIDatabase(), TheSql); sl@0: if(view.FirstL()) sl@0: { sl@0: // Begin a transaction sl@0: TBool inTransaction = iDatabase.DTIInTransaction(); sl@0: if(!inTransaction) sl@0: { sl@0: iDatabase.DTIBeginWithRollBackProtectionLC(); sl@0: } sl@0: // Get column ids sl@0: static TDbColNo idColNo = 0; sl@0: static TDbColNo duplicateColNo = 0; sl@0: if(idColNo == 0) sl@0: { sl@0: CDbColSet* cs = view.ColSetL(); sl@0: idColNo = cs->ColNo(KLogFieldIdString); sl@0: duplicateColNo = cs->ColNo(KLogFieldEventDuplicateString); sl@0: delete cs; sl@0: } sl@0: // Iterate through the events sl@0: do sl@0: { sl@0: // Get current event id sl@0: view.GetL(); sl@0: const TLogId id = view.ColInt32(idColNo); sl@0: // Set the latest recent? sl@0: if(iId < 0) sl@0: { sl@0: iId = id; sl@0: } sl@0: // Make the change sl@0: view.UpdateL(); sl@0: iId == id ? view.SetColNullL(duplicateColNo) : view.SetColL(duplicateColNo, iId); sl@0: view.PutL(); sl@0: // This is a "hidden" change. It may affect the contents of a view, but the actual event hasn't changed sl@0: iDatabase.DTIChangeInterface().DCISubmitChangedEventContextL(ELogChangeTypeEventChangedHidden, id); sl@0: } sl@0: while(view.NextL()); sl@0: // Commit changes sl@0: if(!inTransaction) sl@0: { sl@0: iDatabase.DTICommitAndCancelRollbackProtectionL(); sl@0: } sl@0: } sl@0: CleanupStack::PopAndDestroy(&view); sl@0: } sl@0: sl@0: void CLogDuplicate::DoComplete(TInt& aStatus) sl@0: { sl@0: // Ignoring all errors because if an error occurs whilst detecting duplicate events sl@0: // it should not stop us actually adding the event to the log sl@0: aStatus = KErrNone; sl@0: }