ProtoStream added
git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1240 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
77
core/util/ProtoStream.cc
Normal file
77
core/util/ProtoStream.cc
Normal file
@ -0,0 +1,77 @@
|
||||
#include "ProtoStream.hpp"
|
||||
|
||||
using namespace std;
|
||||
|
||||
ProtoStream::ProtoStream(ostream* outfile){
|
||||
|
||||
m_write_mode = true;
|
||||
m_outfile = outfile;
|
||||
m_log.setDescription("ProtoStream");
|
||||
m_log.showTime(false);
|
||||
}
|
||||
|
||||
ProtoStream::ProtoStream(istream* infile){
|
||||
|
||||
m_write_mode = false;
|
||||
m_infile = infile;
|
||||
m_log.setDescription("ProtoStream");
|
||||
m_log.showTime(false);
|
||||
}
|
||||
|
||||
bool ProtoStream::writeMessage(google::protobuf::Message* m){
|
||||
|
||||
if(!m_write_mode){
|
||||
m_log << "To attach a message, please call the constructor of the ProtoStream-Object with a Pointer of an ostream." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
m_size = htonl(m->ByteSize());
|
||||
m_outfile->write(reinterpret_cast<char*>(&m_size), sizeof(m_size));
|
||||
|
||||
if(m_outfile->bad()){
|
||||
m_log << "Could not write to file!" << endl;
|
||||
}
|
||||
|
||||
m->SerializeToOstream(m_outfile);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool ProtoStream:: reset(){
|
||||
|
||||
if(m_write_mode){
|
||||
m_log << "To reset, please call the constructor of the ProtoStream-Object with a Pointer of an istream." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
m_infile->seekg(0,ios::beg);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ProtoStream::getNext(google::protobuf::Message* m){
|
||||
|
||||
if(m_write_mode){
|
||||
m_log << "To get a message, please call the constructor of the ProtoStream-Object with a Pointer of an istream." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
m_infile->read(reinterpret_cast<char*>(&m_size), sizeof(m_size));
|
||||
|
||||
if(m_infile->bad()){
|
||||
m_log << "Could not write to file!" << endl;
|
||||
}
|
||||
|
||||
m_size = ntohl(m_size);
|
||||
|
||||
char *buf = new char[m_size];
|
||||
|
||||
m_infile->read(buf, m_size);
|
||||
|
||||
std::string st(buf, m_size);
|
||||
|
||||
m->ParseFromString(st);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
69
core/util/ProtoStream.hpp
Normal file
69
core/util/ProtoStream.hpp
Normal file
@ -0,0 +1,69 @@
|
||||
#ifndef __PROTOSTREAM_HPP__
|
||||
#define __PROTOSTREAM_HPP__
|
||||
|
||||
#include <iostream>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <google/protobuf/message.h>
|
||||
|
||||
#include "Logger.hpp"
|
||||
|
||||
using namespace std;
|
||||
|
||||
/**
|
||||
* \class ProtoStream
|
||||
*
|
||||
*
|
||||
* \brief One way to manage large protobuf-messages
|
||||
*
|
||||
* Google protobuf is not designed for large messages.
|
||||
* That leads to much memory which is consumed by processing large messages.
|
||||
* To solve this problem the ProtoStream class stores the protobuf-messages in an other way.
|
||||
* Instead of using the repeat-function the data is written sequentially in a file.
|
||||
* Written in the format:
|
||||
* |4 bytes length-information of the first message| first message | 4 bytes length-information of second message | second message | ...
|
||||
*
|
||||
*/
|
||||
class ProtoStream
|
||||
{
|
||||
private:
|
||||
bool m_write_mode;
|
||||
uint32_t m_size;
|
||||
|
||||
Logger m_log;
|
||||
ostream* m_outfile;
|
||||
istream* m_infile;
|
||||
|
||||
|
||||
public:
|
||||
ProtoStream(ostream * outfile);
|
||||
ProtoStream(istream * infile);
|
||||
virtual ~ProtoStream() {};
|
||||
/**
|
||||
* Writes a message to a file.
|
||||
* This works only if the constructor was called wit a pointer
|
||||
* of an ostream.
|
||||
* @param m The protobuf-message to be written.
|
||||
* @return Returns true if data was written.
|
||||
*/
|
||||
bool writeMessage(google::protobuf::Message* m);
|
||||
/**
|
||||
* Resets the position of the get pointer. After that getNext
|
||||
* delivers the first message again.
|
||||
* This works only if the constructor was called wit a pointer
|
||||
* of an istream.
|
||||
* @return Returns true if the pointer is reset.
|
||||
*/
|
||||
bool reset();
|
||||
/**
|
||||
* Delivers the protobuf-messages sequentially from file.
|
||||
* This works only if the constructor was called wit a pointer
|
||||
* of an istream.
|
||||
* @param m The protobuf-message in which, the data should be
|
||||
* written.
|
||||
* @return Returns true if data was written to protobuf-message.
|
||||
*/
|
||||
bool getNext(google::protobuf::Message* m);
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user