reth_libmdbx/
lib.rs

1#![doc = include_str!("../README.md")]
2#![doc(
3    html_logo_url = "https://raw.githubusercontent.com/paradigmxyz/reth/main/assets/reth-docs.png",
4    html_favicon_url = "https://avatars0.githubusercontent.com/u/97369466?s=256",
5    issue_tracker_base_url = "https://github.com/paradigmxyz/reth/issues/"
6)]
7#![cfg_attr(not(test), warn(unused_crate_dependencies))]
8#![allow(missing_docs, clippy::needless_pass_by_ref_mut)]
9#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
10
11pub extern crate reth_mdbx_sys as ffi;
12
13pub use crate::{
14    codec::*,
15    cursor::{Cursor, Iter, IterDup},
16    database::Database,
17    environment::{
18        Environment, EnvironmentBuilder, EnvironmentKind, Geometry, HandleSlowReadersCallback,
19        HandleSlowReadersReturnCode, Info, PageSize, Stat,
20    },
21    error::{Error, Result},
22    flags::*,
23    transaction::{CommitLatency, Transaction, TransactionKind, RO, RW},
24};
25
26#[cfg(feature = "read-tx-timeouts")]
27pub use crate::environment::read_transactions::MaxReadTransactionDuration;
28
29mod codec;
30mod cursor;
31mod database;
32mod environment;
33mod error;
34mod flags;
35mod transaction;
36mod txn_manager;
37
38#[cfg(test)]
39mod test_utils {
40    use super::*;
41    use byteorder::{ByteOrder, LittleEndian};
42    use tempfile::tempdir;
43
44    /// Regression test for <https://github.com/danburkert/lmdb-rs/issues/21>.
45    /// This test reliably segfaults when run against lmbdb compiled with opt level -O3 and newer
46    /// GCC compilers.
47    #[test]
48    fn issue_21_regression() {
49        const HEIGHT_KEY: [u8; 1] = [0];
50
51        let dir = tempdir().unwrap();
52
53        let env = {
54            let mut builder = Environment::builder();
55            builder.set_max_dbs(2);
56            builder
57                .set_geometry(Geometry { size: Some(1_000_000..1_000_000), ..Default::default() });
58            builder.open(dir.path()).expect("open mdbx env")
59        };
60
61        for height in 0..1000 {
62            let mut value = [0u8; 8];
63            LittleEndian::write_u64(&mut value, height);
64            let tx = env.begin_rw_txn().expect("begin_rw_txn");
65            let index = tx.create_db(None, DatabaseFlags::DUP_SORT).expect("open index db");
66            tx.put(index.dbi(), HEIGHT_KEY, value, WriteFlags::empty()).expect("tx.put");
67            tx.commit().expect("tx.commit");
68        }
69    }
70}