@@ -1335,11 +1335,21 @@ ROOT::Internal::RNTupleFileWriter::Append(std::string_view ntupleName, ROOT::Exp
13351335std::unique_ptr<ROOT ::Internal::RNTupleFileWriter>
13361336ROOT ::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
13451355void 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