locationtriggering/ltcontainer/src/lbtdboperationao.cpp
author hgs
Wed, 03 Nov 2010 23:28:39 +0530
changeset 56 4e949f03ecc5
child 43 24e118dfbea1
permissions -rw-r--r--
201044
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  This file implements the Location triggering container
hgs
parents:
diff changeset
    15
*                interface
hgs
parents:
diff changeset
    16
*
hgs
parents:
diff changeset
    17
*/
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
#include "lbtdboperationao.h"
hgs
parents:
diff changeset
    21
#include "lbtdbtriggersmanager.h"
hgs
parents:
diff changeset
    22
#include "lbtlogger.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
// ======== MEMBER FUNCTIONS ========
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    29
// The Symbian 2 phase constructor
hgs
parents:
diff changeset
    30
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    31
//
hgs
parents:
diff changeset
    32
CLbtDbOperationAO* CLbtDbOperationAO::NewL(
hgs
parents:
diff changeset
    33
    RDbDatabase& aDb,
hgs
parents:
diff changeset
    34
    CLbtDbTriggersManager* aObserver)
hgs
parents:
diff changeset
    35
    {
hgs
parents:
diff changeset
    36
    CLbtDbOperationAO* self = new( ELeave ) CLbtDbOperationAO(aDb, aObserver);
hgs
parents:
diff changeset
    37
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    38
    self->ConstructL();
hgs
parents:
diff changeset
    39
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    40
    return self;
hgs
parents:
diff changeset
    41
    }
hgs
parents:
diff changeset
    42
    
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    45
// Execute a SQL query asynchronously
hgs
parents:
diff changeset
    46
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    47
//
hgs
parents:
diff changeset
    48
void CLbtDbOperationAO::ExecuteQuery(
hgs
parents:
diff changeset
    49
    RDbView& aView,
hgs
parents:
diff changeset
    50
    TDesC& aQuery)
hgs
parents:
diff changeset
    51
    {
hgs
parents:
diff changeset
    52
    FUNC_ENTER("CLbtDbOperationAO::ExecuteQuery");
hgs
parents:
diff changeset
    53
    if (  IsActive() )
hgs
parents:
diff changeset
    54
        {
hgs
parents:
diff changeset
    55
        // We are already executing an asynchronous operation so return error
hgs
parents:
diff changeset
    56
        TRAP_IGNORE( iObserver->DbSqlOperationCompletedL( KErrInUse ) );
hgs
parents:
diff changeset
    57
        return;
hgs
parents:
diff changeset
    58
        }
hgs
parents:
diff changeset
    59
    
hgs
parents:
diff changeset
    60
    iView = &aView;
hgs
parents:
diff changeset
    61
    iView->Prepare( iDb, TDbQuery(aQuery, EDbCompareFolded) );
hgs
parents:
diff changeset
    62
    iView->Evaluate(iStatus);
hgs
parents:
diff changeset
    63
    SetActive();
hgs
parents:
diff changeset
    64
    iOperation = EDbSqlQuery;
hgs
parents:
diff changeset
    65
    }
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    69
// CLbtDbOperationAO::ExecuteSyncQuery
hgs
parents:
diff changeset
    70
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    71
//
hgs
parents:
diff changeset
    72
TInt CLbtDbOperationAO::ExecuteSyncQuery(
hgs
parents:
diff changeset
    73
    RDbView& aView,
hgs
parents:
diff changeset
    74
    TDesC& aQuery)
hgs
parents:
diff changeset
    75
    {
hgs
parents:
diff changeset
    76
    FUNC_ENTER("CLbtDbOperationAO::ExecuteSyncQuery");
hgs
parents:
diff changeset
    77
    TInt err = aView.Prepare( iDb, TDbQuery(aQuery, EDbCompareFolded),KDbUnlimitedWindow );
hgs
parents:
diff changeset
    78
    // This should evaluate the query fully
hgs
parents:
diff changeset
    79
    if ( err == KErrNone )
hgs
parents:
diff changeset
    80
        {
hgs
parents:
diff changeset
    81
        err = aView.EvaluateAll();
hgs
parents:
diff changeset
    82
        }
hgs
parents:
diff changeset
    83
    return err;
hgs
parents:
diff changeset
    84
    }
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    87
// Compact the database
hgs
parents:
diff changeset
    88
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    89
//
hgs
parents:
diff changeset
    90
void CLbtDbOperationAO::CompactDb()
hgs
parents:
diff changeset
    91
    {
hgs
parents:
diff changeset
    92
    FUNC_ENTER("CLbtDbOperationAO::CompactDb");
hgs
parents:
diff changeset
    93
    if (  IsActive() )
hgs
parents:
diff changeset
    94
        {
hgs
parents:
diff changeset
    95
        // We are already executing an asynchronous operation so return error
hgs
parents:
diff changeset
    96
        iObserver->DbIncrementalOperationCompleted( KErrInUse );
hgs
parents:
diff changeset
    97
        return;
hgs
parents:
diff changeset
    98
        }
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
    TInt error = iDbIncrOp.Compact(iDb, iSteps);
hgs
parents:
diff changeset
   101
    if(error != KErrNone)
hgs
parents:
diff changeset
   102
    	{
hgs
parents:
diff changeset
   103
    	ERROR("iDbIncrOp.Compact returned %d", error);
hgs
parents:
diff changeset
   104
    	iDbIncrOp.Close();
hgs
parents:
diff changeset
   105
    	return;
hgs
parents:
diff changeset
   106
    	}
hgs
parents:
diff changeset
   107
    error = iDbIncrOp.Next( iSteps );
hgs
parents:
diff changeset
   108
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   109
    SetActive();
hgs
parents:
diff changeset
   110
    iOperation = EDbCompaction;
hgs
parents:
diff changeset
   111
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   112
    TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   113
    User::RequestComplete(status, error);
hgs
parents:
diff changeset
   114
    }
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   117
// DoCancel
hgs
parents:
diff changeset
   118
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   119
//
hgs
parents:
diff changeset
   120
TBool CLbtDbOperationAO::IsCompactionOngoing()
hgs
parents:
diff changeset
   121
	{
hgs
parents:
diff changeset
   122
	if( EDbCompaction == iOperation )
hgs
parents:
diff changeset
   123
		{
hgs
parents:
diff changeset
   124
		return ETrue;
hgs
parents:
diff changeset
   125
		}
hgs
parents:
diff changeset
   126
	return EFalse;
hgs
parents:
diff changeset
   127
	}
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   131
// DoCancel
hgs
parents:
diff changeset
   132
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   133
//
hgs
parents:
diff changeset
   134
void CLbtDbOperationAO::DoCancel()
hgs
parents:
diff changeset
   135
    {
hgs
parents:
diff changeset
   136
    FUNC_ENTER("CLbtDbOperationAO::DoCancel");
hgs
parents:
diff changeset
   137
    switch( iOperation )
hgs
parents:
diff changeset
   138
        {
hgs
parents:
diff changeset
   139
        case EDbSqlQuery:
hgs
parents:
diff changeset
   140
            iView->Cancel();
hgs
parents:
diff changeset
   141
            break;
hgs
parents:
diff changeset
   142
        case EDbCompaction:
hgs
parents:
diff changeset
   143
            // Nothing to do here since the step is already completed.
hgs
parents:
diff changeset
   144
            break;
hgs
parents:
diff changeset
   145
        default:
hgs
parents:
diff changeset
   146
            break;
hgs
parents:
diff changeset
   147
        }
hgs
parents:
diff changeset
   148
    iOperation = EDbOperationNone;
hgs
parents:
diff changeset
   149
    }
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   153
// RunL
hgs
parents:
diff changeset
   154
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   155
//
hgs
parents:
diff changeset
   156
void CLbtDbOperationAO::RunL()
hgs
parents:
diff changeset
   157
    {
hgs
parents:
diff changeset
   158
    FUNC_ENTER("CLbtDbOperationAO::RunL");
hgs
parents:
diff changeset
   159
    switch( iOperation )
hgs
parents:
diff changeset
   160
        {
hgs
parents:
diff changeset
   161
        case EDbSqlQuery:
hgs
parents:
diff changeset
   162
            if ( iStatus.Int() > 0 )
hgs
parents:
diff changeset
   163
                {
hgs
parents:
diff changeset
   164
                iView->Evaluate(iStatus);
hgs
parents:
diff changeset
   165
                SetActive();
hgs
parents:
diff changeset
   166
                }
hgs
parents:
diff changeset
   167
            else
hgs
parents:
diff changeset
   168
                {
hgs
parents:
diff changeset
   169
                iOperation = EDbOperationNone;
hgs
parents:
diff changeset
   170
                iObserver->DbSqlOperationCompletedL( iStatus.Int() );
hgs
parents:
diff changeset
   171
                }
hgs
parents:
diff changeset
   172
            break;
hgs
parents:
diff changeset
   173
        case EDbCompaction:
hgs
parents:
diff changeset
   174
            if ( iStatus.Int() == KErrNone && iSteps )
hgs
parents:
diff changeset
   175
                {
hgs
parents:
diff changeset
   176
                // If the steps till now have been successful and if there
hgs
parents:
diff changeset
   177
                // are more steps to be executed
hgs
parents:
diff changeset
   178
                TInt error = iDbIncrOp.Next( iSteps );
hgs
parents:
diff changeset
   179
                iStatus = KRequestPending;
hgs
parents:
diff changeset
   180
                SetActive();
hgs
parents:
diff changeset
   181
                TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   182
                User::RequestComplete(status, error);
hgs
parents:
diff changeset
   183
                }
hgs
parents:
diff changeset
   184
            else
hgs
parents:
diff changeset
   185
                {
hgs
parents:
diff changeset
   186
                // Either the operation was fully completed or
hgs
parents:
diff changeset
   187
                // there was an error during database compaction.
hgs
parents:
diff changeset
   188
                // So just close the incremental operation and
hgs
parents:
diff changeset
   189
                // return the error (in case of the error).
hgs
parents:
diff changeset
   190
                iDbIncrOp.Close();
hgs
parents:
diff changeset
   191
                iOperation = EDbOperationNone;
hgs
parents:
diff changeset
   192
                iObserver->DbIncrementalOperationCompleted( iStatus.Int() );
hgs
parents:
diff changeset
   193
                }
hgs
parents:
diff changeset
   194
            break;
hgs
parents:
diff changeset
   195
        default:
hgs
parents:
diff changeset
   196
            // Nothing to do in this case
hgs
parents:
diff changeset
   197
            break;
hgs
parents:
diff changeset
   198
        }
hgs
parents:
diff changeset
   199
    }
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   203
// RunError
hgs
parents:
diff changeset
   204
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   205
//
hgs
parents:
diff changeset
   206
TInt CLbtDbOperationAO::RunError(TInt /*aError*/)
hgs
parents:
diff changeset
   207
    {
hgs
parents:
diff changeset
   208
    FUNC_ENTER("CLbtDbOperationAO::RunError");
hgs
parents:
diff changeset
   209
    // RunL doesn't have any Leaving calls. So no implementation here.
hgs
parents:
diff changeset
   210
    return KErrNone;
hgs
parents:
diff changeset
   211
    }
hgs
parents:
diff changeset
   212
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   215
// Destructor
hgs
parents:
diff changeset
   216
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   217
//
hgs
parents:
diff changeset
   218
CLbtDbOperationAO::~CLbtDbOperationAO()
hgs
parents:
diff changeset
   219
    {
hgs
parents:
diff changeset
   220
    FUNC_ENTER("CLbtDbOperationAO::~CLbtDbOperationAO");
hgs
parents:
diff changeset
   221
    }
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   224
// Constructor
hgs
parents:
diff changeset
   225
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   226
//
hgs
parents:
diff changeset
   227
CLbtDbOperationAO::CLbtDbOperationAO(
hgs
parents:
diff changeset
   228
    RDbDatabase& aDb,
hgs
parents:
diff changeset
   229
    CLbtDbTriggersManager* aObserver)
hgs
parents:
diff changeset
   230
    :CActive(CActive::EPriorityStandard),
hgs
parents:
diff changeset
   231
     iDb(aDb),
hgs
parents:
diff changeset
   232
     iObserver(aObserver),
hgs
parents:
diff changeset
   233
     iOperation(EDbOperationNone)
hgs
parents:
diff changeset
   234
    {
hgs
parents:
diff changeset
   235
    CActiveScheduler::Add(this);
hgs
parents:
diff changeset
   236
    }
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   240
// The 2nd phase Symbian Constructor
hgs
parents:
diff changeset
   241
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   242
//
hgs
parents:
diff changeset
   243
void CLbtDbOperationAO::ConstructL()
hgs
parents:
diff changeset
   244
    {
hgs
parents:
diff changeset
   245
    }
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247