os/persistentdata/loggingservices/eventlogger/LogServ/src/LogServDatabaseDriver.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 #include <logclientchangeobserver.h>
    17 #include "LogServDatabaseDriver.h"
    18 #include "LOGMAIN.H"
    19 #include "LOGADD.H"
    20 #include "LOGCHNGE.H"
    21 #include "LOGGET.H"
    22 #include "LOGDEL.H"
    23 #include "LOGQUERY.H"
    24 #include "logservpanic.h"
    25 #include "LogServCacheConfig.h"
    26 #include "LogServCacheTypes.h"
    27 #include "LogServBackupInterface.h"
    28 #include "LogServViewWindowFetcher.h"
    29 #include "LogServRecentListManager.h"
    30 #include "LogServDatabaseTransactionInterface.h"
    31 #include "LogServDatabaseChangeInterface.h"
    32 #include "LogServSqlStrings.h"
    33 
    34 
    35 /////////////////////////////////////////////////////////////////////////////////////////
    36 // -----> CLogServDatabaseDriver (source)
    37 /////////////////////////////////////////////////////////////////////////////////////////
    38 
    39 CLogServDatabaseDriver::CLogServDatabaseDriver(MLogServBackupInterface& aBackupInterface, MLogServDatabaseTransactionInterface& aDatabase, CLogServResourceInterpreter& aResourceInterface, CLogServRecentListManager& aRecentListManager, TInt aHitterPriorities)
    40 :	iHitterPriorities(aHitterPriorities), iBackupInterface(aBackupInterface), iDatabase(aDatabase), iResourceInterface(aResourceInterface), iRecentListManager(aRecentListManager)
    41 	{
    42 	}
    43 
    44 CLogServDatabaseDriver::~CLogServDatabaseDriver()
    45 	{
    46 	iBackupInterface.BIObserverRemove(*this);
    47 	DestroyHitters();
    48 	}
    49 
    50 void CLogServDatabaseDriver::ConstructL()
    51 	{
    52 	iBackupInterface.BIObserverAddL(*this, MLogServBackupInterface::EObjectDatabaseDriver);
    53 	//
    54 	CreateHittersL();
    55 	}
    56 
    57 CLogServDatabaseDriver* CLogServDatabaseDriver::NewL(MLogServBackupInterface& aBackupInterface, MLogServDatabaseTransactionInterface& aDatabase, CLogServResourceInterpreter& aResourceInterface, CLogServRecentListManager& aRecentListManager, TInt aHitterPriorities)
    58 	{
    59 	CLogServDatabaseDriver* self = new(ELeave) CLogServDatabaseDriver(aBackupInterface, aDatabase, aResourceInterface, aRecentListManager, aHitterPriorities);
    60 	CleanupStack::PushL(self);
    61 	self->ConstructL();
    62 	CleanupStack::Pop(self);
    63 	return self;
    64 	}
    65 
    66 /////////////////////////////////////////////////////////////////////////////////////////
    67 /////////////////////////////////////////////////////////////////////////////////////////
    68 /////////////////////////////////////////////////////////////////////////////////////////
    69 
    70 void CLogServDatabaseDriver::BOHandleEventL(TLogServBackupEvent aEvent)
    71 	{
    72 	switch(aEvent)
    73 		{
    74 	case EBackupStarting:
    75 		LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - Backup STARTING");
    76 		DestroyHitters();
    77 		break;
    78 	case EBackupEnded:
    79 		LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - Backup ENDING");
    80 		CreateHittersL();
    81 		break;
    82 	default:
    83 		__ASSERT_DEBUG(EFalse, User::Invariant());
    84 		break;
    85 		}
    86 
    87 	LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - end");
    88 	}
    89 
    90 /////////////////////////////////////////////////////////////////////////////////////////
    91 /////////////////////////////////////////////////////////////////////////////////////////
    92 /////////////////////////////////////////////////////////////////////////////////////////
    93 
    94 void CLogServDatabaseDriver::TaskEventAddL(TRequestStatus& aStatus, CLogEvent& aEvent, const RMessage2& aMessage)
    95 //
    96 // Add an event to the database
    97 //
    98 	{
    99 	LOGTEXT("CLogServDatabaseDriver::TaskEventAddL()");
   100 
   101 	// Handle when we're doing a backup
   102 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   103 
   104 	// Get the recent list for this event
   105 	const CLogServRecentList* list = iRecentListManager.GetRecentList(aEvent);
   106 
   107 	// Do the work
   108 	iAddEvent->StartL(aEvent, list, aStatus, aMessage);
   109 
   110 	LOGTEXT("CLogServDatabaseDriver::TaskEventAddL() - end");
   111 	}
   112 
   113 void CLogServDatabaseDriver::TaskEventChangeL(TRequestStatus& aStatus, const CLogEvent& aEvent, const RMessage2& aMessage)
   114 //
   115 // Change an event in the database
   116 //
   117 	{
   118 	LOGTEXT("CLogServDatabaseDriver::TaskEventChangeL()");
   119 
   120 	// Handle when we're doing a backup
   121 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   122 
   123 	// Get the recent list for this event
   124 	const CLogServRecentList* list = iRecentListManager.GetRecentList(aEvent);
   125 	
   126 	//
   127 
   128 	// Do the work
   129 	iChangeEvent->StartL(aEvent, list, aStatus, aMessage);
   130 
   131 	LOGTEXT("CLogServDatabaseDriver::TaskEventChangeL() - end");
   132 	}
   133 
   134 void CLogServDatabaseDriver::TaskEventGetL(TRequestStatus& aStatus, CLogEvent& aEvent, const RMessage2& aMessage)
   135 //
   136 // Get an event from the database
   137 //
   138 	{
   139 	LOGTEXT("CLogServDatabaseDriver::TaskEventGetL()");
   140 
   141 	// Handle when we're doing a backup
   142 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   143 
   144 	// Do the work
   145 	iGetEvent->StartL(aEvent, aStatus, aMessage);
   146 
   147 	LOGTEXT("CLogServDatabaseDriver::TaskEventGetL() - end");
   148 	}
   149 
   150 void CLogServDatabaseDriver::TaskEventDeleteL(TRequestStatus& aStatus, TLogId aId, const RMessage2& aMessage)
   151 //
   152 // Delete an event from the database
   153 //
   154 	{
   155 	LOGTEXT("CLogServDatabaseDriver::TaskEventDeleteL()");
   156 
   157 	// Handle when we're doing a backup
   158 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   159 
   160 	iDeleteEvent->StartL(aId, aStatus, aMessage);
   161 
   162 	LOGTEXT("CLogServDatabaseDriver::TaskEventDeleteL() - end");
   163 	}
   164 
   165 void CLogServDatabaseDriver::TaskEventTypeAddL(TRequestStatus& aStatus, const CLogEventType& aEventType)
   166 	{
   167 	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeAddL()");
   168 
   169 	// Handle when we're doing a backup
   170 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   171 	iDatabase.DTICacheTypes().AddTypeL(aEventType);
   172 	//
   173 	TRequestStatus* status = &aStatus;
   174 	User::RequestComplete(status, KErrNone);
   175 
   176 	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeAddL() - end");
   177 	}
   178 
   179 void CLogServDatabaseDriver::TaskEventTypeGetL(TRequestStatus& aStatus, const CLogEventType*& aEventType, TUid aUid)
   180 	{
   181 	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeGetL()");
   182 
   183 	// Handle when we're doing a backup
   184 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   185 
   186 	const TLogServCacheTypeEntry& entry = iDatabase.DTICacheTypes().FindByUid(aUid);
   187 	aEventType = entry.iEventType;
   188 	if(entry.iEventTypeId == KLogNullTypeId)
   189 		{
   190 		User::Leave(KErrNotFound);
   191 		}
   192 
   193 	TRequestStatus* status = &aStatus;
   194 	User::RequestComplete(status, KErrNone);
   195 
   196 	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeGetL() - end");
   197 	}
   198 
   199 void CLogServDatabaseDriver::TaskEventTypeChangeL(TRequestStatus& aStatus, const CLogEventType& aEventType)
   200 	{
   201 	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeChangeL()");
   202 
   203 	// Handle when we're doing a backup
   204 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   205 	const TInt error = iDatabase.DTICacheTypes().ChangeType(aEventType);
   206 	//
   207 	TRequestStatus* status = &aStatus;
   208 	User::RequestComplete(status, error);
   209 
   210 	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeChangeL() - end");
   211 	}
   212 
   213 void CLogServDatabaseDriver::TaskEventTypeDeleteL(TRequestStatus& aStatus, TUid aType)
   214 	{
   215 	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeDeleteL()");
   216 
   217 	// Handle when we're doing a backup
   218 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   219 	const TInt error = iDatabase.DTICacheTypes().DeleteType(aType);
   220 	//
   221 	TRequestStatus* status = &aStatus;
   222 	User::RequestComplete(status, error);
   223 
   224 	LOGTEXT("CLogServDatabaseDriver::TaskEventTypeDeleteL() - end");
   225 	}
   226 
   227 void CLogServDatabaseDriver::TaskConfigGetL(TRequestStatus& aStatus, TLogConfig& aConfig)
   228 	{
   229 	LOGTEXT("CLogServDatabaseDriver::TaskConfigGetL()");
   230 
   231 	// Handle when we're doing a backup
   232 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   233 	aConfig = iDatabase.DTICacheConfig().Config();
   234 	//
   235 	TRequestStatus* status = &aStatus;
   236 	User::RequestComplete(status, KErrNone);
   237 
   238 	LOGTEXT("CLogServDatabaseDriver::TaskConfigGetL() - end");
   239 	}
   240 
   241 void CLogServDatabaseDriver::TaskConfigChangeL(TRequestStatus& aStatus, const TLogConfig& aConfig)
   242 	{
   243 	LOGTEXT("CLogServDatabaseDriver::TaskConfigChangeL()");
   244 
   245 	// Handle when we're doing a backup
   246 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   247 
   248 	iChangeConfig->StartL(aConfig, aStatus);
   249 
   250 	LOGTEXT("CLogServDatabaseDriver::TaskConfigChangeL() - end");
   251 	}
   252 
   253 // aDate is expected to be UTC
   254 void CLogServDatabaseDriver::TaskClearLogL(TRequestStatus& aStatus, const TTime& aDate
   255 #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
   256 		, TSimId aSimId
   257 #endif		
   258 		)
   259 	{
   260 	LOGTEXT("CLogServDatabaseDriver::TaskClearLogL()");
   261 
   262 	// Handle when we're doing a backup
   263 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   264 
   265 	// Format the date.
   266 	TBuf<KLogMaxDateLength> dateString;
   267 	aDate.FormatL(dateString, LogUtils::DateFormatForLocale());
   268 	// Get list of events to purge
   269 	TheSql.Format(KLogSqlDeleteOldestString, &dateString);
   270 #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
   271 	if(aSimId != KLogNullSimId)
   272 		{
   273 		TheSql.Append(KLogAnd);
   274 		TheSql.AppendFormat(KLogUNumberPredicate, &KLogFieldEventSimId, aSimId);
   275 		}
   276 #endif	
   277 	iDatabase.DTIBeginWithRollBackProtectionLC();
   278 	TInt rc = iDatabase.DTIExecuteSql(TheSql);
   279 	User::LeaveIfError(rc);
   280 	if(rc > 0)
   281 	    {
   282 		// Add log cleared events. First is for the window code, which receives messages
   283 		// through the old API. The 2nd is for clients of the log engine
   284 		iDatabase.DTIChangeInterface().DCISubmitChangedEventContextL(ELogChangeTypeLogCleared, KLogNullId);
   285 		iDatabase.DTIChangeInterface().DCISubmitGlobalChangeContextL(KLogClientChangeEventLogCleared);
   286 		}
   287 	iDatabase.DTICommitAndCancelRollbackProtectionL();
   288 	// Complete the request
   289 	TRequestStatus* status = &aStatus;
   290 	User::RequestComplete(status, KErrNone);
   291 
   292 	LOGTEXT("CLogServDatabaseDriver::TaskClearLogL() - end");
   293 	}
   294 
   295 void CLogServDatabaseDriver::TaskClearRecentL(TRequestStatus& aStatus, TInt aRecentList
   296 #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
   297 		, TSimId aSimId
   298 #endif		
   299 		)
   300 	{
   301 	LOGTEXT("CLogServDatabaseDriver::TaskClearRecentL()");
   302 
   303 	// Handle when we're doing a backup
   304 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   305 
   306 	TheSql.Copy(KLogSqlSelectAllRecent);
   307 #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
   308 	TBool whereAdded = EFalse;
   309 #endif	
   310 	// Get events to clear from recent lists
   311 	if(aRecentList != KLogNullRecentList)
   312 		{
   313 		TheSql.Append(KLogWhere);
   314 #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
   315 		whereAdded = ETrue;
   316 #endif		
   317 		TheSql.AppendFormat(KLogNumberPredicate, &KLogFieldEventRecentString, aRecentList);
   318 		}
   319 #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM	
   320 	//..and clear from recent lists with specific SimId
   321 	if(aSimId != KLogNullSimId)
   322 		{
   323 		if(whereAdded)
   324 			{
   325 			TheSql.Append(KLogAnd);
   326 			}
   327 		else
   328 			{
   329 			TheSql.Append(KLogWhere);
   330 			}
   331 		TheSql.AppendFormat(KLogUNumberPredicate, &KLogFieldEventSimId, aSimId);
   332 		}
   333 #endif	
   334 	
   335     RLogDbView view;
   336     view.PrepareLC(iDatabase.DTIDatabase(), TheSql);
   337 	
   338 	if(view.FirstL())
   339 		{
   340         static TDbColNo colId = 0;
   341         static TDbColNo colRecent = 0;
   342         static TDbColNo colDuplicate = 0;
   343         if(colId == 0)
   344             {
   345             CDbColSet* cs = view.ColSetL();
   346             colId = cs->ColNo(KLogFieldIdString);
   347             colRecent = cs->ColNo(KLogFieldEventRecentString);
   348             colDuplicate = cs->ColNo(KLogFieldEventDuplicateString);
   349             delete cs;
   350             }
   351 		iDatabase.DTIBeginWithRollBackProtectionLC();
   352 		// Iterate through the events
   353 		do
   354 			{
   355 			// Get current event id
   356 			view.GetL();
   357 			const TLogId id = view.ColInt32(colId);
   358 			// Make the change
   359 			view.UpdateL();
   360 			view.SetColNullL(colRecent);
   361 			view.SetColNullL(colDuplicate);
   362 			view.PutL();
   363 			// This is a "hidden" change. It may affect the contents of a view, but the actual event hasn't changed
   364 			iDatabase.DTIChangeInterface().DCISubmitChangedEventContextL(ELogChangeTypeEventChangedHidden, id);
   365 			}
   366 		while(view.NextL());
   367 		iDatabase.DTICommitAndCancelRollbackProtectionL();
   368 		}
   369     CleanupStack::PopAndDestroy(&view);
   370 
   371 	// Complete the request
   372 	TRequestStatus* status = &aStatus;
   373 	User::RequestComplete(status, KErrNone);
   374 
   375 	LOGTEXT("CLogServDatabaseDriver::TaskClearRecentL() - end");
   376 	}
   377 
   378 void CLogServDatabaseDriver::TaskMaintenanceStartL(TRequestStatus& aStatus, TBool aPurge)
   379 //
   380 //	Start database maintenance process
   381 //
   382 	{
   383 	LOGTEXT("CLogServDatabaseDriver::TaskMaintenanceStartL()");
   384 
   385 	// Handle when we're doing a backup
   386 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   387 
   388 	iMaintainer->Start(aPurge, aStatus);
   389 
   390 	LOGTEXT("CLogServDatabaseDriver::TaskMaintenanceStartL() - end");
   391 	}
   392 
   393 void CLogServDatabaseDriver::TaskBuildWindowL(TRequestStatus& aStatus, const CLogServViewBase& aView, const TLogTransferWindow& aWindow, const RMessage2& aMessage)
   394 //
   395 //	Build a client window
   396 //
   397 	{
   398 	LOGTEXT("CLogServDatabaseDriver::TaskBuildWindowL()");
   399 
   400 	// Handle when we're doing a backup
   401 	iBackupInterface.BIValidateStateForDatabaseOperationL();
   402 
   403 	iWindowFetcher->StartL(aStatus, aView, aWindow, aMessage); 
   404 
   405 	LOGTEXT("CLogServDatabaseDriver::TaskBuildWindowL() - end");
   406 	}
   407 
   408 void CLogServDatabaseDriver::TaskCancelCurrent()
   409 //
   410 //	Cancel all active tasks
   411 //
   412 	{
   413 	LOGTEXT("CLogServDatabaseDriver::TaskCancelCurrent()");
   414 
   415 	if	(iAddEvent)
   416 		iAddEvent->Cancel();
   417 	if	(iChangeEvent)
   418 		iChangeEvent->Cancel();
   419 	if	(iGetEvent)
   420 		iGetEvent->Cancel();
   421 	if	(iDeleteEvent)
   422 		iDeleteEvent->Cancel();
   423 	if	(iChangeConfig)
   424 		iChangeConfig->Cancel();
   425 	if	(iWindowFetcher)
   426 		iWindowFetcher->Cancel();
   427 
   428 	LOGTEXT("CLogServDatabaseDriver::TaskCancelCurrent() - end");
   429 	}
   430 
   431 /////////////////////////////////////////////////////////////////////////////////////////
   432 /////////////////////////////////////////////////////////////////////////////////////////
   433 /////////////////////////////////////////////////////////////////////////////////////////
   434 
   435 void CLogServDatabaseDriver::DestroyHitters()
   436 	{
   437 	LOGTEXT("CLogServDatabaseDriver::DestroyHitters()");
   438 
   439 	TaskCancelCurrent();
   440 	//
   441 	delete iMaintainer;
   442 	iMaintainer = NULL;
   443 	delete iAddEvent;
   444 	iAddEvent = NULL;
   445 	delete iChangeEvent;
   446 	iChangeEvent = NULL;
   447 	delete iGetEvent;
   448 	iGetEvent = NULL;
   449 	delete iDeleteEvent;
   450 	iDeleteEvent = NULL;
   451 	delete iChangeConfig;
   452 	iChangeConfig = NULL;
   453 	delete iWindowFetcher;
   454 	iWindowFetcher = NULL;
   455 
   456 	LOGTEXT("CLogServDatabaseDriver::DestroyHitters() - end");
   457 	}
   458 
   459 void CLogServDatabaseDriver::CreateHittersL()
   460 	{
   461 	LOGTEXT("CLogServDatabaseDriver::CreateHittersL()");
   462 
   463 	iMaintainer = CLogMaintenance::NewL(iDatabase, iHitterPriorities);
   464 	iAddEvent = CLogAddEvent::NewL(iDatabase, iHitterPriorities);
   465 	iChangeEvent = CLogChangeEvent::NewL(iDatabase, iHitterPriorities);
   466 	iGetEvent = CLogGetEvent::NewL(iDatabase, iHitterPriorities);
   467 	iDeleteEvent = CLogDeleteEvent::NewL(iDatabase, iHitterPriorities);
   468 	iChangeConfig = CLogChangeConfig::NewL(iDatabase, iRecentListManager, iHitterPriorities);
   469 	iWindowFetcher = CLogServViewWindowFetcher::NewL(iDatabase, iHitterPriorities);
   470 
   471 	LOGTEXT("CLogServDatabaseDriver::CreateHittersL() - end");
   472 	}