loggingservices/eventlogger/LogServ/src/LogServDatabaseDriver.cpp
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loggingservices/eventlogger/LogServ/src/LogServDatabaseDriver.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,472 @@
+// 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 <logclientchangeobserver.h>
+#include "LogServDatabaseDriver.h"
+#include "LOGMAIN.H"
+#include "LOGADD.H"
+#include "LOGCHNGE.H"
+#include "LOGGET.H"
+#include "LOGDEL.H"
+#include "LOGQUERY.H"
+#include "logservpanic.h"
+#include "LogServCacheConfig.h"
+#include "LogServCacheTypes.h"
+#include "LogServBackupInterface.h"
+#include "LogServViewWindowFetcher.h"
+#include "LogServRecentListManager.h"
+#include "LogServDatabaseTransactionInterface.h"
+#include "LogServDatabaseChangeInterface.h"
+#include "LogServSqlStrings.h"
+
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// -----> CLogServDatabaseDriver (source)
+/////////////////////////////////////////////////////////////////////////////////////////
+
+CLogServDatabaseDriver::CLogServDatabaseDriver(MLogServBackupInterface& aBackupInterface, MLogServDatabaseTransactionInterface& aDatabase, CLogServResourceInterpreter& aResourceInterface, CLogServRecentListManager& aRecentListManager, TInt aHitterPriorities)
+:	iHitterPriorities(aHitterPriorities), iBackupInterface(aBackupInterface), iDatabase(aDatabase), iResourceInterface(aResourceInterface), iRecentListManager(aRecentListManager)
+	{
+	}
+
+CLogServDatabaseDriver::~CLogServDatabaseDriver()
+	{
+	iBackupInterface.BIObserverRemove(*this);
+	DestroyHitters();
+	}
+
+void CLogServDatabaseDriver::ConstructL()
+	{
+	iBackupInterface.BIObserverAddL(*this, MLogServBackupInterface::EObjectDatabaseDriver);
+	//
+	CreateHittersL();
+	}
+
+CLogServDatabaseDriver* CLogServDatabaseDriver::NewL(MLogServBackupInterface& aBackupInterface, MLogServDatabaseTransactionInterface& aDatabase, CLogServResourceInterpreter& aResourceInterface, CLogServRecentListManager& aRecentListManager, TInt aHitterPriorities)
+	{
+	CLogServDatabaseDriver* self = new(ELeave) CLogServDatabaseDriver(aBackupInterface, aDatabase, aResourceInterface, aRecentListManager, aHitterPriorities);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void CLogServDatabaseDriver::BOHandleEventL(TLogServBackupEvent aEvent)
+	{
+	switch(aEvent)
+		{
+	case EBackupStarting:
+		LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - Backup STARTING");
+		DestroyHitters();
+		break;
+	case EBackupEnded:
+		LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - Backup ENDING");
+		CreateHittersL();
+		break;
+	default:
+		__ASSERT_DEBUG(EFalse, User::Invariant());
+		break;
+		}
+
+	LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - end");
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void CLogServDatabaseDriver::TaskEventAddL(TRequestStatus& aStatus, CLogEvent& aEvent, const RMessage2& aMessage)
+//
+// Add an event to the database
+//
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskEventAddL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+
+	// Get the recent list for this event
+	const CLogServRecentList* list = iRecentListManager.GetRecentList(aEvent);
+
+	// Do the work
+	iAddEvent->StartL(aEvent, list, aStatus, aMessage);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskEventAddL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskEventChangeL(TRequestStatus& aStatus, const CLogEvent& aEvent, const RMessage2& aMessage)
+//
+// Change an event in the database
+//
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskEventChangeL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+
+	// Get the recent list for this event
+	const CLogServRecentList* list = iRecentListManager.GetRecentList(aEvent);
+	
+	//
+
+	// Do the work
+	iChangeEvent->StartL(aEvent, list, aStatus, aMessage);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskEventChangeL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskEventGetL(TRequestStatus& aStatus, CLogEvent& aEvent, const RMessage2& aMessage)
+//
+// Get an event from the database
+//
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskEventGetL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+
+	// Do the work
+	iGetEvent->StartL(aEvent, aStatus, aMessage);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskEventGetL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskEventDeleteL(TRequestStatus& aStatus, TLogId aId, const RMessage2& aMessage)
+//
+// Delete an event from the database
+//
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskEventDeleteL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+
+	iDeleteEvent->StartL(aId, aStatus, aMessage);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskEventDeleteL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskEventTypeAddL(TRequestStatus& aStatus, const CLogEventType& aEventType)
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeAddL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+	iDatabase.DTICacheTypes().AddTypeL(aEventType);
+	//
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeAddL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskEventTypeGetL(TRequestStatus& aStatus, const CLogEventType*& aEventType, TUid aUid)
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeGetL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+
+	const TLogServCacheTypeEntry& entry = iDatabase.DTICacheTypes().FindByUid(aUid);
+	aEventType = entry.iEventType;
+	if(entry.iEventTypeId == KLogNullTypeId)
+		{
+		User::Leave(KErrNotFound);
+		}
+
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeGetL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskEventTypeChangeL(TRequestStatus& aStatus, const CLogEventType& aEventType)
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeChangeL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+	const TInt error = iDatabase.DTICacheTypes().ChangeType(aEventType);
+	//
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, error);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeChangeL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskEventTypeDeleteL(TRequestStatus& aStatus, TUid aType)
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeDeleteL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+	const TInt error = iDatabase.DTICacheTypes().DeleteType(aType);
+	//
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, error);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeDeleteL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskConfigGetL(TRequestStatus& aStatus, TLogConfig& aConfig)
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskConfigGetL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+	aConfig = iDatabase.DTICacheConfig().Config();
+	//
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskConfigGetL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskConfigChangeL(TRequestStatus& aStatus, const TLogConfig& aConfig)
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskConfigChangeL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+
+	iChangeConfig->StartL(aConfig, aStatus);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskConfigChangeL() - end");
+	}
+
+// aDate is expected to be UTC
+void CLogServDatabaseDriver::TaskClearLogL(TRequestStatus& aStatus, const TTime& aDate
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
+		, TSimId aSimId
+#endif		
+		)
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskClearLogL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+
+	// Format the date.
+	TBuf<KLogMaxDateLength> dateString;
+	aDate.FormatL(dateString, LogUtils::DateFormatForLocale());
+	// Get list of events to purge
+	TheSql.Format(KLogSqlDeleteOldestString, &dateString);
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
+	if(aSimId != KLogNullSimId)
+		{
+		TheSql.Append(KLogAnd);
+		TheSql.AppendFormat(KLogUNumberPredicate, &KLogFieldEventSimId, aSimId);
+		}
+#endif	
+	iDatabase.DTIBeginWithRollBackProtectionLC();
+	TInt rc = iDatabase.DTIExecuteSql(TheSql);
+	User::LeaveIfError(rc);
+	if(rc > 0)
+	    {
+		// Add log cleared events. First is for the window code, which receives messages
+		// through the old API. The 2nd is for clients of the log engine
+		iDatabase.DTIChangeInterface().DCISubmitChangedEventContextL(ELogChangeTypeLogCleared, KLogNullId);
+		iDatabase.DTIChangeInterface().DCISubmitGlobalChangeContextL(KLogClientChangeEventLogCleared);
+		}
+	iDatabase.DTICommitAndCancelRollbackProtectionL();
+	// Complete the request
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskClearLogL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskClearRecentL(TRequestStatus& aStatus, TInt aRecentList
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
+		, TSimId aSimId
+#endif		
+		)
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskClearRecentL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+
+	TheSql.Copy(KLogSqlSelectAllRecent);
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
+	TBool whereAdded = EFalse;
+#endif	
+	// Get events to clear from recent lists
+	if(aRecentList != KLogNullRecentList)
+		{
+		TheSql.Append(KLogWhere);
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
+		whereAdded = ETrue;
+#endif		
+		TheSql.AppendFormat(KLogNumberPredicate, &KLogFieldEventRecentString, aRecentList);
+		}
+#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
+	//..and clear from recent lists with specific SimId
+	if(aSimId != KLogNullSimId)
+		{
+		if(whereAdded)
+			{
+			TheSql.Append(KLogAnd);
+			}
+		else
+			{
+			TheSql.Append(KLogWhere);
+			}
+		TheSql.AppendFormat(KLogUNumberPredicate, &KLogFieldEventSimId, aSimId);
+		}
+#endif	
+	
+    RLogDbView view;
+    view.PrepareLC(iDatabase.DTIDatabase(), TheSql);
+	
+	if(view.FirstL())
+		{
+        static TDbColNo colId = 0;
+        static TDbColNo colRecent = 0;
+        static TDbColNo colDuplicate = 0;
+        if(colId == 0)
+            {
+            CDbColSet* cs = view.ColSetL();
+            colId = cs->ColNo(KLogFieldIdString);
+            colRecent = cs->ColNo(KLogFieldEventRecentString);
+            colDuplicate = cs->ColNo(KLogFieldEventDuplicateString);
+            delete cs;
+            }
+		iDatabase.DTIBeginWithRollBackProtectionLC();
+		// Iterate through the events
+		do
+			{
+			// Get current event id
+			view.GetL();
+			const TLogId id = view.ColInt32(colId);
+			// Make the change
+			view.UpdateL();
+			view.SetColNullL(colRecent);
+			view.SetColNullL(colDuplicate);
+			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());
+		iDatabase.DTICommitAndCancelRollbackProtectionL();
+		}
+    CleanupStack::PopAndDestroy(&view);
+
+	// Complete the request
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskClearRecentL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskMaintenanceStartL(TRequestStatus& aStatus, TBool aPurge)
+//
+//	Start database maintenance process
+//
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskMaintenanceStartL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+
+	iMaintainer->Start(aPurge, aStatus);
+
+	LOGTEXT("CLogServDatabaseDriver::TaskMaintenanceStartL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskBuildWindowL(TRequestStatus& aStatus, const CLogServViewBase& aView, const TLogTransferWindow& aWindow, const RMessage2& aMessage)
+//
+//	Build a client window
+//
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskBuildWindowL()");
+
+	// Handle when we're doing a backup
+	iBackupInterface.BIValidateStateForDatabaseOperationL();
+
+	iWindowFetcher->StartL(aStatus, aView, aWindow, aMessage); 
+
+	LOGTEXT("CLogServDatabaseDriver::TaskBuildWindowL() - end");
+	}
+
+void CLogServDatabaseDriver::TaskCancelCurrent()
+//
+//	Cancel all active tasks
+//
+	{
+	LOGTEXT("CLogServDatabaseDriver::TaskCancelCurrent()");
+
+	if	(iAddEvent)
+		iAddEvent->Cancel();
+	if	(iChangeEvent)
+		iChangeEvent->Cancel();
+	if	(iGetEvent)
+		iGetEvent->Cancel();
+	if	(iDeleteEvent)
+		iDeleteEvent->Cancel();
+	if	(iChangeConfig)
+		iChangeConfig->Cancel();
+	if	(iWindowFetcher)
+		iWindowFetcher->Cancel();
+
+	LOGTEXT("CLogServDatabaseDriver::TaskCancelCurrent() - end");
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void CLogServDatabaseDriver::DestroyHitters()
+	{
+	LOGTEXT("CLogServDatabaseDriver::DestroyHitters()");
+
+	TaskCancelCurrent();
+	//
+	delete iMaintainer;
+	iMaintainer = NULL;
+	delete iAddEvent;
+	iAddEvent = NULL;
+	delete iChangeEvent;
+	iChangeEvent = NULL;
+	delete iGetEvent;
+	iGetEvent = NULL;
+	delete iDeleteEvent;
+	iDeleteEvent = NULL;
+	delete iChangeConfig;
+	iChangeConfig = NULL;
+	delete iWindowFetcher;
+	iWindowFetcher = NULL;
+
+	LOGTEXT("CLogServDatabaseDriver::DestroyHitters() - end");
+	}
+
+void CLogServDatabaseDriver::CreateHittersL()
+	{
+	LOGTEXT("CLogServDatabaseDriver::CreateHittersL()");
+
+	iMaintainer = CLogMaintenance::NewL(iDatabase, iHitterPriorities);
+	iAddEvent = CLogAddEvent::NewL(iDatabase, iHitterPriorities);
+	iChangeEvent = CLogChangeEvent::NewL(iDatabase, iHitterPriorities);
+	iGetEvent = CLogGetEvent::NewL(iDatabase, iHitterPriorities);
+	iDeleteEvent = CLogDeleteEvent::NewL(iDatabase, iHitterPriorities);
+	iChangeConfig = CLogChangeConfig::NewL(iDatabase, iRecentListManager, iHitterPriorities);
+	iWindowFetcher = CLogServViewWindowFetcher::NewL(iDatabase, iHitterPriorities);
+
+	LOGTEXT("CLogServDatabaseDriver::CreateHittersL() - end");
+	}