package irmin-pack

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type

Abstraction that governs the lifetime of the various files that are part of a pack store (except the branch store).

module Mapping_file : Mapping_file.S with module Io = Fm.Io
type t
type location = private
  1. | Prefix
  2. | Suffix
val location_t : location Irmin.Type.t
type accessor = private {
  1. poff : Optint.Int63.t;
  2. len : Optint.Int63.t;
  3. location : location;
}

An accessor designates a valid readable area in one of the pack files.

Accessors are meant to be used from within the Irmin_pack_unix implementation. Their validity is only checked at creation time, so they are not meant to be kept for a long time. (e.g. if kept over a GC finalisation, an accessor could no longer point to a valid area because the GC changes the domain of valid readable areas)

val accessor_t : accessor Irmin.Type.t
val v : Fm.t -> (t, [> Fm.Errs.t ]) Stdlib.result
val create_accessor_exn : t -> off:Optint.Int63.t -> len:int -> accessor

create_accessor_exn returns an accessor if off and len designate a readable area of the pack files, otherwise it raises one of Errors.Pack_error `Read_out_of_bounds, Errors.Pack_error (`Invalid_prefix_read _) and Errors.Pack_error (`Invalid_read_of_gced_object _).

val create_accessor_from_range_exn : t -> off:Optint.Int63.t -> min_len:int -> max_len:int -> accessor

create_accessor_from_maxlen_exn is similar to create_accessor_exn except that the precise length of the span will be decided during the call.

val create_accessor_to_prefix_exn : Mapping_file.t -> off:Optint.Int63.t -> len:int -> accessor

create_accessor_to_prefix_exn mapping ~off ~len returns an accessor for the prefix file associated with mapping.

val shrink_accessor_exn : accessor -> new_len:int -> accessor

shrink_accessor_exn a ~new_len is a where the length is smaller than in a.

val create_sequential_accessor_seq : t -> min_header_len:int -> max_header_len:int -> read_len:(bytes -> int) -> (Optint.Int63.t * accessor) Irmin.Export_for_backends.Seq.t

create_sequential_accessor_seq ~min_header_len ~max_header_len ~read_len returns a sequence of accessors, which simulates iterating sequentially trough the entries of a pack file. min_header_len & max_header_len represents the minimum & maximum lengths required to read the header of an entry. read_len will then be called with a buffer containing the header of the entry and should return the total length of the entry (the length of he header plus the length of the payload)

val read_exn : t -> accessor -> bytes -> unit

read_exn either reads in the prefix or the suffix file, depending on accessor.

val end_offset : t -> Optint.Int63.t

end_offset is the end offsets of the pack entries, counting that the prefix doesn't start at 0. It counts the entries not yet flushed from the prefix.

val suffix_start_offset : t -> Optint.Int63.t

suffix_start_offset is the offsets of the first pack entry in the suffix. All pack entries in the prefix fit below suffix_start_offset.

val offset_of_soff : t -> Optint.Int63.t -> Optint.Int63.t

offset_of_soff t suffix_off converts a suffix offset into a (global) offset.

val soff_of_offset : t -> Optint.Int63.t -> Optint.Int63.t

soff_of_offset t global_offset converts a global offset to a suffix offset.

val read_bytes_exn : t -> f:(string -> unit) -> off:Optint.Int63.t -> len:Optint.Int63.t -> unit

read_bytes_exn reads a slice of the global offset space defined by off and len.

The calls to f ignore the objects boundaries (i.e. the string passed to f will most of the time not be the beginning of an object).

The strings passed to f are safe. They can be kept around, they are not the result of an unsafe_to_string conversion.

The call will fail if the (off, len) range is invalid. It will succeed in these cases:

  • If the range designates a slice of the suffix.
  • If the range designates a slice of contiguous live bytes in the prefix
  • If the range designates a slice of contiguous live bytes that starts in the prefix and ends in the suffix. This implies that the last chunk of the prefix is contiguous to the start of the suffix.