blob: 5f935d02e3b195d5585a56219497baeaff522cea [file] [log] [blame]
/*
* 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