wasm_dbms_memory/lib.rs
1// Rust guideline compliant 2026-04-28
2// X-WHERE-CLAUSE, M-CANONICAL-DOCS
3
4#![crate_name = "wasm_dbms_memory"]
5#![crate_type = "lib"]
6#![cfg_attr(docsrs, feature(doc_cfg))]
7#![deny(clippy::print_stdout)]
8#![deny(clippy::print_stderr)]
9
10//! # wasm-dbms-memory
11//!
12//! Runtime-agnostic memory abstraction and page management for the
13//! [`wasm-dbms`](https://crates.io/crates/wasm-dbms) framework.
14//!
15//! This crate sits between the raw byte storage exposed by a WASM
16//! runtime (heap, file, IC stable memory, ...) and the higher-level
17//! DBMS engine. It defines the [`MemoryProvider`] trait that abstracts
18//! over the storage backend and the on-top-of-it data structures that
19//! the engine uses to persist tables, schema, and indexes.
20//!
21//! All structures use 64 KiB pages so the on-disk layout is byte-for-byte
22//! identical across providers — a heap-built database can be dumped and
23//! reopened as IC stable memory or a WASI file with no conversion.
24//!
25//! ## What this crate provides
26//!
27//! Storage backends:
28//!
29//! - [`MemoryProvider`] — trait every backend implements (read, write,
30//! grow, page count).
31//! - [`HeapMemoryProvider`] — in-memory provider for tests and embedded
32//! use cases.
33//!
34//! Engine-facing data structures:
35//!
36//! - [`MemoryManager`] — page allocator and low-level read/write
37//! helpers. See [`RESERVED_PAGES`] for the reserved layout.
38//! - [`SchemaRegistry`] — persistent table-schema store backed by
39//! [`TableRegistryPage`].
40//! - [`TableRegistry`] — record-level storage, free-segment tracking,
41//! and read iterators ([`TableReader`], [`RawTableReader`],
42//! [`NextRecord`], [`RecordAddress`], [`RawRecordBytes`]).
43//! - [`IndexLedger`] / [`IndexTreeWalker`] — secondary index storage
44//! and traversal.
45//! - [`table_registry::AutoincrementLedger`] — per-column
46//! autoincrement counters.
47//! - [`UnclaimedPages`] — free page pool ([`UNCLAIMED_PAGES_CAPACITY`]
48//! entries per ledger page).
49//! - [`align_up`] / [`WASM_PAGE_SIZE`] — alignment helpers.
50//!
51//! ## Memory layout
52//!
53//! Reserved pages followed by per-table page sets:
54//!
55//! ```text
56//! +0: Schema Registry (1 page)
57//! +1: Unclaimed Pages Ledger (1 page)
58//! +N: Per-table Page Ledger (1 page)
59//! +N: Per-table Free Segments (1 page)
60//! +N: Per-table Record Pages (grown on demand)
61//! ```
62//!
63//! ## Quick start
64//!
65//! ```rust
66//! use wasm_dbms_memory::prelude::*;
67//!
68//! let mut provider = HeapMemoryProvider::default();
69//! provider.grow(1).unwrap();
70//! provider.write(0, b"hello").unwrap();
71//!
72//! let mut buf = vec![0u8; 5];
73//! provider.read(0, &mut buf).unwrap();
74//! assert_eq!(&buf, b"hello");
75//! ```
76//!
77//! Most users do not interact with this crate directly: the
78//! [`wasm-dbms`](https://crates.io/crates/wasm-dbms) engine consumes a
79//! [`MemoryProvider`] and exposes the higher-level CRUD/transaction
80//! API on top.
81
82#![doc(html_playground_url = "https://play.rust-lang.org")]
83#![doc(
84 html_favicon_url = "https://raw.githubusercontent.com/veeso/wasm-dbms/main/assets/images/cargo/logo-128.png"
85)]
86#![doc(
87 html_logo_url = "https://raw.githubusercontent.com/veeso/wasm-dbms/main/assets/images/cargo/logo-512.png"
88)]
89
90extern crate self as wasm_dbms_memory;
91
92mod memory_access;
93mod memory_manager;
94mod provider;
95mod schema_registry;
96pub mod table_registry;
97mod unclaimed_pages;
98
99pub use self::memory_access::MemoryAccess;
100pub use self::memory_manager::{MemoryManager, RESERVED_PAGES, align_up};
101pub use self::provider::{HeapMemoryProvider, MemoryProvider, WASM_PAGE_SIZE};
102pub use self::schema_registry::{SchemaRegistry, TableRegistryPage};
103pub use self::table_registry::{
104 IndexLedger, IndexTreeWalker, NextRecord, RawRecordBytes, RawTableReader, RecordAddress,
105 TableReader, TableRegistry,
106};
107pub use self::unclaimed_pages::{UNCLAIMED_PAGES_CAPACITY, UnclaimedPages};
108
109/// Prelude re-exports for convenient use.
110pub mod prelude {
111 pub use super::memory_access::MemoryAccess;
112 pub use super::memory_manager::{MemoryManager, RESERVED_PAGES, align_up};
113 pub use super::provider::{HeapMemoryProvider, MemoryProvider, WASM_PAGE_SIZE};
114 pub use super::schema_registry::{SchemaRegistry, TableRegistryPage};
115 pub use super::table_registry::{
116 AutoincrementLedger, IndexLedger, IndexTreeWalker, NextRecord, RawRecordBytes,
117 RawTableReader, RecordAddress, TableReader, TableRegistry,
118 };
119 pub use super::unclaimed_pages::{UNCLAIMED_PAGES_CAPACITY, UnclaimedPages};
120}