The RRawFile provides read-only access to local and remote files.
Data can be read either byte-wise or line-wise. The RRawFile base class provides line-wise access and buffering for byte-wise access. Derived classes provide the low-level read operations, e.g. from a local file system or from a web server. The RRawFile is used for non-ROOT RDataSource implementations and for RNTuple.
Files are addressed by URL consisting of a transport protocol part and a location, like file:///path/to/data If the transport protocol part and the :// separator are missing, the default protocol is local file. Files are opened when required (on reading, getting file size) and closed on object destruction.
RRawFiles manage system resources and are therefore made non-copyable. They can be explicitly cloned though.
RRawFile objects are conditionally thread safe. See the user manual for further details: https://root.cern/manual/thread_safety/
Definition at line 43 of file RRawFile.hxx.
Classes | |
struct | RBlockBuffer |
struct | RIOVec |
Used for vector reads from multiple offsets into multiple buffers. More... | |
struct | ROptions |
On construction, an ROptions parameter can customize the RRawFile behavior. More... | |
Public Types | |
enum class | ELineBreaks { kAuto , kSystem , kUnix , kWindows } |
kAuto detects the line break from the first line, kSystem picks the system's default More... | |
Public Member Functions | |
RRawFile (const RRawFile &)=delete | |
RRawFile (std::string_view url, ROptions options) | |
virtual | ~RRawFile () |
virtual std::unique_ptr< RRawFile > | Clone () const =0 |
Create a new RawFile that accesses the same resource. The file pointer is reset to zero. | |
virtual int | GetFeatures () const =0 |
Derived classes shall inform the user about the supported functionality, which can possibly depend on the file at hand. | |
std::uint64_t | GetFilePos () const |
Returns the offset for the next Read/Readln call. | |
std::uint64_t | GetSize () |
Returns the size of the file. | |
std::string | GetUrl () const |
Returns the url of the file. | |
void * | Map (size_t nbytes, std::uint64_t offset, std::uint64_t &mapdOffset) |
Memory mapping according to POSIX standard; in particular, new mappings of the same range replace older ones. | |
RRawFile & | operator= (const RRawFile &)=delete |
size_t | Read (void *buffer, size_t nbytes) |
Read from fFilePos offset. Returns the actual number of bytes read. | |
size_t | ReadAt (void *buffer, size_t nbytes, std::uint64_t offset) |
Buffered read from a random position. | |
bool | Readln (std::string &line) |
Read the next line starting from the current value of fFilePos. Returns false if the end of the file is reached. | |
void | ReadV (RIOVec *ioVec, unsigned int nReq) |
Opens the file if necessary and calls ReadVImpl. | |
void | Seek (std::uint64_t offset) |
Change the cursor fFilePos. | |
void | Unmap (void *region, size_t nbytes) |
Receives a pointer returned by Map() and should have nbytes set to the full length of the mapping. | |
Static Public Member Functions | |
static std::unique_ptr< RRawFile > | Create (std::string_view url, ROptions options=ROptions()) |
Factory method that returns a suitable concrete implementation according to the transport in the url. | |
static std::string | GetLocation (std::string_view url) |
Returns only the file location, e.g. "server/file" for http://server/file. | |
static std::string | GetTransport (std::string_view url) |
Returns only the transport protocol in lower case, e.g. "http" for HTTP://server/file. | |
Static Public Attributes | |
static constexpr int | kFeatureHasAsyncIo = 0x04 |
File supports async IO. | |
static constexpr int | kFeatureHasMmap = 0x02 |
Map() and Unmap() are implemented. | |
static constexpr int | kFeatureHasSize = 0x01 |
GetSize() does not return kUnknownFileSize. | |
static constexpr std::uint64_t | kUnknownFileSize = std::uint64_t(-1) |
Derived classes do not necessarily need to provide file size information but they can return "not known" instead. | |
Protected Member Functions | |
virtual std::uint64_t | GetSizeImpl ()=0 |
Derived classes should return the file size or kUnknownFileSize. | |
virtual void * | MapImpl (size_t nbytes, std::uint64_t offset, std::uint64_t &mapdOffset) |
If a derived class supports mmap, the MapImpl and UnmapImpl calls are supposed to be implemented, too The default implementation throws an error. | |
virtual void | OpenImpl ()=0 |
OpenImpl() is called at most once and before any call to either DoReadAt or DoGetSize. | |
virtual size_t | ReadAtImpl (void *buffer, size_t nbytes, std::uint64_t offset)=0 |
Derived classes should implement low-level reading without buffering. | |
virtual void | ReadVImpl (RIOVec *ioVec, unsigned int nReq) |
By default implemented as a loop of ReadAt calls but can be overwritten, e.g. XRootD or DAVIX implementations. | |
virtual void | UnmapImpl (void *region, size_t nbytes) |
Derived classes with mmap support must be able to unmap the memory area handed out by Map() | |
Protected Attributes | |
std::uint64_t | fFilePos |
The current position in the file, which can be changed by Seek, Read, and Readln. | |
ROptions | fOptions |
std::string | fUrl |
Private Attributes | |
unsigned int | fBlockBufferIdx |
To be used modulo kNumBlockBuffers, points to the last used block buffer in fBlockBuffers. | |
RBlockBuffer | fBlockBuffers [kNumBlockBuffers] |
An active buffer and a shadow buffer, which supports "jumping back" to a previously used location in the file. | |
unsigned char * | fBufferSpace |
Memory block containing the block buffers consecutively. | |
std::uint64_t | fFileSize |
The cached file size. | |
bool | fIsOpen |
Files are opened lazily and only when required; the open state is kept by this flag. | |
Static Private Attributes | |
static constexpr unsigned int | kNumBlockBuffers = 2 |
Don't change without adapting ReadAt() | |
#include <ROOT/RRawFile.hxx>
|
strong |
kAuto detects the line break from the first line, kSystem picks the system's default
Enumerator | |
---|---|
kAuto | |
kSystem | |
kUnix | |
kWindows |
Definition at line 48 of file RRawFile.hxx.
ROOT::Internal::RRawFile::RRawFile | ( | std::string_view | url, |
ROptions | options | ||
) |
Definition at line 61 of file RRawFile.cxx.
|
delete |
|
virtual |
Definition at line 67 of file RRawFile.cxx.
|
pure virtual |
Create a new RawFile that accesses the same resource. The file pointer is reset to zero.
Implemented in ROOT::Internal::RRawFileUnix, ROOT::Internal::RRawFileWin, ROOT::Internal::RRawFileDavix, and ROOT::Internal::RRawFileNetXNG.
|
static |
Factory method that returns a suitable concrete implementation according to the transport in the url.
Definition at line 73 of file RRawFile.cxx.
|
pure virtual |
Derived classes shall inform the user about the supported functionality, which can possibly depend on the file at hand.
Implemented in ROOT::Internal::RRawFileUnix, ROOT::Internal::RRawFileWin, ROOT::Internal::RRawFileDavix, and ROOT::Internal::RRawFileNetXNG.
|
inline |
Returns the offset for the next Read/Readln call.
Definition at line 167 of file RRawFile.hxx.
|
static |
Returns only the file location, e.g. "server/file" for http://server/file.
Definition at line 117 of file RRawFile.cxx.
std::uint64_t ROOT::Internal::RRawFile::GetSize | ( | ) |
Returns the size of the file.
Definition at line 125 of file RRawFile.cxx.
|
protectedpure virtual |
Derived classes should return the file size or kUnknownFileSize.
Implemented in ROOT::Internal::RRawFileUnix, ROOT::Internal::RRawFileWin, ROOT::Internal::RRawFileDavix, and ROOT::Internal::RRawFileNetXNG.
|
static |
Returns only the transport protocol in lower case, e.g. "http" for HTTP://server/file.
Definition at line 140 of file RRawFile.cxx.
std::string ROOT::Internal::RRawFile::GetUrl | ( | ) | const |
Returns the url of the file.
Definition at line 136 of file RRawFile.cxx.
void * ROOT::Internal::RRawFile::Map | ( | size_t | nbytes, |
std::uint64_t | offset, | ||
std::uint64_t & | mapdOffset | ||
) |
Memory mapping according to POSIX standard; in particular, new mappings of the same range replace older ones.
Mappings need to be aligned at page boundaries, therefore the real offset can be smaller than the desired value. Users become owner of the address returned by Map() and are responsible for calling Unmap() with the full length.
Definition at line 150 of file RRawFile.cxx.
|
protectedvirtual |
If a derived class supports mmap, the MapImpl and UnmapImpl calls are supposed to be implemented, too The default implementation throws an error.
Reimplemented in ROOT::Internal::RRawFileUnix.
Definition at line 99 of file RRawFile.cxx.
|
protectedpure virtual |
OpenImpl() is called at most once and before any call to either DoReadAt or DoGetSize.
If fOptions.fBlocksize is negative, derived classes are responsible to set a sensible value. After a call to OpenImpl(), fOptions.fBlocksize must be larger or equal to zero.
Implemented in ROOT::Internal::RRawFileUnix, ROOT::Internal::RRawFileWin, ROOT::Internal::RRawFileDavix, and ROOT::Internal::RRawFileNetXNG.
size_t ROOT::Internal::RRawFile::Read | ( | void * | buffer, |
size_t | nbytes | ||
) |
Read from fFilePos offset. Returns the actual number of bytes read.
Definition at line 158 of file RRawFile.cxx.
size_t ROOT::Internal::RRawFile::ReadAt | ( | void * | buffer, |
size_t | nbytes, | ||
std::uint64_t | offset | ||
) |
Buffered read from a random position.
Returns the actual number of bytes read. Short reads indicate the end of the file
Definition at line 165 of file RRawFile.cxx.
|
protectedpure virtual |
Derived classes should implement low-level reading without buffering.
Short reads indicate the end of the file, therefore derived classes should return nbytes bytes if available.
Implemented in ROOT::Internal::RRawFileUnix, ROOT::Internal::RRawFileWin, ROOT::Internal::RRawFileDavix, and ROOT::Internal::RRawFileNetXNG.
bool ROOT::Internal::RRawFile::Readln | ( | std::string & | line | ) |
Read the next line starting from the current value of fFilePos. Returns false if the end of the file is reached.
Definition at line 219 of file RRawFile.cxx.
Opens the file if necessary and calls ReadVImpl.
Definition at line 211 of file RRawFile.cxx.
By default implemented as a loop of ReadAt calls but can be overwritten, e.g. XRootD or DAVIX implementations.
Reimplemented in ROOT::Internal::RRawFileUnix, ROOT::Internal::RRawFileDavix, and ROOT::Internal::RRawFileNetXNG.
Definition at line 105 of file RRawFile.cxx.
void ROOT::Internal::RRawFile::Seek | ( | std::uint64_t | offset | ) |
Change the cursor fFilePos.
Definition at line 252 of file RRawFile.cxx.
Receives a pointer returned by Map() and should have nbytes set to the full length of the mapping.
Definition at line 257 of file RRawFile.cxx.
Derived classes with mmap support must be able to unmap the memory area handed out by Map()
Reimplemented in ROOT::Internal::RRawFileUnix.
Definition at line 112 of file RRawFile.cxx.
|
private |
To be used modulo kNumBlockBuffers, points to the last used block buffer in fBlockBuffers.
Definition at line 102 of file RRawFile.hxx.
|
private |
An active buffer and a shadow buffer, which supports "jumping back" to a previously used location in the file.
Definition at line 104 of file RRawFile.hxx.
|
private |
Memory block containing the block buffers consecutively.
Definition at line 106 of file RRawFile.hxx.
|
protected |
The current position in the file, which can be changed by Seek, Read, and Readln.
Definition at line 116 of file RRawFile.hxx.
|
private |
The cached file size.
Definition at line 108 of file RRawFile.hxx.
|
private |
Files are opened lazily and only when required; the open state is kept by this flag.
Definition at line 110 of file RRawFile.hxx.
|
protected |
Definition at line 114 of file RRawFile.hxx.
|
protected |
Definition at line 113 of file RRawFile.hxx.
|
staticconstexpr |
File supports async IO.
Definition at line 56 of file RRawFile.hxx.
|
staticconstexpr |
Map() and Unmap() are implemented.
Definition at line 54 of file RRawFile.hxx.
|
staticconstexpr |
GetSize() does not return kUnknownFileSize.
Definition at line 52 of file RRawFile.hxx.
|
staticconstexprprivate |
Don't change without adapting ReadAt()
Definition at line 84 of file RRawFile.hxx.
|
staticconstexpr |
Derived classes do not necessarily need to provide file size information but they can return "not known" instead.
Definition at line 46 of file RRawFile.hxx.