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;
	}
}
Example #2
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::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();
		}
	}
}
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);
}