--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/loggingservices/eventlogger/LogServ/src/LOGDUP.CPP Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,129 @@
+// Copyright (c) 2002-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:
+//
+
+#include "LOGDUP.H"
+#include "LOGFILTQ.H"
+#include "LOGQUERY.H"
+#include "logservpanic.h"
+#include "LogServDatabaseTransactionInterface.h"
+#include "LogServResourceInterpreter.h"
+#include "LogServDatabaseChangeInterface.h"
+#include "LogServSqlStrings.h"
+
+CLogDuplicate::CLogDuplicate(MLogServDatabaseTransactionInterface& aDatabase, TInt aPriority) :
+ CLogActive(aPriority),
+ iDatabase(aDatabase)
+ {
+ }
+
+CLogDuplicate::~CLogDuplicate()
+ {
+ Cancel();
+ delete iFilterList;
+ }
+
+void CLogDuplicate::ConstructL()
+ {
+ iFilterList = new(ELeave) CLogFilterList;
+ }
+
+CLogDuplicate* CLogDuplicate::NewL(MLogServDatabaseTransactionInterface& aDatabase, TInt aPriority)
+ {
+ CLogDuplicate* self = new(ELeave) CLogDuplicate(aDatabase, aPriority);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+TBool CLogDuplicate::StartL(TLogId aId, TLogRecentList aRecentList, const CLogFilter& aFilter, TRequestStatus& aStatus)
+ {
+ if (aRecentList == KLogNullRecentList)
+ return EFalse;
+
+ iId = aId;
+ iRecentList = aRecentList;
+ iFilterList->Reset();
+ iFilterList->AppendL(&aFilter);
+
+ Queue(aStatus);
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete(status, KErrNone);
+ SetActive();
+ return ETrue;
+ }
+
+void CLogDuplicate::DoRunL()
+ {
+ RLogDynBuf expr;
+ TLogFilterExprBuilder exprBuilder(iDatabase);
+ exprBuilder.BuildExprLC(expr, *iFilterList, KLogAnd);
+ TheSql.Format(KLogSqlSelectDuplicateString, iRecentList, &expr.DesC(), iId);
+ CleanupStack::PopAndDestroy(&expr);
+
+ RLogDbView view;
+ view.PrepareLC(iDatabase.DTIDatabase(), TheSql);
+ if(view.FirstL())
+ {
+ // Begin a transaction
+ TBool inTransaction = iDatabase.DTIInTransaction();
+ if(!inTransaction)
+ {
+ iDatabase.DTIBeginWithRollBackProtectionLC();
+ }
+ // Get column ids
+ static TDbColNo idColNo = 0;
+ static TDbColNo duplicateColNo = 0;
+ if(idColNo == 0)
+ {
+ CDbColSet* cs = view.ColSetL();
+ idColNo = cs->ColNo(KLogFieldIdString);
+ duplicateColNo = cs->ColNo(KLogFieldEventDuplicateString);
+ delete cs;
+ }
+ // Iterate through the events
+ do
+ {
+ // Get current event id
+ view.GetL();
+ const TLogId id = view.ColInt32(idColNo);
+ // Set the latest recent?
+ if(iId < 0)
+ {
+ iId = id;
+ }
+ // Make the change
+ view.UpdateL();
+ iId == id ? view.SetColNullL(duplicateColNo) : view.SetColL(duplicateColNo, iId);
+ view.PutL();
+ // This is a "hidden" change. It may affect the contents of a view, but the actual event hasn't changed
+ iDatabase.DTIChangeInterface().DCISubmitChangedEventContextL(ELogChangeTypeEventChangedHidden, id);
+ }
+ while(view.NextL());
+ // Commit changes
+ if(!inTransaction)
+ {
+ iDatabase.DTICommitAndCancelRollbackProtectionL();
+ }
+ }
+ CleanupStack::PopAndDestroy(&view);
+ }
+
+void CLogDuplicate::DoComplete(TInt& aStatus)
+ {
+ // Ignoring all errors because if an error occurs whilst detecting duplicate events
+ // it should not stop us actually adding the event to the log
+ aStatus = KErrNone;
+ }