Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
	}
}
Exemplo n.º 3
0
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);
		}
	}
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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);
	}
}
Exemplo n.º 7
0
BOOL CNamedIndexes::Remove(CChars* szName)
{
	CNamedIndexesBlocks*	pcBlock;

	pcBlock = GetBlockFittingLength(szName->Length());
	if (pcBlock)
	{
		return pcBlock->Remove(szName);
	}
	else
	{
		return FALSE;
	}
}
Exemplo n.º 8
0
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;
	}
}
Exemplo n.º 9
0
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;
}
Exemplo n.º 10
0
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;
}
Exemplo n.º 11
0
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;
}
Exemplo n.º 12
0
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;
}
Exemplo n.º 13
0
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();
		}
	}
}
Exemplo n.º 16
0
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);
}