From: Junio C Hamano Date: Thu, 30 May 2024 21:15:12 +0000 (-0700) Subject: Merge branch 'ps/reftable-reusable-iterator' X-Git-Tag: v2.46.0-rc0~90 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=67ce50ba26;p=thirdparty%2Fgit.git Merge branch 'ps/reftable-reusable-iterator' Code clean-up to make the reftable iterator closer to be reusable. * ps/reftable-reusable-iterator: reftable/merged: adapt interface to allow reuse of iterators reftable/stack: provide convenience functions to create iterators reftable/reader: adapt interface to allow reuse of iterators reftable/generic: adapt interface to allow reuse of iterators reftable/generic: move seeking of records into the iterator reftable/merged: simplify indices for subiterators reftable/merged: split up initialization and seeking of records reftable/reader: set up the reader when initializing table iterator reftable/reader: inline `reader_seek_internal()` reftable/reader: separate concerns of table iter and reftable reader reftable/reader: unify indexed and linear seeking reftable/reader: avoid copying index iterator reftable/block: use `size_t` to track restart point index --- 67ce50ba26507e99c53dcd4b1d85ad8565a31c23 diff --cc reftable/reader.c index f23c8523db,bbdb4bdafa..29c99e2269 --- a/reftable/reader.c +++ b/reftable/reader.c @@@ -856,66 -820,3 +820,68 @@@ done reftable_reader_free(r); return err; } + +int reftable_reader_print_blocks(const char *tablename) +{ + struct { + const char *name; + int type; + } sections[] = { + { + .name = "ref", + .type = BLOCK_TYPE_REF, + }, + { + .name = "obj", + .type = BLOCK_TYPE_OBJ, + }, + { + .name = "log", + .type = BLOCK_TYPE_LOG, + }, + }; + struct reftable_block_source src = { 0 }; - struct table_iter ti = TABLE_ITER_INIT; + struct reftable_reader *r = NULL; ++ struct table_iter ti = { 0 }; + size_t i; + int err; + + err = reftable_block_source_from_file(&src, tablename); + if (err < 0) + goto done; + + err = reftable_new_reader(&r, &src, tablename); + if (err < 0) + goto done; + ++ table_iter_init(&ti, r); ++ + printf("header:\n"); + printf(" block_size: %d\n", r->block_size); + + for (i = 0; i < ARRAY_SIZE(sections); i++) { - err = reader_start(r, &ti, sections[i].type, 0); ++ err = table_iter_seek_start(&ti, sections[i].type, 0); + if (err < 0) + goto done; + if (err > 0) + continue; + + printf("%s:\n", sections[i].name); + + while (1) { + printf(" - length: %u\n", ti.br.block_len); + printf(" restarts: %u\n", ti.br.restart_count); + + err = table_iter_next_block(&ti); + if (err < 0) + goto done; + if (err > 0) + break; + } + } + +done: + reftable_reader_free(r); + table_iter_close(&ti); + return err; +}