From 6f1cbf4710f47256f03b834837a33e21ae6dd173 Mon Sep 17 00:00:00 2001 From: Tim Underwood Date: Tue, 28 May 2024 10:23:16 -0700 Subject: [PATCH] Add Env::max_key_size() method to determine the max supported key length. This calls the LMDB mdb_env_get_maxkeysize function. --- heed/src/env.rs | 25 +++++++++++++++++++++++++ heed/src/mdb/lmdb_ffi.rs | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/heed/src/env.rs b/heed/src/env.rs index 21fbcf68..d52e8a83 100644 --- a/heed/src/env.rs +++ b/heed/src/env.rs @@ -901,6 +901,14 @@ impl Env { mdb_result(unsafe { ffi::mdb_env_set_mapsize(self.env_mut_ptr(), new_size) }) .map_err(Into::into) } + + /// Get the maximum size of keys and MDB_DUPSORT data we can write. + /// + /// Depends on the compile-time constant MDB_MAXKEYSIZE. Default 511 + pub fn max_key_size(&self) -> usize { + let maxsize: i32 = unsafe{ ffi::mdb_env_get_maxkeysize(self.env_mut_ptr()) }; + maxsize as usize + } } /// Contains information about the environment. @@ -1251,4 +1259,21 @@ mod tests { env.prepare_for_closing().wait(); } } + + #[test] + fn max_key_size() { + let dir = tempfile::tempdir().unwrap(); + let env = unsafe { EnvOpenOptions::new().open(dir.path().join(dir.path())).unwrap() }; + let maxkeysize = env.max_key_size(); + + eprintln!("maxkeysize: {}", maxkeysize); + + if cfg!(feature = "longer-keys") { + // Should be larger than the default of 511 + assert!(maxkeysize > 511); + } else { + // Should be the default of 511 + assert_eq!(maxkeysize, 511); + } + } } diff --git a/heed/src/mdb/lmdb_ffi.rs b/heed/src/mdb/lmdb_ffi.rs index 1aa03d56..b1058964 100644 --- a/heed/src/mdb/lmdb_ffi.rs +++ b/heed/src/mdb/lmdb_ffi.rs @@ -3,7 +3,7 @@ use std::ptr; pub use ffi::{ mdb_cursor_close, mdb_cursor_del, mdb_cursor_get, mdb_cursor_open, mdb_cursor_put, mdb_dbi_open, mdb_del, mdb_drop, mdb_env_close, mdb_env_copyfd2, mdb_env_create, - mdb_env_get_fd, mdb_env_get_flags, mdb_env_info, mdb_env_open, mdb_env_set_flags, + mdb_env_get_fd, mdb_env_get_flags, mdb_env_get_maxkeysize, mdb_env_info, mdb_env_open, mdb_env_set_flags, mdb_env_set_mapsize, mdb_env_set_maxdbs, mdb_env_set_maxreaders, mdb_env_stat, mdb_env_sync, mdb_filehandle_t, mdb_get, mdb_put, mdb_reader_check, mdb_set_compare, mdb_stat, mdb_txn_abort, mdb_txn_begin, mdb_txn_commit, mdb_version, MDB_cursor, MDB_dbi, MDB_env, MDB_stat, MDB_txn,