os/persistentdata/persistentstorage/dbms/pcdbms/ustor/US_STD.H
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 1998-2009 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 <e32std.h>
sl@0
    17
#include <u32std.h>
sl@0
    18
#include "D32REC.H"
sl@0
    19
#include "D32STOR.H"
sl@0
    20
#include <s32buf.h>
sl@0
    21
//#include <s32crypt.h>
sl@0
    22
#include <s32btree.h>
sl@0
    23
#include <s32ucmp.h>
sl@0
    24
//#include <e32hal.h>
sl@0
    25
#include <e32math.h>
sl@0
    26
#include "D32Assert.h"
sl@0
    27
sl@0
    28
// classes defined
sl@0
    29
class TDbStoreIndexStats;
sl@0
    30
class CDbStoreIndexDef;
sl@0
    31
class TRecordSize;
sl@0
    32
class CDbStoreDef;
sl@0
    33
class RClusterMap;
sl@0
    34
class TClusterLinkCache;
sl@0
    35
struct TClusterDes;
sl@0
    36
class CCluster;
sl@0
    37
class CClusterCache;
sl@0
    38
class CDbStoreRecords;
sl@0
    39
class CDbStoreBlobs;
sl@0
    40
class CDbStoreIndex;
sl@0
    41
class CDbStoreTable;
sl@0
    42
class RDbStoreReadStream;
sl@0
    43
class RDbStoreWriteStream;
sl@0
    44
class MDbStreamFilter;
sl@0
    45
class CDbStoreCompression;
sl@0
    46
sl@0
    47
/**
sl@0
    48
@internalComponent
sl@0
    49
*/
sl@0
    50
enum TStorePanic
sl@0
    51
	{
sl@0
    52
	EDbUnimplemented,
sl@0
    53
	EDbNoStore,
sl@0
    54
	EDbCannotSeek,
sl@0
    55
	EDbNotFixedFieldType,
sl@0
    56
	EDbWrongType
sl@0
    57
	};
sl@0
    58
sl@0
    59
/**
sl@0
    60
@internalComponent
sl@0
    61
*/
sl@0
    62
GLREF_C void Panic(TStorePanic aPanic);
sl@0
    63
sl@0
    64
/**
sl@0
    65
@internalComponent
sl@0
    66
*/
sl@0
    67
GLREF_D const TDbDriver KBuiltinDriver;
sl@0
    68
sl@0
    69
/**
sl@0
    70
@internalComponent
sl@0
    71
*/
sl@0
    72
const TUid KDbmsStoreDatabase={268435561};
sl@0
    73
sl@0
    74
/**
sl@0
    75
@internalComponent
sl@0
    76
*/
sl@0
    77
const TInt KDbStoreMaxRecordLength=0x200A;		// v5.10 32 nullable longtext columns
sl@0
    78
const TInt KClusterLimit=0x1000;
sl@0
    79
const TInt KMaxClustering=16;
sl@0
    80
const TInt KBlobRefSize=sizeof(TDbBlobId)+sizeof(TInt32);
sl@0
    81
const TInt KMinInlineLimit=16;
sl@0
    82
const TInt KMaxIndexKeySize=248;
sl@0
    83
sl@0
    84
/**
sl@0
    85
@internalComponent
sl@0
    86
*/
sl@0
    87
class TDbStoreIndexStats
sl@0
    88
	{
sl@0
    89
public:
sl@0
    90
	/**
sl@0
    91
	@internalComponent
sl@0
    92
	*/
sl@0
    93
	class TBound
sl@0
    94
		{
sl@0
    95
	public:
sl@0
    96
		inline void Set(TReal64 aBound);
sl@0
    97
		void Set(const TInt64& aBound);
sl@0
    98
		void Set(const TText8* aPtr,TInt aLen,const TTextOps& aConv);
sl@0
    99
		void Set(const TText16* aPtr,TInt aLen,const TTextOps& aConv);
sl@0
   100
		void Set(const TDbLookupKey::SColumn& aBound,const TTextOps& aConv);
sl@0
   101
	public:
sl@0
   102
		TReal64 iValue;
sl@0
   103
		};
sl@0
   104
	enum TType {EContinuous,EDiscrete};
sl@0
   105
public:
sl@0
   106
	inline TDbStoreIndexStats();
sl@0
   107
//
sl@0
   108
	void InternalizeL(RReadStream& aStream);
sl@0
   109
	void ExternalizeL(RWriteStream& aStream) const;
sl@0
   110
//
sl@0
   111
	inline void Reset(TInt aCardinality=0);
sl@0
   112
	inline void Inc();
sl@0
   113
	inline void Dec();
sl@0
   114
	inline void Refresh(TType aType);
sl@0
   115
//
sl@0
   116
	inline TBool IsValid() const;
sl@0
   117
	inline TBool NeedsRefresh() const;
sl@0
   118
	inline TInt Cardinality() const;
sl@0
   119
	TInt Span(TUint aInclusion,const TDbLookupKey* aLower,const TDbLookupKey* aUpper,const TTextOps& aConv) const;
sl@0
   120
private:
sl@0
   121
	inline void Touch();
sl@0
   122
	TInt ReverseSpan(TUint aInclusion,const TDbLookupKey* aLower,const TDbLookupKey* aUpper,const TTextOps& aConv) const;
sl@0
   123
private:
sl@0
   124
	enum {ERefreshFactor=3};
sl@0
   125
	enum {EInvalid=-1,ERefresh=0};
sl@0
   126
	enum {ERefreshShift=2+ERefreshFactor,EFlagsMask=(1<<ERefreshShift)-1};
sl@0
   127
	enum {EFlgDiscrete=0x1,EFlgClustering=0x2};
sl@0
   128
private:
sl@0
   129
	TInt iCardinality;
sl@0
   130
	TInt iRefresh;
sl@0
   131
	TUint iFlags;
sl@0
   132
public:
sl@0
   133
	TBound iLower;
sl@0
   134
	TBound iUpper;
sl@0
   135
	};
sl@0
   136
sl@0
   137
/**
sl@0
   138
@internalComponent
sl@0
   139
*/
sl@0
   140
class CDbStoreIndexDef : public CDbTableIndexDef
sl@0
   141
	{
sl@0
   142
public:
sl@0
   143
	static CDbStoreIndexDef* NewLC(const TDesC& aName,const CDbKey& aKey,const HDbColumnSet& aColumns);
sl@0
   144
	static CDbStoreIndexDef* NewL(RReadStream& aStream);
sl@0
   145
	void ExternalizeL(RWriteStream& aStream) const;
sl@0
   146
	inline void SetTokenId(TStreamId anId);
sl@0
   147
	inline TStreamId TokenId() const;
sl@0
   148
//
sl@0
   149
	static TInt KeySize(const TDbKeyCol& aKeyCol,const TDbColumnDef& aColumn);
sl@0
   150
	static void CheckSizeL(const CDbKey& aKey,const HDbColumnSet& aColSet);
sl@0
   151
private:
sl@0
   152
	CDbStoreIndexDef();
sl@0
   153
	static CDbStoreIndexDef* NewLC(const TDesC& aName);
sl@0
   154
private:
sl@0
   155
	TStreamId iTokenId;
sl@0
   156
public:
sl@0
   157
	__MUTABLE TDbStoreIndexStats iStats;	// cache the statistics here
sl@0
   158
	};
sl@0
   159
sl@0
   160
/**
sl@0
   161
@internalComponent
sl@0
   162
*/
sl@0
   163
class TRecordSize
sl@0
   164
	{
sl@0
   165
public:
sl@0
   166
	TBool Set(const HDbColumnSet& aColumns);
sl@0
   167
	inline TInt Clustering() const;
sl@0
   168
	inline TInt InlineLimit() const;
sl@0
   169
//
sl@0
   170
	static void CheckSizeL(const HDbColumnSet& aColumns);
sl@0
   171
	static TInt InlineLimit(const HDbColumnSet& aColumns);
sl@0
   172
//
sl@0
   173
	static inline TInt FixedFieldSize(TDbColType aType);
sl@0
   174
private:
sl@0
   175
	TInt iClustering;
sl@0
   176
	TInt iInlineLimit;
sl@0
   177
private:
sl@0
   178
	static TUint8 const FieldSizes[];
sl@0
   179
	};
sl@0
   180
sl@0
   181
/**
sl@0
   182
@internalComponent
sl@0
   183
*/
sl@0
   184
NONSHARABLE_CLASS(CDbStoreDef) : public CDbTableDef
sl@0
   185
	{
sl@0
   186
public:
sl@0
   187
	static CDbStoreDef* NewLC(const TDesC& aName,const CDbColSet& aColSet);
sl@0
   188
	static CDbStoreDef* NewL(RReadStream& aStream);
sl@0
   189
	void ExternalizeL(RWriteStream& aStream) const;
sl@0
   190
	inline void SetTokenId(TStreamId anId);
sl@0
   191
	inline TStreamId TokenId() const;
sl@0
   192
	inline TInt Clustering() const;
sl@0
   193
	inline TInt InlineLimit() const;
sl@0
   194
	void Changed();
sl@0
   195
private:
sl@0
   196
	void AlteredColumnSetL(HDbColumnSet& aSet,const CDbColSet& aChange,const CDbColSet& aAdd);
sl@0
   197
protected:
sl@0
   198
	CDbStoreDef();
sl@0
   199
private:
sl@0
   200
	static CDbStoreDef* NewLC(const TDesC& aName,TInt aColumnCount);
sl@0
   201
private:
sl@0
   202
	TStreamId iTokenId;
sl@0
   203
	TRecordSize iInfo;
sl@0
   204
	};
sl@0
   205
sl@0
   206
/**
sl@0
   207
@internalComponent
sl@0
   208
*/
sl@0
   209
typedef TUint32 TClusterId;
sl@0
   210
sl@0
   211
/**
sl@0
   212
@internalComponent
sl@0
   213
*/
sl@0
   214
const TClusterId KNullClusterId=0;
sl@0
   215
sl@0
   216
/**
sl@0
   217
@internalComponent
sl@0
   218
*/
sl@0
   219
inline TClusterId ClusterId(TDbRecordId aRecordId);
sl@0
   220
inline TInt RecordIndex(TDbRecordId aRecordId);
sl@0
   221
inline TDbRecordId RecordId(TClusterId aId,TInt aIndex);
sl@0
   222
inline TClusterId ClusterId(TStreamId aStreamId);
sl@0
   223
sl@0
   224
/**
sl@0
   225
@internalComponent
sl@0
   226
*/
sl@0
   227
class RClusterMap
sl@0
   228
	{
sl@0
   229
private:
sl@0
   230
	enum {EGranularity=8};
sl@0
   231
	class TIdPair
sl@0
   232
		{
sl@0
   233
	public:
sl@0
   234
		TClusterId iId;
sl@0
   235
		TClusterId iPreviousId;
sl@0
   236
		};
sl@0
   237
public:
sl@0
   238
	enum {ESeparation=16};
sl@0
   239
public:
sl@0
   240
	inline RClusterMap();
sl@0
   241
	inline void Close();
sl@0
   242
//
sl@0
   243
	void ResetL(TClusterId aHeadCluster);
sl@0
   244
	inline void BindL(TClusterId aPrevious,TClusterId aCluster);
sl@0
   245
	void Drop(TClusterId aCluster,TClusterId aNext);
sl@0
   246
	TBool At(TClusterId aCluster,TClusterId& aPrevious);
sl@0
   247
	inline TClusterId LastBound() const;
sl@0
   248
	inline void Complete(TClusterId aLastCluster);
sl@0
   249
	inline TBool IsComplete() const;
sl@0
   250
private:
sl@0
   251
	void AddL(TClusterId aCluster);
sl@0
   252
	void InsertL(TClusterId aCluster,TClusterId aPrevious);
sl@0
   253
	TIdPair* At(TClusterId aCluster);
sl@0
   254
private:
sl@0
   255
	TIdPair* iMap;
sl@0
   256
	TInt iEntries;
sl@0
   257
	TInt iAlloc;
sl@0
   258
	TClusterId iLastBound;
sl@0
   259
	TClusterId iLastMapped;
sl@0
   260
	TInt iSkipped;
sl@0
   261
	TBool iComplete;
sl@0
   262
	};
sl@0
   263
sl@0
   264
/**
sl@0
   265
@internalComponent
sl@0
   266
*/
sl@0
   267
class TClusterLinkCache
sl@0
   268
	{
sl@0
   269
public:
sl@0
   270
	inline void Invalidate();
sl@0
   271
	inline void Reset(TClusterId aBaseId);
sl@0
   272
	inline void Bind(TClusterId aPrevious,TClusterId aCluster,RClusterMap& aMap);
sl@0
   273
	void Add(const TClusterId* aFirst,const TClusterId* aLast);
sl@0
   274
	void Drop(TClusterId aCluster,TClusterId aNext);
sl@0
   275
	TBool Has(TClusterId aCluster) const;
sl@0
   276
	TBool At(TClusterId aCluster,TClusterId& aPrevious) const;
sl@0
   277
private:
sl@0
   278
	void Add(TClusterId aCluster,RClusterMap& aMap);
sl@0
   279
private:
sl@0
   280
	TClusterId iMap[RClusterMap::ESeparation+1];
sl@0
   281
	TClusterId* iEnd;
sl@0
   282
	};
sl@0
   283
sl@0
   284
/**
sl@0
   285
@internalComponent
sl@0
   286
*/
sl@0
   287
struct TClusterDes
sl@0
   288
	{
sl@0
   289
public:
sl@0
   290
	void InternalizeL(RReadStream& aStream);
sl@0
   291
	void ExternalizeL(RWriteStream& aStream) const;
sl@0
   292
public:
sl@0
   293
	TClusterId iNext;
sl@0
   294
	TUint32 iMembership;
sl@0
   295
	};
sl@0
   296
sl@0
   297
/**
sl@0
   298
@internalComponent
sl@0
   299
*/
sl@0
   300
NONSHARABLE_CLASS(CCluster) : public CBase
sl@0
   301
	{
sl@0
   302
	friend class CClusterCache;
sl@0
   303
private:
sl@0
   304
	enum {EGranularity=0x200};
sl@0
   305
	enum {EExpandBuffer=0x40};
sl@0
   306
public:
sl@0
   307
	/**
sl@0
   308
	@internalComponent
sl@0
   309
	*/
sl@0
   310
	NONSHARABLE_CLASS(MAlter)
sl@0
   311
		{
sl@0
   312
	public:
sl@0
   313
		virtual TInt RecordExpansion(const TUint8* aRec,TInt aLength);
sl@0
   314
		virtual TUint8* AlterRecordL(TUint8* aWPtr,const TUint8* aRPtr,TInt aLength) =0;
sl@0
   315
		};
sl@0
   316
public:
sl@0
   317
	static CCluster* NewL(CDbStoreDatabase& aDatabase);
sl@0
   318
	~CCluster();
sl@0
   319
//
sl@0
   320
	void FlushL();
sl@0
   321
	void Discard();
sl@0
   322
//
sl@0
   323
	void Create(TClusterId aClusterId);
sl@0
   324
	void ReadL(TClusterId aCluster);
sl@0
   325
	void Relink(TClusterId aNextClusterId);
sl@0
   326
	void AlterL(MAlter& anAlterer);
sl@0
   327
//
sl@0
   328
	TPtrC8 RecordL(TInt aIndex);
sl@0
   329
	TUint8* UpdateL(TInt aIndex,TInt aNewSize);
sl@0
   330
	TBool DeleteL(TInt aIndex);
sl@0
   331
	inline TBool IsFull() const;
sl@0
   332
//
sl@0
   333
	inline TClusterId Id() const;
sl@0
   334
	inline const TClusterDes& Des() const;
sl@0
   335
private:
sl@0
   336
	CCluster(CDbStoreDatabase& aDatabase);
sl@0
   337
//
sl@0
   338
	TInt SetSizeL(TInt aSize);
sl@0
   339
	void AdjustMap(TUint8** aMapEntry,TInt aAdjust);
sl@0
   340
	void SetRecordL(TInt aIndex,TInt aNewSize);
sl@0
   341
	void AdjustL(TUint8** aMapEntry,TInt aAdjust,TUint8* aData);
sl@0
   342
private:
sl@0
   343
	TDblQueLink iLink;
sl@0
   344
	CDbStoreDatabase& iDatabase;
sl@0
   345
	TInt iSize;
sl@0
   346
	TClusterId iCluster;
sl@0
   347
	TClusterDes iDes;
sl@0
   348
	TBool iModified;
sl@0
   349
	TUint8* iMap[KMaxClustering+1];
sl@0
   350
	};
sl@0
   351
sl@0
   352
/**
sl@0
   353
@internalComponent
sl@0
   354
*/
sl@0
   355
NONSHARABLE_CLASS(CClusterCache) : public CBase
sl@0
   356
	{
sl@0
   357
	#ifndef MAX_CLUSTER_CACHE_SIZE
sl@0
   358
		#define MAX_CLUSTER_CACHE_SIZE 8
sl@0
   359
	#else
sl@0
   360
		#if MAX_CLUSTER_CACHE_SIZE < 4
sl@0
   361
			#error "MAX_CLUSTER_CACHE_SIZE macro value can't be less than 4"
sl@0
   362
		#endif
sl@0
   363
	#endif
sl@0
   364
	enum {EMaxClusters=MAX_CLUSTER_CACHE_SIZE};
sl@0
   365
public:
sl@0
   366
	static CClusterCache* NewL(CDbStoreDatabase& aDatabase);
sl@0
   367
	~CClusterCache();
sl@0
   368
//
sl@0
   369
	void FlushL();
sl@0
   370
	void Discard();
sl@0
   371
//
sl@0
   372
	CCluster* Cluster(TClusterId aCluster);
sl@0
   373
	CCluster& ClusterL(TClusterId aCluster);
sl@0
   374
	CCluster& ClusterL();
sl@0
   375
//
sl@0
   376
	inline CDbStoreDatabase& Database();
sl@0
   377
	inline CStreamStore& Store();
sl@0
   378
private:
sl@0
   379
	inline CClusterCache(CDbStoreDatabase& aDatabase);
sl@0
   380
//
sl@0
   381
	void Apply(void (*aFunc)(CCluster*));
sl@0
   382
	CCluster& AddClusterL();
sl@0
   383
	CCluster& NewClusterL();
sl@0
   384
	CCluster& Touch(CCluster& aCluster);
sl@0
   385
private:
sl@0
   386
	CDbStoreDatabase& iDatabase;
sl@0
   387
	TClusterId iCachePlus1;
sl@0
   388
	TClusterId iCachePlus2;
sl@0
   389
	TUint8 iFollowOnHits;
sl@0
   390
	TUint8 iClusters;
sl@0
   391
	TDblQue<CCluster> iCache;
sl@0
   392
	};
sl@0
   393
sl@0
   394
/**
sl@0
   395
@internalComponent
sl@0
   396
*/
sl@0
   397
NONSHARABLE_CLASS(CDbStoreRecords) : public CDbRecordSpace
sl@0
   398
	{
sl@0
   399
public:
sl@0
   400
	class TIteratorC;
sl@0
   401
	class CIter;
sl@0
   402
public:
sl@0
   403
	static TStreamId CreateL(CClusterCache& aCache);
sl@0
   404
	static CDbStoreRecords* NewL(CClusterCache& aCache,const CDbStoreDef& aDef);
sl@0
   405
//
sl@0
   406
	static TInt CardinalityL(CStreamStore& aStore,const CDbStoreDef& aDef);
sl@0
   407
//
sl@0
   408
	TBool GotoL(TDbPosition aPosition,TIteratorC& anIterator);
sl@0
   409
	TBool GotoL(TDbRecordId aRecordId,TIteratorC& anIterator);
sl@0
   410
	TBool DeletedL(TDbPosition aPosition,TIteratorC& anIterator);
sl@0
   411
//
sl@0
   412
	inline TClusterId Head() const;
sl@0
   413
	inline TInt Count() const;
sl@0
   414
	TInt DiscardL(TClusterId& aCluster);
sl@0
   415
	TClusterId AlterL(TClusterId aCluster,CCluster::MAlter& anAlterer);
sl@0
   416
	void DestroyL();
sl@0
   417
// providing for CDbRecordSpace
sl@0
   418
	TBool ExistsL(TDbRecordId aRecordId);
sl@0
   419
	TPtrC8 ReadL(TDbRecordId aRecordId) const;
sl@0
   420
	TUint8* DoReplaceL(TDbRecordId aRecordId,TInt aRecordSize);
sl@0
   421
	TUint AutoIncrementL();
sl@0
   422
	TUint8* DoNewL(TInt aRecordSize);
sl@0
   423
	TDbRecordId AppendL();
sl@0
   424
	void DoEraseL(TDbRecordId aRecordId);
sl@0
   425
	CDbRecordIter* IteratorL();
sl@0
   426
	TBool RestoreL();
sl@0
   427
	void SynchL();
sl@0
   428
private:
sl@0
   429
	CDbStoreRecords(CClusterCache& aCache);
sl@0
   430
	~CDbStoreRecords();
sl@0
   431
// 
sl@0
   432
	TUint8* UpdateRecordL(TDbRecordId aRecordId,TInt aNewSize);
sl@0
   433
	void DesL(TClusterDes& aDes,TClusterId aCluster);
sl@0
   434
	void CompleteMapL();
sl@0
   435
	TClusterId NextClusterL(TClusterDes& aDes,TClusterId aCluster);
sl@0
   436
	TClusterId PreviousClusterL(TClusterDes& aDes,TClusterId aCluster);
sl@0
   437
	TBool LocateL(TClusterId aCluster);
sl@0
   438
private:
sl@0
   439
	class TToken
sl@0
   440
		{
sl@0
   441
	public:
sl@0
   442
		void InternalizeL(RReadStream& aStream);
sl@0
   443
		void ExternalizeL(RWriteStream& aStream) const;
sl@0
   444
	public:
sl@0
   445
		TClusterId iHead;
sl@0
   446
		TDbRecordId iNext;
sl@0
   447
		TInt iCount;
sl@0
   448
		TUint iAutoIncrement;
sl@0
   449
		};
sl@0
   450
private:
sl@0
   451
	CClusterCache& iCache;
sl@0
   452
	TStreamId iTokenId;
sl@0
   453
	TToken iToken;
sl@0
   454
	TInt iClustering;
sl@0
   455
	TClusterLinkCache iLinks;
sl@0
   456
	RClusterMap iMap;
sl@0
   457
	};
sl@0
   458
sl@0
   459
/**
sl@0
   460
@internalComponent
sl@0
   461
*/
sl@0
   462
NONSHARABLE_CLASS(CDbStoreBlobs) : public CDbBlobSpace
sl@0
   463
	{
sl@0
   464
public:
sl@0
   465
	CDbStoreBlobs(CDbStoreDatabase& aDatabase,TInt aInlineLimit);
sl@0
   466
//
sl@0
   467
	MStreamBuf* DoCreateL(TDbBlobId &aBlobId,TDbColType aType);
sl@0
   468
	MStreamBuf* ReadL(TDbBlobId aBlobId,TDbColType aType) const;
sl@0
   469
	void DoDeleteL(TDbBlobId aBlobId);
sl@0
   470
private:
sl@0
   471
	CDbStoreDatabase& iDatabase;
sl@0
   472
	};
sl@0
   473
sl@0
   474
/**
sl@0
   475
@internalComponent
sl@0
   476
*/
sl@0
   477
NONSHARABLE_CLASS(CDbStoreIndex) : public CDbRecordIndex
sl@0
   478
	{
sl@0
   479
public:
sl@0
   480
	class HKey;
sl@0
   481
	class HDupKey;
sl@0
   482
	class CIter;
sl@0
   483
	class CDiscarder;
sl@0
   484
	class CRecover;
sl@0
   485
	class CRepair;
sl@0
   486
public:
sl@0
   487
	static CDbStoreIndex* NewL(CDbStoreDatabase& aDatabase,const CDbStoreIndexDef& aDef,const CDbTableDef& aTable);
sl@0
   488
	~CDbStoreIndex();
sl@0
   489
//
sl@0
   490
	static TStreamId CreateL(CDbStoreDatabase& aDatabase,const CDbStoreIndexDef& aDef);
sl@0
   491
	static TBool IsDamagedL(CDbStoreDatabase& aDatabase,const CDbStoreIndexDef& aDef);
sl@0
   492
//
sl@0
   493
	inline HKey& Key() const;
sl@0
   494
	inline const TBtree& Tree() const;
sl@0
   495
	inline TInt Count() const;
sl@0
   496
	void RepairL();
sl@0
   497
	void DiscardL();
sl@0
   498
	void DestroyL();
sl@0
   499
private:
sl@0
   500
	CDbStoreIndex(CDbStoreDatabase& aDatabase,const CDbStoreIndexDef& aDef);
sl@0
   501
//
sl@0
   502
	void RefreshStatsL();
sl@0
   503
// CDbTableIndex framework
sl@0
   504
	TFind FindL(TDbRecordId aRecordId,const RDbTableRow& aRow);
sl@0
   505
	TBool DoInsertL(TDbRecordId aRecordId,const RDbTableRow& aRow);
sl@0
   506
	void DoDeleteL(TDbRecordId aRecordId,const RDbTableRow& aRow);
sl@0
   507
	CDbRecordIter* IteratorL(TUint aInclusion,const TDbLookupKey* aLowerBound,const TDbLookupKey* aUpperBound);
sl@0
   508
	TBool RestoreL();
sl@0
   509
	void AboutToModifyL();
sl@0
   510
	void SynchL();
sl@0
   511
private:
sl@0
   512
	CDbStoreDatabase& iDatabase;
sl@0
   513
	TStreamId iTokenId;
sl@0
   514
	TBtree iTree;
sl@0
   515
	HKey* iKey;
sl@0
   516
	TBtreeInlineLeafOrg iLeafOrg;
sl@0
   517
	TBtreeInlineIndexOrg iIndexOrg;
sl@0
   518
	TDbStoreIndexStats& iStats;
sl@0
   519
	};
sl@0
   520
sl@0
   521
/**
sl@0
   522
@internalComponent
sl@0
   523
*/
sl@0
   524
NONSHARABLE_CLASS(CDbStoreIndex::CDiscarder) : public CDbTableDatabase::CStepper
sl@0
   525
	{
sl@0
   526
public:
sl@0
   527
	CDiscarder();
sl@0
   528
	~CDiscarder();
sl@0
   529
	TInt Open(CDbStoreIndex* anIndex);
sl@0
   530
private:
sl@0
   531
	TInt StepL(TInt aStep);
sl@0
   532
private:
sl@0
   533
	CDbStoreIndex* iIndex;
sl@0
   534
	};
sl@0
   535
sl@0
   536
/**
sl@0
   537
@internalComponent
sl@0
   538
*/
sl@0
   539
NONSHARABLE_CLASS(CDbStoreTable) : public CDbTable
sl@0
   540
	{
sl@0
   541
public:
sl@0
   542
	class CDiscarder;
sl@0
   543
	class CAlter;
sl@0
   544
	class CCompressor;
sl@0
   545
	friend class CDiscarder;
sl@0
   546
	friend class CAlter;
sl@0
   547
	friend class CCompressor;
sl@0
   548
public:
sl@0
   549
	CDbStoreTable(CDbStoreDatabase& aDatabase,const CDbTableDef& aDef);
sl@0
   550
private:
sl@0
   551
	inline const CDbStoreDef& Def() const;
sl@0
   552
	inline CDbStoreDatabase& Database();
sl@0
   553
	inline CDbStoreRecords& StoreRecordsL();
sl@0
   554
//
sl@0
   555
	TInt RowSize(const TUint8* aRec,TInt aLength);
sl@0
   556
	const TUint8* CopyToRow(TDbCell* aCell,TInt aSize,const TUint8* aRec);
sl@0
   557
	TUint8* AlterRecordL(TUint8* aWPtr,const TUint8* aRPtr,TInt aLength,TInt aInlineLimit);
sl@0
   558
// providing for CDbTable framework
sl@0
   559
	TInt IndexSpanL(const CDbTableIndexDef& aIndex,TUint aInclusion,const TDbLookupKey* aLowerBound,const TDbLookupKey* aUpperBound);
sl@0
   560
	CDbRecordSpace* RecordSpaceL();
sl@0
   561
	CDbBlobSpace* BlobSpaceL();
sl@0
   562
	CDbRecordIndex* RecordIndexL(const CDbTableIndexDef& anIndex);
sl@0
   563
	void CopyToRowL(RDbRow& aRow,const TDesC8& aRecord);
sl@0
   564
	TInt RecordLength(const RDbRow& aRow);
sl@0
   565
	TInt OptimizedRowLength(const RDbRow& aRow);
sl@0
   566
	void CopyFromRow(TUint8* aRecord,const RDbRow& aRow);
sl@0
   567
	};
sl@0
   568
sl@0
   569
/**
sl@0
   570
@internalComponent
sl@0
   571
*/
sl@0
   572
NONSHARABLE_CLASS(CDbStoreTable::CDiscarder) : public CDbTableDatabase::CStepper, public CCluster::MAlter
sl@0
   573
	{
sl@0
   574
private:
sl@0
   575
	enum {EDiscardClusters=32,EBlobDiscardClusters=2};
sl@0
   576
public:
sl@0
   577
	CDiscarder();
sl@0
   578
	~CDiscarder();
sl@0
   579
	TInt OpenL(CDbStoreTable* aTable);
sl@0
   580
private:
sl@0
   581
	TInt StepL(TInt aStep);
sl@0
   582
	TUint8* AlterRecordL(TUint8* aWPtr,const TUint8* aRPtr,TInt aLength);
sl@0
   583
private:
sl@0
   584
	CDbStoreTable* iTable;
sl@0
   585
	CDbStoreRecords* iRecords;
sl@0
   586
	TClusterId iCluster;
sl@0
   587
	RDbRow iRow;
sl@0
   588
	};
sl@0
   589
sl@0
   590
/**
sl@0
   591
@internalComponent
sl@0
   592
*/
sl@0
   593
NONSHARABLE_CLASS(CDbStoreTable::CAlter) : public CDbTableDatabase::CStepper, public CCluster::MAlter
sl@0
   594
	{
sl@0
   595
public:
sl@0
   596
	CAlter();
sl@0
   597
	~CAlter();
sl@0
   598
	void OpenL(CDbStoreTable* aTable,const HDbColumnSet& aNewSet);
sl@0
   599
private:
sl@0
   600
	TUint8* AlterRecordL(TUint8* aWPtr,const TUint8* aRPtr,TInt aLength);
sl@0
   601
	TInt RecordExpansion(const TUint8* aRec,TInt aLength);
sl@0
   602
	TInt StepL(TInt aStep);
sl@0
   603
private:
sl@0
   604
	TInt iExpansion;
sl@0
   605
	TInt iInlineLimit;
sl@0
   606
	CDbStoreTable* iTable;
sl@0
   607
	CDbStoreRecords* iRecords;
sl@0
   608
	TClusterId iCluster;
sl@0
   609
	TInt iStep;
sl@0
   610
	};
sl@0
   611
sl@0
   612
/**
sl@0
   613
@internalComponent
sl@0
   614
*/
sl@0
   615
class RDbStoreReadStream : public RStoreReadStream
sl@0
   616
	{
sl@0
   617
public:
sl@0
   618
	enum TType {EMixed,EBinary,EText};
sl@0
   619
public:
sl@0
   620
	inline RDbStoreReadStream(CDbStoreDatabase& aDatabase)
sl@0
   621
		:iDatabase(aDatabase)
sl@0
   622
		{}
sl@0
   623
	void FilterL(TType aType,TUint32 aInit);
sl@0
   624
private:
sl@0
   625
	CDbStoreDatabase& iDatabase;
sl@0
   626
	};
sl@0
   627
sl@0
   628
/**
sl@0
   629
@internalComponent
sl@0
   630
*/
sl@0
   631
class RDbStoreWriteStream : public RStoreWriteStream
sl@0
   632
	{
sl@0
   633
public:
sl@0
   634
	enum TType {EMixed,EBinary,EText};
sl@0
   635
public:
sl@0
   636
	inline RDbStoreWriteStream(CDbStoreDatabase& aDatabase)
sl@0
   637
		:iDatabase(aDatabase)
sl@0
   638
		{}
sl@0
   639
	void FilterL(TType aType,TUint32 aInit);
sl@0
   640
private:
sl@0
   641
	CDbStoreDatabase& iDatabase;
sl@0
   642
	};
sl@0
   643
sl@0
   644
/**
sl@0
   645
@internalComponent
sl@0
   646
*/
sl@0
   647
class MDbStreamFilter
sl@0
   648
	{
sl@0
   649
public:
sl@0
   650
	virtual MStreamBuf* FilterL(MStreamBuf* aHost,TUint32 aInit,RDbStoreReadStream::TType aType) =0;
sl@0
   651
	virtual MStreamBuf* FilterL(MStreamBuf* aHost,TUint32 aInit,RDbStoreWriteStream::TType aType) =0;
sl@0
   652
	};
sl@0
   653
sl@0
   654
sl@0
   655
/**
sl@0
   656
@internalComponent
sl@0
   657
*/
sl@0
   658
NONSHARABLE_CLASS(CDbStoreCompression) : public CBase, public MDbStreamFilter
sl@0
   659
	{
sl@0
   660
public:
sl@0
   661
	/**
sl@0
   662
	@internalComponent
sl@0
   663
	*/
sl@0
   664
	class TEncoding
sl@0
   665
		{
sl@0
   666
	public:
sl@0
   667
		enum {ELiterals=256,ELengths=28,ESpecials=1,EDistances=44};
sl@0
   668
		enum {ELitLens=ELiterals+ELengths+ESpecials};
sl@0
   669
		enum {EEos=ELiterals+ELengths};
sl@0
   670
	public:
sl@0
   671
		TUint32 iLitLen[ELitLens];
sl@0
   672
		TUint32 iDistance[EDistances];
sl@0
   673
		};
sl@0
   674
public:
sl@0
   675
	static CDbStoreCompression* NewL();
sl@0
   676
//
sl@0
   677
	void EncodeL();
sl@0
   678
	inline void Inflate();
sl@0
   679
	void ExternalizeL(RWriteStream& aStream) const;
sl@0
   680
	void InternalizeL(RReadStream& aStream);
sl@0
   681
// for MDbStreamFilter
sl@0
   682
	MStreamBuf* FilterL(MStreamBuf* aHost,TUint32 aInit,RDbStoreReadStream::TType aType);
sl@0
   683
	MStreamBuf* FilterL(MStreamBuf* aHost,TUint32 aInit,RDbStoreWriteStream::TType aType);
sl@0
   684
private:
sl@0
   685
	inline CDbStoreCompression();
sl@0
   686
private:
sl@0
   687
	enum TState {EAnalysis,EEncoding,EDecoding,EInflating};
sl@0
   688
private:
sl@0
   689
	TState iState;
sl@0
   690
	TEncoding iEncoding[3];
sl@0
   691
	};
sl@0
   692
sl@0
   693
#include "US_STD.INL"