Man page - mdb_internal(3)
Packages contains this manual
Manual
internal
NAMESYNOPSIS
Modules
Data Structures
Macros
Typedefs
Enumerations
Functions
Variables
Detailed Description
Data Structure Documentation
struct MDB_page
Field Documentation
pgno_t MDB_page::p_pgno
struct MDB_page* MDB_page::p_next
uint16_t MDB_page::mp_pad
uint16_t MDB_page::mp_flags
indx_t MDB_page::pb_lower
indx_t MDB_page::pb_upper
uint32_t MDB_page::pb_pages
indx_t MDB_page::mp_ptrs[0]
struct MDB_page2
struct MDB_node
Field Documentation
unsigned short MDB_node::mn_lo
unsigned short MDB_node::mn_hi
unsigned short MDB_node::mn_flags
unsigned short MDB_node::mn_ksize
char MDB_node::mn_data[1]
struct MDB_db
Field Documentation
uint32_t MDB_db::md_pad
uint16_t MDB_db::md_flags
uint16_t MDB_db::md_depth
pgno_t MDB_db::md_branch_pages
pgno_t MDB_db::md_leaf_pages
pgno_t MDB_db::md_overflow_pages
size_t MDB_db::md_entries
pgno_t MDB_db::md_root
struct MDB_meta
Field Documentation
uint32_t MDB_meta::mm_magic
uint32_t MDB_meta::mm_version
void* MDB_meta::mm_address
size_t MDB_meta::mm_mapsize
MDB_db MDB_meta::mm_dbs[CORE_DBS]
pgno_t MDB_meta::mm_last_pg
volatile txnid_t MDB_meta::mm_txnid
union MDB_metabuf
struct MDB_dbx
Field Documentation
MDB_val MDB_dbx::md_name
MDB_cmp_func* MDB_dbx::md_cmp
MDB_cmp_func* MDB_dbx::md_dcmp
MDB_rel_func* MDB_dbx::md_rel
void* MDB_dbx::md_relctx
struct MDB_txn
Field Documentation
MDB_txn* MDB_txn::mt_parent
MDB_txn* MDB_txn::mt_child
pgno_t MDB_txn::mt_next_pgno
txnid_t MDB_txn::mt_txnid
MDB_env* MDB_txn::mt_env
MDB_IDL MDB_txn::mt_free_pgs
MDB_page* MDB_txn::mt_loose_pgs
int MDB_txn::mt_loose_count
MDB_IDL MDB_txn::mt_spill_pgs
MDB_ID2L MDB_txn::dirty_list
MDB_reader* MDB_txn::reader
MDB_dbx* MDB_txn::mt_dbxs
MDB_db* MDB_txn::mt_dbs
unsigned int* MDB_txn::mt_dbiseqs
MDB_cursor** MDB_txn::mt_cursors
unsigned char* MDB_txn::mt_dbflags
MDB_dbi MDB_txn::mt_numdbs
unsigned int MDB_txn::mt_flags
unsigned int MDB_txn::mt_dirty_room
struct MDB_cursor
Field Documentation
MDB_cursor* MDB_cursor::mc_next
MDB_cursor* MDB_cursor::mc_backup
struct MDB_xcursor* MDB_cursor::mc_xcursor
MDB_txn* MDB_cursor::mc_txn
MDB_dbi MDB_cursor::mc_dbi
MDB_db* MDB_cursor::mc_db
MDB_dbx* MDB_cursor::mc_dbx
unsigned char* MDB_cursor::mc_dbflag
unsigned short MDB_cursor::mc_snum
unsigned short MDB_cursor::mc_top
unsigned int MDB_cursor::mc_flags
MDB_page* MDB_cursor::mc_pg[CURSOR_STACK]
indx_t MDB_cursor::mc_ki[CURSOR_STACK]
struct MDB_xcursor
Field Documentation
MDB_cursor MDB_xcursor::mx_cursor
MDB_db MDB_xcursor::mx_db
MDB_dbx MDB_xcursor::mx_dbx
unsigned char MDB_xcursor::mx_dbflag
struct MDB_pgstate
Field Documentation
pgno_t* MDB_pgstate::mf_pghead
txnid_t MDB_pgstate::mf_pglast
struct MDB_env
Field Documentation
HANDLE MDB_env::me_fd
HANDLE MDB_env::me_lfd
HANDLE MDB_env::me_mfd
uint32_t MDB_env::me_flags
unsigned int MDB_env::me_psize
unsigned int MDB_env::me_os_psize
unsigned int MDB_env::me_maxreaders
volatile int MDB_env::me_close_readers
MDB_dbi MDB_env::me_numdbs
MDB_dbi MDB_env::me_maxdbs
MDB_PID_T MDB_env::me_pid
char* MDB_env::me_path
char* MDB_env::me_map
MDB_txninfo* MDB_env::me_txns
MDB_meta* MDB_env::me_metas[NUM_METAS]
void* MDB_env::me_pbuf
MDB_txn* MDB_env::me_txn
MDB_txn* MDB_env::me_txn0
size_t MDB_env::me_mapsize
off_t MDB_env::me_size
pgno_t MDB_env::me_maxpg
MDB_dbx* MDB_env::me_dbxs
uint16_t* MDB_env::me_dbflags
unsigned int* MDB_env::me_dbiseqs
pthread_key_t MDB_env::me_txkey
txnid_t MDB_env::me_pgoldest
MDB_pgstate MDB_env::me_pgstate
MDB_page* MDB_env::me_dpages
MDB_IDL MDB_env::me_free_pgs
MDB_ID2L MDB_env::me_dirty_list
int MDB_env::me_maxfree_1pg
unsigned int MDB_env::me_nodemax
int MDB_env::me_live_reader
void* MDB_env::me_userctx
MDB_assert_func* MDB_env::me_assert_func
struct MDB_ntxn
Field Documentation
MDB_txn MDB_ntxn::mnt_txn
MDB_pgstate MDB_ntxn::mnt_pgstate
struct MDB_name
Field Documentation
int MDB_name::mn_len
int MDB_name::mn_alloced
mdb_nchar_t* MDB_name::mn_val
struct mdb_copy
Field Documentation
pthread_cond_t mdb_copy::mc_cond
int mdb_copy::mc_toggle
int mdb_copy::mc_new
volatile int mdb_copy::mc_error
Macro Definition Documentation
#define MDB_DSYNC O_SYNC
#define MDB_FDATASYNC fdatasync
#define MAX_PAGESIZE (PAGEBASE ? 0x10000 : 0x8000)
#define MDB_MINKEYS 2
#define MDB_MAGIC 0xBEEFC0DE
#define MDB_DATA_VERSION ((MDB_DEVEL) ? 999 : 1)
#define MDB_LOCK_VERSION 1
#define MDB_MAXKEYSIZE ((MDB_DEVEL) ? 0 : 511)
#define ENV_MAXKEY(env) (MDB_MAXKEYSIZE)
#define MAXDATASIZE 0xffffffffUL
#define P_INVALID (˜(pgno_t)0)
#define F_ISSET(w, f) (((w) & (f)) == (f))
#define EVEN(n) (((n) + 1U) & -2) /* sign-extending -2 to match n+1U */
#define DEFAULT_MAPSIZE 1048576
#define PAGEHDRSZ ((unsigned) offsetof(MDB_page, mp_ptrs))
#define METADATA(p) ((void *)((char *)(p) + PAGEHDRSZ))
#define PAGEBASE ((MDB_DEVEL) ? PAGEHDRSZ : 0)
#define NUMKEYS(p) ((MP_LOWER(p) - (PAGEHDRSZ-PAGEBASE)) >> 1)
#define SIZELEFT(p) (indx_t)(MP_UPPER(p) - MP_LOWER(p))
#define PAGEFILL(env, p)
#define FILL_THRESHOLD 250
#define IS_LEAF(p) F_ISSET(MP_FLAGS(p), P_LEAF)
#define IS_LEAF2(p) F_ISSET(MP_FLAGS(p), P_LEAF2)
#define IS_BRANCH(p) F_ISSET(MP_FLAGS(p), P_BRANCH)
#define IS_OVERFLOW(p) F_ISSET(MP_FLAGS(p), P_OVERFLOW)
#define IS_SUBP(p) F_ISSET(MP_FLAGS(p), P_SUBP)
#define OVPAGES(size, psize) ((PAGEHDRSZ-1 + (size)) / (psize) + 1)
#define NEXT_LOOSE_PAGE(p) (*(MDB_page **)((p) + 2))
#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) + MP_PTRS(p)[i] +PAGEBASE))
#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 VALID_FLAGS
#define FREE_DBI 0
#define MAIN_DBI 1
#define CORE_DBS 2
#define NUM_METAS 2
#define CURSOR_STACK 32
#define XCURSOR_INITED(mc) ((mc)->mc_xcursor &&((mc)->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED))
#define XCURSOR_REFRESH(mc, top, mp)
#define MDB_COMMIT_PAGES 64
#define MAX_WRITE (0x40000000U >> (sizeof(ssize_t) == 4))
#define TXN_DBI_EXIST(txn, dbi, validity) ((txn) &&(dbi)<(txn)->mt_numdbs && ((txn)->mt_dbflags[dbi] & (validity)))
#define TXN_DBI_CHANGED(txn, dbi) ((txn)->mt_dbiseqs[dbi] !=(txn)->mt_env->me_dbiseqs[dbi])
#define MDB_END_NAMES
#define MDB_END_OPMASK 0x0F
#define MDB_END_UPDATE 0x10
#define MDB_END_FREE 0x20
#define MDB_END_SLOT MDB_NOTLS
#define MDB_SPLIT_REPLACE MDB_APPENDDUP
#define mdb_cmp_clong mdb_cmp_cint
#define mdb_cassert(mc, expr) mdb_assert0((mc)->mc_txn->mt_env, expr,#expr)
#define mdb_tassert(txn, expr) mdb_assert0((txn)->mt_env, expr, #expr)
#define mdb_eassert(env, expr) mdb_assert0(env, expr, #expr)
#define mdb_assert0(env, expr, expr_txt)
#define MDB_NAME(str) str
#define mdb_name_cpy strcpy
#define MDB_SUFFLEN 9
#define mdb_fname_destroy(fname) do { if ((fname).mn_alloced)free((fname).mn_val); } while (0)
#define CHANGEABLE (MDB_NOSYNC|MDB_NOMETASYNC|MDB_MAPASYNC|MDB_NOMEMINIT)
#define CHANGELESS
#define MDB_NOSPILL 0x8000
#define WITH_CURSOR_TRACKING(mn, act)
#define MDB_EOF 0x10
Typedef Documentation
typedef MDB_ID pgno_t
typedef MDB_ID txnid_t
typedef uint16_t indx_t
typedef char mdb_nchar_t
Enumeration Type Documentation
enum mdb_fopen_type
Function Documentation
static int mdb_page_alloc (MDB_cursor * mc, int num, MDB_page ** mp)[static]
static int mdb_page_new (MDB_cursor * mc, uint32_t flags, int num, MDB_page** mp) [static]
static int mdb_page_touch (MDB_cursor * mc) [static]
static void mdb_txn_end (MDB_txn * txn, unsigned mode) [static]
static int mdb_page_get (MDB_cursor * mc, pgno_t pgno, MDB_page ** ret, int* lvl) [static]
static int mdb_page_search_root (MDB_cursor * mc, MDB_val * key, int flags)[static]
static int mdb_page_search (MDB_cursor * mc, MDB_val * key, int flags)[static]
static int mdb_page_merge (MDB_cursor * csrc, MDB_cursor * cdst) [static]
static int mdb_page_split (MDB_cursor * mc, MDB_val * newkey, MDB_val *newdata, pgno_t newpgno, unsigned int nflags) [static]
static int ESECT mdb_env_read_header (MDB_env * env, MDB_meta * meta)[static]
static MDB_meta * mdb_env_pick_meta (const MDB_env * env) [static]
static int mdb_env_write_meta (MDB_txn * txn) [static]
static void ESECT mdb_env_close0 (MDB_env * env, int excl) [static]
static MDB_node * mdb_node_search (MDB_cursor * mc, MDB_val * key, int *exactp) [static]
static int mdb_node_add (MDB_cursor * mc, indx_t indx, MDB_val * key,MDB_val * data, pgno_t pgno, unsigned int flags) [static]
static void mdb_node_del (MDB_cursor * mc, int ksize) [static]
static void mdb_node_shrink (MDB_page * mp, indx_t indx) [static]
static int mdb_node_move (MDB_cursor * csrc, MDB_cursor * cdst, intfromleft) [static]
static int mdb_node_read (MDB_cursor * mc, MDB_node * leaf, MDB_val * data)[static]
static size_t mdb_leaf_size (MDB_env * env, MDB_val * key, MDB_val * data)[static]
static size_t mdb_branch_size (MDB_env * env, MDB_val * key) [static]
static int mdb_rebalance (MDB_cursor * mc) [static]
static int mdb_update_key (MDB_cursor * mc, MDB_val * key) [static]
static void mdb_cursor_pop (MDB_cursor * mc) [static]
static int mdb_cursor_push (MDB_cursor * mc, MDB_page * mp) [static]
static int mdb_cursor_del0 (MDB_cursor * mc) [static]
static int mdb_cursor_sibling (MDB_cursor * mc, int move_right) [static]
static int mdb_cursor_next (MDB_cursor * mc, MDB_val * key, MDB_val * data,MDB_cursor_op op) [static]
static int mdb_cursor_prev (MDB_cursor * mc, MDB_val * key, MDB_val * data,MDB_cursor_op op) [static]
static int mdb_cursor_set (MDB_cursor * mc, MDB_val * key, MDB_val * data,MDB_cursor_op op, int * exactp) [static]
static int mdb_cursor_first (MDB_cursor * mc, MDB_val * key, MDB_val *data) [static]
static int mdb_cursor_last (MDB_cursor * mc, MDB_val * key, MDB_val * data)[static]
static void mdb_cursor_init (MDB_cursor * mc, MDB_txn * txn, MDB_dbi dbi,MDB_xcursor * mx) [static]
static void mdb_xcursor_init0 (MDB_cursor * mc) [static]
static void mdb_xcursor_init1 (MDB_cursor * mc, MDB_node * node) [static]
static void mdb_xcursor_init2 (MDB_cursor * mc, MDB_xcursor * src_mx, intnew_dupdata) [static]
static int mdb_drop0 (MDB_cursor * mc, int subs) [static]
static void mdb_default_cmp (MDB_txn * txn, MDB_dbi dbi) [static]
static int ESECT mdb_reader_check0 (MDB_env * env, int rlocked, int * dead)[static]
char *ESECT mdb_version (int * major, int * minor, int * patch)
char * mdb_strerror (int err)
int mdb_cmp (MDB_txn * txn, MDB_dbi dbi, const MDB_val * a, const MDB_val *b)
int mdb_dcmp (MDB_txn * txn, MDB_dbi dbi, const MDB_val * a, const MDB_val* b)
static MDB_page * mdb_page_malloc (MDB_txn * txn, unsigned num) [static]
static void mdb_page_free (MDB_env * env, MDB_page * mp) [static]
static void mdb_dpage_free (MDB_env * env, MDB_page * dp) [static]
static void mdb_dlist_free (MDB_txn * txn) [static]
static int mdb_page_loose (MDB_cursor * mc, MDB_page * mp) [static]
static int mdb_pages_xkeep (MDB_cursor * mc, unsigned pflags, int all)[static]
static int mdb_page_flush (MDB_txn * txn, int keep) [static]
static int mdb_page_spill (MDB_cursor * m0, MDB_val * key, MDB_val * data)[static]
static txnid_t mdb_find_oldest (MDB_txn * txn) [static]
static void mdb_page_dirty (MDB_txn * txn, MDB_page * mp) [static]
static void mdb_page_copy (MDB_page * dst, MDB_page * src, unsigned intpsize) [static]
static int mdb_page_unspill (MDB_txn * txn, MDB_page * mp, MDB_page ** ret)[static]
int mdb_env_sync (MDB_env * env, int force)
static int mdb_cursor_shadow (MDB_txn * src, MDB_txn * dst) [static]
static void mdb_cursors_close (MDB_txn * txn, unsigned merge) [static]
static int mdb_reader_pid (MDB_env * env, enum Pidlock_op op, MDB_PID_Tpid) [static]
static int mdb_txn_renew0 (MDB_txn * txn) [static]
int mdb_txn_renew (MDB_txn * txn)
int mdb_txn_begin (MDB_env * env, MDB_txn * parent, unsigned int flags,MDB_txn ** txn)
MDB_env * mdb_txn_env (MDB_txn * txn)
size_t mdb_txn_id (MDB_txn * txn)
static void mdb_dbis_update (MDB_txn * txn, int keep) [static]
void mdb_txn_reset (MDB_txn * txn)
void mdb_txn_abort (MDB_txn * txn)
static int mdb_freelist_save (MDB_txn * txn) [static]
int mdb_txn_commit (MDB_txn * txn)
static void ESECT mdb_env_init_meta0 (MDB_env * env, MDB_meta * meta)[static]
static int ESECT mdb_env_init_meta (MDB_env * env, MDB_meta * meta)[static]
int ESECT mdb_env_create (MDB_env ** env)
int ESECT mdb_env_set_mapsize (MDB_env * env, size_t size)
int ESECT mdb_env_set_maxdbs (MDB_env * env, MDB_dbi dbs)
int ESECT mdb_env_set_maxreaders (MDB_env * env, unsigned int readers)
int ESECT mdb_env_get_maxreaders (MDB_env * env, unsigned int * readers)
static int ESECT mdb_fname_init (const char * path, unsigned envflags,MDB_name * fname) [static]
static int ESECT mdb_fopen (const MDB_env * env, MDB_name * fname, enummdb_fopen_type which, mdb_mode_t mode, HANDLE * res) [static]
static int ESECT mdb_env_open2 (MDB_env * env) [static]
static void mdb_env_reader_dest (void * ptr) [static]
static int ESECT mdb_env_share_locks (MDB_env * env, int * excl) [static]
static int ESECT mdb_env_excl_lock (MDB_env * env, int * excl) [static]
static int ESECT mdb_env_setup_locks (MDB_env * env, MDB_name * fname, intmode, int * excl) [static]
int ESECT mdb_env_open (MDB_env * env, const char * path, unsigned intflags, mdb_mode_t mode)
void ESECT mdb_env_close (MDB_env * env)
static int mdb_cmp_long (const MDB_val * a, const MDB_val * b) [static]
static int mdb_cmp_int (const MDB_val * a, const MDB_val * b) [static]
static int mdb_cmp_cint (const MDB_val * a, const MDB_val * b) [static]
static int mdb_cmp_memn (const MDB_val * a, const MDB_val * b) [static]
static int mdb_cmp_memnr (const MDB_val * a, const MDB_val * b) [static]
static int mdb_page_search_lowest (MDB_cursor * mc) [static]
int mdb_get (MDB_txn * txn, MDB_dbi dbi, MDB_val * key, MDB_val * data)
int mdb_cursor_get (MDB_cursor * cursor, MDB_val * key, MDB_val * data,MDB_cursor_op op)
static int mdb_cursor_touch (MDB_cursor * mc) [static]
int mdb_cursor_put (MDB_cursor * cursor, MDB_val * key, MDB_val * data,unsigned int flags)
int mdb_cursor_del (MDB_cursor * cursor, unsigned int flags)
int mdb_cursor_open (MDB_txn * txn, MDB_dbi dbi, MDB_cursor ** cursor)
int mdb_cursor_renew (MDB_txn * txn, MDB_cursor * cursor)
int mdb_cursor_count (MDB_cursor * cursor, size_t * countp)
void mdb_cursor_close (MDB_cursor * cursor)
MDB_txn * mdb_cursor_txn (MDB_cursor * cursor)
MDB_dbi mdb_cursor_dbi (MDB_cursor * cursor)
static void mdb_cursor_copy (const MDB_cursor * csrc, MDB_cursor * cdst)[static]
int mdb_del (MDB_txn * txn, MDB_dbi dbi, MDB_val * key, MDB_val * data)
int mdb_put (MDB_txn * txn, MDB_dbi dbi, MDB_val * key, MDB_val * data,unsigned int flags)
static THREAD_RET ESECT CALL_CONV mdb_env_copythr (void * arg) [static]
static int ESECT mdb_env_cthr_toggle (mdb_copy * my, int adjust) [static]
static int ESECT mdb_env_cwalk (mdb_copy * my, pgno_t * pg, int flags)[static]
static int ESECT mdb_env_copyfd1 (MDB_env * env, HANDLE fd) [static]
static int ESECT mdb_env_copyfd0 (MDB_env * env, HANDLE fd) [static]
int ESECT mdb_env_copy2 (MDB_env * env, const char * path, unsigned intflags)
int ESECT mdb_env_copy (MDB_env * env, const char * path)
int ESECT mdb_env_set_flags (MDB_env * env, unsigned int flags, int onoff)
int ESECT mdb_env_get_flags (MDB_env * env, unsigned int * flags)
int ESECT mdb_env_set_userctx (MDB_env * env, void * ctx)
void *ESECT mdb_env_get_userctx (MDB_env * env)
int ESECT mdb_env_set_assert (MDB_env * env, MDB_assert_func * func)
int ESECT mdb_env_get_path (MDB_env * env, const char ** path)
int ESECT mdb_env_get_fd (MDB_env * env, mdb_filehandle_t * fd)
static int ESECT mdb_stat0 (MDB_env * env, MDB_db * db, MDB_stat * arg)[static]
int ESECT mdb_env_stat (MDB_env * env, MDB_stat * stat)
int ESECT mdb_env_info (MDB_env * env, MDB_envinfo * stat)
int mdb_dbi_open (MDB_txn * txn, const char * name, unsigned int flags,MDB_dbi * dbi)
int ESECT mdb_stat (MDB_txn * txn, MDB_dbi dbi, MDB_stat * stat)
void mdb_dbi_close (MDB_env * env, MDB_dbi dbi)
int mdb_dbi_flags (MDB_txn * txn, MDB_dbi dbi, unsigned int * flags)
int mdb_drop (MDB_txn * txn, MDB_dbi dbi, int del)
int mdb_set_compare (MDB_txn * txn, MDB_dbi dbi, MDB_cmp_func * cmp)
int mdb_set_dupsort (MDB_txn * txn, MDB_dbi dbi, MDB_cmp_func * cmp)
int mdb_set_relfunc (MDB_txn * txn, MDB_dbi dbi, MDB_rel_func * rel)
int mdb_set_relctx (MDB_txn * txn, MDB_dbi dbi, void * ctx)
int ESECT mdb_env_get_maxkeysize (MDB_env * env)
int ESECT mdb_reader_list (MDB_env * env, MDB_msg_func * func, void * ctx)
static int ESECT mdb_pid_insert (MDB_PID_T * ids, MDB_PID_T pid) [static]
int ESECT mdb_reader_check (MDB_env * env, int * dead)
Variable Documentation
char* const mdb_errstr[] [static]
const mdb_nchar_t* const mdb_suffixes[2][2] [static]
Author
NAME
internal - LMDB Internals
SYNOPSIS
Modules
ID List
Management
Compatibility Macros
Debug Macros
Reader Lock Table
Page Flags
Node Flags
Transaction DB Flags
Transaction Flags
Cursor Flags
Data Structures
struct
MDB_page
struct
MDB_page2
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
struct
MDB_name
struct
mdb_copy
Macros
#define
LOCK_MUTEX
(rc, env, mutex) ((rc) =
LOCK_MUTEX0
(mutex))
#define
mdb_mutex_failed
(env, mutex, rc) (rc)
#define
MDB_DSYNC
O_SYNC
#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
(
PAGEBASE
? 0x10000 :
0x8000)
The maximum size of a database page.
#define
MDB_MINKEYS
2
#define
MDB_MAGIC
0xBEEFC0DE
#define
MDB_DATA_VERSION
((
MDB_DEVEL
) ? 999 :
1)
#define
MDB_LOCK_VERSION
1
#define
MDB_MAXKEYSIZE
((
MDB_DEVEL
) ? 0 : 511)
The max size of a key we can write, or 0 for computed max.
#define
ENV_MAXKEY
(env) (
MDB_MAXKEYSIZE
)
#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
EVEN
(n) (((n) + 1U) & -2) /*
sign-extending -2 to match n+1U */
#define
DEFAULT_MAPSIZE
1048576
#define
MP_PGNO
(p) (((
MDB_page2
*)(void
*)(p))->mp2_p)
#define
MP_PAD
(p) (((
MDB_page2
*)(void
*)(p))->mp2_pad)
#define
MP_FLAGS
(p) (((
MDB_page2
*)(void
*)(p))->mp2_flags)
#define
MP_LOWER
(p) (((
MDB_page2
*)(void
*)(p))->mp2_lower)
#define
MP_UPPER
(p) (((
MDB_page2
*)(void
*)(p))->mp2_upper)
#define
MP_PTRS
(p) (((
MDB_page2
*)(void
*)(p))->mp2_ptrs)
#define
PAGEHDRSZ
((unsigned)
offsetof(
MDB_page
, mp_ptrs))
#define
METADATA
(p) ((void *)((char *)(p) +
PAGEHDRSZ
))
#define
PAGEBASE
((
MDB_DEVEL
) ?
PAGEHDRSZ
: 0)
#define
NUMKEYS
(p) ((MP_LOWER(p) -
(
PAGEHDRSZ
-
PAGEBASE
)) >> 1)
#define
SIZELEFT
(p) (
indx_t
)(MP_UPPER(p) -
MP_LOWER(p))
#define
PAGEFILL
(env, p)
#define
FILL_THRESHOLD
250
#define
IS_LEAF
(p)
F_ISSET
(MP_FLAGS(p),
P_LEAF
)
#define
IS_LEAF2
(p)
F_ISSET
(MP_FLAGS(p),
P_LEAF2
)
#define
IS_BRANCH
(p)
F_ISSET
(MP_FLAGS(p),
P_BRANCH
)
#define
IS_OVERFLOW
(p)
F_ISSET
(MP_FLAGS(p),
P_OVERFLOW
)
#define
IS_SUBP
(p)
F_ISSET
(MP_FLAGS(p),
P_SUBP
)
#define
OVPAGES
(size, psize) ((
PAGEHDRSZ
-1 +
(size)) / (psize) + 1)
#define
NEXT_LOOSE_PAGE
(p) (*(
MDB_page
**)((p)
+ 2))
#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) + MP_PTRS(p)[i] +
PAGEBASE
))
#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
CORE_DBS
2
#define
NUM_METAS
2
#define
CURSOR_STACK
32
|
#define XCURSOR_INITED (mc) |
((mc)->mc_xcursor && ((mc)->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED )) |
#define
XCURSOR_REFRESH
(mc, top, mp)
#define
MDB_COMMIT_PAGES
64
#define
MAX_WRITE
(0x40000000U >>
(sizeof(ssize_t) == 4))
|
#define TXN_DBI_EXIST (txn, dbi, validity) |
((txn) && (dbi)<(txn)->mt_numdbs && ((txn)->mt_dbflags[dbi] & (validity))) |
|||||
|
#define TXN_DBI_CHANGED (txn, dbi) |
((txn)->mt_dbiseqs[dbi] != (txn)->mt_env->me_dbiseqs[dbi]) |
#define
MDB_END_NAMES
#define
MDB_END_OPMASK
0x0F
#define
MDB_END_UPDATE
0x10
#define
MDB_END_FREE
0x20
#define
MDB_END_SLOT MDB_NOTLS
#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_cmp_clong mdb_cmp_cint
#define
mdb_cassert
(mc, expr)
mdb_assert0((mc)->mc_txn->mt_env, expr, #expr)
#define
mdb_tassert
(txn, expr)
mdb_assert0((txn)->mt_env, expr, #expr)
#define
mdb_eassert
(env, expr) mdb_assert0(env, expr,
#expr)
#define
mdb_assert0
(env, expr, expr_txt)
#define
MDB_NAME
(str) str
#define
mdb_name_cpy
strcpy
#define
MDB_SUFFLEN
9
|
#define mdb_fname_destroy (fname) |
do { if ((fname).mn_alloced) free((fname).mn_val); } while (0) |
#define
MDB_CLOEXEC
0
#define
CHANGEABLE
(
MDB_NOSYNC
|
MDB_NOMETASYNC
|
MDB_MAPASYNC
|
MDB_NOMEMINIT
)
#define
CHANGELESS
#define
MDB_NOSPILL
0x8000
#define
WITH_CURSOR_TRACKING
(mn, act)
#define
MDB_WBUF
(1024*1024)
#define
MDB_EOF
0x10
Typedefs
typedef
MDB_ID pgno_t
typedef
MDB_ID txnid_t
typedef uint16_t
indx_t
typedef char
mdb_nchar_t
Enumerations
enum {
MDB_END_COMMITTED
,
MDB_END_EMPTY_COMMIT
,
MDB_END_ABORT
,
MDB_END_RESET
,
MDB_END_RESET_TMP
,
MDB_END_FAIL_BEGIN
,
MDB_END_FAIL_BEGINCHILD
}
enum
Pidlock_op
{
Pidset
= F_SETLK,
Pidcheck
= F_GETLK }
enum
mdb_fopen_type
{
MDB_O_RDONLY
= O_RDONLY,
MDB_O_RDWR
= O_RDWR |O_CREAT,
MDB_O_META
=
O_WRONLY|MDB_DSYNC |MDB_CLOEXEC,
MDB_O_COPY
=
O_WRONLY|O_CREAT|O_EXCL|MDB_CLOEXEC,
MDB_O_MASK
=
MDB_O_RDWR|MDB_CLOEXEC | MDB_O_RDONLY|MDB_O_META|MDB_O_COPY,
MDB_O_LOCKS
= MDB_O_RDWR|MDB_CLOEXEC |
((MDB_O_MASK+1) & ˜MDB_O_MASK) }
Functions
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 void
mdb_txn_end
(
MDB_txn
*txn,
unsigned mode)
static int
mdb_page_get
(
MDB_cursor
*mc,
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
MDB_meta
*
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_cursor
*mc, int
ksize)
static void
mdb_node_shrink
(
MDB_page
*mp,
indx_t
indx)
static int
mdb_node_move
(
MDB_cursor
*csrc,
MDB_cursor
*cdst, int fromleft)
static int
mdb_node_read
(
MDB_cursor
*mc,
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)
static int
mdb_del0
(
MDB_txn
*txn,
MDB_dbi
dbi,
MDB_val
*key,
MDB_val
*data, unsigned flags)
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 void
mdb_xcursor_init2
(
MDB_cursor
*mc,
MDB_xcursor
*src_mx, int force)
static int
mdb_drop0
(
MDB_cursor
*mc, int
subs)
static void
mdb_default_cmp
(
MDB_txn
*txn,
MDB_dbi
dbi)
static int
mdb_reader_check0
(
MDB_env
*env,
int rlocked, int *dead)
char *ESECT
mdb_version
(int *major, int *minor, int
*patch)
Return the LMDB library version information.
char *
mdb_strerror
(int err)
Return a string describing a given error code.
static void ESECT
mdb_assert_fail
(
MDB_env
*env, const char *expr_txt, const char *func, const char
*file, int line)
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_page_loose
(
MDB_cursor
*mc,
MDB_page
*mp)
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 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
.
size_t
mdb_txn_id
(
MDB_txn
*txn)
Return the transaction’s ID.
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 void ESECT
mdb_env_init_meta0
(
MDB_env
*env,
MDB_meta
*meta)
static int ESECT
mdb_env_init_meta
(
MDB_env
*env,
MDB_meta
*meta)
int ESECT
mdb_env_create
(
MDB_env
**env)
Create an LMDB environment handle.
static int ESECT
mdb_env_map
(
MDB_env
*env,
void *addr)
int ESECT
mdb_env_set_mapsize
(
MDB_env
*env,
size_t size)
Set the size of the memory map to use for this environment.
int ESECT
mdb_env_set_maxdbs
(
MDB_env
*env,
MDB_dbi
dbs)
Set the maximum number of named databases for the
environment.
int ESECT
mdb_env_set_maxreaders
(
MDB_env
*env, unsigned int readers)
Set the maximum number of threads/reader slots for the
environment.
int ESECT
mdb_env_get_maxreaders
(
MDB_env
*env, unsigned int *readers)
Get the maximum number of threads/reader slots for the
environment.
static int ESECT
mdb_fsize
(
HANDLE
fd, size_t
*size)
static int ESECT
mdb_fname_init
(const char *path,
unsigned envflags,
MDB_name
*fname)
static int ESECT
mdb_fopen
(const
MDB_env
*env,
MDB_name
*fname, enum
mdb_fopen_type
which,
mdb_mode_t
mode,
HANDLE
*res)
static int ESECT
mdb_env_open2
(
MDB_env
*env)
static void
mdb_env_reader_dest
(void *ptr)
static int ESECT
mdb_env_share_locks
(
MDB_env
*env, int *excl)
static int ESECT
mdb_env_excl_lock
(
MDB_env
*env, int *excl)
static int ESECT
mdb_env_setup_locks
(
MDB_env
*env,
MDB_name
*fname, int mode, int *excl)
int ESECT
mdb_env_open
(
MDB_env
*env, const
char *path, unsigned int flags,
mdb_mode_t
mode)
Open an environment handle.
void ESECT
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.
static THREAD_RET ESECT CALL_CONV
mdb_env_copythr
(void *arg)
static int ESECT
mdb_env_cthr_toggle
(
mdb_copy
*my, int adjust)
static int ESECT
mdb_env_cwalk
(
mdb_copy
*my,
pgno_t
*pg, int flags)
static int ESECT
mdb_env_copyfd1
(
MDB_env
*env,
HANDLE
fd)
static int ESECT
mdb_env_copyfd0
(
MDB_env
*env,
HANDLE
fd)
int ESECT
mdb_env_copyfd2
(
MDB_env
*env,
HANDLE
fd, unsigned int flags)
int ESECT
mdb_env_copyfd
(
MDB_env
*env,
HANDLE
fd)
int ESECT
mdb_env_copy2
(
MDB_env
*env, const
char *path, unsigned int flags)
Copy an LMDB environment to the specified path, with
options.
int ESECT
mdb_env_copy
(
MDB_env
*env, const
char *path)
Copy an LMDB environment to the specified path.
int ESECT
mdb_env_set_flags
(
MDB_env
*env,
unsigned int flag, int onoff)
Set environment flags.
int ESECT
mdb_env_get_flags
(
MDB_env
*env,
unsigned int *arg)
Get environment flags.
int ESECT
mdb_env_set_userctx
(
MDB_env
*env,
void *ctx)
Set application information associated with the
MDB_env
.
void *ESECT
mdb_env_get_userctx
(
MDB_env
*env)
Get the application information associated with the
MDB_env
.
int ESECT
mdb_env_set_assert
(
MDB_env
*env,
MDB_assert_func
*func)
int ESECT
mdb_env_get_path
(
MDB_env
*env,
const char **arg)
Return the path that was used in
mdb_env_open()
.
int ESECT
mdb_env_get_fd
(
MDB_env
*env,
mdb_filehandle_t
*arg)
Return the filedescriptor for the given environment.
static int ESECT
mdb_stat0
(
MDB_env
*env,
MDB_db
*db,
MDB_stat
*arg)
int ESECT
mdb_env_stat
(
MDB_env
*env,
MDB_stat
*arg)
Return statistics about the LMDB environment.
int ESECT
mdb_env_info
(
MDB_env
*env,
MDB_envinfo
*arg)
Return information about the LMDB environment.
int
mdb_dbi_open
(
MDB_txn
*txn, const char
*name, unsigned int flags,
MDB_dbi
*dbi)
Open a database in the environment.
int ESECT
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. Normally unnecessary. Use with
care:
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 ESECT
mdb_env_get_maxkeysize
(
MDB_env
*env)
Get the maximum size of keys and
MDB_DUPSORT
data we
can write.
int ESECT
mdb_reader_list
(
MDB_env
*env,
MDB_msg_func
*func, void *ctx)
Dump the entries in the reader lock table.
static int ESECT
mdb_pid_insert
(MDB_PID_T *ids,
MDB_PID_T pid)
int ESECT
mdb_reader_check
(
MDB_env
*env, int
*dead)
Check for stale entries in the reader lock table.
Variables
static char
*const
mdb_errstr
[]
static const
mdb_nchar_t
*const
mdb_suffixes
[2][2]
Detailed Description
Data Structure Documentation
struct MDB_page
Common header for all page types. The page type depends on mp_flags .
P_BRANCH and P_LEAF pages have unsorted ’ MDB_node ’s at the end, with sorted mp_ptrs [] entries referring to them. Exception: P_LEAF2 pages omit mp_ptrs and pack sorted MDB_DUPFIXED values after the page header.
P_OVERFLOW records occupy one or more contiguous pages where only the first has a page header. They hold the real data of F_BIGDATA nodes.
P_SUBP sub-pages are small leaf ’pages’ with duplicate data. A node with flag F_DUPDATA but not F_SUBDATA contains a sub-page. (Duplicate data can also go in sub-databases, which use normal pages.)
P_META pages contain MDB_meta , the start point of an LMDB snapshot.
Each non-metapage up to MDB_meta .mm_last_pg is reachable exactly once in the snapshot: Either used by a database or listed in a freeDB record.
Data Fields
union {
pgno_t p_pgno
struct
MDB_page
*
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
[0]
Field Documentation
pgno_t MDB_page::p_pgno
page number
struct MDB_page* MDB_page::p_next
for in-memory list of freed pages
uint16_t MDB_page::mp_pad
key size if this is a LEAF2 page
uint16_t MDB_page::mp_flags
Page Flags
indx_t MDB_page::pb_lower
lower bound of free space
indx_t MDB_page::pb_upper
upper bound of free space
uint32_t MDB_page::pb_pages
number of overflow pages
indx_t MDB_page::mp_ptrs[0]
dynamic size
struct MDB_page2
Alternate page header, for 2-byte aligned access
Data Fields
uint16_t
mp2_p
[sizeof(
pgno_t
)/2]
uint16_t
mp2_pad
uint16_t
mp2_flags
indx_t mp2_lower
indx_t mp2_upper
indx_t mp2_ptrs
[0]
struct MDB_node
Header for a single key/data pair within a page. Used in pages of type P_BRANCH and P_LEAF without P_LEAF2 . We guarantee 2-byte alignment for ’ MDB_node ’s.
mn_lo and mn_hi are used for data size on leaf nodes, and for child pgno on branch nodes. On 64 bit platforms, mn_flags is also used for pgno. (Branch nodes have no flags). Lo and hi are in host byte order in case some accesses can be optimized to 32-bit word access.
Leaf node flags describe node contents. F_BIGDATA says the node’s data part is the page number of an overflow page with actual data. F_DUPDATA and F_SUBDATA can be combined giving duplicate data in a sub-page/sub-database, and named databases (just F_SUBDATA ).
Data Fields
unsigned short
mn_flags
unsigned short
mn_ksize
char
mn_data
[1]
unsigned short
mn_lo
unsigned short
mn_hi
Field Documentation
unsigned short MDB_node::mn_lo
part of data size or pgno
unsigned short MDB_node::mn_hi
part of data size or pgno
unsigned short MDB_node::mn_flags
Node Flags
unsigned short MDB_node::mn_ksize
key size
char MDB_node::mn_data[1]
key and data are appended here
struct MDB_db
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
Field Documentation
uint32_t MDB_db::md_pad
also ksize for LEAF2 pages
uint16_t MDB_db::md_flags
Database Flags
uint16_t MDB_db::md_depth
depth of this tree
pgno_t MDB_db::md_branch_pages
number of internal pages
pgno_t MDB_db::md_leaf_pages
number of leaf pages
pgno_t MDB_db::md_overflow_pages
number of overflow pages
size_t MDB_db::md_entries
number of data items
pgno_t MDB_db::md_root
the root page of this tree
struct MDB_meta
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
[
CORE_DBS
]
pgno_t mm_last_pg
volatile
txnid_t mm_txnid
Field Documentation
uint32_t MDB_meta::mm_magic
Stamp identifying this as an LMDB file. It must be set to MDB_MAGIC .
uint32_t MDB_meta::mm_version
Version number of this file. Must be set to MDB_DATA_VERSION .
void* MDB_meta::mm_address
address for fixed mapping
size_t MDB_meta::mm_mapsize
size of mmap region
MDB_db MDB_meta::mm_dbs[CORE_DBS]
first is free space, 2nd is main db
pgno_t MDB_meta::mm_last_pg
Last used page in the datafile. Actually the file may be shorter if the freeDB lists the final pages.
volatile txnid_t MDB_meta::mm_txnid
txnid that committed this page
union MDB_metabuf
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
struct MDB_dbx
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
Field Documentation
MDB_val MDB_dbx::md_name
name of the database
MDB_cmp_func* MDB_dbx::md_cmp
function for comparing keys
MDB_cmp_func* MDB_dbx::md_dcmp
function for comparing data items
MDB_rel_func* MDB_dbx::md_rel
user relocate function
void* MDB_dbx::md_relctx
user-provided context for md_rel
struct MDB_txn
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_page
*
mt_loose_pgs
int
mt_loose_count
MDB_IDL mt_spill_pgs
union {
MDB_ID2L dirty_list
MDB_reader
*
reader
}
mt_u
MDB_dbx
*
mt_dbxs
MDB_db
*
mt_dbs
unsigned int *
mt_dbiseqs
MDB_cursor
**
mt_cursors
unsigned char *
mt_dbflags
MDB_dbi mt_numdbs
unsigned int
mt_flags
unsigned int
mt_dirty_room
Field Documentation
MDB_txn* MDB_txn::mt_parent
parent of a nested txn
MDB_txn* MDB_txn::mt_child
Nested txn under this txn, set together with flag MDB_TXN_HAS_CHILD
pgno_t MDB_txn::mt_next_pgno
next unallocated page
txnid_t MDB_txn::mt_txnid
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.
MDB_env* MDB_txn::mt_env
the DB environment
MDB_IDL MDB_txn::mt_free_pgs
The list of pages that became unused during this transaction.
MDB_page* MDB_txn::mt_loose_pgs
The list of loose pages that became unused and may be reused in this transaction, linked through NEXT_LOOSE_PAGE(page) .
int MDB_txn::mt_loose_count
Number of loose pages ( mt_loose_pgs )
MDB_IDL MDB_txn::mt_spill_pgs
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.
MDB_ID2L MDB_txn::dirty_list
For write txns: Modified pages. Sorted when not MDB_WRITEMAP.
MDB_reader* MDB_txn::reader
For read txns: This thread/txn’s reader table slot, or NULL.
MDB_dbx* MDB_txn::mt_dbxs
Array of records for each DB known in the environment.
MDB_db* MDB_txn::mt_dbs
Array of MDB_db records for each known DB
unsigned int* MDB_txn::mt_dbiseqs
Array of sequence numbers for each DB handle
MDB_cursor** MDB_txn::mt_cursors
In write txns, array of cursors for each DB
unsigned char* MDB_txn::mt_dbflags
Array of flags for each DB
MDB_dbi MDB_txn::mt_numdbs
Number of DB records in use, or 0 when the txn is finished. This number only ever increments until the txn finishes; we don’t decrement it when individual DB handles are closed.
unsigned int MDB_txn::mt_flags
Transaction Flags
unsigned int MDB_txn::mt_dirty_room
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.
struct MDB_cursor
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
]
Field Documentation
MDB_cursor* MDB_cursor::mc_next
Next cursor on this DB in this txn
MDB_cursor* MDB_cursor::mc_backup
Backup of the original cursor if this cursor is a shadow
struct MDB_xcursor* MDB_cursor::mc_xcursor
Context used for databases with MDB_DUPSORT , otherwise NULL
MDB_txn* MDB_cursor::mc_txn
The transaction that owns this cursor
MDB_dbi MDB_cursor::mc_dbi
The database handle this cursor operates on
MDB_db* MDB_cursor::mc_db
The database record for this cursor
MDB_dbx* MDB_cursor::mc_dbx
The database auxiliary record for this cursor
unsigned char* MDB_cursor::mc_dbflag
The Transaction DB Flags for this database
unsigned short MDB_cursor::mc_snum
number of pushed pages
unsigned short MDB_cursor::mc_top
index of top page, normally mc_snum-1
unsigned int MDB_cursor::mc_flags
Cursor Flags
MDB_page* MDB_cursor::mc_pg[CURSOR_STACK]
stack of pushed pages
indx_t MDB_cursor::mc_ki[CURSOR_STACK]
stack of page indices
struct MDB_xcursor
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
Field Documentation
MDB_cursor MDB_xcursor::mx_cursor
A sub-cursor for traversing the Dup DB
MDB_db MDB_xcursor::mx_db
The database record for this Dup DB
MDB_dbx MDB_xcursor::mx_dbx
The auxiliary DB record for this Dup DB
unsigned char MDB_xcursor::mx_dbflag
The Transaction DB Flags for this Dup DB
struct MDB_pgstate
State of FreeDB old pages, stored in the MDB_env
Data Fields
pgno_t
*
mf_pghead
txnid_t mf_pglast
Field Documentation
pgno_t* MDB_pgstate::mf_pghead
Reclaimed freeDB pages, or NULL before use
txnid_t MDB_pgstate::mf_pglast
ID of last used record, or 0 if !mf_pghead
struct MDB_env
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
volatile int
me_close_readers
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
[
NUM_METAS
]
void *
me_pbuf
MDB_txn
*
me_txn
MDB_txn
*
me_txn0
size_t
me_mapsize
off_t
me_size
pgno_t me_maxpg
MDB_dbx
*
me_dbxs
uint16_t *
me_dbflags
unsigned int *
me_dbiseqs
pthread_key_t
me_txkey
txnid_t me_pgoldest
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
int
me_live_reader
void *
me_userctx
MDB_assert_func
*
me_assert_func
Field Documentation
HANDLE MDB_env::me_fd
The main data file
HANDLE MDB_env::me_lfd
The lock file
HANDLE MDB_env::me_mfd
For writing and syncing the meta pages
uint32_t MDB_env::me_flags
Environment Flags
unsigned int MDB_env::me_psize
DB page size, inited from me_os_psize
unsigned int MDB_env::me_os_psize
OS page size, from GET_PAGESIZE
unsigned int MDB_env::me_maxreaders
size of the reader table
volatile int MDB_env::me_close_readers
Max MDB_txninfo .mti_numreaders of interest to mdb_env_close()
MDB_dbi MDB_env::me_numdbs
number of DBs opened
MDB_dbi MDB_env::me_maxdbs
size of the DB table
MDB_PID_T MDB_env::me_pid
process ID of this env
char* MDB_env::me_path
path to the DB files
char* MDB_env::me_map
the memory map of the data file
MDB_txninfo* MDB_env::me_txns
the memory map of the lock file or NULL
MDB_meta* MDB_env::me_metas[NUM_METAS]
pointers to the two meta pages
void* MDB_env::me_pbuf
scratch area for DUPSORT put()
MDB_txn* MDB_env::me_txn
current write transaction
MDB_txn* MDB_env::me_txn0
prealloc’d write transaction
size_t MDB_env::me_mapsize
size of the data memory map
off_t MDB_env::me_size
current file size
pgno_t MDB_env::me_maxpg
me_mapsize / me_psize
MDB_dbx* MDB_env::me_dbxs
array of static DB info
uint16_t* MDB_env::me_dbflags
array of flags from MDB_db.md_flags
unsigned int* MDB_env::me_dbiseqs
array of dbi sequence numbers
pthread_key_t MDB_env::me_txkey
thread-key for readers
txnid_t MDB_env::me_pgoldest
ID of oldest reader last time we looked
MDB_pgstate MDB_env::me_pgstate
state of old pages from freeDB
MDB_page* MDB_env::me_dpages
list of malloc’d blocks for re-use
MDB_IDL MDB_env::me_free_pgs
IDL of pages that became unused in a write txn
MDB_ID2L MDB_env::me_dirty_list
ID2L of pages written during a write txn. Length MDB_IDL_UM_SIZE.
int MDB_env::me_maxfree_1pg
Max number of freelist items that can fit in a single overflow page
unsigned int MDB_env::me_nodemax
Max size of a node on a page
int MDB_env::me_live_reader
have liveness lock in reader table
void* MDB_env::me_userctx
User-settable context
MDB_assert_func* MDB_env::me_assert_func
Callback for assertion failures
struct MDB_ntxn
Nested transaction
Data Fields
MDB_txn
mnt_txn
MDB_pgstate mnt_pgstate
Field Documentation
MDB_txn MDB_ntxn::mnt_txn
the transaction
MDB_pgstate MDB_ntxn::mnt_pgstate
parent transaction’s saved freestate
struct MDB_name
Filename - string of mdb_nchar_t []
Data Fields
int
mn_len
int
mn_alloced
mdb_nchar_t
*
mn_val
Field Documentation
int MDB_name::mn_len
Length
int MDB_name::mn_alloced
True if mn_val was malloced
mdb_nchar_t* MDB_name::mn_val
Contents
struct mdb_copy
State needed for a double-buffering compacting copy.
Data Fields
MDB_env
*
mc_env
MDB_txn
*
mc_txn
pthread_mutex_t
mc_mutex
pthread_cond_t
mc_cond
char *
mc_wbuf
[2]
char *
mc_over
[2]
int
mc_wlen
[2]
int
mc_olen
[2]
pgno_t mc_next_pgno
HANDLE mc_fd
int
mc_toggle
int
mc_new
volatile int
mc_error
Field Documentation
pthread_cond_t mdb_copy::mc_cond
Condition variable for mc_new
int mdb_copy::mc_toggle
Buffer number in provider
int mdb_copy::mc_new
(0-2 buffers to write) | ( MDB_EOF at end)
volatile int mdb_copy::mc_error
Error code. Never cleared if set. Both threads can set nonzero to fail the copy. Not mutex-protected, LMDB expects atomic int.
Macro Definition Documentation
#define MDB_DSYNC O_SYNC
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
If O_DSYNC is undefined but exists in /usr/include, preferably set some compiler flag to get the definition.
#define MDB_FDATASYNC fdatasync
Function for flushing the data of a file. Define this to fsync if fdatasync() is not supported.
#define MAX_PAGESIZE (PAGEBASE ? 0x10000 : 0x8000)
The maximum size of a database page. It is 32k or 64k, since value-PAGEBASE 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.
#define MDB_MINKEYS 2
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.
#define MDB_MAGIC 0xBEEFC0DE
A stamp that identifies a file as an LMDB file. There’s nothing special about this value other than that it is easily recognizable, and it will reflect any byte order mismatches.
#define MDB_DATA_VERSION ((MDB_DEVEL) ? 999 : 1)
The version number for a database’s datafile format.
#define MDB_LOCK_VERSION 1
The version number for a database’s lockfile format.
#define MDB_MAXKEYSIZE ((MDB_DEVEL) ? 0 : 511)
The max size of a key we can write, or 0 for computed max. This macro should normally be left alone or set to 0. Note that a database with big keys or dupsort data cannot be reliably modified by a liblmdb which uses a smaller max. The default is 511 for backwards compat, or 0 when MDB_DEVEL .
Other values are allowed, for backwards compat. However: A value bigger than the computed max can break if you do not know what you are doing, and liblmdb <= 0.9.10 can break when modifying a DB with keys/dupsort data bigger than its max.
Data items in an MDB_DUPSORT database are also limited to this size, since they’re actually keys of a sub-DB. Keys and MDB_DUPSORT data items must fit on a node in a regular page.
#define ENV_MAXKEY(env) (MDB_MAXKEYSIZE)
The maximum size of a key we can write to the environment.
#define MAXDATASIZE 0xffffffffUL
The maximum size of a data item. We only store a 32 bit value for node sizes.
#define P_INVALID (˜(pgno_t)0)
An invalid page number. Mainly used to denote an empty tree.
#define F_ISSET(w, f) (((w) & (f)) == (f))
Test if the flags f are set in a flag word w .
#define EVEN(n) (((n) + 1U) & -2) /* sign-extending -2 to match n+1U */
Round n up to an even number.
#define DEFAULT_MAPSIZE 1048576
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() .
#define PAGEHDRSZ ((unsigned) offsetof(MDB_page, mp_ptrs))
Size of the page header, excluding dynamic data at the end
#define METADATA(p) ((void *)((char *)(p) + PAGEHDRSZ))
Address of first usable data byte in a page, after the header
#define PAGEBASE ((MDB_DEVEL) ? PAGEHDRSZ : 0)
ITS#7713, change PAGEBASE to handle 65536 byte pages
#define NUMKEYS(p) ((MP_LOWER(p) - (PAGEHDRSZ-PAGEBASE)) >> 1)
Number of nodes on a page
#define SIZELEFT(p) (indx_t)(MP_UPPER(p) - MP_LOWER(p))
The amount of space remaining in the page
#define PAGEFILL(env, p)
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.
#define FILL_THRESHOLD 250
The minimum page fill factor, in tenths of a percent. Pages emptier than this are candidates for merging.
#define IS_LEAF(p) F_ISSET(MP_FLAGS(p), P_LEAF)
Test if a page is a leaf page
#define IS_LEAF2(p) F_ISSET(MP_FLAGS(p), P_LEAF2)
Test if a page is a LEAF2 page
#define IS_BRANCH(p) F_ISSET(MP_FLAGS(p), P_BRANCH)
Test if a page is a branch page
#define IS_OVERFLOW(p) F_ISSET(MP_FLAGS(p), P_OVERFLOW)
Test if a page is an overflow page
#define IS_SUBP(p) F_ISSET(MP_FLAGS(p), P_SUBP)
Test if a page is a sub page
#define OVPAGES(size, psize) ((PAGEHDRSZ-1 + (size)) / (psize) + 1)
The number of overflow pages needed to store the given size.
#define NEXT_LOOSE_PAGE(p) (*(MDB_page **)((p) + 2))
Link in MDB_txn .mt_loose_pgs list. Kept outside the page header, which is needed when reusing the page.
#define NODESIZE offsetof(MDB_node, mn_data)
Size of the node header, excluding dynamic data at the end
#define PGNO_TOPWORD ((pgno_t)-1 > 0xffffffffu ? 32 : 0)
Bit position of top word in page number, for shifting mn_flags
#define INDXSIZE(k) (NODESIZE + ((k) == NULL ? 0 : (k)->mv_size))
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.
#define LEAFSIZE(k, d) (NODESIZE + (k)->mv_size + (d)->mv_size)
Size of a node in a leaf page with a given key and data. This is node header plus key plus data size.
#define NODEPTR(p, i) ((MDB_node *)((char *)(p) + MP_PTRS(p)[i] +PAGEBASE))
Address of node i in page p
#define NODEKEY(node) (void *)((node)->mn_data)
Address of the key for the node
#define NODEDATA(node) (void *)((char *)(node)->mn_data +(node)->mn_ksize)
Address of the data for a node
#define NODEPGNO(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
#define SETPGNO(node, pgno)
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
#define NODEDSZ(node) ((node)->mn_lo | ((unsigned)(node)->mn_hi << 16))
Get the size of the data in a leaf node
#define SETDSZ(node, size)
Value:
do {
(node)->mn_lo = (size) & 0xffff; (node)->mn_hi =
(size) >> 16;} while(0)
Set the size of the data for a leaf node
#define NODEKSZ(node) ((node)->mn_ksize)
The size of a key in a node
#define COPY_PGNO(dst, src)
Value:
do { unsigned
short *s, *d; s = (unsigned short *)&(src); d =
(unsigned short *)&(dst); *d++ = *s++; *d = *s; } while
(0)
Copy a page number from src to dst
#define LEAF2KEY(p, i, ks) ((char *)(p) + PAGEHDRSZ + ((i)*(ks)))
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.
#define MDB_GET_KEY(node, keyptr)
Value:
{ if ((keyptr)
!= NULL) { (keyptr)->mv_size = NODEKSZ(node);
(keyptr)->mv_data = NODEKEY(node); } }
Set the
node’s
key into
keyptr
, if
requested.
#define MDB_GET_KEY2(node, key) { key.mv_size = NODEKSZ(node);key.mv_data = NODEKEY(node); }
Set the node’s key into key .
#define MDB_VALID 0x8000
DB handle is valid, for me_dbflags
#define VALID_FLAGS
Value:
(MDB_REVERSEKEY|MDB_DUPSORT|MDB_INTEGERKEY|MDB_DUPFIXED|
MDB_INTEGERDUP|MDB_REVERSEDUP|MDB_CREATE)
mdb_dbi_open()
flags
#define FREE_DBI 0
Handle for the DB used to track free pages.
#define MAIN_DBI 1
Handle for the default DB.
#define CORE_DBS 2
Number of DBs in metapage (free and main) - also hardcoded elsewhere
#define NUM_METAS 2
Number of meta pages - also hardcoded elsewhere
#define CURSOR_STACK 32
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.