Update contrib.
1 // Copyright (c) 1998-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.
17 #include "U32STD_DBMS.H"
19 // Class CDbStoreIndex::CRecover
21 NONSHARABLE_CLASS(CDbStoreIndex::CRecover) : public CDbTableDatabase::CStepper
26 CRecover(CDbStoreDatabase& aDatabase,const CDbStoreDef& aTable,const CDbStoreIndexDef& anIndex);
28 static inline TInt Steps(TInt aCardinality);
30 TInt StepL(TInt aStep);
32 CDbStoreDatabase& iDatabase;
33 const CDbStoreDef& iTable;
34 const CDbStoreIndexDef& iIndex;
35 CDbTableDatabase::CBuildIndex* iBuild;
38 inline TInt CDbStoreIndex::CRecover::Steps(TInt aCardinality)
39 {return CDbTableDatabase::CBuildIndex::Steps(aCardinality)+EClearStep;}
41 CDbStoreIndex::CRecover::CRecover(CDbStoreDatabase& aDatabase,const CDbStoreDef& aTable,const CDbStoreIndexDef& anIndex)
42 : iDatabase(aDatabase),iTable(aTable),iIndex(anIndex)
45 CDbStoreIndex::CRecover::~CRecover()
50 TInt CDbStoreIndex::CRecover::StepL(TInt aStep)
54 iBuild=CDbTableDatabase::CBuildIndex::NewL(iDatabase,iTable,iIndex);
55 ((CDbStoreIndex&)iBuild->Index()).DiscardL();
56 return aStep-EClearStep;
58 aStep=iBuild->StepL(aStep);
61 iDatabase.IndexRecoveredL();
68 // Class CDbStoreIndex::CRepair
70 NONSHARABLE_CLASS(CDbStoreIndex::CRepair) : public CDbTableDatabase::CStepper
75 CRepair(CDbStoreDatabase& aDatabase,const CDbStoreDef& aTable,const CDbStoreIndexDef& anIndex);
76 static inline TInt Steps();
78 TInt StepL(TInt aStep);
80 CDbStoreDatabase& iDatabase;
81 const CDbStoreDef& iTable;
82 const CDbStoreIndexDef& iIndex;
85 inline TInt CDbStoreIndex::CRepair::Steps()
88 CDbStoreIndex::CRepair::CRepair(CDbStoreDatabase& aDatabase,const CDbStoreDef& aTable,const CDbStoreIndexDef& anIndex)
89 : iDatabase(aDatabase),iTable(aTable),iIndex(anIndex)
92 TInt CDbStoreIndex::CRepair::StepL(TInt)
94 CDbStoreIndex* index=CDbStoreIndex::NewL(iDatabase,iIndex,iTable);
95 CleanupStack::PushL(index);
98 CleanupStack::PopAndDestroy();
102 // Class CDbStoreDatabase
104 CDbTableDatabase::CStepper* CDbStoreDatabase::RecoverL(TInt& aStep)
106 TSglQueIterC<CDbStoreDef> iter(SchemaL()); // ensure we have the schema
108 const CDbStoreDef* tDef;
109 while ((tDef=iter++)!=NULL)
110 count+=tDef->Indexes().Count();
111 CMultiStepper* mStepper=CMultiStepper::NewL(count);
112 CleanupStack::PushL(mStepper);
113 // damaged ones first (as they are invoked last
116 while ((tDef=iter++)!=NULL)
118 TInt records=CDbStoreRecords::CardinalityL(Store(),*tDef);
119 TSglQueIterC<CDbStoreIndexDef> xIter(tDef->Indexes().AsQue());
120 for (const CDbStoreIndexDef* xDef;(xDef=xIter++)!=NULL;)
122 if (!CDbStoreIndex::IsDamagedL(*this,*xDef))
124 // rebuild from scratch
125 CDbStoreIndex::CRecover* rebuild=new(ELeave) CDbStoreIndex::CRecover(*this,*tDef,*xDef);
126 mStepper->AddStepper(rebuild,rebuild->Steps(records));
131 { // no indexes are actually damaged
133 CleanupStack::PopAndDestroy();
136 // repair the other ones after a reclaim
138 while ((tDef=iter++)!=NULL)
140 TSglQueIterC<CDbStoreIndexDef> xIter(tDef->Indexes().AsQue());
141 for (const CDbStoreIndexDef* xDef;(xDef=xIter++)!=NULL;)
143 if (CDbStoreIndex::IsDamagedL(*this,*xDef))
145 // repair from sequence set
146 CDbStoreIndex::CRepair* repair=new(ELeave) CDbStoreIndex::CRepair(*this,*tDef,*xDef);
147 mStepper->AddStepper(repair,repair->Steps());
150 iPagePool->Discard();
151 iPagePool->ReclaimAllL(); // recover all page pool space
152 aStep=mStepper->TotalSteps();