|
|
#ifndef __A51_INDEX__H_
#define __A51_INDEX__H_
#include "heap.h"
#include "btr.h"
class CAbstractIndex { public: virtual ~CAbstractIndex(){}
virtual long Create(LPCWSTR wszFileName) = 0; virtual long Delete(LPCWSTR wszFileName) = 0; virtual long FindFirst(LPCWSTR wszPrefix, WIN32_FIND_DATAW* pfd, void** ppHandle) = 0; virtual long FindNext(void* pHandle, WIN32_FIND_DATAW* pfd) = 0; virtual long FindClose(void* pHandle) = 0; };
typedef DWORD TDirectoryId;
#define ROSWELL_MAX_COMPONENT_LENGTH 50
#define ROSWELL_MAX_PREFIX_LENGTH ROSWELL_MAX_COMPONENT_LENGTH
struct CFileKey { TDirectoryId m_nDirectoryId; char m_szComponentName[ROSWELL_MAX_COMPONENT_LENGTH]; };
struct CFileValue { TDirectoryId m_nId; TOffset m_nOffset; DWORD m_dwLength; };
class CFileKeyCompare { public: bool operator()(const CFileKey& keyFirst, const CFileKey& keySecond) const { if(keyFirst.m_nDirectoryId != keySecond.m_nDirectoryId) return (keyFirst.m_nDirectoryId < keySecond.m_nDirectoryId); else return (strcmp(keyFirst.m_szComponentName, keySecond.m_szComponentName) < 0); } };
class CIndex : public CAbstractIndex { public: CFileHeap* m_pHeap; CCritSec m_cs; DWORD m_dwPrefixLength; TDirectoryId m_nNextId;
typedef std::map<CFileKey, CFileValue, CFileKeyCompare> TDirectoryMap; typedef TDirectoryMap::iterator TDirectoryIterator; TDirectoryMap m_map;
public: CIndex(CFileHeap* pHeap) : m_pHeap(pHeap), m_nNextId(1), m_dwPrefixLength(0) {}
long Initialize(DWORD dwPrefixLength); long Create(LPCWSTR wszFileName); long Delete(LPCWSTR wszFileName); long FindFirst(LPCWSTR wszPrefix, WIN32_FIND_DATAW* pfd, void** ppHandle); long FindNext(void* pHandle, WIN32_FIND_DATAW* pfd); long FindClose(void* pHandle);
protected: long ConvertInputToAscii(LPCWSTR wszFileName, char* szFileName); long CreateRecord(TDirectoryId nParentId, char* szComponentName, TDirectoryId* pnChildId); TDirectoryId GetNewDirectoryId();
friend class CIndexIterator; };
class CIndexIterator { protected: CIndex::TDirectoryMap& m_rMap; CIndex::TDirectoryIterator m_it; TDirectoryId m_nParentId; char m_szPrefix[ROSWELL_MAX_PREFIX_LENGTH]; long m_lPrefixLen;
public: CIndexIterator(TDirectoryId nParentId, char* szPrefix, CIndex::TDirectoryIterator it, CIndex::TDirectoryMap& rMap); long FindNext(WIN32_FIND_DATAW* pfd); };
class COldIndex : public CAbstractIndex { public: COldIndex(CFileHeap* pHeap){}
long Initialize(bool bNewFile, DWORD dwPrefixLength); long Create(LPCWSTR wszFileName); long Delete(LPCWSTR wszFileName); long FindFirst(LPCWSTR wszPrefix, WIN32_FIND_DATAW* pfd, void** ppHandle); long FindNext(void* pHandle, WIN32_FIND_DATAW* pfd); long FindClose(void* pHandle); };
class CBtrIndex : public CAbstractIndex { DWORD m_dwPrefixLength; CRITICAL_SECTION m_cs; CBTree bt; CPageSource ps;
BOOL CopyStringToWIN32_FIND_DATA( LPSTR pszSource, WIN32_FIND_DATAW* pfd );
public: CBtrIndex(); ~CBtrIndex();
long Shutdown(DWORD dwShutDownFlags);
long Initialize(DWORD dwPrefixLength, LPCWSTR wszRepositoryDir, CAbstractFileSource* pSource ); long Create(LPCWSTR wszFileName); long Delete(LPCWSTR wszFileName); long FindFirst(LPCWSTR wszPrefix, WIN32_FIND_DATAW* pfd, void** ppHandle); long FindNext(void* pHandle, WIN32_FIND_DATAW* pfd); long FindClose(void* pHandle);
long InvalidateCache();
CBTree& GetTree() {return bt;} };
#endif
|