Index: src/libchcore/TFileInfoArray.cpp =================================================================== diff -u -N -ra7834ba278464cb62739f22d35f9bc16269706a1 -ra5aa3c3cb78f3767641de2627d1a49a1dc35b429 --- src/libchcore/TFileInfoArray.cpp (.../TFileInfoArray.cpp) (revision a7834ba278464cb62739f22d35f9bc16269706a1) +++ src/libchcore/TFileInfoArray.cpp (.../TFileInfoArray.cpp) (revision a5aa3c3cb78f3767641de2627d1a49a1dc35b429) @@ -25,13 +25,15 @@ #include "TBinarySerializer.h" #include "SerializationHelpers.h" #include "TFileInfo.h" +#include "ISerializerContainer.h" BEGIN_CHCORE_NAMESPACE /////////////////////////////////////////////////////////////////////// // Array TFileInfoArray::TFileInfoArray() : - m_bComplete(false) + m_bComplete(false), + m_stLastObjectID(0) { } @@ -42,6 +44,7 @@ void TFileInfoArray::AddFileInfo(const TFileInfoPtr& spFileInfo) { boost::unique_lock lock(m_lock); + spFileInfo->SetObjectID(++m_stLastObjectID); m_vFiles.push_back(spFileInfo); } @@ -79,6 +82,10 @@ boost::unique_lock lock(m_lock); m_vFiles.clear(); m_bComplete = false; + BOOST_FOREACH(const TFileInfoPtr& spFileInfo, m_vFiles) + { + m_setRemovedObjects.Add(spFileInfo->GetObjectID()); + } } unsigned long long TFileInfoArray::CalculateTotalSize() const @@ -122,4 +129,44 @@ return ullSize; } +void TFileInfoArray::Store(const ISerializerContainerPtr& spContainer) const +{ + boost::shared_lock lock(m_lock); + + // store only if there is a complete collection of items inside + // (this container is used in the directory scanning process. There is no + // point storing only partially scanned data in the serializer as we + // can't use this data after loading serialized data (dir scan will have + // to scan again)). + if(m_bComplete) + { + BOOST_FOREACH(const TFileInfoPtr& spFileInfo, m_vFiles) + { + spFileInfo->Store(spContainer); + } + } +} + +void TFileInfoArray::Load(const ISerializerContainerPtr& spContainer, const TBasePathDataContainerPtr& spBasePaths) +{ + IColumnsDefinitionPtr spColumns = spContainer->GetColumnsDefinition(); + if(spColumns->IsEmpty()) + TFileInfo::InitLoader(spColumns); + + std::vector vEntries; + ISerializerRowReaderPtr spRowReader = spContainer->GetRowReader(); + while(spRowReader->Next()) + { + TFileInfoPtr spFileInfo(new TFileInfo); + spFileInfo->Load(spRowReader, spBasePaths); + + vEntries.push_back(spFileInfo); + + m_stLastObjectID = std::max(m_stLastObjectID, spFileInfo->GetObjectID()); + } + + boost::unique_lock lock(m_lock); + m_vFiles = vEntries; +} + END_CHCORE_NAMESPACE