BOOL CNamedIndexes::Open(void) { int i; CNamedIndexesBlocks* pcBlock; BOOL bResult; int iFileNumber; bResult = mcFiles.Open(); if (!bResult) { return FALSE; } for (i = 0; i < macBlocks.NumElements(); i++) { pcBlock = macBlocks.Get(i); iFileNumber = mcFiles.GetUniqueFileNumber(pcBlock->GetDataSize()); bResult = pcBlock->Load(iFileNumber); if (!bResult) { return FALSE; } } return TRUE; }
CNamedIndexesBlocks* CNamedIndexes::GetBlockForCacheDescriptorSize(int iCacheDescriptorSize) { int i; CNamedIndexesBlocks* pcBlock; CNamedIndexesBlocks* pcFoundBlock; int iNumFound; iNumFound = 0; for (i = 0; i < macBlocks.NumElements(); i++) { pcBlock = macBlocks.Get(i); if (pcBlock->GetCacheDescriptorSize() == iCacheDescriptorSize) { iNumFound++; pcFoundBlock = pcBlock; } } if (iNumFound == 1) { return pcFoundBlock; } else { return NULL; } }
void CNamedIndexes::TestGetPotentialContainingBlocks(char* szName, CArrayNamedIndexesBlockPtr* pcDest) { int i; CNamedIndexesBlocks* pcBlock; int iNameLength; CChars szFake; if (!szName) { return; } szFake.Fake(szName); if (szFake.Empty()) { return; } iNameLength = (int)strlen(szName); for (i = 0; i < macBlocks.NumElements(); i++) { pcBlock = macBlocks.Get(i); if (pcBlock->FitsLength(iNameLength)) { pcBlock->GetPotentialContainingBlocks(&szFake, pcDest); } } }
CNamedIndexesBlocks* CNamedIndexes::AddBlock(int iBlockSize, int iMinNameLength, int iMaxNameLength, int iBlockChunkSize) { CNamedIndexesBlocks* pcBlock; pcBlock = macBlocks.Add(); pcBlock->Init(iBlockSize, iMinNameLength, iMaxNameLength, iBlockChunkSize, this); return pcBlock; }
void* CNamedIndexes::AllocateInCache(size_t iSize) { CMemoryCacheAllocation cPreAllocated; void* pvData; int i; SMemoryCacheDescriptor* psMemoryDesc; int iCacheDescriptorSize; CNamedIndexesBlock* pcNamedIndexes; void* pvCacheMem; CIndexedFile* pcFile; BOOL bResult; CNamedIndexesBlocks* pcBlocks; cPreAllocated.Init(iSize); if (!mcCache.PreAllocate(&cPreAllocated)) { cPreAllocated.Kill(); return NULL; } for (i = 0; i < cPreAllocated.NumElements(); i++) { psMemoryDesc = cPreAllocated.Get(i); iCacheDescriptorSize = psMemoryDesc->iDataSize; pcBlocks = GetBlockForCacheDescriptorSize(iCacheDescriptorSize); if (!pcBlocks) { return NULL; } pvCacheMem = RemapSinglePointer(psMemoryDesc, sizeof(SMemoryCacheDescriptor)); pcNamedIndexes = pcBlocks->GetBlock(pvCacheMem); if (!pcNamedIndexes) { return NULL; } pcFile = GetOrCreateFile(pcBlocks->GetDataSize(), pcBlocks->GetFileNumber()); if (!pcFile) { return NULL; } pcBlocks->SetFileNumber(pcFile->miFileNumber); bResult = pcNamedIndexes->Uncache(pcFile); if (!bResult) { cPreAllocated.Kill(); return NULL; } } pvData = mcCache.Allocate(&cPreAllocated); cPreAllocated.Kill(); return pvData; }
void CNamedIndexesOptimiser::AssignBlockNumbers(void) { int i; CNamedIndexesBlocks* pcBlocks; int iFileNumber; for (i = 0; i < mpacBlocks->NumElements(); i++) { pcBlocks = mpacBlocks->Get(i); iFileNumber = mpcFiles->GetUniqueFileNumber(pcBlocks->GetDataSize()); pcBlocks->SetFileNumber(iFileNumber); } }
BOOL CNamedIndexes::Remove(CChars* szName) { CNamedIndexesBlocks* pcBlock; pcBlock = GetBlockFittingLength(szName->Length()); if (pcBlock) { return pcBlock->Remove(szName); } else { return FALSE; } }
BOOL CNamedIndexes::Add(OIndex oi, CChars* szName, BOOL bFailOnExisting) { CNamedIndexesBlocks* pcBlock; pcBlock = GetBlockFittingLength(szName->Length()); if (pcBlock) { return pcBlock->Add(oi, szName, bFailOnExisting); } else { return FALSE; } }
filePos CNamedIndexes::NumNames(void) { int i; CNamedIndexesBlocks* pcBlock; filePos iNames; iNames = 0; for (i = 0; i < macBlocks.NumElements(); i++) { pcBlock = macBlocks.Get(i); iNames += pcBlock->NumNames(); } return iNames; }
CNamedIndexesBlocks* CNamedIndexes::GetBlockWithDataSize(int iDataSize) { int i; CNamedIndexesBlocks* pcBlock; for (i = 0; i < macBlocks.NumElements(); i++) { pcBlock = macBlocks.Get(i); if (pcBlock->GetDataSize() == iDataSize) { return pcBlock; } } return NULL; }
CNamedIndexesBlocks* CNamedIndexes::GetBlockFittingLength(int iNameLength) { int i; CNamedIndexesBlocks* pcBlock; for (i = 0; i < macBlocks.NumElements(); i++) { pcBlock = macBlocks.Get(i); if (pcBlock->FitsLength(iNameLength)) { return pcBlock; } } return NULL; }
BOOL CNamedIndexes::Save(void) { int i; CNamedIndexesBlocks* pcBlock; BOOL bResult; bResult = TRUE; for (i = 0; i < macBlocks.NumElements(); i++) { pcBlock = macBlocks.Get(i); bResult &= pcBlock->Save(); } return bResult; }
void CNamedIndexes::Kill(void) { int i; CNamedIndexesBlocks* pcBlock; for (i = 0; i < macBlocks.NumElements(); i++) { pcBlock = macBlocks.Get(i); pcBlock->Kill(); } macBlocks.Kill(); mcCache.Kill(); mcFiles.Kill(); }
BOOL CNamedIndexesOptimiser::CloseFiles(BOOL bCopy) { int i; CNamedIndexesBlocks* pcBlocks; CIndexedFile* pcIndexedFile; BOOL bResult; mpcFiles->Close(); if (!bCopy) { DeleteFiles(); return FALSE; } else { for (i = 0; i < mpacBlocks->NumElements(); i++) { pcBlocks = mpacBlocks->Get(i); pcIndexedFile = GetFile(pcBlocks->GetDataSize(), pcBlocks->GetFileNumber()); if (pcIndexedFile) { bResult = CopyFile(pcIndexedFile->GetFileName(), pcIndexedFile->GetFileName()); if (!bResult) { return FALSE; } } } for (i = 0; i < mpacBlocks->NumElements(); i++) { pcBlocks = mpacBlocks->Get(i); pcIndexedFile = GetFile(pcBlocks->GetDataSize(), pcBlocks->GetFileNumber()); if (pcIndexedFile) { bResult = CopyFile(pcIndexedFile->mszRewriteName.Text(), pcIndexedFile->GetFileName()); if (!bResult) { return FALSE; } } } DeleteFiles(); return TRUE; } }
void CNamedIndexesOptimiser::DeleteFiles(void) { int i; CNamedIndexesBlocks* pcBlocks; CIndexedFile* pcIndexedFile; CFileUtil cFileUtil; CChars szFullName; for (i = 0; i < mpacBlocks->NumElements(); i++) { pcBlocks = mpacBlocks->Get(i); pcIndexedFile = GetFile(pcBlocks->GetDataSize(), pcBlocks->GetFileNumber()); if (pcIndexedFile) { cFileUtil.Delete(TempFileName(&szFullName, pcIndexedFile->GetFileName())); szFullName.Kill(); } } }
OIndex CNamedIndexes::GetIndex(CChars* szName) { CNamedIndexesBlocks* pcBlock; if ((szName) && !szName->Empty()) { pcBlock = GetBlockFittingLength(szName->Length()); if (pcBlock) { return pcBlock->GetIndex(szName); } else { return INVALID_O_INDEX; } } else { return INVALID_O_INDEX; } }
BOOL CNamedIndexesOptimiser::Optimise(void) { int i; CNamedIndexesBlocks* pcBlocks; CIndexedFile* pcIndexedFile; TRISTATE tTotalResult; BOOL bResult; ReturnOnFalse(OpenFiles()); AssignBlockNumbers(); tTotalResult = TRIFALSE; for (i = 0; i < mpacBlocks->NumElements(); i++) { pcBlocks = mpacBlocks->Get(i); pcIndexedFile = GetFile(pcBlocks->GetDataSize(), pcBlocks->GetFileNumber()); bResult = OptimiseBlock(pcBlocks, pcIndexedFile); if (!bResult) { return CloseFiles(FALSE); } } return CloseFiles(TRUE); }