#page #offset #reference #data-structures #disk #tree #traits

no-std bin+lib sanakirja-core

Copy-on-write datastructures, storable on disk (or elsewhere) with a stable format

26 stable releases

1.4.1 Feb 10, 2024
1.3.3 Apr 30, 2023
1.3.2 Dec 13, 2022
1.2.16 Nov 23, 2021
1.2.4 Mar 21, 2021

#89 in #offset

Download history 66/week @ 2024-08-05 53/week @ 2024-08-12 63/week @ 2024-08-19 92/week @ 2024-08-26 127/week @ 2024-09-02 44/week @ 2024-09-09 46/week @ 2024-09-16 124/week @ 2024-09-23 104/week @ 2024-09-30 67/week @ 2024-10-07 77/week @ 2024-10-14 62/week @ 2024-10-21 106/week @ 2024-10-28 67/week @ 2024-11-04 53/week @ 2024-11-11 57/week @ 2024-11-18

296 downloads per month
Used in 11 crates (2 directly)

MIT/Apache

235KB
4.5K SLoC

This crate defines tools to implement datastructures that can live in main memory or on-disk, meaning that their natural habitat is memory-mapped files, but if that environment is threatened, they might seek refuge in lower-level environments.

One core building block of this library is the notion of virtual memory pages, which are allocated and freed by an externally-provided allocator (see how the sanakirja crate does this). The particular implementation used here is meant to allow a transactional system with readers reading the structures concurrently with one writer at a time.

At the moment, only B trees are implemented, as well as the following general traits:

  • LoadPage is a trait used to get a pointer to a page. In the most basic version, this may just return a pointer to the file, offset by the requested offset. In more sophisticated versions, this can be used to encrypt and compress pages.
  • AllocPage allocates and frees pages, because as datastructures need to be persisted on disk, we can't rely on Rust's memory management to do it for us. Users of this crate don't have to worry about this though.

Moreover, two other traits can be used to store things on pages: Storable is a simple trait that all Sized + Ord types without references can readily implement (the direct_repr! macro does that). For types containing references to pages allocated in the database, the comparison function can be customised. Moreover, these types must supply an iterator over these references, in order for reference-counting to work properly when the datastructures referencing these types are forked.

Dynamically-sized types, or types that need to be represented in a dynamically-sized way, can use the UnsizedStorable format.

Dependencies

~0–530KB
~11K SLoC