50#ifndef R__LITTLE_ENDIAN
53#define R__LITTLE_ENDIAN 1
55#define R__LITTLE_ENDIAN 0
71 std::uint16_t fValBE = 0;
72 static std::uint16_t Swap(std::uint16_t val)
74#if R__LITTLE_ENDIAN == 1
75 return RByteSwap<
sizeof(val)>::bswap(val);
82 RUInt16BE() =
default;
83 explicit RUInt16BE(
const std::uint16_t val) : fValBE(Swap(val)) {}
84 operator std::uint16_t()
const {
return Swap(fValBE); }
85 RUInt16BE &
operator=(
const std::uint16_t val)
95 std::uint32_t fValBE = 0;
96 static std::uint32_t Swap(std::uint32_t val)
98#if R__LITTLE_ENDIAN == 1
99 return RByteSwap<
sizeof(val)>::bswap(val);
106 RUInt32BE() =
default;
107 explicit RUInt32BE(
const std::uint32_t val) : fValBE(Swap(val)) {}
108 operator std::uint32_t()
const {
return Swap(fValBE); }
109 RUInt32BE &
operator=(
const std::uint32_t val)
119 std::int32_t fValBE = 0;
120 static std::int32_t Swap(std::int32_t val)
122#if R__LITTLE_ENDIAN == 1
123 return RByteSwap<
sizeof(val)>::bswap(val);
130 RInt32BE() =
default;
131 explicit RInt32BE(
const std::int32_t val) : fValBE(Swap(val)) {}
132 operator std::int32_t()
const {
return Swap(fValBE); }
133 RInt32BE &
operator=(
const std::int32_t val)
143 std::uint64_t fValBE = 0;
144 static std::uint64_t Swap(std::uint64_t val)
146#if R__LITTLE_ENDIAN == 1
147 return RByteSwap<
sizeof(val)>::bswap(val);
154 RUInt64BE() =
default;
155 explicit RUInt64BE(
const std::uint64_t val) : fValBE(Swap(val)) {}
156 operator std::uint64_t()
const {
return Swap(fValBE); }
157 RUInt64BE &
operator=(
const std::uint64_t val)
167 unsigned char fLName{0};
169 RTFString() =
default;
170 RTFString(
const std::string &str)
175 fLName = str.length();
176 memcpy(fData, str.data(), fLName);
178 std::size_t GetSize()
const
192 auto now = std::chrono::system_clock::now();
193 auto tt = std::chrono::system_clock::to_time_t(
now);
195 fDatetime = (
tm.tm_year + 1900 - 1995) << 26 | (
tm.tm_mon + 1) << 22 |
tm.tm_mday << 17 |
tm.tm_hour << 12 |
196 tm.tm_min << 6 |
tm.tm_sec;
198 explicit RTFDatetime(RUInt32BE val) : fDatetime(val) {}
203 static constexpr unsigned kBigKeyVersion = 1000;
206 RUInt16BE fVersion{4};
207 RUInt32BE fObjLen{0};
208 RTFDatetime fDatetime;
209 RUInt16BE fKeyLen{0};
213 RUInt32BE fSeekKey{0};
214 RUInt32BE fSeekPdir{0};
217 RUInt64BE fSeekKey{0};
218 RUInt64BE fSeekPdir{0};
222 RTFKey() : fInfoLong() {}
229 fVersion = fVersion + kBigKeyVersion;
238 std::uint32_t GetSize()
const
246 std::uint32_t GetHeaderSize()
const
248 if (fVersion >= kBigKeyVersion)
249 return 18 +
sizeof(fInfoLong);
250 return 18 +
sizeof(fInfoShort);
253 std::uint64_t GetSeekKey()
const
255 if (fVersion >= kBigKeyVersion)
256 return fInfoLong.fSeekKey;
257 return fInfoShort.fSeekKey;
263 static constexpr unsigned kBEGIN = 100;
264 static constexpr unsigned kBigHeaderVersion = 1000000;
266 char fMagic[4]{
'r',
'o',
'o',
't'};
273 RUInt32BE fSeekFree{0};
274 RUInt32BE fNbytesFree{0};
276 RUInt32BE fNbytesName{0};
277 unsigned char fUnits{4};
278 RUInt32BE fCompress{0};
279 RUInt32BE fSeekInfo{0};
280 RUInt32BE fNbytesInfo{0};
284 RUInt64BE fSeekFree{0};
285 RUInt32BE fNbytesFree{0};
287 RUInt32BE fNbytesName{0};
288 unsigned char fUnits{8};
289 RUInt32BE fCompress{0};
290 RUInt64BE fSeekInfo{0};
291 RUInt32BE fNbytesInfo{0};
295 RTFHeader() : fInfoShort() {}
300 if (fVersion >= kBigHeaderVersion)
304 std::uint32_t end = fInfoShort.fEND;
305 std::uint32_t
seekFree = fInfoShort.fSeekFree;
306 std::uint32_t
nbytesFree = fInfoShort.fNbytesFree;
307 std::uint32_t
nFree = fInfoShort.fNfree;
308 std::uint32_t
nbytesName = fInfoShort.fNbytesName;
309 std::uint32_t
compress = fInfoShort.fCompress;
310 std::uint32_t
seekInfo = fInfoShort.fSeekInfo;
311 std::uint32_t
nbytesInfo = fInfoShort.fNbytesInfo;
312 fInfoLong.fEND = end;
315 fInfoLong.fNfree =
nFree;
317 fInfoLong.fUnits = 8;
321 fVersion = fVersion + kBigHeaderVersion;
327 return (fVersion >= kBigHeaderVersion) ||
328 (
offset >
static_cast<unsigned int>(std::numeric_limits<std::int32_t>::max()));
331 std::uint32_t GetSize()
const
333 std::uint32_t
sizeHead =
sizeof(fMagic) +
sizeof(fVersion) +
sizeof(fBEGIN);
335 return sizeHead +
sizeof(fInfoLong);
336 return sizeHead +
sizeof(fInfoShort);
339 std::uint64_t GetEnd()
const
342 return fInfoLong.fEND;
343 return fInfoShort.fEND;
350 fInfoLong.fEND =
value;
352 fInfoShort.fEND =
value;
356 std::uint64_t GetSeekFree()
const
359 return fInfoLong.fSeekFree;
360 return fInfoShort.fSeekFree;
367 fInfoLong.fSeekFree =
value;
369 fInfoShort.fSeekFree =
value;
376 fInfoLong.fNbytesFree =
value;
378 fInfoShort.fNbytesFree =
value;
385 fInfoLong.fNbytesName =
value;
387 fInfoShort.fNbytesName =
value;
391 std::uint64_t GetSeekInfo()
const
394 return fInfoLong.fSeekInfo;
395 return fInfoShort.fSeekInfo;
402 fInfoLong.fSeekInfo =
value;
404 fInfoShort.fSeekInfo =
value;
408 std::uint64_t GetNbytesInfo()
const
411 return fInfoLong.fNbytesInfo;
412 return fInfoShort.fNbytesInfo;
418 fInfoLong.fNbytesInfo =
value;
420 fInfoShort.fNbytesInfo =
value;
424 void SetCompression(std::uint32_t
value)
427 fInfoLong.fCompress =
value;
429 fInfoShort.fCompress =
value;
436 static constexpr unsigned kBigFreeEntryVersion = 1000;
438 RUInt16BE fVersion{1};
450 RTFFreeEntry() : fInfoShort() {}
451 void Set(std::uint64_t first, std::uint64_t last)
453 if (last >
static_cast<unsigned int>(std::numeric_limits<std::int32_t>::max())) {
454 fVersion = fVersion + kBigFreeEntryVersion;
455 fInfoLong.fFirst = first;
456 fInfoLong.fLast = last;
458 fInfoShort.fFirst = first;
459 fInfoShort.fLast = last;
462 std::uint32_t GetSize() {
return (fVersion >= kBigFreeEntryVersion) ? 18 : 10; }
468 std::uint32_t GetSize()
const {
return sizeof(RTFKeyList); }
469 explicit RTFKeyList(std::uint32_t
nKeys) : fNKeys(
nKeys) {}
474 static constexpr unsigned kBigFileVersion = 1000;
476 RUInt16BE fClassVersion{5};
479 RUInt32BE fNBytesKeys{0};
480 RUInt32BE fNBytesName{0};
484 RUInt32BE fSeekDir{RTFHeader::kBEGIN};
485 RUInt32BE fSeekParent{0};
486 RUInt32BE fSeekKeys{0};
489 RUInt64BE fSeekDir{RTFHeader::kBEGIN};
490 RUInt64BE fSeekParent{0};
491 RUInt64BE fSeekKeys{0};
495 RTFDirectory() : fInfoShort() {}
498 std::uint32_t GetSize()
const
500 if (fClassVersion >= kBigFileVersion)
501 return sizeof(RTFDirectory);
502 return 18 +
sizeof(fInfoShort);
505 std::uint64_t GetSeekKeys()
const
507 if (fClassVersion >= kBigFileVersion)
508 return fInfoLong.fSeekKeys;
509 return fInfoShort.fSeekKeys;
514 if (
seekKeys >
static_cast<unsigned int>(std::numeric_limits<std::int32_t>::max())) {
515 std::uint32_t
seekDir = fInfoShort.fSeekDir;
516 std::uint32_t
seekParent = fInfoShort.fSeekParent;
520 fClassVersion = fClassVersion + kBigFileVersion;
529 RUInt16BE fVersionClass{1};
530 unsigned char fUUID[16];
535 char *buffer =
reinterpret_cast<char *
>(
this);
537 assert(
reinterpret_cast<RTFUUID *
>(buffer) <= (
this + 1));
539 std::uint32_t GetSize()
const {
return sizeof(RTFUUID); }
548 RUInt32BE fByteCount{0x40000000 | (
sizeof(RTFNTuple) -
sizeof(fByteCount))};
549 RUInt16BE fVersionClass{2};
550 RUInt16BE fVersionEpoch{0};
551 RUInt16BE fVersionMajor{0};
552 RUInt16BE fVersionMinor{0};
553 RUInt16BE fVersionPatch{0};
554 RUInt64BE fSeekHeader{0};
555 RUInt64BE fNBytesHeader{0};
556 RUInt64BE fLenHeader{0};
557 RUInt64BE fSeekFooter{0};
558 RUInt64BE fNBytesFooter{0};
559 RUInt64BE fLenFooter{0};
560 RUInt64BE fMaxKeySize{0};
562 static constexpr std::uint32_t
GetSizePlusChecksum() {
return sizeof(RTFNTuple) +
sizeof(std::uint64_t); }
564 RTFNTuple() =
default;
579 std::uint32_t GetSize()
const {
return sizeof(RTFNTuple); }
581 std::uint32_t
GetOffsetCkData() {
return sizeof(fByteCount) +
sizeof(fVersionClass); }
587struct RBareFileHeader {
588 char fMagic[7]{
'r',
'n',
't',
'u',
'p',
'l',
'e'};
591 RUInt32BE fFormatVersion{1};
592 RUInt32BE fCompress{0};
679 if (std::string(
ident, 4) ==
"root")
688 std::string_view typeName)
701 for (
unsigned int i = 0; i <
nKeys; ++i) {
705 offset += key.GetHeaderSize();
709 if (std::string_view(
name.fData,
name.fLName) != typeName) {
717 return key.GetSeekKey();
759 auto obj =
lnk->GetObject();
790 auto pos = std::string::npos;
797 return R__FAIL(
"no directory named '" + std::string(
directoryName) +
"' in file '" + fRawFile->GetUrl() +
"'");
800 offset = key.GetSeekKey() + key.fKeyLen;
807 return R__FAIL(
"no RNTuple named '" + std::string(
ntupleName) +
"' in file '" + fRawFile->GetUrl() +
"'");
811 offset = key.GetSeekKey() + key.fKeyLen;
815 static_assert(
kMinNTupleSize == RTFNTuple::GetSizePlusChecksum());
817 return R__FAIL(
"invalid anchor size: " + std::to_string(key.fObjLen) +
" < " + std::to_string(
sizeof(RTFNTuple)));
820 const auto objNbytes = key.GetSize() - key.fKeyLen;
851 ckOnDisk =
static_cast<uint64_t
>(*ckOnDiskPtr);
853 return R__FAIL(
"RNTuple anchor checksum mismatch");
871 return R__FAIL(
"expected RNTuple named '" + std::string(
ntupleName) +
"' but instead found '" +
872 std::string(
foundName) +
"' in file '" + fRawFile->GetUrl() +
"'");
882 return R__FAIL(
"RNTuple bare file: anchor checksum mismatch");
897 return R__FAIL(
"invalid read (expected bytes: " + std::to_string(
expected) +
", read: " + std::to_string(
nread) +
902 if (fMaxKeySize == 0 ||
nbytes <= fMaxKeySize) {
910 uint8_t *
bufCur =
reinterpret_cast<uint8_t *
>(buffer);
914 if (
nread != fMaxKeySize)
959 unsigned char buffer[kBlobKeyLen])
986 static_assert(kHeaderBlockSize % kBlockAlign == 0,
"invalid header block size");
987 if (bufferSize % kBlockAlign != 0)
988 throw RException(
R__FAIL(
"Buffer size not a multiple of alignment: " + std::to_string(bufferSize)));
989 fBlockSize = bufferSize;
993 memset(fHeaderBlock, 0, kHeaderBlockSize);
995 memset(fBlock, 0, fBlockSize);
1025 if (fBlockOffset == 0) {
1050 if (fBlockOffset > 0) {
1055 retval = fwrite(fHeaderBlock, 1, kHeaderBlockSize, fFile);
1056 if (
retval != RFileSimple::kHeaderBlockSize)
1069 if ((
offset >= 0) && (
static_cast<std::uint64_t
>(
offset) != fFilePos)) {
1074 if (fFilePos < kHeaderBlockSize) {
1085 std::uint64_t
posInBlock = fFilePos % fBlockSize;
1093 retval = fwrite(fBlock, 1, fBlockSize, fFile);
1094 if (
retval != fBlockSize)
1098 memset(fBlock, 0, fBlockSize);
1102 std::size_t blockSize =
nbytes;
1107 buffer =
static_cast<const unsigned char *
>(buffer) + blockSize;
1109 fFilePos += blockSize;
1116 const std::string &className,
const std::string &objectName,
1117 const std::string &title)
1126 Write(&key, key.GetHeaderSize(), fKeyOffset);
1159template <
typename T>
1177 if (
keyBlob.WasAllocatedInAFreeSlot()) {
1191 fDirectory->GetFile()->Seek(
offset);
1192 bool rv = fDirectory->GetFile()->WriteBuffer((
char *)(buffer),
nbytes);
1210 bool rv = file->WriteBuffer((
char *)(buffer),
nbytes);
1229 fileSimple.fControlBlock = std::make_unique<ROOT::Internal::RTFileControlBlock>();
1237std::unique_ptr<ROOT::Internal::RNTupleFileWriter>
1241 std::string fileName(path);
1242 size_t idxDirSep = fileName.find_last_of(
"\\/");
1255 int fd = open(std::string(path).c_str(), flags, 0666);
1278 writer->fFileName = fileName;
1283 case EContainerFormat::kBare:
1287 default:
R__ASSERT(
false &&
"Internal error: unhandled container format");
1293std::unique_ptr<ROOT::Internal::RNTupleFileWriter>
1299 throw RException(
R__FAIL(
"invalid attempt to add an RNTuple to a directory that is not backed by a file"));
1308std::unique_ptr<ROOT::Internal::RNTupleFileWriter>
1314 rfile.fFile = &file;
1342 for (
auto [
_,
info] : fStreamerInfoMap)
1346 if (
auto fileProper = std::get_if<RFileProper>(&fFile)) {
1348 fileProper->fDirectory->WriteObject(&fNTupleAnchor, fNTupleName.c_str());
1352 }
else if (
auto fileRFile = std::get_if<RFileRFile>(&fFile)) {
1361 auto &
fileSimple = std::get<RFileSimple>(fFile);
1377 WriteTFileFreeList();
1382 RFileSimple::kHeaderBlockSize);
1384 fileSimple.fControlBlock->fFileRecord.GetSize());
1397 const std::uint64_t
maxKeySize = fNTupleAnchor.fMaxKeySize;
1401 if (
static_cast<std::uint64_t
>(
len) >
static_cast<std::uint64_t
>(std::numeric_limits<std::uint32_t>::max()))
1461 if (
auto *
fileSimple = std::get_if<RFileSimple>(&fFile)) {
1468 }
else if (
auto *
fileProper = std::get_if<RFileProper>(&fFile)) {
1471 auto &
fileRFile = std::get<RFileRFile>(fFile);
1479 if (
auto *
fileSimple = std::get_if<RFileSimple>(&fFile)) {
1481 }
else if (
auto *
fileProper = std::get_if<RFileProper>(&fFile)) {
1484 auto &
fileRFile = std::get<RFileRFile>(fFile);
1493 fNTupleAnchor.fNBytesHeader =
nbytes;
1494 fNTupleAnchor.fSeekHeader =
offset;
1502 fNTupleAnchor.fNBytesFooter =
nbytes;
1503 fNTupleAnchor.fSeekFooter =
offset;
1511 auto &
fileSimple = std::get<RFileSimple>(fFile);
1533 for (
auto [
_,
info] : fStreamerInfoMap) {
1546 auto &
fileSimple = std::get<RFileSimple>(fFile);
1563 fileSimple.fControlBlock->fHeader.GetSeekInfo(), RTFHeader::kBEGIN,
"TList",
"StreamerInfo",
1564 "Doubly linked list");
1566 fileSimple.fControlBlock->fHeader.GetSeekInfo());
1576 auto &
fileSimple = std::get<RFileSimple>(fFile);
1594 fileSimple.fControlBlock->fFileRecord.fNBytesKeys =
1601 auto &
fileSimple = std::get<RFileSimple>(fFile);
1611 fileSimple.fControlBlock->fHeader.GetSeekFree(), RTFHeader::kBEGIN,
"", fFileName,
"");
1613 fileSimple.fControlBlock->fHeader.GetSeekFree());
1625 auto &
fileSimple = std::get<RFileSimple>(fFile);
1628 char keyBuf[RTFNTuple::GetSizePlusChecksum()];
1635 char zipAnchor[RTFNTuple::GetSizePlusChecksum()];
1639 "ROOT::RNTuple", fNTupleName,
"");
1649 auto &
fileSimple = std::get<RFileSimple>(fFile);
1676 for (
int i = 0; i < 3; ++i)
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
static size_t ComputeNumChunks(size_t nbytes, size_t maxChunkSize)
#define ROOT_VERSION_CODE
#define ClassDefInlineOverride(name, id)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h length
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Binding & operator=(OUT(*fun)(void))
void ReadBuffer(char *&buffer) override
An interface to read from, or write to, a ROOT file, as well as performing other common operations.
The RKeyBlob writes an invisible key into a TFile.
bool WasAllocatedInAFreeSlot() const
void Reserve(size_t nbytes, std::uint64_t *seekKey)
Register a new key for a data record of size nbytes.
void ReadBuffer(void *buffer, size_t nbytes, std::uint64_t offset)
Reads a given byte range from the file into the provided memory buffer.
RMiniFileReader()=default
void LoadStreamerInfo()
Attempts to load the streamer info from the file.
RResult< RNTuple > GetNTupleProperAtOffset(std::uint64_t payloadOffset, std::uint64_t compSize, std::uint64_t uncompLen)
Loads an RNTuple anchor from a TFile at the given file offset (unzipping it if necessary).
RResult< RNTuple > GetNTupleBare(std::string_view ntupleName)
Used when the file container turns out to be a bare file.
ROOT::RResult< void > TryReadBuffer(void *buffer, size_t nbytes, std::uint64_t offset)
Like ReadBuffer but returns a RResult instead of throwing.
std::uint64_t SearchInDirectory(std::uint64_t &offsetDir, std::string_view keyName, std::string_view typeName)
Searches for a key with the given name and type in the key index of the directory starting at offsetD...
RResult< RNTuple > GetNTuple(std::string_view ntupleName)
Extracts header and footer location for the RNTuple identified by ntupleName.
RResult< RNTuple > GetNTupleProper(std::string_view ntuplePath)
Used when the file turns out to be a TFile container.
Helper class to compress data blocks in the ROOT compression frame format.
static std::size_t Zip(const void *from, std::size_t nbytes, int compression, void *to)
Returns the size of the compressed data, written into the provided output buffer.
Helper class to uncompress data blocks in the ROOT compression frame format.
static void Unzip(const void *from, size_t nbytes, size_t dataLen, void *to)
The nbytes parameter provides the size ls of the from buffer.
Write RNTuple data blocks in a TFile or a bare file container.
std::uint64_t ReserveBlob(size_t nbytes, size_t len, unsigned char keyBuffer[kBlobKeyLen]=nullptr)
Reserves a new record as an RBlob key in the file.
void WriteTFileStreamerInfo(int compression)
Write the compressed streamer info record with the description of the RNTuple class.
RNTupleFileWriter(std::string_view name, std::uint64_t maxKeySize)
void WriteTFileKeysList(std::uint64_t anchorSize)
Write the TList with the RNTuple key.
std::uint64_t WriteTFileNTupleKey(int compression)
The only key that will be visible in file->ls() Returns the size on disk of the anchor object.
void WriteBareFileSkeleton(int defaultCompression)
For a bare file, which is necessarily written by a C file stream, write file header.
void Commit(int compression=RCompressionSetting::EDefaults::kUseGeneralPurpose)
Writes the RNTuple key to the file so that the header and footer keys can be found.
std::uint64_t WriteNTupleHeader(const void *data, size_t nbytes, size_t lenHeader)
Writes the compressed header and registeres its location; lenHeader is the size of the uncompressed h...
static std::uint64_t ReserveBlobKey(T &caller, TFile &file, std::size_t nbytes, std::size_t len, unsigned char keyBuffer[kBlobKeyLen])
void WriteTFileFreeList()
Last record in the file.
void WriteTFileSkeleton(int defaultCompression)
For a TFile container written by a C file stream, write the header and TFile object.
void Seek(std::uint64_t offset)
Seek a simple writer to offset.
ROOT::Internal::RNTupleSerializer::StreamerInfoMap_t fStreamerInfoMap
Set of streamer info records that should be written to the file.
std::uint64_t WriteBlob(const void *data, size_t nbytes, size_t len)
Writes a new record as an RBlob key into the file.
static std::unique_ptr< RNTupleFileWriter > Recreate(std::string_view ntupleName, std::string_view path, EContainerFormat containerFormat, const ROOT::RNTupleWriteOptions &options)
Create or truncate the local file given by path with the new empty RNTuple identified by ntupleName.
void WriteIntoReservedBlob(const void *buffer, size_t nbytes, std::int64_t offset)
Write into a reserved record; the caller is responsible for making sure that the written byte range i...
static std::unique_ptr< RNTupleFileWriter > Append(std::string_view ntupleName, TDirectory &fileOrDirectory, std::uint64_t maxKeySize)
The directory parameter can also be a TFile object (TFile inherits from TDirectory).
static void PrepareBlobKey(std::int64_t offset, size_t nbytes, size_t len, unsigned char buffer[kBlobKeyLen])
Prepares buffer for a new record as an RBlob key at offset.
std::uint64_t WriteNTupleFooter(const void *data, size_t nbytes, size_t lenFooter)
Writes the compressed footer and registeres its location; lenFooter is the size of the uncompressed f...
void UpdateStreamerInfos(const ROOT::Internal::RNTupleSerializer::StreamerInfoMap_t &streamerInfos)
Ensures that the streamer info records passed as argument are written to the file.
RNTuple fNTupleAnchor
Header and footer location of the ntuple, written on Commit()
EContainerFormat
For testing purposes, RNTuple data can be written into a bare file container instead of a ROOT file.
A helper class for serializing and deserialization of the RNTuple binary format.
std::map< Int_t, TVirtualStreamerInfo * > StreamerInfoMap_t
static std::uint32_t DeserializeUInt64(const void *buffer, std::uint64_t &val)
static std::uint32_t SerializeUInt64(std::uint64_t val, void *buffer)
The RRawFile provides read-only access to local and remote files.
Base class for all ROOT issued exceptions.
Common user-tunable settings for storing RNTuples.
std::size_t GetWriteBufferSize() const
std::uint64_t GetMaxKeySize() const
bool GetUseDirectIO() const
std::uint32_t GetCompression() const
Representation of an RNTuple data set in a ROOT file.
std::uint64_t fMaxKeySize
The maximum size for a TKey payload. Payloads bigger than this size will be written as multiple blobs...
The class is used as a return type for operations that can fail; wraps a value of type T or an RError...
The concrete implementation of TBuffer for writing/reading to/from a ROOT file or socket.
void TagStreamerInfo(TVirtualStreamerInfo *info) override
Mark the classindex of the current file as using this TStreamerInfo.
void SetBufferDisplacement() override
void SetParent(TObject *parent)
Set parent owning this buffer.
void SetBufferOffset(Int_t offset=0)
Describe directory structure in memory.
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
Book space in a file, create I/O buffers, to fill them, (un)compress them.
Int_t Sizeof() const override
Return the size in bytes of the key header structure.
Int_t fVersion
Key version identifier.
Int_t fLeft
Number of bytes left in current segment.
Short_t fKeylen
Number of bytes for the key itself.
Long64_t fSeekKey
Location of object on file.
virtual void Create(Int_t nbytes, TFile *f=nullptr)
Create a TKey object of specified size.
TString fClassName
Object Class name.
Wrapper around a TObject so it can be stored in a TList.
Describes a persistent version of a class.
This class defines a UUID (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDent...
void FillBuffer(char *&buffer)
Stream UUID into output buffer.
TFile * GetRFileTFile(RFile &rfile)
RNTuple CreateAnchor(std::uint16_t versionEpoch, std::uint16_t versionMajor, std::uint16_t versionMinor, std::uint16_t versionPatch, std::uint64_t seekHeader, std::uint64_t nbytesHeader, std::uint64_t lenHeader, std::uint64_t seekFooter, std::uint64_t nbytesFooter, std::uint64_t lenFooter, std::uint64_t maxKeySize)
std::unique_ptr< T[]> MakeUninitArray(std::size_t size)
Make an array of default-initialized elements.
Helper templated class for swapping bytes; specializations for N={2,4,8} are provided below.
void Write(const void *buffer, size_t nbytes, std::int64_t offset)
Low-level writing using a TFile.
std::uint64_t ReserveBlobKey(size_t nbytes, size_t len, unsigned char keyBuffer[kBlobKeyLen]=nullptr)
Reserves an RBlob opaque key as data record and returns the offset of the record.
std::uint64_t ReserveBlobKey(size_t nbytes, size_t len, unsigned char keyBuffer[kBlobKeyLen]=nullptr)
Reserves an RBlob opaque key as data record and returns the offset of the record.
void Write(const void *buffer, size_t nbytes, std::int64_t offset)
Low-level writing using a TFile.
void AllocateBuffers(std::size_t bufferSize)
std::uint64_t ReserveBlobKey(std::size_t nbytes, std::size_t len, unsigned char keyBuffer[kBlobKeyLen]=nullptr)
Reserves an RBlob opaque key as data record and returns the offset of the record.
std::uint64_t WriteKey(const void *buffer, std::size_t nbytes, std::size_t len, std::int64_t offset=-1, std::uint64_t directoryOffset=100, const std::string &className="", const std::string &objectName="", const std::string &title="")
Writes a TKey including the data record, given by buffer, into fFile; returns the file offset to the ...
void Write(const void *buffer, size_t nbytes, std::int64_t offset=-1)
Writes bytes in the open stream, either at fFilePos or at the given offset.
If a TFile container is written by a C stream (simple file), on dataset commit, the file header and t...
std::uint64_t fSeekFileRecord
std::uint64_t fSeekNTuple