Belle II Software  release-08-01-10
SeqFile Class Reference

A class to manage I/O for a chain of blocked files. More...

#include <SeqFile.h>

Collaboration diagram for SeqFile:

Public Member Functions

 SeqFile (const std::string &filename, const std::string &rwflag, char *streamerinfo=nullptr, int streamerinfo_size=0, bool filenameIsPattern=false)
 Constructor. More...
 
 ~SeqFile ()
 Destructor.
 
 SeqFile (const SeqFile &)=delete
 No copying.
 
SeqFileoperator= (const SeqFile &)=delete
 No assignment.
 
int status () const
 Returns status after constructor call. More...
 
int write (const char *buf)
 Write a record to a file. More...
 
int read (char *buf, int max)
 Read a record from a file. More...
 

Private Member Functions

void openFile (std::string filename, bool readonly)
 actually open the file
 

Private Attributes

std::string m_filename
 Name of the opened file.
 
std::string m_filenamePattern
 Pattern for creating the file from the sequence number.
 
int m_fd { -1}
 file descriptor.
 
int m_nb {0}
 when saving a file, the total number of bytes written, 0 when reading.
 
int m_nfile {0}
 file counter, starting at 0 (files are split after c_MaxFileSize bytes).
 
bool m_compressed {false}
 is file gzipped compressed?
 
std::unique_ptr< std::ios > m_stream
 pointer to the filtering input or output stream
 
char * m_streamerinfo
 StreamerInfo.
 
int m_streamerinfo_size
 size(bytes) of StreamerInfo
 

Static Private Attributes

static const int c_MaxFileSize {512000000 * 4}
 maximal size of one file (in Bytes).
 

Detailed Description

A class to manage I/O for a chain of blocked files.

Definition at line 22 of file SeqFile.h.

Constructor & Destructor Documentation

◆ SeqFile()

SeqFile ( const std::string &  filename,
const std::string &  rwflag,
char *  streamerinfo = nullptr,
int  streamerinfo_size = 0,
bool  filenameIsPattern = false 
)

Constructor.

Parameters
filenamename of the file
rwflagshould probably be r or rw
streamerinfoString containing the streamer info
streamerinfo_sizeSize of the string containing the streamer info
filenameIsPatternif true interpret the filename as a boost::format pattern which takes the sequence number as argument instead of producing .sroot-N files

Definition at line 25 of file SeqFile.cc.

26  :
27  m_filename(filename)
28 {
29  if (m_filename.empty()) {
30  B2ERROR("SeqFile: Empty filename given");
31  return;
32  }
33  bool readonly = rwflag.find('w') == std::string::npos;
34  // CAF use URL input style and add a prefix that need to be removed for sroot files
35  if (m_filename.compare(0, 7, "file://") == 0) {
36  m_filename = m_filename.substr(7, m_filename.size() - 7);
37  }
38  // is the file already compressed?
39  m_compressed = m_filename.size() > 3 && m_filename.compare(m_filename.size() - 3, 3, ".gz") == 0;
40  // strip .gz suffix to add it at the end automatically and correctly for subsequent files
41  if (m_compressed) {
42  m_filename = m_filename.substr(0, m_filename.size() - 3);
43  }
44  // check if we want different naming scheme using boost::format
45  if (filenameIsPattern) {
47  try {
48  m_filename = (boost::format(m_filenamePattern) % m_nfile).str();
49  } catch (std::exception& e) {
50  B2FATAL("Cannot use filename pattern" << m_filenamePattern << ": " << e.what());
51  }
52  }
53 
54  // Store StreamerInfo 2017.5.8
55  m_streamerinfo = nullptr;
57  if (streamerinfo != nullptr && streamerinfo_size > 0) {
58  m_streamerinfo_size = streamerinfo_size;
59  m_streamerinfo = new char[ m_streamerinfo_size ];
60  memcpy(m_streamerinfo, streamerinfo, m_streamerinfo_size);
61  }
62 
63  // open the file
64  openFile(m_filename, readonly);
65  // if that fails and it's not already assumed to be compressed try again adding .gz to the name
66  if (m_fd < 0 && !m_compressed) {
67  B2WARNING("SeqFile: error opening '" << m_filename << "': " << strerror(errno)
68  << ", trying again with '.gz'");
69  m_compressed = true;
70  openFile(m_filename, readonly);
71  }
72  // is the file open now?
73  if (m_fd < 0) {
74  B2ERROR("SeqFile: error opening '" << m_filename << "': " << strerror(errno));
75  } else {
76  B2INFO("SeqFile: " << m_filename << " opened (fd=" << m_fd << ")");
77  }
78 
79 }
std::string m_filenamePattern
Pattern for creating the file from the sequence number.
Definition: SeqFile.h:60
void openFile(std::string filename, bool readonly)
actually open the file
Definition: SeqFile.cc:81
int m_streamerinfo_size
size(bytes) of StreamerInfo
Definition: SeqFile.h:71
bool m_compressed
is file gzipped compressed?
Definition: SeqFile.h:64
std::string m_filename
Name of the opened file.
Definition: SeqFile.h:59
int m_fd
file descriptor.
Definition: SeqFile.h:61
int m_nfile
file counter, starting at 0 (files are split after c_MaxFileSize bytes).
Definition: SeqFile.h:63
char * m_streamerinfo
StreamerInfo.
Definition: SeqFile.h:68

Member Function Documentation

◆ read()

int read ( char *  buf,
int  max 
)

Read a record from a file.

The record length is returned.

Definition at line 174 of file SeqFile.cc.

◆ status()

int status ( ) const

Returns status after constructor call.

If success, fd is returned. If not, -1

Definition at line 135 of file SeqFile.cc.

◆ write()

int write ( const char *  buf)

Write a record to a file.

First word of the record should contain number of words.

Definition at line 140 of file SeqFile.cc.


The documentation for this class was generated from the following files: