00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <zlib.h>
00015 #include <string>
00016 #include "base/logging.h"
00017 #include "base/recordio.h"
00018 #include "base/scoped_ptr.h"
00019
00020 namespace operations_research {
00021 const int RecordWriter::kMagicNumber = 0x3ed7230a;
00022
00023 RecordWriter::RecordWriter(File* const file)
00024 : file_(file), use_compression_(true) {}
00025
00026 bool RecordWriter::Close() {
00027 return file_->Close();
00028 }
00029
00030 void RecordWriter::set_use_compression(bool use_compression) {
00031 use_compression_ = use_compression;
00032 }
00033
00034 std::string RecordWriter::Compress(std::string const& s) const {
00035 const unsigned long source_size = s.size();
00036 const char * source = s.c_str();
00037
00038 unsigned long dsize = source_size + (source_size * 0.1f) + 16;
00039 scoped_ptr<char> destination(new char[dsize]);
00040
00041 const int result =
00042 compress(reinterpret_cast<unsigned char *>(destination.get()), &dsize,
00043 reinterpret_cast<const unsigned char *>(source), source_size);
00044
00045 if (result != Z_OK) {
00046 LOG(FATAL) << "Compress error occured! Error code: " << result;
00047 }
00048 return std::string(destination.get(), dsize);
00049 }
00050
00051 RecordReader::RecordReader(File* const file) : file_(file) {}
00052
00053 bool RecordReader::Close() {
00054 return file_->Close();
00055 }
00056
00057 void RecordReader::Uncompress(const char* const source,
00058 uint64 source_size,
00059 char* const output_buffer,
00060 uint64 output_size) const {
00061 unsigned long result_size = output_size;
00062
00063 const int result =
00064 uncompress(reinterpret_cast<unsigned char *>(output_buffer), &result_size,
00065 reinterpret_cast<const unsigned char *>(source), source_size);
00066 if (result != Z_OK) {
00067 LOG(FATAL) << "Uncompress error occured! Error code: " << result;
00068 }
00069 CHECK_LE(result_size, static_cast<unsigned long>(output_size));
00070 }
00071 }