reftable/record: extract function to decode key lengths
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>
Patrick Steinhardt committed
Apr 3, 2024 at 08:04 UTC
cd75790707fe0068abff6729f0697e26c3630702
2 files changed
+31
-9
reftable/record.c
+25
-9
@@ -159,26 +159,42 @@ int reftable_encode_key(int *restart, struct string_view dest,
159
return start.len - dest.len;
160
}
161
162
-int reftable_decode_key(struct strbuf *last_key, uint8_t *extra,
163
- struct string_view in)
162
+int reftable_decode_keylen(struct string_view in,
163
+ uint64_t *prefix_len,
164
+ uint64_t *suffix_len,
165
+ uint8_t *extra)
166
{
165
- int start_len = in.len;
166
- uint64_t prefix_len = 0;
167
- uint64_t suffix_len = 0;
167
+ size_t start_len = in.len;
168
int n;
169
170
- n = get_var_int(&prefix_len, &in);
170
+ n = get_var_int(prefix_len, &in);
171
if (n < 0)
172
return -1;
173
string_view_consume(&in, n);
174
175
- n = get_var_int(&suffix_len, &in);
175
+ n = get_var_int(suffix_len, &in);
176
if (n <= 0)
177
return -1;
178
string_view_consume(&in, n);
179
180
- *extra = (uint8_t)(suffix_len & 0x7);
181
- suffix_len >>= 3;
180
+ *extra = (uint8_t)(*suffix_len & 0x7);
181
+ *suffix_len >>= 3;
182
+
183
+ return start_len - in.len;
184
+}
185
+
186
+int reftable_decode_key(struct strbuf *last_key, uint8_t *extra,
187
+ struct string_view in)
188
+{
189
+ int start_len = in.len;
190
+ uint64_t prefix_len = 0;
191
+ uint64_t suffix_len = 0;
192
+ int n;
193
+
194
+ n = reftable_decode_keylen(in, &prefix_len, &suffix_len, extra);
195
+ if (n < 0)
196
+ return -1;
197
+ string_view_consume(&in, n);
198
199
if (in.len < suffix_len ||
200
prefix_len > last_key->len)
reftable/record.h
+6
@@ -86,6 +86,12 @@ int reftable_encode_key(int *is_restart, struct string_view dest,
86
struct strbuf prev_key, struct strbuf key,
87
uint8_t extra);
88
89
+/* Decode a record's key lengths. */
90
+int reftable_decode_keylen(struct string_view in,
91
+ uint64_t *prefix_len,
92
+ uint64_t *suffix_len,
93
+ uint8_t *extra);
94
+
95
/*
96
* Decode into `last_key` and `extra` from `in`. `last_key` is expected to
97
* contain the decoded key of the preceding record, if any.