Cargo Features

[dependencies]
heed = { version = "0.20.5", default-features = false, features = ["serde", "read-txn-no-tls", "serde-bincode", "serde-json", "serde-rmp", "preserve_order", "arbitrary_precision", "raw_value", "unbounded_depth", "posix-sem", "mdb_idl_logn_8", "mdb_idl_logn_9", "mdb_idl_logn_10", "mdb_idl_logn_11", "mdb_idl_logn_12", "mdb_idl_logn_13", "mdb_idl_logn_14", "mdb_idl_logn_15", "mdb_idl_logn_16", "longer-keys"] }
default = serde, serde-bincode, serde-json

The serde feature makes some types serializable, like the EnvOpenOptions struct.

serde default

Enables bitflags and serde

read-txn-no-tls

The #MDB_NOTLS flag is automatically set on Env opening,
RoTxn and RoCursors implements the Send trait. This allows the user to move RoTxns and RoCursors between threads as read transactions will no more use thread local storage and will tie reader locktable slots to #MDB_txn objects instead of to threads.

According to the LMDB documentation, when this feature is not enabled:
A thread can only use one transaction at a time, plus any child transactions. Each transaction belongs to one thread. [...]
The #MDB_NOTLS flag changes this for read-only transactions.

And a #MDB_BAD_RSLOT error will be thrown when multiple read transactions exists on the same thread

serde-bincode default

Enable the serde en/decoders for bincode, serde_json, or rmp_serde

Enables serde-bincode of heed-types

serde-json default

Enables serde-json of heed-types

serde-rmp

Enables serde-rmp of heed-types

preserve_order

serde_json features

Enables preserve_order of heed-types

arbitrary_precision

Enables arbitrary_precision of heed-types

raw_value

Enables raw_value of heed-types

unbounded_depth

Enables unbounded_depth of heed-types

posix-sem

Whether to tell LMDB to use POSIX semaphores during compilation (instead of the default, which are System V semaphores). POSIX semaphores are required for Apple's App Sandbox on iOS & macOS, and are possibly faster and more appropriate for single-process use. There are tradeoffs for both POSIX and SysV semaphores; which you should look into before enabling this feature. Also, see here: https://github.com/LMDB/lmdb/blob/3947014aed7ffe39a79991fa7fb5b234da47ad1a/libraries/liblmdb/lmdb.h#L46-L69

Enables posix-sem of lmdb-master-sys

mdb_idl_logn_8

These features configure the MDB_IDL_LOGN macro, which determines the size of the free and dirty page lists (and thus the amount of memory allocated when opening an LMDB environment in read-write mode).

Each feature defines MDB_IDL_LOGN as the value in the name of the feature. That means these features are mutually exclusive, and you must not specify more than one at the same time (or the crate will fail to compile).

For more information on the motivation for these features (and their effect), see https://github.com/mozilla/lmdb/pull/2.

Enables mdb_idl_logn_8 of lmdb-master-sys

mdb_idl_logn_9

Enables mdb_idl_logn_9 of lmdb-master-sys

mdb_idl_logn_10

Enables mdb_idl_logn_10 of lmdb-master-sys

mdb_idl_logn_11

Enables mdb_idl_logn_11 of lmdb-master-sys

mdb_idl_logn_12

Enables mdb_idl_logn_12 of lmdb-master-sys

mdb_idl_logn_13

Enables mdb_idl_logn_13 of lmdb-master-sys

mdb_idl_logn_14

Enables mdb_idl_logn_14 of lmdb-master-sys

mdb_idl_logn_15

Enables mdb_idl_logn_15 of lmdb-master-sys

mdb_idl_logn_16

Enables mdb_idl_logn_16 of lmdb-master-sys

longer-keys

Setting this enables you to use keys longer than 511 bytes. The exact limit is computed by LMDB at compile time. You can find the exact value by calling Env::max_key_size(). This value varies by architecture.

Example max key sizes:
- Apple M1 (ARM64): 8126 bytes
- Apple Intel (AMD64): 1982 bytes
- Linux Intel (AMD64): 1982 bytes

Setting this also enables you to use values larger than 511 bytes when using a Database with the DatabaseFlags::DUP_SORT flag.

This builds LMDB with the -DMDB_MAXKEYSIZE=0 option.

Note: If you are moving database files between architectures then your longest stored key must fit within the smallest limit of all architectures used. For example, if you are moving databases between Apple M1 and Apple Intel computers then you need to keep your keys within the smaller 1982 byte limit.

Enables longer-keys of lmdb-master-sys