Skip to content

Commit

Permalink
Add "mdb_maxkeysize_0" feature which sets "-DMDB_MAXKEYSIZE=0" when c…
Browse files Browse the repository at this point in the history
…ompiling LMDB

By default (and for backwards compatibility) LMDB only allows keys up to 511 bytes in length. If you want larger keys then you need to set "-DMDB_MAXKEYSIZE=0" at compile time.
  • Loading branch information
tpunder committed May 24, 2024
1 parent 2c90779 commit dacc6ef
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 0 deletions.
4 changes: 4 additions & 0 deletions heed/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ mdb_idl_logn_14 = ["lmdb-master-sys/mdb_idl_logn_14"]
mdb_idl_logn_15 = ["lmdb-master-sys/mdb_idl_logn_15"]
mdb_idl_logn_16 = ["lmdb-master-sys/mdb_idl_logn_16"]

# Sets -DMDB_MAXKEYSIZE=0 at build time to use a computed max key length
# limit instead of the default of 511.
mdb_maxkeysize_0 = ["lmdb-master-sys/mdb_maxkeysize_0"]

[[example]]
name = "rmp-serde"
required-features = ["serde-rmp"]
22 changes: 22 additions & 0 deletions heed/src/database.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2657,4 +2657,26 @@ mod tests {

Ok(())
}

#[test]
#[cfg(feature = "mdb_maxkeysize_0")]
fn mdb_maxkeysize_0() -> Result<()> {
let dir = tempfile::tempdir()?;
let env = unsafe { EnvOpenOptions::new().open(dir.path())? };
let mut txn = env.write_txn()?;
let db = env.create_database::<Bytes, Bytes>(&mut txn, None)?;

// Try storing a key larger than 511 bytes (the default if MDB_MAXKEYSIZE is not set)
let long_key = b"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut pharetra sit amet aliquam. Sit amet nisl purus in mollis nunc. Eget egestas purus viverra accumsan in nisl nisi scelerisque. Duis ultricies lacus sed turpis tincidunt. Sem nulla pharetra diam sit. Leo vel orci porta non pulvinar. Erat pellentesque adipiscing commodo elit at imperdiet dui. Suspendisse ultrices gravida dictum fusce ut placerat orci nulla. Diam donec adipiscing tristique risus nec feugiat. In fermentum et sollicitudin ac orci. Ut sem nulla pharetra diam sit amet. Aliquam purus sit amet luctus venenatis lectus. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. Urna duis convallis convallis tellus id interdum velit laoreet id. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Tincidunt arcu non sodales neque. Habitant morbi tristique senectus et netus et malesuada fames.";

assert_eq!(db.get(&txn, long_key).unwrap(), None);

db.put(&mut txn, long_key, b"hi").unwrap();
assert_eq!(db.get(&txn, long_key).unwrap(), Some(&b"hi"[..]));

db.put(&mut txn, long_key, b"bye").unwrap();
assert_eq!(db.get(&txn, long_key).unwrap(), Some(&b"bye"[..]));

Ok(())
}
}
4 changes: 4 additions & 0 deletions lmdb-master-sys/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,7 @@ mdb_idl_logn_13 = []
mdb_idl_logn_14 = []
mdb_idl_logn_15 = []
mdb_idl_logn_16 = []

# Sets -DMDB_MAXKEYSIZE=0 at build time to use a computed max key length
# limit instead of the default of 511.
mdb_maxkeysize_0 = []
4 changes: 4 additions & 0 deletions lmdb-master-sys/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,5 +147,9 @@ fn main() {
builder.flag("-fsanitize=fuzzer-no-link");
}

if cfg!(feature = "mdb_maxkeysize_0") {
builder.define("MDB_MAXKEYSIZE", "0");
}

builder.compile("liblmdb.a")
}
11 changes: 11 additions & 0 deletions lmdb-master-sys/tests/simple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,17 @@ fn test_simple(env_path: &str) {

E!(mdb_txn_begin(env, ptr::null_mut(), 0, &mut txn));
E!(mdb_put(txn, dbi, &mut key, &mut data, 0));

if cfg!(feature = "mdb_maxkeysize_0") {
// Try storing a key larger than 511 bytes (the default if MDB_MAXKEYSIZE is not set)
let sval = cstr!("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut pharetra sit amet aliquam. Sit amet nisl purus in mollis nunc. Eget egestas purus viverra accumsan in nisl nisi scelerisque. Duis ultricies lacus sed turpis tincidunt. Sem nulla pharetra diam sit. Leo vel orci porta non pulvinar. Erat pellentesque adipiscing commodo elit at imperdiet dui. Suspendisse ultrices gravida dictum fusce ut placerat orci nulla. Diam donec adipiscing tristique risus nec feugiat. In fermentum et sollicitudin ac orci. Ut sem nulla pharetra diam sit amet. Aliquam purus sit amet luctus venenatis lectus. Erat pellentesque adipiscing commodo elit at imperdiet dui accumsan. Urna duis convallis convallis tellus id interdum velit laoreet id. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Tincidunt arcu non sodales neque. Habitant morbi tristique senectus et netus et malesuada fames.").as_ptr() as *mut c_void;

key.mv_size = 952;
key.mv_data = sval;

E!(mdb_put(txn, dbi, &mut key, &mut data, 0));
}

E!(mdb_txn_commit(txn));
}

Expand Down

0 comments on commit dacc6ef

Please sign in to comment.