Skip to content

Commit f7a7b61

Browse files
committed
[ntuple] add cloning for RImplSimple-based writer
1 parent 382330d commit f7a7b61

1 file changed

Lines changed: 19 additions & 10 deletions

File tree

tree/ntuple/src/RMiniFile.cxx

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,11 +1335,21 @@ ROOT::Internal::RNTupleFileWriter::Append(std::string_view ntupleName, ROOT::Exp
13351335
std::unique_ptr<ROOT::Internal::RNTupleFileWriter>
13361336
ROOT::Internal::RNTupleFileWriter::CloneAsHidden(std::string_view ntupleName) const
13371337
{
1338-
if (auto *file = std::get_if<RImplTFile>(&fFile)) {
1339-
return Append(ntupleName, *file->fDirectory, fNTupleAnchor.fMaxKeySize, /* hidden= */ true);
1340-
}
1341-
// TODO: support also non-TFile-based writers
1342-
throw ROOT::RException(R__FAIL("cannot clone a non-TFile-based RNTupleFileWriter."));
1338+
if (auto *tfile = std::get_if<RImplTFile>(&fFile)) {
1339+
return Append(ntupleName, *tfile->fDirectory, fNTupleAnchor.fMaxKeySize, /* hidden= */ true);
1340+
} else if (auto *file = std::get_if<RImplSimple>(&fFile)) {
1341+
if (fIsBare)
1342+
throw ROOT::RException(R__FAIL("cloning a bare file is currently unsupported"));
1343+
1344+
auto writer = std::unique_ptr<RNTupleFileWriter>(
1345+
new RNTupleFileWriter(ntupleName, fNTupleAnchor.GetMaxKeySize(), /*hidden=*/true));
1346+
auto &clonedFile = std::get<RImplSimple>(writer->fFile);
1347+
clonedFile.fShared = file->fShared;
1348+
clonedFile.fDirectIO = file->fDirectIO;
1349+
return writer;
1350+
}
1351+
// TODO: support also RFile-based writers
1352+
throw ROOT::RException(R__FAIL("cannot clone an RFile-based RNTupleFileWriter."));
13431353
}
13441354

13451355
void ROOT::Internal::RNTupleFileWriter::Seek(std::uint64_t offset)
@@ -1403,7 +1413,7 @@ ROOT::Internal::RNTupleLink ROOT::Internal::RNTupleFileWriter::Commit(int compre
14031413
// Writing by C file stream: prepare the container format header and stream the RNTuple anchor object
14041414
auto &fileSimple = std::get<RImplSimple>(fFile);
14051415
auto &shared = *fileSimple.fShared;
1406-
1416+
14071417
RTFNTuple ntupleOnDisk(fNTupleAnchor);
14081418
anchorInfo.fLocator.SetPosition(shared.fControlBlock->fSeekNTuple);
14091419

@@ -1423,12 +1433,11 @@ ROOT::Internal::RNTupleLink ROOT::Internal::RNTupleFileWriter::Commit(int compre
14231433
WriteTFileFreeList(); // NOTE: this is written uncompressed
14241434

14251435
// Update header and TFile record
1426-
memcpy(shared.fHeaderBlock, &shared.fControlBlock->fHeader,
1427-
shared.fControlBlock->fHeader.GetSize());
1436+
memcpy(shared.fHeaderBlock, &shared.fControlBlock->fHeader, shared.fControlBlock->fHeader.GetSize());
14281437
R__ASSERT(shared.fControlBlock->fSeekFileRecord + shared.fControlBlock->fFileRecord.GetSize() <
14291438
RImplSimple::kHeaderBlockSize);
1430-
memcpy(shared.fHeaderBlock + shared.fControlBlock->fSeekFileRecord,
1431-
&shared.fControlBlock->fFileRecord, shared.fControlBlock->fFileRecord.GetSize());
1439+
memcpy(shared.fHeaderBlock + shared.fControlBlock->fSeekFileRecord, &shared.fControlBlock->fFileRecord,
1440+
shared.fControlBlock->fFileRecord.GetSize());
14321441

14331442
fileSimple.Flush();
14341443

0 commit comments

Comments
 (0)