diff --git a/src/hover.cpp b/src/hover.cpp index 62f1949..0cffd34 100644 --- a/src/hover.cpp +++ b/src/hover.cpp @@ -942,7 +942,10 @@ struct Sec_Hover_Fn { const RNTuple_Anchor_Info *info = (const RNTuple_Anchor_Info *)section.info; titled_section(push_str8f(arena, "RNTuple Anchor \"%s;%hu\"", info->name.c(), info->cycle).c(), [this] { tkey(); - titled_section("Data", [this] { + b8 zipped = maybe_rootzip(); + if (zipped) { + range("Compressed payload", section.range.len - section.post_size - ROOTZIP_RANGE_LEN); + } else { field<u32>("Object len: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u32 x) { x = bswap(x); x -= 0x4000'0000; @@ -961,7 +964,7 @@ struct Sec_Hover_Fn { field_be<u64>("Len Footer: %u"); field_be<u64>("Max Key Size: %u"); field_le<u64>("Checksum: 0x%" PRIX64); - }, HoverSec_HideIfNotHovered); + } }); } diff --git a/src/tfile.cpp b/src/tfile.cpp index b0a37a9..a04c6ad 100644 --- a/src/tfile.cpp +++ b/src/tfile.cpp @@ -147,6 +147,7 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, u32 flags, TFile_Data } const u64 key_version_off = 4; + const u64 objlen_off = 6; const u64 keylen_off = 14; const u64 cycle_off = 16; @@ -224,6 +225,7 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, u32 flags, TFile_Data } u16 key_version = read_be<u16>(data + cur + key_version_off); + u32 objlen = read_be<u32>(data + cur + objlen_off); u16 keylen = read_be<u16>(data + cur + keylen_off); if (!keylen) { fprintf(stderr, "Error: found key or obj with len 0. Bailing out...\n"); @@ -304,7 +306,14 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, u32 flags, TFile_Data u64 anchor_seek = cur + keylen; RNTuple_Anchor_On_Disk anchor; - memcpy(&anchor, data + anchor_seek, sizeof(anchor)); + u32 obj_nbytes = n_bytes - keylen; + if (obj_nbytes != objlen) { + char zipped_anchor[sizeof(anchor)]; + memcpy(zipped_anchor, data + anchor_seek, sizeof(zipped_anchor)); + ROOT::Experimental::Internal::RNTupleDecompressor::Unzip(zipped_anchor, obj_nbytes, objlen, &anchor); + } else { + memcpy(&anchor, data + anchor_seek, sizeof(anchor)); + } rntuple_info->anchor = ROOT::Experimental::Internal::CreateAnchor( bswap(anchor.epoch_be), bswap(anchor.major_be), bswap(anchor.minor_be), bswap(anchor.patch_be),