os/persistentdata/loggingservices/eventlogger/LogServ/src/LogServDatabaseDriver.cpp
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/persistentdata/loggingservices/eventlogger/LogServ/src/LogServDatabaseDriver.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,472 @@
1.4 +// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +#include <logclientchangeobserver.h>
1.20 +#include "LogServDatabaseDriver.h"
1.21 +#include "LOGMAIN.H"
1.22 +#include "LOGADD.H"
1.23 +#include "LOGCHNGE.H"
1.24 +#include "LOGGET.H"
1.25 +#include "LOGDEL.H"
1.26 +#include "LOGQUERY.H"
1.27 +#include "logservpanic.h"
1.28 +#include "LogServCacheConfig.h"
1.29 +#include "LogServCacheTypes.h"
1.30 +#include "LogServBackupInterface.h"
1.31 +#include "LogServViewWindowFetcher.h"
1.32 +#include "LogServRecentListManager.h"
1.33 +#include "LogServDatabaseTransactionInterface.h"
1.34 +#include "LogServDatabaseChangeInterface.h"
1.35 +#include "LogServSqlStrings.h"
1.36 +
1.37 +
1.38 +/////////////////////////////////////////////////////////////////////////////////////////
1.39 +// -----> CLogServDatabaseDriver (source)
1.40 +/////////////////////////////////////////////////////////////////////////////////////////
1.41 +
1.42 +CLogServDatabaseDriver::CLogServDatabaseDriver(MLogServBackupInterface& aBackupInterface, MLogServDatabaseTransactionInterface& aDatabase, CLogServResourceInterpreter& aResourceInterface, CLogServRecentListManager& aRecentListManager, TInt aHitterPriorities)
1.43 +: iHitterPriorities(aHitterPriorities), iBackupInterface(aBackupInterface), iDatabase(aDatabase), iResourceInterface(aResourceInterface), iRecentListManager(aRecentListManager)
1.44 + {
1.45 + }
1.46 +
1.47 +CLogServDatabaseDriver::~CLogServDatabaseDriver()
1.48 + {
1.49 + iBackupInterface.BIObserverRemove(*this);
1.50 + DestroyHitters();
1.51 + }
1.52 +
1.53 +void CLogServDatabaseDriver::ConstructL()
1.54 + {
1.55 + iBackupInterface.BIObserverAddL(*this, MLogServBackupInterface::EObjectDatabaseDriver);
1.56 + //
1.57 + CreateHittersL();
1.58 + }
1.59 +
1.60 +CLogServDatabaseDriver* CLogServDatabaseDriver::NewL(MLogServBackupInterface& aBackupInterface, MLogServDatabaseTransactionInterface& aDatabase, CLogServResourceInterpreter& aResourceInterface, CLogServRecentListManager& aRecentListManager, TInt aHitterPriorities)
1.61 + {
1.62 + CLogServDatabaseDriver* self = new(ELeave) CLogServDatabaseDriver(aBackupInterface, aDatabase, aResourceInterface, aRecentListManager, aHitterPriorities);
1.63 + CleanupStack::PushL(self);
1.64 + self->ConstructL();
1.65 + CleanupStack::Pop(self);
1.66 + return self;
1.67 + }
1.68 +
1.69 +/////////////////////////////////////////////////////////////////////////////////////////
1.70 +/////////////////////////////////////////////////////////////////////////////////////////
1.71 +/////////////////////////////////////////////////////////////////////////////////////////
1.72 +
1.73 +void CLogServDatabaseDriver::BOHandleEventL(TLogServBackupEvent aEvent)
1.74 + {
1.75 + switch(aEvent)
1.76 + {
1.77 + case EBackupStarting:
1.78 + LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - Backup STARTING");
1.79 + DestroyHitters();
1.80 + break;
1.81 + case EBackupEnded:
1.82 + LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - Backup ENDING");
1.83 + CreateHittersL();
1.84 + break;
1.85 + default:
1.86 + __ASSERT_DEBUG(EFalse, User::Invariant());
1.87 + break;
1.88 + }
1.89 +
1.90 + LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - end");
1.91 + }
1.92 +
1.93 +/////////////////////////////////////////////////////////////////////////////////////////
1.94 +/////////////////////////////////////////////////////////////////////////////////////////
1.95 +/////////////////////////////////////////////////////////////////////////////////////////
1.96 +
1.97 +void CLogServDatabaseDriver::TaskEventAddL(TRequestStatus& aStatus, CLogEvent& aEvent, const RMessage2& aMessage)
1.98 +//
1.99 +// Add an event to the database
1.100 +//
1.101 + {
1.102 + LOGTEXT("CLogServDatabaseDriver::TaskEventAddL()");
1.103 +
1.104 + // Handle when we're doing a backup
1.105 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.106 +
1.107 + // Get the recent list for this event
1.108 + const CLogServRecentList* list = iRecentListManager.GetRecentList(aEvent);
1.109 +
1.110 + // Do the work
1.111 + iAddEvent->StartL(aEvent, list, aStatus, aMessage);
1.112 +
1.113 + LOGTEXT("CLogServDatabaseDriver::TaskEventAddL() - end");
1.114 + }
1.115 +
1.116 +void CLogServDatabaseDriver::TaskEventChangeL(TRequestStatus& aStatus, const CLogEvent& aEvent, const RMessage2& aMessage)
1.117 +//
1.118 +// Change an event in the database
1.119 +//
1.120 + {
1.121 + LOGTEXT("CLogServDatabaseDriver::TaskEventChangeL()");
1.122 +
1.123 + // Handle when we're doing a backup
1.124 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.125 +
1.126 + // Get the recent list for this event
1.127 + const CLogServRecentList* list = iRecentListManager.GetRecentList(aEvent);
1.128 +
1.129 + //
1.130 +
1.131 + // Do the work
1.132 + iChangeEvent->StartL(aEvent, list, aStatus, aMessage);
1.133 +
1.134 + LOGTEXT("CLogServDatabaseDriver::TaskEventChangeL() - end");
1.135 + }
1.136 +
1.137 +void CLogServDatabaseDriver::TaskEventGetL(TRequestStatus& aStatus, CLogEvent& aEvent, const RMessage2& aMessage)
1.138 +//
1.139 +// Get an event from the database
1.140 +//
1.141 + {
1.142 + LOGTEXT("CLogServDatabaseDriver::TaskEventGetL()");
1.143 +
1.144 + // Handle when we're doing a backup
1.145 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.146 +
1.147 + // Do the work
1.148 + iGetEvent->StartL(aEvent, aStatus, aMessage);
1.149 +
1.150 + LOGTEXT("CLogServDatabaseDriver::TaskEventGetL() - end");
1.151 + }
1.152 +
1.153 +void CLogServDatabaseDriver::TaskEventDeleteL(TRequestStatus& aStatus, TLogId aId, const RMessage2& aMessage)
1.154 +//
1.155 +// Delete an event from the database
1.156 +//
1.157 + {
1.158 + LOGTEXT("CLogServDatabaseDriver::TaskEventDeleteL()");
1.159 +
1.160 + // Handle when we're doing a backup
1.161 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.162 +
1.163 + iDeleteEvent->StartL(aId, aStatus, aMessage);
1.164 +
1.165 + LOGTEXT("CLogServDatabaseDriver::TaskEventDeleteL() - end");
1.166 + }
1.167 +
1.168 +void CLogServDatabaseDriver::TaskEventTypeAddL(TRequestStatus& aStatus, const CLogEventType& aEventType)
1.169 + {
1.170 + LOGTEXT("CLogServDatabaseDriver::TaskEventTypeAddL()");
1.171 +
1.172 + // Handle when we're doing a backup
1.173 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.174 + iDatabase.DTICacheTypes().AddTypeL(aEventType);
1.175 + //
1.176 + TRequestStatus* status = &aStatus;
1.177 + User::RequestComplete(status, KErrNone);
1.178 +
1.179 + LOGTEXT("CLogServDatabaseDriver::TaskEventTypeAddL() - end");
1.180 + }
1.181 +
1.182 +void CLogServDatabaseDriver::TaskEventTypeGetL(TRequestStatus& aStatus, const CLogEventType*& aEventType, TUid aUid)
1.183 + {
1.184 + LOGTEXT("CLogServDatabaseDriver::TaskEventTypeGetL()");
1.185 +
1.186 + // Handle when we're doing a backup
1.187 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.188 +
1.189 + const TLogServCacheTypeEntry& entry = iDatabase.DTICacheTypes().FindByUid(aUid);
1.190 + aEventType = entry.iEventType;
1.191 + if(entry.iEventTypeId == KLogNullTypeId)
1.192 + {
1.193 + User::Leave(KErrNotFound);
1.194 + }
1.195 +
1.196 + TRequestStatus* status = &aStatus;
1.197 + User::RequestComplete(status, KErrNone);
1.198 +
1.199 + LOGTEXT("CLogServDatabaseDriver::TaskEventTypeGetL() - end");
1.200 + }
1.201 +
1.202 +void CLogServDatabaseDriver::TaskEventTypeChangeL(TRequestStatus& aStatus, const CLogEventType& aEventType)
1.203 + {
1.204 + LOGTEXT("CLogServDatabaseDriver::TaskEventTypeChangeL()");
1.205 +
1.206 + // Handle when we're doing a backup
1.207 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.208 + const TInt error = iDatabase.DTICacheTypes().ChangeType(aEventType);
1.209 + //
1.210 + TRequestStatus* status = &aStatus;
1.211 + User::RequestComplete(status, error);
1.212 +
1.213 + LOGTEXT("CLogServDatabaseDriver::TaskEventTypeChangeL() - end");
1.214 + }
1.215 +
1.216 +void CLogServDatabaseDriver::TaskEventTypeDeleteL(TRequestStatus& aStatus, TUid aType)
1.217 + {
1.218 + LOGTEXT("CLogServDatabaseDriver::TaskEventTypeDeleteL()");
1.219 +
1.220 + // Handle when we're doing a backup
1.221 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.222 + const TInt error = iDatabase.DTICacheTypes().DeleteType(aType);
1.223 + //
1.224 + TRequestStatus* status = &aStatus;
1.225 + User::RequestComplete(status, error);
1.226 +
1.227 + LOGTEXT("CLogServDatabaseDriver::TaskEventTypeDeleteL() - end");
1.228 + }
1.229 +
1.230 +void CLogServDatabaseDriver::TaskConfigGetL(TRequestStatus& aStatus, TLogConfig& aConfig)
1.231 + {
1.232 + LOGTEXT("CLogServDatabaseDriver::TaskConfigGetL()");
1.233 +
1.234 + // Handle when we're doing a backup
1.235 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.236 + aConfig = iDatabase.DTICacheConfig().Config();
1.237 + //
1.238 + TRequestStatus* status = &aStatus;
1.239 + User::RequestComplete(status, KErrNone);
1.240 +
1.241 + LOGTEXT("CLogServDatabaseDriver::TaskConfigGetL() - end");
1.242 + }
1.243 +
1.244 +void CLogServDatabaseDriver::TaskConfigChangeL(TRequestStatus& aStatus, const TLogConfig& aConfig)
1.245 + {
1.246 + LOGTEXT("CLogServDatabaseDriver::TaskConfigChangeL()");
1.247 +
1.248 + // Handle when we're doing a backup
1.249 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.250 +
1.251 + iChangeConfig->StartL(aConfig, aStatus);
1.252 +
1.253 + LOGTEXT("CLogServDatabaseDriver::TaskConfigChangeL() - end");
1.254 + }
1.255 +
1.256 +// aDate is expected to be UTC
1.257 +void CLogServDatabaseDriver::TaskClearLogL(TRequestStatus& aStatus, const TTime& aDate
1.258 +#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
1.259 + , TSimId aSimId
1.260 +#endif
1.261 + )
1.262 + {
1.263 + LOGTEXT("CLogServDatabaseDriver::TaskClearLogL()");
1.264 +
1.265 + // Handle when we're doing a backup
1.266 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.267 +
1.268 + // Format the date.
1.269 + TBuf<KLogMaxDateLength> dateString;
1.270 + aDate.FormatL(dateString, LogUtils::DateFormatForLocale());
1.271 + // Get list of events to purge
1.272 + TheSql.Format(KLogSqlDeleteOldestString, &dateString);
1.273 +#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
1.274 + if(aSimId != KLogNullSimId)
1.275 + {
1.276 + TheSql.Append(KLogAnd);
1.277 + TheSql.AppendFormat(KLogUNumberPredicate, &KLogFieldEventSimId, aSimId);
1.278 + }
1.279 +#endif
1.280 + iDatabase.DTIBeginWithRollBackProtectionLC();
1.281 + TInt rc = iDatabase.DTIExecuteSql(TheSql);
1.282 + User::LeaveIfError(rc);
1.283 + if(rc > 0)
1.284 + {
1.285 + // Add log cleared events. First is for the window code, which receives messages
1.286 + // through the old API. The 2nd is for clients of the log engine
1.287 + iDatabase.DTIChangeInterface().DCISubmitChangedEventContextL(ELogChangeTypeLogCleared, KLogNullId);
1.288 + iDatabase.DTIChangeInterface().DCISubmitGlobalChangeContextL(KLogClientChangeEventLogCleared);
1.289 + }
1.290 + iDatabase.DTICommitAndCancelRollbackProtectionL();
1.291 + // Complete the request
1.292 + TRequestStatus* status = &aStatus;
1.293 + User::RequestComplete(status, KErrNone);
1.294 +
1.295 + LOGTEXT("CLogServDatabaseDriver::TaskClearLogL() - end");
1.296 + }
1.297 +
1.298 +void CLogServDatabaseDriver::TaskClearRecentL(TRequestStatus& aStatus, TInt aRecentList
1.299 +#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
1.300 + , TSimId aSimId
1.301 +#endif
1.302 + )
1.303 + {
1.304 + LOGTEXT("CLogServDatabaseDriver::TaskClearRecentL()");
1.305 +
1.306 + // Handle when we're doing a backup
1.307 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.308 +
1.309 + TheSql.Copy(KLogSqlSelectAllRecent);
1.310 +#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
1.311 + TBool whereAdded = EFalse;
1.312 +#endif
1.313 + // Get events to clear from recent lists
1.314 + if(aRecentList != KLogNullRecentList)
1.315 + {
1.316 + TheSql.Append(KLogWhere);
1.317 +#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
1.318 + whereAdded = ETrue;
1.319 +#endif
1.320 + TheSql.AppendFormat(KLogNumberPredicate, &KLogFieldEventRecentString, aRecentList);
1.321 + }
1.322 +#ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
1.323 + //..and clear from recent lists with specific SimId
1.324 + if(aSimId != KLogNullSimId)
1.325 + {
1.326 + if(whereAdded)
1.327 + {
1.328 + TheSql.Append(KLogAnd);
1.329 + }
1.330 + else
1.331 + {
1.332 + TheSql.Append(KLogWhere);
1.333 + }
1.334 + TheSql.AppendFormat(KLogUNumberPredicate, &KLogFieldEventSimId, aSimId);
1.335 + }
1.336 +#endif
1.337 +
1.338 + RLogDbView view;
1.339 + view.PrepareLC(iDatabase.DTIDatabase(), TheSql);
1.340 +
1.341 + if(view.FirstL())
1.342 + {
1.343 + static TDbColNo colId = 0;
1.344 + static TDbColNo colRecent = 0;
1.345 + static TDbColNo colDuplicate = 0;
1.346 + if(colId == 0)
1.347 + {
1.348 + CDbColSet* cs = view.ColSetL();
1.349 + colId = cs->ColNo(KLogFieldIdString);
1.350 + colRecent = cs->ColNo(KLogFieldEventRecentString);
1.351 + colDuplicate = cs->ColNo(KLogFieldEventDuplicateString);
1.352 + delete cs;
1.353 + }
1.354 + iDatabase.DTIBeginWithRollBackProtectionLC();
1.355 + // Iterate through the events
1.356 + do
1.357 + {
1.358 + // Get current event id
1.359 + view.GetL();
1.360 + const TLogId id = view.ColInt32(colId);
1.361 + // Make the change
1.362 + view.UpdateL();
1.363 + view.SetColNullL(colRecent);
1.364 + view.SetColNullL(colDuplicate);
1.365 + view.PutL();
1.366 + // This is a "hidden" change. It may affect the contents of a view, but the actual event hasn't changed
1.367 + iDatabase.DTIChangeInterface().DCISubmitChangedEventContextL(ELogChangeTypeEventChangedHidden, id);
1.368 + }
1.369 + while(view.NextL());
1.370 + iDatabase.DTICommitAndCancelRollbackProtectionL();
1.371 + }
1.372 + CleanupStack::PopAndDestroy(&view);
1.373 +
1.374 + // Complete the request
1.375 + TRequestStatus* status = &aStatus;
1.376 + User::RequestComplete(status, KErrNone);
1.377 +
1.378 + LOGTEXT("CLogServDatabaseDriver::TaskClearRecentL() - end");
1.379 + }
1.380 +
1.381 +void CLogServDatabaseDriver::TaskMaintenanceStartL(TRequestStatus& aStatus, TBool aPurge)
1.382 +//
1.383 +// Start database maintenance process
1.384 +//
1.385 + {
1.386 + LOGTEXT("CLogServDatabaseDriver::TaskMaintenanceStartL()");
1.387 +
1.388 + // Handle when we're doing a backup
1.389 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.390 +
1.391 + iMaintainer->Start(aPurge, aStatus);
1.392 +
1.393 + LOGTEXT("CLogServDatabaseDriver::TaskMaintenanceStartL() - end");
1.394 + }
1.395 +
1.396 +void CLogServDatabaseDriver::TaskBuildWindowL(TRequestStatus& aStatus, const CLogServViewBase& aView, const TLogTransferWindow& aWindow, const RMessage2& aMessage)
1.397 +//
1.398 +// Build a client window
1.399 +//
1.400 + {
1.401 + LOGTEXT("CLogServDatabaseDriver::TaskBuildWindowL()");
1.402 +
1.403 + // Handle when we're doing a backup
1.404 + iBackupInterface.BIValidateStateForDatabaseOperationL();
1.405 +
1.406 + iWindowFetcher->StartL(aStatus, aView, aWindow, aMessage);
1.407 +
1.408 + LOGTEXT("CLogServDatabaseDriver::TaskBuildWindowL() - end");
1.409 + }
1.410 +
1.411 +void CLogServDatabaseDriver::TaskCancelCurrent()
1.412 +//
1.413 +// Cancel all active tasks
1.414 +//
1.415 + {
1.416 + LOGTEXT("CLogServDatabaseDriver::TaskCancelCurrent()");
1.417 +
1.418 + if (iAddEvent)
1.419 + iAddEvent->Cancel();
1.420 + if (iChangeEvent)
1.421 + iChangeEvent->Cancel();
1.422 + if (iGetEvent)
1.423 + iGetEvent->Cancel();
1.424 + if (iDeleteEvent)
1.425 + iDeleteEvent->Cancel();
1.426 + if (iChangeConfig)
1.427 + iChangeConfig->Cancel();
1.428 + if (iWindowFetcher)
1.429 + iWindowFetcher->Cancel();
1.430 +
1.431 + LOGTEXT("CLogServDatabaseDriver::TaskCancelCurrent() - end");
1.432 + }
1.433 +
1.434 +/////////////////////////////////////////////////////////////////////////////////////////
1.435 +/////////////////////////////////////////////////////////////////////////////////////////
1.436 +/////////////////////////////////////////////////////////////////////////////////////////
1.437 +
1.438 +void CLogServDatabaseDriver::DestroyHitters()
1.439 + {
1.440 + LOGTEXT("CLogServDatabaseDriver::DestroyHitters()");
1.441 +
1.442 + TaskCancelCurrent();
1.443 + //
1.444 + delete iMaintainer;
1.445 + iMaintainer = NULL;
1.446 + delete iAddEvent;
1.447 + iAddEvent = NULL;
1.448 + delete iChangeEvent;
1.449 + iChangeEvent = NULL;
1.450 + delete iGetEvent;
1.451 + iGetEvent = NULL;
1.452 + delete iDeleteEvent;
1.453 + iDeleteEvent = NULL;
1.454 + delete iChangeConfig;
1.455 + iChangeConfig = NULL;
1.456 + delete iWindowFetcher;
1.457 + iWindowFetcher = NULL;
1.458 +
1.459 + LOGTEXT("CLogServDatabaseDriver::DestroyHitters() - end");
1.460 + }
1.461 +
1.462 +void CLogServDatabaseDriver::CreateHittersL()
1.463 + {
1.464 + LOGTEXT("CLogServDatabaseDriver::CreateHittersL()");
1.465 +
1.466 + iMaintainer = CLogMaintenance::NewL(iDatabase, iHitterPriorities);
1.467 + iAddEvent = CLogAddEvent::NewL(iDatabase, iHitterPriorities);
1.468 + iChangeEvent = CLogChangeEvent::NewL(iDatabase, iHitterPriorities);
1.469 + iGetEvent = CLogGetEvent::NewL(iDatabase, iHitterPriorities);
1.470 + iDeleteEvent = CLogDeleteEvent::NewL(iDatabase, iHitterPriorities);
1.471 + iChangeConfig = CLogChangeConfig::NewL(iDatabase, iRecentListManager, iHitterPriorities);
1.472 + iWindowFetcher = CLogServViewWindowFetcher::NewL(iDatabase, iHitterPriorities);
1.473 +
1.474 + LOGTEXT("CLogServDatabaseDriver::CreateHittersL() - end");
1.475 + }