//***************************************************************************** //***************************************************************************** HRESULT CLiteWeightStgdbRW::SaveToStorage( TiggerStorage *pStorage) { HRESULT hr; // A result. LPCWSTR szName; // Name of the tables stream. IStream *pIStreamTbl = 0; ULONG cb; // Must call GetSaveSize to cache the streams up front. if (!m_cbSaveSize) IfFailGo(GetSaveSize(cssAccurate, 0)); // Save the header of the data file. IfFailGo(pStorage->WriteHeader(m_pStreamList, 0, NULL)); // Create a stream and save the tables. szName = m_bSaveCompressed ? COMPRESSED_MODEL_STREAM : ENC_MODEL_STREAM; IfFailGo(pStorage->CreateStream(szName, STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &pIStreamTbl)); IfFailGo(m_MiniMd.SaveTablesToStream(pIStreamTbl)); pIStreamTbl->Release(); pIStreamTbl = 0; // Save the pools. IfFailGo(SavePool(STRING_POOL_STREAM, pStorage, MDPoolStrings)); IfFailGo(SavePool(US_BLOB_POOL_STREAM, pStorage, MDPoolUSBlobs)); IfFailGo(SavePool(GUID_POOL_STREAM, pStorage, MDPoolGuids)); IfFailGo(SavePool(BLOB_POOL_STREAM, pStorage, MDPoolBlobs)); // Write the header to disk. IfFailGo(pStorage->WriteFinished(m_pStreamList, &cb)); _ASSERTE(m_cbSaveSize == cb); // Let the Storage release some memory. pStorage->ResetBackingStore(); m_MiniMd.SaveDone(); ErrExit: if (pIStreamTbl) pIStreamTbl->Release(); delete m_pStreamList; m_pStreamList = 0; m_cbSaveSize = 0; return hr; } // HRESULT CLiteWeightStgdbRW::SaveToStorage()
//***************************************************************************** //***************************************************************************** __checkReturn HRESULT CLiteWeightStgdbRW::SaveToStorage( TiggerStorage *pStorage, MetaDataReorderingOptions reorderingOptions, CorProfileData *pProfileData) { HRESULT hr; // A result. LPCWSTR szName; // Name of the tables stream. IStream *pIStreamTbl = 0; UINT32 cb; UINT32 cbSaveSize = m_cbSaveSize; // Must call GetSaveSize to cache the streams up front. // Don't trust cached values in the delta case... if there was a previous call to get // a non-delta size, it will be incorrect. if ((m_cbSaveSize == 0) || IsENCDelta(m_MiniMd.m_OptionValue.m_UpdateMode)) { IfFailGo(GetSaveSize(cssAccurate, &cbSaveSize)); } // Save the header of the data file. IfFailGo(pStorage->WriteHeader(m_pStreamList, 0, NULL)); // If this is a minimal delta, write a stream marker if (IsENCDelta(m_MiniMd.m_OptionValue.m_UpdateMode)) { IfFailGo(pStorage->CreateStream(MINIMAL_MD_STREAM, STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &pIStreamTbl)); pIStreamTbl->Release(); pIStreamTbl = 0; } if (pProfileData != NULL) { DWORD bCompressed; UINT32 cbHotSize; // Will the stream be compressed data? // Only create this additional stream if it will be non-empty IfFailGo(m_MiniMd.GetSaveSize(cssAccurate, &cbHotSize, &bCompressed, reorderingOptions, pProfileData)); if (cbHotSize > 0) { // Create a stream and save the hot tables. szName = HOT_MODEL_STREAM; IfFailGo(pStorage->CreateStream(szName, STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &pIStreamTbl)); IfFailGo(m_MiniMd.SaveTablesToStream(pIStreamTbl, reorderingOptions, pProfileData)); pIStreamTbl->Release(); pIStreamTbl = 0; } } if (reorderingOptions & ReArrangeStringPool) { // Save the string pool before the tables when we do not have the string pool cache IfFailGo(SavePool(STRING_POOL_STREAM, pStorage, MDPoolStrings)); } // Create a stream and save the tables. szName = m_bSaveCompressed ? COMPRESSED_MODEL_STREAM : ENC_MODEL_STREAM; IfFailGo(pStorage->CreateStream(szName, STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &pIStreamTbl)); IfFailGo(m_MiniMd.SaveTablesToStream(pIStreamTbl, NoReordering, NULL)); pIStreamTbl->Release(); pIStreamTbl = 0; // Save the pools. if (!(reorderingOptions & ReArrangeStringPool)) { // string pool must be saved after the tables when we have the string pool cache IfFailGo(SavePool(STRING_POOL_STREAM, pStorage, MDPoolStrings)); } IfFailGo(SavePool(US_BLOB_POOL_STREAM, pStorage, MDPoolUSBlobs)); IfFailGo(SavePool(GUID_POOL_STREAM, pStorage, MDPoolGuids)); IfFailGo(SavePool(BLOB_POOL_STREAM, pStorage, MDPoolBlobs)); // Write the header to disk. OptionValue ov; IfFailGo(m_MiniMd.GetOption(&ov)); IfFailGo(pStorage->WriteFinished(m_pStreamList, (ULONG *)&cb, IsENCDelta(ov.m_UpdateMode))); _ASSERTE(cbSaveSize == cb); // Let the Storage release some memory. pStorage->ResetBackingStore(); IfFailGo(m_MiniMd.SaveDone()); ErrExit: if (pIStreamTbl != NULL) pIStreamTbl->Release(); delete m_pStreamList; m_pStreamList = 0; m_cbSaveSize = 0; return hr; } // CLiteWeightStgdbRW::SaveToStorage