diff options
Diffstat (limited to '')
-rw-r--r-- | third_party/rust/lmdb-rkv/src/lib.rs | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/third_party/rust/lmdb-rkv/src/lib.rs b/third_party/rust/lmdb-rkv/src/lib.rs new file mode 100644 index 0000000000..2d42fd31c6 --- /dev/null +++ b/third_party/rust/lmdb-rkv/src/lib.rs @@ -0,0 +1,106 @@ +//! Idiomatic and safe APIs for interacting with the +//! [Lightning Memory-mapped Database (LMDB)](https://symas.com/lmdb). + +#![deny(missing_docs)] +#![doc(html_root_url = "https://docs.rs/lmdb-rkv/0.14.0")] + +extern crate byteorder; +extern crate libc; +extern crate lmdb_sys as ffi; + +#[cfg(test)] +extern crate tempdir; +#[macro_use] +extern crate bitflags; + +pub use cursor::{ + Cursor, + Iter, + IterDup, + RoCursor, + RwCursor, +}; +pub use database::Database; +pub use environment::{ + Environment, + EnvironmentBuilder, + Info, + Stat, +}; +pub use error::{ + Error, + Result, +}; +pub use flags::*; +pub use transaction::{ + InactiveTransaction, + RoTransaction, + RwTransaction, + Transaction, +}; + +macro_rules! lmdb_try { + ($expr:expr) => {{ + match $expr { + ::ffi::MDB_SUCCESS => (), + err_code => return Err(::Error::from_err_code(err_code)), + } + }}; +} + +macro_rules! lmdb_try_with_cleanup { + ($expr:expr, $cleanup:expr) => {{ + match $expr { + ::ffi::MDB_SUCCESS => (), + err_code => { + let _ = $cleanup; + return Err(::Error::from_err_code(err_code)); + }, + } + }}; +} + +mod cursor; +mod database; +mod environment; +mod error; +mod flags; +mod transaction; + +#[cfg(test)] +mod test_utils { + + use byteorder::{ + ByteOrder, + LittleEndian, + }; + use tempdir::TempDir; + + use super::*; + + /// Regression test for https://github.com/danburkert/lmdb-rs/issues/21. + /// This test reliably segfaults when run against lmbdb compiled with opt level -O3 and newer + /// GCC compilers. + #[test] + fn issue_21_regression() { + const HEIGHT_KEY: [u8; 1] = [0]; + + let dir = TempDir::new("test").unwrap(); + + let env = { + let mut builder = Environment::new(); + builder.set_max_dbs(2); + builder.set_map_size(1_000_000); + builder.open(dir.path()).expect("open lmdb env") + }; + let index = env.create_db(None, DatabaseFlags::DUP_SORT).expect("open index db"); + + for height in 0..1000 { + let mut value = [0u8; 8]; + LittleEndian::write_u64(&mut value, height); + let mut tx = env.begin_rw_txn().expect("begin_rw_txn"); + tx.put(index, &HEIGHT_KEY, &value, WriteFlags::empty()).expect("tx.put"); + tx.commit().expect("tx.commit") + } + } +} |