loggingservices/eventlogger/LogServ/src/LogServDatabaseDriver.cpp
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     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 	}