1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# I61 (ISSUES.md, 2026-05-22): Cargo workspace declaration. Members
# share one Cargo.lock (at workspace root) and one target/ directory,
# so `cargo build --workspace` / `cargo test --workspace` exercise
# the engine, the PyO3 binding, and the bench harness in one shot.
#
# `resolver = "2"` is the post-edition-2021 default but spelled
# explicitly here. The 2021 resolver does NOT unify feature flags
# across build targets (lib vs bin, deps vs dev-deps, host vs target),
# which is what we want — the PyO3 crate uses pyo3 with
# `extension-module` only in its own build, and the bench crate
# pulls heavyweight deps (criterion, rusqlite, redb) that shouldn't
# leak features into the root.
#
# Each member retains its own [package] block (name, version, edition,
# rust-version, etc.) — workspace inheritance via [workspace.package]
# is a separate refactor (cosmetic, not functional). The path-deps
# `chisel-storage = { path = ".." }` in python/Cargo.toml and bench/Cargo.toml
# work unchanged (the root package is named "chisel-storage" on crates.io;
# see [lib] below for why `use chisel::...` is unaffected).
[]
= [".", "python", "bench"]
# `default-members` excludes `python` from `cargo build` / `cargo test`
# from the workspace root. The Python crate uses pyo3's
# `extension-module` feature, which expects the linker to leave Python
# symbols (Py_None, Py_True, etc.) undefined — they're resolved at
# runtime by the loading Python interpreter. cargo doesn't know how
# to do that without help; maturin sets up the right `-undefined
# dynamic_lookup` linker flags. So the Python crate is workspace-
# resident (shares Cargo.lock and target/) but only buildable via
# `cd python && maturin develop` or `cargo build -p chisel-py` with
# matching linker config.
= [".", "bench"]
= "2"
[]
= "chisel-storage"
= "1.0.0"
= "2021"
# MSRV: bump only with a release-notes call-out; CI pins this same version.
# 1.82 is a conservative pin; the true stdlib floor is ~1.74 (io::Error::other,
# stabilized 1.74, used in src/page_io.rs).
= "1.82"
= ["Christophe Pettus <cpettus@pgexperts.com>"]
= "Transactional slot-based storage engine with shadow paging"
= "MIT"
= "https://github.com/pgexperts/chisel"
= "README.md"
# crates.io enforces ≤5 keywords, ≤20 chars each, ASCII alnum + `-`/`_`,
# must start with a letter. Picked for findability rather than literal accuracy.
= ["database", "storage", "embedded", "transactional", "shadow-paging"]
# crates.io categories use a controlled vocabulary
# (see https://crates.io/category_slugs). "database-implementations" is the
# narrow slot for a from-scratch engine; "data-structures" covers the
# radix tree / freemap / handle table types we expose.
= ["database-implementations", "data-structures"]
# Published on crates.io as "chisel-storage" (the plain "chisel" name is
# already taken by an unrelated project). The library/import name stays
# "chisel" — Cargo resolves `use chisel::...` for any consumer depending on
# `chisel-storage = "..."` from this [lib].name override alone, no renaming
# needed on the consumer's side.
[]
= "chisel"
[]
= { = "0.8", = ["xxh3"] }
= "0.2"
# I77: rustc_hash::FxHashMap replaces the default SipHash on the two hottest
# internal maps (PageCache.entries, LruIndex.nodes). Their keys are trusted
# local u64 page ids with no DoS surface, so SipHash's DoS-resistance is pure
# overhead (~2-3x slower per probe). FxHash is a fast multiply-based hash with
# ZERO transitive dependencies — it preserves the crate's minimal-dep footprint
# (this is only the third runtime dependency). The crates.io package is
# `rustc-hash` (hyphen); the import path is `rustc_hash` (underscore).
= "2"
# On-disk encryption (spec 2026-06-29). All pure-Rust, well-vetted RustCrypto
# primitives — rolling our own crypto is forbidden. These reach the published
# crate's dependency tree only when a DB is opened with an encryption key, but
# they are unconditional deps (the seal/open code is always compiled). Versions
# pinned to the audited RustCrypto generation current as of 2026-06.
= "0.10" # XChaCha20-Poly1305 AEAD (192-bit nonce)
= "0.5" # Argon2id passphrase KDF (memory-hard)
= "0.12" # HKDF-SHA256 raw-key KDF
= "0.10" # SHA-256 for HKDF
# I61-style tilde pin: zeroize 1.9.0 AND its `zeroize_derive` macro both
# bumped to `edition2024` (Rust 1.85+), which would push chisel's library
# MSRV above the 1.82 floor enforced by the msrv CI job. `~1.8` (>=1.8.0,
# <1.9.0) holds the last edition-2021 line of the core crate. We use only
# `Zeroizing<T>` — no #[derive(Zeroize)] anywhere — so the `derive` feature
# is dropped entirely, keeping the edition2024 `zeroize_derive` out of the
# tree. Lift when the floor moves past 1.85; mirrors clap `~4.5` in bench.
= "~1.8" # wipe key material on drop (Zeroizing<T>)
= "0.2" # OS RNG for DEK / nonce / salt generation
# I61-style floor pin on a TRANSITIVE dep (not used directly). argon2 0.5.3
# hard-depends on base64ct; base64ct 1.7+ went edition2024 (Rust 1.85+), which
# would break the 1.82 MSRV floor (msrv CI job). `~1.6` (>=1.6.0, <1.7.0) holds
# the last edition-2021 line. base64ct only encodes PHC hash strings, which we
# never emit (we call argon2's raw hash_password_into), so the pinned version's
# code path is never exercised. Lift when the MSRV floor moves past 1.85.
= "~1.6"
[]
= "3"
# `pastey` is the maintained drop-in fork of `paste` (dtolnay archived the
# original crate 2024-10-07; RUSTSEC-2024-0436). Used only by the
# `dual_backing_test!` macro in tests/common/mod.rs to construct
# `_file` / `_memory` test-fn identifiers. See I72 in ISSUES.md.
= "0.1"
# I71 (ISSUES.md, 2026-05-22): `proptest` powers the byte-roundtrip
# property tests in src/superblock.rs, src/data_page.rs, and
# src/freemap.rs. Dev-dep only — never reaches the published crate's
# dependency tree. Default-feature shrinking is the killer feature
# here: when a property fails, proptest finds the minimal failing
# input rather than dumping a 10000-byte buffer.
= "1"
# ---------------------------------------------------------------------------
# Build profiles (I91). These live at the WORKSPACE ROOT, so they affect only
# builds performed *inside this repo* (benches, tests, examples, local release
# builds). Cargo ignores a dependency's profile settings — a downstream crate
# that depends on `chisel` is unaffected; its own `[profile.release]` governs.
# This is the consumer-neutral way to tune: the published library forces
# nothing on its users.
#
# Motivation: the cross-engine bench grid compiles `chisel` and `redb` under
# Cargo's Rust profile, while `rusqlite` (bundled) compiles SQLite's C at its
# own -O2. Untuned, the two Rust engines built at lto=false / codegen-units=16
# — weaker codegen than the C competitor — biasing the headline comparison.
# fat LTO + one codegen unit closes that gap (whole-program cross-crate
# inlining), putting the Rust engines on codegen parity with bundled SQLite.
#
# Cost: `cargo bench` / `cargo build --release` compile noticeably slower. The
# gating CI jobs (test/clippy/fmt) build in the dev profile and are unaffected;
# only the report-only bench job and explicit release builds pay it. For fast
# local iteration on a bench, temporarily switch `lto = "fat"` to `lto = "thin"`
# (~80% of the win at a fraction of the compile cost). Re-record tracked bench
# baselines after this lands — the shift is uniform, not a regression.
[]
= 3
= "fat"
= 1
# Profiled builds (samply / Instruments / cargo-flamegraph) need line-table
# debuginfo that `release` omits. Select with
# `cargo build --profile release-with-debug`. Used when measuring the engine
# optimizations the 2026-06-01 review queued behind this groundwork (I77, I78).
[]
= "release"
= "line-tables-only"