loggingservices/eventlogger/LogServ/src/LOGMAIN.CPP
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loggingservices/eventlogger/LogServ/src/LOGMAIN.CPP	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,174 @@
+// Copyright (c) 2003-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 "LOGMAIN.H"
+#include "LOGREC.H"
+#include "LOGCOMP.H"
+#include "logservpanic.h"
+#include "LOGQUERY.H"
+#include "LogServDatabaseTransactionInterface.h"
+#include "LogServCacheConfig.h"
+#include "LogCliServShared.h"
+#include "LogServDatabaseChangeInterface.h"
+#include "LogServSqlStrings.h"
+
+CLogMaintenance::CLogMaintenance(MLogServDatabaseTransactionInterface& aDatabase, TInt aPriority)
+: CLogActive(aPriority), iDatabase(aDatabase)
+	{
+	}
+
+CLogMaintenance::~CLogMaintenance()
+	{
+	Cancel();
+	delete iRecover;
+	delete iCompact;
+	}
+
+void CLogMaintenance::ConstructL()
+	{
+	iRecover = new(ELeave)CLogRecover(iDatabase, Priority());
+	iCompact = new(ELeave)CLogCompact(iDatabase, Priority());
+	}
+
+CLogMaintenance* CLogMaintenance::NewL(MLogServDatabaseTransactionInterface& aDatabase, TInt aPriority)
+	{
+	CLogMaintenance* self = new(ELeave)CLogMaintenance(aDatabase, aPriority);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CLogMaintenance::Start(TBool aPurge, TRequestStatus& aStatus)
+	{
+	iState = ELogRecover;
+	iPurge = aPurge;
+
+	Queue(aStatus);
+	TRequestStatus* status = &iStatus;
+	User::RequestComplete(status, KErrNone);
+	SetActive();
+	}
+
+TBool CLogMaintenance::DoNextL()
+	{
+	switch(iState)
+		{
+		// Recover the database
+		case ELogRecover:
+			if (iRecover->Start(iStatus))
+				{
+				iState = ELogGetConfig;
+				return ETrue;
+				}
+			// Fall Through
+
+		// Get the log configuration
+		case ELogGetConfig:
+			if (iPurge)
+				{
+				iConfig = iDatabase.DTICacheConfig().Config();				
+				TRequestStatus* status = &iStatus;
+				User::RequestComplete(status, KErrNone);
+				iState = iConfig.iMaxEventAge == 0 ? ELogCompact : ELogPurgeMainAge;
+				return ETrue;
+				}
+			// Fall through
+
+		// Purge old events from the log
+		case ELogPurgeMainAge:
+			if (iPurge)
+				{
+				// Get the max age
+				TTime date;
+				date.UniversalTime();
+				date -= TTimeIntervalSeconds(iConfig.iMaxEventAge);
+
+				ClearLogL(date, iStatus);
+				iState = ELogCompact;
+				return ETrue;
+				}
+
+		// Compact the database
+		case ELogCompact:
+			iCompact->Start(iStatus);
+			iState = ELogComplete;
+			return ETrue;
+
+		case ELogComplete:
+			break;
+
+		default:
+			__ASSERT_DEBUG(EFalse, Panic(ELogNoSuchState7));
+		};
+
+	return EFalse;
+	}
+
+void CLogMaintenance::DoRunL()
+	{
+	if (DoNextL())
+		SetActive();
+	}
+
+void CLogMaintenance::DoCancel()
+	{
+	iRecover->Cancel();
+	iCompact->Cancel();
+
+	CLogActive::DoCancel();
+	}
+
+void CLogMaintenance::DoComplete(TInt& aStatus)
+	{
+	// Ignore all errors
+	aStatus = KErrNone;
+	}
+
+// aDate is expected to be UTC  
+void CLogMaintenance::ClearLogL(const TTime& aDate, TRequestStatus& aStatus)
+	{
+	TBuf<KLogMaxDateLength> date;
+	aDate.FormatL(date, LogUtils::DateFormatForLocale());
+    // Get list of events to purge
+    TheSql.Format(KLogSqlSelectOldestString, &date);
+    RLogDbView view;
+    view.PrepareLC(iDatabase.DTIDatabase(), TheSql);
+	if(view.FirstL())
+		{
+        static TDbColNo idColNo = 0;
+        if(idColNo == 0)
+            {
+            CDbColSet* cs = view.ColSetL();
+            idColNo = cs->ColNo(KLogFieldIdString);
+            delete cs;
+            }
+        iDatabase.DTIBeginWithRollBackProtectionLC();
+		do
+			{
+			view.GetL();
+			const TLogId id = view.ColInt32(idColNo);
+			view.DeleteL();
+			iDatabase.DTIChangeInterface().DCISubmitChangedEventContextL(ELogChangeTypeEventDeleted, id);
+			}
+		while(view.NextL());
+		// Commit changes
+		iDatabase.DTICommitAndCancelRollbackProtectionL();
+		}
+	CleanupStack::PopAndDestroy(&view);
+	// Complete the request
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+	}