]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reftable/record: extract function to decode key lengths
authorPatrick Steinhardt <ps@pks.im>
Wed, 3 Apr 2024 06:04:22 +0000 (08:04 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 3 Apr 2024 16:16:50 +0000 (09:16 -0700)
We're about to refactor the binary search over restart points so that it
does not need to fully decode the record keys anymore. To do so we will
need to decode the record key lengths, which is non-trivial logic.

Extract the logic to decode these lengths from `refatble_decode_key()`
so that we can reuse it.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
reftable/record.c
reftable/record.h

index 23b497adab8b3478026959a802bddb58fb1c6002..5506f3e913860eb2b76c5db2e9f48cede4965bf3 100644 (file)
@@ -159,26 +159,42 @@ int reftable_encode_key(int *restart, struct string_view dest,
        return start.len - dest.len;
 }
 
-int reftable_decode_key(struct strbuf *last_key, uint8_t *extra,
-                       struct string_view in)
+int reftable_decode_keylen(struct string_view in,
+                          uint64_t *prefix_len,
+                          uint64_t *suffix_len,
+                          uint8_t *extra)
 {
-       int start_len = in.len;
-       uint64_t prefix_len = 0;
-       uint64_t suffix_len = 0;
+       size_t start_len = in.len;
        int n;
 
-       n = get_var_int(&prefix_len, &in);
+       n = get_var_int(prefix_len, &in);
        if (n < 0)
                return -1;
        string_view_consume(&in, n);
 
-       n = get_var_int(&suffix_len, &in);
+       n = get_var_int(suffix_len, &in);
        if (n <= 0)
                return -1;
        string_view_consume(&in, n);
 
-       *extra = (uint8_t)(suffix_len & 0x7);
-       suffix_len >>= 3;
+       *extra = (uint8_t)(*suffix_len & 0x7);
+       *suffix_len >>= 3;
+
+       return start_len - in.len;
+}
+
+int reftable_decode_key(struct strbuf *last_key, uint8_t *extra,
+                       struct string_view in)
+{
+       int start_len = in.len;
+       uint64_t prefix_len = 0;
+       uint64_t suffix_len = 0;
+       int n;
+
+       n = reftable_decode_keylen(in, &prefix_len, &suffix_len, extra);
+       if (n < 0)
+               return -1;
+       string_view_consume(&in, n);
 
        if (in.len < suffix_len ||
            prefix_len > last_key->len)
index 826ee1c55c3b64d2bf4cfe1a170cf99ca3511259..d778133e6ec56ccc1e17ad2d5b0435420dce6e29 100644 (file)
@@ -86,6 +86,12 @@ int reftable_encode_key(int *is_restart, struct string_view dest,
                        struct strbuf prev_key, struct strbuf key,
                        uint8_t extra);
 
+/* Decode a record's key lengths. */
+int reftable_decode_keylen(struct string_view in,
+                          uint64_t *prefix_len,
+                          uint64_t *suffix_len,
+                          uint8_t *extra);
+
 /*
  * Decode into `last_key` and `extra` from `in`. `last_key` is expected to
  * contain the decoded key of the preceding record, if any.