1 #include "binary_reader.hpp"
7 using gpulog::logrecord;
9 const int MAX_RECORD_SIZE = 4096;
10 const int BUFFER_SIZE = 128*1024*1024;
11 const int PAGESIZE = 4096;
17 binary_reader::binary_reader(istream& input)
20 buffer_end = current = buffer_begin =
new char[BUFFER_SIZE];
23 ptrdiff_t binary_reader::tellg(){
24 return _input.tellg() - (buffer_end - current);
27 void binary_reader::seek(ptrdiff_t absolute_position){
28 ptrdiff_t page_offset = ((absolute_position + PAGESIZE-1)/PAGESIZE)*PAGESIZE;
29 ptrdiff_t mode_offset = absolute_position - page_offset;
31 _input.seekg( page_offset, ios_base::beg );
33 readChunk( mode_offset );
36 void binary_reader::readChunk(ptrdiff_t current_offset){
38 _input.read(buffer_begin,BUFFER_SIZE);
39 buffer_end = buffer_begin + _input.gcount();
42 current = buffer_begin + current_offset;
48 void binary_reader::readNextChunk(){
50 ptrdiff_t back_offset = buffer_end - current;
51 ptrdiff_t page_offset = ((back_offset + PAGESIZE-1)/PAGESIZE)*PAGESIZE;
52 if(page_offset > 0) _input.seekg( -page_offset , ios_base::cur);
54 readChunk(page_offset - back_offset);
58 bool binary_reader::ensure(
const size_t& len){
59 if(current + len < buffer_end){
61 }
else if(!_input.eof()){
69 char* binary_reader::readBytes(
const size_t& len){
80 swarm_header defh(query::UNSORTED_HEADER_FULL);
84 swarm_header* curh =
reinterpret_cast<swarm_header*
>(readBytes(
sizeof(swarm_header)));
86 return _input.good() && curh && defh.is_compatible(*curh);
91 logrecord binary_reader::next() {
93 const static int LOH =
sizeof(int)*2;
95 if(!ensure(LOH))
return logrecord((
char*)&hend);
99 if(l.len() > MAX_RECORD_SIZE) {
100 std::cerr <<
"Trying to read very large error, probably wrong data: " << l.len() << std::endl;
101 throw std::runtime_error(
"Record is too large");
105 logrecord ll(readBytes(l.len()));