From 8d3730c562ebc893931a784927f71d4065da54ec Mon Sep 17 00:00:00 2001 From: vng Date: Tue, 8 May 2012 13:11:13 +0300 Subject: [PATCH] Add "delete_section" to generator_tool. --- coding/file_container.cpp | 53 ++++++++++----------- coding/file_container.hpp | 4 ++ generator/generator_tool/generator_tool.cpp | 6 ++- generator/unpack_mwm.cpp | 26 ++++++---- generator/unpack_mwm.hpp | 4 ++ 5 files changed, 53 insertions(+), 40 deletions(-) diff --git a/coding/file_container.cpp b/coding/file_container.cpp index 623b83cf5d..a14e493730 100644 --- a/coding/file_container.cpp +++ b/coding/file_container.cpp @@ -137,6 +137,28 @@ uint64_t FilesContainerW::SaveCurrentSize() return curr; } +void FilesContainerW::DeleteSection(Tag const & tag) +{ + { + // rewrite files on disk + FilesContainerR contR(m_name); + FilesContainerW contW(m_name + ".tmp"); + + for (size_t i = 0; i < m_info.size(); ++i) + { + if (m_info[i].m_tag != tag) + contW.Write(contR.GetReader(m_info[i].m_tag), m_info[i].m_tag); + } + } + + // swap files + if (!my::DeleteFileX(m_name) || !my::RenameFileX(m_name + ".tmp", m_name)) + MYTHROW(RootException, ("Can't rename file", m_name, "Sharing violation or disk error!")); + + // do open to update m_info + Open(FileWriter::OP_WRITE_EXISTING); +} + FileWriter FilesContainerW::GetWriter(Tag const & tag) { ASSERT(!m_bFinished, ()); @@ -155,22 +177,7 @@ FileWriter FilesContainerW::GetWriter(Tag const & tag) } else { - { - FilesContainerR contR(m_name); - FilesContainerW contW(m_name + ".tmp"); - - for (size_t i = 0; i < m_info.size(); ++i) - { - if (m_info[i].m_tag != it->m_tag) - contW.Write(contR.GetReader(m_info[i].m_tag), m_info[i].m_tag); - } - } - - my::DeleteFileX(m_name); - if (!my::RenameFileX(m_name + ".tmp", m_name)) - MYTHROW(RootException, ("Can't rename file", m_name, "Sharing violation or disk error!")); - - Open(FileWriter::OP_WRITE_EXISTING); + DeleteSection(it->m_tag); } } @@ -201,22 +208,10 @@ void FilesContainerW::Write(string const & fPath, Tag const & tag) void FilesContainerW::Write(ModelReaderPtr reader, Tag const & tag) { - uint64_t const bufferSize = 4*1024; - char buffer[bufferSize]; - ReaderSource src(reader); FileWriter writer = GetWriter(tag); - uint64_t size = reader.Size(); - while (size > 0) - { - size_t const curr = static_cast(min(bufferSize, size)); - - src.Read(&buffer[0], curr); - writer.Write(&buffer[0], curr); - - size -= curr; - } + rw::ReadAndWrite(src, writer, 4*1024); } void FilesContainerW::Write(vector const & buffer, Tag const & tag) diff --git a/coding/file_container.hpp b/coding/file_container.hpp index 7478d1888e..7dd669cdb3 100644 --- a/coding/file_container.hpp +++ b/coding/file_container.hpp @@ -120,6 +120,10 @@ public: void Finish(); + /// Delete section with rewriting file. + /// @precondition Container should be opened with FileWriter::OP_WRITE_EXISTING. + void DeleteSection(Tag const & tag); + private: uint64_t SaveCurrentSize(); diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index 39c26e40aa..d56bf11f93 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -61,7 +61,8 @@ DEFINE_bool(dump_types, false, "If defined, prints all types combinations and th DEFINE_bool(dump_prefixes, false, "If defined, prints statistics on feature name prefixes"); DEFINE_bool(dump_search_tokens, false, "Print statistics on search tokens."); DEFINE_bool(unpack_mwm, false, "Unpack each section of mwm into a separate file with name filePath.sectionName."); -DEFINE_bool(generate_packed_borders, false, "Generate packed file with country polygons"); +DEFINE_bool(generate_packed_borders, false, "Generate packed file with country polygons."); +DEFINE_string(delete_section, "", "Delete specified section (defines.hpp) from container."); string AddSlashIfNeeded(string const & str) { @@ -263,6 +264,9 @@ int main(int argc, char ** argv) if (FLAGS_unpack_mwm) UnpackMwm(datFile); + if (!FLAGS_delete_section.empty()) + DeleteSection(datFile, FLAGS_delete_section); + if (FLAGS_generate_packed_borders) borders::GeneratePackedBorders(path); diff --git a/generator/unpack_mwm.cpp b/generator/unpack_mwm.cpp index 4443e0a4fc..d112de3500 100644 --- a/generator/unpack_mwm.cpp +++ b/generator/unpack_mwm.cpp @@ -1,32 +1,38 @@ #include "unpack_mwm.hpp" + #include "../coding/file_container.hpp" #include "../coding/file_writer.hpp" +#include "../coding/read_write_utils.hpp" + #include "../base/logging.hpp" #include "../base/stl_add.hpp" + #include "../std/algorithm.hpp" #include "../std/vector.hpp" + void UnpackMwm(string const & filePath) { LOG(LINFO, ("Unpacking mwm sections...")); + FilesContainerR container(filePath); vector tags; container.ForEachTag(MakeBackInsertFunctor >(tags)); + for (size_t i = 0; i < tags.size(); ++i) { LOG(LINFO, ("Unpacking", tags[i])); - FilesContainerR::ReaderT reader = container.GetReader(tags[i]); + + ReaderSource reader(container.GetReader(tags[i])); FileWriter writer(filePath + "." + tags[i]); - uint64_t const size = reader.Size(); - uint64_t pos = 0; - while (pos < size) - { - vector buffer(min(static_cast(size - pos), static_cast(1024 * 1024))); - reader.Read(pos, &buffer[0], buffer.size()); - writer.Write(&buffer[0], buffer.size()); - pos += buffer.size(); - } + rw::ReadAndWrite(reader, writer, 1024 * 1024); } + LOG(LINFO, ("Unpacking done.")); } + +void DeleteSection(string const & filePath, string const & tag) +{ + FilesContainerW(filePath, FileWriter::OP_WRITE_EXISTING).DeleteSection(tag); +} diff --git a/generator/unpack_mwm.hpp b/generator/unpack_mwm.hpp index 90d3cae72f..569667a996 100644 --- a/generator/unpack_mwm.hpp +++ b/generator/unpack_mwm.hpp @@ -1,7 +1,11 @@ #pragma once #include "../base/base.hpp" + #include "../std/string.hpp" + // Unpack each section of mwm into a separate file with name filePath.sectionName void UnpackMwm(string const & filePath); + +void DeleteSection(string const & filePath, string const & tag);