os/persistentdata/persistentstorage/sql/SRC/Server/Compact/SqlCompactTimer.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include "SqlCompactTimer.h"
sl@0
    17
#include "SqlAssert.h"
sl@0
    18
#include "SqlCompactEntry.h"
sl@0
    19
#include "OstTraceDefinitions.h"
sl@0
    20
#ifdef OST_TRACE_COMPILER_IN_USE
sl@0
    21
#include "SqlCompactTimerTraces.h"
sl@0
    22
#endif
sl@0
    23
#include "SqlTraceDef.h"
sl@0
    24
sl@0
    25
/**
sl@0
    26
Creates new CSqlCompactTimer instance.
sl@0
    27
sl@0
    28
@param aIntervalMs The timer intrerval (ms).
sl@0
    29
sl@0
    30
@panic SqlDb 4 In _DEBUG mode. Zero or negative aIntervalMs.
sl@0
    31
*/
sl@0
    32
CSqlCompactTimer* CSqlCompactTimer::NewL(TInt aIntervalMs)
sl@0
    33
	{
sl@0
    34
	SQL_TRACE_COMPACT(OstTrace1(TRACE_INTERNALS, CSQLCOMPACTTIMER_NEWL_ENTRY, "Entry;0;CSqlCompactTimer::NewL;aIntervalMs=%d", aIntervalMs));
sl@0
    35
	__ASSERT_DEBUG(aIntervalMs > 0, __SQLPANIC2(ESqlPanicBadArgument));
sl@0
    36
	CSqlCompactTimer* self = new (ELeave) CSqlCompactTimer(aIntervalMs);
sl@0
    37
	CleanupStack::PushL(self);
sl@0
    38
	self->ConstructL();
sl@0
    39
	CleanupStack::Pop(self);
sl@0
    40
	SQL_TRACE_COMPACT(OstTraceExt2(TRACE_INTERNALS, CSQLCOMPACTTIMER_NEWL_EXIT, "Exit;0x%X;CSqlCompactTimer::NewL;aIntervalMs=%d", (TUint)self, aIntervalMs));
sl@0
    41
	return self;
sl@0
    42
	}
sl@0
    43
sl@0
    44
/**
sl@0
    45
Destroys the object.
sl@0
    46
*/
sl@0
    47
CSqlCompactTimer::~CSqlCompactTimer()
sl@0
    48
	{
sl@0
    49
	SQL_TRACE_COMPACT(OstTrace1(TRACE_INTERNALS, CSQLCOMPACTTIMER_CSQLCOMPACTTIMER2, "0x%X;CSqlCompactTimer::~CSqlCompactTimer", (TUint)this));
sl@0
    50
	Cancel();
sl@0
    51
	}
sl@0
    52
sl@0
    53
/**
sl@0
    54
If the queue is not empty, the timer will be restarted.
sl@0
    55
*/
sl@0
    56
void CSqlCompactTimer::Restart()
sl@0
    57
	{
sl@0
    58
	SQLCOMPACTTIMER_INVARIANT();
sl@0
    59
	if(!iQueue.IsEmpty())
sl@0
    60
		{
sl@0
    61
		Cancel();
sl@0
    62
		After(iIntervalMicroSec);
sl@0
    63
		}
sl@0
    64
	SQLCOMPACTTIMER_INVARIANT();
sl@0
    65
	}
sl@0
    66
sl@0
    67
/**
sl@0
    68
Adds a database entry, that requires a background compaction, to the queue.
sl@0
    69
sl@0
    70
@param aEntry The database entry to be compacted.
sl@0
    71
sl@0
    72
@see CSqlCompactEntry
sl@0
    73
*/
sl@0
    74
void CSqlCompactTimer::Queue(CSqlCompactEntry& aEntry)
sl@0
    75
	{
sl@0
    76
	SQL_TRACE_COMPACT(OstTraceExt3(TRACE_INTERNALS, CSQLCOMPACTTIMER_QUEUE, "0x%X;CSqlCompactTimer::Queue;aEntry=0x%X;Name=%S", (TUint)this, (TUint)&aEntry,__SQLPRNSTR(aEntry.FullName())));
sl@0
    77
	SQLCOMPACTTIMER_INVARIANT();
sl@0
    78
	iQueue.AddFirst(aEntry);
sl@0
    79
	if(!IsActive())
sl@0
    80
		{
sl@0
    81
		After(iIntervalMicroSec);
sl@0
    82
		}
sl@0
    83
	SQLCOMPACTTIMER_INVARIANT();
sl@0
    84
	}
sl@0
    85
sl@0
    86
/**
sl@0
    87
Removes the specified database entry from the queue.
sl@0
    88
sl@0
    89
@param aEntry The database entry to be removed from the queue.
sl@0
    90
sl@0
    91
@see CSqlCompactEntry
sl@0
    92
*/
sl@0
    93
void CSqlCompactTimer::DeQueue(CSqlCompactEntry& aEntry)
sl@0
    94
	{
sl@0
    95
	SQL_TRACE_COMPACT(OstTraceExt2(TRACE_INTERNALS, CSQLCOMPACTTIMER_DEQUEUE, "0x%X;CSqlCompactTimer::DeQueue;aEntry=0x%X", (TUint)this, (TUint)&aEntry));
sl@0
    96
	SQLCOMPACTTIMER_INVARIANT();
sl@0
    97
	iQueue.Remove(aEntry);
sl@0
    98
	if(iQueue.IsEmpty())
sl@0
    99
		{
sl@0
   100
		Cancel();
sl@0
   101
		}
sl@0
   102
	SQLCOMPACTTIMER_INVARIANT();
sl@0
   103
	}
sl@0
   104
sl@0
   105
/**
sl@0
   106
Initializes the CSqlCompactTimer instance.
sl@0
   107
sl@0
   108
@param aIntervalMs The timer intrerval (ms).
sl@0
   109
sl@0
   110
@panic SqlDb 4 In _DEBUG mode. Zero or negative aIntervalMs.
sl@0
   111
*/
sl@0
   112
CSqlCompactTimer::CSqlCompactTimer(TInt aIntervalMs) :
sl@0
   113
	CTimer(CActive::EPriorityIdle),
sl@0
   114
	iIntervalMicroSec(aIntervalMs * 1000),
sl@0
   115
	iQueue(_FOFF(CSqlCompactEntry, iLink))
sl@0
   116
	{
sl@0
   117
	__ASSERT_DEBUG(aIntervalMs > 0, __SQLPANIC(ESqlPanicBadArgument));
sl@0
   118
	}
sl@0
   119
sl@0
   120
/**
sl@0
   121
Initializes the created CSqlCompactTimer instance.
sl@0
   122
*/
sl@0
   123
void CSqlCompactTimer::ConstructL()
sl@0
   124
	{
sl@0
   125
	CTimer::ConstructL();	
sl@0
   126
	CActiveScheduler::Add(this);
sl@0
   127
	SQLCOMPACTTIMER_INVARIANT();
sl@0
   128
	}
sl@0
   129
sl@0
   130
/**
sl@0
   131
CActive::RunL() implementation.
sl@0
   132
The RunL() implementation picks-up the last CSqlCompactEntry object from the queue and calls its Compact() method.
sl@0
   133
At the end of the call, if the queue is not empty (CSqlCompactEntry::Compact() may remove the object from the queue if
sl@0
   134
the compaction has been completed), the timer will be reactivated.
sl@0
   135
sl@0
   136
@panic SqlDb 7 The queue is empty.
sl@0
   137
@panic SqlDb 7 In _DEBUG mode. The last entry in the queue is NULL.
sl@0
   138
*/
sl@0
   139
void CSqlCompactTimer::RunL()
sl@0
   140
	{
sl@0
   141
	SQL_TRACE_COMPACT(OstTrace1(TRACE_INTERNALS, CSQLCOMPACTTIMER_RUNL, "0x%X;CSqlCompactTimer::RunL", (TUint)this));
sl@0
   142
	SQLCOMPACTTIMER_INVARIANT();
sl@0
   143
	__ASSERT_ALWAYS(!iQueue.IsEmpty(), __SQLPANIC(ESqlPanicInternalError));	
sl@0
   144
	CSqlCompactEntry* entry = iQueue.Last();
sl@0
   145
	SQL_TRACE_COMPACT(OstTraceExt4(TRACE_INTERNALS, CSQLCOMPACTTIMER_RUNL2, "0x%X;CSqlCompactTimer::RunL;Compact;entry=0x%X;Name=%S;iQueue.IsEmpty()=%d", (TUint)this, (TUint)entry,__SQLPRNSTR(entry->FullName()), (TInt)iQueue.IsEmpty()));
sl@0
   146
	__ASSERT_DEBUG(entry, __SQLPANIC(ESqlPanicInternalError));	
sl@0
   147
	(void)entry->Compact();
sl@0
   148
	if(!iQueue.IsEmpty())
sl@0
   149
		{
sl@0
   150
		After(iIntervalMicroSec);
sl@0
   151
		}
sl@0
   152
	SQLCOMPACTTIMER_INVARIANT();
sl@0
   153
	}
sl@0
   154
sl@0
   155
#ifdef _DEBUG
sl@0
   156
/**
sl@0
   157
CSqlCompactTimer invariant.
sl@0
   158
*/
sl@0
   159
void CSqlCompactTimer::Invariant() const
sl@0
   160
	{
sl@0
   161
	__ASSERT_DEBUG(iIntervalMicroSec > 0, __SQLPANIC(ESqlPanicInternalError));
sl@0
   162
	if(!iQueue.IsEmpty())
sl@0
   163
		{
sl@0
   164
		CSqlCompactEntry* entry = iQueue.Last();
sl@0
   165
		__ASSERT_DEBUG(entry != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   166
		}
sl@0
   167
	}
sl@0
   168
#endif//_DEBUG