extern crate lmdb_sys; use lmdb_sys::*; use std::ffi::{c_void, CString}; use std::fs::File; use std::ptr; // https://github.com/victorporof/lmdb/blob/mdb.master/libraries/liblmdb/moz-test.c macro_rules! E { ($expr:expr) => {{ match $expr { ::MDB_SUCCESS => (), err_code => assert!(false, "Failed with code {}", err_code), } }}; } macro_rules! str { ($expr:expr) => { ::CString::new($expr).unwrap().as_ptr() }; } #[test] #[cfg(target_pointer_width = "32")] fn test_simple_32() { test_simple("./tests/fixtures/testdb-32") } #[test] #[cfg(target_pointer_width = "64")] fn test_simple_64() { test_simple("./tests/fixtures/testdb") } #[cfg(windows)] fn get_file_fd(file: &File) -> std::os::windows::io::RawHandle { use std::os::windows::io::AsRawHandle; file.as_raw_handle() } #[cfg(unix)] fn get_file_fd(file: &File) -> std::os::unix::io::RawFd { use std::os::unix::io::AsRawFd; file.as_raw_fd() } fn test_simple(env_path: &str) { let mut env: *mut MDB_env = ptr::null_mut(); let mut dbi: MDB_dbi = 0; let mut key = MDB_val { mv_size: 0, mv_data: ptr::null_mut(), }; let mut data = MDB_val { mv_size: 0, mv_data: ptr::null_mut(), }; let mut txn: *mut MDB_txn = ptr::null_mut(); let sval = str!("foo") as *mut c_void; let dval = str!("bar") as *mut c_void; unsafe { E!(mdb_env_create(&mut env)); E!(mdb_env_set_maxdbs(env, 2)); E!(mdb_env_open(env, str!(env_path), 0, 0664)); E!(mdb_txn_begin(env, ptr::null_mut(), 0, &mut txn)); E!(mdb_dbi_open(txn, str!("subdb"), MDB_CREATE, &mut dbi)); E!(mdb_txn_commit(txn)); key.mv_size = 3; key.mv_data = sval; data.mv_size = 3; data.mv_data = dval; E!(mdb_txn_begin(env, ptr::null_mut(), 0, &mut txn)); E!(mdb_put(txn, dbi, &mut key, &mut data, 0)); E!(mdb_txn_commit(txn)); } let file = File::create("./tests/fixtures/copytestdb.mdb").unwrap(); unsafe { let fd = get_file_fd(&file); E!(mdb_env_copyfd(env, fd)); mdb_dbi_close(env, dbi); mdb_env_close(env); } }