Skip to content

Commit 2de3c0d

Browse files
pks-tgitster
authored andcommitted
reftable/reader: inline init_reader()
Most users use an allocated version of the `reftable_reader`, except for some tests. We are about to convert the reader to become refcounted though, and providing the ability to keep a reader on the stack makes this conversion harder than necessary. Update the tests to use `reftable_reader_new()` instead to prepare for this change. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent a021820 commit 2de3c0d

File tree

3 files changed

+98
-99
lines changed

3 files changed

+98
-99
lines changed

reftable/reader.c

Lines changed: 61 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -162,58 +162,6 @@ static int parse_footer(struct reftable_reader *r, uint8_t *footer,
162162
return err;
163163
}
164164

165-
int init_reader(struct reftable_reader *r, struct reftable_block_source *source,
166-
const char *name)
167-
{
168-
struct reftable_block footer = { NULL };
169-
struct reftable_block header = { NULL };
170-
int err = 0;
171-
uint64_t file_size = block_source_size(source);
172-
173-
/* Need +1 to read type of first block. */
174-
uint32_t read_size = header_size(2) + 1; /* read v2 because it's larger. */
175-
memset(r, 0, sizeof(struct reftable_reader));
176-
177-
if (read_size > file_size) {
178-
err = REFTABLE_FORMAT_ERROR;
179-
goto done;
180-
}
181-
182-
err = block_source_read_block(source, &header, 0, read_size);
183-
if (err != read_size) {
184-
err = REFTABLE_IO_ERROR;
185-
goto done;
186-
}
187-
188-
if (memcmp(header.data, "REFT", 4)) {
189-
err = REFTABLE_FORMAT_ERROR;
190-
goto done;
191-
}
192-
r->version = header.data[4];
193-
if (r->version != 1 && r->version != 2) {
194-
err = REFTABLE_FORMAT_ERROR;
195-
goto done;
196-
}
197-
198-
r->size = file_size - footer_size(r->version);
199-
r->source = *source;
200-
r->name = xstrdup(name);
201-
r->hash_id = 0;
202-
203-
err = block_source_read_block(source, &footer, r->size,
204-
footer_size(r->version));
205-
if (err != footer_size(r->version)) {
206-
err = REFTABLE_IO_ERROR;
207-
goto done;
208-
}
209-
210-
err = parse_footer(r, footer.data, header.data);
211-
done:
212-
reftable_block_done(&footer);
213-
reftable_block_done(&header);
214-
return err;
215-
}
216-
217165
struct table_iter {
218166
struct reftable_reader *r;
219167
uint8_t typ;
@@ -637,16 +585,68 @@ void reader_close(struct reftable_reader *r)
637585
FREE_AND_NULL(r->name);
638586
}
639587

640-
int reftable_reader_new(struct reftable_reader **p,
641-
struct reftable_block_source *src, char const *name)
588+
int reftable_reader_new(struct reftable_reader **out,
589+
struct reftable_block_source *source, char const *name)
642590
{
643-
struct reftable_reader *rd = reftable_calloc(1, sizeof(*rd));
644-
int err = init_reader(rd, src, name);
645-
if (err == 0) {
646-
*p = rd;
647-
} else {
648-
block_source_close(src);
649-
reftable_free(rd);
591+
struct reftable_block footer = { 0 };
592+
struct reftable_block header = { 0 };
593+
struct reftable_reader *r;
594+
uint64_t file_size = block_source_size(source);
595+
uint32_t read_size;
596+
int err;
597+
598+
REFTABLE_CALLOC_ARRAY(r, 1);
599+
600+
/*
601+
* We need one extra byte to read the type of first block. We also
602+
* pretend to always be reading v2 of the format because it is larger.
603+
*/
604+
read_size = header_size(2) + 1;
605+
if (read_size > file_size) {
606+
err = REFTABLE_FORMAT_ERROR;
607+
goto done;
608+
}
609+
610+
err = block_source_read_block(source, &header, 0, read_size);
611+
if (err != read_size) {
612+
err = REFTABLE_IO_ERROR;
613+
goto done;
614+
}
615+
616+
if (memcmp(header.data, "REFT", 4)) {
617+
err = REFTABLE_FORMAT_ERROR;
618+
goto done;
619+
}
620+
r->version = header.data[4];
621+
if (r->version != 1 && r->version != 2) {
622+
err = REFTABLE_FORMAT_ERROR;
623+
goto done;
624+
}
625+
626+
r->size = file_size - footer_size(r->version);
627+
r->source = *source;
628+
r->name = xstrdup(name);
629+
r->hash_id = 0;
630+
631+
err = block_source_read_block(source, &footer, r->size,
632+
footer_size(r->version));
633+
if (err != footer_size(r->version)) {
634+
err = REFTABLE_IO_ERROR;
635+
goto done;
636+
}
637+
638+
err = parse_footer(r, footer.data, header.data);
639+
if (err)
640+
goto done;
641+
642+
*out = r;
643+
644+
done:
645+
reftable_block_done(&footer);
646+
reftable_block_done(&header);
647+
if (err) {
648+
reftable_free(r);
649+
block_source_close(source);
650650
}
651651
return err;
652652
}

reftable/reader.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ struct reftable_reader {
5252
struct reftable_reader_offsets log_offsets;
5353
};
5454

55-
int init_reader(struct reftable_reader *r, struct reftable_block_source *source,
56-
const char *name);
5755
void reader_close(struct reftable_reader *r);
5856
const char *reader_name(struct reftable_reader *r);
5957

0 commit comments

Comments
 (0)