Class LMDB
- java.lang.Object
-
- org.lwjgl.util.lmdb.LMDB
-
public class LMDB extends java.lang.ObjectContains bindings to LMDB, the Symas Lightning Memory-Mapped Database.Getting Started
LMDB is compact, fast, powerful, and robust and implements a simplified variant of the BerkeleyDB (BDB) API.
Everything starts with an environment, created by
env_create. Once created, this environment must also be opened withenv_open.env_opengets passed a name which is interpreted as a directory path. Note that this directory must exist already, it is not created for you. Within that directory, a lock file and a storage file will be generated. If you don't want to use a directory, you can pass theNOSUBDIRoption, in which case the path you provided is used directly as the data file, and another file with a "-lock" suffix added will be used for the lock file.Once the environment is open, a transaction can be created within it using
txn_begin. Transactions may be read-write or read-only, and read-write transactions may be nested. A transaction must only be used by one thread at a time. Transactions are always required, even for read-only access. The transaction provides a consistent view of the data.Once a transaction has been created, a database can be opened within it using
dbi_open. If only one database will ever be used in the environment, aNULLcan be passed as the database name. For named databases, theCREATEflag must be used to create the database if it doesn't already exist. Also,env_set_maxdbsmust be called afterenv_createand beforeenv_opento set the maximum number of named databases you want to support.Note: a single transaction can open multiple databases. Generally databases should only be opened once, by the first transaction in the process. After the first transaction completes, the database handles can freely be used by all subsequent transactions.
Within a transaction,
getandputcan store single key/value pairs if that is all you need to do (but seeCursorsbelow if you want to do more).A key/value pair is expressed as two
MDBValstructures. This struct has two fields,mv_sizeandmv_data. The data is avoidpointer to an array ofmv_sizebytes.Because LMDB is very efficient (and usually zero-copy), the data returned in an
MDBValstructure may be memory-mapped straight from disk. In other words look but do not touch (orfree()for that matter). Once a transaction is closed, the values can no longer be used, so make a copy if you need to keep them after that.Cursors
To do more powerful things, we must use a cursor.
Within the transaction, a cursor can be created with
cursor_open. With this cursor we can store/retrieve/delete (multiple) values usingcursor_get,cursor_put, andcursor_del.cursor_getpositions itself depending on the cursor operation requested, and for some operations, on the supplied key. For example, to list all key/value pairs in a database, use operationFIRSTfor the first call tocursor_get, andNEXTon subsequent calls, until the end is hit.To retrieve all keys starting from a specified key value, use
SET.When using
cursor_put, either the function will position the cursor for you based on thekey, or you can use operationCURRENTto use the current position of the cursor. Note thatkeymust then match the current position's key.Summarizing the Opening
So we have a cursor in a transaction which opened a database in an environment which is opened from a filesystem after it was separately created.
Or, we create an environment, open it from a filesystem, create a transaction within it, open a database within that transaction, and create a cursor within all of the above.
Threads and Processes
LMDB uses POSIX locks on files, and these locks have issues if one process opens a file multiple times. Because of this, do not
env_opena file multiple times from a single process. Instead, share the LMDB environment that has opened the file across all threads. Otherwise, if a single process opens the same environment multiple times, closing it once will remove all the locks held on it, and the other instances will be vulnerable to corruption from other processes.Also note that a transaction is tied to one thread by default using Thread Local Storage. If you want to pass read-only transactions across threads, you can use the
NOTLSoption on the environment.To actually get anything done, a transaction must be committed using
txn_commit. Alternatively, all of a transaction's operations can be discarded usingtxn_abort. In a read-only transaction, any cursors will not automatically be freed. In a read-write transaction, all cursors will be freed and must not be used again.For read-only transactions, obviously there is nothing to commit to storage. The transaction still must eventually be aborted to close any database handle(s) opened in it, or committed to keep the database handles around for reuse in new transactions.
In addition, as long as a transaction is open, a consistent view of the database is kept alive, which requires storage. A read-only transaction that no longer requires this consistent view should be terminated (committed or aborted) when the view is no longer needed (but see below for an optimization).
There can be multiple simultaneously active read-only transactions but only one that can write. Once a single read-write transaction is opened, all further attempts to begin one will block until the first one is committed or aborted. This has no effect on read-only transactions, however, and they may continue to be opened at any time.
Duplicate Keys
getandputrespectively have no and only some support for multiple key/value pairs with identical keys. If there are multiple values for a key,getwill only return the first value.When multiple values for one key are required, pass the
DUPSORTflag todbi_open. In anDUPSORTdatabase, by defaultputwill not replace the value for a key if the key existed already. Instead it will add the new value to the key. In addition,delwill pay attention to the value field too, allowing for specific values of a key to be deleted.Finally, additional cursor operations become available for traversing through and retrieving duplicate values.
Some Optimization
If you frequently begin and abort read-only transactions, as an optimization, it is possible to only reset and renew a transaction.
txn_resetreleases any old copies of data kept around for a read-only transaction. To reuse this reset transaction, calltxn_renewon it. Any cursors in this transaction must also be renewed usingcursor_renew.Note that
txn_resetis similar totxn_abortand will close any databases you opened within the transaction.To permanently free a transaction, reset or not, use
txn_abort.Cleaning Up
For read-only transactions, any cursors created within it must be closed using
cursor_close.It is very rarely necessary to close a database handle, and in general they should just be left open.
-
-
Field Summary
Fields Modifier and Type Field and Description static intMDB_APPENDData is being appended, don't split full pages.static intMDB_APPENDDUPDuplicate data is being appended, don't split full pages.static intMDB_BAD_DBIThe specified DBI was changed unexpectedly.static intMDB_BAD_RSLOTInvalid reuse of reader locktable slot.static intMDB_BAD_TXNTransaction must abort, has a child, or is invalid.static intMDB_BAD_VALSIZEUnsupported size of key/DB name/data, or wrongDUPFIXEDsize.static intMDB_CORRUPTEDLocated page was wrong type.static intMDB_CP_COMPACTOmit free space from copy, and renumber all pages sequentially.static intMDB_CREATECreate DB if not already existing.static intMDB_CURRENTOverwrite the current key/data pair.static intMDB_CURSOR_FULLCursor stack too deep - internal error.static intMDB_DBS_FULLEnvironment maxdbs reached.static intMDB_DUPFIXEDWithDUPSORT, sorted dup items have fixed size.static intMDB_DUPSORTUse sorted duplicates.static intMDB_FIRST
MDB_FIRST_DUPMDB_cursor_opstatic intMDB_FIXEDMAPmmap at a fixed address (experimental).static intMDB_GET_BOTH
MDB_GET_BOTH_RANGE
MDB_GET_CURRENT
MDB_GET_MULTIPLEMDB_cursor_opstatic intMDB_INCOMPATIBLEstatic intMDB_INTEGERDUPWithDUPSORT, dups areINTEGERKEY-style integers.static intMDB_INTEGERKEYNumeric keys in native byte order: eitherunsigned intorsize_t.static intMDB_INVALIDFile is not a valid LMDB file.static intMDB_KEYEXISTKey/data pair already exists.static intMDB_LAST
MDB_LAST_DUPMDB_cursor_opstatic intMDB_LAST_ERRCODEThe last defined error code.static intMDB_MAP_FULLEnvironment mapsize reached.static intMDB_MAP_RESIZEDDatabase contents grew beyond environment mapsize.static intMDB_MAPASYNCUse asynchronous msync whenWRITEMAPis used.static intMDB_MULTIPLEStore multiple data items in one call.static intMDB_NEXT
MDB_NEXT_DUP
MDB_NEXT_MULTIPLE
MDB_NEXT_NODUPMDB_cursor_opstatic intMDB_NODUPDATARemove all duplicate data items.static intMDB_NOLOCKDon't do any locking, caller must manage their own locks.static intMDB_NOMEMINITDon't initialize malloc'd memory before writing to datafile.static intMDB_NOMETASYNCDon't fsync metapage after commit.static intMDB_NOOVERWRITEDon't write if the key already exists.static intMDB_NORDAHEADDon't do readahead (no effect on Windows).static intMDB_NOSUBDIRNo environment directory.static intMDB_NOSYNCDon't fsync after commit.static intMDB_NOTFOUNDKey/data pair not found (EOF).static intMDB_NOTLSTie reader locktable slots toMDB_txnobjects instead of to threads.static intMDB_PAGE_FULLPage has not enough space - internal error.static intMDB_PAGE_NOTFOUNDRequested page not found - this usually indicates corruption.static intMDB_PANICUpdate of meta page failed or environment had fatal error.static intMDB_PREV
MDB_PREV_DUP
MDB_PREV_MULTIPLE
MDB_PREV_NODUPMDB_cursor_opstatic intMDB_PROBLEMUnexpected problem - txn should abort.static intMDB_RDONLYRead only.static intMDB_READERS_FULLEnvironment maxreaders reached.static intMDB_RESERVEJust reserve space for data, don't copy it.static intMDB_REVERSEDUPWithDUPSORT, use reverse string dups.static intMDB_REVERSEKEYUse reverse string keys.static intMDB_SET
MDB_SET_KEY
MDB_SET_RANGEMDB_cursor_opstatic intMDB_SUCCESSSuccessful result.static intMDB_TLS_FULLToo many TLS keys in use - Windows only.static intMDB_TXN_FULLTxn has too many dirty pages.static intMDB_VERSION_MISMATCHEnvironment version mismatch.static intMDB_WRITEMAPUse writable mmap.
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method and Description static intmdb_cmp(long txn, int dbi, MDBVal a, MDBVal b)Compares two data items according to a particular database.static voidmdb_cursor_close(long cursor)Closes a cursor handle.static intmdb_cursor_count(long cursor, org.lwjgl.PointerBuffer countp)Returns count of duplicates for current key.static intmdb_cursor_dbi(long cursor)Return the cursor's database handle.static intmdb_cursor_del(long cursor, int flags)Deletes current key/data pair.static intmdb_cursor_get(long cursor, MDBVal key, MDBVal data, int op)Retrieves by cursor.static intmdb_cursor_open(long txn, int dbi, org.lwjgl.PointerBuffer cursor)Creates a cursor handle.static intmdb_cursor_put(long cursor, MDBVal key, MDBVal data, int flags)Stores by cursor.static intmdb_cursor_renew(long txn, long cursor)Renews a cursor handle.static longmdb_cursor_txn(long cursor)Returns the cursor's transaction handle.static voidmdb_dbi_close(long env, int dbi)Closes a database handle.static intmdb_dbi_flags(long txn, int dbi, int[] flags)Array version of:dbi_flagsstatic intmdb_dbi_flags(long txn, int dbi, java.nio.IntBuffer flags)Retrieve the DB flags for a database handle.static intmdb_dbi_open(long txn, java.nio.ByteBuffer name, int flags, int[] dbi)Array version of:dbi_openstatic intmdb_dbi_open(long txn, java.nio.ByteBuffer name, int flags, java.nio.IntBuffer dbi)Opens a database in the environment.static intmdb_dbi_open(long txn, java.lang.CharSequence name, int flags, int[] dbi)Array version of:dbi_openstatic intmdb_dbi_open(long txn, java.lang.CharSequence name, int flags, java.nio.IntBuffer dbi)Opens a database in the environment.static intmdb_dcmp(long txn, int dbi, MDBVal a, MDBVal b)Compares two data items according to a particular database.static intmdb_del(long txn, int dbi, MDBVal key, MDBVal data)Deletes items from a database.static intmdb_drop(long txn, int dbi, boolean del)Empties or deletes+closes a database.static voidmdb_env_close(long env)Closes the environment and releases the memory map.static intmdb_env_copy(long env, java.nio.ByteBuffer path)Copies an LMDB environment to the specified path.static intmdb_env_copy(long env, java.lang.CharSequence path)Copies an LMDB environment to the specified path.static intmdb_env_copy2(long env, java.nio.ByteBuffer path, int flags)Copies an LMDB environment to the specified path, with options.static intmdb_env_copy2(long env, java.lang.CharSequence path, int flags)Copies an LMDB environment to the specified path, with options.static intmdb_env_create(org.lwjgl.PointerBuffer env)Creates an LMDB environment handle.static intmdb_env_get_flags(long env, int[] flags)Array version of:env_get_flagsstatic intmdb_env_get_flags(long env, java.nio.IntBuffer flags)Gets environment flags.static intmdb_env_get_maxkeysize(long env)Gets the maximum size of keys andDUPSORTdata we can write.static intmdb_env_get_maxreaders(long env, int[] readers)Array version of:env_get_maxreadersstatic intmdb_env_get_maxreaders(long env, java.nio.IntBuffer readers)Gets the maximum number of threads/reader slots for the environment.static intmdb_env_get_path(long env, org.lwjgl.PointerBuffer path)Returns the path that was used inenv_open.static longmdb_env_get_userctx(long env)Gets the application information associated with theMDB_env.static intmdb_env_info(long env, MDBEnvInfo stat)Returns information about the LMDB environment.static intmdb_env_open(long env, java.nio.ByteBuffer path, int flags, int mode)Opens an environment handle.static intmdb_env_open(long env, java.lang.CharSequence path, int flags, int mode)Opens an environment handle.static intmdb_env_set_flags(long env, int flags, boolean onoff)Sets environment flags.static intmdb_env_set_mapsize(long env, long size)Sets the size of the memory map to use for this environment.static intmdb_env_set_maxdbs(long env, int dbs)Sets the maximum number of named databases for the environment.static intmdb_env_set_maxreaders(long env, int readers)Sets the maximum number of threads/reader slots for the environment.static intmdb_env_set_userctx(long env, long ctx)Set application information associated with theMDB_env.static intmdb_env_stat(long env, MDBStat stat)Returns statistics about the LMDB environment.static intmdb_env_sync(long env, boolean force)Flushes the data buffers to disk.static intmdb_get(long txn, int dbi, MDBVal key, MDBVal data)Gets items from a database.static intmdb_put(long txn, int dbi, MDBVal key, MDBVal data, int flags)Stores items into a database.static intmdb_reader_check(long env, int[] dead)Array version of:reader_checkstatic intmdb_reader_check(long env, java.nio.IntBuffer dead)Checks for stale entries in the reader lock table.static intmdb_reader_list(long env, MDBMsgFuncI func, long ctx)Dumps the entries in the reader lock table.static intmdb_set_compare(long txn, int dbi, MDBCmpFuncI cmp)Sets a custom key comparison function for a database.static intmdb_set_dupsort(long txn, int dbi, MDBCmpFuncI cmp)Sets a custom data comparison function for aDUPSORTdatabase.static intmdb_set_relctx(long txn, int dbi, long ctx)Sets a context pointer for aFIXEDMAPdatabase's relocation function.static intmdb_set_relfunc(long txn, int dbi, MDBRelFuncI rel)Sets a relocation function for aFIXEDMAPdatabase.static intmdb_stat(long txn, int dbi, MDBStat stat)Retrieves statistics for a database.static java.lang.Stringmdb_strerror(int err)Returns a string describing a given error code.static voidmdb_txn_abort(long txn)Abandons all the operations of the transaction instead of saving them.static intmdb_txn_begin(long env, long parent, int flags, org.lwjgl.PointerBuffer txn)Creates a transaction for use with the environment.static intmdb_txn_commit(long txn)Commits all the operations of a transaction into the database.static longmdb_txn_env(long txn)Returns the transaction'sMDB_env.static longmdb_txn_id(long txn)Returns the transaction's ID.static intmdb_txn_renew(long txn)Renews a read-only transaction.static voidmdb_txn_reset(long txn)Resets a read-only transaction.static java.lang.Stringmdb_version(int[] major, int[] minor, int[] patch)Array version of:versionstatic java.lang.Stringmdb_version(java.nio.IntBuffer major, java.nio.IntBuffer minor, java.nio.IntBuffer patch)Returns the LMDB library version information.
-
-
-
Field Detail
-
MDB_FIXEDMAP
mmap at a fixed address (experimental).
-
MDB_NOSUBDIR
No environment directory.
-
MDB_NOSYNC
Don't fsync after commit.
-
MDB_RDONLY
Read only.
-
MDB_NOMETASYNC
Don't fsync metapage after commit.
-
MDB_WRITEMAP
Use writable mmap.
-
MDB_MAPASYNC
Use asynchronous msync whenWRITEMAPis used.
-
MDB_NOTLS
Tie reader locktable slots toMDB_txnobjects instead of to threads.
-
MDB_NOLOCK
Don't do any locking, caller must manage their own locks.
-
MDB_NORDAHEAD
Don't do readahead (no effect on Windows).
-
MDB_NOMEMINIT
Don't initialize malloc'd memory before writing to datafile.
-
MDB_REVERSEKEY
Use reverse string keys.
-
MDB_DUPSORT
Use sorted duplicates.
-
MDB_INTEGERKEY
Numeric keys in native byte order: eitherunsigned intorsize_t. The keys must all be of the same size.
-
MDB_DUPFIXED
WithDUPSORT, sorted dup items have fixed size.
-
MDB_INTEGERDUP
WithDUPSORT, dups areINTEGERKEY-style integers.
-
MDB_REVERSEDUP
WithDUPSORT, use reverse string dups.
-
MDB_CREATE
Create DB if not already existing.
-
MDB_NOOVERWRITE
Don't write if the key already exists.
-
MDB_NODUPDATA
Remove all duplicate data items.
-
MDB_CURRENT
Overwrite the current key/data pair.
-
MDB_RESERVE
Just reserve space for data, don't copy it. Return a pointer to the reserved space.
-
MDB_APPEND
Data is being appended, don't split full pages.
-
MDB_APPENDDUP
Duplicate data is being appended, don't split full pages.
-
MDB_MULTIPLE
Store multiple data items in one call. Only forDUPFIXED.
-
MDB_CP_COMPACT
Omit free space from copy, and renumber all pages sequentially.
-
MDB_FIRST, MDB_FIRST_DUP, MDB_GET_BOTH, MDB_GET_BOTH_RANGE, MDB_GET_CURRENT, MDB_GET_MULTIPLE, MDB_LAST, MDB_LAST_DUP, MDB_NEXT, MDB_NEXT_DUP, MDB_NEXT_MULTIPLE, MDB_NEXT_NODUP, MDB_PREV, MDB_PREV_DUP, MDB_PREV_NODUP, MDB_SET, MDB_SET_KEY, MDB_SET_RANGE, MDB_PREV_MULTIPLE
MDB_cursor_opEnum values:
FIRST- Position at first key/data item.FIRST_DUP- Position at first data item of current key. Only forDUPSORT.GET_BOTH- Position at key/data pair. Only forDUPSORT.GET_BOTH_RANGE- position at key, nearest data. Only forDUPSORT.GET_CURRENT- Return key/data at current cursor position.GET_MULTIPLE- Return key and up to a page of duplicate data items from current cursor position. Move cursor to prepare forNEXT_MULTIPLE. Only forDUPFIXED.LAST- Position at last key/data item.LAST_DUP- Position at last data item of current key. Only forDUPSORT.NEXT- Position at next data item.NEXT_DUP- Position at next data item of current key. Only forDUPSORT.NEXT_MULTIPLE- Return key and up to a page of duplicate data items from next cursor position. Move cursor to prepare forNEXT_MULTIPLE. Only forDUPFIXED.NEXT_NODUP- Position at first data item of next key.PREV- Position at previous data item.PREV_DUP- Position at previous data item of current key. Only forDUPSORT.PREV_NODUP- Position at last data item of previous key.SET- Position at specified key.SET_KEY- Position at specified key, return key + data.SET_RANGE- Position at first key greater than or equal to specified key.PREV_MULTIPLE- Position at previous page and return key and up to a page of duplicate data items. Only forDUPFIXED.
-
MDB_SUCCESS
Successful result.
-
MDB_KEYEXIST
Key/data pair already exists.
-
MDB_NOTFOUND
Key/data pair not found (EOF).
-
MDB_PAGE_NOTFOUND
Requested page not found - this usually indicates corruption.
-
MDB_CORRUPTED
Located page was wrong type.
-
MDB_PANIC
Update of meta page failed or environment had fatal error.
-
MDB_VERSION_MISMATCH
Environment version mismatch.
-
MDB_INVALID
File is not a valid LMDB file.
-
MDB_MAP_FULL
Environment mapsize reached.
-
MDB_DBS_FULL
Environment maxdbs reached.
-
MDB_READERS_FULL
Environment maxreaders reached.
-
MDB_TLS_FULL
Too many TLS keys in use - Windows only.
-
MDB_TXN_FULL
Txn has too many dirty pages.
-
MDB_CURSOR_FULL
Cursor stack too deep - internal error.
-
MDB_PAGE_FULL
Page has not enough space - internal error.
-
MDB_MAP_RESIZED
Database contents grew beyond environment mapsize.
-
MDB_INCOMPATIBLE
The operation expects anDUPSORT/DUPFIXEDdatabase. Opening a named DB when the unnamed DB hasDUPSORT/INTEGERKEY. Accessing a data record as a database, or vice versa. The database was dropped and recreated with different flags.
-
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 wrongDUPFIXEDsize.
-
MDB_BAD_DBI
The specified DBI was changed unexpectedly.
-
MDB_PROBLEM
Unexpected problem - txn should abort.
-
MDB_LAST_ERRCODE
The last defined error code.
-
-
Method Detail
-
mdb_version
public static java.lang.String mdb_version(java.nio.IntBuffer major, java.nio.IntBuffer minor, java.nio.IntBuffer patch)Returns the LMDB library version information.- Parameters:
major- if non-NULL, the library major version number is copied hereminor- if non-NULL, the library minor version number is copied herepatch- if non-NULL, the library patch version number is copied here- Returns:
- the library version as a string
-
mdb_strerror
public static java.lang.String mdb_strerror(int err)
Returns 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.
- Parameters:
err- the error code- Returns:
- the description of the error
-
mdb_env_create
public static int mdb_env_create(org.lwjgl.PointerBuffer env)
Creates an LMDB environment handle.This function allocates memory for a
MDB_envstructure. To release the allocated memory and discard the handle, callenv_close. Before the handle may be used, it must be opened usingenv_open. Various other options may also need to be set before opening the handle, e.g.env_set_mapsize,env_set_maxreaders,env_set_maxdbs, depending on usage requirements.- Parameters:
env- the address where the new handle will be stored- Returns:
- a non-zero error value on failure and 0 on success
-
mdb_env_open
public static int mdb_env_open(long env, java.nio.ByteBuffer path, int flags, int mode) public static int mdb_env_open(long env, java.lang.CharSequence path, int flags, int mode)Opens an environment handle.If this function fails,
env_closemust be called to discard theMDB_envhandle.- Parameters:
env- an environment handle returned byenv_createpath- 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 byenv_set_flagsare also used.FIXEDMAPUse 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.
NOSUBDIRBy 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,pathis used as-is for the database main data file. The database lock file is thepathwith "-lock" appended.RDONLYOpen 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.
WRITEMAPUse a writeable memory map unless
RDONLYis 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
WRITEMAPon the same environment. This can defeat durability (env_syncetc).NOMETASYNCFlush system buffers to disk only once per transaction, omit the metadata flush. Defer that until the system flushes files to disk, or next non-
RDONLYcommit orenv_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
env_set_flags.NOSYNCDon'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
env_syncis called. However, if the filesystem preserves write order and theWRITEMAPflag 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 (NOSYNC|WRITEMAP) leaves the system with no hint for when to write transactions to disk, unlessenv_syncis called. (MAPASYNC|WRITEMAP) may be preferable.This flag may be changed at any time using
env_set_flags.MAPASYNCWhen using
WRITEMAP, use asynchronous flushes to disk. As withNOSYNC, a system crash can then corrupt the database or lose the last transactions. Callingenv_syncensures on-disk database integrity until next commit.This flag may be changed at any time using
env_set_flags.NOTLSDon't use Thread-Local Storage. Tie reader locktable slots to
MDB_txnobjects instead of to threads. I.e.txn_resetkeeps the slot reseved for theMDB_txnobject. 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.NOLOCKDon'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.
NORDAHEADTurn 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.
NOMEMINITDon'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 withWRITEMAP, which writes directly to the mmap instead of using malloc for pages. The initialization is also skipped ifRESERVEis 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
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:
VERSION_MISMATCH- the version of the LMDB library doesn't match the version that created the database environment.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.
-
mdb_env_copy
public static int mdb_env_copy(long env, java.nio.ByteBuffer path) public static int mdb_env_copy(long env, java.lang.CharSequence path)Copies 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.
This call can trigger significant file size growth if run in parallel with write transactions, because it employs a read-only transaction.
- Parameters:
env- an environment handle returned byenv_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
-
mdb_env_copy2
public static int mdb_env_copy2(long env, java.nio.ByteBuffer path, int flags) public static int mdb_env_copy2(long env, java.lang.CharSequence path, int flags)Copies 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.
This call can trigger significant file size growth if run in parallel with write transactions, because it employs a read-only transaction.
- Parameters:
env- an environment handle returned byenv_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.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.
-
mdb_env_stat
public static int mdb_env_stat(long env, MDBStat stat)Returns statistics about the LMDB environment.- Parameters:
env- an environment handle returned byenv_createstat- the address of anMDBStatstructure where the statistics will be copied- Returns:
- a non-zero error value on failure and 0 on success
-
mdb_env_info
public static int mdb_env_info(long env, MDBEnvInfo stat)Returns information about the LMDB environment.- Parameters:
env- an environment handle returned byenv_createstat- the address of anMDBEnvInfostructure where the information will be copied- Returns:
- a non-zero error value on failure and 0 on success
-
mdb_env_sync
public static int mdb_env_sync(long env, boolean force)Flushes the data buffers to disk.Data is always written to disk when
txn_commitis called, but the operating system may keep it buffered. LMDB always flushes the OS buffers upon commit as well, unless the environment was opened withNOSYNCor in partNOMETASYNC. This call is not valid if the environment was opened withRDONLY.- Parameters:
env- an environment handle returned byenv_createforce- if non-zero, force a synchronous flush. Otherwise if the environment has theNOSYNCflag set the flushes will be omitted, and withMAPASYNCthey 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.
-
mdb_env_close
public static void mdb_env_close(long env)
Closes the environment and releases the memory map.Only a single thread may call this function. All transactions, databases, and cursors must already be closed before calling this function. Attempts to use any such handles after calling this function will cause a SIGSEGV. The environment handle will be freed and must not be used again after this call.
- Parameters:
env- an environment handle returned byenv_create
-
mdb_env_set_flags
public static int mdb_env_set_flags(long env, int flags, boolean onoff)Sets environment flags.This may be used to set some flags in addition to those from
env_open, or to unset these flags. If several threads change the flags at the same time, the result is undefined.- Parameters:
env- an environment handle returned byenv_createflags- the flags to change, bitwise OR'ed togetheronoff- 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.
-
mdb_env_get_flags
public static int mdb_env_get_flags(long env, java.nio.IntBuffer flags)Gets environment flags.- Parameters:
env- an environment handle returned byenv_createflags- the address of an integer to store the flags- Returns:
- a non-zero error value on failure and 0 on success
-
mdb_env_get_path
public static int mdb_env_get_path(long env, org.lwjgl.PointerBuffer path)Returns the path that was used inenv_open.- Parameters:
env- an environment handle returned byenv_createpath- 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
-
mdb_env_set_mapsize
public static int mdb_env_set_mapsize(long env, long size)Sets 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
env_createand beforeenv_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,
txn_beginwill returnMAP_RESIZED. This function may be called with a size of zero to adopt the new size.Any attempt to set a size smaller than the space already consumed by the environment will be silently changed to the current size of the used space.
- Parameters:
env- an environment handle returned byenv_createsize- 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.
-
mdb_env_set_maxreaders
public static int mdb_env_set_maxreaders(long env, int readers)Sets 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 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
NOTLSis in use,txn_begininstead ties the slot to theMDB_txnobject until it or theMDB_envobject is destroyed.This function may only be called after
env_createand beforeenv_open.- Parameters:
env- an environment handle returned byenv_createreaders- 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.
-
mdb_env_get_maxreaders
public static int mdb_env_get_maxreaders(long env, java.nio.IntBuffer readers)Gets the maximum number of threads/reader slots for the environment.- Parameters:
env- an environment handle returned byenv_createreaders- address of an integer to store the number of readers- Returns:
- a non-zero error value on failure and 0 on success
-
mdb_env_set_maxdbs
public static int mdb_env_set_maxdbs(long env, int dbs)Sets 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
env_createand beforeenv_open.Currently a moderate number of slots are cheap but a huge number gets expensive: 7-120 words per transaction, and every
dbi_opendoes a linear search of the opened slots.- Parameters:
env- an environment handle returned byenv_createdbs- 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.
-
mdb_env_get_maxkeysize
public static int mdb_env_get_maxkeysize(long env)
Gets the maximum size of keys andDUPSORTdata we can write.Depends on the compile-time constant
MAXKEYSIZE. Default 511.- Parameters:
env- an environment handle returned byenv_create
-
mdb_env_set_userctx
public static int mdb_env_set_userctx(long env, long ctx)Set application information associated with theMDB_env.- Parameters:
env- an environment handle returned byenv_createctx- an arbitrary pointer for whatever the application needs
-
mdb_env_get_userctx
public static long mdb_env_get_userctx(long env)
Gets the application information associated with theMDB_env.- Parameters:
env- an environment handle returned byenv_create
-
mdb_txn_begin
public static int mdb_txn_begin(long env, long parent, int flags, org.lwjgl.PointerBuffer txn)Creates a transaction for use with the environment.The transaction handle may be discarded using
txn_abortortxn_commit.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
NOTLSis in use, this does not apply to read-only transactions.Cursors may not span transactions.
- Parameters:
env- an environment handle returned byenv_createparent- if this parameter is non-NULL, the new transaction will be a nested transaction, with the transaction indicated byparentas its parent. Transactions may be nested to any level. A parent transaction and its cursors may not issue any other operations thantxn_commitandtxn_abortwhile 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.RDONLY- This transaction will not perform any write operations.NOSYNC- Don't flush system buffers to disk when committing this transaction.NOMETASYNC- Flush system buffers but omit metadata flush when committing this transaction.
txn- address where the newMDB_txnhandle will be stored- Returns:
- a non-zero error value on failure and 0 on success. Some possible errors are:
PANIC- a fatal error occurred earlier and the environment must be shut down.MAP_RESIZED- another process wrote data beyond thisMDB_env's mapsize and this environment's map must be resized as well. Seeenv_set_mapsize.READERS_FULL- a read-only transaction was requested and the reader lock table is full. Seeenv_set_maxreaders.ENOMEM- out of memory.
-
mdb_txn_env
public static long mdb_txn_env(long txn)
Returns the transaction'sMDB_env.- Parameters:
txn- a transaction handle returned bytxn_begin.
-
mdb_txn_id
public static long mdb_txn_id(long txn)
Returns 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.
- Parameters:
txn- a transaction handle returned bytxn_begin.- Returns:
- a transaction ID, valid if input is an active transaction
-
mdb_txn_commit
public static int mdb_txn_commit(long txn)
Commits 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
cursor_renew.Earlier documentation incorrectly said all cursors would be freed. Only write-transactions free cursors.
- Parameters:
txn- a transaction handle returned bytxn_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.
-
mdb_txn_abort
public static void mdb_txn_abort(long txn)
Abandons 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
cursor_renew.Earlier documentation incorrectly said all cursors would be freed. Only write-transactions free cursors. "
- Parameters:
txn- a transaction handle returned bytxn_begin.
-
mdb_txn_reset
public static void mdb_txn_reset(long txn)
Resets a read-only transaction.Aborts the transaction like
txn_abort, but keeps the transaction handle.txn_renewmay reuse the handle. This saves allocation overhead if the process will start a new read-only transaction soon, and also locking overhead ifNOTLSis in use. The reader table lock is released, but the table slot stays tied to its thread orMDB_txn. Usetxn_abortto discard a reset handle, and to free its lock table slot ifNOTLSis in use.Cursors opened within the transaction must not be used again after this call, except with
cursor_renew.Reader locks generally don't interfere with writers, but they keep old versions of database pages allocated. Thus they prevent the old pages from being reused when writers commit new data, and so under heavy load the database size may grow much more rapidly than otherwise.
- Parameters:
txn- a transaction handle returned bytxn_begin.
-
mdb_txn_renew
public static int mdb_txn_renew(long txn)
Renews a read-only transaction.This acquires a new reader lock for a transaction handle that had been released by
txn_reset. It must be called before a reset transaction may be used again.- Parameters:
txn- a transaction handle returned bytxn_begin.
-
mdb_dbi_open
public static int mdb_dbi_open(long txn, java.nio.ByteBuffer name, int flags, java.nio.IntBuffer dbi) public static int mdb_dbi_open(long txn, java.lang.CharSequence name, int flags, java.nio.IntBuffer dbi)Opens 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
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),env_set_maxdbsmust be called before opening the environment. Database names are keys in the unnamed database, and may be read but not written.- Parameters:
txn- a transaction handle returned bytxn_begin.name- the name of the database to open. If only a single database is needed in the environment, this value may beNULL.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.REVERSEKEYKeys 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.
DUPSORTDuplicate 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.
INTEGERKEYKeys are binary integers in native byte order, either
unsigned intormdb_size_t, and will be sorted as such. The keys must all be of the same size.DUPFIXEDThis flag may only be used in combination with
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, theGET_MULTIPLEandNEXT_MULTIPLEcursor operations may be used to retrieve multiple items at once.INTEGERDUPThis option specifies that duplicate data items are binary integers, similar to
INTEGERKEYkeys.REVERSEDUPThis option specifies that duplicate data items should be compared as strings in reverse order.
CREATECreate 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 newMDB_dbihandle will be stored- Returns:
- a non-zero error value on failure and 0 on success. Some possible errors are:
NOTFOUND- the specified database doesn't exist in the environment andCREATEwas not specified.DBS_FULL- too many databases have been opened. Seeenv_set_maxdbs.
-
mdb_stat
public static int mdb_stat(long txn, int dbi, MDBStat stat)Retrieves statistics for a database.
-
mdb_dbi_flags
public static int mdb_dbi_flags(long txn, int dbi, java.nio.IntBuffer flags)Retrieve the DB flags for a database handle.
-
mdb_dbi_close
public static void mdb_dbi_close(long env, int dbi)Closes 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
BAD_VALSIZE(since the DB name is gone).Closing a database handle is not necessary, but lets
dbi_openreuse the handle value. Usually it's better to set a biggerenv_set_maxdbs, unless that value would be large.- Parameters:
env- an environment handle returned byenv_createdbi- a database handle returned bydbi_open
-
mdb_drop
public static int mdb_drop(long txn, int dbi, boolean del)Empties or deletes+closes a database.See
dbi_closefor restrictions about closing the DB handle.
-
mdb_set_compare
public static int mdb_set_compare(long txn, int dbi, MDBCmpFuncI cmp)Sets 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
dbi_open, the keys are compared lexically, with shorter keys collating before longer keys.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.
- Parameters:
txn- a transaction handle returned bytxn_begin.dbi- a database handle returned bydbi_opencmp- anMDBCmpFuncfunction
-
mdb_set_dupsort
public static int mdb_set_dupsort(long txn, int dbi, MDBCmpFuncI cmp)Sets a custom data comparison function for aDUPSORTdatabase.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
DUPSORTflag.If no comparison function is specified, and no special key flags were specified with
dbi_open, the data items are compared lexically, with shorter items collating before longer items.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.
- Parameters:
txn- a transaction handle returned bytxn_begin.dbi- a database handle returned bydbi_opencmp- anMDBCmpFuncfunction
-
mdb_set_relfunc
public static int mdb_set_relfunc(long txn, int dbi, MDBRelFuncI rel)Sets a relocation function for aFIXEDMAPdatabase.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
FIXEDMAPoption.Currently the relocation feature is unimplemented and setting this function has no effect.
- Parameters:
txn- a transaction handle returned bytxn_begin.dbi- a database handle returned bydbi_openrel- anMDBRelFuncfunction
-
mdb_set_relctx
public static int mdb_set_relctx(long txn, int dbi, long ctx)Sets a context pointer for aFIXEDMAPdatabase's relocation function.See
set_relfuncandMDBRelFuncfor more details.- Parameters:
txn- a transaction handle returned bytxn_begin.dbi- a database handle returned bydbi_openctx- an arbitrary pointer for whatever the application needs. It will be passed to the callback function set byMDBRelFuncas itsrelctxparameter whenever the callback is invoked.
-
mdb_get
public static int mdb_get(long txn, int dbi, MDBVal key, MDBVal data)Gets items from a database.This function retrieves key/data pairs from the database. The address and length of the data associated with the specified
keyare returned in the structure to whichdatarefers.If the database supports duplicate keys (
DUPSORT) then the first data item for the key will be returned. Retrieval of other items requires the use ofcursor_get.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.
-
mdb_put
public static int mdb_put(long txn, int dbi, MDBVal key, MDBVal data, int flags)Stores 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 (
DUPSORT).- Parameters:
txn- a transaction handle returned bytxn_begin.dbi- a database handle returned bydbi_openkey- the key to store in the databasedata- the data to storeflags- 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.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 withDUPSORT. The function will returnKEYEXISTif the key/data pair already appears in the database.NOOVERWRITE- enter the new key/data pair only if the key does not already appear in the database. The function will returnKEYEXISTif the key already appears in the database, even if the database supports duplicates (DUPSORT). Thedataparameter will be set to point to the existing item.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
DUPSORT.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 aKEYEXISTerror.APPENDDUP- as above, but for sorted dup data.
-
mdb_del
public static int mdb_del(long txn, int dbi, MDBVal key, MDBVal data)Deletes items from a database.This function removes key/data pairs from the database. If the database does not support sorted duplicate data items (
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-NULLonly the matching data item will be deleted.This function will return
NOTFOUNDif the specified key/data pair is not in the database.
-
mdb_cursor_open
public static int mdb_cursor_open(long txn, int dbi, org.lwjgl.PointerBuffer cursor)Creates 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
cursor_renew.It can be discarded with
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
cursor_renewbefore finally closing it.Earlier documentation said that cursors in every transaction were closed when the transaction committed or aborted.
-
mdb_cursor_close
public static void mdb_cursor_close(long cursor)
Closes a cursor handle.The cursor handle will be freed and must not be used again after this call. Its transaction must still be live if it is a write-transaction.
- Parameters:
cursor- a cursor handle returned bycursor_open
-
mdb_cursor_renew
public static int mdb_cursor_renew(long txn, long cursor)Renews a cursor handle.A cursor is associated with a specific transaction and database. Cursors that are only used in read-only transactions may be re-used, to avoid unnecessary malloc/free overhead. The cursor may be associated with a new read-only transaction, and referencing the same database handle as it was created with. This may be done whether the previous transaction is live or dead.
- Parameters:
txn- a transaction handle returned bytxn_begin.cursor- a cursor handle returned bycursor_open
-
mdb_cursor_txn
public static long mdb_cursor_txn(long cursor)
Returns the cursor's transaction handle.- Parameters:
cursor- a cursor handle returned bycursor_open
-
mdb_cursor_dbi
public static int mdb_cursor_dbi(long cursor)
Return the cursor's database handle.- Parameters:
cursor- a cursor handle returned bycursor_open
-
mdb_cursor_get
public static int mdb_cursor_get(long cursor, MDBVal key, MDBVal data, int op)Retrieves 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
keyrefers (except for the case of theSEToption, in which thekeyobject is unchanged), and the address and length of the data are returned in the object to whichdatarefers.See
getfor restrictions on using the output values.- Parameters:
cursor- a cursor handle returned bycursor_openkey- the key for a retrieved itemdata- the data of a retrieved itemop- a cursor operationMDB_cursor_op
-
mdb_cursor_put
public static int mdb_cursor_put(long cursor, MDBVal key, MDBVal data, int flags)Stores 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.
Earlier documentation incorrectly said errors would leave the state of the cursor unchanged.
- Parameters:
cursor- a cursor handle returned bycursor_openkey- the key operated ondata- the data operated onflags- options for this operation. This parameter must be set to 0 or one of the values described here.CURRENT- replace the item at the current cursor position. Thekeyparameter must still be provided, and must match it. If using sorted duplicates (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.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 withDUPSORT. The function will returnKEYEXISTif the key/data pair already appears in the database.NOOVERWRITE- enter the new key/data pair only if the key does not already appear in the database. The function will returnKEYEXISTif the key already appears in the database, even if the database supports duplicates (DUPSORT).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 withDUPSORT.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 aKEYEXISTerror.APPENDDUP- as above, but for sorted dup data.MULTIPLE- store multiple contiguous data elements in a single request. This flag may only be specified if the database was opened withDUPFIXED. Thedataargument must be an array of twoMDBVal. Themv_sizeof the firstMDBValmust be the size of a single data element. Themv_dataof the firstMDBValmust point to the beginning of the array of contiguous data elements. Themv_sizeof the secondMDBValmust 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. Themv_dataof the secondMDBValis unused.
-
mdb_cursor_del
public static int mdb_cursor_del(long cursor, int flags)Deletes current key/data pair.This function deletes the key/data pair to which the cursor refers.
- Parameters:
cursor- a cursor handle returned bycursor_openflags- options for this operation. This parameter must be set to 0 or one of the values described here.
-
mdb_cursor_count
public static int mdb_cursor_count(long cursor, org.lwjgl.PointerBuffer countp)Returns count of duplicates for current key.This call is only valid on databases that support sorted duplicate data items
DUPSORT.- Parameters:
cursor- a cursor handle returned bycursor_opencountp- address where the count will be stored
-
mdb_cmp
public static int mdb_cmp(long txn, int dbi, MDBVal a, MDBVal b)Compares two data items according to a particular database.This returns a comparison as if the two data items were keys in the specified database.
-
mdb_dcmp
public static int mdb_dcmp(long txn, int dbi, MDBVal a, MDBVal b)Compares 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
DUPSORTflag.
-
mdb_reader_list
public static int mdb_reader_list(long env, MDBMsgFuncI func, long ctx)Dumps the entries in the reader lock table.- Parameters:
env- an environment handle returned byenv_createfunc- anMDBMsgFuncfunctionctx- anything the message function needs
-
mdb_reader_check
public static int mdb_reader_check(long env, java.nio.IntBuffer dead)Checks for stale entries in the reader lock table.- Parameters:
env- an environment handle returned byenv_createdead- number of stale slots that were cleared
-
mdb_version
public static java.lang.String mdb_version(int[] major, int[] minor, int[] patch)Array version of:version
-
mdb_env_get_flags
public static int mdb_env_get_flags(long env, int[] flags)Array version of:env_get_flags
-
mdb_env_get_maxreaders
public static int mdb_env_get_maxreaders(long env, int[] readers)Array version of:env_get_maxreaders
-
mdb_dbi_open
public static int mdb_dbi_open(long txn, java.nio.ByteBuffer name, int flags, int[] dbi) public static int mdb_dbi_open(long txn, java.lang.CharSequence name, int flags, int[] dbi)Array version of:dbi_open
-
mdb_dbi_flags
public static int mdb_dbi_flags(long txn, int dbi, int[] flags)Array version of:dbi_flags
-
mdb_reader_check
public static int mdb_reader_check(long env, int[] dead)Array version of:reader_check
-
-