1 #ifndef OSMIUM_IO_BZIP2_COMPRESSION_HPP 2 #define OSMIUM_IO_BZIP2_COMPRESSION_HPP 46 #include <osmium/io/detail/read_write.hpp> 59 #include <system_error> 88 OSMIUM_NORETURN inline void throw_bzip2_error(BZFILE* bzfile,
const char* msg,
int bzlib_error = 0) {
89 std::string error{
"bzip2 error: "};
92 int errnum = bzlib_error;
94 error += std::to_string(bzlib_error);
96 error += ::BZ2_bzerror(bzfile, &errnum);
113 m_file(fdopen(::dup(fd),
"wb")),
135 void write(
const std::string& data)
final {
137 assert(data.size() < std::numeric_limits<int>::max());
138 ::BZ2_bzWrite(&error,
m_bzfile, const_cast<char*>(data.data()), static_cast<int>(data.size()));
139 if (error != BZ_OK && error != BZ_STREAM_END) {
140 detail::throw_bzip2_error(
m_bzfile,
"write failed", error);
147 ::BZ2_bzWriteClose(&error,
m_bzfile, 0,
nullptr,
nullptr);
151 osmium::io::detail::reliable_fsync(::fileno(
m_file));
153 if (fclose(
m_file) != 0) {
154 throw std::system_error{errno, std::system_category(),
"Close failed"};
157 if (error != BZ_OK) {
158 detail::throw_bzip2_error(
m_bzfile,
"write close failed", error);
175 m_file(fdopen(::dup(fd),
"rb")),
202 assert(buffer.size() < std::numeric_limits<int>::max());
203 const int nread = ::BZ2_bzRead(&error,
m_bzfile, const_cast<char*>(buffer.data()), static_cast<int>(buffer.size()));
204 if (error != BZ_OK && error != BZ_STREAM_END) {
205 detail::throw_bzip2_error(
m_bzfile,
"read failed", error);
207 if (error == BZ_STREAM_END) {
211 ::BZ2_bzReadGetUnused(&error,
m_bzfile, &unused, &nunused);
212 if (error != BZ_OK) {
213 detail::throw_bzip2_error(
m_bzfile,
"get unused failed", error);
215 std::string unused_data(static_cast<const char*>(unused), static_cast<std::string::size_type>(nunused));
216 ::BZ2_bzReadClose(&error,
m_bzfile);
217 if (error != BZ_OK) {
218 detail::throw_bzip2_error(
m_bzfile,
"read close failed", error);
220 assert(unused_data.size() < std::numeric_limits<int>::max());
221 m_bzfile = ::BZ2_bzReadOpen(&error,
m_file, 0, 0, const_cast<void*>(static_cast<const void*>(unused_data.data())),
static_cast<int>(unused_data.size()));
222 if (error != BZ_OK) {
223 detail::throw_bzip2_error(
m_bzfile,
"read open failed", error);
229 buffer.resize(static_cast<std::string::size_type>(nread));
240 ::BZ2_bzReadClose(&error,
m_bzfile);
243 if (fclose(
m_file) != 0) {
244 throw std::system_error{errno, std::system_category(),
"Close failed"};
247 if (error != BZ_OK) {
248 detail::throw_bzip2_error(
m_bzfile,
"read close failed", error);
267 m_bzstream.next_in =
const_cast<char*
>(buffer);
268 assert(size < std::numeric_limits<unsigned int>::max());
269 m_bzstream.avail_in =
static_cast<unsigned int>(size);
270 const int result = BZ2_bzDecompressInit(&
m_bzstream, 0, 0);
271 if (result != BZ_OK) {
272 std::string message{
"bzip2 error: decompression init failed: "};
295 const size_t buffer_size = 10240;
296 output.resize(buffer_size);
297 m_bzstream.next_out =
const_cast<char*
>(output.data());
299 const int result = BZ2_bzDecompress(&
m_bzstream);
301 if (result != BZ_OK) {
306 if (result != BZ_OK && result != BZ_STREAM_END) {
307 std::string message{
"bzip2 error: decompress failed: "};
311 output.resize(static_cast<std::size_t>(
m_bzstream.next_out - output.data()));
334 inline bool get_registered_bzip2_compression() noexcept {
335 return registered_bzip2_compression;
344 #endif // OSMIUM_IO_BZIP2_COMPRESSION_HPP bz_stream m_bzstream
Definition: bzip2_compression.hpp:259
Definition: bzip2_compression.hpp:165
int bzip2_error_code
Definition: bzip2_compression.hpp:73
Bzip2Compressor(int fd, fsync sync)
Definition: bzip2_compression.hpp:111
void set_offset(std::size_t offset) noexcept
Definition: compression.hpp:128
#define OSMIUM_NORETURN
Definition: compatibility.hpp:41
~Bzip2Decompressor() noexcept final
Definition: bzip2_compression.hpp:188
int m_bzerror
Definition: bzip2_compression.hpp:168
void close() final
Definition: bzip2_compression.hpp:317
void write(const std::string &data) final
Definition: bzip2_compression.hpp:135
const char * m_buffer
Definition: bzip2_compression.hpp:257
int m_bzerror
Definition: bzip2_compression.hpp:106
size_t m_buffer_size
Definition: bzip2_compression.hpp:258
bool m_stream_end
Definition: bzip2_compression.hpp:170
static CompressionFactory & instance()
Definition: compression.hpp:184
~Bzip2BufferDecompressor() noexcept final
Definition: bzip2_compression.hpp:283
Bzip2BufferDecompressor & operator=(const Bzip2BufferDecompressor &)=delete
static constexpr unsigned int input_buffer_size
Definition: compression.hpp:100
bzip2_error(const std::string &what, int error_code)
Definition: bzip2_compression.hpp:76
std::string read() final
Definition: bzip2_compression.hpp:196
Definition: bzip2_compression.hpp:103
int system_errno
Definition: bzip2_compression.hpp:74
Definition: compression.hpp:93
FILE * m_file
Definition: bzip2_compression.hpp:105
Definition: bzip2_compression.hpp:255
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
Bzip2BufferDecompressor(const char *buffer, size_t size)
Definition: bzip2_compression.hpp:263
fsync
Definition: writer_options.hpp:51
bool do_fsync() const
Definition: compression.hpp:69
BZFILE * m_bzfile
Definition: bzip2_compression.hpp:169
BZFILE * m_bzfile
Definition: bzip2_compression.hpp:107
Bzip2Decompressor & operator=(const Bzip2Decompressor &)=delete
void close() final
Definition: bzip2_compression.hpp:144
void close() final
Definition: bzip2_compression.hpp:237
std::string read() final
Definition: bzip2_compression.hpp:291
Definition: compression.hpp:63
FILE * m_file
Definition: bzip2_compression.hpp:167
bool register_compression(osmium::io::file_compression compression, create_compressor_type create_compressor, create_decompressor_type_fd create_decompressor_fd, create_decompressor_type_buffer create_decompressor_buffer)
Definition: compression.hpp:189
Bzip2Decompressor(int fd)
Definition: bzip2_compression.hpp:174
Bzip2Compressor & operator=(const Bzip2Compressor &)=delete
~Bzip2Compressor() noexcept final
Definition: bzip2_compression.hpp:127
Definition: bzip2_compression.hpp:71