Skip to content

Commit cd75790

Browse files
pks-tgitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent f9e8854 commit cd75790

File tree

2 files changed

+31
-9
lines changed

2 files changed

+31
-9
lines changed

reftable/record.c

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -159,26 +159,42 @@ int reftable_encode_key(int *restart, struct string_view dest,
159159
return start.len - dest.len;
160160
}
161161

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)
164166
{
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;
168168
int n;
169169

170-
n = get_var_int(&prefix_len, &in);
170+
n = get_var_int(prefix_len, &in);
171171
if (n < 0)
172172
return -1;
173173
string_view_consume(&in, n);
174174

175-
n = get_var_int(&suffix_len, &in);
175+
n = get_var_int(suffix_len, &in);
176176
if (n <= 0)
177177
return -1;
178178
string_view_consume(&in, n);
179179

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);
182198

183199
if (in.len < suffix_len ||
184200
prefix_len > last_key->len)

reftable/record.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ int reftable_encode_key(int *is_restart, struct string_view dest,
8686
struct strbuf prev_key, struct strbuf key,
8787
uint8_t extra);
8888

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+
8995
/*
9096
* Decode into `last_key` and `extra` from `in`. `last_key` is expected to
9197
* contain the decoded key of the preceding record, if any.

0 commit comments

Comments
 (0)