1 #ifndef OSMIUM_IO_BZIP2_COMPRESSION_HPP 2 #define OSMIUM_IO_BZIP2_COMPRESSION_HPP 77 bzip2_error_code(error_code),
78 system_errno(error_code == BZ_IO_ERROR ? errno : 0) {
87 OSMIUM_NORETURN inline void throw_bzip2_error(BZFILE* bzfile,
const char* msg,
int bzlib_error = 0) {
88 std::string error(
"bzip2 error: ");
91 int errnum = bzlib_error;
93 error += std::to_string(bzlib_error);
95 error += ::BZ2_bzerror(bzfile, &errnum);
112 m_file(fdopen(dup(fd),
"wb")),
114 m_bzfile(::BZ2_bzWriteOpen(&m_bzerror, m_file, 6, 0, 0)) {
116 detail::throw_bzip2_error(m_bzfile,
"write open failed", m_bzerror);
128 void write(
const std::string& data)
final {
130 ::BZ2_bzWrite(&error, m_bzfile, const_cast<char*>(data.data()), static_cast_with_assert<int>(data.size()));
131 if (error != BZ_OK && error != BZ_STREAM_END) {
132 detail::throw_bzip2_error(m_bzfile,
"write failed", error);
139 ::BZ2_bzWriteClose(&error, m_bzfile, 0,
nullptr,
nullptr);
143 osmium::io::detail::reliable_fsync(::fileno(m_file));
145 if (fclose(m_file) != 0) {
146 throw std::system_error(errno, std::system_category(),
"Close failed");
149 if (error != BZ_OK) {
150 detail::throw_bzip2_error(m_bzfile,
"write close failed", error);
162 bool m_stream_end {
false};
168 m_file(fdopen(dup(fd),
"rb")),
170 m_bzfile(::BZ2_bzReadOpen(&m_bzerror, m_file, 0, 0, nullptr, 0)) {
172 detail::throw_bzip2_error(m_bzfile,
"read open failed", m_bzerror);
190 int nread = ::BZ2_bzRead(&error, m_bzfile, const_cast<char*>(buffer.data()), static_cast_with_assert<int>(buffer.size()));
191 if (error != BZ_OK && error != BZ_STREAM_END) {
192 detail::throw_bzip2_error(m_bzfile,
"read failed", error);
194 if (error == BZ_STREAM_END) {
197 if (! feof(m_file)) {
198 ::BZ2_bzReadGetUnused(&error, m_bzfile, &unused, &nunused);
199 if (error != BZ_OK) {
200 detail::throw_bzip2_error(m_bzfile,
"get unused failed", error);
202 std::string unused_data(static_cast<const char*>(unused), static_cast<std::string::size_type>(nunused));
203 ::BZ2_bzReadClose(&error, m_bzfile);
204 if (error != BZ_OK) {
205 detail::throw_bzip2_error(m_bzfile,
"read close failed", error);
207 m_bzfile = ::BZ2_bzReadOpen(&error, m_file, 0, 0, const_cast<void*>(static_cast<const void*>(unused_data.data())), static_cast_with_assert<int>(unused_data.size()));
208 if (error != BZ_OK) {
209 detail::throw_bzip2_error(m_bzfile,
"read open failed", error);
215 buffer.resize(static_cast<std::string::size_type>(nread));
224 ::BZ2_bzReadClose(&error, m_bzfile);
227 if (fclose(m_file) != 0) {
228 throw std::system_error(errno, std::system_category(),
"Close failed");
231 if (error != BZ_OK) {
232 detail::throw_bzip2_error(m_bzfile,
"read close failed", error);
251 m_bzstream.next_in =
const_cast<char*
>(buffer);
252 m_bzstream.avail_in = static_cast_with_assert<unsigned int>(size);
253 int result = BZ2_bzDecompressInit(&m_bzstream, 0, 0);
254 if (result != BZ_OK) {
255 std::string message(
"bzip2 error: decompression init failed: ");
272 const size_t buffer_size = 10240;
273 output.resize(buffer_size);
274 m_bzstream.next_out =
const_cast<char*
>(output.data());
275 m_bzstream.avail_out = buffer_size;
276 int result = BZ2_bzDecompress(&m_bzstream);
278 if (result != BZ_OK) {
283 if (result != BZ_OK && result != BZ_STREAM_END) {
284 std::string message(
"bzip2 error: decompress failed: ");
288 output.resize(static_cast<unsigned long>(m_bzstream.next_out - output.data()));
295 BZ2_bzDecompressEnd(&m_bzstream);
311 inline bool get_registered_bzip2_compression() noexcept {
312 return registered_bzip2_compression;
321 #endif // OSMIUM_IO_BZIP2_COMPRESSION_HPP bz_stream m_bzstream
Definition: bzip2_compression.hpp:243
Definition: bzip2_compression.hpp:157
int bzip2_error_code
Definition: bzip2_compression.hpp:72
Bzip2Compressor(int fd, fsync sync)
Definition: bzip2_compression.hpp:110
#define OSMIUM_NORETURN
Definition: compatibility.hpp:41
int m_bzerror
Definition: bzip2_compression.hpp:160
void close() final
Definition: bzip2_compression.hpp:294
void write(const std::string &data) final
Definition: bzip2_compression.hpp:128
const char * m_buffer
Definition: bzip2_compression.hpp:241
int m_bzerror
Definition: bzip2_compression.hpp:105
size_t m_buffer_size
Definition: bzip2_compression.hpp:242
static CompressionFactory & instance()
Definition: compression.hpp:151
static constexpr unsigned int input_buffer_size
Definition: compression.hpp:91
bzip2_error(const std::string &what, int error_code)
Definition: bzip2_compression.hpp:75
std::string read() final
Definition: bzip2_compression.hpp:184
Definition: bzip2_compression.hpp:102
int system_errno
Definition: bzip2_compression.hpp:73
Definition: compression.hpp:87
FILE * m_file
Definition: bzip2_compression.hpp:104
Definition: bzip2_compression.hpp:239
Namespace for everything in the Osmium library.
Definition: assembler.hpp:59
Bzip2BufferDecompressor(const char *buffer, size_t size)
Definition: bzip2_compression.hpp:247
fsync
Definition: writer_options.hpp:51
BZFILE * m_bzfile
Definition: bzip2_compression.hpp:161
BZFILE * m_bzfile
Definition: bzip2_compression.hpp:106
~Bzip2BufferDecompressor() noexceptfinal
Definition: bzip2_compression.hpp:260
void close() final
Definition: bzip2_compression.hpp:136
void close() final
Definition: bzip2_compression.hpp:221
std::string read() final
Definition: bzip2_compression.hpp:268
Definition: compression.hpp:62
FILE * m_file
Definition: bzip2_compression.hpp:159
~Bzip2Decompressor() noexceptfinal
Definition: bzip2_compression.hpp:176
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:156
Bzip2Decompressor(int fd)
Definition: bzip2_compression.hpp:166
~Bzip2Compressor() noexceptfinal
Definition: bzip2_compression.hpp:120
Definition: bzip2_compression.hpp:70