diff --git a/coding/file_container.cpp b/coding/file_container.cpp index 718afb2c90..2333047d25 100644 --- a/coding/file_container.cpp +++ b/coding/file_container.cpp @@ -177,9 +177,8 @@ FileWriter FilesContainerW::GetWriter(Tag const & tag) uint64_t const curr = m_info.back().m_offset + m_info.back().m_size; m_info.push_back(Info(tag, curr)); - FileWriter writer(m_name, FileWriter::OP_WRITE_EXISTING); + FileWriter writer(m_name, FileWriter::OP_WRITE_EXISTING, true); writer.Seek(curr); - writer.Truncate(curr); return writer; } else diff --git a/coding/file_writer.cpp b/coding/file_writer.cpp index 5194eb9b5c..10388d7c9b 100644 --- a/coding/file_writer.cpp +++ b/coding/file_writer.cpp @@ -4,20 +4,26 @@ #include "../../base/start_mem_debug.hpp" -FileWriter::FileWriter(FileWriter const & rhs) : Writer(*this) +FileWriter::FileWriter(FileWriter const & rhs) +: Writer(*this), m_bTruncOnClose(rhs.m_bTruncOnClose) { m_pFileData.swap(const_cast(rhs).m_pFileData); } -FileWriter::FileWriter(string const & fileName, FileWriter::Op op) - : m_pFileData(new fdata_t(fileName, static_cast(op))) +FileWriter::FileWriter(string const & fileName, FileWriter::Op op, bool bTruncOnClose) +: m_pFileData(new fdata_t(fileName, static_cast(op))), m_bTruncOnClose(bTruncOnClose) { } FileWriter::~FileWriter() { if (m_pFileData) + { Flush(); + + if (m_bTruncOnClose) + m_pFileData->Truncate(Pos()); + } } int64_t FileWriter::Pos() const @@ -51,11 +57,6 @@ void FileWriter::Flush() m_pFileData->Flush(); } -void FileWriter::Truncate(uint64_t sz) -{ - m_pFileData->Truncate(sz); -} - void FileWriter::DeleteFileX(string const & fName) { my::DeleteFileX(fName); diff --git a/coding/file_writer.hpp b/coding/file_writer.hpp index b5ef6a1c18..a468caa049 100644 --- a/coding/file_writer.hpp +++ b/coding/file_writer.hpp @@ -27,7 +27,8 @@ public: /// Added for use in FilesContainerW interface. FileWriter(FileWriter const & rhs); - explicit FileWriter(string const & fileName, Op operation = OP_WRITE_TRUNCATE); + explicit FileWriter(string const & fileName, + Op operation = OP_WRITE_TRUNCATE, bool bTruncOnClose = false); ~FileWriter(); void Seek(int64_t pos); @@ -36,7 +37,6 @@ public: uint64_t Size() const; void Flush(); - void Truncate(uint64_t sz); static void DeleteFileX(string const & fName); @@ -45,4 +45,5 @@ public: private: typedef my::FileData fdata_t; scoped_ptr m_pFileData; + bool m_bTruncOnClose; }; diff --git a/indexer/index_builder.cpp b/indexer/index_builder.cpp index 96b8190cae..53c2a597ab 100644 --- a/indexer/index_builder.cpp +++ b/indexer/index_builder.cpp @@ -12,6 +12,11 @@ namespace indexer { try { + // First - open container for writing (it can be reallocated). + FilesContainerW writeCont(datFile, FileWriter::OP_WRITE_EXISTING); + FileWriter writer = writeCont.GetWriter(INDEX_FILE_TAG); + + // Second - open container for reading. FilesContainerR readCont(datFile); feature::DataHeader header; @@ -19,9 +24,6 @@ namespace indexer FeaturesVector featuresVector(readCont, header); - FilesContainerW writeCont(datFile, FileWriter::OP_WRITE_EXISTING); - FileWriter writer = writeCont.GetWriter(INDEX_FILE_TAG); - BuildIndex(header.GetLastScale() + 1, featuresVector, writer, tmpFile); } catch (Reader::Exception const & e) @@ -34,13 +36,6 @@ namespace indexer LOG(LERROR, ("Error writing index file: ", e.what())); } -#ifdef DEBUG - FilesContainerR readCont(datFile); - FilesContainerR::ReaderT r = readCont.GetReader(HEADER_FILE_TAG); - int64_t const base = ReadPrimitiveFromPos(r, 0); - LOG(LINFO, ("OFFSET = ", base)); -#endif - return true; } } // namespace indexer diff --git a/indexer/search_index_builder.cpp b/indexer/search_index_builder.cpp index 346b65ffc0..f0951477f4 100644 --- a/indexer/search_index_builder.cpp +++ b/indexer/search_index_builder.cpp @@ -106,23 +106,22 @@ bool indexer::BuildSearchIndexFromDatFile(string const & datFile) { try { - FilesContainerR readCont(datFile); - - feature::DataHeader header; - header.Load(readCont.GetReader(HEADER_FILE_TAG)); - - FeaturesVector featuresVector(readCont, header); - - FilesContainerW writeCont(datFile, FileWriter::OP_WRITE_EXISTING); - vector serialTrie; + { + FilesContainerR readCont(datFile); + + feature::DataHeader header; + header.Load(readCont.GetReader(HEADER_FILE_TAG)); + + FeaturesVector featuresVector(readCont, header); + MemWriter > writer(serialTrie); BuildSearchIndex(featuresVector, writer); reverse(serialTrie.begin(), serialTrie.end()); } - writeCont.Write(serialTrie, SEARCH_INDEX_FILE_TAG); + FilesContainerW(datFile).Write(serialTrie, SEARCH_INDEX_FILE_TAG); } catch (Reader::Exception const & e) {