diff -r 000000000000 -r 667063e416a2 locationtriggering/ltcontainer/src/lbtdboperationao.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/locationtriggering/ltcontainer/src/lbtdboperationao.cpp Tue Feb 02 01:06:48 2010 +0200 @@ -0,0 +1,247 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: This file implements the Location triggering container +* interface +* +*/ + + +#include "lbtdboperationao.h" +#include "lbtdbtriggersmanager.h" +#include "lbtlogger.h" + + +// ======== MEMBER FUNCTIONS ======== + + +// --------------------------------------------------------------------------- +// The Symbian 2 phase constructor +// --------------------------------------------------------------------------- +// +CLbtDbOperationAO* CLbtDbOperationAO::NewL( + RDbDatabase& aDb, + CLbtDbTriggersManager* aObserver) + { + CLbtDbOperationAO* self = new( ELeave ) CLbtDbOperationAO(aDb, aObserver); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Execute a SQL query asynchronously +// --------------------------------------------------------------------------- +// +void CLbtDbOperationAO::ExecuteQuery( + RDbView& aView, + TDesC& aQuery) + { + FUNC_ENTER("CLbtDbOperationAO::ExecuteQuery"); + if ( IsActive() ) + { + // We are already executing an asynchronous operation so return error + TRAP_IGNORE( iObserver->DbSqlOperationCompletedL( KErrInUse ) ); + return; + } + + iView = &aView; + iView->Prepare( iDb, TDbQuery(aQuery, EDbCompareFolded) ); + iView->Evaluate(iStatus); + SetActive(); + iOperation = EDbSqlQuery; + } + + +// --------------------------------------------------------------------------- +// CLbtDbOperationAO::ExecuteSyncQuery +// --------------------------------------------------------------------------- +// +TInt CLbtDbOperationAO::ExecuteSyncQuery( + RDbView& aView, + TDesC& aQuery) + { + FUNC_ENTER("CLbtDbOperationAO::ExecuteSyncQuery"); + TInt err = aView.Prepare( iDb, TDbQuery(aQuery, EDbCompareFolded),KDbUnlimitedWindow ); + // This should evaluate the query fully + if ( err == KErrNone ) + { + err = aView.EvaluateAll(); + } + return err; + } + +// --------------------------------------------------------------------------- +// Compact the database +// --------------------------------------------------------------------------- +// +void CLbtDbOperationAO::CompactDb() + { + FUNC_ENTER("CLbtDbOperationAO::CompactDb"); + if ( IsActive() ) + { + // We are already executing an asynchronous operation so return error + iObserver->DbIncrementalOperationCompleted( KErrInUse ); + return; + } + + TInt error = iDbIncrOp.Compact(iDb, iSteps); + if(error != KErrNone) + { + ERROR("iDbIncrOp.Compact returned %d", error); + iDbIncrOp.Close(); + return; + } + error = iDbIncrOp.Next( iSteps ); + iStatus = KRequestPending; + SetActive(); + iOperation = EDbCompaction; + iStatus = KRequestPending; + TRequestStatus* status = &iStatus; + User::RequestComplete(status, error); + } + +// --------------------------------------------------------------------------- +// DoCancel +// --------------------------------------------------------------------------- +// +TBool CLbtDbOperationAO::IsCompactionOngoing() + { + if( EDbCompaction == iOperation ) + { + return ETrue; + } + return EFalse; + } + + +// --------------------------------------------------------------------------- +// DoCancel +// --------------------------------------------------------------------------- +// +void CLbtDbOperationAO::DoCancel() + { + FUNC_ENTER("CLbtDbOperationAO::DoCancel"); + switch( iOperation ) + { + case EDbSqlQuery: + iView->Cancel(); + break; + case EDbCompaction: + // Nothing to do here since the step is already completed. + break; + default: + break; + } + iOperation = EDbOperationNone; + } + + +// --------------------------------------------------------------------------- +// RunL +// --------------------------------------------------------------------------- +// +void CLbtDbOperationAO::RunL() + { + FUNC_ENTER("CLbtDbOperationAO::RunL"); + switch( iOperation ) + { + case EDbSqlQuery: + if ( iStatus.Int() > 0 ) + { + iView->Evaluate(iStatus); + SetActive(); + } + else + { + iOperation = EDbOperationNone; + iObserver->DbSqlOperationCompletedL( iStatus.Int() ); + } + break; + case EDbCompaction: + if ( iStatus.Int() == KErrNone && iSteps ) + { + // If the steps till now have been successful and if there + // are more steps to be executed + TInt error = iDbIncrOp.Next( iSteps ); + iStatus = KRequestPending; + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete(status, error); + } + else + { + // Either the operation was fully completed or + // there was an error during database compaction. + // So just close the incremental operation and + // return the error (in case of the error). + iDbIncrOp.Close(); + iOperation = EDbOperationNone; + iObserver->DbIncrementalOperationCompleted( iStatus.Int() ); + } + break; + default: + // Nothing to do in this case + break; + } + } + + +// --------------------------------------------------------------------------- +// RunError +// --------------------------------------------------------------------------- +// +TInt CLbtDbOperationAO::RunError(TInt /*aError*/) + { + FUNC_ENTER("CLbtDbOperationAO::RunError"); + // RunL doesn't have any Leaving calls. So no implementation here. + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CLbtDbOperationAO::~CLbtDbOperationAO() + { + FUNC_ENTER("CLbtDbOperationAO::~CLbtDbOperationAO"); + } + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CLbtDbOperationAO::CLbtDbOperationAO( + RDbDatabase& aDb, + CLbtDbTriggersManager* aObserver) + :CActive(CActive::EPriorityStandard), + iDb(aDb), + iObserver(aObserver), + iOperation(EDbOperationNone) + { + CActiveScheduler::Add(this); + } + + +// --------------------------------------------------------------------------- +// The 2nd phase Symbian Constructor +// --------------------------------------------------------------------------- +// +void CLbtDbOperationAO::ConstructL() + { + } + +