bool CommandCat::run() { if (m_input_files.size() == 1) { // single input file m_vout << "Copying input file '" << m_input_files[0].filename() << "'\n"; osmium::io::Reader reader(m_input_files[0], osm_entity_bits()); osmium::io::Header header = reader.header(); setup_header(header); osmium::io::Writer writer(m_output_file, header, m_output_overwrite, m_fsync); while (osmium::memory::Buffer buffer = reader.read()) { writer(std::move(buffer)); } writer.close(); reader.close(); } else { // multiple input files osmium::io::Header header; setup_header(header); osmium::io::Writer writer(m_output_file, header, m_output_overwrite, m_fsync); for (const auto& input_file : m_input_files) { m_vout << "Copying input file '" << input_file.filename() << "'\n"; osmium::io::Reader reader(input_file, osm_entity_bits()); while (osmium::memory::Buffer buffer = reader.read()) { writer(std::move(buffer)); } reader.close(); } writer.close(); } show_memory_used(); m_vout << "Done.\n"; return true; }
void CommandRenumber::show_arguments() { show_single_input_arguments(m_vout); show_output_arguments(m_vout); m_vout << " other options:\n"; m_vout << " index directory: " << m_index_directory << "\n"; m_vout << " object types that will be renumbered and their start IDs:"; if (osm_entity_bits() & osmium::osm_entity_bits::node) { m_vout << " node (" << m_id_map(osmium::item_type::node).start_id() << ')'; } if (osm_entity_bits() & osmium::osm_entity_bits::way) { m_vout << " way (" << m_id_map(osmium::item_type::way).start_id() << ')'; } if (osm_entity_bits() & osmium::osm_entity_bits::relation) { m_vout << " relation (" << m_id_map(osmium::item_type::relation).start_id() << ')'; } m_vout << "\n"; }
void CommandCat::show_arguments() { show_multiple_inputs_arguments(m_vout); show_output_arguments(m_vout); m_vout << " other options:\n"; m_vout << " object types:"; if (osm_entity_bits() & osmium::osm_entity_bits::node) { m_vout << " node"; } if (osm_entity_bits() & osmium::osm_entity_bits::way) { m_vout << " way"; } if (osm_entity_bits() & osmium::osm_entity_bits::relation) { m_vout << " relation"; } if (osm_entity_bits() & osmium::osm_entity_bits::changeset) { m_vout << " changeset"; } m_vout << "\n"; }
bool CommandShow::run() { osmium::io::Reader reader(m_input_file, osm_entity_bits()); osmium::io::Header header = reader.header(); if (m_pager.empty()) { osmium::io::File file("-", m_output_format); osmium::io::Writer writer(file, header); while (osmium::memory::Buffer buffer = reader.read()) { writer(std::move(buffer)); } writer.close(); } else { #ifndef _MSC_VER int fd = execute_pager(m_pager); ::close(1); // close stdout if (::dup2(fd, 1) < 0) { // put end of pipe as stdout throw std::system_error(errno, std::system_category(), "dup2 failed"); } osmium::io::File file("-", m_output_format); osmium::io::Writer writer(file, header); try { while (osmium::memory::Buffer buffer = reader.read()) { writer(std::move(buffer)); } } catch (std::system_error& e) { if (e.code().value() != EPIPE) { throw; } } close(fd); writer.close(); int status = 0; int pid = ::wait(&status); if (pid < 0) { throw std::system_error(errno, std::system_category(), "wait failed"); } if (WIFEXITED(status) && WEXITSTATUS(status) == 1) { throw argument_error(std::string{"Could not execute pager '"} + m_pager + "'"); } #endif } reader.close(); return true; }
void CommandRenumber::renumber(osmium::memory::Buffer& buffer) { for (auto& object : buffer.select<osmium::OSMObject>()) { switch (object.type()) { case osmium::item_type::node: if (osm_entity_bits() & osmium::osm_entity_bits::node) { m_check_order.node(static_cast<const osmium::Node&>(object)); object.set_id(m_id_map(osmium::item_type::node)(object.id())); } break; case osmium::item_type::way: if (osm_entity_bits() & osmium::osm_entity_bits::way) { m_check_order.way(static_cast<const osmium::Way&>(object)); object.set_id(m_id_map(osmium::item_type::way)(object.id())); } if (osm_entity_bits() & osmium::osm_entity_bits::node) { for (auto& ref : static_cast<osmium::Way&>(object).nodes()) { ref.set_ref(m_id_map(osmium::item_type::node)(ref.ref())); } } break; case osmium::item_type::relation: if (osm_entity_bits() & osmium::osm_entity_bits::relation) { m_check_order.relation(static_cast<const osmium::Relation&>(object)); object.set_id(m_id_map(osmium::item_type::relation)(object.id())); } for (auto& member : static_cast<osmium::Relation&>(object).members()) { if (osm_entity_bits() & osmium::osm_entity_bits::from_item_type(member.type())) { member.set_ref(m_id_map(member.type())(member.ref())); } } break; default: break; } } }
void CommandRenumber::write_index(osmium::item_type type) { if (!(osm_entity_bits() & osmium::osm_entity_bits::from_item_type(type))) { return; } const std::string f{filename(osmium::item_type_to_name(type))}; const int fd = ::open(f.c_str(), O_WRONLY | O_CREAT, 0666); // NOLINT(hicpp-signed-bitwise) if (fd < 0) { throw std::runtime_error{std::string{"Could not open file '"} + f + "': " + std::strerror(errno)}; } #ifdef _WIN32 _setmode(fd, _O_BINARY); #endif m_id_map(type).write(fd); close(fd); }