sl@0: // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "LOGMAIN.H" sl@0: #include "LOGREC.H" sl@0: #include "LOGCOMP.H" sl@0: #include "logservpanic.h" sl@0: #include "LOGQUERY.H" sl@0: #include "LogServDatabaseTransactionInterface.h" sl@0: #include "LogServCacheConfig.h" sl@0: #include "LogCliServShared.h" sl@0: #include "LogServDatabaseChangeInterface.h" sl@0: #include "LogServSqlStrings.h" sl@0: sl@0: CLogMaintenance::CLogMaintenance(MLogServDatabaseTransactionInterface& aDatabase, TInt aPriority) sl@0: : CLogActive(aPriority), iDatabase(aDatabase) sl@0: { sl@0: } sl@0: sl@0: CLogMaintenance::~CLogMaintenance() sl@0: { sl@0: Cancel(); sl@0: delete iRecover; sl@0: delete iCompact; sl@0: } sl@0: sl@0: void CLogMaintenance::ConstructL() sl@0: { sl@0: iRecover = new(ELeave)CLogRecover(iDatabase, Priority()); sl@0: iCompact = new(ELeave)CLogCompact(iDatabase, Priority()); sl@0: } sl@0: sl@0: CLogMaintenance* CLogMaintenance::NewL(MLogServDatabaseTransactionInterface& aDatabase, TInt aPriority) sl@0: { sl@0: CLogMaintenance* self = new(ELeave)CLogMaintenance(aDatabase, aPriority); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: void CLogMaintenance::Start(TBool aPurge, TRequestStatus& aStatus) sl@0: { sl@0: iState = ELogRecover; sl@0: iPurge = aPurge; sl@0: sl@0: Queue(aStatus); sl@0: TRequestStatus* status = &iStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: SetActive(); sl@0: } sl@0: sl@0: TBool CLogMaintenance::DoNextL() sl@0: { sl@0: switch(iState) sl@0: { sl@0: // Recover the database sl@0: case ELogRecover: sl@0: if (iRecover->Start(iStatus)) sl@0: { sl@0: iState = ELogGetConfig; sl@0: return ETrue; sl@0: } sl@0: // Fall Through sl@0: sl@0: // Get the log configuration sl@0: case ELogGetConfig: sl@0: if (iPurge) sl@0: { sl@0: iConfig = iDatabase.DTICacheConfig().Config(); sl@0: TRequestStatus* status = &iStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: iState = iConfig.iMaxEventAge == 0 ? ELogCompact : ELogPurgeMainAge; sl@0: return ETrue; sl@0: } sl@0: // Fall through sl@0: sl@0: // Purge old events from the log sl@0: case ELogPurgeMainAge: sl@0: if (iPurge) sl@0: { sl@0: // Get the max age sl@0: TTime date; sl@0: date.UniversalTime(); sl@0: date -= TTimeIntervalSeconds(iConfig.iMaxEventAge); sl@0: sl@0: ClearLogL(date, iStatus); sl@0: iState = ELogCompact; sl@0: return ETrue; sl@0: } sl@0: sl@0: // Compact the database sl@0: case ELogCompact: sl@0: iCompact->Start(iStatus); sl@0: iState = ELogComplete; sl@0: return ETrue; sl@0: sl@0: case ELogComplete: sl@0: break; sl@0: sl@0: default: sl@0: __ASSERT_DEBUG(EFalse, Panic(ELogNoSuchState7)); sl@0: }; sl@0: sl@0: return EFalse; sl@0: } sl@0: sl@0: void CLogMaintenance::DoRunL() sl@0: { sl@0: if (DoNextL()) sl@0: SetActive(); sl@0: } sl@0: sl@0: void CLogMaintenance::DoCancel() sl@0: { sl@0: iRecover->Cancel(); sl@0: iCompact->Cancel(); sl@0: sl@0: CLogActive::DoCancel(); sl@0: } sl@0: sl@0: void CLogMaintenance::DoComplete(TInt& aStatus) sl@0: { sl@0: // Ignore all errors sl@0: aStatus = KErrNone; sl@0: } sl@0: sl@0: // aDate is expected to be UTC sl@0: void CLogMaintenance::ClearLogL(const TTime& aDate, TRequestStatus& aStatus) sl@0: { sl@0: TBuf date; sl@0: aDate.FormatL(date, LogUtils::DateFormatForLocale()); sl@0: // Get list of events to purge sl@0: TheSql.Format(KLogSqlSelectOldestString, &date); sl@0: RLogDbView view; sl@0: view.PrepareLC(iDatabase.DTIDatabase(), TheSql); sl@0: if(view.FirstL()) sl@0: { sl@0: static TDbColNo idColNo = 0; sl@0: if(idColNo == 0) sl@0: { sl@0: CDbColSet* cs = view.ColSetL(); sl@0: idColNo = cs->ColNo(KLogFieldIdString); sl@0: delete cs; sl@0: } sl@0: iDatabase.DTIBeginWithRollBackProtectionLC(); sl@0: do sl@0: { sl@0: view.GetL(); sl@0: const TLogId id = view.ColInt32(idColNo); sl@0: view.DeleteL(); sl@0: iDatabase.DTIChangeInterface().DCISubmitChangedEventContextL(ELogChangeTypeEventDeleted, id); sl@0: } sl@0: while(view.NextL()); sl@0: // Commit changes sl@0: iDatabase.DTICommitAndCancelRollbackProtectionL(); sl@0: } sl@0: CleanupStack::PopAndDestroy(&view); sl@0: // Complete the request sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: }