os/persistentdata/loggingservices/eventlogger/LogServ/src/LogServDatabaseDriver.cpp
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".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
16 #include <logclientchangeobserver.h>
17 #include "LogServDatabaseDriver.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"
35 /////////////////////////////////////////////////////////////////////////////////////////
36 // -----> CLogServDatabaseDriver (source)
37 /////////////////////////////////////////////////////////////////////////////////////////
39 CLogServDatabaseDriver::CLogServDatabaseDriver(MLogServBackupInterface& aBackupInterface, MLogServDatabaseTransactionInterface& aDatabase, CLogServResourceInterpreter& aResourceInterface, CLogServRecentListManager& aRecentListManager, TInt aHitterPriorities)
40 : iHitterPriorities(aHitterPriorities), iBackupInterface(aBackupInterface), iDatabase(aDatabase), iResourceInterface(aResourceInterface), iRecentListManager(aRecentListManager)
44 CLogServDatabaseDriver::~CLogServDatabaseDriver()
46 iBackupInterface.BIObserverRemove(*this);
50 void CLogServDatabaseDriver::ConstructL()
52 iBackupInterface.BIObserverAddL(*this, MLogServBackupInterface::EObjectDatabaseDriver);
57 CLogServDatabaseDriver* CLogServDatabaseDriver::NewL(MLogServBackupInterface& aBackupInterface, MLogServDatabaseTransactionInterface& aDatabase, CLogServResourceInterpreter& aResourceInterface, CLogServRecentListManager& aRecentListManager, TInt aHitterPriorities)
59 CLogServDatabaseDriver* self = new(ELeave) CLogServDatabaseDriver(aBackupInterface, aDatabase, aResourceInterface, aRecentListManager, aHitterPriorities);
60 CleanupStack::PushL(self);
62 CleanupStack::Pop(self);
66 /////////////////////////////////////////////////////////////////////////////////////////
67 /////////////////////////////////////////////////////////////////////////////////////////
68 /////////////////////////////////////////////////////////////////////////////////////////
70 void CLogServDatabaseDriver::BOHandleEventL(TLogServBackupEvent aEvent)
75 LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - Backup STARTING");
79 LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - Backup ENDING");
83 __ASSERT_DEBUG(EFalse, User::Invariant());
87 LOGTEXT("CLogServDatabaseDriver::BOHandleEventL() - end");
90 /////////////////////////////////////////////////////////////////////////////////////////
91 /////////////////////////////////////////////////////////////////////////////////////////
92 /////////////////////////////////////////////////////////////////////////////////////////
94 void CLogServDatabaseDriver::TaskEventAddL(TRequestStatus& aStatus, CLogEvent& aEvent, const RMessage2& aMessage)
96 // Add an event to the database
99 LOGTEXT("CLogServDatabaseDriver::TaskEventAddL()");
101 // Handle when we're doing a backup
102 iBackupInterface.BIValidateStateForDatabaseOperationL();
104 // Get the recent list for this event
105 const CLogServRecentList* list = iRecentListManager.GetRecentList(aEvent);
108 iAddEvent->StartL(aEvent, list, aStatus, aMessage);
110 LOGTEXT("CLogServDatabaseDriver::TaskEventAddL() - end");
113 void CLogServDatabaseDriver::TaskEventChangeL(TRequestStatus& aStatus, const CLogEvent& aEvent, const RMessage2& aMessage)
115 // Change an event in the database
118 LOGTEXT("CLogServDatabaseDriver::TaskEventChangeL()");
120 // Handle when we're doing a backup
121 iBackupInterface.BIValidateStateForDatabaseOperationL();
123 // Get the recent list for this event
124 const CLogServRecentList* list = iRecentListManager.GetRecentList(aEvent);
129 iChangeEvent->StartL(aEvent, list, aStatus, aMessage);
131 LOGTEXT("CLogServDatabaseDriver::TaskEventChangeL() - end");
134 void CLogServDatabaseDriver::TaskEventGetL(TRequestStatus& aStatus, CLogEvent& aEvent, const RMessage2& aMessage)
136 // Get an event from the database
139 LOGTEXT("CLogServDatabaseDriver::TaskEventGetL()");
141 // Handle when we're doing a backup
142 iBackupInterface.BIValidateStateForDatabaseOperationL();
145 iGetEvent->StartL(aEvent, aStatus, aMessage);
147 LOGTEXT("CLogServDatabaseDriver::TaskEventGetL() - end");
150 void CLogServDatabaseDriver::TaskEventDeleteL(TRequestStatus& aStatus, TLogId aId, const RMessage2& aMessage)
152 // Delete an event from the database
155 LOGTEXT("CLogServDatabaseDriver::TaskEventDeleteL()");
157 // Handle when we're doing a backup
158 iBackupInterface.BIValidateStateForDatabaseOperationL();
160 iDeleteEvent->StartL(aId, aStatus, aMessage);
162 LOGTEXT("CLogServDatabaseDriver::TaskEventDeleteL() - end");
165 void CLogServDatabaseDriver::TaskEventTypeAddL(TRequestStatus& aStatus, const CLogEventType& aEventType)
167 LOGTEXT("CLogServDatabaseDriver::TaskEventTypeAddL()");
169 // Handle when we're doing a backup
170 iBackupInterface.BIValidateStateForDatabaseOperationL();
171 iDatabase.DTICacheTypes().AddTypeL(aEventType);
173 TRequestStatus* status = &aStatus;
174 User::RequestComplete(status, KErrNone);
176 LOGTEXT("CLogServDatabaseDriver::TaskEventTypeAddL() - end");
179 void CLogServDatabaseDriver::TaskEventTypeGetL(TRequestStatus& aStatus, const CLogEventType*& aEventType, TUid aUid)
181 LOGTEXT("CLogServDatabaseDriver::TaskEventTypeGetL()");
183 // Handle when we're doing a backup
184 iBackupInterface.BIValidateStateForDatabaseOperationL();
186 const TLogServCacheTypeEntry& entry = iDatabase.DTICacheTypes().FindByUid(aUid);
187 aEventType = entry.iEventType;
188 if(entry.iEventTypeId == KLogNullTypeId)
190 User::Leave(KErrNotFound);
193 TRequestStatus* status = &aStatus;
194 User::RequestComplete(status, KErrNone);
196 LOGTEXT("CLogServDatabaseDriver::TaskEventTypeGetL() - end");
199 void CLogServDatabaseDriver::TaskEventTypeChangeL(TRequestStatus& aStatus, const CLogEventType& aEventType)
201 LOGTEXT("CLogServDatabaseDriver::TaskEventTypeChangeL()");
203 // Handle when we're doing a backup
204 iBackupInterface.BIValidateStateForDatabaseOperationL();
205 const TInt error = iDatabase.DTICacheTypes().ChangeType(aEventType);
207 TRequestStatus* status = &aStatus;
208 User::RequestComplete(status, error);
210 LOGTEXT("CLogServDatabaseDriver::TaskEventTypeChangeL() - end");
213 void CLogServDatabaseDriver::TaskEventTypeDeleteL(TRequestStatus& aStatus, TUid aType)
215 LOGTEXT("CLogServDatabaseDriver::TaskEventTypeDeleteL()");
217 // Handle when we're doing a backup
218 iBackupInterface.BIValidateStateForDatabaseOperationL();
219 const TInt error = iDatabase.DTICacheTypes().DeleteType(aType);
221 TRequestStatus* status = &aStatus;
222 User::RequestComplete(status, error);
224 LOGTEXT("CLogServDatabaseDriver::TaskEventTypeDeleteL() - end");
227 void CLogServDatabaseDriver::TaskConfigGetL(TRequestStatus& aStatus, TLogConfig& aConfig)
229 LOGTEXT("CLogServDatabaseDriver::TaskConfigGetL()");
231 // Handle when we're doing a backup
232 iBackupInterface.BIValidateStateForDatabaseOperationL();
233 aConfig = iDatabase.DTICacheConfig().Config();
235 TRequestStatus* status = &aStatus;
236 User::RequestComplete(status, KErrNone);
238 LOGTEXT("CLogServDatabaseDriver::TaskConfigGetL() - end");
241 void CLogServDatabaseDriver::TaskConfigChangeL(TRequestStatus& aStatus, const TLogConfig& aConfig)
243 LOGTEXT("CLogServDatabaseDriver::TaskConfigChangeL()");
245 // Handle when we're doing a backup
246 iBackupInterface.BIValidateStateForDatabaseOperationL();
248 iChangeConfig->StartL(aConfig, aStatus);
250 LOGTEXT("CLogServDatabaseDriver::TaskConfigChangeL() - end");
253 // aDate is expected to be UTC
254 void CLogServDatabaseDriver::TaskClearLogL(TRequestStatus& aStatus, const TTime& aDate
255 #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
260 LOGTEXT("CLogServDatabaseDriver::TaskClearLogL()");
262 // Handle when we're doing a backup
263 iBackupInterface.BIValidateStateForDatabaseOperationL();
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)
273 TheSql.Append(KLogAnd);
274 TheSql.AppendFormat(KLogUNumberPredicate, &KLogFieldEventSimId, aSimId);
277 iDatabase.DTIBeginWithRollBackProtectionLC();
278 TInt rc = iDatabase.DTIExecuteSql(TheSql);
279 User::LeaveIfError(rc);
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);
287 iDatabase.DTICommitAndCancelRollbackProtectionL();
288 // Complete the request
289 TRequestStatus* status = &aStatus;
290 User::RequestComplete(status, KErrNone);
292 LOGTEXT("CLogServDatabaseDriver::TaskClearLogL() - end");
295 void CLogServDatabaseDriver::TaskClearRecentL(TRequestStatus& aStatus, TInt aRecentList
296 #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
301 LOGTEXT("CLogServDatabaseDriver::TaskClearRecentL()");
303 // Handle when we're doing a backup
304 iBackupInterface.BIValidateStateForDatabaseOperationL();
306 TheSql.Copy(KLogSqlSelectAllRecent);
307 #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
308 TBool whereAdded = EFalse;
310 // Get events to clear from recent lists
311 if(aRecentList != KLogNullRecentList)
313 TheSql.Append(KLogWhere);
314 #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
317 TheSql.AppendFormat(KLogNumberPredicate, &KLogFieldEventRecentString, aRecentList);
319 #ifdef SYMBIAN_ENABLE_EVENTLOGGER_DUALSIM
320 //..and clear from recent lists with specific SimId
321 if(aSimId != KLogNullSimId)
325 TheSql.Append(KLogAnd);
329 TheSql.Append(KLogWhere);
331 TheSql.AppendFormat(KLogUNumberPredicate, &KLogFieldEventSimId, aSimId);
336 view.PrepareLC(iDatabase.DTIDatabase(), TheSql);
340 static TDbColNo colId = 0;
341 static TDbColNo colRecent = 0;
342 static TDbColNo colDuplicate = 0;
345 CDbColSet* cs = view.ColSetL();
346 colId = cs->ColNo(KLogFieldIdString);
347 colRecent = cs->ColNo(KLogFieldEventRecentString);
348 colDuplicate = cs->ColNo(KLogFieldEventDuplicateString);
351 iDatabase.DTIBeginWithRollBackProtectionLC();
352 // Iterate through the events
355 // Get current event id
357 const TLogId id = view.ColInt32(colId);
360 view.SetColNullL(colRecent);
361 view.SetColNullL(colDuplicate);
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);
367 iDatabase.DTICommitAndCancelRollbackProtectionL();
369 CleanupStack::PopAndDestroy(&view);
371 // Complete the request
372 TRequestStatus* status = &aStatus;
373 User::RequestComplete(status, KErrNone);
375 LOGTEXT("CLogServDatabaseDriver::TaskClearRecentL() - end");
378 void CLogServDatabaseDriver::TaskMaintenanceStartL(TRequestStatus& aStatus, TBool aPurge)
380 // Start database maintenance process
383 LOGTEXT("CLogServDatabaseDriver::TaskMaintenanceStartL()");
385 // Handle when we're doing a backup
386 iBackupInterface.BIValidateStateForDatabaseOperationL();
388 iMaintainer->Start(aPurge, aStatus);
390 LOGTEXT("CLogServDatabaseDriver::TaskMaintenanceStartL() - end");
393 void CLogServDatabaseDriver::TaskBuildWindowL(TRequestStatus& aStatus, const CLogServViewBase& aView, const TLogTransferWindow& aWindow, const RMessage2& aMessage)
395 // Build a client window
398 LOGTEXT("CLogServDatabaseDriver::TaskBuildWindowL()");
400 // Handle when we're doing a backup
401 iBackupInterface.BIValidateStateForDatabaseOperationL();
403 iWindowFetcher->StartL(aStatus, aView, aWindow, aMessage);
405 LOGTEXT("CLogServDatabaseDriver::TaskBuildWindowL() - end");
408 void CLogServDatabaseDriver::TaskCancelCurrent()
410 // Cancel all active tasks
413 LOGTEXT("CLogServDatabaseDriver::TaskCancelCurrent()");
418 iChangeEvent->Cancel();
422 iDeleteEvent->Cancel();
424 iChangeConfig->Cancel();
426 iWindowFetcher->Cancel();
428 LOGTEXT("CLogServDatabaseDriver::TaskCancelCurrent() - end");
431 /////////////////////////////////////////////////////////////////////////////////////////
432 /////////////////////////////////////////////////////////////////////////////////////////
433 /////////////////////////////////////////////////////////////////////////////////////////
435 void CLogServDatabaseDriver::DestroyHitters()
437 LOGTEXT("CLogServDatabaseDriver::DestroyHitters()");
451 delete iChangeConfig;
452 iChangeConfig = NULL;
453 delete iWindowFetcher;
454 iWindowFetcher = NULL;
456 LOGTEXT("CLogServDatabaseDriver::DestroyHitters() - end");
459 void CLogServDatabaseDriver::CreateHittersL()
461 LOGTEXT("CLogServDatabaseDriver::CreateHittersL()");
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);
471 LOGTEXT("CLogServDatabaseDriver::CreateHittersL() - end");