]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reftable/block: create public interface for reading blocks
authorPatrick Steinhardt <ps@pks.im>
Mon, 7 Apr 2025 13:16:21 +0000 (15:16 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 7 Apr 2025 21:53:11 +0000 (14:53 -0700)
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>
reftable/basics.h
reftable/block.h
reftable/reftable-basics.h
reftable/reftable-block.h [new file with mode: 0644]

index 96a2f0d38299ff9aace5f8a6a6c0327724b147c6..d8888c126290cf012ec15128b425f835e3e6cd5b 100644 (file)
 
 #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.
index 422e2f872c5acab2629645259be6186b4928f5b8..4f7f29028c4602bf431a5807f13a4b331dd05b22 100644 (file)
@@ -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. */
index ed7c7c9ac2c0eb8db9c5ec4f3487168429f3ea37..6d73f19c85b6d3cb3cd75316a770d765bc45554d 100644 (file)
 
 #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
diff --git a/reftable/reftable-block.h b/reftable/reftable-block.h
new file mode 100644 (file)
index 0000000..13bd68b
--- /dev/null
@@ -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 */