49#ifndef R__LITTLE_ENDIAN
52#define R__LITTLE_ENDIAN 1
54#define R__LITTLE_ENDIAN 0
65 std::uint16_t fValBE = 0;
66 static std::uint16_t Swap(std::uint16_t val)
68#if R__LITTLE_ENDIAN == 1
69 return RByteSwap<
sizeof(val)>::bswap(val);
76 RUInt16BE() =
default;
77 explicit RUInt16BE(
const std::uint16_t val) : fValBE(Swap(val)) {}
78 operator std::uint16_t()
const {
return Swap(fValBE); }
79 RUInt16BE &operator=(
const std::uint16_t val)
89 std::uint32_t fValBE = 0;
90 static std::uint32_t Swap(std::uint32_t val)
92#if R__LITTLE_ENDIAN == 1
93 return RByteSwap<
sizeof(val)>::bswap(val);
100 RUInt32BE() =
default;
101 explicit RUInt32BE(
const std::uint32_t val) : fValBE(Swap(val)) {}
102 operator std::uint32_t()
const {
return Swap(fValBE); }
103 RUInt32BE &operator=(
const std::uint32_t val)
113 std::int32_t fValBE = 0;
114 static std::int32_t Swap(std::int32_t val)
116#if R__LITTLE_ENDIAN == 1
117 return RByteSwap<
sizeof(val)>::bswap(val);
124 RInt32BE() =
default;
125 explicit RInt32BE(
const std::int32_t val) : fValBE(Swap(val)) {}
126 operator std::int32_t()
const {
return Swap(fValBE); }
127 RInt32BE &operator=(
const std::int32_t val)
137 std::uint64_t fValBE = 0;
138 static std::uint64_t Swap(std::uint64_t val)
140#if R__LITTLE_ENDIAN == 1
141 return RByteSwap<
sizeof(val)>::bswap(val);
148 RUInt64BE() =
default;
149 explicit RUInt64BE(
const std::uint64_t val) : fValBE(Swap(val)) {}
150 operator std::uint64_t()
const {
return Swap(fValBE); }
151 RUInt64BE &operator=(
const std::uint64_t val)
161 unsigned char fLName{0};
163 RTFString() =
default;
164 RTFString(
const std::string &str)
169 fLName =
static_cast<unsigned char>(str.length());
170 memcpy(fData, str.data(), fLName);
172 std::size_t GetSize()
const
186 auto now = std::chrono::system_clock::now();
187 auto tt = std::chrono::system_clock::to_time_t(
now);
189 fDatetime = (
tm.tm_year + 1900 - 1995) << 26 | (
tm.tm_mon + 1) << 22 |
tm.tm_mday << 17 |
tm.tm_hour << 12 |
190 tm.tm_min << 6 |
tm.tm_sec;
192 explicit RTFDatetime(RUInt32BE val) : fDatetime(val) {}
197 static constexpr unsigned kBigKeyVersion = 1000;
200 RUInt16BE fVersion{4};
201 RUInt32BE fObjLen{0};
202 RTFDatetime fDatetime;
203 RUInt16BE fKeyLen{0};
207 RUInt32BE fSeekKey{0};
208 RUInt32BE fSeekPdir{0};
211 RUInt64BE fSeekKey{0};
212 RUInt64BE fSeekPdir{0};
216 RTFKey() : fInfoLong() {}
223 fVersion = fVersion + kBigKeyVersion;
225 fKeyLen =
static_cast<RUInt16BE
>(GetHeaderSize() +
clName.GetSize() +
objName.GetSize() +
titleName.GetSize());
232 std::uint32_t GetSize()
const
240 std::uint32_t GetHeaderSize()
const
242 if (fVersion >= kBigKeyVersion)
243 return 18 +
sizeof(fInfoLong);
244 return 18 +
sizeof(fInfoShort);
247 std::uint64_t GetSeekKey()
const
249 if (fVersion >= kBigKeyVersion)
250 return fInfoLong.fSeekKey;
251 return fInfoShort.fSeekKey;
257 static constexpr unsigned kBEGIN = 100;
258 static constexpr unsigned kBigHeaderVersion = 1000000;
260 char fMagic[4]{
'r',
'o',
'o',
't'};
267 RUInt32BE fSeekFree{0};
268 RUInt32BE fNbytesFree{0};
270 RUInt32BE fNbytesName{0};
271 unsigned char fUnits{4};
272 RUInt32BE fCompress{0};
273 RUInt32BE fSeekInfo{0};
274 RUInt32BE fNbytesInfo{0};
278 RUInt64BE fSeekFree{0};
279 RUInt32BE fNbytesFree{0};
281 RUInt32BE fNbytesName{0};
282 unsigned char fUnits{8};
283 RUInt32BE fCompress{0};
284 RUInt64BE fSeekInfo{0};
285 RUInt32BE fNbytesInfo{0};
289 RTFHeader() : fInfoShort() {}
294 if (fVersion >= kBigHeaderVersion)
298 std::uint32_t end = fInfoShort.fEND;
299 std::uint32_t
seekFree = fInfoShort.fSeekFree;
300 std::uint32_t
nbytesFree = fInfoShort.fNbytesFree;
301 std::uint32_t
nFree = fInfoShort.fNfree;
302 std::uint32_t
nbytesName = fInfoShort.fNbytesName;
303 std::uint32_t
compress = fInfoShort.fCompress;
304 std::uint32_t
seekInfo = fInfoShort.fSeekInfo;
305 std::uint32_t
nbytesInfo = fInfoShort.fNbytesInfo;
306 fInfoLong.fEND = end;
309 fInfoLong.fNfree =
nFree;
311 fInfoLong.fUnits = 8;
315 fVersion = fVersion + kBigHeaderVersion;
321 return (fVersion >= kBigHeaderVersion) ||
322 (
offset >
static_cast<unsigned int>(std::numeric_limits<std::int32_t>::max()));
325 std::uint32_t GetSize()
const
327 std::uint32_t
sizeHead =
sizeof(fMagic) +
sizeof(fVersion) +
sizeof(fBEGIN);
329 return sizeHead +
sizeof(fInfoLong);
330 return sizeHead +
sizeof(fInfoShort);
333 std::uint64_t GetEnd()
const
336 return fInfoLong.fEND;
337 return fInfoShort.fEND;
344 fInfoLong.fEND =
value;
346 fInfoShort.fEND =
value;
350 std::uint64_t GetSeekFree()
const
353 return fInfoLong.fSeekFree;
354 return fInfoShort.fSeekFree;
361 fInfoLong.fSeekFree =
value;
363 fInfoShort.fSeekFree =
value;
370 fInfoLong.fNbytesFree =
value;
372 fInfoShort.fNbytesFree =
value;
379 fInfoLong.fNbytesName =
value;
381 fInfoShort.fNbytesName =
value;
385 std::uint64_t GetSeekInfo()
const
388 return fInfoLong.fSeekInfo;
389 return fInfoShort.fSeekInfo;
396 fInfoLong.fSeekInfo =
value;
398 fInfoShort.fSeekInfo =
value;
402 std::uint64_t GetNbytesInfo()
const
405 return fInfoLong.fNbytesInfo;
406 return fInfoShort.fNbytesInfo;
412 fInfoLong.fNbytesInfo =
value;
414 fInfoShort.fNbytesInfo =
value;
418 void SetCompression(std::uint32_t
value)
421 fInfoLong.fCompress =
value;
423 fInfoShort.fCompress =
value;
430 static constexpr unsigned kBigFreeEntryVersion = 1000;
432 RUInt16BE fVersion{1};
444 RTFFreeEntry() : fInfoShort() {}
445 void Set(std::uint64_t first, std::uint64_t last)
447 if (last >
static_cast<unsigned int>(std::numeric_limits<std::int32_t>::max())) {
448 fVersion = fVersion + kBigFreeEntryVersion;
449 fInfoLong.fFirst = first;
450 fInfoLong.fLast = last;
452 fInfoShort.fFirst = first;
453 fInfoShort.fLast = last;
456 std::uint32_t GetSize() {
return (fVersion >= kBigFreeEntryVersion) ? 18 : 10; }
462 std::uint32_t GetSize()
const {
return sizeof(RTFKeyList); }
463 explicit RTFKeyList(std::uint32_t
nKeys) : fNKeys(
nKeys) {}
468 static constexpr unsigned kBigFileVersion = 1000;
470 RUInt16BE fClassVersion{5};
473 RUInt32BE fNBytesKeys{0};
474 RUInt32BE fNBytesName{0};
478 RUInt32BE fSeekDir{RTFHeader::kBEGIN};
479 RUInt32BE fSeekParent{0};
480 RUInt32BE fSeekKeys{0};
483 RUInt64BE fSeekDir{RTFHeader::kBEGIN};
484 RUInt64BE fSeekParent{0};
485 RUInt64BE fSeekKeys{0};
489 RTFDirectory() : fInfoShort() {}
492 std::uint32_t GetSize()
const
494 if (fClassVersion >= kBigFileVersion)
495 return sizeof(RTFDirectory);
496 return 18 +
sizeof(fInfoShort);
499 std::uint64_t GetSeekKeys()
const
501 if (fClassVersion >= kBigFileVersion)
502 return fInfoLong.fSeekKeys;
503 return fInfoShort.fSeekKeys;
508 if (
seekKeys >
static_cast<unsigned int>(std::numeric_limits<std::int32_t>::max())) {
509 std::uint32_t
seekDir = fInfoShort.fSeekDir;
510 std::uint32_t
seekParent = fInfoShort.fSeekParent;
514 fClassVersion = fClassVersion + kBigFileVersion;
523 RUInt16BE fVersionClass{1};
524 unsigned char fUUID[16];
529 char *buffer =
reinterpret_cast<char *
>(
this);
530 uuid.FillBuffer(buffer);
531 assert(
reinterpret_cast<RTFUUID *
>(buffer) <= (
this + 1));
533 std::uint32_t GetSize()
const {
return sizeof(RTFUUID); }
542 RUInt32BE fByteCount{0x40000000 | (
sizeof(RTFNTuple) -
sizeof(fByteCount))};
543 RUInt16BE fVersionClass{2};
544 RUInt16BE fVersionEpoch{0};
545 RUInt16BE fVersionMajor{0};
546 RUInt16BE fVersionMinor{0};
547 RUInt16BE fVersionPatch{0};
548 RUInt64BE fSeekHeader{0};
549 RUInt64BE fNBytesHeader{0};
550 RUInt64BE fLenHeader{0};
551 RUInt64BE fSeekFooter{0};
552 RUInt64BE fNBytesFooter{0};
553 RUInt64BE fLenFooter{0};
554 RUInt64BE fMaxKeySize{0};
556 static constexpr std::uint32_t
GetSizePlusChecksum() {
return sizeof(RTFNTuple) +
sizeof(std::uint64_t); }
558 RTFNTuple() =
default;
573 std::uint32_t GetSize()
const {
return sizeof(RTFNTuple); }
575 std::uint32_t
GetOffsetCkData() {
return sizeof(fByteCount) +
sizeof(fVersionClass); }
581struct RBareFileHeader {
582 char fMagic[7]{
'r',
'n',
't',
'u',
'p',
'l',
'e'};
585 RUInt32BE fFormatVersion{1};
586 RUInt32BE fCompress{0};
673 if (std::string(
ident, 4) ==
"root")
682 std::string_view typeName)
695 for (
unsigned int i = 0; i <
nKeys; ++i) {
699 offset += key.GetHeaderSize();
703 if (std::string_view(
name.fData,
name.fLName) != typeName) {
711 return key.GetSeekKey();
728 R__ASSERT(fNbytesKeyAndInfo >= key.fKeyLen);
729 const std::uint64_t
nbytesInfo = fNbytesKeyAndInfo - key.fKeyLen;
730 const std::uint64_t
seekInfo = fSeekKeyInfo + key.fKeyLen;
752 auto obj =
lnk->GetObject();
769 fNbytesKeyAndInfo =
fileHeader.GetNbytesInfo();
786 auto pos = std::string::npos;
793 return R__FAIL(
"no directory named '" + std::string(
directoryName) +
"' in file '" + fRawFile->GetUrl() +
"'");
796 offset = key.GetSeekKey() + key.fKeyLen;
803 return R__FAIL(
"no RNTuple named '" + std::string(
ntupleName) +
"' in file '" + fRawFile->GetUrl() +
"'");
807 offset = key.GetSeekKey() + key.fKeyLen;
811 static_assert(
kMinNTupleSize == RTFNTuple::GetSizePlusChecksum());
813 return R__FAIL(
"invalid anchor size: " + std::to_string(key.fObjLen) +
" < " + std::to_string(
sizeof(RTFNTuple)));
816 const auto objNbytes = key.GetSize() - key.fKeyLen;
848 ckOnDisk =
static_cast<uint64_t
>(*ckOnDiskPtr);
850 return R__FAIL(
"RNTuple anchor checksum mismatch");
868 return R__FAIL(
"expected RNTuple named '" + std::string(
ntupleName) +
"' but instead found '" +
869 std::string(
foundName) +
"' in file '" + fRawFile->GetUrl() +
"'");
879 return R__FAIL(
"RNTuple bare file: anchor checksum mismatch");
894 return R__FAIL(
"invalid read (expected bytes: " + std::to_string(
expected) +
", read: " + std::to_string(
nread) +
899 if (fMaxKeySize == 0 ||
nbytes <= fMaxKeySize) {
907 uint8_t *
bufCur =
reinterpret_cast<uint8_t *
>(buffer);
911 if (
nread != fMaxKeySize)
956 unsigned char buffer[kBlobKeyLen])
983 static_assert(kHeaderBlockSize % kBlockAlign == 0,
"invalid header block size");
984 if (bufferSize % kBlockAlign != 0)
985 throw RException(
R__FAIL(
"Buffer size not a multiple of alignment: " + std::to_string(bufferSize)));
989 fShared = std::make_shared<RSharedData>(
nullptr);
991 fShared->fBlockSize = bufferSize;
992 fShared->fControlBlock = std::make_unique<ROOT::Internal::RTFileControlBlock>();
995 fShared->fHeaderBlock =
static_cast<unsigned char *
>(
::operator new[](kHeaderBlockSize,
blockAlign));
996 memset(fShared->fHeaderBlock, 0, kHeaderBlockSize);
997 fShared->fBlock =
static_cast<unsigned char *
>(
::operator new[](fShared->fBlockSize,
blockAlign));
998 memset(fShared->fBlock, 0, fShared->fBlockSize);
1032 if (shared.fBlockOffset == 0) {
1044 std::size_t
lastBlockSize = shared.fFilePos - shared.fBlockOffset;
1046 if (shared.fDirectIO) {
1057 if (shared.fBlockOffset > 0) {
1078 if ((
offset >= 0) && (
static_cast<std::uint64_t
>(
offset) != shared.fFilePos)) {
1079 shared.fFilePos =
offset;
1091 R__ASSERT(shared.fFilePos >= shared.fBlockOffset);
1094 std::uint64_t
posInBlock = shared.fFilePos % shared.fBlockSize;
1102 retval =
fwrite(shared.fBlock, 1, shared.fBlockSize, shared.fFile);
1103 if (
retval != shared.fBlockSize)
1107 memset(shared.fBlock, 0, shared.fBlockSize);
1111 std::size_t blockSize =
nbytes;
1112 if (blockSize > shared.fBlockSize -
posInBlock) {
1116 buffer =
static_cast<const unsigned char *
>(buffer) + blockSize;
1118 shared.fFilePos += blockSize;
1125 const std::string &className,
const std::string &objectName,
1126 const std::string &title)
1131 shared.fKeyOffset =
offset;
1137 Write(&key, key.GetHeaderSize(), shared.fKeyOffset);
1172template <
typename T>
1190 if (
keyBlob.WasAllocatedInAFreeSlot()) {
1204 fDirectory->GetFile()->Seek(
offset);
1205 bool rv = fDirectory->GetFile()->WriteBuffer((
char *)(buffer),
nbytes);
1223 bool rv = file->WriteBuffer((
char *)(buffer),
nbytes);
1249std::unique_ptr<ROOT::Internal::RNTupleFileWriter>
1253 std::string fileName(path);
1254 size_t idxDirSep = fileName.find_last_of(
"\\/");
1267 int fd = open(std::string(path).c_str(), flags, 0666);
1285 auto writer = std::unique_ptr<RNTupleFileWriter>(
1291 writer->fFileName = fileName;
1296 case EContainerFormat::kBare:
1300 default:
R__ASSERT(
false &&
"Internal error: unhandled container format");
1306std::unique_ptr<ROOT::Internal::RNTupleFileWriter>
1312 throw RException(
R__FAIL(
"invalid attempt to add an RNTuple to a directory that is not backed by a file"));
1321std::unique_ptr<ROOT::Internal::RNTupleFileWriter>
1327 rfile.fFile = &file;
1333std::unique_ptr<ROOT::Internal::RNTupleFileWriter>
1336 if (
auto *tfile = std::get_if<RImplTFile>(&fFile)) {
1337 return Append(
ntupleName, *tfile->fDirectory, fNTupleAnchor.fMaxKeySize,
true);
1338 }
else if (
auto *file = std::get_if<RImplSimple>(&fFile)) {
1342 auto writer = std::unique_ptr<RNTupleFileWriter>(
1373 buf.SetParent(file);
1374 for (
auto [
_,
info] : fStreamerInfoMap)
1380 anchorInfo.fLength = RTFNTuple{}.GetSize() +
sizeof(std::uint64_t);
1383 if (
auto fileProper = std::get_if<RImplTFile>(&fFile)) {
1385 fileProper->fDirectory->WriteObject(&fNTupleAnchor, fNTupleName.c_str());
1387 auto key =
static_cast<TKey *
>(
fileProper->fDirectory->GetListOfKeys()->FindObject(fNTupleName.c_str()));
1389 anchorInfo.fLocator.SetPosition(key->GetSeekKey() + key->GetKeylen());
1390 anchorInfo.fLocator.SetNBytesOnStorage(key->GetNbytes() - key->GetKeylen());
1398 fileProper->fDirectory->GetListOfKeys()->Remove(key);
1400 }
else if (
auto fileRFile = std::get_if<RImplRFile>(&fFile)) {
1404 auto key =
fileRFile->fFile->GetKeyInfo(fNTupleName);
1406 anchorInfo.fLocator.SetPosition(key->GetSeekKey() + key->GetNBytesKey());
1407 anchorInfo.fLocator.SetNBytesOnStorage(key->GetNBytesObj());
1411 auto &
fileSimple = std::get<RImplSimple>(fFile);
1424 anchorInfo.fLocator.SetPosition(shared.fControlBlock->fSeekNTuple);
1429 WriteTFileKeysList(
anchorInfo.fLocator.GetNBytesOnStorage());
1431 WriteTFileFreeList();
1434 memcpy(shared.fHeaderBlock, &shared.fControlBlock->fHeader, shared.fControlBlock->fHeader.GetSize());
1435 R__ASSERT(shared.fControlBlock->fSeekFileRecord + shared.fControlBlock->fFileRecord.GetSize() <
1436 RImplSimple::kHeaderBlockSize);
1437 memcpy(shared.fHeaderBlock + shared.fControlBlock->fSeekFileRecord, &shared.fControlBlock->fFileRecord,
1438 shared.fControlBlock->fFileRecord.GetSize());
1456 const std::uint64_t
maxKeySize = fNTupleAnchor.fMaxKeySize;
1460 if (
static_cast<std::uint64_t
>(
len) >
static_cast<std::uint64_t
>(std::numeric_limits<std::uint32_t>::max()))
1520 if (
auto *
fileSimple = std::get_if<RImplSimple>(&fFile)) {
1527 }
else if (
auto *
fileProper = std::get_if<RImplTFile>(&fFile)) {
1530 auto &
fileRFile = std::get<RImplRFile>(fFile);
1538 if (
auto *
fileSimple = std::get_if<RImplSimple>(&fFile)) {
1540 }
else if (
auto *
fileProper = std::get_if<RImplTFile>(&fFile)) {
1543 auto &
fileRFile = std::get<RImplRFile>(fFile);
1552 fNTupleAnchor.fNBytesHeader =
nbytes;
1553 fNTupleAnchor.fSeekHeader =
offset;
1561 fNTupleAnchor.fNBytesFooter =
nbytes;
1562 fNTupleAnchor.fSeekFooter =
offset;
1570 auto &
fileSimple = std::get<RImplSimple>(fFile);
1592 for (
auto [
_,
info] : fStreamerInfoMap) {
1605 auto &
fileSimple = std::get<RImplSimple>(fFile);
1622 fileSimple.fShared->fControlBlock->fHeader.GetSeekInfo(), RTFHeader::kBEGIN,
"TList",
1623 "StreamerInfo",
"Doubly linked list");
1625 fileSimple.fShared->fControlBlock->fHeader.GetSeekInfo());
1635 auto &
fileSimple = std::get<RImplSimple>(fFile);
1645 fileSimple.fShared->fControlBlock->fFileRecord.GetSeekKeys());
1655 fileSimple.fShared->fControlBlock->fFileRecord.fNBytesKeys =
1662 auto &
fileSimple = std::get<RImplSimple>(fFile);
1673 fileSimple.fShared->fControlBlock->fHeader.GetSeekFree(), RTFHeader::kBEGIN,
"", fFileName,
"");
1675 fileSimple.fShared->fControlBlock->fHeader.GetSeekFree());
1687 auto &
fileSimple = std::get<RImplSimple>(fFile);
1690 char keyBuf[RTFNTuple::GetSizePlusChecksum()];
1697 char zipAnchor[RTFNTuple::GetSizePlusChecksum()];
1703 RTFHeader::kBEGIN,
"ROOT::RNTuple", fNTupleName,
"");
1718 auto &
fileSimple = std::get<RImplSimple>(fFile);
1741 fileSimple.fShared->fControlBlock->fFileRecord.GetSize());
1746 for (
int i = 0; i < 3; ++i)
T ReadBuffer(TBufferFile *buf)
One of the template functions used to read objects from messages.
#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
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()
Load the streamer info from the file into the global list of streamer infos.
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.
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.
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.
ROOT::Internal::RNTupleLink WriteTFileNTupleKey(int compression)
The only key that will be visible in file->ls() Returns the link to the RNTuple anchor.
void WriteTFileStreamerInfo(int compression)
Write the compressed streamer info record with the description of the RNTuple class.
std::string fNTupleName
The identifier of the RNTuple; A single writer object can only write a single RNTuple but multiple wr...
void WriteTFileKeysList(std::uint64_t anchorSize)
Write the TList with the RNTuple key.
void WriteBareFileSkeleton(int defaultCompression)
For a bare file, which is necessarily written by a C file stream, write file header.
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])
static std::unique_ptr< RNTupleFileWriter > Append(std::string_view ntupleName, TDirectory &fileOrDirectory, std::uint64_t maxKeySize, bool isHidden)
The directory parameter can also be a TFile object (TFile inherits from TDirectory).
void WriteTFileFreeList()
Last record in the file.
std::unique_ptr< RNTupleFileWriter > CloneAsHidden(std::string_view ntupleName) const
Creates a new RNTupleFileWriter with the same underlying TDirectory as this but writing to a differen...
void WriteTFileSkeleton(int defaultCompression)
For a TFile container written by a C file stream, write the header and TFile object.
RNTupleFileWriter(std::string_view name, std::uint64_t maxKeySize, bool isHidden)
Private constructor used by all factory methods.
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 constexpr std::size_t kBlobKeyLen
The key length of a blob. It is always a big key (version > 1000) with class name RBlob.
RNTupleLink Commit(int compression=RCompressionSetting::EDefaults::kUseGeneralPurpose)
Writes the RNTuple key to the file so that the header and footer keys can be found.
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...
bool fIsHidden
True if this RNTuple's anchor must be stored as a hidden key (this is the case e.g....
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.
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 SetBufferDisplacement() override
void SetBufferOffset(Int_t offset=0)
Describe directory structure in memory.
A file, usually with extension .root, that stores data and code in the form of serialized objects in ...
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...
static TUUID UUIDv4()
Create a UUID version 4 (variant 1) UUID according to RFC 4122.
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)
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.
void AllocateBuffers(std::size_t bufferSize)
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 ...
static constexpr int kBlockAlign
Direct I/O requires that all buffers and write lengths are aligned.
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.
static constexpr std::size_t kHeaderBlockSize
During commit, WriteTFileKeysList() updates fNBytesKeys and fSeekKeys of the RTFFile located at fSeek...
std::shared_ptr< RSharedData > fShared
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.
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.
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