369
}
370
}
371
372
-static int table_iter_next_void(void *ti, struct reftable_record *rec)
373
-{
374
- return table_iter_next(ti, rec);
375
-}
376
-
377
-static void table_iter_close_void(void *ti)
378
-{
379
- table_iter_close(ti);
380
-}
381
-
382
-static struct reftable_iterator_vtable table_iter_vtable = {
383
- .next = &table_iter_next_void,
384
- .close = &table_iter_close_void,
385
-};
386
-
387
-static void iterator_from_table_iter(struct reftable_iterator *it,
388
- struct table_iter *ti)
389
-{
390
- assert(!it->ops);
391
- it->iter_arg = ti;
392
- it->ops = &table_iter_vtable;
393
-}
394
-
372
static int table_iter_seek_to(struct table_iter *ti, uint64_t off, uint8_t typ)
373
{
374
int err;
553
return err;
554
}
555
579
-static int reader_seek(struct reftable_reader *r, struct reftable_iterator *it,
580
- struct reftable_record *rec)
556
+static int table_iter_seek(struct table_iter *ti,
557
+ struct reftable_record *want)
558
{
582
- uint8_t typ = reftable_record_type(rec);
583
- struct reftable_reader_offsets *offs = reader_offsets_for(r, typ);
584
- struct table_iter ti, *p;
559
+ uint8_t typ = reftable_record_type(want);
560
+ struct reftable_reader_offsets *offs = reader_offsets_for(ti->r, typ);
561
int err;
562
587
- if (!offs->is_present) {
588
- iterator_set_empty(it);
589
- return 0;
590
- }
591
-
592
- table_iter_init(&ti, r);
593
-
594
- err = table_iter_seek_start(&ti, reftable_record_type(rec),
563
+ err = table_iter_seek_start(ti, reftable_record_type(want),
564
!!offs->index_offset);
565
if (err < 0)
566
goto out;
567
568
if (offs->index_offset)
600
- err = table_iter_seek_indexed(&ti, rec);
569
+ err = table_iter_seek_indexed(ti, want);
570
else
602
- err = table_iter_seek_linear(&ti, rec);
571
+ err = table_iter_seek_linear(ti, want);
572
if (err)
573
goto out;
574
606
- REFTABLE_ALLOC_ARRAY(p, 1);
607
- *p = ti;
608
- iterator_from_table_iter(it, p);
609
-
575
out:
611
- if (err)
612
- table_iter_close(&ti);
576
return err;
577
}
578
579
+static int table_iter_seek_void(void *ti, struct reftable_record *want)
580
+{
581
+ return table_iter_seek(ti, want);
582
+}
583
+
584
+static int table_iter_next_void(void *ti, struct reftable_record *rec)
585
+{
586
+ return table_iter_next(ti, rec);
587
+}
588
+
589
+static void table_iter_close_void(void *ti)
590
+{
591
+ table_iter_close(ti);
592
+}
593
+
594
+static struct reftable_iterator_vtable table_iter_vtable = {
595
+ .seek = &table_iter_seek_void,
596
+ .next = &table_iter_next_void,
597
+ .close = &table_iter_close_void,
598
+};
599
+
600
+static void iterator_from_table_iter(struct reftable_iterator *it,
601
+ struct table_iter *ti)
602
+{
603
+ assert(!it->ops);
604
+ it->iter_arg = ti;
605
+ it->ops = &table_iter_vtable;
606
+}
607
+
608
+static void reader_init_iter(struct reftable_reader *r,
609
+ struct reftable_iterator *it,
610
+ uint8_t typ)
611
+{
612
+ struct reftable_reader_offsets *offs = reader_offsets_for(r, typ);
613
+
614
+ if (offs->is_present) {
615
+ struct table_iter *ti;
616
+ REFTABLE_ALLOC_ARRAY(ti, 1);
617
+ table_iter_init(ti, r);
618
+ iterator_from_table_iter(it, ti);
619
+ } else {
620
+ iterator_set_empty(it);
621
+ }
622
+}
623
+
624
int reftable_reader_seek_ref(struct reftable_reader *r,
625
struct reftable_iterator *it, const char *name)
626
{
630
.refname = (char *)name,
631
},
632
};
625
- return reader_seek(r, it, &rec);
633
+ reader_init_iter(r, it, BLOCK_TYPE_REF);
634
+ return iterator_seek(it, &rec);
635
}
636
637
int reftable_reader_seek_log_at(struct reftable_reader *r,
638
struct reftable_iterator *it, const char *name,
639
uint64_t update_index)
640
{
632
- struct reftable_record rec = { .type = BLOCK_TYPE_LOG,
633
- .u.log = {
634
- .refname = (char *)name,
635
- .update_index = update_index,
636
- } };
637
- return reader_seek(r, it, &rec);
641
+ struct reftable_record rec = {
642
+ .type = BLOCK_TYPE_LOG,
643
+ .u.log = {
644
+ .refname = (char *)name,
645
+ .update_index = update_index,
646
+ },
647
+ };
648
+ reader_init_iter(r, it, BLOCK_TYPE_LOG);
649
+ return iterator_seek(it, &rec);
650
}
651
652
int reftable_reader_seek_log(struct reftable_reader *r,
704
struct indexed_table_ref_iter *itr = NULL;
705
706
/* Look through the reverse index. */
695
- err = reader_seek(r, &oit, &want);
707
+ reader_init_iter(r, &oit, BLOCK_TYPE_OBJ);
708
+ err = iterator_seek(&oit, &want);
709
if (err != 0)
710
goto done;
711
786
787
/* generic table interface. */
788
776
-static int reftable_reader_seek_void(void *tab, struct reftable_iterator *it,
777
- struct reftable_record *rec)
789
+static void reftable_reader_init_iter_void(void *tab,
790
+ struct reftable_iterator *it,
791
+ uint8_t typ)
792
{
779
- return reader_seek(tab, it, rec);
793
+ reader_init_iter(tab, it, typ);
794
}
795
796
static uint32_t reftable_reader_hash_id_void(void *tab)
809
}
810
811
static struct reftable_table_vtable reader_vtable = {
798
- .seek_record = reftable_reader_seek_void,
812
+ .init_iter = reftable_reader_init_iter_void,
813
.hash_id = reftable_reader_hash_id_void,
814
.min_update_index = reftable_reader_min_update_index_void,
815
.max_update_index = reftable_reader_max_update_index_void,