/*++ Module Name: fsaunmdb.cpp Abstract: Defines the functions for the Unmanage Db & record classes. Author: Ran Kalach [rankala] 05-Dec-2000 Revision History: --*/ #include "stdafx.h" #include "wsb.h" #include "fsaunmdb.h" #define WSB_TRACE_IS WSB_TRACE_BIT_FSA static USHORT iCountUnmRec = 0; // Count of existing objects HRESULT CFsaUnmanageDb::FinalConstruct( void ) /*++ Implements: CComObjectRoot::FinalConstruct(). --*/ { HRESULT hr = S_OK; try { WsbAssertHr(CWsbDb::FinalConstruct()); m_version = 1; } WsbCatch(hr); return(hr); } HRESULT CFsaUnmanageDb::FinalRelease( void ) /*++ Implements: CComObjectRoot::FinalRelease --*/ { HRESULT hr = S_OK; CWsbDb::FinalRelease(); return(hr); } HRESULT CFsaUnmanageDb::GetClassID( OUT CLSID* pClsid ) /*++ Implements: IPersist::GetClassID(). --*/ { HRESULT hr = S_OK; try { WsbAssert(0 != pClsid, E_POINTER); *pClsid = CLSID_CFsaUnmanageDb; } WsbCatch(hr); return(hr); } HRESULT CFsaUnmanageDb::Init( IN OLECHAR* path, IN IWsbDbSys* pDbSys, OUT BOOL* pCreated ) /*++ Implements: IFsaUnmanageDb::Init --*/ { BOOL created = FALSE; HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageDb::Init"),OLESTR("")); try { m_pWsbDbSys = pDbSys; WsbAffirmPointer(m_pWsbDbSys); // Attempt to find the DB // If we find it - delete it, since we always want to start with a new db !! hr = Locate(path); if (STG_E_FILENOTFOUND == hr) { // Expected... WsbTrace(OLESTR("CFsaUnmanageDb::Init: db Locate failed with not-found, will create a new one...\n")); hr = S_OK; } else if (S_OK == hr) { // Cleanup wasn't done in previous run WsbTrace(OLESTR("CFsaUnmanageDb::Init: db Locate succeeded - will delete so a new one can be created\n")); WsbAffirmHr(Delete(path, IDB_DELETE_FLAG_NO_ERROR)); } else { // Still try to delete and continue... // (Db could be corrupted for example due to abnormal termination of previous run - // we don't care since all we want is to always try creating a new one). WsbTrace(OLESTR("CFsaUnmanageDb::Init: db Locate failed with <%ls> - will try to delete and continue\n"), WsbHrAsString(hr)); // Ignore Delete errors... hr = Delete(path, IDB_DELETE_FLAG_NO_ERROR); WsbTrace(OLESTR("CFsaUnmanageDb::Init: db Delete finished with <%ls> - will try to create a new db\n"), WsbHrAsString(hr)); hr = S_OK; } // If we got that far, it means that the Unmanage Db doesn't exist and we can re-create ULONG memSize; m_nRecTypes = 1; memSize = m_nRecTypes * sizeof(IDB_REC_INFO); m_RecInfo = (IDB_REC_INFO*)WsbAlloc(memSize); WsbAffirm(0 != m_RecInfo, E_OUTOFMEMORY); ZeroMemory(m_RecInfo, memSize); // Unmanage record type m_RecInfo[0].Type = UNMANAGE_REC_TYPE; m_RecInfo[0].EntityClassId = CLSID_CFsaUnmanageRec; m_RecInfo[0].Flags = 0; m_RecInfo[0].MinSize = (WSB_BYTE_SIZE_GUID + // media id WSB_BYTE_SIZE_LONGLONG + // file offset on media WSB_BYTE_SIZE_LONGLONG); // file id m_RecInfo[0].MaxSize = m_RecInfo[0].MinSize; m_RecInfo[0].nKeys = 1; memSize = m_RecInfo[0].nKeys * sizeof(IDB_KEY_INFO); m_RecInfo[0].Key = (IDB_KEY_INFO*)WsbAlloc(memSize); WsbAffirm(0 != m_RecInfo[0].Key, E_OUTOFMEMORY); ZeroMemory(m_RecInfo[0].Key, memSize); m_RecInfo[0].Key[0].Type = UNMANAGE_KEY_TYPE; m_RecInfo[0].Key[0].Size = WSB_BYTE_SIZE_GUID + WSB_BYTE_SIZE_LONGLONG;; m_RecInfo[0].Key[0].Flags = IDB_KEY_FLAG_DUP_ALLOWED; // same key possible on tape if a placeholder is restored to a new location on the same volume. // same key is common in optical // TEMPORARY - check if we shouldn't use IDB_KEY_FLAG_PRIMARY for performance (even if it means not allow dup !! // (==> add one more part to the index, maybe auto-increment-coloumn, so it is always uniqe) // Attempt to create the DB WsbAssertHr(Create(path, (IDB_CREATE_FLAG_NO_TRANSACTION | IDB_CREATE_FLAG_FIXED_SCHEMA))); created = TRUE; } WsbCatch(hr); if (pCreated) { *pCreated = created; } WsbTraceOut(OLESTR("CFsaUnmanageDb::Init"), OLESTR("hr = <%ls>, Created = %ls"), WsbHrAsString(hr), WsbBoolAsString(created)); return(hr); } HRESULT CFsaUnmanageDb::Load( IN IStream* pStream ) /*++ Implements: IPersistStream::Load(). Note: This database is not expected to be persistent by the using class. However, the base class CWsbDb is persistable so we need to implement this --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageDb::Load"),OLESTR("")); hr = CWsbDb::Load(pStream); if (S_OK != hr && STG_E_FILENOTFOUND != hr) { // Got some error; delete the DB (we'll recreate it later if // we need it WsbTrace(OLESTR("CFsaUnmanageDb::Load: deleting DB\n")); if (S_OK == Delete(NULL, IDB_DELETE_FLAG_NO_ERROR)) { hr = STG_E_FILENOTFOUND; } } WsbTraceOut(OLESTR("CFsaUnmanageDb::Load"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageDb::Save( IN IStream* pStream, IN BOOL clearDirty ) /*++ Implements: IPersistStream::Save(). Note: This database is not expected to be persistent by the using class. However, the base class CWsbDb is persistable so we need to implement this --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageDb::Save"),OLESTR("")); try { WsbAffirmHr(CWsbDb::Save(pStream, clearDirty)); } WsbCatch(hr); WsbTraceOut(OLESTR("CFsaUnmanageDb::Save"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageRec::GetMediaId( OUT GUID* pId ) /*++ Implements: IFsaUnmanageRec::GetMediaId --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageRec::GetMediaId"),OLESTR("")); try { WsbAssert(0 != pId, E_POINTER); *pId = m_MediaId; } WsbCatch(hr); WsbTraceOut(OLESTR("CFsaUnmanageRec::GetMediaId"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageRec::GetFileOffset( OUT LONGLONG* pOffset ) /*++ Implements: IFsaUnmanageRec::GetFileOffset --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageRec::GetFileOffset"),OLESTR("")); try { WsbAssert(0 != pOffset, E_POINTER); *pOffset = m_FileOffset; } WsbCatch(hr); WsbTraceOut(OLESTR("CFsaUnmanageRec::GetFileOffset"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageRec::GetFileId( OUT LONGLONG* pFileId ) /*++ Implements: IFsaUnmanageRec::GetFileId --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageRec::GetFileId"),OLESTR("")); try { WsbAssert(0 != pFileId, E_POINTER); *pFileId = m_FileId; } WsbCatch(hr); WsbTraceOut(OLESTR("CFsaUnmanageRec::GetFileId"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageRec::SetMediaId( IN GUID id ) /*++ Implements: IFsaUnmanageRec::SetMediaId --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageRec::SetMediaId"),OLESTR("")); m_MediaId = id; WsbTraceOut(OLESTR("CFsaUnmanageRec::SetMediaId"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageRec::SetFileOffset( IN LONGLONG offset ) /*++ Implements: IFsaUnmanageRec::SetFileOffset --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageRec::SetFileOffset"),OLESTR("")); m_FileOffset = offset; WsbTraceOut(OLESTR("CFsaUnmanageRec::SetFileOffset"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageRec::SetFileId( IN LONGLONG FileId ) /*++ Implements: IFsaUnmanageRec::SetFileId --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageRec::SetFileId"),OLESTR("")); m_FileId = FileId; WsbTraceOut(OLESTR("CFsaUnmanageRec::SetFileId"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageRec::FinalConstruct( void ) /*++ Implements: CComObjectRoot::FinalConstruct(). --*/ { HRESULT hr = S_OK; try { WsbAssertHr(CWsbDbEntity::FinalConstruct()); m_MediaId = GUID_NULL; m_FileOffset = 0; m_FileId = 0; } WsbCatch(hr); iCountUnmRec++; return(hr); } HRESULT CFsaUnmanageRec::FinalRelease( void ) /*++ Implements: CComObjectRoot::FinalRelease --*/ { HRESULT hr = S_OK; CWsbDbEntity::FinalRelease(); iCountUnmRec--; return(hr); } HRESULT CFsaUnmanageRec::GetClassID ( OUT LPCLSID pclsid ) /*++ Implements: IPerist::GetClassID --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageRec::GetClassID"), OLESTR("")); try { WsbAssert(0 != pclsid, E_POINTER); *pclsid = CLSID_CFsaUnmanageRec; } WsbCatch(hr); WsbTraceOut(OLESTR("CFsaUnmanageRec::GetClassID"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageRec::GetSizeMax ( OUT ULARGE_INTEGER* pcbSize ) /*++ Implements: IPersistStream::GetSizeMax(). --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageRec::GetSizeMax"), OLESTR("")); try { WsbAssert(0 != pcbSize, E_POINTER); pcbSize->QuadPart = WsbPersistSizeOf(GUID) + WsbPersistSizeOf(LONGLONG) + WsbPersistSizeOf(LONGLONG); } WsbCatch(hr); WsbTraceOut(OLESTR("CFsaUnmanageRec::GetSizeMax"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageRec::Load ( IN IStream* pStream ) /*++ Implements: IPersistStream::Load --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageRec::Load"), OLESTR("")); try { WsbAssert(0 != pStream, E_POINTER); WsbAssertHr(WsbLoadFromStream(pStream, &m_MediaId)); WsbAssertHr(WsbLoadFromStream(pStream, &m_FileOffset)); WsbAssertHr(WsbLoadFromStream(pStream, &m_FileId)); } WsbCatch(hr); WsbTraceOut(OLESTR("CFsaUnmanageRec::Load"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageRec::Print ( IN IStream* pStream ) /*++ Implements: IWsbDbEntity::Print --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageRec::Print"), OLESTR("")); try { WsbAssert(0 != pStream, E_POINTER); WsbAffirmHr(WsbPrintfToStream(pStream, OLESTR(" MediaId = %ls"), WsbGuidAsString(m_MediaId))); WsbAffirmHr(WsbPrintfToStream(pStream, OLESTR(", FileOffset = %ls"), WsbLonglongAsString(m_FileOffset))); WsbAffirmHr(WsbPrintfToStream(pStream, OLESTR(", FileId = %ls"), WsbLonglongAsString(m_FileId))); WsbAffirmHr(CWsbDbEntity::Print(pStream)); } WsbCatch(hr); WsbTraceOut(OLESTR("CFsaUnmanageRec::Print"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageRec::Save ( IN IStream* pStream, IN BOOL clearDirty ) /*++ Implements: IPersistStream::Save --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CFsaUnmanageRec::Save"), OLESTR("clearDirty = <%ls>"), WsbBoolAsString(clearDirty)); try { WsbAssert(0 != pStream, E_POINTER); WsbAssertHr(WsbSaveToStream(pStream, m_MediaId)); WsbAssertHr(WsbSaveToStream(pStream, m_FileOffset)); WsbAssertHr(WsbSaveToStream(pStream, m_FileId)); if (clearDirty) { m_isDirty = FALSE; } } WsbCatch(hr); WsbTraceOut(OLESTR("CFsaUnmanageRec::Save"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CFsaUnmanageRec::UpdateKey( IWsbDbKey *pKey ) /*++ Implements: IWsbDbEntity::UpdateKey --*/ { HRESULT hr = S_OK; try { WsbAffirmHr(pKey->SetToGuid(m_MediaId)); WsbAffirmHr(pKey->AppendLonglong(m_FileOffset)); } WsbCatch(hr); return(hr); }