From 92a8cd1570498ebbe48db3750aedb76a8359d3f7 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 | 11 ++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/heed/src/env.rs b/heed/src/env.rs index 21fbcf68..360035f3 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..966a53e0 100644 --- a/heed/src/mdb/lmdb_ffi.rs +++ b/heed/src/mdb/lmdb_ffi.rs @@ -3,11 +3,12 @@ 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_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, - MDB_val, MDB_CP_COMPACT, MDB_CURRENT, MDB_RDONLY, MDB_RESERVE, + 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, MDB_val, MDB_CP_COMPACT, MDB_CURRENT, + MDB_RDONLY, MDB_RESERVE, }; use lmdb_master_sys as ffi;