1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
pub mod db;
pub mod env;
pub mod err;
pub mod put;
pub mod tx;
pub use ffi::mdbx_version;
#[macro_export]
macro_rules! ok_err {
($expr:expr) => {
unsafe { crate::err::err(ffi::MDBX_error_t($expr)) }
};
}
#[macro_export]
macro_rules! ok {
($expr:expr) => {
crate::ok_err!($expr)?
};
}
#[macro_export]
macro_rules! ok_or_log {
($expr:expr) => {
match crate::ok_err!($expr) {
Err(err) => {
log::error!("{}", err)
}
_ => {}
}
};
}
#[macro_export]
macro_rules! Db {
($env: ident, $name:ident) => {
Db!($env, $name, mdbx::db::Flag::MDBX_DB_DEFAULTS);
};
($env: ident, $name:ident, $flag:expr) => {
lazy_static! {
#[allow(non_upper_case_globals)]
pub static ref $name: mdbx::db::Config<'static> = $env.db(stringify!($name), $flag|mdbx::db::Flag::MDBX_CREATE).unwrap();
}
impl Clone for $name {
fn clone(&self) -> Self {
*self
}
}
impl Copy for $name {}
impl std::ops::BitAnd<&mdbx::tx::Tx> for $name {
type Output = mdbx::db::Db;
fn bitand(self, tx: &mdbx::tx::Tx) -> Self::Output {
mdbx::db::Db(tx.0, self.dbi)
}
}
paste::paste! {
#[allow(non_snake_case)]
#[ctor::ctor]
fn [<init_$name>]() {
lazy_static::initialize(&$name);
}
}
};
}