mdb_copy(3)
๐ mdb_copy(3) โ Copy Flags ๐
okay bestie, this is the Library Functions Manual page for mdb_copy(3), and the vibe is Copy Flags. We're doing part one of eight, so hydrate and let's get into it. โจ
โจ NAME โจ
mdb_copy - Copy Flags
๐ธ SYNOPSIS ๐ธ
๐ Topics ๐
- Return Codes โ yep, there's a whole topic list and it points at Return Codes. We'll get there, bestie. ๐
๐๏ธ Data Structures ๐๏ธ
struct MDB_statโ Statistics for a database in the environment. ๐struct MDB_envinfoโ Information about the environment. ๐
๐ช Macros ๐ช
#define MDB_CP_COMPACT 0x01โ Compacting copy: Omit free space from copy, and renumber all pages sequentially. โจ#define mdb_open(txn, name, flags, dbi)โ Value:
mdb_dbi_open(txn,name,flags,dbi)
Compat with version <= 0.9.4, avoid clash with libmdb from MDB Tools project. ๐ ๏ธ
#define mdb_close(env, dbi)โ Value:
mdb_dbi_close(env,dbi)
Compat with version <= 0.9.4, avoid clash with libmdb from MDB Tools project. ๐ ๏ธ
๐งฌ Typedefs ๐งฌ
typedef void MDB_assert_func(MDB_env *env, const char *msg)โ A callback function for most LMDBassert()failures, called before printing the message and aborting. ๐ญ- Parameters:
envโ An environment handle returned bymdb_env_create().msgโ The assertion message, not including newline.
- Parameters:
typedef int MDB_msg_func(const char *msg, void *ctx)โ A callback function used to print a message from the library. ๐จ- Parameters:
msgโ The string to be printed.ctxโ An arbitrary context pointer for the callback.
- Returns:
< 0on failure,>= 0on success. โ
- Parameters:
๐ฎ Enumerations ๐ฎ
enum MDB_cursor_op { 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 }โ Cursor Get operations. This is the set of all operations for retrieving data using a cursor. ๐ฏ
๐ ๏ธ Functions ๐ ๏ธ
char * mdb_version (int *major, int *minor, int *patch)โ Returns the LMDB library version information. ๐ท๏ธchar * mdb_strerror (int err)โ Returns a string describing a given error code. ๐จint mdb_env_create (MDB_env **env)โ Creates an LMDB environment handle. ๐ฑint mdb_env_open (MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode)โ Opens an environment handle. ๐ชint mdb_env_copy (MDB_env *env, const char *path)โ Copies an LMDB environment to the specified path. ๐int mdb_env_copyfd (MDB_env *env, mdb_filehandle_t fd)โ Copies an LMDB environment to the specified file descriptor. ๐int mdb_env_copy2 (MDB_env *env, const char *path, unsigned int flags)โ Copies an LMDB environment to the specified path, with options. ๐โจint mdb_env_copyfd2 (MDB_env *env, mdb_filehandle_t fd, unsigned int flags)โ Copies an LMDB environment to the specified file descriptor, with options. ๐โจint mdb_env_stat (MDB_env *env, MDB_stat *stat)โ Returns statistics about the LMDB environment. ๐int mdb_env_info (MDB_env *env, MDB_envinfo *stat)โ Returns information about the LMDB environment. โน๏ธint mdb_env_sync (MDB_env *env, int force)โ Flushes the data buffers to disk. ๐พvoid mdb_env_close (MDB_env *env)โ Closes the environment and releases the memory map. ๐int mdb_env_set_flags (MDB_env *env, unsigned int flags, int onoff)โ Sets environment flags. ๐ฉint mdb_env_get_flags (MDB_env *env, unsigned int *flags)โ Gets environment flags. ๐int mdb_env_get_path (MDB_env *env, const char **path)โ Returns the path that was used inmdb_env_open(). ๐ค๏ธint mdb_env_get_fd (MDB_env *env, mdb_filehandle_t *fd)โ Returns the filedescriptor for the given environment. ๐๏ธint mdb_env_set_mapsize (MDB_env *env, size_t size)โ Sets the size of the memory map to use for this environment. ๐บ๏ธint mdb_env_set_maxreaders (MDB_env *env, unsigned int readers)โ Sets the maximum number of threads/reader slots for the environment. ๐ฅint mdb_env_get_maxreaders (MDB_env *env, unsigned int *readers)โ Gets the maximum number of threads/reader slots for the environment. ๐int mdb_env_set_maxdbs (MDB_env *env, MDB_dbi dbs)โ Sets the maximum number of named databases for the environment. ๐๏ธint mdb_env_get_maxkeysize (MDB_env *env)โ Gets the maximum size of keys andMDB_DUPSORTdata we can write. ๐int mdb_env_set_userctx (MDB_env *env, void *ctx)โ Sets application information associated with theMDB_env. ๐void * mdb_env_get_userctx (MDB_env *env)โ Gets the application information associated with theMDB_env. ๐int mdb_env_set_assert (MDB_env *env, MDB_assert_func *func)โ no one-liner in the original, just the signature, bestie. ๐int mdb_txn_begin (MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **txn)โ Creates a transaction for use with the environment. ๐MDB_env * mdb_txn_env (MDB_txn *txn)โ Returns the transaction'sMDB_env. ๐size_t mdb_txn_id (MDB_txn *txn)โ Returns the transaction's ID. ๐int mdb_txn_commit (MDB_txn *txn)โ Commits all the operations of a transaction into the database. โvoid mdb_txn_abort (MDB_txn *txn)โ Abandons all the operations of the transaction instead of saving them. โvoid mdb_txn_reset (MDB_txn *txn)โ Resets a read-only transaction. ๐int mdb_txn_renew (MDB_txn *txn)โ Renews a read-only transaction. ๐int mdb_dbi_open (MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi)โ Opens a database in the environment. ๐int mdb_stat (MDB_txn *txn, MDB_dbi dbi, MDB_stat *stat)โ Retrieves statistics for a database. ๐int mdb_dbi_flags (MDB_txn *txn, MDB_dbi dbi, unsigned int *flags)โ Retrieves the DB flags for a database handle. ๐ฉvoid mdb_dbi_close (MDB_env *env, MDB_dbi dbi)โ Closes a database handle. Normally unnecessary. Use with care: โ ๏ธint mdb_drop (MDB_txn *txn, MDB_dbi dbi, int del)โ Empties or delete+close a database. ๐๏ธint mdb_set_compare (MDB_txn *txn, MDB_dbi dbi, MDB_cmp_func *cmp)โ Sets a custom key comparison function for a database. ๐งฎint mdb_set_dupsort (MDB_txn *txn, MDB_dbi dbi, MDB_cmp_func *cmp)โ Sets a custom data comparison function for aMDB_DUPSORTdatabase. ๐int mdb_set_relfunc (MDB_txn *txn, MDB_dbi dbi, MDB_rel_func *rel)โ Sets a relocation function for aMDB_FIXEDMAPdatabase. ๐int mdb_set_relctx (MDB_txn *txn, MDB_dbi dbi, void *ctx)โ Sets a context pointer for aMDB_FIXEDMAPdatabase's relocation function. ๐งทint mdb_get (MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data)โ Gets items from a database. ๐ฅint mdb_put (MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data, unsigned int flags)โ Stores items into a database. ๐คint mdb_del (MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data)โ Deletes items from a database. ๐๏ธint mdb_cursor_open (MDB_txn *txn, MDB_dbi dbi, MDB_cursor **cursor)โ Creates a cursor handle. ๐ฑ๏ธvoid mdb_cursor_close (MDB_cursor *cursor)โ Closes a cursor handle. ๐ฑ๏ธ๐int mdb_cursor_renew (MDB_txn *txn, MDB_cursor *cursor)โ Renews a cursor handle. โป๏ธMDB_txn * mdb_cursor_txn (MDB_cursor *cursor)โ Returns the cursor's transaction handle. ๐MDB_dbi mdb_cursor_dbi (MDB_cursor *cursor)โ Returns the cursor's database handle. ๐๏ธint mdb_cursor_get (MDB_cursor *cursor, MDB_val *key, MDB_val *data, MDB_cursor_op op)โ Retrieves by cursor. ๐ฏint mdb_cursor_put (MDB_cursor *cursor, MDB_val *key, MDB_val *data, unsigned int flags)โ Stores by cursor. โ๏ธint mdb_cursor_del (MDB_cursor *cursor, unsigned int flags)โ Deletes current key/data pair. โ๏ธint mdb_cursor_count (MDB_cursor *cursor, size_t *countp)โ Returns count of duplicates for current key. ๐ขint mdb_cmp (MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b)โ Compares 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)โ Compares two data items according to a particular database. โ๏ธint mdb_reader_list (MDB_env *env, MDB_msg_func *func, void *ctx)โ Dumps the entries in the reader lock table. ๐int mdb_reader_check (MDB_env *env, int *dead)โ Checks for stale entries in the reader lock table. ๐ต๏ธ
๐ง Detailed Description ๐ง
๐๏ธ Data Structure Documentation ๐๏ธ
๐ struct MDB_stat ๐
Statistics for a database in the environment.
Data Fields
unsigned int ms_psizeunsigned int ms_depthsize_t ms_branch_pagessize_t ms_leaf_pagessize_t ms_overflow_pagessize_t ms_entries
๐ struct MDB_envinfo ๐
Information about the environment.
Data Fields
void * me_mapaddrsize_t me_mapsizesize_t me_last_pgnosize_t me_last_txnidunsigned int me_maxreadersunsigned int me_numreaders
๐ช Macro Definition Documentation ๐ช
#define MDB_CP_COMPACT 0x01
Compacting copy: Omit free space from copy, and renumber all pages sequentially.
#define mdb_open( txn, name, flags, dbi)
Value:
mdb_dbi_open(txn,name,flags,dbi)
Compat with version <= 0.9.4, avoid clash with libmdb from MDB Tools project
#define mdb_close( env, dbi)
Value:
mdb_dbi_close(env,dbi)
Compat with version <= 0.9.4, avoid clash with libmdb from MDB Tools project
๐งฌ Typedef Documentation ๐งฌ
typedef void MDB_assert_func(MDB_env *env, const char *msg)
A callback function for most LMDB assert() failures, called before printing the message and aborting.
Parameters
envโ An environment handle returned bymdb_env_create().msgโ The assertion message, not including newline.
typedef int MDB_msg_func(const char *msg, void *ctx)
A callback function used to print a message from the library.
Parameters
msgโ The string to be printed.ctxโ An arbitrary context pointer for the callback.
Returns
< 0 on failure, >= 0 on success.
๐ฎ Enumeration Type Documentation ๐ฎ
enum MDB_cursor_op
Cursor Get operations. This is the set of all operations for retrieving data using a cursor.
Enumerator
MDB_FIRSTโ Position at first key/data itemMDB_FIRST_DUPโ Position at first data item of current key. Only forMDB_DUPSORTMDB_GET_BOTHโ Position at key/data pair. Only forMDB_DUPSORTMDB_GET_BOTH_RANGEโ position at key, nearest data. Only forMDB_DUPSORTMDB_GET_CURRENTโ Return key/data at current cursor positionMDB_GET_MULTIPLEโ Return up to a page of duplicate data items from current cursor position. Move cursor to prepare forMDB_NEXT_MULTIPLE. Only forMDB_DUPFIXEDMDB_LASTโ Position at last key/data itemMDB_LAST_DUPโ Position at last data item of current key. Only forMDB_DUPSORTMDB_NEXTโ Position at next data itemMDB_NEXT_DUPโ Position at next data item of current key. Only forMDB_DUPSORTMDB_NEXT_MULTIPLEโ Return up to a page of duplicate data items from next cursor position. Move cursor to prepare forMDB_NEXT_MULTIPLE. Only forMDB_DUPFIXEDMDB_NEXT_NODUPโ Position at first data item of next keyMDB_PREVโ Position at previous data itemMDB_PREV_DUPโ Position at previous data item of current key. Only forMDB_DUPSORTMDB_PREV_NODUPโ Position at last data item of previous keyMDB_SETโ Position at specified keyMDB_SET_KEYโ Position at specified key, return key + dataMDB_SET_RANGEโ Position at first key greater than or equal to specified key.MDB_PREV_MULTIPLEโ Position at previous page and return up to a page of duplicate data items. Only forMDB_DUPFIXED
๐ Function Documentation ๐
char * mdb_version (int * major, int * minor, int * patch)
Return the LMDB library version information.
So for mdb_version the params/returns situation is:
Parameters
majorโ if it's notNULL, the library major version number gets copied in here ๐minorโ if it's notNULL, the library minor version number gets copied in here ๐patchโ if it's notNULL, the library patch version number gets copied in here ๐
Return values
version stringโ the library version, as a string, bestie โจ
And that's the whole vibe: it returns the library version info. Slay.
char * mdb_strerror (int err)
Okay so this one hands you back a string describing whatever error code you throw at it. And the way it's lowkey built different from your average error function is that it's a superset of the ANSI C X3.159-1989 (ANSI C) strerror(3) function. So:
- If the error code is greater than or equal to 0, you just get back the plain old string from the system's
strerror(3). No notes, that's the classic. - If the error code is less than 0, you get an error string that matches the LMDB library error instead. So negative = LMDB-specific stuff. And if you wanna see the full lineup of those LMDB-specific error codes, go peek at Return Codes. ๐
Parameters
errโ the error code, obviously ๐
Return values
error messageโ the description of said error. Iconic, informative, everything.
int mdb_env_create (MDB_env ** env)
Not me introducing you to the literal main character: this one creates an LMDB environment handle ๐ It allocates memory for an MDB_env structure. That's the handle, that's the baddie, that's the whole foundation.
Now the important part, no cap: when you're done with it and you want that allocated memory back, you call mdb_env_close(). Free it, discard the handle, move on with your life. โจ
And before the handle can even be used? It has to be opened first using mdb_env_open(). Yes bestie, creation and opening are two separate steps, we love a process.
There's also a whole lil' squad of other options you might need to set before opening the handle, depending on what you're doing, like:
mdb_env_set_mapsize()mdb_env_set_maxreaders()mdb_env_set_maxdbs()
โฆand whichever ones your specific usage requirements demand. Pick your fighters. ๐ฆ
Parameters
envโ the address where the brand new handle is gonna be stored ๐
Returns
- A non-zero error value if it fails, and 0 on success. Zero means we ate. ๐
int mdb_env_open (MDB_env * env, const char * path, unsigned int flags, mdb_mode_t mode)
Okay so this is the one that opens an environment handle. Like, actually opens it. The glow-up from "exists" to "usable." ๐ธ
Big heads up though: if this function fails, you have to callmdb_env_close()to discard theMDB_envhandle. Failing to clean up is giving chaos, and not the cute kind. ๐ญ
(and yes, the rest of this one's story is still loadingโฆ ๐ง)
Parameters
envโ an environment handle thatmdb_env_create()gave you ๐ซถpathโ the directory where the database files live. Heads up: this directory has to already exist and be writable. No auto-mkdir, no coddling, it just has to be there ๐flagsโ special options for this environment. Set it to0, or bitwise-OR together one or more of the values we're about to list. Whatever you set withmdb_env_set_flags()counts too โจMDB_FIXEDMAPโ use a fixed address for the mmap region. You have to pass this one when you create the environment, and it gets stored persistently in the environment. If it works, the memory map always lands at the same virtual address, so the pointers you use to reference data items in the db stay constant across multiple invocations. That said, it may not always work โ it depends on how the OS has handed out memory to shared libraries and other stuff. This feature is highly experimental ๐MDB_NOSUBDIRโ by default LMDB creates its environment in a directory whose pathname you gave inpath, and puts its data and lock files under that directory. With this flag,pathis used as-is for the database main data file, and the lock file is the path with"-lock"appended ๐MDB_RDONLYโ opens the environment read-only, so no write operations are allowed. Lowkey important: LMDB will still modify the lock file โ except on read-only filesystems, where LMDB doesn't use locks at all ๐ฆMDB_WRITEMAPโ use a writeable memory map, unlessMDB_RDONLYis set. This uses fewermallocs but loses the protection from application bugs like wild pointer writes and other bad updates going straight into the database. It may be slightly faster for DBs that fit entirely in RAM, but it's slower for DBs larger than RAM. Incompatible with nested transactions. Do not mix processes with and withoutMDB_WRITEMAPon the same environment โ this can defeat durability (mdb_env_syncetc.) ๐ญMDB_NOMETASYNCโ flush system buffers to disk only once per transaction, i.e. omit the metadata flush. Defer that until the system flushes files to disk, or until the next non-MDB_RDONLYcommit ormdb_env_sync(). This optimization keeps database integrity, but a system crash may undo the last committed transaction. Translation: it preserves the ACI (atomicity, consistency, isolation) but not D (durability) database property. This flag may be changed at any time usingmdb_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 the buffers aren't flushed to disk yet ๐ฌ The risk is governed by how often the system flushes dirty buffers to disk and how oftenmdb_env_sync()gets called. However, if the filesystem preserves write order and theMDB_WRITEMAPflag isn't 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, unlessmdb_env_sync()is called. (MDB_MAPASYNC|MDB_WRITEMAP) may be preferable. This flag may be changed at any time usingmdb_env_set_flags()MDB_MAPASYNCโ when usingMDB_WRITEMAP, use asynchronous flushes to disk. As withMDB_NOSYNC, a system crash can then corrupt the database or lose the last transactions ๐ Callingmdb_env_sync()ensures on-disk database integrity until next commit. This flag may be changed at any time usingmdb_env_set_flags()MDB_NOTLSโ don't use Thread-Local Storage. Tie reader locktable slots toMDB_txnobjects instead of to threads. I.e.mdb_txn_reset()keeps the slot reserved 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 threadsMDB_NOLOCKโ don't do any locking. If you anticipate concurrent access, the caller has to manage all concurrency itself. For proper operation, the caller must enforce single-writer semantics, and must ensure no readers are using old transactions while a writer is active. The simplest approach is 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. Not implemented on Windows ๐MDB_NOMEMINITโ don't initializemalloc'd memory before writing to unused spaces in the data file. By default, memory for pages written to the data file is obtained usingmalloc. While these pages may be reused in subsequent transactions, freshlymalloc'd pages get 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.,stdiomay 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 also be a problem for applications which handle sensitive data like passwords, and it makes memory checkers like Valgrind noisy. This flag is not needed withMDB_WRITEMAP, which writes directly to the mmap instead of usingmallocfor pages. The initialization is also skipped ifMDB_RESERVEis 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 usingmdb_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 environmentMDB_INVALIDโ the environment file headers are corrupted ๐ENOENTโ the directory specified by thepathparameter doesn't existEACCESโ the user didn't have permission to access the environment filesEAGAINโ the environment was locked by another process ๐
int mdb_env_copy (MDB_env * env, const char * path)
Copy an LMDB environment to the specified path ๐ This is the function you call to make a backup of an existing environment. No lockfile gets created, since it gets recreated at need โ iconic behavior honestly.
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.
Parameters
envโ an environment handle returned bymdb_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 โจ
int mdb_env_copyfd (MDB_env * env, mdb_filehandle_t fd)
Copy an LMDB environment to the specified file descriptor ๐ธ Same energy as above, this one's for making a backup of an existing environment. And again: 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.
Parameters
envโ an environment handle returned bymdb_env_create(). It must have already been opened successfully.fdโ the filedescriptor to write the copy to. It must have already been opened for Write access.
Returns
A non-zero error value on failure and 0 on success โจ
int mdb_env_copy2 (MDB_env * env, const char * path, unsigned int flags)
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.
Parameters
envโ an environment handle returned bymdb_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 to0, 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 โจ
int mdb_env_copyfd2 (MDB_env * env, mdb_filehandle_t fd, unsigned int flags)
Ok so picture this: you wanna back up a whole LMDB environment and just yeet it into a file descriptor. Say less ๐
Copy an LMDB environment to the specified file descriptor, with options. This is literally your backup button โ use it to make a copy of an environment you already have. No lockfile gets made btw, because it just gets recreated whenever it's needed. Wanna know more? Peek at mdb_env_copy2() for further details. ๐ซถ
Note, bestie, read this one ๐ข โ this call can trigger significant file size growth if you run it in parallel with write transactions, because it employs a read-only transaction. Go look up long-lived transactions under Caveats. Not me warning you twice ๐ญ
Parameters
envโ an environment handle that came out ofmdb_env_create(). It's gotta have been opened successfully already, no shortcuts โจfdโ the filedescriptor you're writing the copy to. It must already be opened for Write access, mkay?flagsโ special options for this operation. Go seemdb_env_copy2()for the options themselves.
Returns
A non-zero error value on failure and 0 on success. Simple as that. ๐ธ
int mdb_env_stat (MDB_env * env, MDB_stat * stat) ๐
Spill the tea on your LMDB environment โ this one returns statistics about it.
Parameters
envโ an environment handle returned bymdb_env_create()statโ the address of anMDB_statstructure where the statistics will be copied. She's the destination, not the source ๐
int mdb_env_info (MDB_env * env, MDB_envinfo * stat) โน๏ธ
Return information about the LMDB environment. Like, the vibes but make it structured data.
Parameters
envโ an environment handle returned bymdb_env_create()statโ the address of anMDB_envinfostructure where the information will be copied
int mdb_env_sync (MDB_env * env, int force) ๐
Flush the data buffers to disk. Ok so important thing bestie: data is always written to disk when mdb_txn_commit() is called, but your operating system may be a little gremlin and keep it buffered. LMDB always flushes the OS buffers upon commit too, 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. Read-only means read-only, periodt.
Parameters
envโ an environment handle returned bymdb_env_create()forceโ if non-zero, force a synchronous flush. Otherwise, if the environment has theMDB_NOSYNCflag set, the flushes will be omitted, and withMDB_MAPASYNCthey'll 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. ๐ญ
void mdb_env_close (MDB_env * env) ๐ช
Close the environment and release the memory map. Big moment, iconic, but there are rules:
- Only a single thread may call this function. One. Uno. โ๏ธ
- All transactions, databases, and cursors must already be closed before you call this.
- Attempts to use any such handles after calling this function will cause a
SIGSEGV. ๐ Not a vibe. - The environment handle will be freed and must not be used again after this call. She's gone, fr fr.
Parameters
envโ an environment handle returned bymdb_env_create()
int mdb_env_set_flags (MDB_env * env, unsigned int flags, int onoff) ๐ฉ
Set environment flags. You can use this to set some flags in addition to those from mdb_env_open(), or to unset these flags. But heads up: if several threads change the flags at the same time, the result is undefined. Chaos energy, we don't do that. ๐
โโ๏ธ
Parameters
envโ an environment handle returned bymdb_env_create()flagsโ 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.
int mdb_env_get_flags (MDB_env * env, unsigned int * flags) ๐
Get environment flags. Hand them over, we just wanna look ๐
Parameters
envโ an environment handle returned bymdb_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.
int mdb_env_get_path (MDB_env * env, const char ** path) ๐ฃ๏ธ
Return the path that was used in mdb_env_open().
Parameters
envโ an environment handle returned bymdb_env_create()pathโ address of a string pointer to contain the path. Girl, this is the actual string in the environment, not a copy. So do not alter it in any way. Hands off ๐
Returns
A non-zero error value on failure and 0 on success. Some possible errors are:
EINVALโ an invalid parameter was specified.
int mdb_env_get_fd (MDB_env * env, mdb_filehandle_t * fd) ๐
Return the filedescriptor for the given environment. The way that this one is special: it 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.) โญ
Parameters
envโ an environment handle returned bymdb_env_create()fdโ Address of amdb_filehandle_tto 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.
int mdb_env_set_mapsize (MDB_env * env, size_t size) ๐
Set the size of the memory map to use for this environment. Let's break it down boo:
- The size should be a multiple of the OS page size.
- The default is
10485760bytes. (Yes, exactly that number, keep it.) - The size of the memory map is also the maximum size of the database. So pick it as large as possible to accommodate future growth of the database. Future-you says thank you. ๐ซถ
- Call this after
mdb_env_create()and beforemdb_env_open(). It may also be called at later times if no transactions are active in this process. But ngl, the library does not check for this condition โ the caller must ensure it explicitly. That's on you, bestie. ๐ญ
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. Sneaky but true.
Parameters
envโ an environment handle returned bymdb_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.
int mdb_env_set_maxreaders (MDB_env * env, unsigned int readers) ๐ฅ
Set the maximum number of threads/reader slots for the environment. This defines the number of slots in the lock table used to track readers in the the environment. (Yes, the original really does say "in the the" โ we keep it, no cap ๐)
- 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_NOTLSis in use,mdb_txn_begin()instead ties the slot to theMDB_txnobject until it or theMDB_envobject is destroyed. - This function may only be called after
mdb_env_create()and beforemdb_env_open().
Parameters
envโ an environment handle returned bymdb_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.
int mdb_env_get_maxreaders (MDB_env * env, unsigned int * readers) ๐
Get the maximum number of threads/reader slots for the environment.
Parameters
envโ an environment handle returned bymdb_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.
int mdb_env_set_maxdbs (MDB_env * env, MDB_dbi dbs) ๐๏ธ
Set the maximum number of named databases for the environment. Only needed if multiple databases will be used in the environment โ simpler apps that use the environment as a single unnamed database can just ignore this option entirely. Live your life. โจ This function may only be called after mdb_env_create() and before mdb_env_open().
Currently a moderate number of slots is 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. So like... don't be greedy, ok? ๐
Parameters
envโ an environment handle returned bymdb_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.
int mdb_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. ๐
Parameters
envโ an environment handle returned bymdb_env_create()
Returns
The maximum size of a key we can write.
int mdb_env_set_userctx (MDB_env * env, void * ctx) ๐
Set application information associated with the MDB_env. Your little secret pocket for whatever you need, bestie.
Parameters
envโ an environment handle returned bymdb_env_create()ctxโ an arbitrary pointer for whatever the application needs.
Returns
A non-zero error value on failure and 0 on success.
void * mdb_env_get_userctx (MDB_env * env) ๐ซถ
Get the application information associated with the MDB_env. Time to retrieve what you stashed.
Parameters
envโ an environment handle returned bymdb_env_create()
Returns
The pointer set by mdb_env_set_userctx().
int mdb_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. (Compile-time decisions, we love to see it.)
Note โ this hack should become obsolete as lmdb's error handling matures. The source said it, not me ๐
Parameters
envโ an environment handle returned bymdb_env_create().funcโ AnMDB_assert_funcfunction, or0.
Returns
A non-zero error value on failure and 0 on success.
int mdb_txn_begin (MDB_env * env, MDB_txn * parent, unsigned int flags, 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(). Your main character moment starts here, bestie. ๐
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.
Parameters
envโ An environment handle returned bymdb_env_create()๐parentโ 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 thanmdb_txn_commitandmdb_txn_abortwhile it has active child transactions. ๐flagsโ Special options for this transaction. This parameter must be set to0or 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 newMDB_txnhandle 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 thisMDB_env's mapsize and this environment's map must be resized as well. Seemdb_env_set_mapsize(). ๐ฆMDB_READERS_FULLโ a read-only transaction was requested and the reader lock table is full. Seemdb_env_set_maxreaders(). ๐ENOMEMโ out of memory. ๐ธ
MDB_env * mdb_txn_env (MDB_txn * txn)
Returns the transaction's MDB_env. ๐
Parameters
txnโ A transaction handle returned bymdb_txn_begin()โจ
size_t mdb_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. ๐ฅ
Parameters
txnโ A transaction handle returned bymdb_txn_begin()๐
Returns
A transaction ID, valid if input is an active transaction. ๐
int mdb_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. ๐
Parameters
txnโ A transaction handle returned bymdb_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. ๐ธ
void mdb_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. ๐
Parameters
txnโ A transaction handle returned bymdb_txn_begin()โจ
void mdb_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. ๐ญ
Parameters
txnโ A transaction handle returned bymdb_txn_begin()๐
int mdb_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. ๐ฅ
Parameters
txnโ A transaction handle returned bymdb_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. ๐ญ
int mdb_dbi_open (MDB_txn * txn, const char * name, unsigned int flags, 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. ๐ธ
Parameters
txnโ A transaction handle returned bymdb_txn_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 to0or 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, eitherunsigned intorsize_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 withMDB_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, theMDB_GET_MULTIPLE,MDB_NEXT_MULTIPLEandMDB_PREV_MULTIPLEcursor operations may be used to retrieve multiple items at once. ๐ฆMDB_INTEGERDUPโ This option specifies that duplicate data items are binary integers, similar toMDB_INTEGERKEYkeys. ๐ธ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 newMDB_dbihandle 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 andMDB_CREATEwas not specified. ๐ญMDB_DBS_FULLโ too many databases have been opened. Seemdb_env_set_maxdbs(). ๐
int mdb_stat (MDB_txn * txn, MDB_dbi dbi, MDB_stat * stat)
Retrieve statistics for a database. ๐ฅ
Parameters
txnโ A transaction handle returned bymdb_txn_begin()โจdbiโ A database handle returned bymdb_dbi_open()๐statโ The address of anMDB_statstructure 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. ๐ธ
int mdb_dbi_flags (MDB_txn * txn, MDB_dbi dbi, unsigned int * flags)
Retrieve the DB flags for a database handle. ๐
Parameters
txnโ A transaction handle returned bymdb_txn_begin()๐dbiโ A database handle returned bymdb_dbi_open()๐flagsโ Address where the flags will be returned. โจ
Returns
A non-zero error value on failure and 0 on success. ๐
void mdb_dbi_close (MDB_env * env, MDB_dbi dbi)
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. ๐
Parameters
envโ an environment handle, the kind that comes back frommdb_env_create()๐ซถdbiโ a database handle, courtesy ofmdb_dbi_open()โจ
int mdb_drop (MDB_txn * txn, MDB_dbi dbi, int del)
Okay so this one empties a database or deletes it and closes it, depending on the vibes you're giving it. Heads up tho โ if you're going the closing route, go read mdb_dbi_close() first, because there are restrictions about closing DB handles and you do NOT want to find out the hard way ๐
Parameters
txnโ a transaction handle returned bymdb_txn_begin()๐ธdbiโ a database handle returned bymdb_dbi_open()๐ฆdelโ0to empty the DB,1to delete it from the environment and close the DB handle. That's it, that's the whole switch, choose your fighter ๐
Returns
A non-zero error value if it flops, and 0 on success. slay.
int mdb_set_compare (MDB_txn * txn, MDB_dbi dbi, MDB_cmp_func * cmp)
Set a custom key comparison function for a database ๐ This function gets called whenever something needs to compare a key that the application handed over with a key that's currently sitting in the database. And if you don't specify a comparison function, and you didn't pass any special key flags to mdb_dbi_open(), then everything is compared lexically โ shorter keys collate before longer keys. simple as that, lowkey elegant.
Warning โ ๏ธ This function has to be called before any data access functions get used, otherwise data corruption may occur. And the same comparison function must be used by every program accessing the database, every single time the database is used. no exceptions bestie, fr fr.
Parameters
txnโ a transaction handle returned bymdb_txn_begin()๐dbiโ a database handle returned bymdb_dbi_open()๐cmpโ aMDB_cmp_funcfunction ๐ง
Returns
A non-zero error value on failure and 0 on success. Some possible errors are:
EINVALโ an invalid parameter was specified. ๐
int mdb_set_dupsort (MDB_txn * txn, MDB_dbi dbi, MDB_cmp_func * cmp)
The data-item twin of the last one ๐
This sets a custom data comparison function for a MDB_DUPSORT database. It gets called whenever something needs to compare a data item the application specified with a data item currently hanging out in the database. Important: this only actually takes effect if the database was opened with the MDB_DUPSORT flag. And if no comparison function is specified, and no special key flags were handed to mdb_dbi_open(), then the data items get compared lexically, with shorter items collating before longer items. โจ
Warning โ ๏ธ Same deal as before โ call this before any data access functions are used, otherwise data corruption may occur. Every program touching the database, every time, must use the same comparison function. periodt.
Parameters
txnโ a transaction handle returned bymdb_txn_begin()๐ธdbiโ a database handle returned bymdb_dbi_open()๐ฆcmpโ aMDB_cmp_funcfunction ๐
Returns
A non-zero error value on failure and 0 on success. Some possible errors are:
EINVALโ an invalid parameter was specified. ๐
int mdb_set_relfunc (MDB_txn * txn, MDB_dbi dbi, MDB_rel_func * rel)
Sets a relocation function for a MDB_FIXEDMAP database ๐
Todo ๐ The relocation function is called whenever it's necessary to move the data of an item to a different position in the database (like through tree balancing operations, shifts as a result of adds or deletes, etc.). It's intended to let address- or position-dependent data items be stored in a database inside an environment opened with the MDB_FIXEDMAP option. Currently the relocation feature is unimplemented and setting this function has no effect. literally nothing happens, it's giving placeholder energy ๐ญ
Parameters
txnโ a transaction handle returned bymdb_txn_begin()๐dbiโ a database handle returned bymdb_dbi_open()๐relโ aMDB_rel_funcfunction ๐ง
Returns
A non-zero error value on failure and 0 on success. Some possible errors are:
EINVALโ an invalid parameter was specified. ๐
int mdb_set_relctx (MDB_txn * txn, MDB_dbi dbi, void * ctx)
Sets a context pointer for a MDB_FIXEDMAP database's relocation function ๐ซถ For the full lore, go look at mdb_set_relfunc and MDB_rel_func.
Parameters
txnโ a transaction handle returned bymdb_txn_begin()๐ธdbiโ a database handle returned bymdb_dbi_open()๐ฆctxโ an arbitrary pointer for whatever the application needs. It gets passed to the callback function set bymdb_set_relfuncas itsrelctxparameter whenever that callback is invoked. very "your data, your rules" ๐
Returns
A non-zero error value on failure and 0 on success. Some possible errors are:
EINVALโ an invalid parameter was specified. ๐
int mdb_get (MDB_txn * txn, MDB_dbi dbi, MDB_val * key, MDB_val * data)
Get items out of a database ๐ This one retrieves key/data pairs. The address and length of the data associated with the key you specified get returned in the structure that data refers to. And if the database supports duplicate keys (MDB_DUPSORT), then the first data item for the key is what you get back. Want the other items? Then you gotta go use mdb_cursor_get(), no shortcuts bestie ๐ฆ
Note ๐ The memory pointed to by the returned values is owned by the database. The caller doesn't need to dispose of that memory โ and may not modify it in any way. For values returned in a read-only transaction, any modification attempts will cause a SIGSEGV. that's not a vibe, that's a crash ๐ don't do it.
The values that come back out of the database? valid only until a subsequent update operation, or the end of the transaction. That's it. That's the whole window ๐ so if you need them longer than that, copy them out now, bestie, don't come crying to me later.
Parameters
txnโ A transaction handle returned bymdb_txn_begin()dbiโ A database handle returned bymdb_dbi_open()keyโ The key to search for in the databasedataโ The data corresponding to the key
Returns ๐
A non-zero error value on failure, and 0 on success. Some possible errors:
MDB_NOTFOUNDโ the key was not in the database. ๐ญ it's just not there.EINVALโ an invalid parameter was specified.
int mdb_put (MDB_txn * txn, MDB_dbi dbi, MDB_val * key, MDB_val * data, unsigned int flags)
int mdb_put (MDB_txn * txn, MDB_dbi dbi, MDB_val * key, MDB_val * data,
unsigned int flags)
Store items into a database. She's the one who actually writes things down โจ This function stores key/data pairs in the database. Default behavior? 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). Options, options, options, we love a flexible queen ๐
Parameters
txnโ A transaction handle returned bymdb_txn_begin()dbiโ A database handle returned bymdb_dbi_open()keyโ The key to store in the databasedataโ The data to storeflagsโ Special options for this operation. This parameter must be set to0or 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 withMDB_DUPSORT. The function will returnMDB_KEYEXISTif 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 returnMDB_KEYEXISTif the key already appears in the database, even if the database supports duplicates (MDB_DUPSORT). Thedataparameter 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 extramemcpyif 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 withMDB_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 aMDB_KEYEXISTerror. ๐จMDB_APPENDDUPโ as above, but for sorted dup data.
Returns ๐ธ
A non-zero error value on failure, and 0 on success. Some possible errors:
MDB_MAP_FULLโ the database is full, seemdb_env_set_mapsize(). ๐ she's stuffed.MDB_TXN_FULLโ the transaction has too many dirty pages.EACCESโ an attempt was made to write in a read-only transaction. not you trying to write in a read-only txn ๐EINVALโ an invalid parameter was specified.
int mdb_del (MDB_txn * txn, MDB_dbi dbi, MDB_val * key, MDB_val * data)
int mdb_del (MDB_txn * txn, MDB_dbi dbi, MDB_val * key, MDB_val * data)
Delete items from a database. Bye bestie ๐ This function removes key/data pairs from the database. Here's the vibe check on how much it nukes:
- If the database does not support sorted duplicate data items (
MDB_DUPSORT), thedataparameter is ignored. - If the database does support sorted duplicates and the
dataparameter isNULL, all of the duplicate data items for the key will be deleted. ๐ฅ - Otherwise, if the
dataparameter is non-NULL, only the matching data item will be deleted.
This function will return MDB_NOTFOUND if the specified key/data pair is not in the database.
Parameters
txnโ A transaction handle returned bymdb_txn_begin()dbiโ A database handle returned bymdb_dbi_open()keyโ The key to delete from the databasedataโ The data to delete
Returns ๐
A non-zero error value on failure, and 0 on success. Some possible errors:
EACCESโ an attempt was made to write in a read-only transaction.EINVALโ an invalid parameter was specified.
int mdb_cursor_open (MDB_txn * txn, MDB_dbi dbi, MDB_cursor ** cursor)
int mdb_cursor_open (MDB_txn * txn, MDB_dbi dbi, MDB_cursor ** cursor)
Create a cursor handle. Cursor rights ๐ฑ๏ธโจ A cursor is associated with a specific transaction and database. And the rules, because there are rules:
- 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. That was... not it, bestie. The note is the canon.
Parameters
txnโ A transaction handle returned bymdb_txn_begin()dbiโ A database handle returned bymdb_dbi_open()cursorโ Address where the newMDB_cursorhandle will be stored
Returns ๐
A non-zero error value on failure, and 0 on success. Some possible errors:
EINVALโ an invalid parameter was specified.
void mdb_cursor_close (MDB_cursor * cursor)
void mdb_cursor_close (MDB_cursor * cursor)
Close a cursor handle. The cursor handle will be freed and must not be used again after this call โ like, it's gone, don't text it back ๐ซ Its transaction must still be live if it is a write-transaction.
Parameters
cursorโ A cursor handle returned bymdb_cursor_open()
int mdb_cursor_renew (MDB_txn * txn, MDB_cursor * cursor)
int mdb_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 โ recycling is the moment ๐ง 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 bymdb_txn_begin()cursorโ A cursor handle returned bymdb_cursor_open()
Returns ๐
A non-zero error value on failure, and 0 on success. Some possible errors:
EINVALโ an invalid parameter was specified.
MDB_txn * mdb_cursor_txn (MDB_cursor * cursor)
MDB_txn * mdb_cursor_txn (MDB_cursor * cursor)
Return the cursor's transaction handle. Who's your txn? ๐ซถ
Parameters
cursorโ A cursor handle returned bymdb_cursor_open()
MDB_dbi mdb_cursor_dbi (MDB_cursor * cursor)
MDB_dbi mdb_cursor_dbi (MDB_cursor * cursor)
Return the cursor's database handle. Who's your dbi? ๐
Parameters
cursorโ A cursor handle returned bymdb_cursor_open()
int mdb_cursor_get (MDB_cursor * cursor, MDB_val * key, MDB_val * data, MDB_cursor_op op)
int mdb_cursor_get (MDB_cursor * cursor, MDB_val * key, MDB_val * data,
MDB_cursor_op op)
Retrieve by cursor. The main character energy of reading data โจ 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 ๐ (yes, that "valid only until a subsequent update operation or end of transaction" thing, it still applies).
Parameters
cursorโ A cursor handle returned bymdb_cursor_open()keyโ The key for a retrieved itemdataโ The data of a retrieved itemopโ A cursor operationMDB_cursor_op
Returns ๐
A non-zero error value on failure, and 0 on success. Some possible errors:
MDB_NOTFOUNDโ no matching key found. ๐ญEINVALโ an invalid parameter was specified.
int mdb_cursor_put (MDB_cursor * cursor, MDB_val * key, MDB_val * data, unsigned int flags)
int mdb_cursor_put (MDB_cursor * cursor, MDB_val * key, MDB_val * data,
unsigned int flags)
Store by cursor. Writing, but make it cursor-coded ๐ This function stores key/data pairs into the database. The cursor is positioned at the new item, or on failure usually near it. (Near. NEAR. We said what we said.)
Note ๐ Earlier documentation incorrectly said errors would leave the state of the cursor unchanged. Not true, bestie. Do not build your life around that.
Parameters
cursorโ A cursor handle returned bymdb_cursor_open()keyโ The key operated on.dataโ The data operated on.flagsโ Options for this operation. This parameter must be set to0or one of the values described here ๐MDB_CURRENTโ replace the item at the current cursor position. Thekeyparameter 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 withMDB_DUPSORT. The function will returnMDB_KEYEXISTif 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 returnMDB_KEYEXISTif 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 extramemcpyif the data is being generated later. This flag must not be specified if the database was opened withMDB_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 aMDB_KEYEXISTerror. ๐จ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 withMDB_DUPFIXED. Thedataargument must be an array of twoMDB_vals. Themv_sizeof the firstMDB_valmust be the size of a single data element. Themv_dataof the firstMDB_valmust point to the beginning of the array of contiguous data elements. Themv_sizeof the secondMDB_valmust 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 secondMDB_valis unused. ๐
Returns โญ
A non-zero error value on failure, and 0 on success. Some possible errors:
MDB_MAP_FULLโ the database is full, seemdb_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โ bestie, an invalid parameter was specified. that's it, that's the whole thing ๐
Function Documentation ๐ธ
int mdb_cursor_del (MDB_cursor * cursor, unsigned int flags) ๐
okay so this one deletes the current key/data pair โ the exact pair your cursor is pointing at rn. and here's the slay part: it does not invalidate the cursor, so you can keep vibing with it, MDB_NEXT and everything. โจ both MDB_NEXT and MDB_GET_CURRENT will return the same record after this operation, no cap.
Parameters
cursorโ a cursor handle returned bymdb_cursor_open()flagsโ options for this operation. this parameter must be set to0or 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 withMDB_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. nope, can't do that babe ๐EINVALโ an invalid parameter was specified.
int mdb_cursor_count (MDB_cursor * cursor, size_t * countp) ๐งฎ
returns the count of duplicates for the current key. this call is only valid on databases that support sorted duplicate data items โ aka MDB_DUPSORT ๐ฆ.
Parameters
cursorโ a cursor handle returned bymdb_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. ๐
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. it returns a comparison as if the two data items were keys in the specified database. literally just "which one comes first" energy โจ
Parameters
txnโ a transaction handle returned bymdb_txn_begin()dbiโ a database handle returned bymdb_dbi_open()aโ the first item to comparebโ the second item to compare
Returns
< 0 if a < b, 0 if a == b, > 0 if a > b ๐
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 โ but this time it returns a comparison as if the two items were data items of the specified database. the database must have the MDB_DUPSORT flag, periodt.
Parameters
txnโ a transaction handle returned bymdb_txn_begin()dbiโ a database handle returned bymdb_dbi_open()aโ the first item to comparebโ the second item to compare
Returns
< 0 if a < b, 0 if a == b, > 0 if a > b ๐
int mdb_reader_list (MDB_env * env, MDB_msg_func * func, void * ctx) ๐
dump the entries in the reader lock table. like a lil receipt of everyone currently holding a read slot ๐งพโจ
Parameters
envโ an environment handle returned bymdb_env_create()funcโ aMDB_msg_funcfunctionctxโ anything the message function needs
Returns
< 0 on failure, >= 0 on success ๐ซถ
int mdb_reader_check (MDB_env * env, int * dead) ๐งน
check for stale entries in the reader lock table โ the ghosts of readers past ๐ป
Parameters
envโ an environment handle returned bymdb_env_create()deadโ number of stale slots that were cleared ๐ชฆ
Returns
0 on success, non-zero on failure.
Author ๐
generated automatically by Doxygen for LMDB from the source code. not a human, not a bestie, just a machine that really knows its stuff fr fr ๐ค๐
and that's a wrap on mdb_copy(3), bestie!! ๐ the whole thing was generated by Doxygen for LMDB, and it's filed under the classic footer name โ LMDB, page mdb_copy(3) โ so if you ever forget where you read all this, that's your 411. go forth and copy your databases with confidence, you're doing amazing sweetie ๐
โจ๐ฆ
๐ฆ where this page comes from
- ubuntu resolute: lmdb-doc 0.9.31-1build2 ยท OpenLDAP-2.8
- ubuntu stonking: lmdb-doc 0.9.35-1 ยท OpenLDAP-2.8
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms