#include "BinaryWriter.hpp" #include #include #include "date.h" #include #include #include #include #include #include using namespace std; BinaryWriter::BinaryWriter( const string& device_name, const string& root_folder) : device_name_(device_name), root_folder_(root_folder), latest_filename_(root_folder + "/" + device_name + "/LATEST"), current_output_filename_(""), output_file_fd_(-1) { #ifdef DEBUG_OUTPUT using namespace date; using namespace chrono; cout << "[" << system_clock::now() << "]"; cout << "[BinaryWriter::BinaryWriter]"; cout << " Starting with"; cout << " device_name " << device_name_; cout << " root_folder_ " << root_folder_; cout << " latest_filename_ " << latest_filename_; cout << endl; #endif } BinaryWriter::~BinaryWriter() { close_current_file(); } void BinaryWriter::write(uint64_t pulse_id, const JFFileFormat* buffer) { auto current_frame_file = BufferUtils::get_filename(root_folder_, device_name_, pulse_id); if (current_frame_file != current_output_filename_) { open_file(current_frame_file); } size_t n_bytes_offset = BufferUtils::get_file_frame_index(pulse_id) * sizeof(JFFileFormat); auto lseek_result = lseek(output_file_fd_, n_bytes_offset, SEEK_SET); if (lseek_result < 0) { stringstream err_msg; using namespace date; using namespace chrono; err_msg << "[" << system_clock::now() << "]"; err_msg << "[BinaryWriter::write]"; err_msg << " Error while lseek on file "; err_msg << current_output_filename_; err_msg << " for n_bytes_offset "; err_msg << n_bytes_offset << ": "; err_msg << strerror(errno) << endl; throw runtime_error(err_msg.str()); } auto n_bytes = ::write(output_file_fd_, buffer, sizeof(JFFileFormat)); if (n_bytes < sizeof(JFFileFormat)) { stringstream err_msg; using namespace date; using namespace chrono; err_msg << "[" << system_clock::now() << "]"; err_msg << "[BinaryWriter::write]"; err_msg << " Error while writing to file "; err_msg << current_output_filename_ << ": "; err_msg << strerror(errno) << endl; throw runtime_error(err_msg.str()); } } void BinaryWriter::open_file(const std::string& filename) { close_current_file(); WriterUtils::create_destination_folder(filename); output_file_fd_ = ::open(filename.c_str(), O_WRONLY | O_CREAT, S_IRWXU | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); if (output_file_fd_ < 0) { stringstream err_msg; using namespace date; using namespace chrono; err_msg << "[" << system_clock::now() << "]"; err_msg << "[BinaryWriter::open_file]"; err_msg << " Cannot create file "; err_msg << filename << ": "; err_msg << strerror(errno) << endl; throw runtime_error(err_msg.str()); } current_output_filename_ = filename; } void BinaryWriter::close_current_file() { if (output_file_fd_ != -1) { if (close(output_file_fd_) < 0) { stringstream err_msg; using namespace date; using namespace chrono; err_msg << "[" << system_clock::now() << "]"; err_msg << "[BinaryWriter::close_current_file]"; err_msg << " Error while closing file "; err_msg << current_output_filename_ << ": "; err_msg << strerror(errno) << endl; throw runtime_error(err_msg.str()); } output_file_fd_ = -1; BufferUtils::update_latest_file( latest_filename_, current_output_filename_); } current_output_filename_ = ""; }