| /* | |
| * Copyright 2020 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style | |
| * license that can be found in the LICENSE file or at | |
| * https://developers.google.com/open-source/licenses/bsd | |
| */ | |
| #ifndef REFTABLE_TABLE_H | |
| #define REFTABLE_TABLE_H | |
| #include "reftable-iterator.h" | |
| #include "reftable-block.h" | |
| #include "reftable-blocksource.h" | |
| /* | |
| * Reading single tables | |
| * | |
| * The follow routines are for reading single files. For an | |
| * application-level interface, skip ahead to struct | |
| * reftable_merged_table and struct reftable_stack. | |
| */ | |
| /* Metadata for a block type. */ | |
| struct reftable_table_offsets { | |
| int is_present; | |
| uint64_t offset; | |
| uint64_t index_offset; | |
| }; | |
| /* The table struct is a handle to an open reftable file. */ | |
| struct reftable_table { | |
| /* for convenience, associate a name with the instance. */ | |
| char *name; | |
| struct reftable_block_source source; | |
| /* Size of the file, excluding the footer. */ | |
| uint64_t size; | |
| /* The hash function used for ref records. */ | |
| enum reftable_hash hash_id; | |
| uint32_t block_size; | |
| uint64_t min_update_index; | |
| uint64_t max_update_index; | |
| /* Length of the OID keys in the 'o' section */ | |
| int object_id_len; | |
| int version; | |
| struct reftable_table_offsets ref_offsets; | |
| struct reftable_table_offsets obj_offsets; | |
| struct reftable_table_offsets log_offsets; | |
| uint64_t refcount; | |
| }; | |
| /* reftable_table_new opens a reftable for reading. If successful, | |
| * returns 0 code and sets pp. The name is used for creating a | |
| * stack. Typically, it is the basename of the file. The block source | |
| * `src` is owned by the table, and is closed on calling | |
| * reftable_table_destroy(). On error, the block source `src` is | |
| * closed as well. | |
| */ | |
| int reftable_table_new(struct reftable_table **out, | |
| struct reftable_block_source *src, const char *name); | |
| /* | |
| * Manage the reference count of the reftable table. A newly initialized | |
| * table starts with a refcount of 1 and will be deleted once the refcount has | |
| * reached 0. | |
| * | |
| * This is required because tables may have longer lifetimes than the stack | |
| * they belong to. The stack may for example be reloaded while the old tables | |
| * are still being accessed by an iterator. | |
| */ | |
| void reftable_table_incref(struct reftable_table *table); | |
| void reftable_table_decref(struct reftable_table *table); | |
| /* Initialize a reftable iterator for reading refs. */ | |
| int reftable_table_init_ref_iterator(struct reftable_table *t, | |
| struct reftable_iterator *it); | |
| /* Initialize a reftable iterator for reading logs. */ | |
| int reftable_table_init_log_iterator(struct reftable_table *t, | |
| struct reftable_iterator *it); | |
| /* returns the hash ID used in this table. */ | |
| enum reftable_hash reftable_table_hash_id(struct reftable_table *t); | |
| /* return an iterator for the refs pointing to `oid`. */ | |
| int reftable_table_refs_for(struct reftable_table *t, | |
| struct reftable_iterator *it, uint8_t *oid); | |
| /* return the max_update_index for a table */ | |
| uint64_t reftable_table_max_update_index(struct reftable_table *t); | |
| /* return the min_update_index for a table */ | |
| uint64_t reftable_table_min_update_index(struct reftable_table *t); | |
| /* | |
| * An iterator that iterates through the blocks contained in a given table. | |
| */ | |
| struct reftable_table_iterator { | |
| void *iter_arg; | |
| }; | |
| int reftable_table_iterator_init(struct reftable_table_iterator *it, | |
| struct reftable_table *t); | |
| void reftable_table_iterator_release(struct reftable_table_iterator *it); | |
| int reftable_table_iterator_next(struct reftable_table_iterator *it, | |
| const struct reftable_block **out); | |
| #endif |