reftable/reader: separate concerns of table iter and reftable reader
In "reftable/reader.c" we implement two different interfaces: - The reftable reader contains the logic to read reftables. - The table iterator is used to iterate through a single reftable read by the reader. The way those two types are used in the code is somewhat confusing though because seeking inside a table is implemented as if it was part of the reftable reader, even though it is ultimately more of a detail implemented by the table iterator. Make the boundary between those two types clearer by renaming functions that seek records in a table such that they clearly belong to the table iterator's logic. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
dfdd1455bb
commit
81a03a3236
@ -386,9 +386,8 @@ static void iterator_from_table_iter(struct reftable_iterator *it,
|
|||||||
it->ops = &table_iter_vtable;
|
it->ops = &table_iter_vtable;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int reader_table_iter_at(struct reftable_reader *r,
|
static int table_iter_seek_to(struct table_iter *ti, struct reftable_reader *r,
|
||||||
struct table_iter *ti, uint64_t off,
|
uint64_t off, uint8_t typ)
|
||||||
uint8_t typ)
|
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@ -403,8 +402,8 @@ static int reader_table_iter_at(struct reftable_reader *r,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int reader_start(struct reftable_reader *r, struct table_iter *ti,
|
static int table_iter_seek_start(struct table_iter *ti, struct reftable_reader *r,
|
||||||
uint8_t typ, int index)
|
uint8_t typ, int index)
|
||||||
{
|
{
|
||||||
struct reftable_reader_offsets *offs = reader_offsets_for(r, typ);
|
struct reftable_reader_offsets *offs = reader_offsets_for(r, typ);
|
||||||
uint64_t off = offs->offset;
|
uint64_t off = offs->offset;
|
||||||
@ -416,11 +415,11 @@ static int reader_start(struct reftable_reader *r, struct table_iter *ti,
|
|||||||
typ = BLOCK_TYPE_INDEX;
|
typ = BLOCK_TYPE_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
return reader_table_iter_at(r, ti, off, typ);
|
return table_iter_seek_to(ti, r, off, typ);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int reader_seek_linear(struct table_iter *ti,
|
static int table_iter_seek_linear(struct table_iter *ti,
|
||||||
struct reftable_record *want)
|
struct reftable_record *want)
|
||||||
{
|
{
|
||||||
struct strbuf want_key = STRBUF_INIT;
|
struct strbuf want_key = STRBUF_INIT;
|
||||||
struct strbuf got_key = STRBUF_INIT;
|
struct strbuf got_key = STRBUF_INIT;
|
||||||
@ -499,9 +498,8 @@ done:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int reader_seek_indexed(struct table_iter *ti,
|
static int table_iter_seek_indexed(struct table_iter *ti,
|
||||||
struct reftable_reader *r,
|
struct reftable_record *rec)
|
||||||
struct reftable_record *rec)
|
|
||||||
{
|
{
|
||||||
struct reftable_record want_index = {
|
struct reftable_record want_index = {
|
||||||
.type = BLOCK_TYPE_INDEX, .u.idx = { .last_key = STRBUF_INIT }
|
.type = BLOCK_TYPE_INDEX, .u.idx = { .last_key = STRBUF_INIT }
|
||||||
@ -520,7 +518,7 @@ static int reader_seek_indexed(struct table_iter *ti,
|
|||||||
* highest layer that identifies the relevant index block as well as
|
* highest layer that identifies the relevant index block as well as
|
||||||
* the record inside that block that corresponds to our wanted key.
|
* the record inside that block that corresponds to our wanted key.
|
||||||
*/
|
*/
|
||||||
err = reader_seek_linear(ti, &want_index);
|
err = table_iter_seek_linear(ti, &want_index);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
@ -550,7 +548,7 @@ static int reader_seek_indexed(struct table_iter *ti,
|
|||||||
if (err != 0)
|
if (err != 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
err = reader_table_iter_at(r, ti, index_result.u.idx.offset, 0);
|
err = table_iter_seek_to(ti, ti->r, index_result.u.idx.offset, 0);
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
@ -585,14 +583,14 @@ static int reader_seek_internal(struct reftable_reader *r,
|
|||||||
struct table_iter ti = TABLE_ITER_INIT, *p;
|
struct table_iter ti = TABLE_ITER_INIT, *p;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = reader_start(r, &ti, reftable_record_type(rec), !!idx);
|
err = table_iter_seek_start(&ti, r, reftable_record_type(rec), !!idx);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (idx)
|
if (idx)
|
||||||
err = reader_seek_indexed(&ti, r, rec);
|
err = table_iter_seek_indexed(&ti, rec);
|
||||||
else
|
else
|
||||||
err = reader_seek_linear(&ti, rec);
|
err = table_iter_seek_linear(&ti, rec);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -742,7 +740,7 @@ static int reftable_reader_refs_for_unindexed(struct reftable_reader *r,
|
|||||||
int err;
|
int err;
|
||||||
|
|
||||||
*ti = ti_empty;
|
*ti = ti_empty;
|
||||||
err = reader_start(r, ti, BLOCK_TYPE_REF, 0);
|
err = table_iter_seek_start(ti, r, BLOCK_TYPE_REF, 0);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
reftable_free(ti);
|
reftable_free(ti);
|
||||||
return err;
|
return err;
|
||||||
|
Reference in New Issue
Block a user