1 #ifndef OSMIUM_IO_READER_HPP
2 #define OSMIUM_IO_READER_HPP
37 #include <osmium/io/detail/input_format.hpp>
38 #include <osmium/io/detail/queue_util.hpp>
39 #include <osmium/io/detail/read_thread.hpp>
40 #include <osmium/io/detail/read_write.hpp>
56 #include <system_error>
61 # include <sys/wait.h>
74 inline std::size_t get_input_queue_size() noexcept {
78 inline std::size_t get_osmdata_queue_size() noexcept {
155 const detail::ParserFactory::create_parser_type& creator,
156 detail::future_string_queue_type& input_queue,
157 detail::future_buffer_queue_type& osmdata_queue,
158 std::promise<osmium::io::Header>&& header_promise,
162 std::promise<osmium::io::Header> promise{std::move(header_promise)};
163 osmium::io::detail::parser_arguments args = {
172 creator(args)->parse();
187 static int execute(
const std::string& command,
const std::string& filename,
int* childpid) {
189 if (pipe(pipefd) < 0) {
190 throw std::system_error{errno, std::system_category(),
"opening pipe failed"};
192 const pid_t pid = fork();
194 throw std::system_error{errno, std::system_category(),
"fork failed"};
198 for (
int i = 0; i < 32; ++i) {
199 if (i != pipefd[1]) {
203 if (dup2(pipefd[1], 1) < 0) {
207 ::open(
"/dev/null", O_RDONLY);
208 ::open(
"/dev/null", O_WRONLY);
213 if (::execlp(command.c_str(), command.c_str(),
"-g", filename.c_str(),
nullptr) < 0) {
233 const std::string protocol{filename.substr(0, filename.find_first_of(
':'))};
234 if (protocol ==
"http" || protocol ==
"https" || protocol ==
"ftp" || protocol ==
"file") {
236 return execute(
"curl", filename, childpid);
238 throw io_error{
"Reading OSM files from the network currently not supported on Windows."};
241 const int fd = osmium::io::detail::open_for_reading(filename);
245 ::posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL);
293 template <
typename... TArgs>
306 (void)std::initializer_list<int>{
314 std::promise<osmium::io::Header> header_promise;
322 template <
typename... TArgs>
323 explicit Reader(
const std::string& filename, TArgs&&... args) :
327 template <
typename... TArgs>
328 explicit Reader(
const char* filename, TArgs&&... args) :
371 #pragma GCC diagnostic push
372 #pragma GCC diagnostic ignored "-Wold-style-cast"
373 if (pid < 0 || !WIFEXITED(
status) || WEXITSTATUS(
status) != 0) {
374 throw std::system_error{errno, std::system_category(),
"subprocess returned error"};
376 #pragma GCC diagnostic pop
390 throw io_error{
"Can not get header from reader when in status 'error'"};
414 osmium::memory::Buffer
read() {
415 osmium::memory::Buffer buffer;
429 throw io_error{
"Can not read from reader when in status 'closed', 'eof', or 'error'"};
444 if (detail::at_end_of_data(buffer)) {
449 if (buffer.has_nested_buffers()) {
453 if (buffer.committed() > 0) {
508 template <
typename... TArgs>
510 osmium::memory::Buffer buffer{1024 * 1024, osmium::memory::Buffer::auto_grow::yes};
512 Reader reader{std::forward<TArgs>(args)...};
513 while (
auto read_buffer = reader.read()) {
514 buffer.add_buffer(read_buffer);
Definition: compression.hpp:141
bool has_multiple_object_versions() const noexcept
Definition: file.hpp:303
Definition: reader.hpp:90
osmium::memory::Buffer read()
Definition: reader.hpp:414
osmium::io::buffers_type m_buffers_kind
Definition: reader.hpp:130
detail::future_string_queue_type m_input_queue
Definition: reader.hpp:112
osmium::memory::Buffer m_back_buffers
Definition: reader.hpp:95
int m_childpid
Definition: reader.hpp:110
void set_option(osmium::io::read_meta value) noexcept
Definition: reader.hpp:140
detail::future_buffer_queue_type m_osmdata_queue
Definition: reader.hpp:118
std::size_t m_file_size
Definition: reader.hpp:126
Reader & operator=(Reader &&)=delete
void set_option(osmium::thread::Pool &pool) noexcept
Definition: reader.hpp:132
void set_option(osmium::io::buffers_type value) noexcept
Definition: reader.hpp:149
static int execute(const std::string &command, const std::string &filename, int *childpid)
Definition: reader.hpp:187
enum osmium::io::Reader::status m_status
static int open_input_file_or_url(const std::string &filename, int *childpid)
Definition: reader.hpp:232
std::unique_ptr< osmium::io::Decompressor > m_decompressor
Definition: reader.hpp:114
status
Definition: reader.hpp:103
static void parser_thread(osmium::thread::Pool &pool, const detail::ParserFactory::create_parser_type &creator, detail::future_string_queue_type &input_queue, detail::future_buffer_queue_type &osmdata_queue, std::promise< osmium::io::Header > &&header_promise, osmium::osm_entity_bits::type read_which_entities, osmium::io::read_meta read_metadata, osmium::io::buffers_type buffers_kind)
Definition: reader.hpp:154
Reader(const char *filename, TArgs &&... args)
Definition: reader.hpp:328
osmium::io::Header m_header
Definition: reader.hpp:122
detail::ParserFactory::create_parser_type m_creator
Definition: reader.hpp:101
Reader & operator=(const Reader &)=delete
osmium::io::Header header()
Definition: reader.hpp:388
detail::queue_wrapper< osmium::memory::Buffer > m_osmdata_queue_wrapper
Definition: reader.hpp:119
Reader(const osmium::io::File &file, TArgs &&... args)
Definition: reader.hpp:294
std::size_t file_size() const noexcept
Definition: reader.hpp:476
void set_option(osmium::osm_entity_bits::type value) noexcept
Definition: reader.hpp:136
std::future< osmium::io::Header > m_header_future
Definition: reader.hpp:121
osmium::io::detail::ReadThreadManager m_read_thread_manager
Definition: reader.hpp:116
bool eof() const
Definition: reader.hpp:468
Reader(const Reader &)=delete
std::size_t offset() const noexcept
Definition: reader.hpp:494
osmium::thread::thread_handler m_thread
Definition: reader.hpp:124
void close()
Definition: reader.hpp:354
~Reader() noexcept
Definition: reader.hpp:338
osmium::io::File m_file
Definition: reader.hpp:97
osmium::osm_entity_bits::type m_read_which_entities
Definition: reader.hpp:128
Reader(const std::string &filename, TArgs &&... args)
Definition: reader.hpp:323
osmium::io::read_meta m_read_metadata
Definition: reader.hpp:129
osmium::thread::Pool * m_pool
Definition: reader.hpp:99
static Pool & default_instance()
Definition: pool.hpp:186
std::size_t get_max_queue_size(const char *queue_name, const std::size_t default_value) noexcept
Definition: config.hpp:83
osmium::memory::Buffer read_file(TArgs &&... args)
Definition: reader.hpp:509
buffers_type
Definition: file_format.hpp:60
read_meta
Definition: file_format.hpp:55
type
Definition: entity_bits.hpp:63
@ all
object or changeset
Definition: entity_bits.hpp:76
@ nothing
Definition: entity_bits.hpp:67
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
Definition: location.hpp:551