reftable/block: create public interface for reading blocks
While users of the reftable library wouldn't generally require access to
individual blocks in a reftable table, there are valid usecases where
one may require low-level access to them. One such upcoming usecase in
the Git codebase is to implement consistency checks for the reftable
library where we want to verify each block individually.
Create a public interface for reading blocks. The interface isn't yet
complete and lacks e.g. a way to read individual records from a block.
Such missing functionality will be backfilled in subsequent commits.
Note that this change also requires us to expose `reftable_buf`, which
is used by the `reftable_block_first_key()` function.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Patrick Steinhardt committedApr 7, 2025 at 15:16 UTC655e18d6b4f845090b0ba4761105b32726893ecb
4 files changed+78-54
reftable/basics.h
-7
index 96a2f0d382..d8888c1262 100644--- a/reftable/basics.h+++ b/reftable/basics.h@@ -18,13 +18,6 @@ #define REFTABLE_UNUSED __attribute__((__unused__))-struct reftable_buf {- size_t alloc;- size_t len;- char *buf;-};-#define REFTABLE_BUF_INIT { 0 }- /* * Initialize the buffer such that it is ready for use. This is equivalent to * using REFTABLE_BUF_INIT for stack-allocated variables.
reftable/block.h
+1-47
index 422e2f872c..4f7f29028c 100644--- a/reftable/block.h+++ b/reftable/block.h@@ -11,6 +11,7 @@ #include "basics.h" #include "record.h"+#include "reftable-block.h" #include "reftable-blocksource.h" /*@@ -62,53 +63,6 @@ int block_writer_finish(struct block_writer *w); /* clears out internally allocated block_writer members. */ void block_writer_release(struct block_writer *bw);-/*- * A block part of a reftable. Contains records as well as some metadata- * describing them.- */-struct reftable_block {- /* offset of the block header; nonzero for the first block in a- * reftable. */- uint32_t header_off;-- /* the memory block */- struct reftable_block_data block_data;- uint32_t hash_size;-- /* Uncompressed data for log entries. */- struct z_stream_s *zstream;- unsigned char *uncompressed_data;- size_t uncompressed_cap;-- /*- * Restart point data. Restart points are located after the block's- * record data.- */- uint16_t restart_count;- uint32_t restart_off;-- /* size of the data in the file. For log blocks, this is the compressed- * size. */- uint32_t full_block_size;- uint8_t block_type;-};--/*- * Initialize a reftable block from the given block source.- */-int reftable_block_init(struct reftable_block *b,- struct reftable_block_source *source,- uint32_t offset, uint32_t header_size,- uint32_t table_block_size, uint32_t hash_size);--void reftable_block_release(struct reftable_block *b);--/* Returns the block type (eg. 'r' for refs) */-uint8_t reftable_block_type(const struct reftable_block *b);--/* Decodes the first key in the block */-int reftable_block_first_key(const struct reftable_block *b, struct reftable_buf *key);- /* Iterate over entries in a block */ struct block_iter { /* offset within the block of the next entry to read. */
reftable/reftable-basics.h
+8
index ed7c7c9ac2..6d73f19c85 100644--- a/reftable/reftable-basics.h+++ b/reftable/reftable-basics.h@@ -11,6 +11,14 @@ #include <stddef.h>+/* A buffer that contains arbitrary byte slices. */+struct reftable_buf {+ size_t alloc;+ size_t len;+ char *buf;+};+#define REFTABLE_BUF_INIT { 0 }+ /* * Hash functions understood by the reftable library. Note that the values are * arbitrary and somewhat random such that we can easily detect cases where the
reftable/reftable-block.h
+69
new file mode 100644index 0000000000..13bd68be8c--- /dev/null+++ b/reftable/reftable-block.h@@ -0,0 +1,69 @@+/*+ * Copyright 2020 Google LLC+ *+ * Use of this source code is governed by a BSD-style+ * license that can be found in the LICENSE file or at+ * https://developers.google.com/open-source/licenses/bsd+ */++#ifndef REFTABLE_BLOCK_H+#define REFTABLE_BLOCK_H++#include <stdint.h>++#include "reftable-basics.h"+#include "reftable-blocksource.h"++struct z_stream_s;++/*+ * A block part of a reftable. Contains records as well as some metadata+ * describing them.+ */+struct reftable_block {+ /*+ * Offset of the block header; nonzero for the first block in a+ * reftable.+ */+ uint32_t header_off;++ /* The memory block. */+ struct reftable_block_data block_data;+ uint32_t hash_size;++ /* Uncompressed data for log entries. */+ struct z_stream_s *zstream;+ unsigned char *uncompressed_data;+ size_t uncompressed_cap;++ /*+ * Restart point data. Restart points are located after the block's+ * record data.+ */+ uint16_t restart_count;+ uint32_t restart_off;++ /*+ * Size of the data in the file. For log blocks, this is the compressed+ * size.+ */+ uint32_t full_block_size;+ uint8_t block_type;+};++/* Initialize a reftable block from the given block source. */+int reftable_block_init(struct reftable_block *b,+ struct reftable_block_source *source,+ uint32_t offset, uint32_t header_size,+ uint32_t table_block_size, uint32_t hash_size);++/* Release resources allocated by the block. */+void reftable_block_release(struct reftable_block *b);++/* Returns the block type (eg. 'r' for refs). */+uint8_t reftable_block_type(const struct reftable_block *b);++/* Decodes the first key in the block. */+int reftable_block_first_key(const struct reftable_block *b, struct reftable_buf *key);++#endif /* REFTABLE_BLOCK_H */