reftable/merged: adapt interface to allow reuse of iterators
Refactor the interfaces exposed by `struct reftable_merged_table` and `struct merged_iter` such that they support iterator reuse. This is done by separating initialization of the iterator and seeking on it. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Patrick Steinhardt committed
May 13, 2024 at 10:48 UTC
369b84196e5b12496a18d4ea683b507bd0f1d953
4 files changed
+22
-61
reftable/merged.c
-35
@@ -262,41 +262,6 @@ void merged_table_init_iter(struct reftable_merged_table *mt,
262
iterator_from_merged_iter(it, mi);
263
}
264
265
-int reftable_merged_table_seek_ref(struct reftable_merged_table *mt,
266
- struct reftable_iterator *it,
267
- const char *name)
268
-{
269
- struct reftable_record rec = {
270
- .type = BLOCK_TYPE_REF,
271
- .u.ref = {
272
- .refname = (char *)name,
273
- },
274
- };
275
- merged_table_init_iter(mt, it, BLOCK_TYPE_REF);
276
- return iterator_seek(it, &rec);
277
-}
278
-
279
-int reftable_merged_table_seek_log_at(struct reftable_merged_table *mt,
280
- struct reftable_iterator *it,
281
- const char *name, uint64_t update_index)
282
-{
283
- struct reftable_record rec = { .type = BLOCK_TYPE_LOG,
284
- .u.log = {
285
- .refname = (char *)name,
286
- .update_index = update_index,
287
- } };
288
- merged_table_init_iter(mt, it, BLOCK_TYPE_LOG);
289
- return iterator_seek(it, &rec);
290
-}
291
-
292
-int reftable_merged_table_seek_log(struct reftable_merged_table *mt,
293
- struct reftable_iterator *it,
294
- const char *name)
295
-{
296
- uint64_t max = ~((uint64_t)0);
297
- return reftable_merged_table_seek_log_at(mt, it, name, max);
298
-}
299
-
265
uint32_t reftable_merged_table_hash_id(struct reftable_merged_table *mt)
266
{
267
return mt->hash_id;
reftable/merged_test.c
+13
-6
@@ -12,6 +12,7 @@ https://developers.google.com/open-source/licenses/bsd
12
13
#include "basics.h"
14
#include "blocksource.h"
15
+#include "constants.h"
16
#include "reader.h"
17
#include "record.h"
18
#include "test_framework.h"
@@ -145,7 +146,10 @@ static void test_merged_between(void)
146
int i;
147
struct reftable_ref_record ref = { NULL };
148
struct reftable_iterator it = { NULL };
148
- int err = reftable_merged_table_seek_ref(mt, &it, "a");
149
+ int err;
150
+
151
+ merged_table_init_iter(mt, &it, BLOCK_TYPE_REF);
152
+ err = reftable_iterator_seek_ref(&it, "a");
153
EXPECT_ERR(err);
154
155
err = reftable_iterator_next_ref(&it, &ref);
@@ -217,14 +221,15 @@ static void test_merged(void)
221
struct reftable_reader **readers = NULL;
222
struct reftable_merged_table *mt =
223
merged_table_from_records(refs, &bs, &readers, sizes, bufs, 3);
220
-
224
struct reftable_iterator it = { NULL };
222
- int err = reftable_merged_table_seek_ref(mt, &it, "a");
225
+ int err;
226
struct reftable_ref_record *out = NULL;
227
size_t len = 0;
228
size_t cap = 0;
229
int i = 0;
230
231
+ merged_table_init_iter(mt, &it, BLOCK_TYPE_REF);
232
+ err = reftable_iterator_seek_ref(&it, "a");
233
EXPECT_ERR(err);
234
EXPECT(reftable_merged_table_hash_id(mt) == GIT_SHA1_FORMAT_ID);
235
EXPECT(reftable_merged_table_min_update_index(mt) == 1);
@@ -348,14 +353,15 @@ static void test_merged_logs(void)
353
struct reftable_reader **readers = NULL;
354
struct reftable_merged_table *mt = merged_table_from_log_records(
355
logs, &bs, &readers, sizes, bufs, 3);
351
-
356
struct reftable_iterator it = { NULL };
353
- int err = reftable_merged_table_seek_log(mt, &it, "a");
357
+ int err;
358
struct reftable_log_record *out = NULL;
359
size_t len = 0;
360
size_t cap = 0;
361
int i = 0;
362
363
+ merged_table_init_iter(mt, &it, BLOCK_TYPE_LOG);
364
+ err = reftable_iterator_seek_log(&it, "a");
365
EXPECT_ERR(err);
366
EXPECT(reftable_merged_table_hash_id(mt) == GIT_SHA1_FORMAT_ID);
367
EXPECT(reftable_merged_table_min_update_index(mt) == 1);
@@ -377,7 +383,8 @@ static void test_merged_logs(void)
383
GIT_SHA1_RAWSZ));
384
}
385
380
- err = reftable_merged_table_seek_log_at(mt, &it, "a", 2);
386
+ merged_table_init_iter(mt, &it, BLOCK_TYPE_LOG);
387
+ err = reftable_iterator_seek_log_at(&it, "a", 2);
388
EXPECT_ERR(err);
389
reftable_log_record_release(&out[0]);
390
err = reftable_iterator_next_log(&it, &out[0]);
reftable/reftable-merged.h
-15
@@ -36,21 +36,6 @@ int reftable_new_merged_table(struct reftable_merged_table **dest,
36
struct reftable_table *stack, size_t n,
37
uint32_t hash_id);
38
39
-/* returns an iterator positioned just before 'name' */
40
-int reftable_merged_table_seek_ref(struct reftable_merged_table *mt,
41
- struct reftable_iterator *it,
42
- const char *name);
43
-
44
-/* returns an iterator for log entry, at given update_index */
45
-int reftable_merged_table_seek_log_at(struct reftable_merged_table *mt,
46
- struct reftable_iterator *it,
47
- const char *name, uint64_t update_index);
48
-
49
-/* like reftable_merged_table_seek_log_at but look for the newest entry. */
50
-int reftable_merged_table_seek_log(struct reftable_merged_table *mt,
51
- struct reftable_iterator *it,
52
- const char *name);
53
-
39
/* returns the max update_index covered by this merged table. */
40
uint64_t
41
reftable_merged_table_max_update_index(struct reftable_merged_table *mt);
reftable/stack.c
+9
-5
@@ -925,7 +925,8 @@ static int stack_write_compact(struct reftable_stack *st,
925
goto done;
926
}
927
928
- err = reftable_merged_table_seek_ref(mt, &it, "");
928
+ merged_table_init_iter(mt, &it, BLOCK_TYPE_REF);
929
+ err = reftable_iterator_seek_ref(&it, "");
930
if (err < 0)
931
goto done;
932
@@ -949,7 +950,8 @@ static int stack_write_compact(struct reftable_stack *st,
950
}
951
reftable_iterator_destroy(&it);
952
952
- err = reftable_merged_table_seek_log(mt, &it, "");
953
+ merged_table_init_iter(mt, &it, BLOCK_TYPE_LOG);
954
+ err = reftable_iterator_seek_log(&it, "");
955
if (err < 0)
956
goto done;
957
@@ -1340,9 +1342,11 @@ int reftable_stack_read_ref(struct reftable_stack *st, const char *refname,
1342
int reftable_stack_read_log(struct reftable_stack *st, const char *refname,
1343
struct reftable_log_record *log)
1344
{
1343
- struct reftable_iterator it = { NULL };
1344
- struct reftable_merged_table *mt = reftable_stack_merged_table(st);
1345
- int err = reftable_merged_table_seek_log(mt, &it, refname);
1345
+ struct reftable_iterator it = {0};
1346
+ int err;
1347
+
1348
+ reftable_stack_init_log_iterator(st, &it);
1349
+ err = reftable_iterator_seek_log(&it, refname);
1350
if (err)
1351
goto done;
1352