//***************************************************************************** // Determine what the size of the saved data will be. //***************************************************************************** HRESULT CLiteWeightStgdbRW::GetSaveSize(// S_OK or error. CorSaveSize fSave, // Quick or accurate? ULONG *pulSaveSize) // Put the size here. { HRESULT hr = S_OK; // A result. ULONG cbTotal = 0; // The total size. ULONG cbSize = 0; // Size of a component. m_cbSaveSize = 0; // Allocate stream list if not already done. if (!m_pStreamList) IfNullGo(m_pStreamList = new STORAGESTREAMLST); else m_pStreamList->Clear(); // Query the MiniMd for its size. IfFailGo(GetTablesSaveSize(fSave, &cbSize)); cbTotal += cbSize; // Get the pools' sizes. IfFailGo(GetPoolSaveSize(STRING_POOL_STREAM, MDPoolStrings, &cbSize)); cbTotal += cbSize; IfFailGo(GetPoolSaveSize(US_BLOB_POOL_STREAM, MDPoolUSBlobs, &cbSize)); cbTotal += cbSize; IfFailGo(GetPoolSaveSize(GUID_POOL_STREAM, MDPoolGuids, &cbSize)); cbTotal += cbSize; IfFailGo(GetPoolSaveSize(BLOB_POOL_STREAM, MDPoolBlobs, &cbSize)); cbTotal += cbSize; // Finally, ask the storage system to add fixed overhead it needs for the // file format. The overhead of each stream has already be calculated as // part of GetStreamSaveSize. What's left is the signature and header // fixed size overhead. IfFailGo(TiggerStorage::GetStorageSaveSize(&cbTotal, 0)); // Log the size info. LOG((LF_METADATA, LL_INFO10, "Metadata: GetSaveSize total is %d.\n", cbTotal)); // The list of streams that will be saved are now in the stream save list. // Next step is to walk that list and fill out the correct offsets. This is // done here so that the data can be streamed without fixing up the header. TiggerStorage::CalcOffsets(m_pStreamList, 0); if (pulSaveSize) *pulSaveSize = cbTotal; m_cbSaveSize = cbTotal; ErrExit: return hr; } // HRESULT CLiteWeightStgdbRW::GetSaveSize()
//***************************************************************************** // Determine what the size of the saved data will be. //***************************************************************************** __checkReturn HRESULT CLiteWeightStgdbRW::GetSaveSize(// S_OK or error. CorSaveSize fSave, // Quick or accurate? UINT32 *pcbSaveSize, // Put the size here. MetaDataReorderingOptions reorderingOptions, CorProfileData *pProfileData) // Profile data for working set optimization { HRESULT hr = S_OK; // A result. UINT32 cbTotal = 0; // The total size. UINT32 cbSize = 0; // Size of a component. m_cbSaveSize = 0; // Allocate stream list if not already done. if (m_pStreamList == NULL) { IfNullGo(m_pStreamList = new (nothrow) STORAGESTREAMLST); } else { m_pStreamList->Clear(); } // Make sure the user string pool is not empty. An empty user string pool causes // problems with edit and continue if (m_MiniMd.m_UserStringHeap.GetUnalignedSize() <= 1) { if (!IsENCDelta(m_MiniMd.m_OptionValue.m_UpdateMode) && !m_MiniMd.IsMinimalDelta()) { BYTE rgData[] = {' ', 0, 0}; UINT32 nIndex_Ignore; IfFailGo(m_MiniMd.PutUserString( MetaData::DataBlob(rgData, sizeof(rgData)), &nIndex_Ignore)); } } // If we're saving a delta metadata, figure out how much space it will take to // save the minimal metadata stream (used only to identify that we have a delta // metadata... nothing should be in that stream. if ((m_MiniMd.m_OptionValue.m_UpdateMode & MDUpdateMask) == MDUpdateDelta) { IfFailGo(AddStreamToList(0, MINIMAL_MD_STREAM)); // Ask the storage system to add stream fixed overhead. IfFailGo(TiggerStorage::GetStreamSaveSize(MINIMAL_MD_STREAM, 0, &cbSize)); cbTotal += cbSize; } if (reorderingOptions & ReArrangeStringPool) { if (pProfileData != NULL) { UINT32 cbHotSize = 0; // Size of pool data. UINT32 cbStream; // Size of just the stream. DWORD bCompressed; // Will the stream be compressed data? // Ask the metadata to size its hot data. IfFailGo(m_MiniMd.GetSaveSize(fSave, &cbHotSize, &bCompressed, reorderingOptions, pProfileData)); cbStream = cbHotSize; m_bSaveCompressed = bCompressed; if (cbHotSize != 0) { // Add this item to the save list. IfFailGo(AddStreamToList(cbHotSize, HOT_MODEL_STREAM)); // Ask the storage system to add stream fixed overhead. IfFailGo(TiggerStorage::GetStreamSaveSize(HOT_MODEL_STREAM, cbHotSize, &cbHotSize)); // Log the size info. LOG((LF_METADATA, LL_INFO10, "Metadata: GetSaveSize for %ls: %d data, %d total.\n", HOT_MODEL_STREAM, cbStream, cbHotSize)); cbTotal += cbHotSize; } } // get string pool save size IfFailGo(GetPoolSaveSize(STRING_POOL_STREAM, MDPoolStrings, &cbSize)); cbTotal += cbSize; } // Query the MiniMd for its size. IfFailGo(GetTablesSaveSize(fSave, &cbSize, reorderingOptions, pProfileData)); cbTotal += cbSize; // Get the pools' sizes. if( !(reorderingOptions & ReArrangeStringPool) ) { IfFailGo(GetPoolSaveSize(STRING_POOL_STREAM, MDPoolStrings, &cbSize)); cbTotal += cbSize; } IfFailGo(GetPoolSaveSize(US_BLOB_POOL_STREAM, MDPoolUSBlobs, &cbSize)); cbTotal += cbSize; IfFailGo(GetPoolSaveSize(GUID_POOL_STREAM, MDPoolGuids, &cbSize)); cbTotal += cbSize; IfFailGo(GetPoolSaveSize(BLOB_POOL_STREAM, MDPoolBlobs, &cbSize)); cbTotal += cbSize; // Finally, ask the storage system to add fixed overhead it needs for the // file format. The overhead of each stream has already be calculated as // part of GetStreamSaveSize. What's left is the signature and header // fixed size overhead. IfFailGo(TiggerStorage::GetStorageSaveSize((ULONG *)&cbTotal, 0, m_MiniMd.m_OptionValue.m_RuntimeVersion)); // Log the size info. LOG((LF_METADATA, LL_INFO10, "Metadata: GetSaveSize total is %d.\n", cbTotal)); // The list of streams that will be saved are now in the stream save list. // Next step is to walk that list and fill out the correct offsets. This is // done here so that the data can be streamed without fixing up the header. TiggerStorage::CalcOffsets(m_pStreamList, 0, m_MiniMd.m_OptionValue.m_RuntimeVersion); if (pcbSaveSize != NULL) { *pcbSaveSize = cbTotal; } // Don't cache the value for the EnC case if (!IsENCDelta(m_MiniMd.m_OptionValue.m_UpdateMode)) m_cbSaveSize = cbTotal; ErrExit: return hr; } // CLiteWeightStgdbRW::GetSaveSize
//***************************************************************************** // Determine what the size of the saved data will be. //***************************************************************************** HRESULT CLiteWeightStgdbRW::GetSaveSize(// S_OK or error. CorSaveSize fSave, // Quick or accurate? ULONG *pulSaveSize, // Put the size here. CorProfileData *profileData) // Profile data for working set optimization { HRESULT hr = S_OK; // A result. ULONG cbTotal = 0; // The total size. ULONG cbSize = 0; // Size of a component. m_cbSaveSize = 0; // Allocate stream list if not already done. if (!m_pStreamList) IfNullGo(m_pStreamList = new (nothrow) STORAGESTREAMLST); else m_pStreamList->Clear(); // Make sure the user string pool is not empty. An empty user string pool causes // problems with edit and continue if(m_MiniMd.m_USBlobs.IsEmpty()) { if(!(IsENCDelta(m_MiniMd.m_OptionValue.m_UpdateMode)||m_MiniMd.IsMinimalDelta())) { BYTE pbData[] = {' ', 0, 0}; ULONG ulOffset; m_MiniMd.PutUserString(pbData,sizeof(pbData),&ulOffset); } } // If we're saving a delta metadata, figure out how much space it will take to // save the minimal metadata stream (used only to identify that we have a delta // metadata... nothing should be in that stream. if ((m_MiniMd.m_OptionValue.m_UpdateMode & MDUpdateMask) == MDUpdateDelta) { IfFailGo(AddStreamToList(0, MINIMAL_MD_STREAM)); // Ask the storage system to add stream fixed overhead. IfFailGo(TiggerStorage::GetStreamSaveSize(MINIMAL_MD_STREAM, 0, &cbSize)); cbTotal += cbSize; } // Query the MiniMd for its size. IfFailGo(GetTablesSaveSize(fSave, &cbSize, profileData)); cbTotal += cbSize; // Get the pools' sizes. IfFailGo(GetPoolSaveSize(STRING_POOL_STREAM, MDPoolStrings, &cbSize)); cbTotal += cbSize; IfFailGo(GetPoolSaveSize(US_BLOB_POOL_STREAM, MDPoolUSBlobs, &cbSize)); cbTotal += cbSize; IfFailGo(GetPoolSaveSize(GUID_POOL_STREAM, MDPoolGuids, &cbSize)); cbTotal += cbSize; IfFailGo(GetPoolSaveSize(BLOB_POOL_STREAM, MDPoolBlobs, &cbSize)); cbTotal += cbSize; // Finally, ask the storage system to add fixed overhead it needs for the // file format. The overhead of each stream has already be calculated as // part of GetStreamSaveSize. What's left is the signature and header // fixed size overhead. IfFailGo(TiggerStorage::GetStorageSaveSize(&cbTotal, 0, m_MiniMd.m_OptionValue.m_RuntimeVersion)); // Log the size info. LOG((LF_METADATA, LL_INFO10, "Metadata: GetSaveSize total is %d.\n", cbTotal)); // The list of streams that will be saved are now in the stream save list. // Next step is to walk that list and fill out the correct offsets. This is // done here so that the data can be streamed without fixing up the header. TiggerStorage::CalcOffsets(m_pStreamList, 0, m_MiniMd.m_OptionValue.m_RuntimeVersion); if (pulSaveSize) *pulSaveSize = cbTotal; // Don't cache the value for the EnC case if (!IsENCDelta(m_MiniMd.m_OptionValue.m_UpdateMode)) m_cbSaveSize = cbTotal; ErrExit: return hr; } // HRESULT CLiteWeightStgdbRW::GetSaveSize()