You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
6.1 KiB
194 lines
6.1 KiB
/*++
|
|
|
|
Copyright (C) 2000-2001 Microsoft Corporation
|
|
|
|
--*/
|
|
|
|
#ifndef __WMI_A51_FILECACHE_H_
|
|
#define __WMI_A51_FILECACHE_H_
|
|
|
|
#include <set>
|
|
|
|
extern bool g_bShuttingDown;
|
|
|
|
|
|
#include "pagemgr.h"
|
|
#include "a51tools.h"
|
|
#include "objheap.h"
|
|
#include "index.h"
|
|
|
|
class CFileCache
|
|
{
|
|
protected:
|
|
long m_lRef;
|
|
BOOL m_bInit;
|
|
|
|
CPageSource m_TransactionManager;
|
|
|
|
CObjectHeap m_ObjectHeap;
|
|
|
|
DWORD m_dwBaseNameLen;
|
|
WCHAR m_wszBaseName[MAX_PATH+1]; // be debugger friendly, live it last
|
|
|
|
public:
|
|
|
|
protected:
|
|
|
|
public:
|
|
CFileCache();
|
|
~CFileCache();
|
|
private:
|
|
void Clear(DWORD dwShutDownFlags)
|
|
{
|
|
m_ObjectHeap.Uninitialize(dwShutDownFlags);
|
|
m_TransactionManager.Shutdown(dwShutDownFlags);
|
|
}
|
|
|
|
public:
|
|
long Flush(bool bCompactPages)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_TransactionManager.Checkpoint(bCompactPages);
|
|
}
|
|
|
|
long Initialize(LPCWSTR wszBaseName);
|
|
long Uninitialize(DWORD dwShutDownFlags);
|
|
|
|
private:
|
|
long InnerInitialize(LPCWSTR wszBaseName);
|
|
long RepositoryExists(LPCWSTR wszBaseName);
|
|
public:
|
|
//Write 1 or 2 indexes pointing to the object in the object store
|
|
long WriteObject(LPCWSTR wszFileName1, LPCWSTR wszFileName2, DWORD dwLen, BYTE* pBuffer)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.WriteObject(wszFileName1, wszFileName2, dwLen, pBuffer);
|
|
}
|
|
|
|
//Writes a link and no object
|
|
long WriteLink(LPCWSTR wszLinkName)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.WriteLink(wszLinkName);
|
|
}
|
|
|
|
//Retrieve a buffer based on the index
|
|
HRESULT ReadObject(LPCWSTR wszFileName, DWORD* pdwLen, BYTE** ppBuffer, bool bMustBeThere = false)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.ReadObject(wszFileName, pdwLen, ppBuffer);
|
|
}
|
|
|
|
//Deletion of an object deletes the link also
|
|
long DeleteObject(LPCWSTR wszFileName)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.DeleteObject(wszFileName);
|
|
}
|
|
//Deletion of a link does not touch the object heap
|
|
long DeleteLink(LPCWSTR wszLinkName)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.DeleteLink(wszLinkName);
|
|
}
|
|
|
|
//Deletes an entire node from the BTree and all associated objects from that store
|
|
long DeleteNode(LPCWSTR wszNodeName)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.DeleteNode(wszNodeName);
|
|
}
|
|
|
|
long BeginTransaction()
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_TransactionManager.BeginTrans();
|
|
}
|
|
long CommitTransaction()
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_TransactionManager.CommitTrans();
|
|
}
|
|
long AbortTransaction()
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
long lRes = m_TransactionManager.RollbackTrans();
|
|
if(lRes != ERROR_SUCCESS) return lRes;
|
|
m_ObjectHeap.InvalidateCache();
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
long AddRef() {return InterlockedIncrement(&m_lRef);}
|
|
long Release() {long lRet = InterlockedDecrement(&m_lRef); if (!lRet) delete this;return lRet;}
|
|
|
|
//Object enumeration methods that allow us to enumerate a set of objects and the
|
|
//result is the heap object itself rather than just the path
|
|
long ObjectEnumerationBegin(const wchar_t *wszSearchPrefix, void **ppHandle)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.ObjectEnumerationBegin(wszSearchPrefix, ppHandle);
|
|
}
|
|
|
|
long ObjectEnumerationEnd(void *pHandle)
|
|
{
|
|
if (!m_bInit)return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.ObjectEnumerationEnd(pHandle);
|
|
}
|
|
long ObjectEnumerationNext(void *pHandle, CFileName &wszFileName, BYTE **ppBlob, DWORD *pdwSize)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.ObjectEnumerationNext(pHandle, wszFileName, ppBlob, pdwSize);
|
|
}
|
|
long ObjectEnumerationFree(void *pHandle, BYTE *pBlob)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.ObjectEnumerationFree(pHandle, pBlob);
|
|
}
|
|
|
|
//Index enumeration methods for iterating through the index
|
|
long IndexEnumerationBegin(const wchar_t *wszSearchPrefix, void **ppHandle)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.IndexEnumerationBegin(wszSearchPrefix, ppHandle);
|
|
}
|
|
long IndexEnumerationEnd(void *pHandle)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.IndexEnumerationEnd(pHandle);
|
|
}
|
|
long IndexEnumerationNext(void *pHandle, CFileName &wszFileName, bool bCopyFullPath = false)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.IndexEnumerationNext(pHandle, wszFileName, bCopyFullPath);
|
|
}
|
|
long EmptyCaches()
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
long lRes = m_TransactionManager.EmptyCaches();
|
|
if (lRes == 0)
|
|
lRes = m_ObjectHeap.FlushCaches();
|
|
|
|
return lRes;
|
|
}
|
|
long ReadNextIndex(CFileName &wszSearch, CFileName &wszNextIndex)
|
|
{
|
|
if (!m_bInit) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
if (g_bShuttingDown) return ERROR_SERVER_SHUTDOWN_IN_PROGRESS;
|
|
return m_ObjectHeap.ReadNextIndex(wszSearch, wszNextIndex);
|
|
}
|
|
};
|
|
|
|
#endif
|