MDB Internals
- Provided by: lmdb-doc (Version: 0.9.10-1)
- Source: lmdb
- Report a bug
struct MDB_page
struct MDB_node
struct MDB_db
struct MDB_meta
union MDB_metabuf
struct MDB_dbx
struct MDB_txn
Opaque structure for a transaction handle. struct MDB_cursor
Opaque structure for navigating through a database. struct
MDB_xcursor
struct MDB_pgstate
struct MDB_env
Opaque structure for a database environment. struct MDB_ntxn
#define MDB_DSYNC O_DSYNC
#define MDB_FDATASYNC fdatasync
#define MDB_MSYNC(addr, len, flags) msync(addr,len,flags)
#define MS_SYNC 1
#define MS_ASYNC 0
#define MAX_PAGESIZE 0x8000
The maximum size of a database page. #define MDB_MINKEYS 2
#define MDB_MAGIC 0xBEEFC0DE
#define MDB_DATA_VERSION 1
#define MDB_LOCK_VERSION 1
#define MDB_MAXKEYSIZE 511
The maximum size of a key in the database. #define MAXDATASIZE
0xffffffffUL
The maximum size of a data item. #define DKBUF
#define DKEY(x) 0
#define P_INVALID (~(pgno_t)0)
#define F_ISSET(w, f) (((w) & (f)) == (f))
#define DEFAULT_MAPSIZE 1048576
#define PAGEHDRSZ ((unsigned) offsetof(MDB_page, mp_ptrs))
#define METADATA(p) ((void *)((char *)(p) + PAGEHDRSZ))
#define NUMKEYS(p) (((p)->mp_lower - PAGEHDRSZ) >> 1)
#define SIZELEFT(p) (indx_t)((p)->mp_upper -
(p)->mp_lower)
#define PAGEFILL(env, p)
#define FILL_THRESHOLD 250
#define IS_LEAF(p) F_ISSET((p)->mp_flags, P_LEAF)
#define IS_LEAF2(p) F_ISSET((p)->mp_flags, P_LEAF2)
#define IS_BRANCH(p) F_ISSET((p)->mp_flags, P_BRANCH)
#define IS_OVERFLOW(p) F_ISSET((p)->mp_flags,
P_OVERFLOW)
#define IS_SUBP(p) F_ISSET((p)->mp_flags, P_SUBP)
#define OVPAGES(size, psize) ((PAGEHDRSZ-1 + (size)) / (psize) +
1)
#define NODESIZE offsetof(MDB_node, mn_data)
#define PGNO_TOPWORD ((pgno_t)-1 > 0xffffffffu ? 32 : 0)
#define INDXSIZE(k) (NODESIZE + ((k) == NULL ? 0 :
(k)->mv_size))
#define LEAFSIZE(k, d) (NODESIZE + (k)->mv_size +
(d)->mv_size)
#define NODEPTR(p, i) ((MDB_node *)((char *)(p) +
(p)->mp_ptrs[i]))
#define NODEKEY(node) (void *)((node)->mn_data)
#define NODEDATA(node) (void *)((char *)(node)->mn_data +
(node)->mn_ksize)
#define NODEPGNO(node)
#define SETPGNO(node, pgno)
#define NODEDSZ(node) ((node)->mn_lo |
((unsigned)(node)->mn_hi << 16))
#define SETDSZ(node, size)
#define NODEKSZ(node) ((node)->mn_ksize)
#define COPY_PGNO(dst, src)
#define LEAF2KEY(p, i, ks) ((char *)(p) + PAGEHDRSZ +
((i)*(ks)))
#define MDB_GET_KEY(node, keyptr)
#define MDB_GET_KEY2(node, key) { key.mv_size = NODEKSZ(node);
key.mv_data = NODEKEY(node); }
#define MDB_VALID 0x8000
#define PERSISTENT_FLAGS (0xffff & ~(MDB_VALID))
#define VALID_FLAGS
#define FREE_DBI 0
#define MAIN_DBI 1
#define CURSOR_STACK 32
#define MDB_COMMIT_PAGES 64
#define MAX_WRITE (0x80000000U >> (sizeof(ssize_t) == 4))
#define MDB_PS_MODIFY 1
#define MDB_PS_ROOTONLY 2
#define MDB_PS_FIRST 4
#define MDB_PS_LAST 8
#define MDB_SPLIT_REPLACE MDB_APPENDDUP
#define mdb_env_close0(env, excl) mdb_env_close1(env)
#define mdb_txn_reset0(txn, act) mdb_txn_reset0(txn)
#define LOCKNAME '/lock.mdb'
#define DATANAME '/data.mdb'
#define LOCKSUFF '-lock'
#define CHANGEABLE
(MDB_NOSYNC|MDB_NOMETASYNC|MDB_MAPASYNC|MDB_NOMEMINIT)
#define CHANGELESS
#define MDB_NOSPILL 0x8000
typedef MDB_ID pgno_t
typedef MDB_ID txnid_t
typedef uint16_t indx_t
enum Pidlock_op { Pidset = F_SETLK, Pidcheck
= F_GETLK }
static int mdb_page_alloc (MDB_cursor *mc, int num,
MDB_page **mp)
static int mdb_page_new (MDB_cursor *mc, uint32_t flags, int
num, MDB_page **mp)
static int mdb_page_touch (MDB_cursor *mc)
static int mdb_page_get (MDB_txn *txn, pgno_t pgno,
MDB_page **mp, int *lvl)
static int mdb_page_search_root (MDB_cursor *mc, MDB_val
*key, int modify)
static int mdb_page_search (MDB_cursor *mc, MDB_val *key,
int flags)
static int mdb_page_merge (MDB_cursor *csrc, MDB_cursor
*cdst)
static int mdb_page_split (MDB_cursor *mc, MDB_val
*newkey, MDB_val *newdata, pgno_t newpgno, unsigned int
nflags)
static int mdb_env_read_header (MDB_env *env, MDB_meta
*meta)
static int mdb_env_pick_meta (const MDB_env *env)
static int mdb_env_write_meta (MDB_txn *txn)
static void mdb_env_close0 (MDB_env *env, int excl)
static MDB_node * mdb_node_search (MDB_cursor *mc,
MDB_val *key, int *exactp)
static int mdb_node_add (MDB_cursor *mc, indx_t indx,
MDB_val *key, MDB_val *data, pgno_t pgno, unsigned int
flags)
static void mdb_node_del (MDB_page *mp, indx_t indx, int
ksize)
static void mdb_node_shrink (MDB_page *mp, indx_t indx)
static int mdb_node_move (MDB_cursor *csrc, MDB_cursor
*cdst)
static int mdb_node_read (MDB_txn *txn, MDB_node *leaf,
MDB_val *data)
static size_t mdb_leaf_size (MDB_env *env, MDB_val *key,
MDB_val *data)
static size_t mdb_branch_size (MDB_env *env, MDB_val
*key)
static int mdb_rebalance (MDB_cursor *mc)
static int mdb_update_key (MDB_cursor *mc, MDB_val *key)
static void mdb_cursor_pop (MDB_cursor *mc)
static int mdb_cursor_push (MDB_cursor *mc, MDB_page *mp)
static int mdb_cursor_del0 (MDB_cursor *mc, MDB_node
*leaf)
static int mdb_cursor_sibling (MDB_cursor *mc, int move_right)
static int mdb_cursor_next (MDB_cursor *mc, MDB_val *key,
MDB_val *data, MDB_cursor_op op)
static int mdb_cursor_prev (MDB_cursor *mc, MDB_val *key,
MDB_val *data, MDB_cursor_op op)
static int mdb_cursor_set (MDB_cursor *mc, MDB_val *key,
MDB_val *data, MDB_cursor_op op, int *exactp)
static int mdb_cursor_first (MDB_cursor *mc, MDB_val
*key, MDB_val *data)
static int mdb_cursor_last (MDB_cursor *mc, MDB_val *key,
MDB_val *data)
static void mdb_cursor_init (MDB_cursor *mc, MDB_txn
*txn, MDB_dbi dbi, MDB_xcursor *mx)
static void mdb_xcursor_init0 (MDB_cursor *mc)
static void mdb_xcursor_init1 (MDB_cursor *mc, MDB_node
*node)
static int mdb_drop0 (MDB_cursor *mc, int subs)
static void mdb_default_cmp (MDB_txn *txn, MDB_dbi dbi)
char * mdb_version (int *major, int *minor, int *patch)
Return the mdb library version information. char * mdb_strerror
(int err)
Return a string describing a given error code. int mdb_cmp
(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const
MDB_val *b)
Compare two data items according to a particular database. int
mdb_dcmp (MDB_txn *txn, MDB_dbi dbi, const
MDB_val *a, const MDB_val *b)
Compare two data items according to a particular database. static
MDB_page * mdb_page_malloc (MDB_txn *txn, unsigned num)
static void mdb_page_free (MDB_env *env, MDB_page *mp)
static void mdb_dpage_free (MDB_env *env, MDB_page *dp)
static void mdb_dlist_free (MDB_txn *txn)
static int mdb_pages_xkeep (MDB_cursor *mc, unsigned pflags, int
all)
static int mdb_page_flush (MDB_txn *txn, int keep)
static int mdb_page_spill (MDB_cursor *m0, MDB_val *key,
MDB_val *data)
static txnid_t mdb_find_oldest (MDB_txn *txn)
static void mdb_page_dirty (MDB_txn *txn, MDB_page *mp)
static void mdb_page_copy (MDB_page *dst, MDB_page *src,
unsigned int psize)
static int mdb_page_unspill (MDB_txn *txn, MDB_page *mp,
MDB_page **ret)
int mdb_env_sync (MDB_env *env, int force)
Flush the data buffers to disk. static int mdb_cursor_shadow
(MDB_txn *src, MDB_txn *dst)
static void mdb_cursors_close (MDB_txn *txn, unsigned merge)
static void mdb_txn_reset0 (MDB_txn *txn, const char *act)
static int mdb_reader_pid (MDB_env *env, enum Pidlock_op op,
MDB_PID_T pid)
static int mdb_txn_renew0 (MDB_txn *txn)
int mdb_txn_renew (MDB_txn *txn)
Renew a read-only transaction. int mdb_txn_begin
(MDB_env *env, MDB_txn *parent, unsigned int flags,
MDB_txn **ret)
Create a transaction for use with the environment. MDB_env *
mdb_txn_env (MDB_txn *txn)
Returns the transaction's MDB_env. static void
mdb_dbis_update (MDB_txn *txn, int keep)
void mdb_txn_reset (MDB_txn *txn)
Reset a read-only transaction. void mdb_txn_abort
(MDB_txn *txn)
Abandon all the operations of the transaction instead of saving them.
static int mdb_freelist_save (MDB_txn *txn)
int mdb_txn_commit (MDB_txn *txn)
Commit all the operations of a transaction into the database. static
int mdb_env_init_meta (MDB_env *env, MDB_meta *meta)
int mdb_env_create (MDB_env **env)
Create an MDB environment handle. static int mdb_env_map
(MDB_env *env, void *addr, int newsize)
int mdb_env_set_mapsize (MDB_env *env, size_t size)
Set the size of the memory map to use for this environment. int
mdb_env_set_maxdbs (MDB_env *env, MDB_dbi dbs)
Set the maximum number of named databases for the environment. int
mdb_env_set_maxreaders (MDB_env *env, unsigned int readers)
Set the maximum number of threads/reader slots for the environment.
int mdb_env_get_maxreaders (MDB_env *env, unsigned int
*readers)
Get the maximum number of threads/reader slots for the environment.
static int mdb_env_open2 (MDB_env *env)
static void mdb_env_reader_dest (void *ptr)
static int mdb_env_share_locks (MDB_env *env, int *excl)
static int mdb_env_excl_lock (MDB_env *env, int *excl)
static int mdb_env_setup_locks (MDB_env *env, char *lpath, int
mode, int *excl)
int mdb_env_open (MDB_env *env, const char *path, unsigned int
flags, mdb_mode_t mode)
Open an environment handle. int mdb_env_copyfd (MDB_env
*env, HANDLE fd)
int mdb_env_copy (MDB_env *env, const char *path)
Copy an MDB environment to the specified path. void
mdb_env_close (MDB_env *env)
Close the environment and release the memory map. static int
mdb_cmp_long (const MDB_val *a, const MDB_val *b)
static int mdb_cmp_int (const MDB_val *a, const MDB_val
*b)
static int mdb_cmp_cint (const MDB_val *a, const MDB_val
*b)
static int mdb_cmp_memn (const MDB_val *a, const MDB_val
*b)
static int mdb_cmp_memnr (const MDB_val *a, const MDB_val
*b)
static int mdb_page_search_lowest (MDB_cursor *mc)
static int mdb_ovpage_free (MDB_cursor *mc, MDB_page *mp)
int mdb_get (MDB_txn *txn, MDB_dbi dbi, MDB_val
*key, MDB_val *data)
Get items from a database. int mdb_cursor_get
(MDB_cursor *mc, MDB_val *key, MDB_val *data,
MDB_cursor_op op)
Retrieve by cursor. static int mdb_cursor_touch
(MDB_cursor *mc)
int mdb_cursor_put (MDB_cursor *mc, MDB_val *key,
MDB_val *data, unsigned int flags)
Store by cursor. int mdb_cursor_del (MDB_cursor *mc,
unsigned int flags)
Delete current key/data pair. int mdb_cursor_open
(MDB_txn *txn, MDB_dbi dbi, MDB_cursor **ret)
Create a cursor handle. int mdb_cursor_renew (MDB_txn
*txn, MDB_cursor *mc)
Renew a cursor handle. int mdb_cursor_count (MDB_cursor
*mc, size_t *countp)
Return count of duplicates for current key. void
mdb_cursor_close (MDB_cursor *mc)
Close a cursor handle. MDB_txn * mdb_cursor_txn
(MDB_cursor *mc)
Return the cursor's transaction handle. MDB_dbi
mdb_cursor_dbi (MDB_cursor *mc)
Return the cursor's database handle. static void
mdb_cursor_copy (const MDB_cursor *csrc, MDB_cursor
*cdst)
int mdb_del (MDB_txn *txn, MDB_dbi dbi, MDB_val
*key, MDB_val *data)
Delete items from a database. int mdb_put (MDB_txn *txn,
MDB_dbi dbi, MDB_val *key, MDB_val *data, unsigned int
flags)
Store items into a database. int mdb_env_set_flags
(MDB_env *env, unsigned int flag, int onoff)
Set environment flags. int mdb_env_get_flags (MDB_env
*env, unsigned int *arg)
Get environment flags. int mdb_env_get_path (MDB_env
*env, const char **arg)
Return the path that was used in mdb_env_open().
int mdb_env_get_fd (MDB_env *env, mdb_filehandle_t
*arg)
Return the filedescriptor for the given environment. static int
mdb_stat0 (MDB_env *env, MDB_db *db, MDB_stat
*arg)
int mdb_env_stat (MDB_env *env, MDB_stat *arg)
Return statistics about the MDB environment. int mdb_env_info
(MDB_env *env, MDB_envinfo *arg)
Return information about the MDB environment. int mdb_dbi_open
(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi
*dbi)
Open a database in the environment. int mdb_stat
(MDB_txn *txn, MDB_dbi dbi, MDB_stat *arg)
Retrieve statistics for a database. void mdb_dbi_close
(MDB_env *env, MDB_dbi dbi)
Close a database handle. int mdb_dbi_flags (MDB_txn
*txn, MDB_dbi dbi, unsigned int *flags)
Retrieve the DB flags for a database handle. int mdb_drop
(MDB_txn *txn, MDB_dbi dbi, int del)
Empty or delete+close a database. int mdb_set_compare
(MDB_txn *txn, MDB_dbi dbi, MDB_cmp_func *cmp)
Set a custom key comparison function for a database. int
mdb_set_dupsort (MDB_txn *txn, MDB_dbi dbi,
MDB_cmp_func *cmp)
Set a custom data comparison function for a MDB_DUPSORT
database. int mdb_set_relfunc (MDB_txn *txn,
MDB_dbi dbi, MDB_rel_func *rel)
Set a relocation function for a MDB_FIXEDMAP database.
int mdb_set_relctx (MDB_txn *txn, MDB_dbi
dbi, void *ctx)
Set a context pointer for a MDB_FIXEDMAP database's
relocation function. int mdb_env_get_maxkeysize
(MDB_env *env)
Get the maximum size of a key for the environment. int
mdb_reader_list (MDB_env *env, MDB_msg_func *func, void
*ctx)
Dump the entries in the reader lock table. static int
mdb_pid_insert (MDB_PID_T *ids, MDB_PID_T pid)
int mdb_reader_check (MDB_env *env, int *dead)
Check for stale entries in the reader lock table.
static char *const mdb_errstr []
Common header for all page types. Overflow records occupy a number of contiguous pages with no headers on any page after the first.
Data Fields
union {
pgno_t p_pgno
void * p_next
} mp_p
uint16_t mp_pad
uint16_t mp_flags
union {
struct {
indx_t pb_lower
indx_t pb_upper
} pb
uint32_t pb_pages
} mp_pb
indx_t mp_ptrs [1]
page number
for in-memory list of freed structs
Page Flags
lower bound of free space
upper bound of free space
number of overflow pages
dynamic size
Header for a single key/data pair within a page. We guarantee 2-byte alignment for nodes.
Data Fields
unsigned short mn_offset [2]
unsigned short mn_flags
unsigned short mn_ksize
char mn_data [1]
storage for mn_lo and mn_hi
Node Flags
key size
key and data are appended here
Information about a single database in the environment.
Data Fields
uint32_t md_pad
uint16_t md_flags
uint16_t md_depth
pgno_t md_branch_pages
pgno_t md_leaf_pages
pgno_t md_overflow_pages
size_t md_entries
pgno_t md_root
also ksize for LEAF2 pages
Database Flags
depth of this tree
number of internal pages
number of leaf pages
number of overflow pages
number of data items
the root page of this tree
Meta page content. A meta page is the start point for accessing a database snapshot. Pages 0-1 are meta pages. Transaction N writes meta page #(N % 2).
Data Fields
uint32_t mm_magic
uint32_t mm_version
void * mm_address
size_t mm_mapsize
MDB_db mm_dbs [2]
pgno_t mm_last_pg
txnid_t mm_txnid
Stamp identifying this as an MDB file. It must be set to MDB_MAGIC.
Version number of this lock file. Must be set to MDB_DATA_VERSION.
address for fixed mapping
size of mmap region
first is free space, 2nd is main db
last used page in file
txnid that committed this page
Buffer for a stack-allocated meta page. The members define size and alignment, and silence type aliasing warnings. They are not used directly; that could mean incorrectly using several union members in parallel.
Data Fields
MDB_page mb_page
struct {
char mm_pad [PAGEHDRSZ]
MDB_meta mm_meta
} mb_metabuf
Auxiliary DB info. The information here is mostly static/read-only. There is only a single copy of this record in the environment.
Data Fields
MDB_val md_name
MDB_cmp_func * md_cmp
MDB_cmp_func * md_dcmp
MDB_rel_func * md_rel
void * md_relctx
name of the database
function for comparing keys
function for comparing data items
user relocate function
user-provided context for md_rel
Opaque structure for a transaction handle.
A database transaction. Every operation requires a transaction handle.
All database operations require a transaction handle. Transactions may be read-only or read-write.
Data Fields
MDB_txn * mt_parent
MDB_txn * mt_child
pgno_t mt_next_pgno
txnid_t mt_txnid
MDB_env * mt_env
MDB_IDL mt_free_pgs
MDB_IDL mt_spill_pgs
union {
MDB_ID2L dirty_list
MDB_reader * reader
} mt_u
MDB_dbx * mt_dbxs
MDB_db * mt_dbs
MDB_cursor ** mt_cursors
unsigned char * mt_dbflags
MDB_dbi mt_numdbs
unsigned int mt_flags
unsigned int mt_dirty_room
parent of a nested txn
nested txn under this txn
next unallocated page
The ID of this transaction. IDs are integers incrementing from 1. Only committed write transactions increment the ID. If a transaction aborts, the ID may be re-used by the next writer.
the DB environment
The list of pages that became unused during this transaction.
The sorted list of dirty pages we temporarily wrote to disk because the dirty list was full. page numbers in here are shifted left by 1, deleted slots have the LSB set.
For write txns: Modified pages. Sorted when not MDB_WRITEMAP.
For read txns: This thread/txn's reader table slot, or NULL.
Array of records for each DB known in the environment.
Array of MDB_db records for each known DB
In write txns, array of cursors for each DB
Array of flags for each DB
Number of DB records in use. This number only ever increments; we don't decrement it when individual DB handles are closed.
Transaction Flags
dirty_list room: Array size - #dirty pages visible to this txn. Includes ancestor txns' dirty pages not hidden by other txns' dirty/spilled pages. Thus commit(nested txn) has room to merge dirty_list into mt_parent after freeing hidden mt_parent pages.
Opaque structure for navigating through a database.
Cursors are used for all DB operations. A cursor holds a path of (page pointer, key index) from the DB root to a position in the DB, plus other state. MDB_DUPSORT cursors include an xcursor to the current data item. Write txns track their cursors and keep them up to date when data moves. Exception: An xcursor's pointer to a P_SUBP page can be stale. (A node with F_DUPDATA but no F_SUBDATA contains a subpage).
Data Fields
MDB_cursor * mc_next
MDB_cursor * mc_backup
struct MDB_xcursor * mc_xcursor
MDB_txn * mc_txn
MDB_dbi mc_dbi
MDB_db * mc_db
MDB_dbx * mc_dbx
unsigned char * mc_dbflag
unsigned short mc_snum
unsigned short mc_top
unsigned int mc_flags
MDB_page * mc_pg [CURSOR_STACK]
indx_t mc_ki [CURSOR_STACK]
Next cursor on this DB in this txn
Backup of the original cursor if this cursor is a shadow
Context used for databases with MDB_DUPSORT, otherwise NULL
The transaction that owns this cursor
The database handle this cursor operates on
The database record for this cursor
The database auxiliary record for this cursor
The Transaction DB Flags for this database
number of pushed pages
index of top page, normally mc_snum-1
Cursor Flags
stack of pushed pages
stack of page indices
Context for sorted-dup records. We could have gone to a fully recursive design, with arbitrarily deep nesting of sub-databases. But for now we only handle these levels - main DB, optional sub-DB, sorted-duplicate DB.
Data Fields
MDB_cursor mx_cursor
MDB_db mx_db
MDB_dbx mx_dbx
unsigned char mx_dbflag
A sub-cursor for traversing the Dup DB
The database record for this Dup DB
The auxiliary DB record for this Dup DB
The Transaction DB Flags for this Dup DB
State of FreeDB old pages, stored in the MDB_env
Data Fields
pgno_t * mf_pghead
txnid_t mf_pglast
Reclaimed freeDB pages, or NULL before use
ID of last used record, or 0 if !mf_pghead
Opaque structure for a database environment.
The database environment.
A DB environment supports multiple databases, all residing in the same shared-memory map.
Data Fields
HANDLE me_fd
HANDLE me_lfd
HANDLE me_mfd
uint32_t me_flags
unsigned int me_psize
unsigned int me_os_psize
unsigned int me_maxreaders
unsigned int me_numreaders
MDB_dbi me_numdbs
MDB_dbi me_maxdbs
MDB_PID_T me_pid
char * me_path
char * me_map
MDB_txninfo * me_txns
MDB_meta * me_metas [2]
void * me_pbuf
MDB_txn * me_txn
size_t me_mapsize
off_t me_size
pgno_t me_maxpg
MDB_dbx * me_dbxs
uint16_t * me_dbflags
pthread_key_t me_txkey
MDB_pgstate me_pgstate
MDB_page * me_dpages
MDB_IDL me_free_pgs
MDB_ID2L me_dirty_list
int me_maxfree_1pg
unsigned int me_nodemax
The main data file
The lock file
just for writing the meta pages
Environment Flags
DB page size, inited from me_os_psize
OS page size, from GET_PAGESIZE
size of the reader table
max numreaders set by this env
number of DBs opened
size of the DB table
process ID of this env
path to the DB files
the memory map of the data file
the memory map of the lock file or NULL
pointers to the two meta pages
scratch area for DUPSORT put()
current write transaction
size of the data memory map
current file size
me_mapsize / me_psize
array of static DB info
array of flags from MDB_db.md_flags
thread-key for readers
state of old pages from freeDB
list of malloc'd blocks for re-use
IDL of pages that became unused in a write txn
ID2L of pages written during a write txn. Length MDB_IDL_UM_SIZE.
Max number of freelist items that can fit in a single overflow page
Max size of a node on a page
Nested transaction
Data Fields
MDB_txn mnt_txn
MDB_pgstate mnt_pgstate
the transaction
parent transaction's saved freestate
A flag for opening a file and requesting synchronous data writes.
This is only used when writing a meta page. It's not strictly needed; we
could just do a normal write and then immediately perform a flush. But if
this flag is available it saves us an extra system call.
Note:
Function for flushing the data of a file. Define this to fsync if fdatasync() is not supported.
The maximum size of a database page. This is 32k, since it must fit in MDB_page.#mp_upper.
LMDB will use database pages < OS pages if needed. That causes more I/O in write transactions: The OS must know (read) the whole page before writing a partial page.
Note that we don't currently support Huge pages. On Linux, regular data files cannot use Huge pages, and in general Huge pages aren't actually pageable. We rely on the OS demand-pager to read our data and page it out when memory pressure from other processes is high. So until OSs have actual paging support for Huge pages, they're not viable.
The minimum number of keys required in a database page. Setting this to a larger value will place a smaller bound on the maximum size of a data item. Data items larger than this size will be pushed into overflow pages instead of being stored directly in the B-tree node. This value used to default to 4. With a page size of 4096 bytes that meant that any item larger than 1024 bytes would go into an overflow page. That also meant that on average 2-3KB of each overflow page was wasted space. The value cannot be lower than 2 because then there would no longer be a tree structure. With this value, items larger than 2KB will go into overflow pages, and on average only 1KB will be wasted.
A stamp that identifies a file as an MDB file. There's nothing special about this value other than that it is easily recognizable, and it will reflect any byte order mismatches.
The version number for a database's datafile format.
The version number for a database's lockfile format.
The maximum size of a key in the database. The library rejects bigger keys, and cannot deal with records with bigger keys stored by a library with bigger max keysize.
We require that keys all fit onto a regular page. This limit could be raised a bit further if needed; to something just under (page size / MDB_MINKEYS / 3).
Note that data items in an MDB_DUPSORT database are actually keys of a subDB, so they're also limited to this size.
The maximum size of a data item. We only store a 32 bit value for node sizes.
An invalid page number. Mainly used to denote an empty tree.
Test if the flags f are set in a flag word w.
Default size of memory map. This is certainly too small for any actual applications. Apps should always set the size explicitly using mdb_env_set_mapsize().
Size of the page header, excluding dynamic data at the end
Address of first usable data byte in a page, after the header
Number of nodes on a page
The amount of space remaining in the page
Value:
(1000L * ((env)->me_psize - PAGEHDRSZ - SIZELEFT(p)) / ((env)->me_psize - PAGEHDRSZ))The percentage of space used in the page, in tenths of a percent.
The minimum page fill factor, in tenths of a percent. Pages emptier than this are candidates for merging.
Test if a page is a leaf page
Test if a page is a LEAF2 page
Test if a page is a branch page
Test if a page is an overflow page
Test if a page is a sub page
The number of overflow pages needed to store the given size.
Size of the node header, excluding dynamic data at the end
Bit position of top word in page number, for shifting mn_flags
Size of a node in a branch page with a given key. This is just the node header plus the key, there is no data.
Size of a node in a leaf page with a given key and data. This is node header plus key plus data size.
Address of node i in page p
Address of the key for the node
Address of the data for a node
Value:
((node)->mn_lo | ((pgno_t) (node)->mn_hi << 16) | (PGNO_TOPWORD ? ((pgno_t) (node)->mn_flags << PGNO_TOPWORD) : 0))Get the page number pointed to by a branch node
Value:
do { (node)->mn_lo = (pgno) & 0xffff; (node)->mn_hi = (pgno) >> 16; if (PGNO_TOPWORD) (node)->mn_flags = (pgno) >> PGNO_TOPWORD; } while(0)
Set the page number in a branch node
Get the size of the data in a leaf node
Value:
do { (node)->mn_lo = (size) & 0xffff; (node)->mn_hi = (size) >> 16;} while(0)
Set the size of the data for a leaf node
The size of a key in a node
Value:
do { unsigned short *s, *d; s = (unsigned short *)&(src); d = (unsigned short *)&(dst); *d++ = *s++; *d++ = *s++; *d++ = *s++; *d = *s; } while (0)
Copy a page number from src to dst
The address of a key in a LEAF2 page. LEAF2 pages are used for MDB_DUPFIXED sorted-duplicate sub-DBs. There are no node headers, keys are stored contiguously.
Value:
{ if ((keyptr) != NULL) { (keyptr)->mv_size = NODEKSZ(node); (keyptr)->mv_data = NODEKEY(node); } }
Set the node's key into keyptr, if requested.
Set the node's key into key.
mdb_dbi_open flags DB handle is valid, for me_dbflags
Value:
(MDB_REVERSEKEY|MDB_DUPSORT|MDB_INTEGERKEY|MDB_DUPFIXED|\ MDB_INTEGERDUP|MDB_REVERSEDUP|MDB_CREATE)
Handle for the DB used to track free pages.
Handle for the default DB.
Enough space for 2^32 nodes with minimum of 2 keys per node. I.e., plenty. At 4 keys per node, enough for 2^64 nodes, so there's probably no need to raise this on a 64 bit machine.
max number of pages to commit in one writev() call
newkey is not new
The name of the lock file in the DB environment
The name of the data file in the DB environment
The suffix of the lock file when no subdir is used
Only a subset of the Environment Flags flags can be changed at runtime. Changing other flags requires closing the environment and re-opening it with the new flags.
Value:
(MDB_FIXEDMAP|MDB_NOSUBDIR|MDB_RDONLY|MDB_WRITEMAP| \ MDB_NOTLS|MDB_NOLOCK|MDB_NORDAHEAD)
Do not spill pages to disk if txn is getting full, may fail instead
A page number in the database. Note that 64 bit page numbers are overkill, since pages themselves already represent 12-13 bits of addressable memory, and the OS will always limit applications to a maximum of 63 bits of address space.
Note:
A transaction ID. See struct MDB_txn.mt_txnid for details.
Used for offsets within a single page. Since memory pages are typically 4 or 8KB in size, 12-13 bits, this is plenty.
Allocate page numbers and memory for writing. Maintain me_pglast, me_pghead and mt_next_pgno.
If there are free pages available from older transactions, they are re-used first. Otherwise allocate a new page at mt_next_pgno. Do not modify the freedB, just merge freeDB records into me_pghead[] and move me_pglast to say which records were consumed. Only this function can create me_pghead and move me_pglast/mt_next_pgno.
Parameters:
Returns:
Allocate and initialize new pages for a database.
Parameters:
Returns:
Touch a page: make it dirty and re-insert into tree with updated pgno.
Parameters:
Returns:
Find the address of the page corresponding to a given page number.
Parameters:
Returns:
Finish mdb_page_search() / mdb_page_search_lowest(). The cursor is at the root page, set up the rest of it.
Search for the page a given key should be in. Push it and its parent pages on the cursor stack.
Parameters:
Returns:
Merge one page into another. The nodes from the page pointed to by csrc will be copied to the page pointed to by cdst and then the csrc page will be freed.
Parameters:
Split a page and insert a new node.
Parameters:
Returns:
Read the environment parameters of a DB environment before mapping it into memory.
Parameters:
Returns:
Check both meta pages to see which one is newer.
Parameters:
Returns:
Update the environment info to commit a transaction.
Parameters:
Returns:
Destroy resources from mdb_env_open(), clear our readers & DBIs
Search for key within a page, using binary search. Returns the smallest entry larger or equal to the key. If exactp is non-null, stores whether the found entry was an exact match in *exactp (1 or 0). Updates the cursor index with the index of the found entry. If no entry larger or equal to the key is found, returns NULL.
Add a node to the page pointed to by the cursor.
Parameters:
Returns:
Delete the specified node from a page.
Parameters:
Compact the main page after deleting a node on a subpage.
Parameters:
Move a node from csrc to cdst.
Return the data associated with a given node.
Parameters:
Returns:
Calculate the size of a leaf node. The size depends on the environment's page size; if a data item is too large it will be put onto an overflow page and the node size will only include the key and not the data. Sizes are always rounded up to an even number of bytes, to guarantee 2-byte alignment of the MDB_node headers.
Parameters:
Returns:
Calculate the size of a branch node. The size should depend on the environment's page size but since we currently don't support spilling large keys onto overflow pages, it's simply the size of the MDB_node header plus the size of the key. Sizes are always rounded up to an even number of bytes, to guarantee 2-byte alignment of the MDB_node headers.
Parameters:
Returns:
Rebalance the tree after a delete operation.
Parameters:
Returns:
Replace the key for a node with a new key.
Parameters:
Returns:
Pop a page off the top of the cursor's stack.
Push a page onto the top of the cursor's stack.
Complete a delete operation started by mdb_cursor_del().
Find a sibling for a page. Replaces the page at the top of the cursor's stack with the specified sibling, if one exists.
Parameters:
Returns:
Move the cursor to the next data item.
Move the cursor to the previous data item.
Set the cursor on a specific data item.
Move the cursor to the first item in the database.
Move the cursor to the last item in the database.
Initialize a cursor for a given transaction and database.
Initial setup of a sorted-dups cursor. Sorted duplicates are implemented as a sub-database for the given key. The duplicate data items are actually keys of the sub-database. Operations on the duplicate data items are performed using a sub-cursor initialized when the sub-database is first accessed. This function does the preliminary setup of the sub-cursor, filling in the fields that depend only on the parent DB.
Parameters:
Final setup of a sorted-dups cursor. Sets up the fields that depend on the data from the main cursor.
Parameters:
Add all the DB's pages to the free list.
Parameters:
Returns:
Set the default comparison functions for a database. Called immediately after a database is opened to set the defaults. The user can then override them with mdb_set_compare() or mdb_set_dupsort().
Parameters:
Return the mdb library version information. Return the library version info.
Return a string describing a given error code. This function is a superset of the ANSI C X3.159-1989 (ANSI C) strerror(3) function. If the error code is greater than or equal to 0, then the string returned by the system function strerror(3) is returned. If the error code is less than 0, an error string corresponding to the MDB library error is returned. See Return Codes for a list of MDB-specific error codes.
Parameters:
Return values:
Compare two data items according to a particular database. This returns a comparison as if the two data items were keys in the specified database.
Parameters:
Returns:
Compare two data items according to a particular database. This returns a comparison as if the two items were data items of the specified database. The database must have the MDB_DUPSORT flag.
Parameters:
Returns:
Allocate memory for a page. Re-use old malloc'd pages first for singletons, otherwise just malloc.
Free a single page. Saves single pages to a list, for future reuse. (This is not used for multi-page overflow pages.)
Free a dirty page
Return all dirty pages to dpage list
Set or clear P_KEEP in dirty, non-overflow, non-sub pages watched by txn.
Parameters:
Returns:
Flush (some) dirty pages to the map, after clearing their dirty flag.
Parameters:
Returns:
Spill pages from the dirty list back to disk.
This is intended to prevent running into MDB_TXN_FULL situations, but
note that they may still occur in a few cases: 1) our estimate of the txn
size could be too small. Currently this seems unlikely, except with a large
number of MDB_MULTIPLE items. 2) child txns may run out of space if
their parents dirtied a lot of pages and never spilled them. TODO: we
probably should do a preemptive spill during mdb_txn_begin() of a
child txn, if the parent's dirty_room is below a given threshold.
Otherwise, if not using nested txns, it is expected that apps will not run into MDB_TXN_FULL any more. The pages are flushed to disk the same way as for a txn commit, e.g. their P_DIRTY flag is cleared. If the txn never references them again, they can be left alone. If the txn only reads them, they can be used without any fuss. If the txn writes them again, they can be dirtied immediately without going thru all of the work of mdb_page_touch(). Such references are handled by mdb_page_unspill().
Also note, we never spill DB root pages, nor pages of active cursors, because we'll need these back again soon anyway. And in nested txns, we can't spill a page in a child txn if it was already spilled in a parent txn. That would alter the parent txns' data even though the child hasn't committed yet, and we'd have no way to undo it if the child aborted.
Parameters:
Returns:
Find oldest txnid still referenced. Expects txn->mt_txnid > 0.
Add a page to the txn's dirty list
Copy the used portions of a non-overflow page.
Parameters:
Pull a page off the txn's spill list, if present. If a page being referenced was spilled to disk in this txn, bring it back and make it dirty/writable again.
Parameters:
Flush the data buffers to disk. Data is always written to disk when mdb_txn_commit() is called, but the operating system may keep it buffered. MDB always flushes the OS buffers upon commit as well, unless the environment was opened with MDB_NOSYNC or in part MDB_NOMETASYNC.
Parameters:
Returns:
Back up parent txn's cursors, then grab the originals for tracking
Close this write txn's cursors, give parent txn's cursors back to parent.
Parameters:
Returns:
Common code for mdb_txn_reset() and mdb_txn_abort(). May be called twice for readonly txns: First reset it, then abort.
Parameters:
Set or check a pid lock. Set returns 0 on success. Check returns 0 if the process is certainly dead, nonzero if it may be alive (the lock exists or an error happened so we do not know).
On Windows Pidset is a no-op, we merely check for the existence of the process with the given pid. On POSIX we use a single byte lock on the lockfile, set at an offset equal to the pid.
Common code for mdb_txn_begin() and mdb_txn_renew().
Parameters:
Returns:
Renew a read-only transaction. This acquires a new reader lock for a transaction handle that had been released by mdb_txn_reset(). It must be called before a reset transaction may be used again.
Parameters:
Returns:
Create a transaction for use with the environment. The transaction handle may be discarded using mdb_txn_abort() or mdb_txn_commit().
Note:
Cursors may not span transactions.
Parameters:
txn Address where the new MDB_txn handle will be stored
Returns:
Returns the transaction's MDB_env.
Parameters:
Export or close DBI handles opened in this txn.
Reset a read-only transaction. Abort the transaction like mdb_txn_abort(), but keep the transaction handle. mdb_txn_renew() may reuse the handle. This saves allocation overhead if the process will start a new read-only transaction soon, and also locking overhead if MDB_NOTLS is in use. The reader table lock is released, but the table slot stays tied to its thread or MDB_txn. Use mdb_txn_abort() to discard a reset handle, and to free its lock table slot if MDB_NOTLS is in use. Cursors opened within the transaction must not be used again after this call, except with mdb_cursor_renew(). Reader locks generally don't interfere with writers, but they keep old versions of database pages allocated. Thus they prevent the old pages from being reused when writers commit new data, and so under heavy load the database size may grow much more rapidly than otherwise.
Parameters:
Abandon all the operations of the transaction instead of saving them. The transaction handle is freed. It and its cursors must not be used again after this call, except with mdb_cursor_renew().
Note:
Parameters:
Save the freelist as of this transaction to the freeDB. This changes the freelist. Keep trying until it stabilizes.
Commit all the operations of a transaction into the database. The transaction handle is freed. It and its cursors must not be used again after this call, except with mdb_cursor_renew().
Note:
Parameters:
Returns:
Write the environment parameters of a freshly created DB environment.
Parameters:
Returns:
Create an MDB environment handle. This function allocates memory for a MDB_env structure. To release the allocated memory and discard the handle, call mdb_env_close(). Before the handle may be used, it must be opened using mdb_env_open(). Various other options may also need to be set before opening the handle, e.g. mdb_env_set_mapsize(), mdb_env_set_maxreaders(), mdb_env_set_maxdbs(), depending on usage requirements.
Parameters:
Returns:
Set the size of the memory map to use for this environment. The size should be a multiple of the OS page size. The default is 10485760 bytes. The size of the memory map is also the maximum size of the database. The value should be chosen as large as possible, to accommodate future growth of the database. This function should be called after mdb_env_create() and before mdb_env_open(). It may be called at later times if no transactions are active in this process. Note that the library does not check for this condition, the caller must ensure it explicitly.
If the mapsize is changed by another process, mdb_txn_begin() will return MDB_MAP_RESIZED. This function may be called with a size of zero to adopt the new size.
Any attempt to set a size smaller than the space already consumed by the environment will be silently changed to the current size of the used space.
Parameters:
Returns:
Set the maximum number of named databases for the environment. This function is only needed if multiple databases will be used in the environment. Simpler applications that use the environment as a single unnamed database can ignore this option. This function may only be called after mdb_env_create() and before mdb_env_open().
Parameters:
Returns:
Set the maximum number of threads/reader slots for the environment. This defines the number of slots in the lock table that is used to track readers in the the environment. The default is 126. Starting a read-only transaction normally ties a lock table slot to the current thread until the environment closes or the thread exits. If MDB_NOTLS is in use, mdb_txn_begin() instead ties the slot to the MDB_txn object until it or the MDB_env object is destroyed. This function may only be called after mdb_env_create() and before mdb_env_open().
Parameters:
Returns:
Get the maximum number of threads/reader slots for the environment.
Parameters:
Returns:
Further setup required for opening an MDB environment
Release a reader thread's slot in the reader lock table. This function is called automatically when a thread exits.
Parameters:
Downgrade the exclusive lock on the region back to shared
Try to get exlusive lock, otherwise shared. Maintain *excl = -1: no/unknown lock, 0: shared, 1: exclusive.
Open and/or initialize the lock region for the environment.
Parameters:
Returns:
Open an environment handle. If this function fails, mdb_env_close() must be called to discard the MDB_env handle.
Parameters:
mode The UNIX permissions to set on created files. This parameter is ignored on Windows.
Returns:
Copy an MDB environment to the specified path. This function may be used to make a backup of an existing environment. No lockfile is created, since it gets recreated at need.
Note:
Parameters:
Returns:
Close the environment and release the memory map. Only a single thread may call this function. All transactions, databases, and cursors must already be closed before calling this function. Attempts to use any such handles after calling this function will cause a SIGSEGV. The environment handle will be freed and must not be used again after this call.
Parameters:
Compare two items pointing at aligned size_t's
Compare two items pointing at aligned unsigned int's
Compare two items pointing at unsigned ints of unknown alignment. Nodes and keys are guaranteed to be 2-byte aligned.
Compare two items lexically
Compare two items in reverse byte order
Search for the lowest key under the current branch page. This just bypasses a NUMKEYS check in the current page before calling mdb_page_search_root(), because the callers are all in situations where the current page is known to be underfilled.
Get items from a database. This function retrieves key/data pairs from the database. The address and length of the data associated with the specified key are returned in the structure to which data refers. If the database supports duplicate keys (MDB_DUPSORT) then the first data item for the key will be returned. Retrieval of other items requires the use of mdb_cursor_get().
Note:
Values returned from the database are valid only until a subsequent update operation, or the end of the transaction.
Parameters:
Returns:
Retrieve by cursor. This function retrieves key/data pairs from the database. The address and length of the key are returned in the object to which key refers (except for the case of the MDB_SET option, in which the key object is unchanged), and the address and length of the data are returned in the object to which data refers. See mdb_get() for restrictions on using the output values.
Parameters:
Returns:
Touch all the pages in the cursor stack. Set mc_top. Makes sure all the pages are writable, before attempting a write operation.
Parameters:
Store by cursor. This function stores key/data pairs into the database. If the function fails for any reason, the state of the cursor will be unchanged. If the function succeeds and an item is inserted into the database, the cursor is always positioned to refer to the newly inserted item.
Parameters:
Returns:
Delete current key/data pair. This function deletes the key/data pair to which the cursor refers.
Parameters:
Returns:
Create a cursor handle. A cursor is associated with a specific transaction and database. A cursor cannot be used when its database handle is closed. Nor when its transaction has ended, except with mdb_cursor_renew(). It can be discarded with mdb_cursor_close(). A cursor in a write-transaction can be closed before its transaction ends, and will otherwise be closed when its transaction ends. A cursor in a read-only transaction must be closed explicitly, before or after its transaction ends. It can be reused with mdb_cursor_renew() before finally closing it.
Note:
Parameters:
Returns:
Renew a cursor handle. A cursor is associated with a specific transaction and database. Cursors that are only used in read-only transactions may be re-used, to avoid unnecessary malloc/free overhead. The cursor may be associated with a new read-only transaction, and referencing the same database handle as it was created with. This may be done whether the previous transaction is live or dead.
Parameters:
Returns:
Return count of duplicates for current key. This call is only valid on databases that support sorted duplicate data items MDB_DUPSORT.
Parameters:
Returns:
Close a cursor handle. The cursor handle will be freed and must not be used again after this call. Its transaction must still be live if it is a write-transaction.
Parameters:
Return the cursor's transaction handle.
Parameters:
Return the cursor's database handle.
Parameters:
Copy the contents of a cursor.
Parameters:
Delete items from a database. This function removes key/data pairs from the database. If the database does not support sorted duplicate data items (MDB_DUPSORT) the data parameter is ignored. If the database supports sorted duplicates and the data parameter is NULL, all of the duplicate data items for the key will be deleted. Otherwise, if the data parameter is non-NULL only the matching data item will be deleted. This function will return MDB_NOTFOUND if the specified key/data pair is not in the database.
Parameters:
Returns:
Store items into a database. This function stores key/data pairs in the database. The default behavior is to enter the new key/data pair, replacing any previously existing key if duplicates are disallowed, or adding a duplicate data item if duplicates are allowed (MDB_DUPSORT).
Parameters:
Returns:
Set environment flags. This may be used to set some flags in addition to those from mdb_env_open(), or to unset these flags.
Parameters:
Returns:
Get environment flags.
Parameters:
Returns:
Return the path that was used in mdb_env_open().
Parameters:
Returns:
Return the filedescriptor for the given environment.
Parameters:
Returns:
Common code for mdb_stat() and mdb_env_stat().
Parameters:
Returns:
Return statistics about the MDB environment.
Parameters:
Return information about the MDB environment.
Parameters:
Open a database in the environment. A database handle denotes the name and parameters of a database, independently of whether such a database exists. The database handle may be discarded by calling mdb_dbi_close(). The old database handle is returned if the database was already open. The handle must only be closed once. The database handle will be private to the current transaction until the transaction is successfully committed. If the transaction is aborted the handle will be closed automatically. After a successful commit the handle will reside in the shared environment, and may be used by other transactions. This function must not be called from multiple concurrent transactions. A transaction that uses this function must finish (either commit or abort) before any other transaction may use this function.
To use named databases (with name != NULL), mdb_env_set_maxdbs() must be called before opening the environment.
Parameters:
dbi Address where the new MDB_dbi handle will be stored
Returns:
Retrieve statistics for a database.
Parameters:
Returns:
Close a database handle. This call is not mutex protected. Handles should only be closed by a single thread, and only if no other threads are going to reference the database handle or one of its cursors any further. Do not close a handle if an existing transaction has modified its database.
Parameters:
Retrieve the DB flags for a database handle.
Parameters:
Returns:
Empty or delete+close a database.
Parameters:
Returns:
Set a custom key comparison function for a database. The comparison function is called whenever it is necessary to compare a key specified by the application with a key currently stored in the database. If no comparison function is specified, and no special key flags were specified with mdb_dbi_open(), the keys are compared lexically, with shorter keys collating before longer keys.
Warning:
Parameters:
Returns:
Set a custom data comparison function for a MDB_DUPSORT database. This comparison function is called whenever it is necessary to compare a data item specified by the application with a data item currently stored in the database. This function only takes effect if the database was opened with the MDB_DUPSORT flag. If no comparison function is specified, and no special key flags were specified with mdb_dbi_open(), the data items are compared lexically, with shorter items collating before longer items.
Warning:
Parameters:
Returns:
Set a relocation function for a MDB_FIXEDMAP database.
Todo
Parameters:
Returns:
Set a context pointer for a MDB_FIXEDMAP database's relocation function. See mdb_set_relfunc and MDB_rel_func for more details.
Parameters:
Returns:
Get the maximum size of a key for the environment. This is the compile-time constant MDB_MAXKEYSIZE, default 511. See MDB_val.
Parameters:
Returns:
Dump the entries in the reader lock table.
Parameters:
Returns:
Insert pid into list if not already present. return -1 if already present.
Check for stale entries in the reader lock table.
Parameters:
Returns:
Initial value:
= {
"MDB_KEYEXIST: Key/data pair already exists",
"MDB_NOTFOUND: No matching key/data pair found",
"MDB_PAGE_NOTFOUND: Requested page not found",
"MDB_CORRUPTED: Located page was wrong type",
"MDB_PANIC: Update of meta page failed",
"MDB_VERSION_MISMATCH: Database environment version mismatch",
"MDB_INVALID: File is not an MDB file",
"MDB_MAP_FULL: Environment mapsize limit reached",
"MDB_DBS_FULL: Environment maxdbs limit reached",
"MDB_READERS_FULL: Environment maxreaders limit reached",
"MDB_TLS_FULL: Thread-local storage keys full - too many environments open",
"MDB_TXN_FULL: Transaction has too many dirty pages - transaction too big",
"MDB_CURSOR_FULL: Internal error - cursor stack limit reached",
"MDB_PAGE_FULL: Internal error - page has no more space",
"MDB_MAP_RESIZED: Database contents grew beyond environment mapsize",
"MDB_INCOMPATIBLE: Operation and DB incompatible, or DB flags changed",
"MDB_BAD_RSLOT: Invalid reuse of reader locktable slot",
"MDB_BAD_TXN: Transaction cannot recover - it must be aborted",
"MDB_BAD_VALSIZE: Too big key/data, key is empty, or wrong DUPFIXED size",
}
Table of descriptions for MDB Return Codes
Generated automatically by Doxygen for MDB from the source code.