Skip to content

Commit d76f0d3

Browse files
pks-tgitster
authored andcommitted
reftable/generic: adapt interface to allow reuse of iterators
Refactor the interfaces exposed by `struct reftable_table` and `struct reftable_iterator` such that they support iterator reuse. This is done by separating initialization of the iterator and seeking on it. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 5bf96e0 commit d76f0d3

File tree

4 files changed

+68
-22
lines changed

4 files changed

+68
-22
lines changed

reftable/generic.c

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,38 +20,58 @@ void table_init_iter(struct reftable_table *tab,
2020
tab->ops->init_iter(tab->table_arg, it, typ);
2121
}
2222

23-
int reftable_table_seek_ref(struct reftable_table *tab,
24-
struct reftable_iterator *it, const char *name)
23+
void reftable_table_init_ref_iter(struct reftable_table *tab,
24+
struct reftable_iterator *it)
25+
{
26+
table_init_iter(tab, it, BLOCK_TYPE_REF);
27+
}
28+
29+
void reftable_table_init_log_iter(struct reftable_table *tab,
30+
struct reftable_iterator *it)
31+
{
32+
table_init_iter(tab, it, BLOCK_TYPE_LOG);
33+
}
34+
35+
int reftable_iterator_seek_ref(struct reftable_iterator *it,
36+
const char *name)
2537
{
2638
struct reftable_record want = {
2739
.type = BLOCK_TYPE_REF,
2840
.u.ref = {
2941
.refname = (char *)name,
3042
},
3143
};
32-
table_init_iter(tab, it, BLOCK_TYPE_REF);
3344
return it->ops->seek(it->iter_arg, &want);
3445
}
3546

36-
int reftable_table_seek_log(struct reftable_table *tab,
37-
struct reftable_iterator *it, const char *name)
47+
int reftable_iterator_seek_log_at(struct reftable_iterator *it,
48+
const char *name, uint64_t update_index)
3849
{
3950
struct reftable_record want = {
4051
.type = BLOCK_TYPE_LOG,
4152
.u.log = {
4253
.refname = (char *)name,
43-
.update_index = ~((uint64_t)0),
54+
.update_index = update_index,
4455
},
4556
};
46-
table_init_iter(tab, it, BLOCK_TYPE_LOG);
4757
return it->ops->seek(it->iter_arg, &want);
4858
}
4959

60+
int reftable_iterator_seek_log(struct reftable_iterator *it,
61+
const char *name)
62+
{
63+
return reftable_iterator_seek_log_at(it, name, ~((uint64_t) 0));
64+
}
65+
5066
int reftable_table_read_ref(struct reftable_table *tab, const char *name,
5167
struct reftable_ref_record *ref)
5268
{
5369
struct reftable_iterator it = { NULL };
54-
int err = reftable_table_seek_ref(tab, &it, name);
70+
int err;
71+
72+
reftable_table_init_ref_iter(tab, &it);
73+
74+
err = reftable_iterator_seek_ref(&it, name);
5575
if (err)
5676
goto done;
5777

@@ -76,10 +96,13 @@ int reftable_table_print(struct reftable_table *tab) {
7696
struct reftable_ref_record ref = { NULL };
7797
struct reftable_log_record log = { NULL };
7898
uint32_t hash_id = reftable_table_hash_id(tab);
79-
int err = reftable_table_seek_ref(tab, &it, "");
80-
if (err < 0) {
99+
int err;
100+
101+
reftable_table_init_ref_iter(tab, &it);
102+
103+
err = reftable_iterator_seek_ref(&it, "");
104+
if (err < 0)
81105
return err;
82-
}
83106

84107
while (1) {
85108
err = reftable_iterator_next_ref(&it, &ref);
@@ -94,10 +117,12 @@ int reftable_table_print(struct reftable_table *tab) {
94117
reftable_iterator_destroy(&it);
95118
reftable_ref_record_release(&ref);
96119

97-
err = reftable_table_seek_log(tab, &it, "");
98-
if (err < 0) {
120+
reftable_table_init_log_iter(tab, &it);
121+
122+
err = reftable_iterator_seek_log(&it, "");
123+
if (err < 0)
99124
return err;
100-
}
125+
101126
while (1) {
102127
err = reftable_iterator_next_log(&it, &log);
103128
if (err > 0) {

reftable/iter.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ static int filtering_ref_iterator_next(void *iter_arg,
4545
if (fri->double_check) {
4646
struct reftable_iterator it = { NULL };
4747

48-
err = reftable_table_seek_ref(&fri->tab, &it,
49-
ref->refname);
50-
if (err == 0) {
48+
reftable_table_init_ref_iter(&fri->tab, &it);
49+
50+
err = reftable_iterator_seek_ref(&it, ref->refname);
51+
if (err == 0)
5152
err = reftable_iterator_next_ref(&it, ref);
52-
}
5353

5454
reftable_iterator_destroy(&it);
5555

reftable/reftable-generic.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ struct reftable_table {
2121
void *table_arg;
2222
};
2323

24-
int reftable_table_seek_log(struct reftable_table *tab,
25-
struct reftable_iterator *it, const char *name);
24+
void reftable_table_init_ref_iter(struct reftable_table *tab,
25+
struct reftable_iterator *it);
2626

27-
int reftable_table_seek_ref(struct reftable_table *tab,
28-
struct reftable_iterator *it, const char *name);
27+
void reftable_table_init_log_iter(struct reftable_table *tab,
28+
struct reftable_iterator *it);
2929

3030
/* returns the hash ID from a generic reftable_table */
3131
uint32_t reftable_table_hash_id(struct reftable_table *tab);

reftable/reftable-iterator.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,33 @@ struct reftable_iterator {
2121
void *iter_arg;
2222
};
2323

24+
/*
25+
* Position the iterator at the ref record with given name such that the next
26+
* call to `next_ref()` would yield the record.
27+
*/
28+
int reftable_iterator_seek_ref(struct reftable_iterator *it,
29+
const char *name);
30+
2431
/* reads the next reftable_ref_record. Returns < 0 for error, 0 for OK and > 0:
2532
* end of iteration.
2633
*/
2734
int reftable_iterator_next_ref(struct reftable_iterator *it,
2835
struct reftable_ref_record *ref);
2936

37+
/*
38+
* Position the iterator at the log record with given name and update index
39+
* such that the next call to `next_log()` would yield the record.
40+
*/
41+
int reftable_iterator_seek_log_at(struct reftable_iterator *it,
42+
const char *name, uint64_t update_index);
43+
44+
/*
45+
* Position the iterator at the newest log record with given name such that the
46+
* next call to `next_log()` would yield the record.
47+
*/
48+
int reftable_iterator_seek_log(struct reftable_iterator *it,
49+
const char *name);
50+
3051
/* reads the next reftable_log_record. Returns < 0 for error, 0 for OK and > 0:
3152
* end of iteration.
3253
*/

0 commit comments

Comments
 (0)