logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

internal - LMDB Internals

Author

       Generated automatically by Doxygen for LMDB from the source code.

                                                      LMDB                                           internal(3)

Data Structure Documentation

Detailed Description

Enumeration Type Documentation

enummdb_fopen_type
       File type, access mode etc. for mdb_fopen()EnumeratorMDB_O_RDONLY
              for RDONLY me_fd

       MDB_O_RDWR
              for me_fd

       MDB_O_META
              for me_mfd

       MDB_O_COPY
              for mdb_env_copy()MDB_O_MASK
              Bitmask  for  open()  flags  in  enum  mdb_fopen_type.  The other bits distinguish otherwise-equal
              MDB_O_* constants from each other.

       MDB_O_LOCKS
              for me_lfd

Field Documentation

pthread_cond_tmdb_copy::mc_cond
       Condition variable for mc_newintmdb_copy::mc_toggle
       Buffer number in provider

   intmdb_copy::mc_new
       (0-2 buffers to write) | (MDB_EOF at end)

   volatileintmdb_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.

Function Documentation

staticintmdb_page_alloc(MDB_cursor*mc,intnum,MDB_page**mp)[static]
       Allocate page numbers and memory  for  writing.  Maintain  me_pglast,  me_pghead  and  mt_next_pgno.  Set
       MDB_TXN_ERROR on failure.

       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.

       Parametersmc cursor A cursor handle identifying the transaction and database for which we are allocating.
           num the number of pages to allocate.
           mp Address of the allocated page(s). Requests for multiple pages will always be satisfied by a single
           contiguous chunk of memory.

       Returns
           0 on success, non-zero on failure.

   staticintmdb_page_new(MDB_cursor*mc,uint32_tflags,intnum,MDB_page**mp)[static]
       Allocate and initialize new pages for a database. Set MDB_TXN_ERROR on failure.

       Parametersmc a cursor on the database being added to.
           flags flags defining what type of page is being allocated.
           num the number of pages to allocate. This is usually 1, unless allocating overflow pages for a  large
           record.
           mp Address of a page, or NULL on failure.

       Returns
           0 on success, non-zero on failure.

   staticintmdb_page_touch(MDB_cursor*mc)[static]
       Touch a page: make it dirty and re-insert into tree with updated pgno. Set MDB_TXN_ERROR on failure.

       Parametersmc cursor pointing to the page to be touched

       Returns
           0 on success, non-zero on failure.

   staticvoidmdb_txn_end(MDB_txn*txn,unsignedmode)[static]
       End  a  transaction,  except  successful commit of a nested transaction. May be called twice for readonly
       txns: First reset it, then abort.

       Parameterstxn the transaction handle to end
           mode why and how to end the transaction

   staticintmdb_page_get(MDB_cursor*mc,pgno_tpgno,MDB_page**ret,int*lvl)[static]
       Find the address of the page corresponding to a given page number. Set MDB_TXN_ERROR on failure.

       Parametersmc the cursor accessing the page.
           pgno the page number for the page to retrieve.
           ret address of a pointer where the page's address will be stored.
           lvl dirty_list inheritance level of found page. 1=current txn, 0=mapped page.

       Returns
           0 on success, non-zero on failure.

   staticintmdb_page_search_root(MDB_cursor*mc,MDB_val*key,intflags)[static]
       Finish mdb_page_search() / mdb_page_search_lowest(). The cursor is at the root page, set up the  rest  of
       it.

   staticintmdb_page_search(MDB_cursor*mc,MDB_val*key,intflags)[static]
       Search for the page a given key should be in. Push it and its parent pages on the cursor stack.

       Parametersmc the cursor for this operation.
           key the key to search for, or NULL for first/last page.
           flags  If  MDB_PS_MODIFY is set, visited pages in the DB are touched (updated with new page numbers).
           If MDB_PS_FIRST or MDB_PS_LAST is set, find first or last leaf. This is  used  by  mdb_cursor_first()
           and mdb_cursor_last(). If MDB_PS_ROOTONLY set, just fetch root node, no further lookups.

       Returns
           0 on success, non-zero on failure.

   staticintmdb_page_merge(MDB_cursor*csrc,MDB_cursor*cdst)[static]
       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.

       Parameterscsrc Cursor pointing to the source page.
           cdst Cursor pointing to the destination page.

       Returns
           0 on success, non-zero on failure.

   staticintmdb_page_split(MDB_cursor*mc,MDB_val*newkey,MDB_val*newdata,pgno_tnewpgno,unsignedintnflags)[static]
       Split a page and insert a new node. Set MDB_TXN_ERROR on failure.

       Parametersmc Cursor pointing to the page and desired insertion index. The cursor will be updated  to  point  to
           the actual page and index where the node got inserted after the split.
           newkey The key for the newly inserted node.
           newdata The data for the newly inserted node.
           newpgno The page number, if the new node is a branch node.
           nflags The NODE_ADD_FLAGS for the new node.

       Returns
           0 on success, non-zero on failure.

   staticintESECTmdb_env_read_header(MDB_env*env,MDB_meta*meta)[static]
       Read the environment parameters of a DB environment before mapping it into memory.

       Parametersenv the environment handle
           meta address of where to store the meta information

       Returns
           0 on success, non-zero on failure.

   staticMDB_meta*mdb_env_pick_meta(constMDB_env*env)[static]
       Check both meta pages to see which one is newer.

       Parametersenv the environment handle

       Returns
           newest MDB_meta.

   staticintmdb_env_write_meta(MDB_txn*txn)[static]
       Update the environment info to commit a transaction.

       Parameterstxn the transaction that's being committed

       Returns
           0 on success, non-zero on failure.

   staticvoidESECTmdb_env_close0(MDB_env*env,intexcl)[static]
       Destroy resources from mdb_env_open(), clear our readers & DBIs

   staticMDB_node*mdb_node_search(MDB_cursor*mc,MDB_val*key,int*exactp)[static]
       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.

   staticintmdb_node_add(MDB_cursor*mc,indx_tindx,MDB_val*key,MDB_val*data,pgno_tpgno,unsignedintflags)[static]
       Add a node to the page pointed to by the cursor. Set MDB_TXN_ERROR on failure.

       Parametersmc The cursor for this operation.
           indx The index on the page where the new node should be added.
           key The key for the new node.
           data The data for the new node, if any.
           pgno The page number, if adding a branch node.
           flags Flags for the node.

       Returns
           0 on success, non-zero on failure. Possible errors are:
           • ENOMEM - failed to allocate overflow pages for the node.
           • MDB_PAGE_FULL  -  there  is insufficient room in the page. This error should never happen since all
             callers already calculate the page's free space before calling this function.
   staticvoidmdb_node_del(MDB_cursor*mc,intksize)[static]
       Delete the specified node from a page.
       Parametersmc Cursor pointing to the node to delete.
           ksize The size of a node. Only used if the page is part of a MDB_DUPFIXED database.
   staticvoidmdb_node_shrink(MDB_page*mp,indx_tindx)[static]
       Compact the main page after deleting a node on a subpage.
       Parametersmp The main page to operate on.
           indx The index of the subpage on the main page.
   staticintmdb_node_move(MDB_cursor*csrc,MDB_cursor*cdst,intfromleft)[static]
       Move a node from csrc to cdst.
   staticintmdb_node_read(MDB_cursor*mc,MDB_node*leaf,MDB_val*data)[static]
       Return the data associated with a given node.
       Parametersmc The cursor for this operation.
           leaf The node being read.
           data Updated to point to the node's data.
       Returns
           0 on success, non-zero on failure.
   staticsize_tmdb_leaf_size(MDB_env*env,MDB_val*key,MDB_val*data)[static]
       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.
       Parametersenv The environment handle.
           key The key for the node.
           data The data for the node.
       Returns
           The number of bytes needed to store the node.
   staticsize_tmdb_branch_size(MDB_env*env,MDB_val*key)[static]
       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.
       Parametersenv The environment handle.
           key The key for the node.
       Returns
           The number of bytes needed to store the node.
   staticintmdb_rebalance(MDB_cursor*mc)[static]
       Rebalance the tree after a delete operation.
       Parametersmc Cursor pointing to the page where rebalancing should begin.
       Returns
           0 on success, non-zero on failure.
   staticintmdb_update_key(MDB_cursor*mc,MDB_val*key)[static]
       Replace the key for a branch node with a new key. Set MDB_TXN_ERROR on failure.
       Parametersmc Cursor pointing to the node to operate on.
           key The new key to use.
       Returns
           0 on success, non-zero on failure.
   staticvoidmdb_cursor_pop(MDB_cursor*mc)[static]
       Pop a page off the top of the cursor's stack.
   staticintmdb_cursor_push(MDB_cursor*mc,MDB_page*mp)[static]
       Push a page onto the top of the cursor's stack. Set MDB_TXN_ERROR on failure.
   staticintmdb_cursor_del0(MDB_cursor*mc)[static]
       Complete a delete operation started by mdb_cursor_del().
   staticintmdb_cursor_sibling(MDB_cursor*mc,intmove_right)[static]
       Find a sibling for a page. Replaces the page at the top of the cursor's stack with the specified sibling,
       if one exists.
       Parametersmc The cursor for this operation.
           move_right Non-zero if the right sibling is requested, otherwise the left sibling.
       Returns
           0 on success, non-zero on failure.
   staticintmdb_cursor_next(MDB_cursor*mc,MDB_val*key,MDB_val*data,MDB_cursor_opop)[static]
       Move the cursor to the next data item.
   staticintmdb_cursor_prev(MDB_cursor*mc,MDB_val*key,MDB_val*data,MDB_cursor_opop)[static]
       Move the cursor to the previous data item.
   staticintmdb_cursor_set(MDB_cursor*mc,MDB_val*key,MDB_val*data,MDB_cursor_opop,int*exactp)[static]
       Set the cursor on a specific data item.
   staticintmdb_cursor_first(MDB_cursor*mc,MDB_val*key,MDB_val*data)[static]
       Move the cursor to the first item in the database.
   staticintmdb_cursor_last(MDB_cursor*mc,MDB_val*key,MDB_val*data)[static]
       Move the cursor to the last item in the database.
   staticvoidmdb_cursor_init(MDB_cursor*mc,MDB_txn*txn,MDB_dbidbi,MDB_xcursor*mx)[static]
       Initialize a cursor for a given transaction and database.
   staticvoidmdb_xcursor_init0(MDB_cursor*mc)[static]
       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.
       Parametersmc The main cursor whose sorted-dups cursor is to be initialized.
   staticvoidmdb_xcursor_init1(MDB_cursor*mc,MDB_node*node)[static]
       Final setup of a sorted-dups cursor. Sets up the fields that depend on the data from the main cursor.
       Parametersmc The main cursor whose sorted-dups cursor is to be initialized.
           node The data containing the MDB_db record for the sorted-dup database.
   staticvoidmdb_xcursor_init2(MDB_cursor*mc,MDB_xcursor*src_mx,intnew_dupdata)[static]
       Fixup a sorted-dups cursor due to underlying update. Sets up some fields that depend on the data from the
       main cursor. Almost the same as init1, but skips initialization steps if the  xcursor  had  already  been
       used.
       Parametersmc The main cursor whose sorted-dups cursor is to be fixed up.
           src_mx The xcursor of an up-to-date cursor.
           new_dupdata True if converting from a non-F_DUPDATA item.
   staticintmdb_drop0(MDB_cursor*mc,intsubs)[static]
       Add all the DB's pages to the free list.
       Parametersmc Cursor on the DB to free.
           subs non-Zero to check for sub-DBs in this DB.
       Returns
           0 on success, non-zero on failure.
   staticvoidmdb_default_cmp(MDB_txn*txn,MDB_dbidbi)[static]
       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().
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()staticintESECTmdb_reader_check0(MDB_env*env,intrlocked,int*dead)[static]
       As mdb_reader_check(). rlocked is set if caller locked me_rmutex.
   char*ESECTmdb_version(int*major,int*minor,int*patch)
       Return the LMDB library version information. Return the library version info.
   char*mdb_strerror(interr)
       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 LMDB library error is returned. See ReturnCodes for a list of  LMDB-specific  error
       codes.
       Parameterserr The error code
       Returnvalueserrormessage The description of the error
   intmdb_cmp(MDB_txn*txn,MDB_dbidbi,constMDB_val*a,constMDB_val*b)
       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.
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()a The first item to compare
           b The second item to compare
       Returns
           < 0 if a < b, 0 if a == b, > 0 if a > b
   intmdb_dcmp(MDB_txn*txn,MDB_dbidbi,constMDB_val*a,constMDB_val*b)
       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.
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()a The first item to compare
           b The second item to compare
       Returns
           < 0 if a < b, 0 if a == b, > 0 if a > b
   staticMDB_page*mdb_page_malloc(MDB_txn*txn,unsignednum)[static]
       Allocate  memory  for  a page. Re-use old malloc'd pages first for singletons, otherwise just malloc. Set
       MDB_TXN_ERROR on failure.
   staticvoidmdb_page_free(MDB_env*env,MDB_page*mp)[static]
       Free a single page. Saves single pages to a list, for future reuse. (This  is  not  used  for  multi-page
       overflow pages.)
   staticvoidmdb_dpage_free(MDB_env*env,MDB_page*dp)[static]
       Free a dirty page
   staticvoidmdb_dlist_free(MDB_txn*txn)[static]
       Return all dirty pages to dpage list
   staticintmdb_page_loose(MDB_cursor*mc,MDB_page*mp)[static]
       Loosen or free a single page. Saves single pages to a list for future reuse in this same txn. It has been
       pulled from the freeDB and already resides on the dirty list, but has been deleted. Use these pages first
       before pulling again from the freeDB.
       If the page wasn't dirtied in this txn, just add it to this txn's free list.
   staticintmdb_pages_xkeep(MDB_cursor*mc,unsignedpflags,intall)[static]
       Set or clear P_KEEP in dirty, non-overflow, non-sub pages watched by txn.
       Parametersmc A cursor handle for the current operation.
           pflags Flags of the pages to update: P_DIRTY to set P_KEEP, P_DIRTY|P_KEEP to clear it.
           all No shortcuts. Needed except after a full mdb_page_flush().
       Returns
           0 on success, non-zero on failure.
   staticintmdb_page_flush(MDB_txn*txn,intkeep)[static]
       Flush (some) dirty pages to the map, after clearing their dirty flag.
       Parameterstxn the transaction that's being committed
           keep number of initial pages in dirty_list to keep dirty.
       Returns
           0 on success, non-zero on failure.
   staticintmdb_page_spill(MDB_cursor*m0,MDB_val*key,MDB_val*data)[static]
       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.
       Parametersm0 cursor A cursor handle identifying the transaction and database for which we are checking space.
           key For a put operation, the key being stored.
           data For a put operation, the data being stored.
       Returns
           0 on success, non-zero on failure.
   statictxnid_tmdb_find_oldest(MDB_txn*txn)[static]
       Find oldest txnid still referenced. Expects txn->mt_txnid > 0.
   staticvoidmdb_page_dirty(MDB_txn*txn,MDB_page*mp)[static]
       Add a page to the txn's dirty list
   staticvoidmdb_page_copy(MDB_page*dst,MDB_page*src,unsignedintpsize)[static]
       Copy the used portions of a non-overflow page.
       Parametersdst page to copy into
           src page to copy from
           psize size of a page
   staticintmdb_page_unspill(MDB_txn*txn,MDB_page*mp,MDB_page**ret)[static]
       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.
       Parameterstxn the transaction handle.
           mp the page being referenced. It must not be dirty.
           ret the writable page, if any. ret is unchanged if mp wasn't spilled.
   intmdb_env_sync(MDB_env*env,intforce)
       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. LMDB always flushes the OS buffers upon commit as well, unless the
       environment was opened with MDB_NOSYNC or  in  part  MDB_NOMETASYNC.  This  call  is  not  valid  if  the
       environment was opened with MDB_RDONLY.
       Parametersenv An environment handle returned by mdb_env_create()force  If  non-zero,  force a synchronous flush. Otherwise if the environment has the MDB_NOSYNC flag
           set the flushes will be omitted, and with MDB_MAPASYNC they will be asynchronous.
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EACCES - the environment is read-only.
           • EINVAL - an invalid parameter was specified.
           • EIO - an error occurred during synchronization.
   staticintmdb_cursor_shadow(MDB_txn*src,MDB_txn*dst)[static]
       Back up parent txn's cursors, then grab the originals for tracking
   staticvoidmdb_cursors_close(MDB_txn*txn,unsignedmerge)[static]
       Close this write txn's cursors, give parent txn's cursors back to parent.
       Parameterstxn the transaction handle.
           merge true to keep changes to parent cursors, false to revert.
       Returns
           0 on success, non-zero on failure.
   staticintmdb_reader_pid(MDB_env*env,enumPidlock_opop,MDB_PID_Tpid)[static]
       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.
   staticintmdb_txn_renew0(MDB_txn*txn)[static]
       Common code for mdb_txn_begin() and mdb_txn_renew().
       Parameterstxn the transaction handle to initialize
       Returns
           0 on success, non-zero on failure.
   intmdb_txn_renew(MDB_txn*txn)
       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.
       Parameterstxn A transaction handle returned by mdb_txn_begin()Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • MDB_PANIC - a fatal error occurred earlier and the environment must be shut down.
           • EINVAL - an invalid parameter was specified.
   intmdb_txn_begin(MDB_env*env,MDB_txn*parent,unsignedintflags,MDB_txn**txn)
       Create  a  transaction  for  use  with  the  environment.  The  transaction handle may be discarded using
       mdb_txn_abort() or mdb_txn_commit().
       Note
           A transaction and its cursors must only be used by a single thread, and a  thread  may  only  have  a
           single transaction at a time. If MDB_NOTLS is in use, this does not apply to read-only transactions.
           Cursors may not span transactions.
       Parametersenv An environment handle returned by mdb_env_create()parent  If  this  parameter  is  non-NULL, the new transaction will be a nested transaction, with the
           transaction indicated by parent as its parent. Transactions may be nested  to  any  level.  A  parent
           transaction  and its cursors may not issue any other operations than mdb_txn_commit and mdb_txn_abort
           while it has active child transactions.
           flags Special options for this transaction. This parameter must be set to  0  or  by  bitwise  OR'ing
           together one or more of the values described here.
           • MDB_RDONLY This transaction will not perform any write operations.
           txn Address where the new MDB_txn handle will be stored
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • MDB_PANIC - a fatal error occurred earlier and the environment must be shut down.
           • MDB_MAP_RESIZED  -  another process wrote data beyond this MDB_env's mapsize and this environment's
             map must be resized as well. See mdb_env_set_mapsize().
           • MDB_READERS_FULL - a read-only transaction was requested and the reader lock  table  is  full.  See
             mdb_env_set_maxreaders().
           • ENOMEM - out of memory.
   MDB_env*mdb_txn_env(MDB_txn*txn)
       Returns the transaction's MDB_env.
       Parameterstxn A transaction handle returned by mdb_txn_begin()size_tmdb_txn_id(MDB_txn*txn)
       Return  the  transaction's  ID. This returns the identifier associated with this transaction. For a read-
       only transaction, this corresponds to the snapshot being read; concurrent readers  will  frequently  have
       the same transaction ID.
       Parameterstxn A transaction handle returned by mdb_txn_begin()Returns
           A transaction ID, valid if input is an active transaction.
   staticvoidmdb_dbis_update(MDB_txn*txn,intkeep)[static]
       Export or close DBI handles opened in this txn.
   voidmdb_txn_reset(MDB_txn*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.
       Parameterstxn A transaction handle returned by mdb_txn_begin()voidmdb_txn_abort(MDB_txn*txn)
       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
           Earlier documentation incorrectly said all cursors  would  be  freed.  Only  write-transactions  free
           cursors.
       Parameterstxn A transaction handle returned by mdb_txn_begin()staticintmdb_freelist_save(MDB_txn*txn)[static]
       Save  the  freelist as of this transaction to the freeDB. This changes the freelist. Keep trying until it
       stabilizes.
   intmdb_txn_commit(MDB_txn*txn)
       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
           Earlier documentation incorrectly said all cursors  would  be  freed.  Only  write-transactions  free
           cursors.
       Parameterstxn A transaction handle returned by mdb_txn_begin()Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
           • ENOSPC - no more disk space.
           • EIO - a low-level I/O error occurred while writing.
           • ENOMEM - out of memory.
   staticvoidESECTmdb_env_init_meta0(MDB_env*env,MDB_meta*meta)[static]
       Fill in most of the zeroed MDB_meta for an empty database environment
   staticintESECTmdb_env_init_meta(MDB_env*env,MDB_meta*meta)[static]
       Write the environment parameters of a freshly created DB environment.
       Parametersenv the environment handle
           meta the MDB_meta to write
       Returns
           0 on success, non-zero on failure.
   intESECTmdb_env_create(MDB_env**env)
       Create an LMDB 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.
       Parametersenv The address where the new handle will be stored
       Returns
           A non-zero error value on failure and 0 on success.
   intESECTmdb_env_set_mapsize(MDB_env*env,size_tsize)
       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.
       The new size takes effect immediately for the current process but will not be  persisted  to  any  others
       until  a  write  transaction  has been committed by the current process. Also, only mapsize increases are
       persisted into the environment.
       If the mapsize is increased by another process, and data has  grown  beyond  the  range  of  the  current
       mapsize,  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.
       Parametersenv An environment handle returned by mdb_env_create()size The size in bytes
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified, or the environment has an active write transaction.
   intESECTmdb_env_set_maxdbs(MDB_env*env,MDB_dbidbs)
       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().
       Currently a moderate number of slots are cheap  but  a  huge  number  gets  expensive:  7-120  words  per
       transaction, and every mdb_dbi_open() does a linear search of the opened slots.
       Parametersenv An environment handle returned by mdb_env_create()dbs The maximum number of databases
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified, or the environment is already open.
   intESECTmdb_env_set_maxreaders(MDB_env*env,unsignedintreaders)
       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().
       Parametersenv An environment handle returned by mdb_env_create()readers The maximum number of reader lock table slots
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified, or the environment is already open.
   intESECTmdb_env_get_maxreaders(MDB_env*env,unsignedint*readers)
       Get the maximum number of threads/reader slots for the environment.
       Parametersenv An environment handle returned by mdb_env_create()readers Address of an integer to store the number of readers
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
   staticintESECTmdb_fname_init(constchar*path,unsignedenvflags,MDB_name*fname)[static]
       Set  up  filename  +  scratch  area  for  filename  suffix,  for  opening  files. It should be freed with
       mdb_fname_destroy(). On Windows, paths are converted from char *UTF-8 to wchar_t *UTF-16.
       Parameterspath Pathname for mdb_env_open().
           envflags Whether a subdir and/or lockfile will be used.
           fname Resulting filename, with room for a suffix if necessary.
   staticintESECTmdb_fopen(constMDB_env*env,MDB_name*fname,enummdb_fopen_typewhich,mdb_mode_tmode,HANDLE*res)[static]
       Open an LMDB file.
       Parametersenv The LMDB environment.
           fname  Path  from  from  mdb_fname_init().  A suffix is appended if necessary to create the filename,
           without changing mn_len.
           which Determines file type, access mode, etc.
           mode The Unix permissions for the file, if we create it.
           res Resulting file handle.
       Returns
           0 on success, non-zero on failure.
   staticintESECTmdb_env_open2(MDB_env*env)[static]
       Further setup required for opening an LMDB environment
   staticvoidmdb_env_reader_dest(void*ptr)[static]
       Release a reader thread's slot in the reader lock table. This function is  called  automatically  when  a
       thread exits.
       Parametersptr This points to the slot in the reader lock table.
   staticintESECTmdb_env_share_locks(MDB_env*env,int*excl)[static]
       Downgrade the exclusive lock on the region back to shared
   staticintESECTmdb_env_excl_lock(MDB_env*env,int*excl)[static]
       Try  to  get  exclusive  lock,  otherwise  shared.  Maintain  *excl  = -1: no/unknown lock, 0: shared, 1:
       exclusive.
   staticintESECTmdb_env_setup_locks(MDB_env*env,MDB_name*fname,intmode,int*excl)[static]
       Open and/or initialize the lock region for the environment.
       Parametersenv The LMDB environment.
           fname Filename + scratch area, from mdb_fname_init().
           mode The Unix permissions for the file, if we create it.
           excl In -1, out lock type: -1 none, 0 shared, 1 exclusive
       Returns
           0 on success, non-zero on failure.
   intESECTmdb_env_open(MDB_env*env,constchar*path,unsignedintflags,mdb_mode_tmode)
       Open an environment handle. If this function fails, mdb_env_close() must be called to discard the MDB_env
       handle.
       Parametersenv An environment handle returned by mdb_env_create()path The directory in which the database files reside. This  directory  must  already  exist  and  be
           writable.
           flags  Special  options  for  this  environment. This parameter must be set to 0 or by bitwise OR'ing
           together one or more of the values described here. Flags set by mdb_env_set_flags() are also used.
           • MDB_FIXEDMAP use a fixed address for the mmap region. This flag must be specified when creating the
             environment, and is stored persistently in the environment. If  successful,  the  memory  map  will
             always reside at the same virtual address and pointers used to reference data items in the database
             will be constant across multiple invocations. This option may not always work, depending on how the
             operating  system  has  allocated  memory to shared libraries and other uses. The feature is highly
             experimental.
           • MDB_NOSUBDIR By default, LMDB creates its environment in a directory whose  pathname  is  given  in
             path,  and creates its data and lock files under that directory. With this option, path is used as-
             is for the database main data file. The database lock file is the path with '-lock' appended.
           • MDB_RDONLY Open the environment in read-only mode. No write operations will be allowed.  LMDB  will
             still modify the lock file - except on read-only filesystems, where LMDB does not use locks.
           • MDB_WRITEMAP Use a writeable memory map unless MDB_RDONLY is set. This uses fewer mallocs but loses
             protection  from application bugs like wild pointer writes and other bad updates into the database.
             This may be slightly faster for DBs that fit entirely in RAM, but is slower  for  DBs  larger  than
             RAM.  Incompatible  with nested transactions. Do not mix processes with and without MDB_WRITEMAP on
             the same environment. This can defeat durability (mdb_env_sync etc).
           • MDB_NOMETASYNC Flush system buffers to disk only once per transaction,  omit  the  metadata  flush.
             Defer that until the system flushes files to disk, or next non-MDB_RDONLY commit or mdb_env_sync().
             This  optimization  maintains  database  integrity,  but a system crash may undo the last committed
             transaction. I.e. it preserves the ACI (atomicity, consistency, isolation) but not  D  (durability)
             database property. This flag may be changed at any time using mdb_env_set_flags().
           • MDB_NOSYNC  Don't  flush  system  buffers  to disk when committing a transaction. This optimization
             means a system crash can corrupt the database or lose the last transactions if buffers are not  yet
             flushed to disk. The risk is governed by how often the system flushes dirty buffers to disk and how
             often  mdb_env_sync()  is  called.  However,  if  the  filesystem  preserves  write  order  and the
             MDB_WRITEMAP flag is  not  used,  transactions  exhibit  ACI  (atomicity,  consistency,  isolation)
             properties  and only lose D (durability). I.e. database integrity is maintained, but a system crash
             may undo the final transactions. Note that (MDB_NOSYNC | MDB_WRITEMAP) leaves the  system  with  no
             hint  for  when  to  write  transactions  to disk, unless mdb_env_sync() is called. (MDB_MAPASYNC |
             MDB_WRITEMAP) may be preferable. This flag may be changed at any time using mdb_env_set_flags().
           • MDB_MAPASYNC When using MDB_WRITEMAP, use asynchronous flushes  to  disk.  As  with  MDB_NOSYNC,  a
             system  crash  can  then corrupt the database or lose the last transactions. Calling mdb_env_sync()
             ensures on-disk database integrity until next commit. This flag may be changed at  any  time  using
             mdb_env_set_flags().
           • MDB_NOTLS  Don't use Thread-Local Storage. Tie reader locktable slots to MDB_txn objects instead of
             to threads. I.e. mdb_txn_reset() keeps the slot reserved for the MDB_txn object. A thread  may  use
             parallel  read-only transactions. A read-only transaction may span threads if the user synchronizes
             its use. Applications that multiplex many user threads over individual OS threads need this option.
             Such an application must also serialize the write transactions in an OS thread, since LMDB's  write
             locking is unaware of the user threads.
           • MDB_NOLOCK  Don't  do  any locking. If concurrent access is anticipated, the caller must manage all
             concurrency itself. For proper operation the caller must enforce single-writer semantics, and  must
             ensure  that  no readers are using old transactions while a writer is active. The simplest approach
             is to use an exclusive lock so that no readers may be active at all when a writer begins.
           • MDB_NORDAHEAD Turn off readahead. Most operating systems perform  readahead  on  read  requests  by
             default.  This  option  turns  it  off  if  the OS supports it. Turning it off may help random read
             performance when the DB is larger than RAM and system RAM is full. The option is not implemented on
             Windows.
           • MDB_NOMEMINIT Don't initialize malloc'd memory before writing to unused spaces in the data file. By
             default, memory for pages written to the data file is obtained using malloc. While these pages  may
             be  reused  in subsequent transactions, freshly malloc'd pages will be initialized to zeroes before
             use. This avoids persisting leftover data from other code (that  used  the  heap  and  subsequently
             freed  the  memory) into the data file. Note that many other system libraries may allocate and free
             memory from the heap for arbitrary uses. E.g., stdio may use the heap for file  I/O  buffers.  This
             initialization step has a modest performance cost so some applications may want to disable it using
             this  flag.  This  option  can  be  a  problem  for  applications  which handle sensitive data like
             passwords, and it makes memory  checkers  like  Valgrind  noisy.  This  flag  is  not  needed  with
             MDB_WRITEMAP,  which  writes  directly  to  the  mmap  instead  of  using  malloc  for  pages.  The
             initialization is also skipped if MDB_RESERVE is used; the caller is expected to overwrite  all  of
             the  memory  that  was  reserved  in  that  case.  This  flag  may  be  changed  at  any time using
             mdb_env_set_flags().
           mode The UNIX permissions to set on created files  and  semaphores.  This  parameter  is  ignored  on
           Windows.
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • MDB_VERSION_MISMATCH  -  the version of the LMDB library doesn't match the version that created the
             database environment.
           • MDB_INVALID - the environment file headers are corrupted.
           • ENOENT - the directory specified by the path parameter doesn't exist.
           • EACCES - the user didn't have permission to access the environment files.
           • EAGAIN - the environment was locked by another process.
   voidESECTmdb_env_close(MDB_env*env)
       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.
       Parametersenv An environment handle returned by mdb_env_create()staticintmdb_cmp_long(constMDB_val*a,constMDB_val*b)[static]
       Compare two items pointing at aligned size_t's
   staticintmdb_cmp_int(constMDB_val*a,constMDB_val*b)[static]
       Compare two items pointing at aligned unsigned int's.
       This is also set as MDB_INTEGERDUP|MDB_DUPFIXED's MDB_dbx.md_dcmp, but mdb_cmp_clong() is called  instead
       if the data type is size_t.
   staticintmdb_cmp_cint(constMDB_val*a,constMDB_val*b)[static]
       Compare  two  items  pointing  at unsigned ints of unknown alignment. Nodes and keys are guaranteed to be
       2-byte aligned.
   staticintmdb_cmp_memn(constMDB_val*a,constMDB_val*b)[static]
       Compare two items lexically
   staticintmdb_cmp_memnr(constMDB_val*a,constMDB_val*b)[static]
       Compare two items in reverse byte order
   staticintmdb_page_search_lowest(MDB_cursor*mc)[static]
       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.
   intmdb_get(MDB_txn*txn,MDB_dbidbi,MDB_val*key,MDB_val*data)
       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
           The memory pointed to by the returned values is owned by the database. The caller need not dispose of
           the  memory,  and  may  not  modify it in any way. For values returned in a read-only transaction any
           modification attempts will cause a SIGSEGV.
           Values returned from the database are valid only until a subsequent update operation, or the  end  of
           the transaction.
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()key The key to search for in the database
           data The data corresponding to the key
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • MDB_NOTFOUND - the key was not in the database.
           • EINVAL - an invalid parameter was specified.
   intmdb_cursor_get(MDB_cursor*cursor,MDB_val*key,MDB_val*data,MDB_cursor_opop)
       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.
       Parameterscursor A cursor handle returned by mdb_cursor_open()key The key for a retrieved item
           data The data of a retrieved item
           op A cursor operation MDB_cursor_opReturns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • MDB_NOTFOUND - no matching key found.
           • EINVAL - an invalid parameter was specified.
   staticintmdb_cursor_touch(MDB_cursor*mc)[static]
       Touch all the pages in the cursor stack. Set mc_top. Makes  sure  all  the  pages  are  writable,  before
       attempting a write operation.
       Parametersmc The cursor to operate on.
   intmdb_cursor_put(MDB_cursor*cursor,MDB_val*key,MDB_val*data,unsignedintflags)
       Store  by  cursor. This function stores key/data pairs into the database. The cursor is positioned at the
       new item, or on failure usually near it.
       Note
           Earlier documentation incorrectly said errors would leave the state of the cursor unchanged.
       Parameterscursor A cursor handle returned by mdb_cursor_open()key The key operated on.
           data The data operated on.
           flags Options for this operation. This parameter must be set to 0 or  one  of  the  values  described
           here.
           • MDB_CURRENT  -  replace  the  item  at the current cursor position. The key parameter must still be
             provided, and must match it. If using sorted duplicates (MDB_DUPSORT) the data item must still sort
             into the same place. This is intended to be used when the new data is the same  size  as  the  old.
             Otherwise it will simply perform a delete of the old record followed by an insert.
           • MDB_NODUPDATA  -  enter  the  new key/data pair only if it does not already appear in the database.
             This flag may only be specified if the database was opened  with  MDB_DUPSORT.  The  function  will
             return MDB_KEYEXIST if the key/data pair already appears in the database.
           • MDB_NOOVERWRITE  -  enter  the  new  key/data  pair  only if the key does not already appear in the
             database. The function will return MDB_KEYEXIST if the key already appears in the database, even if
             the database supports duplicates (MDB_DUPSORT).
           • MDB_RESERVE - reserve space for data of the given size, but don't copy  the  given  data.  Instead,
             return a pointer to the reserved space, which the caller can fill in later - before the next update
             operation or the transaction ends. This saves an extra memcpy if the data is being generated later.
             This flag must not be specified if the database was opened with MDB_DUPSORT.
           • MDB_APPEND  -  append  the  given  key/data pair to the end of the database. No key comparisons are
             performed. This option allows fast bulk loading when keys are already known to be  in  the  correct
             order. Loading unsorted keys with this flag will cause a MDB_KEYEXIST error.
           • MDB_APPENDDUP - as above, but for sorted dup data.
           • MDB_MULTIPLE  -  store multiple contiguous data elements in a single request. This flag may only be
             specified if the database was opened with MDB_DUPFIXED. The data argument must be an array  of  two
             MDB_vals.  The  mv_size of the first MDB_val must be the size of a single data element. The mv_data
             of the first MDB_val must point to the beginning of the array  of  contiguous  data  elements.  The
             mv_size  of the second MDB_val must be the count of the number of data elements to store. On return
             this field will be set to the count of the number of elements actually written. The mv_data of  the
             second MDB_val is unused.
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • MDB_MAP_FULL - the database is full, see mdb_env_set_mapsize().
           • MDB_TXN_FULL - the transaction has too many dirty pages.
           • EACCES - an attempt was made to write in a read-only transaction.
           • EINVAL - an invalid parameter was specified.
   intmdb_cursor_del(MDB_cursor*cursor,unsignedintflags)
       Delete  current  key/data  pair. This function deletes the key/data pair to which the cursor refers. This
       does not invalidate the cursor, so operations such as MDB_NEXT can still be used on it. Both MDB_NEXT and
       MDB_GET_CURRENT will return the same record after this operation.
       Parameterscursor A cursor handle returned by mdb_cursor_open()flags Options for this operation. This parameter must be set to 0 or  one  of  the  values  described
           here.
           • MDB_NODUPDATA  -  delete all of the data items for the current key. This flag may only be specified
             if the database was opened with MDB_DUPSORT.
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EACCES - an attempt was made to write in a read-only transaction.
           • EINVAL - an invalid parameter was specified.
   intmdb_cursor_open(MDB_txn*txn,MDB_dbidbi,MDB_cursor**cursor)
       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
           Earlier documentation said that cursors  in  every  transaction  were  closed  when  the  transaction
           committed or aborted.
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()cursor Address where the new MDB_cursor handle will be stored
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
   intmdb_cursor_renew(MDB_txn*txn,MDB_cursor*cursor)
       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.
       Parameterstxn A transaction handle returned by mdb_txn_begin()cursor A cursor handle returned by mdb_cursor_open()Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
   intmdb_cursor_count(MDB_cursor*cursor,size_t*countp)
       Return  count  of  duplicates  for  current key. This call is only valid on databases that support sorted
       duplicate data items MDB_DUPSORT.
       Parameterscursor A cursor handle returned by mdb_cursor_open()countp Address where the count will be stored
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - cursor is not initialized, or an invalid parameter was specified.
   voidmdb_cursor_close(MDB_cursor*cursor)
       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.
       Parameterscursor A cursor handle returned by mdb_cursor_open()MDB_txn*mdb_cursor_txn(MDB_cursor*cursor)
       Return the cursor's transaction handle.
       Parameterscursor A cursor handle returned by mdb_cursor_open()MDB_dbimdb_cursor_dbi(MDB_cursor*cursor)
       Return the cursor's database handle.
       Parameterscursor A cursor handle returned by mdb_cursor_open()staticvoidmdb_cursor_copy(constMDB_cursor*csrc,MDB_cursor*cdst)[static]
       Copy the contents of a cursor.
       Parameterscsrc The cursor to copy from.
           cdst The cursor to copy to.
   intmdb_del(MDB_txn*txn,MDB_dbidbi,MDB_val*key,MDB_val*data)
       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.
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()key The key to delete from the database
           data The data to delete
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EACCES - an attempt was made to write in a read-only transaction.
           • EINVAL - an invalid parameter was specified.
   intmdb_put(MDB_txn*txn,MDB_dbidbi,MDB_val*key,MDB_val*data,unsignedintflags)
       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).
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()key The key to store in the database
           data The data to store
           flags  Special  options  for  this  operation.  This  parameter must be set to 0 or by bitwise OR'ing
           together one or more of the values described here.
           • MDB_NODUPDATA - enter the new key/data pair only if it does not already  appear  in  the  database.
             This  flag  may  only  be  specified if the database was opened with MDB_DUPSORT. The function will
             return MDB_KEYEXIST if the key/data pair already appears in the database.
           • MDB_NOOVERWRITE - enter the new key/data pair only if the  key  does  not  already  appear  in  the
             database. The function will return MDB_KEYEXIST if the key already appears in the database, even if
             the  database  supports  duplicates  (MDB_DUPSORT).  The data parameter will be set to point to the
             existing item.
           • MDB_RESERVE - reserve space for data of the given size, but don't copy  the  given  data.  Instead,
             return a pointer to the reserved space, which the caller can fill in later - before the next update
             operation or the transaction ends. This saves an extra memcpy if the data is being generated later.
             LMDB  does  nothing  else  with  this  memory,  the  caller  is expected to modify all of the space
             requested. This flag must not be specified if the database was opened with MDB_DUPSORT.
           • MDB_APPEND - append the given key/data pair to the end of the database.  This  option  allows  fast
             bulk  loading  when  keys  are already known to be in the correct order. Loading unsorted keys with
             this flag will cause a MDB_KEYEXIST error.
           • MDB_APPENDDUP - as above, but for sorted dup data.
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • MDB_MAP_FULL - the database is full, see mdb_env_set_mapsize().
           • MDB_TXN_FULL - the transaction has too many dirty pages.
           • EACCES - an attempt was made to write in a read-only transaction.
           • EINVAL - an invalid parameter was specified.
   staticTHREAD_RETESECTCALL_CONVmdb_env_copythr(void*arg)[static]
       Dedicated writer thread for compacting copy.
   staticintESECTmdb_env_cthr_toggle(mdb_copy*my,intadjust)[static]
       Give buffer and/or MDB_EOF to writer thread, await unused buffer.
       Parametersmy control structure.
           adjust (1 to hand off 1 buffer) | (MDB_EOF when ending).
   staticintESECTmdb_env_cwalk(mdb_copy*my,pgno_t*pg,intflags)[static]
       Depth-first tree traversal for compacting copy.
       Parametersmy control structure.
           pg database root.
           flags includes F_DUPDATA if it is a sorted-duplicate sub-DB.
   staticintESECTmdb_env_copyfd1(MDB_env*env,HANDLEfd)[static]
       Copy environment with compaction.
   staticintESECTmdb_env_copyfd0(MDB_env*env,HANDLEfd)[static]
       Copy environment as-is.
   intESECTmdb_env_copy2(MDB_env*env,constchar*path,unsignedintflags)
       Copy an LMDB environment to the specified path, with options. This function may be used to make a  backup
       of an existing environment. No lockfile is created, since it gets recreated at need.
       Note
           This  call  can  trigger  significant  file  size  growth if run in parallel with write transactions,
           because it employs a read-only transaction. See long-lived transactions under Caveats.
       Parametersenv  An  environment  handle  returned  by  mdb_env_create().  It  must  have  already  been   opened
           successfully.
           path  The  directory in which the copy will reside. This directory must already exist and be writable
           but must otherwise be empty.
           flags Special options for this operation. This parameter must be  set  to  0  or  by  bitwise  OR'ing
           together one or more of the values described here.
           • MDB_CP_COMPACT  -  Perform  compaction while copying: omit free pages and sequentially renumber all
             pages in output. This option consumes more CPU and runs more slowly than the default. Currently  it
             fails if the environment has suffered a page leak.
       Returns
           A non-zero error value on failure and 0 on success.
   intESECTmdb_env_copy(MDB_env*env,constchar*path)
       Copy an LMDB 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
           This  call  can  trigger  significant  file  size  growth if run in parallel with write transactions,
           because it employs a read-only transaction. See long-lived transactions under Caveats.
       Parametersenv  An  environment  handle  returned  by  mdb_env_create().  It  must  have  already  been   opened
           successfully.
           path  The  directory in which the copy will reside. This directory must already exist and be writable
           but must otherwise be empty.
       Returns
           A non-zero error value on failure and 0 on success.
   intESECTmdb_env_set_flags(MDB_env*env,unsignedintflags,intonoff)
       Set environment flags. This may be used to set some flags in addition to those from mdb_env_open(), or to
       unset these flags. If several threads change the flags at the same time, the result is undefined.
       Parametersenv An environment handle returned by mdb_env_create()flags The flags to change, bitwise OR'ed together
           onoff A non-zero value sets the flags, zero clears them.
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
   intESECTmdb_env_get_flags(MDB_env*env,unsignedint*flags)
       Get environment flags.
       Parametersenv An environment handle returned by mdb_env_create()flags The address of an integer to store the flags
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
   intESECTmdb_env_set_userctx(MDB_env*env,void*ctx)
       Set application information associated with the MDB_env.
       Parametersenv An environment handle returned by mdb_env_create()ctx An arbitrary pointer for whatever the application needs.
       Returns
           A non-zero error value on failure and 0 on success.
   void*ESECTmdb_env_get_userctx(MDB_env*env)
       Get the application information associated with the MDB_env.
       Parametersenv An environment handle returned by mdb_env_create()Returns
           The pointer set by mdb_env_set_userctx().
   intESECTmdb_env_set_assert(MDB_env*env,MDB_assert_func*func)
       Set or reset the assert() callback of the environment. Disabled if liblmdb is built with NDEBUG.
       Note
           This hack should become obsolete as lmdb's error handling matures.
       Parametersenv An environment handle returned by mdb_env_create().
           func An MDB_assert_func function, or 0.
       Returns
           A non-zero error value on failure and 0 on success.
   intESECTmdb_env_get_path(MDB_env*env,constchar**path)
       Return the path that was used in mdb_env_open().
       Parametersenv An environment handle returned by mdb_env_create()path Address of a string pointer to contain the path. This is the actual string in  the  environment,
           not a copy. It should not be altered in any way.
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
   intESECTmdb_env_get_fd(MDB_env*env,mdb_filehandle_t*fd)
       Return  the  filedescriptor  for  the given environment. This function may be called after fork(), so the
       descriptor can be closed before exec*(). Other LMDB file descriptors have FD_CLOEXEC. (Until LMDB 0.9.18,
       only the lockfile had that.)
       Parametersenv An environment handle returned by mdb_env_create()fd Address of a mdb_filehandle_t to contain the descriptor.
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
   staticintESECTmdb_stat0(MDB_env*env,MDB_db*db,MDB_stat*arg)[static]
       Common code for mdb_stat() and mdb_env_stat().
       Parametersenv the environment to operate in.
           db the MDB_db record containing the stats to return.
           arg the address of an MDB_stat structure to receive the stats.
       Returns
           0, this function always succeeds.
   intESECTmdb_env_stat(MDB_env*env,MDB_stat*stat)
       Return statistics about the LMDB environment.
       Parametersenv An environment handle returned by mdb_env_create()stat The address of an MDB_stat structure where the statistics will be copied
   intESECTmdb_env_info(MDB_env*env,MDB_envinfo*stat)
       Return information about the LMDB environment.
       Parametersenv An environment handle returned by mdb_env_create()stat The address of an MDB_envinfo structure where the information will be copied
   intmdb_dbi_open(MDB_txn*txn,constchar*name,unsignedintflags,MDB_dbi*dbi)
       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  may
       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 in the same process. A transaction
       that  uses this function must finish (either commit or abort) before any other transaction in the process
       may use this function.
       To use named databases (with name != NULL),  mdb_env_set_maxdbs()  must  be  called  before  opening  the
       environment. Database names are keys in the unnamed database, and may be read but not written.
       Parameterstxn A transaction handle returned by mdb_txn_begin()name  The  name of the database to open. If only a single database is needed in the environment, this
           value may be NULL.
           flags Special options for this database. This parameter must  be  set  to  0  or  by  bitwise  OR'ing
           together one or more of the values described here.
           • MDB_REVERSEKEY Keys are strings to be compared in reverse order, from the end of the strings to the
             beginning. By default, Keys are treated as strings and compared from beginning to end.
           • MDB_DUPSORT  Duplicate  keys  may  be used in the database. (Or, from another perspective, keys may
             have multiple data items, stored in sorted order.) By default keys must be unique and may have only
             a single data item.
           • MDB_INTEGERKEY Keys are binary integers in native byte order, either unsigned int  or  size_t,  and
             will be sorted as such. The keys must all be of the same size.
           • MDB_DUPFIXED  This  flag  may  only  be used in combination with MDB_DUPSORT. This option tells the
             library that the data items for  this  database  are  all  the  same  size,  which  allows  further
             optimizations   in   storage   and   retrieval.  When  all  data  items  are  the  same  size,  the
             MDB_GET_MULTIPLE, MDB_NEXT_MULTIPLE and MDB_PREV_MULTIPLE cursor operations may be used to retrieve
             multiple items at once.
           • MDB_INTEGERDUP This option specifies that duplicate data items  are  binary  integers,  similar  to
             MDB_INTEGERKEY keys.
           • MDB_REVERSEDUP  This  option  specifies  that duplicate data items should be compared as strings in
             reverse order.
           • MDB_CREATE Create the named database if it doesn't exist. This option is not allowed in a read-only
             transaction or a read-only environment.
           dbi Address where the new MDB_dbi handle will be stored
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • MDB_NOTFOUND - the specified database doesn't exist in  the  environment  and  MDB_CREATE  was  not
             specified.
           • MDB_DBS_FULL - too many databases have been opened. See mdb_env_set_maxdbs().
   intESECTmdb_stat(MDB_txn*txn,MDB_dbidbi,MDB_stat*stat)
       Retrieve statistics for a database.
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()stat The address of an MDB_stat structure where the statistics will be copied
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
   voidmdb_dbi_close(MDB_env*env,MDB_dbidbi)
       Close  a  database handle. Normally unnecessary. Use with care: 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.  Doing  so  can  cause  misbehavior  from  database  corruption  to  errors  like
       MDB_BAD_VALSIZE (since the DB name is gone).
       Closing  a database handle is not necessary, but lets mdb_dbi_open() reuse the handle value. Usually it's
       better to set a bigger mdb_env_set_maxdbs(), unless that value would be large.
       Parametersenv An environment handle returned by mdb_env_create()dbi A database handle returned by mdb_dbi_open()intmdb_dbi_flags(MDB_txn*txn,MDB_dbidbi,unsignedint*flags)
       Retrieve the DB flags for a database handle.
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()flags Address where the flags will be returned.
       Returns
           A non-zero error value on failure and 0 on success.
   intmdb_drop(MDB_txn*txn,MDB_dbidbi,intdel)
       Empty or delete+close a database. See mdb_dbi_close() for restrictions about closing the DB handle.
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()del 0 to empty the DB, 1 to delete it from the environment and close the DB handle.
       Returns
           A non-zero error value on failure and 0 on success.
   intmdb_set_compare(MDB_txn*txn,MDB_dbidbi,MDB_cmp_func*cmp)
       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
           This function must be called before any data access functions are used, otherwise data corruption may
           occur.  The same comparison function must be used by every program accessing the database, every time
           the database is used.
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()cmp A MDB_cmp_func function
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
   intmdb_set_dupsort(MDB_txn*txn,MDB_dbidbi,MDB_cmp_func*cmp)
       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
           This function must be called before any data access functions are used, otherwise data corruption may
           occur. The same comparison function must be used by every program accessing the database, every  time
           the database is used.
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()cmp A MDB_cmp_func function
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
   intmdb_set_relfunc(MDB_txn*txn,MDB_dbidbi,MDB_rel_func*rel)
       Set a relocation function for a MDB_FIXEDMAP database.
       Todo
           The relocation function is called whenever it is necessary to move the data of an item to a different
           position  in  the  database  (e.g.  through  tree balancing operations, shifts as a result of adds or
           deletes, etc.). It is intended to allow address/position-dependent data  items  to  be  stored  in  a
           database  in  an environment opened with the MDB_FIXEDMAP option. Currently the relocation feature is
           unimplemented and setting this function has no effect.
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()rel A MDB_rel_func function
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
   intmdb_set_relctx(MDB_txn*txn,MDB_dbidbi,void*ctx)
       Set a context pointer  for  a  MDB_FIXEDMAP  database's  relocation  function.  See  mdb_set_relfunc  and
       MDB_rel_func for more details.
       Parameterstxn A transaction handle returned by mdb_txn_begin()dbi A database handle returned by mdb_dbi_open()ctx  An  arbitrary  pointer  for  whatever  the  application needs. It will be passed to the callback
           function set by mdb_set_relfunc as its relctx parameter whenever the callback is invoked.
       Returns
           A non-zero error value on failure and 0 on success. Some possible errors are:
           • EINVAL - an invalid parameter was specified.
   intESECTmdb_env_get_maxkeysize(MDB_env*env)
       Get the maximum size of keys and MDB_DUPSORT data we can write.  Depends  on  the  compile-time  constant
       MDB_MAXKEYSIZE. Default 511. See MDB_val.
       Parametersenv An environment handle returned by mdb_env_create()Returns
           The maximum size of a key we can write
   intESECTmdb_reader_list(MDB_env*env,MDB_msg_func*func,void*ctx)
       Dump the entries in the reader lock table.
       Parametersenv An environment handle returned by mdb_env_create()func A MDB_msg_func function
           ctx Anything the message function needs
       Returns
           < 0 on failure, >= 0 on success.
   staticintESECTmdb_pid_insert(MDB_PID_T*ids,MDB_PID_Tpid)[static]
       Insert pid into list if not already present. return -1 if already present.
   intESECTmdb_reader_check(MDB_env*env,int*dead)
       Check for stale entries in the reader lock table.
       Parametersenv An environment handle returned by mdb_env_create()dead Number of stale slots that were cleared
       Returns
           0 on success, non-zero on failure.

Macro Definition Documentation

#defineMDB_DSYNCO_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.

   #defineMDB_FDATASYNCfdatasync
       Function for flushing the data of a file. Define this to fsync if fdatasync() is not supported.

   #defineMAX_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.

   #defineMDB_MINKEYS2
       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.

   #defineMDB_MAGIC0xBEEFC0DE
       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.

   #defineMDB_DATA_VERSION((MDB_DEVEL)?999:1)
       The version number for a database's datafile format.

   #defineMDB_LOCK_VERSION1
       The version number for a database's lockfile format.

   #defineMDB_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.

   #defineENV_MAXKEY(env)(MDB_MAXKEYSIZE)
       The maximum size of a key we can write to the environment.

   #defineMAXDATASIZE0xffffffffUL
       The maximum size of a data item. We only store a 32 bit value for node sizes.

   #defineP_INVALID(~(pgno_t)0)
       An invalid page number. Mainly used to denote an empty tree.

   #defineF_ISSET(w,f)(((w)&(f))==(f))
       Test if the flags f are set in a flag word w.

   #defineEVEN(n)(((n)+1U)&-2)/*sign-extending-2tomatchn+1U*/
       Round n up to an even number.

   #defineDEFAULT_MAPSIZE1048576
       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().

   #definePAGEHDRSZ((unsigned)offsetof(MDB_page,mp_ptrs))
       Size of the page header, excluding dynamic data at the end

   #defineMETADATA(p)((void*)((char*)(p)+PAGEHDRSZ))
       Address of first usable data byte in a page, after the header

   #definePAGEBASE((MDB_DEVEL)?PAGEHDRSZ:0)
       ITS#7713, change PAGEBASE to handle 65536 byte pages

   #defineNUMKEYS(p)((MP_LOWER(p)-(PAGEHDRSZ-PAGEBASE))>>1)
       Number of nodes on a page

   #defineSIZELEFT(p)(indx_t)(MP_UPPER(p)-MP_LOWER(p))
       The amount of space remaining in the page

   #definePAGEFILL(env,p)Value:.PP
                       (1000L * ((env)->me_psize - PAGEHDRSZ - SIZELEFT(p)) / \
                       ((env)->me_psize - PAGEHDRSZ))
       The percentage of space used in the page, in tenths of a percent.

   #defineFILL_THRESHOLD250
       The minimum page fill factor, in tenths of a percent. Pages emptier than this are candidates for merging.

   #defineIS_LEAF(p)F_ISSET(MP_FLAGS(p),P_LEAF)
       Test if a page is a leaf page

   #defineIS_LEAF2(p)F_ISSET(MP_FLAGS(p),P_LEAF2)
       Test if a page is a LEAF2 page

   #defineIS_BRANCH(p)F_ISSET(MP_FLAGS(p),P_BRANCH)
       Test if a page is a branch page

   #defineIS_OVERFLOW(p)F_ISSET(MP_FLAGS(p),P_OVERFLOW)
       Test if a page is an overflow page

   #defineIS_SUBP(p)F_ISSET(MP_FLAGS(p),P_SUBP)
       Test if a page is a sub page

   #defineOVPAGES(size,psize)((PAGEHDRSZ-1+(size))/(psize)+1)
       The number of overflow pages needed to store the given size.

   #defineNEXT_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.

   #defineNODESIZEoffsetof(MDB_node,mn_data)
       Size of the node header, excluding dynamic data at the end

   #definePGNO_TOPWORD((pgno_t)-1>0xffffffffu?32:0)
       Bit position of top word in page number, for shifting mn_flags

   #defineINDXSIZE(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.

   #defineLEAFSIZE(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.

   #defineNODEPTR(p,i)((MDB_node*)((char*)(p)+MP_PTRS(p)[i]+PAGEBASE))
       Address of node i in page p#defineNODEKEY(node)(void*)((node)->mn_data)
       Address of the key for the node

   #defineNODEDATA(node)(void*)((char*)(node)->mn_data+(node)->mn_ksize)
       Address of the data for a node

   #defineNODEPGNO(node)Value:.PP
           ((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

   #defineSETPGNO(node,pgno)Value:.PP
           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

   #defineNODEDSZ(node)((node)->mn_lo|((unsigned)(node)->mn_hi<<16))
       Get the size of the data in a leaf node

   #defineSETDSZ(node,size)Value:.PP
           do { \
           (node)->mn_lo = (size) & 0xffff; (node)->mn_hi = (size) >> 16;} while(0)
       Set the size of the data for a leaf node

   #defineNODEKSZ(node)((node)->mn_ksize)
       The size of a key in a node

   #defineCOPY_PGNO(dst,src)Value:.PP
           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

   #defineLEAF2KEY(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.

   #defineMDB_GET_KEY(node,keyptr)Value:.PP
           { if ((keyptr) != NULL) { \
           (keyptr)->mv_size = NODEKSZ(node); (keyptr)->mv_data = NODEKEY(node); } }
       Set the node's key into keyptr, if requested.

   #defineMDB_GET_KEY2(node,key){key.mv_size=NODEKSZ(node);key.mv_data=NODEKEY(node);}
       Set the node's key into key.

   #defineMDB_VALID0x8000
       DB handle is valid, for me_dbflags

   #defineVALID_FLAGSValue:.PP
           (MDB_REVERSEKEY|MDB_DUPSORT|MDB_INTEGERKEY|MDB_DUPFIXED|\
           MDB_INTEGERDUP|MDB_REVERSEDUP|MDB_CREATE)
       mdb_dbi_open() flags

   #defineFREE_DBI0
       Handle for the DB used to track free pages.

   #defineMAIN_DBI1
       Handle for the default DB.

   #defineCORE_DBS2
       Number of DBs in metapage (free and main) - also hardcoded elsewhere

   #defineNUM_METAS2
       Number of meta pages - also hardcoded elsewhere

   #defineCURSOR_STACK32
       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.

   #defineXCURSOR_INITED(mc)((mc)->mc_xcursor&&((mc)->mc_xcursor->mx_cursor.mc_flags&C_INITIALIZED))
       Check if there is an inited xcursor

   #defineXCURSOR_REFRESH(mc,top,mp)Value:.PP
           do { \
           MDB_page *xr_pg = (mp); \
           MDB_node *xr_node; \
           if (!XCURSOR_INITED(mc) || (mc)->mc_ki[top] >= NUMKEYS(xr_pg)) break; \
           xr_node = NODEPTR(xr_pg, (mc)->mc_ki[top]); \
           if ((xr_node->mn_flags & (F_DUPDATA|F_SUBDATA)) == F_DUPDATA) \
               (mc)->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(xr_node); \
       } while (0)
       Update the xcursor's sub-page pointer, if any, in mc. Needed when the node which contains the sub-page
       may have moved. Called with leaf page mp = mc->mc_pg[top].

   #defineMDB_COMMIT_PAGES64
       max number of pages to commit in one writev() call

   #defineMAX_WRITE(0x40000000U>>(sizeof(ssize_t)==4))
       max bytes to write in one call

   #defineTXN_DBI_EXIST(txn,dbi,validity)((txn)&&(dbi)<(txn)->mt_numdbs&&((txn)->mt_dbflags[dbi]&(validity)))
       Check txn and dbi arguments to a function

   #defineTXN_DBI_CHANGED(txn,dbi)((txn)->mt_dbiseqs[dbi]!=(txn)->mt_env->me_dbiseqs[dbi])
       Check for misused dbi handles

   #defineMDB_END_NAMESValue:.PP
           {"committed", "empty-commit", "abort", "reset", \
           "reset-tmp", "fail-begin", "fail-beginchild"}

   #defineMDB_END_OPMASK0x0F
       mask for mdb_txn_end() operation number

   #defineMDB_END_UPDATE0x10
       update env state (DBIs)

   #defineMDB_END_FREE0x20
       free txn unless it is MDB_env.me_txn0

   #defineMDB_END_SLOTMDB_NOTLS
       release any reader slot if MDB_NOTLS#defineMDB_SPLIT_REPLACEMDB_APPENDDUP
       newkey is not new

   #definemdb_cmp_clongmdb_cmp_cint
       Compare two items pointing at size_t's of unknown alignment.

   #definemdb_cassert(mc,expr)mdb_assert0((mc)->mc_txn->mt_env,expr,#expr)assert(3) variant in cursor context

   #definemdb_tassert(txn,expr)mdb_assert0((txn)->mt_env,expr,#expr)assert(3) variant in transaction context

   #definemdb_eassert(env,expr)mdb_assert0(env,expr,#expr)assert(3) variant in environment context

   #definemdb_assert0(env,expr,expr_txt)Value:.PP
               ((expr) ? (void)0 : \
               mdb_assert_fail(env, expr_txt, mdb_func_, __FILE__, __LINE__))

   #defineMDB_NAME(str)strmdb_nchar_t[] string literal

   #definemdb_name_cpystrcpy
       Copy name (mdb_nchar_t string)

   #defineMDB_SUFFLEN9
       Max string length in mdb_suffixes[]

   #definemdb_fname_destroy(fname)do{if((fname).mn_alloced)free((fname).mn_val);}while(0)
       Destroy fname from mdb_fname_init()#defineCHANGEABLE(MDB_NOSYNC|MDB_NOMETASYNC|MDB_MAPASYNC|MDB_NOMEMINIT)
       Only a subset of the EnvironmentFlags flags can be changed at runtime. Changing other flags requires
       closing the environment and re-opening it with the new flags.

   #defineCHANGELESSValue:.PP
           (MDB_FIXEDMAP|MDB_NOSUBDIR|MDB_RDONLY| \
           MDB_WRITEMAP|MDB_NOTLS|MDB_NOLOCK|MDB_NORDAHEAD)

   #defineMDB_NOSPILL0x8000
       Do not spill pages to disk if txn is getting full, may fail instead

   #defineWITH_CURSOR_TRACKING(mn,act)Value:.PP
           do { \
           MDB_cursor dummy, *tracked, **tp = &(mn).mc_txn->mt_cursors[mn.mc_dbi]; \
           if ((mn).mc_flags & C_SUB) { \
               dummy.mc_flags =  C_INITIALIZED; \
               dummy.mc_xcursor = (MDB_xcursor *)&(mn); \
               tracked = &dummy; \
           } else { \
               tracked = &(mn); \
           } \
           tracked->mc_next = *tp; \
           *tp = tracked; \
           { act; } \
           *tp = tracked->mc_next; \
       } while (0)
       Perform act while tracking temporary cursor mn#defineMDB_EOF0x10mdb_env_copyfd1() is done reading

Name

       internal - LMDB Internals

Struct Mdb_Copy

       State needed for a double-buffering compacting copy.

   DataFieldsMDB_env * mc_envMDB_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_tmc_next_pgnoHANDLEmc_fd
       int mc_toggle
       int mc_new
       volatile int mc_error

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).

   DataFieldsMDB_cursor * mc_nextMDB_cursor * mc_backup
       struct MDB_xcursor * mc_xcursorMDB_txn * mc_txnMDB_dbimc_dbiMDB_db * mc_dbMDB_dbx * mc_dbx
       unsigned char * mc_dbflag
       unsigned short mc_snum
       unsigned short mc_top
       unsigned int mc_flagsMDB_page * mc_pg [CURSOR_STACK]
       indx_tmc_ki [CURSOR_STACK]

Struct Mdb_Db

       Information about a single database in the environment.

   DataFields

       uint32_t md_pad
       uint16_t md_flags
       uint16_t md_depthpgno_tmd_branch_pagespgno_tmd_leaf_pagespgno_tmd_overflow_pages
       size_t md_entriespgno_tmd_root

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.

   DataFieldsMDB_valmd_nameMDB_cmp_func * md_cmpMDB_cmp_func * md_dcmpMDB_rel_func * md_rel
       void * md_relctx

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.

   DataFieldsHANDLEme_fdHANDLEme_lfdHANDLEme_mfd
       uint32_t me_flags
       unsigned int me_psize
       unsigned int me_os_psize
       unsigned int me_maxreaders
       volatile int me_close_readersMDB_dbime_numdbsMDB_dbime_maxdbs
       MDB_PID_T me_pid
       char * me_path
       char * me_mapMDB_txninfo * me_txnsMDB_meta * me_metas [NUM_METAS]
       void * me_pbufMDB_txn * me_txnMDB_txn * me_txn0
       size_t me_mapsize
       off_t me_sizepgno_tme_maxpgMDB_dbx * me_dbxs
       uint16_t * me_dbflags
       unsigned int * me_dbiseqs
       pthread_key_t me_txkeytxnid_tme_pgoldestMDB_pgstateme_pgstateMDB_page * me_dpagesMDB_IDLme_free_pgsMDB_ID2Lme_dirty_list
       int me_maxfree_1pg
       unsigned int me_nodemax
       int me_live_reader
       void * me_userctxMDB_assert_func * me_assert_func

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).

   DataFields

       uint32_t mm_magic
       uint32_t mm_version
       void * mm_address
       size_t mm_mapsizeMDB_dbmm_dbs [CORE_DBS]
       pgno_tmm_last_pg
       volatile txnid_tmm_txnid

Struct Mdb_Name

       Filename - string of mdb_nchar_t[]

   DataFields

       int mn_len
       int mn_allocedmdb_nchar_t * mn_val

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).

   DataFields

       unsigned short mn_flags
       unsigned short mn_ksize
       char mn_data [1]

           unsigned short mn_lo
           unsigned short mn_hi

Struct Mdb_Ntxn

       Nested transaction

   DataFieldsMDB_txnmnt_txnMDB_pgstatemnt_pgstate

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.

   DataFields

       union {
          pgno_tp_pgno
          struct MDB_page * p_next
       } mp_p
       uint16_t mp_pad
       uint16_t mp_flags
       union {
          struct {
             indx_tpb_lowerindx_tpb_upper
          } pb
          uint32_t pb_pages
       } mp_pbindx_tmp_ptrs [0]

Struct Mdb_Page2

       Alternate page header, for 2-byte aligned access

   DataFields

       uint16_t mp2_p [sizeof(pgno_t)/2]
       uint16_t mp2_pad
       uint16_t mp2_flagsindx_tmp2_lowerindx_tmp2_upperindx_tmp2_ptrs [0]

Struct Mdb_Pgstate

       State of FreeDB old pages, stored in the MDB_envDataFieldspgno_t * mf_pgheadtxnid_tmf_pglast

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.

   DataFieldsMDB_txn * mt_parentMDB_txn * mt_childpgno_tmt_next_pgnotxnid_tmt_txnidMDB_env * mt_envMDB_IDLmt_free_pgsMDB_page * mt_loose_pgs
       int mt_loose_countMDB_IDLmt_spill_pgs
       union {
          MDB_ID2Ldirty_listMDB_reader * reader
       } mt_uMDB_dbx * mt_dbxsMDB_db * mt_dbs
       unsigned int * mt_dbiseqsMDB_cursor ** mt_cursors
       unsigned char * mt_dbflagsMDB_dbimt_numdbs
       unsigned int mt_flags
       unsigned int mt_dirty_room

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.

   DataFieldsMDB_cursormx_cursorMDB_dbmx_dbMDB_dbxmx_dbx
       unsigned char mx_dbflag

Synopsis

ModulesIDListManagementCompatibilityMacrosDebugMacrosReaderLockTablePageFlagsNodeFlagsTransactionDBFlagsTransactionFlagsCursorFlagsDataStructures
       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_copyMacros
       #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_SLOTMDB_NOTLS
       #define MDB_PS_MODIFY   1
       #define MDB_PS_ROOTONLY   2
       #define MDB_PS_FIRST   4
       #define MDB_PS_LAST   8
       #define MDB_SPLIT_REPLACEMDB_APPENDDUP
       #define mdb_env_close0(env,  excl)   mdb_env_close1(env)
       #define mdb_cmp_clongmdb_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_IDpgno_t
       typedef MDB_IDtxnid_t
       typedef uint16_t indx_t
       typedef char mdb_nchar_tEnumerations
       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_tmdb_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_dbimdb_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]

Typedef Documentation

typedefMDB_IDpgno_t
       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
           In the MDB_node structure, we only store 48 bits of this value, which thus limits us to only 60 bits
           of addressable data.

   typedefMDB_IDtxnid_t
       A transaction ID. See struct MDB_txn.mt_txnid for details.

   typedefuint16_tindx_t
       Used for offsets within a single page. Since memory pages are typically 4 or 8KB in size, 12-13 bits,
       this is plenty.

   typedefcharmdb_nchar_t
       Character type for file names: char on Unix, wchar_t on Windows

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.

   DataFieldsMDB_pagemb_page
       struct {
          char mm_pad [PAGEHDRSZ]
          MDB_metamm_meta
       } mb_metabuf

Variable Documentation

char*constmdb_errstr[][static]Initialvalue:.PP
       = {
           "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 or environment had fatal error",
           "MDB_VERSION_MISMATCH: Database environment version mismatch",
           "MDB_INVALID: File is not an LMDB 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 must abort, has a child, or is invalid",
           "MDB_BAD_VALSIZE: Unsupported size of key/DB name/data, or wrong DUPFIXED size",
           "MDB_BAD_DBI: The specified DBI handle was closed/changed unexpectedly",
       }
       Table of descriptions for LMDB ReturnCodesconstmdb_nchar_t*constmdb_suffixes[2][2][static]Initialvalue:.PP
       = {
           { MDB_NAME("/data.mdb"), MDB_NAME("")      },
           { MDB_NAME("/lock.mdb"), MDB_NAME("-lock") }
       }
       Filename suffixes [datafile,lockfile][without,with MDB_NOSUBDIR]

See Also