add flag to print rntuple names

This commit is contained in:
silverweed 2024-11-04 11:30:08 +01:00
parent 87b5a4a535
commit 5d73051e05
7 changed files with 42 additions and 13 deletions

View file

@ -10,6 +10,7 @@ void print_help(const char *argv0)
"\n\t-l: display LEN bytes (only in terminal mode)"
"\n\t-w: display WIDTH bytes per column"
"\n\t-e: display some extended info (may slow down the startup)"
"\n\t-n: list the names of the RNTuples found in the file and exit"
"\n"
"\nNOTE: if `ntuple_name' is not passed, rntviewer will look for the first RNTuple in the TFile."
"\n"
@ -23,6 +24,7 @@ struct Cmdline_Args {
u64 nbytes_displayed;
u16 n_cols;
b8 extended_info;
b8 only_print_rntuple_names;
String8 ntpl_name;
String8 file_name;
@ -109,6 +111,8 @@ Cmdline_Args parse_args(i32 argc, char **argv)
parse_int_arg(i, argc, argv, args.start_addr);
else if (arg[1] == 'l')
parse_int_arg(i, argc, argv, args.nbytes_displayed);
else if (arg[1] == 'n')
args.only_print_rntuple_names = true;
else if (arg[1] == 'w') {
u64 n_cols = 0;
parse_int_arg(i, argc, argv, n_cols);

View file

@ -106,7 +106,7 @@ String8_Node *display_val_rootzip(Arena *arena, String8_Node *prev, const char *
sn = push_str8_node_child(arena, sn, "Zip method: %s", zip_method.c());
sn = push_str8_node(arena, sn, "Compressed size: %s", to_pretty_size(arena, comp_size).c());
sn = push_str8_node(arena, sn, "Uncompressed size: %s", to_pretty_size(arena, uncomp_size).c());
sn = push_str8_node(arena, sn, "Comp. ratio: %.2f", (f32)comp_size / uncomp_size);
sn = push_str8_node(arena, sn, "Comp. ratio: %f", (f32)comp_size / uncomp_size);
return sn;
}

View file

@ -146,7 +146,7 @@ b8 get_tfile_data(Arena *arena, const Inspected_File &file, String8 &ntpl_name,
if (success) {
// If we weren't given a rntuple name, use the first one in the file (if any)
if (!ntpl_name.size && tfile_data.tkeys_data.rntuples)
ntpl_name = tfile_data.tkeys_data.rntuples->head->str;
ntpl_name = tfile_data.tkeys_data.rntuples->name;
if (ntpl_name.size) {
{ // DEBUG

View file

@ -100,11 +100,16 @@ struct Byte_Range_Node {
Byte_Range rng;
};
struct RNTuple_Anchor_Info {
RNTuple_Anchor_Info *next;
String8 name;
u64 offset_in_file;
};
struct TKeys_Data {
Section sections[Sec_COUNT];
// XXX: currently we're only using the first RNTuple of the file.
String8_Node *rntuples;
RNTuple_Anchor_Info *rntuples;
Byte_Range_Node *rblob_keys;
};

View file

@ -156,8 +156,14 @@ int main(int argc, char **argv)
b8 success = get_tfile_data(arena, app.inspected_file, app.ntpl_name, app.tfile_data);
if (!app.ntpl_name.str)
fprintf(stderr, "Warning: found no RNTuples in %s\n", args.file_name.c());
else if (success)
else if (success) {
if (args.only_print_rntuple_names) {
for (RNTuple_Anchor_Info *info = app.tfile_data.tkeys_data.rntuples; info; info = info->next)
printf("%s at 0x%" PRIX64 "\n", info->name.c(), info->offset_in_file);
return 0;
}
app.rndata = get_rntuple_data(arena, app.inspected_file, app.tfile_data, args.extended_info);
}
if (args.print_to_terminal) {
u64 nbytes_displayed = args.nbytes_displayed;

View file

@ -29,6 +29,17 @@ String8 str8_from_c(const char *str)
return String8 { (u8*)str, size };
}
internal
String8 str8_from_buf(Arena *arena, const u8 *buf, u64 size)
{
String8 s;
s.str = arena_push_array_nozero<u8>(arena, size + 1);
s.size = size;
s.str[size] = 0;
memcpy(s.str, buf, size);
return s;
}
internal
String8 to_pretty_size(Arena *arena, u64 bytes)
{

View file

@ -144,7 +144,6 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, TFile_Data &tfile_data
}
tkeys_data.sections[Sec_TKey_List].range.start = seek_keys;
printf("seek keys: 0x%lX\n", seek_keys);
// Read right away the tkey list information, so we have it even if the key walk fails to find it
u32 seek_keys_nbytes_be;
@ -160,6 +159,8 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, TFile_Data &tfile_data
cur = pre + tfile_obj_nbytes;
RNTuple_Anchor_Info *rntuple_info_tail = nullptr;
// Walk through all the TKeys in the file and do two things:
// 1. assign proper start, len and pre_size to all sections as we go
// 2. collect all RBlob keys and save them for later.
@ -218,15 +219,17 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, TFile_Data &tfile_data
if (key_has_class_name("ROOT::Experimental::RNTuple")) {
u64 name_off = cname_off + cname_len + 1;
u8 name_len = data[name_off];
RNTuple_Anchor_Info *rntuple_info = arena_push<RNTuple_Anchor_Info>(arena);
rntuple_info->offset_in_file = cur;
if (name_len) {
char name[256];
name[name_len] = 0;
memcpy(name, data + name_off + 1, name_len);
tkeys_data.rntuples = push_str8_node(arena, tkeys_data.rntuples, "%s", name);
} else {
tkeys_data.rntuples = push_str8_node(arena, tkeys_data.rntuples, "");
rntuple_info->name = str8_from_buf(arena, data + name_off + 1, name_len);
}
printf("Found RNTuple at 0x%lX: %s\n", cur, tkeys_data.rntuples->str.c());
if (rntuple_info_tail)
rntuple_info_tail->next = rntuple_info;
else
tkeys_data.rntuples = rntuple_info;
rntuple_info_tail = rntuple_info;
// printf("Found RNTuple at 0x%lX: %s\n", cur, tkeys_data.rntuples->str.c());
if (!tkeys_data.sections[Sec_RNTuple_Anchor].range.start) {
u64 anchor_seek = cur + keylen;