Index: src/libchcore/TBasePathData.cpp =================================================================== diff -u -N -r293e52b38d46653068006262172018a0f0d0a31c -ra7834ba278464cb62739f22d35f9bc16269706a1 --- src/libchcore/TBasePathData.cpp (.../TBasePathData.cpp) (revision 293e52b38d46653068006262172018a0f0d0a31c) +++ src/libchcore/TBasePathData.cpp (.../TBasePathData.cpp) (revision a7834ba278464cb62739f22d35f9bc16269706a1) @@ -28,26 +28,41 @@ #include "ErrorCodes.h" #include "TRowData.h" #include "ISerializerRowData.h" +#include +#include "TPathContainer.h" BEGIN_CHCORE_NAMESPACE ////////////////////////////////////////////////////////////////////////////// // TBasePathData TBasePathData::TBasePathData() : + m_stObjectID(0), + m_pathSrc(m_setModifications), m_bSkipFurtherProcessing(m_setModifications, false), m_pathDst(m_setModifications) { m_setModifications[eMod_Added] = true; } TBasePathData::TBasePathData(const TBasePathData& rEntry) : + m_stObjectID(rEntry.m_stObjectID), + m_pathSrc(rEntry.m_pathSrc), m_pathDst(rEntry.m_pathDst), m_bSkipFurtherProcessing(rEntry.m_bSkipFurtherProcessing), m_setModifications(rEntry.m_setModifications) { } +TBasePathData::TBasePathData(size_t stObjectID, const TSmartPath& spSrcPath) : + m_stObjectID(stObjectID), + m_pathSrc(m_setModifications, spSrcPath), + m_bSkipFurtherProcessing(m_setModifications, false), + m_pathDst(m_setModifications) +{ + m_setModifications[eMod_Added] = true; +} + void TBasePathData::SetDestinationPath(const TSmartPath& tPath) { m_pathDst = tPath; @@ -73,22 +88,26 @@ return !m_pathDst.Get().IsEmpty(); } -void TBasePathData::Store(const ISerializerContainerPtr& spContainer, size_t stObjectID) const +void TBasePathData::Store(const ISerializerContainerPtr& spContainer) const { if(!spContainer) THROW_CORE_EXCEPTION(eErr_InvalidPointer); ISerializerRowDataPtr spRow; - bool bAdded = m_setModifications.at(eMod_Added); + bool bAdded = m_setModifications[eMod_Added]; if(bAdded) - spRow = spContainer->AddRow(stObjectID); + spRow = spContainer->AddRow(m_stObjectID); else if(m_setModifications.any()) - spRow = spContainer->GetRow(stObjectID); + spRow = spContainer->GetRow(m_stObjectID); + else + return; - if(bAdded || m_setModifications.at(eMod_SkipProcessing)) + if(bAdded || m_setModifications[eMod_SrcPath]) + *spRow % TRowData(_T("src_path"), m_pathSrc); + if(bAdded || m_setModifications[eMod_SkipProcessing]) *spRow % TRowData(_T("skip_processing"), m_bSkipFurtherProcessing); - if(bAdded || m_setModifications.at(eMod_DstPath)) + if(bAdded || m_setModifications[eMod_DstPath]) *spRow % TRowData(_T("dst_path"), m_pathDst); m_setModifications.reset(); @@ -99,21 +118,43 @@ if(!spColumnDefs) THROW_CORE_EXCEPTION(eErr_InvalidPointer); - *spColumnDefs % _T("id") % _T("skip_processing") % _T("dst_path"); + *spColumnDefs % _T("id") % _T("src_path") % _T("skip_processing") % _T("dst_path"); } -void TBasePathData::Load(const ISerializerRowReaderPtr& spRowReader, size_t& stObjectID) +void TBasePathData::Load(const ISerializerRowReaderPtr& spRowReader) { - spRowReader->GetValue(_T("id"), stObjectID); + spRowReader->GetValue(_T("id"), m_stObjectID); + spRowReader->GetValue(_T("src_path"), m_pathSrc.Modify()); spRowReader->GetValue(_T("skip_processing"), m_bSkipFurtherProcessing.Modify()); spRowReader->GetValue(_T("dst_path"), m_pathDst.Modify()); m_setModifications.reset(); } +TSmartPath TBasePathData::GetSrcPath() const +{ + return m_pathSrc; +} + +void TBasePathData::SetSrcPath(const TSmartPath& pathSrc) +{ + m_pathSrc = pathSrc; +} + +size_t TBasePathData::GetObjectID() const +{ + return m_stObjectID; +} + +void TBasePathData::SetObjectID(size_t stObjectID) +{ + m_stObjectID = stObjectID; +} + ////////////////////////////////////////////////////////////////////////////// // TBasePathDataContainer -TBasePathDataContainer::TBasePathDataContainer() +TBasePathDataContainer::TBasePathDataContainer() : + m_stLastObjectID(0) { } @@ -123,130 +164,110 @@ Clear(); } -bool TBasePathDataContainer::Exists(size_t stObjectID) const +void TBasePathDataContainer::Store(const ISerializerContainerPtr& spContainer) const { + if(!spContainer) + THROW_CORE_EXCEPTION(eErr_InvalidPointer); + boost::shared_lock lock(m_lock); - bool bResult = m_mapEntries.find(stObjectID) != m_mapEntries.end(); - return bResult; + spContainer->DeleteRows(m_setRemovedObjects); + m_setRemovedObjects.Clear(); + + BOOST_FOREACH(const TBasePathDataPtr& spEntry, m_vEntries) + { + spEntry->Store(spContainer); + } } -TBasePathDataPtr TBasePathDataContainer::GetExisting(size_t stObjectID) const +void TBasePathDataContainer::Load(const ISerializerContainerPtr& spContainer) { - boost::shared_lock lock(m_lock); - - MapEntries::const_iterator iter = m_mapEntries.find(stObjectID); - if(iter == m_mapEntries.end()) - THROW_CORE_EXCEPTION(eErr_BoundsExceeded); + if(!spContainer) + THROW_CORE_EXCEPTION(eErr_InvalidPointer); - return iter->second; -} + boost::unique_lock lock(m_lock); + m_setRemovedObjects.Clear(); + m_vEntries.clear(); -chcore::TBasePathDataPtr TBasePathDataContainer::Get(size_t stObjectID) -{ - boost::upgrade_lock lock(m_lock); + ISerializerRowReaderPtr spRowReader = spContainer->GetRowReader(); + IColumnsDefinitionPtr spColumns = spRowReader->GetColumnsDefinitions(); + if(spColumns->IsEmpty()) + TBasePathData::InitLoader(spRowReader->GetColumnsDefinitions()); - MapEntries::iterator iter = m_mapEntries.find(stObjectID); - if(iter == m_mapEntries.end()) + while(spRowReader->Next()) { - boost::upgrade_to_unique_lock upgraded_lock(lock); - iter = m_mapEntries.insert(std::make_pair(stObjectID, TBasePathDataPtr(new TBasePathData))).first; - } + TBasePathDataPtr spPathData(new TBasePathData); - return iter->second; + spPathData->Load(spRowReader); + + m_vEntries.push_back(spPathData); + } } -void TBasePathDataContainer::Remove(size_t stObjectID) +void TBasePathDataContainer::Add(const TBasePathDataPtr& spEntry) { boost::unique_lock lock(m_lock); - m_mapEntries.erase(stObjectID); - m_setRemovedObjects.Add(stObjectID); + spEntry->SetObjectID(++m_stLastObjectID); + m_vEntries.push_back(spEntry); } -void TBasePathDataContainer::Clear() +void TBasePathDataContainer::RemoveAt(size_t stIndex) { boost::unique_lock lock(m_lock); - - BOOST_FOREACH(const MapEntries::value_type& rItem, m_mapEntries) - { - m_setRemovedObjects.Add(rItem.first); - } + if(stIndex >= m_vEntries.size()) + THROW_CORE_EXCEPTION(eErr_BoundsExceeded); - m_mapEntries.clear(); + m_setRemovedObjects.Add(m_vEntries[stIndex]->GetObjectID()); + m_vEntries.erase(m_vEntries.begin() + stIndex); } -bool TBasePathDataContainer::GetSkipFurtherProcessing(size_t stObjectID) const +chcore::TBasePathDataPtr TBasePathDataContainer::GetAt(size_t stIndex) const { boost::shared_lock lock(m_lock); - - MapEntries::const_iterator iter = m_mapEntries.find(stObjectID); - if(iter == m_mapEntries.end()) - return false; - - return iter->second->GetSkipFurtherProcessing(); + return m_vEntries.at(stIndex); } -chcore::TSmartPath TBasePathDataContainer::GetDestinationPath(size_t stObjectID) const +void TBasePathDataContainer::ClearNL() { - boost::shared_lock lock(m_lock); + BOOST_FOREACH(const TBasePathDataPtr& spItem, m_vEntries) + { + m_setRemovedObjects.Add(spItem->GetObjectID()); + } - MapEntries::const_iterator iter = m_mapEntries.find(stObjectID); - if(iter == m_mapEntries.end()) - return TSmartPath(); + m_vEntries.clear(); +} - return iter->second->GetDestinationPath(); +void TBasePathDataContainer::Clear() +{ + boost::unique_lock lock(m_lock); + ClearNL(); } -bool TBasePathDataContainer::IsDestinationPathSet(size_t stObjectID) const +bool TBasePathDataContainer::IsEmpty() const { boost::shared_lock lock(m_lock); - MapEntries::const_iterator iter = m_mapEntries.find(stObjectID); - if(iter == m_mapEntries.end()) - return false; - - return iter->second->IsDestinationPathSet(); + return m_vEntries.empty(); } -void TBasePathDataContainer::Store(const ISerializerContainerPtr& spContainer) const +size_t TBasePathDataContainer::GetCount() const { - if(!spContainer) - THROW_CORE_EXCEPTION(eErr_InvalidPointer); - boost::shared_lock lock(m_lock); - - spContainer->DeleteRows(m_setRemovedObjects); - m_setRemovedObjects.Clear(); - - BOOST_FOREACH(const MapEntries::value_type& rPair, m_mapEntries) - { - rPair.second->Store(spContainer, rPair.first); - } + return m_vEntries.size(); } -void TBasePathDataContainer::Load(const ISerializerContainerPtr& spContainer) +TBasePathDataContainer& TBasePathDataContainer::operator=(const TPathContainer& tPaths) { - if(!spContainer) - THROW_CORE_EXCEPTION(eErr_InvalidPointer); - boost::unique_lock lock(m_lock); - m_setRemovedObjects.Clear(); - m_mapEntries.clear(); + ClearNL(); - ISerializerRowReaderPtr spRowReader = spContainer->GetRowReader(); - IColumnsDefinitionPtr spColumns = spRowReader->GetColumnsDefinitions(); - if(spColumns->IsEmpty()) - TBasePathData::InitLoader(spRowReader->GetColumnsDefinitions()); - - while(spRowReader->Next()) + for(size_t stIndex = 0; stIndex < tPaths.GetCount(); ++stIndex) { - TBasePathDataPtr spPathData(new TBasePathData); - size_t stObjectID = 0; - - spPathData->Load(spRowReader, stObjectID); - - m_mapEntries.insert(std::make_pair(stObjectID, spPathData)); + TBasePathDataPtr spPathData = boost::make_shared(++m_stLastObjectID, tPaths.GetAt(stIndex)); + m_vEntries.push_back(spPathData); } + + return *this; } END_CHCORE_NAMESPACE