Example #1
0
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;
}
Example #2
0
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";
}
Example #3
0
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";
}
Example #4
0
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;
}
Example #5
0
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;
        }
    }
}
Example #6
0
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);
}