Back to home page

Enduro/X

 
 

    


0001 /** @file exdb.h
0002  *  @brief Lightning memory-mapped database library
0003  *
0004  *  @mainpage   Lightning Memory-Mapped Database Manager (EXDB)
0005  *
0006  *  @section intro_sec Introduction
0007  *  EXDB is a Btree-based database management library modeled loosely on the
0008  *  BerkeleyDB API, but much simplified. The entire database is exposed
0009  *  in a memory map, and all data fetches return data directly
0010  *  from the mapped memory, so no malloc's or memcpy's occur during
0011  *  data fetches. As such, the library is extremely simple because it
0012  *  requires no page caching layer of its own, and it is extremely high
0013  *  performance and memory-efficient. It is also fully transactional with
0014  *  full ACID semantics, and when the memory map is read-only, the
0015  *  database integrity cannot be corrupted by stray pointer writes from
0016  *  application code.
0017  *
0018  *  The library is fully thread-aware and supports concurrent read/write
0019  *  access from multiple processes and threads. Data pages use a copy-on-
0020  *  write strategy so no active data pages are ever overwritten, which
0021  *  also provides resistance to corruption and eliminates the need of any
0022  *  special recovery procedures after a system crash. Writes are fully
0023  *  serialized; only one write transaction may be active at a time, which
0024  *  guarantees that writers can never deadlock. The database structure is
0025  *  multi-versioned so readers run with no locks; writers cannot block
0026  *  readers, and readers don't block writers.
0027  *
0028  *  Unlike other well-known database mechanisms which use either write-ahead
0029  *  transaction logs or append-only data writes, EXDB requires no maintenance
0030  *  during operation. Both write-ahead loggers and append-only databases
0031  *  require periodic checkpointing and/or compaction of their log or database
0032  *  files otherwise they grow without bound. EXDB tracks free pages within
0033  *  the database and re-uses them for new write operations, so the database
0034  *  size does not grow without bound in normal use.
0035  *
0036  *  The memory map can be used as a read-only or read-write map. It is
0037  *  read-only by default as this provides total immunity to corruption.
0038  *  Using read-write mode offers much higher write performance, but adds
0039  *  the possibility for stray application writes thru pointers to silently
0040  *  corrupt the database. Of course if your application code is known to
0041  *  be bug-free (...) then this is not an issue.
0042  *
0043  *  If this is your first time using a transactional embedded key/value
0044  *  store, you may find the \ref starting page to be helpful.
0045  *
0046  *  @section caveats_sec Caveats
0047  *  Troubleshooting the lock file, plus semaphores on BSD systems:
0048  *
0049  *  - A broken lockfile can cause sync issues.
0050  *    Stale reader transactions left behind by an aborted program
0051  *    cause further writes to grow the database quickly, and
0052  *    stale locks can block further operation.
0053  *
0054  *    Fix: Check for stale readers periodically, using the
0055  *    #edb_reader_check function or the \ref edb_stat_1 "edb_stat" tool.
0056  *    Stale writers will be cleared automatically on most systems:
0057  *    - Windows - automatic
0058  *    - BSD, systems using SysV semaphores - automatic
0059  *    - Linux, systems using POSIX mutexes with Robust option - automatic
0060  *    Otherwise just make all programs using the database close it;
0061  *    the lockfile is always reset on first open of the environment.
0062  *
0063  *  - On BSD systems or others configured with EDB_USE_SYSV_SEM or
0064  *    EDB_USE_POSIX_SEM,
0065  *    startup can fail due to semaphores owned by another userid.
0066  *
0067  *    Fix: Open and close the database as the user which owns the
0068  *    semaphores (likely last user) or as root, while no other
0069  *    process is using the database.
0070  *
0071  *  Restrictions/caveats (in addition to those listed for some functions):
0072  *
0073  *  - Only the database owner should normally use the database on
0074  *    BSD systems or when otherwise configured with EDB_USE_POSIX_SEM.
0075  *    Multiple users can cause startup to fail later, as noted above.
0076  *
0077  *  - There is normally no pure read-only mode, since readers need write
0078  *    access to locks and lock file. Exceptions: On read-only filesystems
0079  *    or with the #EDB_NOLOCK flag described under #edb_env_open().
0080  *
0081  *  - An EXDB configuration will often reserve considerable \b unused
0082  *    memory address space and maybe file size for future growth.
0083  *    This does not use actual memory or disk space, but users may need
0084  *    to understand the difference so they won't be scared off.
0085  *
0086  *  - By default, in versions before 0.9.10, unused portions of the data
0087  *    file might receive garbage data from memory freed by other code.
0088  *    (This does not happen when using the #EDB_WRITEMAP flag.) As of
0089  *    0.9.10 the default behavior is to initialize such memory before
0090  *    writing to the data file. Since there may be a slight performance
0091  *    cost due to this initialization, applications may disable it using
0092  *    the #EDB_NOMEMINIT flag. Applications handling sensitive data
0093  *    which must not be written should not use this flag. This flag is
0094  *    irrelevant when using #EDB_WRITEMAP.
0095  *
0096  *  - A thread can only use one transaction at a time, plus any child
0097  *    transactions.  Each transaction belongs to one thread.  See below.
0098  *    The #EDB_NOTLS flag changes this for read-only transactions.
0099  *
0100  *  - Use an EDB_env* in the process which opened it, not after fork().
0101  *
0102  *  - Do not have open an EXDB database twice in the same process at
0103  *    the same time.  Not even from a plain open() call - close()ing it
0104  *    breaks fcntl() advisory locking.  (It is OK to reopen it after
0105  *    fork() - exec*(), since the lockfile has FD_CLOEXEC set.)
0106  *
0107  *  - Avoid long-lived transactions.  Read transactions prevent
0108  *    reuse of pages freed by newer write transactions, thus the
0109  *    database can grow quickly.  Write transactions prevent
0110  *    other write transactions, since writes are serialized.
0111  *
0112  *  - Avoid suspending a process with active transactions.  These
0113  *    would then be "long-lived" as above.  Also read transactions
0114  *    suspended when writers commit could sometimes see wrong data.
0115  *
0116  *  ...when several processes can use a database concurrently:
0117  *
0118  *  - Avoid aborting a process with an active transaction.
0119  *    The transaction becomes "long-lived" as above until a check
0120  *    for stale readers is performed or the lockfile is reset,
0121  *    since the process may not remove it from the lockfile.
0122  *
0123  *    This does not apply to write transactions if the system clears
0124  *    stale writers, see above.
0125  *
0126  *  - If you do that anyway, do a periodic check for stale readers. Or
0127  *    close the environment once in a while, so the lockfile can get reset.
0128  *
0129  *  - Do not use EXDB databases on remote filesystems, even between
0130  *    processes on the same host.  This breaks flock() on some OSes,
0131  *    possibly memory map sync, and certainly sync between programs
0132  *    on different hosts.
0133  *
0134  *  - Opening a database can fail if another process is opening or
0135  *    closing it at exactly the same time.
0136  *
0137  *  @author Howard Chu, Symas Corporation.
0138  *
0139  *  @copyright Copyright 2011-2020 Howard Chu, Symas Corp. All rights reserved.
0140  *
0141  * Redistribution and use in source and binary forms, with or without
0142  * modification, are permitted only as authorized by the OpenLDAP
0143  * Public License.
0144  *
0145  * A copy of this license is available in the file LICENSE in the
0146  * top-level directory of the distribution or, alternatively, at
0147  * <http://www.OpenLDAP.org/license.html>.
0148  *
0149  *  @par Derived From:
0150  * This code is derived from btree.c written by Martin Hedenfalk.
0151  *
0152  * Copyright (c) 2009, 2010 Martin Hedenfalk <martin@bzero.se>
0153  *
0154  * Permission to use, copy, modify, and distribute this software for any
0155  * purpose with or without fee is hereby granted, provided that the above
0156  * copyright notice and this permission notice appear in all copies.
0157  *
0158  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
0159  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
0160  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
0161  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
0162  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
0163  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
0164  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
0165  */
0166 #ifndef _EXDB_H_
0167 #define _EXDB_H_
0168 
0169 #include <sys/types.h>
0170 #include <inttypes.h>
0171 #include <limits.h>
0172 
0173 #ifdef __cplusplus
0174 extern "C" {
0175 #endif
0176 
0177 /** Unix permissions for creating files, or dummy definition for Windows */
0178 #ifdef _MSC_VER
0179 typedef int edb_mode_t;
0180 #else
0181 typedef mode_t  edb_mode_t;
0182 #endif
0183 
0184 #ifdef _WIN32
0185 # define EDB_FMT_Z  "I"
0186 #else
0187 # define EDB_FMT_Z  "z"         /**< printf/scanf format modifier for size_t */
0188 #endif
0189 
0190 #ifndef EDB_VL32
0191 /** Unsigned type used for mapsize, entry counts and page/transaction IDs.
0192  *
0193  *  It is normally size_t, hence the name. Defining EDB_VL32 makes it
0194  *  uint64_t, but do not try this unless you know what you are doing.
0195  */
0196 typedef size_t  edb_size_t;
0197 # define EDB_SIZE_MAX   SIZE_MAX    /**< max #edb_size_t */
0198 /** #edb_size_t printf formats, \b t = one of [diouxX] without quotes */
0199 # define EDB_PRIy(t)    EDB_FMT_Z #t
0200 /** #edb_size_t scanf formats, \b t = one of [dioux] without quotes */
0201 # define EDB_SCNy(t)    EDB_FMT_Z #t
0202 #else
0203 typedef uint64_t    edb_size_t;
0204 # define EDB_SIZE_MAX   UINT64_MAX
0205 # define EDB_PRIy(t)    PRI##t##64
0206 # define EDB_SCNy(t)    SCN##t##64
0207 # define edb_env_create edb_env_create_vl32 /**< Prevent mixing with non-VL32 builds */
0208 #endif
0209 
0210 /** An abstraction for a file handle.
0211  *  On POSIX systems file handles are small integers. On Windows
0212  *  they're opaque pointers.
0213  */
0214 #ifdef _WIN32
0215 typedef void *edb_filehandle_t;
0216 #else
0217 typedef int edb_filehandle_t;
0218 #endif
0219 
0220 /** @defgroup edb EXDB API
0221  *  @{
0222  *  @brief OpenLDAP Lightning Memory-Mapped Database Manager
0223  */
0224 /** @defgroup Version Version Macros
0225  *  @{
0226  */
0227 /** Library major version */
0228 #define EDB_VERSION_MAJOR   0
0229 /** Library minor version */
0230 #define EDB_VERSION_MINOR   9
0231 /** Library patch version */
0232 #define EDB_VERSION_PATCH   70
0233 
0234 /** Combine args a,b,c into a single integer for easy version comparisons */
0235 #define EDB_VERINT(a,b,c)   (((a) << 24) | ((b) << 16) | (c))
0236 
0237 /** The full library version as a single integer */
0238 #define EDB_VERSION_FULL    \
0239     EDB_VERINT(EDB_VERSION_MAJOR,EDB_VERSION_MINOR,EDB_VERSION_PATCH)
0240 
0241 /** The release date of this library version */
0242 #define EDB_VERSION_DATE    "December 19, 2015"
0243 
0244 /** A stringifier for the version info */
0245 #define EDB_VERSTR(a,b,c,d) "EXDB " #a "." #b "." #c ": (" d ")"
0246 
0247 /** A helper for the stringifier macro */
0248 #define EDB_VERFOO(a,b,c,d) EDB_VERSTR(a,b,c,d)
0249 
0250 /** The full library version as a C string */
0251 #define EDB_VERSION_STRING  \
0252     EDB_VERFOO(EDB_VERSION_MAJOR,EDB_VERSION_MINOR,EDB_VERSION_PATCH,EDB_VERSION_DATE)
0253 /** @} */
0254 
0255 /** @brief Opaque structure for a database environment.
0256  *
0257  * A DB environment supports multiple databases, all residing in the same
0258  * shared-memory map.
0259  */
0260 typedef struct EDB_env EDB_env;
0261 
0262 /** @brief Opaque structure for a transaction handle.
0263  *
0264  * All database operations require a transaction handle. Transactions may be
0265  * read-only or read-write.
0266  */
0267 typedef struct EDB_txn EDB_txn;
0268 
0269 /** @brief A handle for an individual database in the DB environment. */
0270 typedef unsigned int    EDB_dbi;
0271 
0272 /** @brief Opaque structure for navigating through a database */
0273 typedef struct EDB_cursor EDB_cursor;
0274 
0275 /** @brief Generic structure used for passing keys and data in and out
0276  * of the database.
0277  *
0278  * Values returned from the database are valid only until a subsequent
0279  * update operation, or the end of the transaction. Do not modify or
0280  * free them, they commonly point into the database itself.
0281  *
0282  * Key sizes must be between 1 and #edb_env_get_maxkeysize() inclusive.
0283  * The same applies to data sizes in databases with the #EDB_DUPSORT flag.
0284  * Other data items can in theory be from 0 to 0xffffffff bytes long.
0285  */
0286 typedef struct EDB_val {
0287     size_t       mv_size;   /**< size of the data item */
0288     void        *mv_data;   /**< address of the data item */
0289 } EDB_val;
0290 
0291 /** @brief A callback function used to compare two keys in a database */
0292 typedef int  (EDB_cmp_func)(const EDB_val *a, const EDB_val *b);
0293 
0294 /** @brief A callback function used to relocate a position-dependent data item
0295  * in a fixed-address database.
0296  *
0297  * The \b newptr gives the item's desired address in
0298  * the memory map, and \b oldptr gives its previous address. The item's actual
0299  * data resides at the address in \b item.  This callback is expected to walk
0300  * through the fields of the record in \b item and modify any
0301  * values based at the \b oldptr address to be relative to the \b newptr address.
0302  * @param[in,out] item The item that is to be relocated.
0303  * @param[in] oldptr The previous address.
0304  * @param[in] newptr The new address to relocate to.
0305  * @param[in] relctx An application-provided context, set by #edb_set_relctx().
0306  * @todo This feature is currently unimplemented.
0307  */
0308 typedef void (EDB_rel_func)(EDB_val *item, void *oldptr, void *newptr, void *relctx);
0309 
0310 /** @defgroup   edb_env Environment Flags
0311  *  @{
0312  */
0313     /** mmap at a fixed address (experimental) */
0314 #define EDB_FIXEDMAP    0x01
0315     /** no environment directory */
0316 #define EDB_NOSUBDIR    0x4000
0317     /** don't fsync after commit */
0318 #define EDB_NOSYNC      0x10000
0319     /** read only */
0320 #define EDB_RDONLY      0x20000
0321     /** don't fsync metapage after commit */
0322 #define EDB_NOMETASYNC      0x40000
0323     /** use writable mmap */
0324 #define EDB_WRITEMAP        0x80000
0325     /** use asynchronous msync when #EDB_WRITEMAP is used */
0326 #define EDB_MAPASYNC        0x100000
0327     /** tie reader locktable slots to #EDB_txn objects instead of to threads */
0328 #define EDB_NOTLS       0x200000
0329     /** don't do any locking, caller must manage their own locks */
0330 #define EDB_NOLOCK      0x400000
0331     /** don't do readahead (no effect on Windows) */
0332 #define EDB_NORDAHEAD   0x800000
0333     /** don't initialize malloc'd memory before writing to datafile */
0334 #define EDB_NOMEMINIT   0x1000000
0335     /** use the previous snapshot rather than the latest one */
0336 #define EDB_PREVSNAPSHOT    0x2000000
0337 /** @} */
0338 
0339 /** @defgroup   edb_dbi_open    Database Flags
0340  *  @{
0341  */
0342     /** use reverse string keys */
0343 #define EDB_REVERSEKEY  0x02
0344     /** use sorted duplicates */
0345 #define EDB_DUPSORT     0x04
0346     /** numeric keys in native byte order, either unsigned int or #edb_size_t.
0347      *  (exdb expects 32-bit int <= size_t <= 32/64-bit edb_size_t.)
0348      *  The keys must all be of the same size. */
0349 #define EDB_INTEGERKEY  0x08
0350     /** with #EDB_DUPSORT, sorted dup items have fixed size */
0351 #define EDB_DUPFIXED    0x10
0352     /** with #EDB_DUPSORT, dups are #EDB_INTEGERKEY-style integers */
0353 #define EDB_INTEGERDUP  0x20
0354     /** with #EDB_DUPSORT, use reverse string dups */
0355 #define EDB_REVERSEDUP  0x40
0356     /** create DB if not already existing */
0357 #define EDB_CREATE      0x40000
0358 /** @} */
0359 
0360 /** @defgroup edb_put   Write Flags
0361  *  @{
0362  */
0363 /** For put: Don't write if the key already exists. */
0364 #define EDB_NOOVERWRITE 0x10
0365 /** Only for #EDB_DUPSORT<br>
0366  * For put: don't write if the key and data pair already exist.<br>
0367  * For edb_cursor_del: remove all duplicate data items.
0368  */
0369 #define EDB_NODUPDATA   0x20
0370 /** For edb_cursor_put: overwrite the current key/data pair */
0371 #define EDB_CURRENT 0x40
0372 /** For put: Just reserve space for data, don't copy it. Return a
0373  * pointer to the reserved space.
0374  */
0375 #define EDB_RESERVE 0x10000
0376 /** Data is being appended, don't split full pages. */
0377 #define EDB_APPEND  0x20000
0378 /** Duplicate data is being appended, don't split full pages. */
0379 #define EDB_APPENDDUP   0x40000
0380 /** Store multiple data items in one call. Only for #EDB_DUPFIXED. */
0381 #define EDB_MULTIPLE    0x80000
0382 /*  @} */
0383 
0384 /** @defgroup edb_copy  Copy Flags
0385  *  @{
0386  */
0387 /** Compacting copy: Omit free space from copy, and renumber all
0388  * pages sequentially.
0389  */
0390 #define EDB_CP_COMPACT  0x01
0391 /*  @} */
0392 
0393 /** @brief Cursor Get operations.
0394  *
0395  *  This is the set of all operations for retrieving data
0396  *  using a cursor.
0397  */
0398 typedef enum EDB_cursor_op {
0399     EDB_FIRST,              /**< Position at first key/data item */
0400     EDB_FIRST_DUP,          /**< Position at first data item of current key.
0401                                 Only for #EDB_DUPSORT */
0402     EDB_GET_BOTH,           /**< Position at key/data pair. Only for #EDB_DUPSORT */
0403     EDB_GET_BOTH_RANGE,     /**< position at key, nearest data. Only for #EDB_DUPSORT */
0404     EDB_GET_CURRENT,        /**< Return key/data at current cursor position */
0405     EDB_GET_MULTIPLE,       /**< Return up to a page of duplicate data items
0406                                 from current cursor position. Move cursor to prepare
0407                                 for #EDB_NEXT_MULTIPLE. Only for #EDB_DUPFIXED */
0408     EDB_LAST,               /**< Position at last key/data item */
0409     EDB_LAST_DUP,           /**< Position at last data item of current key.
0410                                 Only for #EDB_DUPSORT */
0411     EDB_NEXT,               /**< Position at next data item */
0412     EDB_NEXT_DUP,           /**< Position at next data item of current key.
0413                                 Only for #EDB_DUPSORT */
0414     EDB_NEXT_MULTIPLE,      /**< Return up to a page of duplicate data items
0415                                 from next cursor position. Move cursor to prepare
0416                                 for #EDB_NEXT_MULTIPLE. Only for #EDB_DUPFIXED */
0417     EDB_NEXT_NODUP,         /**< Position at first data item of next key */
0418     EDB_PREV,               /**< Position at previous data item */
0419     EDB_PREV_DUP,           /**< Position at previous data item of current key.
0420                                 Only for #EDB_DUPSORT */
0421     EDB_PREV_NODUP,         /**< Position at last data item of previous key */
0422     EDB_SET,                /**< Position at specified key */
0423     EDB_SET_KEY,            /**< Position at specified key, return key + data */
0424     EDB_SET_RANGE,          /**< Position at first key greater than or equal to specified key. */
0425     EDB_PREV_MULTIPLE       /**< Position at previous page and return up to
0426                                 a page of duplicate data items. Only for #EDB_DUPFIXED */
0427 } EDB_cursor_op;
0428 
0429 /** @defgroup  errors   Return Codes
0430  *
0431  *  BerkeleyDB uses -30800 to -30999, we'll go under them
0432  *  @{
0433  */
0434     /** Successful result */
0435 #define EDB_SUCCESS  0
0436     /** key/data pair already exists */
0437 #define EDB_KEYEXIST    (-30799)
0438     /** key/data pair not found (EOF) */
0439 #define EDB_NOTFOUND    (-30798)
0440     /** Requested page not found - this usually indicates corruption */
0441 #define EDB_PAGE_NOTFOUND   (-30797)
0442     /** Located page was wrong type */
0443 #define EDB_CORRUPTED   (-30796)
0444     /** Update of meta page failed or environment had fatal error */
0445 #define EDB_PANIC       (-30795)
0446     /** Environment version mismatch */
0447 #define EDB_VERSION_MISMATCH    (-30794)
0448     /** File is not a valid EXDB file */
0449 #define EDB_INVALID (-30793)
0450     /** Environment mapsize reached */
0451 #define EDB_MAP_FULL    (-30792)
0452     /** Environment maxdbs reached */
0453 #define EDB_DBS_FULL    (-30791)
0454     /** Environment maxreaders reached */
0455 #define EDB_READERS_FULL    (-30790)
0456     /** Too many TLS keys in use - Windows only */
0457 #define EDB_TLS_FULL    (-30789)
0458     /** Txn has too many dirty pages */
0459 #define EDB_TXN_FULL    (-30788)
0460     /** Cursor stack too deep - internal error */
0461 #define EDB_CURSOR_FULL (-30787)
0462     /** Page has not enough space - internal error */
0463 #define EDB_PAGE_FULL   (-30786)
0464     /** Database contents grew beyond environment mapsize */
0465 #define EDB_MAP_RESIZED (-30785)
0466     /** Operation and DB incompatible, or DB type changed. This can mean:
0467      *  <ul>
0468      *  <li>The operation expects an #EDB_DUPSORT / #EDB_DUPFIXED database.
0469      *  <li>Opening a named DB when the unnamed DB has #EDB_DUPSORT / #EDB_INTEGERKEY.
0470      *  <li>Accessing a data record as a database, or vice versa.
0471      *  <li>The database was dropped and recreated with different flags.
0472      *  </ul>
0473      */
0474 #define EDB_INCOMPATIBLE    (-30784)
0475     /** Invalid reuse of reader locktable slot */
0476 #define EDB_BAD_RSLOT       (-30783)
0477     /** Transaction must abort, has a child, or is invalid */
0478 #define EDB_BAD_TXN         (-30782)
0479     /** Unsupported size of key/DB name/data, or wrong DUPFIXED size */
0480 #define EDB_BAD_VALSIZE     (-30781)
0481     /** The specified DBI was changed unexpectedly */
0482 #define EDB_BAD_DBI     (-30780)
0483     /** Unexpected problem - txn should abort */
0484 #define EDB_PROBLEM     (-30779)
0485     /** The last defined error code */
0486 #define EDB_LAST_ERRCODE    EDB_PROBLEM
0487 /** @} */
0488 
0489 /** @brief Statistics for a database in the environment */
0490 typedef struct EDB_stat {
0491     unsigned int    ms_psize;           /**< Size of a database page.
0492                                             This is currently the same for all databases. */
0493     unsigned int    ms_depth;           /**< Depth (height) of the B-tree */
0494     edb_size_t      ms_branch_pages;    /**< Number of internal (non-leaf) pages */
0495     edb_size_t      ms_leaf_pages;      /**< Number of leaf pages */
0496     edb_size_t      ms_overflow_pages;  /**< Number of overflow pages */
0497     edb_size_t      ms_entries;         /**< Number of data items */
0498 } EDB_stat;
0499 
0500 /** @brief Information about the environment */
0501 typedef struct EDB_envinfo {
0502     void    *me_mapaddr;            /**< Address of map, if fixed */
0503     edb_size_t  me_mapsize;             /**< Size of the data memory map */
0504     edb_size_t  me_last_pgno;           /**< ID of the last used page */
0505     edb_size_t  me_last_txnid;          /**< ID of the last committed transaction */
0506     unsigned int me_maxreaders;     /**< max reader slots in the environment */
0507     unsigned int me_numreaders;     /**< max reader slots used in the environment */
0508 } EDB_envinfo;
0509 
0510     /** @brief Return the EXDB library version information.
0511      *
0512      * @param[out] major if non-NULL, the library major version number is copied here
0513      * @param[out] minor if non-NULL, the library minor version number is copied here
0514      * @param[out] patch if non-NULL, the library patch version number is copied here
0515      * @retval "version string" The library version as a string
0516      */
0517 char *edb_version(int *major, int *minor, int *patch);
0518 
0519     /** @brief Return a string describing a given error code.
0520      *
0521      * This function is a superset of the ANSI C X3.159-1989 (ANSI C) strerror(3)
0522      * function. If the error code is greater than or equal to 0, then the string
0523      * returned by the system function strerror(3) is returned. If the error code
0524      * is less than 0, an error string corresponding to the EXDB library error is
0525      * returned. See @ref errors for a list of EXDB-specific error codes.
0526      * @param[in] err The error code
0527      * @retval "error message" The description of the error
0528      */
0529 char *edb_strerror(int err);
0530 
0531     /** @brief Create an EXDB environment handle.
0532      *
0533      * This function allocates memory for a #EDB_env structure. To release
0534      * the allocated memory and discard the handle, call #edb_env_close().
0535      * Before the handle may be used, it must be opened using #edb_env_open().
0536      * Various other options may also need to be set before opening the handle,
0537      * e.g. #edb_env_set_mapsize(), #edb_env_set_maxreaders(), #edb_env_set_maxdbs(),
0538      * depending on usage requirements.
0539      * @param[out] env The address where the new handle will be stored
0540      * @return A non-zero error value on failure and 0 on success.
0541      */
0542 int  edb_env_create(EDB_env **env);
0543 
0544     /** @brief Open an environment handle.
0545      *
0546      * If this function fails, #edb_env_close() must be called to discard the #EDB_env handle.
0547      * @param[in] env An environment handle returned by #edb_env_create()
0548      * @param[in] path The directory in which the database files reside. This
0549      * directory must already exist and be writable.
0550      * @param[in] flags Special options for this environment. This parameter
0551      * must be set to 0 or by bitwise OR'ing together one or more of the
0552      * values described here.
0553      * Flags set by edb_env_set_flags() are also used.
0554      * <ul>
0555      *  <li>#EDB_FIXEDMAP
0556      *      use a fixed address for the mmap region. This flag must be specified
0557      *      when creating the environment, and is stored persistently in the environment.
0558      *      If successful, the memory map will always reside at the same virtual address
0559      *      and pointers used to reference data items in the database will be constant
0560      *      across multiple invocations. This option may not always work, depending on
0561      *      how the operating system has allocated memory to shared libraries and other uses.
0562      *      The feature is highly experimental.
0563      *  <li>#EDB_NOSUBDIR
0564      *      By default, EXDB creates its environment in a directory whose
0565      *      pathname is given in \b path, and creates its data and lock files
0566      *      under that directory. With this option, \b path is used as-is for
0567      *      the database main data file. The database lock file is the \b path
0568      *      with "-lock" appended.
0569      *  <li>#EDB_RDONLY
0570      *      Open the environment in read-only mode. No write operations will be
0571      *      allowed. EXDB will still modify the lock file - except on read-only
0572      *      filesystems, where EXDB does not use locks.
0573      *  <li>#EDB_WRITEMAP
0574      *      Use a writeable memory map unless EDB_RDONLY is set. This uses
0575      *      fewer mallocs but loses protection from application bugs
0576      *      like wild pointer writes and other bad updates into the database.
0577      *      This may be slightly faster for DBs that fit entirely in RAM, but
0578      *      is slower for DBs larger than RAM.
0579      *      Incompatible with nested transactions.
0580      *      Do not mix processes with and without EDB_WRITEMAP on the same
0581      *      environment.  This can defeat durability (#edb_env_sync etc).
0582      *  <li>#EDB_NOMETASYNC
0583      *      Flush system buffers to disk only once per transaction, omit the
0584      *      metadata flush. Defer that until the system flushes files to disk,
0585      *      or next non-EDB_RDONLY commit or #edb_env_sync(). This optimization
0586      *      maintains database integrity, but a system crash may undo the last
0587      *      committed transaction. I.e. it preserves the ACI (atomicity,
0588      *      consistency, isolation) but not D (durability) database property.
0589      *      This flag may be changed at any time using #edb_env_set_flags().
0590      *  <li>#EDB_NOSYNC
0591      *      Don't flush system buffers to disk when committing a transaction.
0592      *      This optimization means a system crash can corrupt the database or
0593      *      lose the last transactions if buffers are not yet flushed to disk.
0594      *      The risk is governed by how often the system flushes dirty buffers
0595      *      to disk and how often #edb_env_sync() is called.  However, if the
0596      *      filesystem preserves write order and the #EDB_WRITEMAP flag is not
0597      *      used, transactions exhibit ACI (atomicity, consistency, isolation)
0598      *      properties and only lose D (durability).  I.e. database integrity
0599      *      is maintained, but a system crash may undo the final transactions.
0600      *      Note that (#EDB_NOSYNC | #EDB_WRITEMAP) leaves the system with no
0601      *      hint for when to write transactions to disk, unless #edb_env_sync()
0602      *      is called. (#EDB_MAPASYNC | #EDB_WRITEMAP) may be preferable.
0603      *      This flag may be changed at any time using #edb_env_set_flags().
0604      *  <li>#EDB_MAPASYNC
0605      *      When using #EDB_WRITEMAP, use asynchronous flushes to disk.
0606      *      As with #EDB_NOSYNC, a system crash can then corrupt the
0607      *      database or lose the last transactions. Calling #edb_env_sync()
0608      *      ensures on-disk database integrity until next commit.
0609      *      This flag may be changed at any time using #edb_env_set_flags().
0610      *  <li>#EDB_NOTLS
0611      *      Don't use Thread-Local Storage. Tie reader locktable slots to
0612      *      #EDB_txn objects instead of to threads. I.e. #edb_txn_reset() keeps
0613      *      the slot reseved for the #EDB_txn object. A thread may use parallel
0614      *      read-only transactions. A read-only transaction may span threads if
0615      *      the user synchronizes its use. Applications that multiplex many
0616      *      user threads over individual OS threads need this option. Such an
0617      *      application must also serialize the write transactions in an OS
0618      *      thread, since EXDB's write locking is unaware of the user threads.
0619      *  <li>#EDB_NOLOCK
0620      *      Don't do any locking. If concurrent access is anticipated, the
0621      *      caller must manage all concurrency itself. For proper operation
0622      *      the caller must enforce single-writer semantics, and must ensure
0623      *      that no readers are using old transactions while a writer is
0624      *      active. The simplest approach is to use an exclusive lock so that
0625      *      no readers may be active at all when a writer begins.
0626      *  <li>#EDB_NORDAHEAD
0627      *      Turn off readahead. Most operating systems perform readahead on
0628      *      read requests by default. This option turns it off if the OS
0629      *      supports it. Turning it off may help random read performance
0630      *      when the DB is larger than RAM and system RAM is full.
0631      *      The option is not implemented on Windows.
0632      *  <li>#EDB_NOMEMINIT
0633      *      Don't initialize malloc'd memory before writing to unused spaces
0634      *      in the data file. By default, memory for pages written to the data
0635      *      file is obtained using malloc. While these pages may be reused in
0636      *      subsequent transactions, freshly malloc'd pages will be initialized
0637      *      to zeroes before use. This avoids persisting leftover data from other
0638      *      code (that used the heap and subsequently freed the memory) into the
0639      *      data file. Note that many other system libraries may allocate
0640      *      and free memory from the heap for arbitrary uses. E.g., stdio may
0641      *      use the heap for file I/O buffers. This initialization step has a
0642      *      modest performance cost so some applications may want to disable
0643      *      it using this flag. This option can be a problem for applications
0644      *      which handle sensitive data like passwords, and it makes memory
0645      *      checkers like Valgrind noisy. This flag is not needed with #EDB_WRITEMAP,
0646      *      which writes directly to the mmap instead of using malloc for pages. The
0647      *      initialization is also skipped if #EDB_RESERVE is used; the
0648      *      caller is expected to overwrite all of the memory that was
0649      *      reserved in that case.
0650      *      This flag may be changed at any time using #edb_env_set_flags().
0651      *  <li>#EDB_PREVSNAPSHOT
0652      *      Open the environment with the previous snapshot rather than the latest
0653      *      one. This loses the latest transaction, but may help work around some
0654      *      types of corruption. If opened with write access, this must be the
0655      *      only process using the environment. This flag is automatically reset
0656      *      after a write transaction is successfully committed.
0657      * </ul>
0658      * @param[in] mode The UNIX permissions to set on created files and semaphores.
0659      * This parameter is ignored on Windows.
0660      * @return A non-zero error value on failure and 0 on success. Some possible
0661      * errors are:
0662      * <ul>
0663      *  <li>#EDB_VERSION_MISMATCH - the version of the EXDB library doesn't match the
0664      *  version that created the database environment.
0665      *  <li>#EDB_INVALID - the environment file headers are corrupted.
0666      *  <li>ENOENT - the directory specified by the path parameter doesn't exist.
0667      *  <li>EACCES - the user didn't have permission to access the environment files.
0668      *  <li>EAGAIN - the environment was locked by another process.
0669      * </ul>
0670      */
0671 int  edb_env_open(EDB_env *env, const char *path, unsigned int flags, edb_mode_t mode);
0672 
0673     /** @brief Copy an EXDB environment to the specified path.
0674      *
0675      * This function may be used to make a backup of an existing environment.
0676      * No lockfile is created, since it gets recreated at need.
0677      * @note This call can trigger significant file size growth if run in
0678      * parallel with write transactions, because it employs a read-only
0679      * transaction. See long-lived transactions under @ref caveats_sec.
0680      * @param[in] env An environment handle returned by #edb_env_create(). It
0681      * must have already been opened successfully.
0682      * @param[in] path The directory in which the copy will reside. This
0683      * directory must already exist and be writable but must otherwise be
0684      * empty.
0685      * @return A non-zero error value on failure and 0 on success.
0686      */
0687 int  edb_env_copy(EDB_env *env, const char *path);
0688 
0689     /** @brief Copy an EXDB environment to the specified file descriptor.
0690      *
0691      * This function may be used to make a backup of an existing environment.
0692      * No lockfile is created, since it gets recreated at need.
0693      * @note This call can trigger significant file size growth if run in
0694      * parallel with write transactions, because it employs a read-only
0695      * transaction. See long-lived transactions under @ref caveats_sec.
0696      * @param[in] env An environment handle returned by #edb_env_create(). It
0697      * must have already been opened successfully.
0698      * @param[in] fd The filedescriptor to write the copy to. It must
0699      * have already been opened for Write access.
0700      * @return A non-zero error value on failure and 0 on success.
0701      */
0702 int  edb_env_copyfd(EDB_env *env, edb_filehandle_t fd);
0703 
0704     /** @brief Copy an EXDB environment to the specified path, with options.
0705      *
0706      * This function may be used to make a backup of an existing environment.
0707      * No lockfile is created, since it gets recreated at need.
0708      * @note This call can trigger significant file size growth if run in
0709      * parallel with write transactions, because it employs a read-only
0710      * transaction. See long-lived transactions under @ref caveats_sec.
0711      * @param[in] env An environment handle returned by #edb_env_create(). It
0712      * must have already been opened successfully.
0713      * @param[in] path The directory in which the copy will reside. This
0714      * directory must already exist and be writable but must otherwise be
0715      * empty.
0716      * @param[in] flags Special options for this operation. This parameter
0717      * must be set to 0 or by bitwise OR'ing together one or more of the
0718      * values described here.
0719      * <ul>
0720      *  <li>#EDB_CP_COMPACT - Perform compaction while copying: omit free
0721      *      pages and sequentially renumber all pages in output. This option
0722      *      consumes more CPU and runs more slowly than the default.
0723      *      Currently it fails if the environment has suffered a page leak.
0724      * </ul>
0725      * @return A non-zero error value on failure and 0 on success.
0726      */
0727 int  edb_env_copy2(EDB_env *env, const char *path, unsigned int flags);
0728 
0729     /** @brief Copy an EXDB environment to the specified file descriptor,
0730      *  with options.
0731      *
0732      * This function may be used to make a backup of an existing environment.
0733      * No lockfile is created, since it gets recreated at need. See
0734      * #edb_env_copy2() for further details.
0735      * @note This call can trigger significant file size growth if run in
0736      * parallel with write transactions, because it employs a read-only
0737      * transaction. See long-lived transactions under @ref caveats_sec.
0738      * @param[in] env An environment handle returned by #edb_env_create(). It
0739      * must have already been opened successfully.
0740      * @param[in] fd The filedescriptor to write the copy to. It must
0741      * have already been opened for Write access.
0742      * @param[in] flags Special options for this operation.
0743      * See #edb_env_copy2() for options.
0744      * @return A non-zero error value on failure and 0 on success.
0745      */
0746 int  edb_env_copyfd2(EDB_env *env, edb_filehandle_t fd, unsigned int flags);
0747 
0748     /** @brief Return statistics about the EXDB environment.
0749      *
0750      * @param[in] env An environment handle returned by #edb_env_create()
0751      * @param[out] stat The address of an #EDB_stat structure
0752      *  where the statistics will be copied
0753      */
0754 int  edb_env_stat(EDB_env *env, EDB_stat *stat);
0755 
0756     /** @brief Return information about the EXDB environment.
0757      *
0758      * @param[in] env An environment handle returned by #edb_env_create()
0759      * @param[out] stat The address of an #EDB_envinfo structure
0760      *  where the information will be copied
0761      */
0762 int  edb_env_info(EDB_env *env, EDB_envinfo *stat);
0763 
0764     /** @brief Flush the data buffers to disk.
0765      *
0766      * Data is always written to disk when #edb_txn_commit() is called,
0767      * but the operating system may keep it buffered. EXDB always flushes
0768      * the OS buffers upon commit as well, unless the environment was
0769      * opened with #EDB_NOSYNC or in part #EDB_NOMETASYNC. This call is
0770      * not valid if the environment was opened with #EDB_RDONLY.
0771      * @param[in] env An environment handle returned by #edb_env_create()
0772      * @param[in] force If non-zero, force a synchronous flush.  Otherwise
0773      *  if the environment has the #EDB_NOSYNC flag set the flushes
0774      *  will be omitted, and with #EDB_MAPASYNC they will be asynchronous.
0775      * @return A non-zero error value on failure and 0 on success. Some possible
0776      * errors are:
0777      * <ul>
0778      *  <li>EACCES - the environment is read-only.
0779      *  <li>EINVAL - an invalid parameter was specified.
0780      *  <li>EIO - an error occurred during synchronization.
0781      * </ul>
0782      */
0783 int  edb_env_sync(EDB_env *env, int force);
0784 
0785     /** @brief Close the environment and release the memory map.
0786      *
0787      * Only a single thread may call this function. All transactions, databases,
0788      * and cursors must already be closed before calling this function. Attempts to
0789      * use any such handles after calling this function will cause a SIGSEGV.
0790      * The environment handle will be freed and must not be used again after this call.
0791      * @param[in] env An environment handle returned by #edb_env_create()
0792      */
0793 void edb_env_close(EDB_env *env);
0794 
0795     /** @brief Set environment flags.
0796      *
0797      * This may be used to set some flags in addition to those from
0798      * #edb_env_open(), or to unset these flags.  If several threads
0799      * change the flags at the same time, the result is undefined.
0800      * @param[in] env An environment handle returned by #edb_env_create()
0801      * @param[in] flags The flags to change, bitwise OR'ed together
0802      * @param[in] onoff A non-zero value sets the flags, zero clears them.
0803      * @return A non-zero error value on failure and 0 on success. Some possible
0804      * errors are:
0805      * <ul>
0806      *  <li>EINVAL - an invalid parameter was specified.
0807      * </ul>
0808      */
0809 int  edb_env_set_flags(EDB_env *env, unsigned int flags, int onoff);
0810 
0811     /** @brief Get environment flags.
0812      *
0813      * @param[in] env An environment handle returned by #edb_env_create()
0814      * @param[out] flags The address of an integer to store the flags
0815      * @return A non-zero error value on failure and 0 on success. Some possible
0816      * errors are:
0817      * <ul>
0818      *  <li>EINVAL - an invalid parameter was specified.
0819      * </ul>
0820      */
0821 int  edb_env_get_flags(EDB_env *env, unsigned int *flags);
0822 
0823     /** @brief Return the path that was used in #edb_env_open().
0824      *
0825      * @param[in] env An environment handle returned by #edb_env_create()
0826      * @param[out] path Address of a string pointer to contain the path. This
0827      * is the actual string in the environment, not a copy. It should not be
0828      * altered in any way.
0829      * @return A non-zero error value on failure and 0 on success. Some possible
0830      * errors are:
0831      * <ul>
0832      *  <li>EINVAL - an invalid parameter was specified.
0833      * </ul>
0834      */
0835 int  edb_env_get_path(EDB_env *env, const char **path);
0836 
0837     /** @brief Return the filedescriptor for the given environment.
0838      *
0839      * This function may be called after fork(), so the descriptor can be
0840      * closed before exec*().  Other EXDB file descriptors have FD_CLOEXEC.
0841      * (Until EXDB 0.9.18, only the lockfile had that.)
0842      *
0843      * @param[in] env An environment handle returned by #edb_env_create()
0844      * @param[out] fd Address of a edb_filehandle_t to contain the descriptor.
0845      * @return A non-zero error value on failure and 0 on success. Some possible
0846      * errors are:
0847      * <ul>
0848      *  <li>EINVAL - an invalid parameter was specified.
0849      * </ul>
0850      */
0851 int  edb_env_get_fd(EDB_env *env, edb_filehandle_t *fd);
0852 
0853     /** @brief Set the size of the memory map to use for this environment.
0854      *
0855      * The size should be a multiple of the OS page size. The default is
0856      * 10485760 bytes. The size of the memory map is also the maximum size
0857      * of the database. The value should be chosen as large as possible,
0858      * to accommodate future growth of the database.
0859      * This function should be called after #edb_env_create() and before #edb_env_open().
0860      * It may be called at later times if no transactions are active in
0861      * this process. Note that the library does not check for this condition,
0862      * the caller must ensure it explicitly.
0863      *
0864      * The new size takes effect immediately for the current process but
0865      * will not be persisted to any others until a write transaction has been
0866      * committed by the current process. Also, only mapsize increases are
0867      * persisted into the environment.
0868      *
0869      * If the mapsize is increased by another process, and data has grown
0870      * beyond the range of the current mapsize, #edb_txn_begin() will
0871      * return #EDB_MAP_RESIZED. This function may be called with a size
0872      * of zero to adopt the new size.
0873      *
0874      * Any attempt to set a size smaller than the space already consumed
0875      * by the environment will be silently changed to the current size of the used space.
0876      * @param[in] env An environment handle returned by #edb_env_create()
0877      * @param[in] size The size in bytes
0878      * @return A non-zero error value on failure and 0 on success. Some possible
0879      * errors are:
0880      * <ul>
0881      *  <li>EINVAL - an invalid parameter was specified, or the environment has
0882      *      an active write transaction.
0883      * </ul>
0884      */
0885 int  edb_env_set_mapsize(EDB_env *env, edb_size_t size);
0886 
0887     /** @brief Set the maximum number of threads/reader slots for the environment.
0888      *
0889      * This defines the number of slots in the lock table that is used to track readers in the
0890      * the environment. The default is 126.
0891      * Starting a read-only transaction normally ties a lock table slot to the
0892      * current thread until the environment closes or the thread exits. If
0893      * EDB_NOTLS is in use, #edb_txn_begin() instead ties the slot to the
0894      * EDB_txn object until it or the #EDB_env object is destroyed.
0895      * This function may only be called after #edb_env_create() and before #edb_env_open().
0896      * @param[in] env An environment handle returned by #edb_env_create()
0897      * @param[in] readers The maximum number of reader lock table slots
0898      * @return A non-zero error value on failure and 0 on success. Some possible
0899      * errors are:
0900      * <ul>
0901      *  <li>EINVAL - an invalid parameter was specified, or the environment is already open.
0902      * </ul>
0903      */
0904 int  edb_env_set_maxreaders(EDB_env *env, unsigned int readers);
0905 
0906     /** @brief Get the maximum number of threads/reader slots for the environment.
0907      *
0908      * @param[in] env An environment handle returned by #edb_env_create()
0909      * @param[out] readers Address of an integer to store the number of readers
0910      * @return A non-zero error value on failure and 0 on success. Some possible
0911      * errors are:
0912      * <ul>
0913      *  <li>EINVAL - an invalid parameter was specified.
0914      * </ul>
0915      */
0916 int  edb_env_get_maxreaders(EDB_env *env, unsigned int *readers);
0917 
0918     /** @brief Set the maximum number of named databases for the environment.
0919      *
0920      * This function is only needed if multiple databases will be used in the
0921      * environment. Simpler applications that use the environment as a single
0922      * unnamed database can ignore this option.
0923      * This function may only be called after #edb_env_create() and before #edb_env_open().
0924      *
0925      * Currently a moderate number of slots are cheap but a huge number gets
0926      * expensive: 7-120 words per transaction, and every #edb_dbi_open()
0927      * does a linear search of the opened slots.
0928      * @param[in] env An environment handle returned by #edb_env_create()
0929      * @param[in] dbs The maximum number of databases
0930      * @return A non-zero error value on failure and 0 on success. Some possible
0931      * errors are:
0932      * <ul>
0933      *  <li>EINVAL - an invalid parameter was specified, or the environment is already open.
0934      * </ul>
0935      */
0936 int  edb_env_set_maxdbs(EDB_env *env, EDB_dbi dbs);
0937 
0938     /** @brief Get the maximum size of keys and #EDB_DUPSORT data we can write.
0939      *
0940      * Depends on the compile-time constant #EDB_MAXKEYSIZE. Default 511.
0941      * See @ref EDB_val.
0942      * @param[in] env An environment handle returned by #edb_env_create()
0943      * @return The maximum size of a key we can write
0944      */
0945 int  edb_env_get_maxkeysize(EDB_env *env);
0946 
0947     /** @brief Set application information associated with the #EDB_env.
0948      *
0949      * @param[in] env An environment handle returned by #edb_env_create()
0950      * @param[in] ctx An arbitrary pointer for whatever the application needs.
0951      * @return A non-zero error value on failure and 0 on success.
0952      */
0953 int  edb_env_set_userctx(EDB_env *env, void *ctx);
0954 
0955     /** @brief Get the application information associated with the #EDB_env.
0956      *
0957      * @param[in] env An environment handle returned by #edb_env_create()
0958      * @return The pointer set by #edb_env_set_userctx().
0959      */
0960 void *edb_env_get_userctx(EDB_env *env);
0961 
0962     /** @brief A callback function for most EXDB assert() failures,
0963      * called before printing the message and aborting.
0964      *
0965      * @param[in] env An environment handle returned by #edb_env_create().
0966      * @param[in] msg The assertion message, not including newline.
0967      */
0968 typedef void EDB_assert_func(EDB_env *env, const char *msg);
0969 
0970     /** Set or reset the assert() callback of the environment.
0971      * Disabled if libexdb is buillt with NDEBUG.
0972      * @note This hack should become obsolete as exdb's error handling matures.
0973      * @param[in] env An environment handle returned by #edb_env_create().
0974      * @param[in] func An #EDB_assert_func function, or 0.
0975      * @return A non-zero error value on failure and 0 on success.
0976      */
0977 int  edb_env_set_assert(EDB_env *env, EDB_assert_func *func);
0978 
0979     /** @brief Create a transaction for use with the environment.
0980      *
0981      * The transaction handle may be discarded using #edb_txn_abort() or #edb_txn_commit().
0982      * @note A transaction and its cursors must only be used by a single
0983      * thread, and a thread may only have a single transaction at a time.
0984      * If #EDB_NOTLS is in use, this does not apply to read-only transactions.
0985      * @note Cursors may not span transactions.
0986      * @param[in] env An environment handle returned by #edb_env_create()
0987      * @param[in] parent If this parameter is non-NULL, the new transaction
0988      * will be a nested transaction, with the transaction indicated by \b parent
0989      * as its parent. Transactions may be nested to any level. A parent
0990      * transaction and its cursors may not issue any other operations than
0991      * edb_txn_commit and edb_txn_abort while it has active child transactions.
0992      * @param[in] flags Special options for this transaction. This parameter
0993      * must be set to 0 or by bitwise OR'ing together one or more of the
0994      * values described here.
0995      * <ul>
0996      *  <li>#EDB_RDONLY
0997      *      This transaction will not perform any write operations.
0998      *  <li>#EDB_NOSYNC
0999      *      Don't flush system buffers to disk when committing this transaction.
1000      *  <li>#EDB_NOMETASYNC
1001      *      Flush system buffers but omit metadata flush when committing this transaction.
1002      * </ul>
1003      * @param[out] txn Address where the new #EDB_txn handle will be stored
1004      * @return A non-zero error value on failure and 0 on success. Some possible
1005      * errors are:
1006      * <ul>
1007      *  <li>#EDB_PANIC - a fatal error occurred earlier and the environment
1008      *      must be shut down.
1009      *  <li>#EDB_MAP_RESIZED - another process wrote data beyond this EDB_env's
1010      *      mapsize and this environment's map must be resized as well.
1011      *      See #edb_env_set_mapsize().
1012      *  <li>#EDB_READERS_FULL - a read-only transaction was requested and
1013      *      the reader lock table is full. See #edb_env_set_maxreaders().
1014      *  <li>ENOMEM - out of memory.
1015      * </ul>
1016      */
1017 int  edb_txn_begin(EDB_env *env, EDB_txn *parent, unsigned int flags, EDB_txn **txn);
1018 
1019     /** @brief Returns the transaction's #EDB_env
1020      *
1021      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1022      */
1023 EDB_env *edb_txn_env(EDB_txn *txn);
1024 
1025     /** @brief Return the transaction's ID.
1026      *
1027      * This returns the identifier associated with this transaction. For a
1028      * read-only transaction, this corresponds to the snapshot being read;
1029      * concurrent readers will frequently have the same transaction ID.
1030      *
1031      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1032      * @return A transaction ID, valid if input is an active transaction.
1033      */
1034 edb_size_t edb_txn_id(EDB_txn *txn);
1035 
1036     /** @brief Commit all the operations of a transaction into the database.
1037      *
1038      * The transaction handle is freed. It and its cursors must not be used
1039      * again after this call, except with #edb_cursor_renew().
1040      * @note Earlier documentation incorrectly said all cursors would be freed.
1041      * Only write-transactions free cursors.
1042      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1043      * @return A non-zero error value on failure and 0 on success. Some possible
1044      * errors are:
1045      * <ul>
1046      *  <li>EINVAL - an invalid parameter was specified.
1047      *  <li>ENOSPC - no more disk space.
1048      *  <li>EIO - a low-level I/O error occurred while writing.
1049      *  <li>ENOMEM - out of memory.
1050      * </ul>
1051      */
1052 int  edb_txn_commit(EDB_txn *txn);
1053 
1054     /** @brief Abandon all the operations of the transaction instead of saving them.
1055      *
1056      * The transaction handle is freed. It and its cursors must not be used
1057      * again after this call, except with #edb_cursor_renew().
1058      * @note Earlier documentation incorrectly said all cursors would be freed.
1059      * Only write-transactions free cursors.
1060      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1061      */
1062 void edb_txn_abort(EDB_txn *txn);
1063 
1064     /** @brief Reset a read-only transaction.
1065      *
1066      * Abort the transaction like #edb_txn_abort(), but keep the transaction
1067      * handle. #edb_txn_renew() may reuse the handle. This saves allocation
1068      * overhead if the process will start a new read-only transaction soon,
1069      * and also locking overhead if #EDB_NOTLS is in use. The reader table
1070      * lock is released, but the table slot stays tied to its thread or
1071      * #EDB_txn. Use edb_txn_abort() to discard a reset handle, and to free
1072      * its lock table slot if EDB_NOTLS is in use.
1073      * Cursors opened within the transaction must not be used
1074      * again after this call, except with #edb_cursor_renew().
1075      * Reader locks generally don't interfere with writers, but they keep old
1076      * versions of database pages allocated. Thus they prevent the old pages
1077      * from being reused when writers commit new data, and so under heavy load
1078      * the database size may grow much more rapidly than otherwise.
1079      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1080      */
1081 void edb_txn_reset(EDB_txn *txn);
1082 
1083     /** @brief Renew a read-only transaction.
1084      *
1085      * This acquires a new reader lock for a transaction handle that had been
1086      * released by #edb_txn_reset(). It must be called before a reset transaction
1087      * may be used again.
1088      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1089      * @return A non-zero error value on failure and 0 on success. Some possible
1090      * errors are:
1091      * <ul>
1092      *  <li>#EDB_PANIC - a fatal error occurred earlier and the environment
1093      *      must be shut down.
1094      *  <li>EINVAL - an invalid parameter was specified.
1095      * </ul>
1096      */
1097 int  edb_txn_renew(EDB_txn *txn);
1098 
1099 /** Compat with version <= 0.9.4, avoid clash with libedb from EDB Tools project */
1100 #define edb_open(txn,name,flags,dbi)    edb_dbi_open(txn,name,flags,dbi)
1101 /** Compat with version <= 0.9.4, avoid clash with libedb from EDB Tools project */
1102 #define edb_close(env,dbi)              edb_dbi_close(env,dbi)
1103 
1104     /** @brief Open a database in the environment.
1105      *
1106      * A database handle denotes the name and parameters of a database,
1107      * independently of whether such a database exists.
1108      * The database handle may be discarded by calling #edb_dbi_close().
1109      * The old database handle is returned if the database was already open.
1110      * The handle may only be closed once.
1111      *
1112      * The database handle will be private to the current transaction until
1113      * the transaction is successfully committed. If the transaction is
1114      * aborted the handle will be closed automatically.
1115      * After a successful commit the handle will reside in the shared
1116      * environment, and may be used by other transactions.
1117      *
1118      * This function must not be called from multiple concurrent
1119      * transactions in the same process. A transaction that uses
1120      * this function must finish (either commit or abort) before
1121      * any other transaction in the process may use this function.
1122      *
1123      * To use named databases (with name != NULL), #edb_env_set_maxdbs()
1124      * must be called before opening the environment.  Database names are
1125      * keys in the unnamed database, and may be read but not written.
1126      *
1127      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1128      * @param[in] name The name of the database to open. If only a single
1129      *  database is needed in the environment, this value may be NULL.
1130      * @param[in] flags Special options for this database. This parameter
1131      * must be set to 0 or by bitwise OR'ing together one or more of the
1132      * values described here.
1133      * <ul>
1134      *  <li>#EDB_REVERSEKEY
1135      *      Keys are strings to be compared in reverse order, from the end
1136      *      of the strings to the beginning. By default, Keys are treated as strings and
1137      *      compared from beginning to end.
1138      *  <li>#EDB_DUPSORT
1139      *      Duplicate keys may be used in the database. (Or, from another perspective,
1140      *      keys may have multiple data items, stored in sorted order.) By default
1141      *      keys must be unique and may have only a single data item.
1142      *  <li>#EDB_INTEGERKEY
1143      *      Keys are binary integers in native byte order, either unsigned int
1144      *      or #edb_size_t, and will be sorted as such.
1145      *      (exdb expects 32-bit int <= size_t <= 32/64-bit edb_size_t.)
1146      *      The keys must all be of the same size.
1147      *  <li>#EDB_DUPFIXED
1148      *      This flag may only be used in combination with #EDB_DUPSORT. This option
1149      *      tells the library that the data items for this database are all the same
1150      *      size, which allows further optimizations in storage and retrieval. When
1151      *      all data items are the same size, the #EDB_GET_MULTIPLE, #EDB_NEXT_MULTIPLE
1152      *      and #EDB_PREV_MULTIPLE cursor operations may be used to retrieve multiple
1153      *      items at once.
1154      *  <li>#EDB_INTEGERDUP
1155      *      This option specifies that duplicate data items are binary integers,
1156      *      similar to #EDB_INTEGERKEY keys.
1157      *  <li>#EDB_REVERSEDUP
1158      *      This option specifies that duplicate data items should be compared as
1159      *      strings in reverse order.
1160      *  <li>#EDB_CREATE
1161      *      Create the named database if it doesn't exist. This option is not
1162      *      allowed in a read-only transaction or a read-only environment.
1163      * </ul>
1164      * @param[out] dbi Address where the new #EDB_dbi handle will be stored
1165      * @return A non-zero error value on failure and 0 on success. Some possible
1166      * errors are:
1167      * <ul>
1168      *  <li>#EDB_NOTFOUND - the specified database doesn't exist in the environment
1169      *      and #EDB_CREATE was not specified.
1170      *  <li>#EDB_DBS_FULL - too many databases have been opened. See #edb_env_set_maxdbs().
1171      * </ul>
1172      */
1173 int  edb_dbi_open(EDB_txn *txn, const char *name, unsigned int flags, EDB_dbi *dbi);
1174 
1175     /** @brief Retrieve statistics for a database.
1176      *
1177      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1178      * @param[in] dbi A database handle returned by #edb_dbi_open()
1179      * @param[out] stat The address of an #EDB_stat structure
1180      *  where the statistics will be copied
1181      * @return A non-zero error value on failure and 0 on success. Some possible
1182      * errors are:
1183      * <ul>
1184      *  <li>EINVAL - an invalid parameter was specified.
1185      * </ul>
1186      */
1187 int  edb_stat(EDB_txn *txn, EDB_dbi dbi, EDB_stat *stat);
1188 
1189     /** @brief Retrieve the DB flags for a database handle.
1190      *
1191      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1192      * @param[in] dbi A database handle returned by #edb_dbi_open()
1193      * @param[out] flags Address where the flags will be returned.
1194      * @return A non-zero error value on failure and 0 on success.
1195      */
1196 int edb_dbi_flags(EDB_txn *txn, EDB_dbi dbi, unsigned int *flags);
1197 
1198     /** @brief Close a database handle. Normally unnecessary. Use with care:
1199      *
1200      * This call is not mutex protected. Handles should only be closed by
1201      * a single thread, and only if no other threads are going to reference
1202      * the database handle or one of its cursors any further. Do not close
1203      * a handle if an existing transaction has modified its database.
1204      * Doing so can cause misbehavior from database corruption to errors
1205      * like EDB_BAD_VALSIZE (since the DB name is gone).
1206      *
1207      * Closing a database handle is not necessary, but lets #edb_dbi_open()
1208      * reuse the handle value.  Usually it's better to set a bigger
1209      * #edb_env_set_maxdbs(), unless that value would be large.
1210      *
1211      * @param[in] env An environment handle returned by #edb_env_create()
1212      * @param[in] dbi A database handle returned by #edb_dbi_open()
1213      */
1214 void edb_dbi_close(EDB_env *env, EDB_dbi dbi);
1215 
1216     /** @brief Empty or delete+close a database.
1217      *
1218      * See #edb_dbi_close() for restrictions about closing the DB handle.
1219      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1220      * @param[in] dbi A database handle returned by #edb_dbi_open()
1221      * @param[in] del 0 to empty the DB, 1 to delete it from the
1222      * environment and close the DB handle.
1223      * @return A non-zero error value on failure and 0 on success.
1224      */
1225 int  edb_drop(EDB_txn *txn, EDB_dbi dbi, int del);
1226 
1227     /** @brief Set a custom key comparison function for a database.
1228      *
1229      * The comparison function is called whenever it is necessary to compare a
1230      * key specified by the application with a key currently stored in the database.
1231      * If no comparison function is specified, and no special key flags were specified
1232      * with #edb_dbi_open(), the keys are compared lexically, with shorter keys collating
1233      * before longer keys.
1234      * @warning This function must be called before any data access functions are used,
1235      * otherwise data corruption may occur. The same comparison function must be used by every
1236      * program accessing the database, every time the database is used.
1237      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1238      * @param[in] dbi A database handle returned by #edb_dbi_open()
1239      * @param[in] cmp A #EDB_cmp_func function
1240      * @return A non-zero error value on failure and 0 on success. Some possible
1241      * errors are:
1242      * <ul>
1243      *  <li>EINVAL - an invalid parameter was specified.
1244      * </ul>
1245      */
1246 int  edb_set_compare(EDB_txn *txn, EDB_dbi dbi, EDB_cmp_func *cmp);
1247 
1248     /** @brief Set a custom data comparison function for a #EDB_DUPSORT database.
1249      *
1250      * This comparison function is called whenever it is necessary to compare a data
1251      * item specified by the application with a data item currently stored in the database.
1252      * This function only takes effect if the database was opened with the #EDB_DUPSORT
1253      * flag.
1254      * If no comparison function is specified, and no special key flags were specified
1255      * with #edb_dbi_open(), the data items are compared lexically, with shorter items collating
1256      * before longer items.
1257      * @warning This function must be called before any data access functions are used,
1258      * otherwise data corruption may occur. The same comparison function must be used by every
1259      * program accessing the database, every time the database is used.
1260      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1261      * @param[in] dbi A database handle returned by #edb_dbi_open()
1262      * @param[in] cmp A #EDB_cmp_func function
1263      * @return A non-zero error value on failure and 0 on success. Some possible
1264      * errors are:
1265      * <ul>
1266      *  <li>EINVAL - an invalid parameter was specified.
1267      * </ul>
1268      */
1269 int  edb_set_dupsort(EDB_txn *txn, EDB_dbi dbi, EDB_cmp_func *cmp);
1270 
1271     /** @brief Set a relocation function for a #EDB_FIXEDMAP database.
1272      *
1273      * @todo The relocation function is called whenever it is necessary to move the data
1274      * of an item to a different position in the database (e.g. through tree
1275      * balancing operations, shifts as a result of adds or deletes, etc.). It is
1276      * intended to allow address/position-dependent data items to be stored in
1277      * a database in an environment opened with the #EDB_FIXEDMAP option.
1278      * Currently the relocation feature is unimplemented and setting
1279      * this function has no effect.
1280      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1281      * @param[in] dbi A database handle returned by #edb_dbi_open()
1282      * @param[in] rel A #EDB_rel_func function
1283      * @return A non-zero error value on failure and 0 on success. Some possible
1284      * errors are:
1285      * <ul>
1286      *  <li>EINVAL - an invalid parameter was specified.
1287      * </ul>
1288      */
1289 int  edb_set_relfunc(EDB_txn *txn, EDB_dbi dbi, EDB_rel_func *rel);
1290 
1291     /** @brief Set a context pointer for a #EDB_FIXEDMAP database's relocation function.
1292      *
1293      * See #edb_set_relfunc and #EDB_rel_func for more details.
1294      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1295      * @param[in] dbi A database handle returned by #edb_dbi_open()
1296      * @param[in] ctx An arbitrary pointer for whatever the application needs.
1297      * It will be passed to the callback function set by #edb_set_relfunc
1298      * as its \b relctx parameter whenever the callback is invoked.
1299      * @return A non-zero error value on failure and 0 on success. Some possible
1300      * errors are:
1301      * <ul>
1302      *  <li>EINVAL - an invalid parameter was specified.
1303      * </ul>
1304      */
1305 int  edb_set_relctx(EDB_txn *txn, EDB_dbi dbi, void *ctx);
1306 
1307     /** @brief Get items from a database.
1308      *
1309      * This function retrieves key/data pairs from the database. The address
1310      * and length of the data associated with the specified \b key are returned
1311      * in the structure to which \b data refers.
1312      * If the database supports duplicate keys (#EDB_DUPSORT) then the
1313      * first data item for the key will be returned. Retrieval of other
1314      * items requires the use of #edb_cursor_get().
1315      *
1316      * @note The memory pointed to by the returned values is owned by the
1317      * database. The caller need not dispose of the memory, and may not
1318      * modify it in any way. For values returned in a read-only transaction
1319      * any modification attempts will cause a SIGSEGV.
1320      * @note Values returned from the database are valid only until a
1321      * subsequent update operation, or the end of the transaction.
1322      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1323      * @param[in] dbi A database handle returned by #edb_dbi_open()
1324      * @param[in] key The key to search for in the database
1325      * @param[out] data The data corresponding to the key
1326      * @return A non-zero error value on failure and 0 on success. Some possible
1327      * errors are:
1328      * <ul>
1329      *  <li>#EDB_NOTFOUND - the key was not in the database.
1330      *  <li>EINVAL - an invalid parameter was specified.
1331      * </ul>
1332      */
1333 int  edb_get(EDB_txn *txn, EDB_dbi dbi, EDB_val *key, EDB_val *data);
1334 
1335     /** @brief Store items into a database.
1336      *
1337      * This function stores key/data pairs in the database. The default behavior
1338      * is to enter the new key/data pair, replacing any previously existing key
1339      * if duplicates are disallowed, or adding a duplicate data item if
1340      * duplicates are allowed (#EDB_DUPSORT).
1341      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1342      * @param[in] dbi A database handle returned by #edb_dbi_open()
1343      * @param[in] key The key to store in the database
1344      * @param[in,out] data The data to store
1345      * @param[in] flags Special options for this operation. This parameter
1346      * must be set to 0 or by bitwise OR'ing together one or more of the
1347      * values described here.
1348      * <ul>
1349      *  <li>#EDB_NODUPDATA - enter the new key/data pair only if it does not
1350      *      already appear in the database. This flag may only be specified
1351      *      if the database was opened with #EDB_DUPSORT. The function will
1352      *      return #EDB_KEYEXIST if the key/data pair already appears in the
1353      *      database.
1354      *  <li>#EDB_NOOVERWRITE - enter the new key/data pair only if the key
1355      *      does not already appear in the database. The function will return
1356      *      #EDB_KEYEXIST if the key already appears in the database, even if
1357      *      the database supports duplicates (#EDB_DUPSORT). The \b data
1358      *      parameter will be set to point to the existing item.
1359      *  <li>#EDB_RESERVE - reserve space for data of the given size, but
1360      *      don't copy the given data. Instead, return a pointer to the
1361      *      reserved space, which the caller can fill in later - before
1362      *      the next update operation or the transaction ends. This saves
1363      *      an extra memcpy if the data is being generated later.
1364      *      EXDB does nothing else with this memory, the caller is expected
1365      *      to modify all of the space requested. This flag must not be
1366      *      specified if the database was opened with #EDB_DUPSORT.
1367      *  <li>#EDB_APPEND - append the given key/data pair to the end of the
1368      *      database. This option allows fast bulk loading when keys are
1369      *      already known to be in the correct order. Loading unsorted keys
1370      *      with this flag will cause a #EDB_KEYEXIST error.
1371      *  <li>#EDB_APPENDDUP - as above, but for sorted dup data.
1372      * </ul>
1373      * @return A non-zero error value on failure and 0 on success. Some possible
1374      * errors are:
1375      * <ul>
1376      *  <li>#EDB_MAP_FULL - the database is full, see #edb_env_set_mapsize().
1377      *  <li>#EDB_TXN_FULL - the transaction has too many dirty pages.
1378      *  <li>EACCES - an attempt was made to write in a read-only transaction.
1379      *  <li>EINVAL - an invalid parameter was specified.
1380      * </ul>
1381      */
1382 int  edb_put(EDB_txn *txn, EDB_dbi dbi, EDB_val *key, EDB_val *data,
1383                 unsigned int flags);
1384 
1385     /** @brief Delete items from a database.
1386      *
1387      * This function removes key/data pairs from the database.
1388      * If the database does not support sorted duplicate data items
1389      * (#EDB_DUPSORT) the data parameter is ignored.
1390      * If the database supports sorted duplicates and the data parameter
1391      * is NULL, all of the duplicate data items for the key will be
1392      * deleted. Otherwise, if the data parameter is non-NULL
1393      * only the matching data item will be deleted.
1394      * This function will return #EDB_NOTFOUND if the specified key/data
1395      * pair is not in the database.
1396      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1397      * @param[in] dbi A database handle returned by #edb_dbi_open()
1398      * @param[in] key The key to delete from the database
1399      * @param[in] data The data to delete
1400      * @return A non-zero error value on failure and 0 on success. Some possible
1401      * errors are:
1402      * <ul>
1403      *  <li>EACCES - an attempt was made to write in a read-only transaction.
1404      *  <li>EINVAL - an invalid parameter was specified.
1405      * </ul>
1406      */
1407 int  edb_del(EDB_txn *txn, EDB_dbi dbi, EDB_val *key, EDB_val *data);
1408 
1409     /** @brief Create a cursor handle.
1410      *
1411      * A cursor is associated with a specific transaction and database.
1412      * A cursor cannot be used when its database handle is closed.  Nor
1413      * when its transaction has ended, except with #edb_cursor_renew().
1414      * It can be discarded with #edb_cursor_close().
1415      * A cursor in a write-transaction can be closed before its transaction
1416      * ends, and will otherwise be closed when its transaction ends.
1417      * A cursor in a read-only transaction must be closed explicitly, before
1418      * or after its transaction ends. It can be reused with
1419      * #edb_cursor_renew() before finally closing it.
1420      * @note Earlier documentation said that cursors in every transaction
1421      * were closed when the transaction committed or aborted.
1422      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1423      * @param[in] dbi A database handle returned by #edb_dbi_open()
1424      * @param[out] cursor Address where the new #EDB_cursor handle will be stored
1425      * @return A non-zero error value on failure and 0 on success. Some possible
1426      * errors are:
1427      * <ul>
1428      *  <li>EINVAL - an invalid parameter was specified.
1429      * </ul>
1430      */
1431 int  edb_cursor_open(EDB_txn *txn, EDB_dbi dbi, EDB_cursor **cursor);
1432 
1433     /** @brief Close a cursor handle.
1434      *
1435      * The cursor handle will be freed and must not be used again after this call.
1436      * Its transaction must still be live if it is a write-transaction.
1437      * @param[in] cursor A cursor handle returned by #edb_cursor_open()
1438      */
1439 void edb_cursor_close(EDB_cursor *cursor);
1440 
1441     /** @brief Renew a cursor handle.
1442      *
1443      * A cursor is associated with a specific transaction and database.
1444      * Cursors that are only used in read-only
1445      * transactions may be re-used, to avoid unnecessary malloc/free overhead.
1446      * The cursor may be associated with a new read-only transaction, and
1447      * referencing the same database handle as it was created with.
1448      * This may be done whether the previous transaction is live or dead.
1449      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1450      * @param[in] cursor A cursor handle returned by #edb_cursor_open()
1451      * @return A non-zero error value on failure and 0 on success. Some possible
1452      * errors are:
1453      * <ul>
1454      *  <li>EINVAL - an invalid parameter was specified.
1455      * </ul>
1456      */
1457 int  edb_cursor_renew(EDB_txn *txn, EDB_cursor *cursor);
1458 
1459     /** @brief Return the cursor's transaction handle.
1460      *
1461      * @param[in] cursor A cursor handle returned by #edb_cursor_open()
1462      */
1463 EDB_txn *edb_cursor_txn(EDB_cursor *cursor);
1464 
1465     /** @brief Return the cursor's database handle.
1466      *
1467      * @param[in] cursor A cursor handle returned by #edb_cursor_open()
1468      */
1469 EDB_dbi edb_cursor_dbi(EDB_cursor *cursor);
1470 
1471     /** @brief Retrieve by cursor.
1472      *
1473      * This function retrieves key/data pairs from the database. The address and length
1474      * of the key are returned in the object to which \b key refers (except for the
1475      * case of the #EDB_SET option, in which the \b key object is unchanged), and
1476      * the address and length of the data are returned in the object to which \b data
1477      * refers.
1478      * See #edb_get() for restrictions on using the output values.
1479      * @param[in] cursor A cursor handle returned by #edb_cursor_open()
1480      * @param[in,out] key The key for a retrieved item
1481      * @param[in,out] data The data of a retrieved item
1482      * @param[in] op A cursor operation #EDB_cursor_op
1483      * @return A non-zero error value on failure and 0 on success. Some possible
1484      * errors are:
1485      * <ul>
1486      *  <li>#EDB_NOTFOUND - no matching key found.
1487      *  <li>EINVAL - an invalid parameter was specified.
1488      * </ul>
1489      */
1490 int  edb_cursor_get(EDB_cursor *cursor, EDB_val *key, EDB_val *data,
1491                 EDB_cursor_op op);
1492 
1493     /** @brief Store by cursor.
1494      *
1495      * This function stores key/data pairs into the database.
1496      * The cursor is positioned at the new item, or on failure usually near it.
1497      * @note Earlier documentation incorrectly said errors would leave the
1498      * state of the cursor unchanged.
1499      * @param[in] cursor A cursor handle returned by #edb_cursor_open()
1500      * @param[in] key The key operated on.
1501      * @param[in] data The data operated on.
1502      * @param[in] flags Options for this operation. This parameter
1503      * must be set to 0 or one of the values described here.
1504      * <ul>
1505      *  <li>#EDB_CURRENT - replace the item at the current cursor position.
1506      *      The \b key parameter must still be provided, and must match it.
1507      *      If using sorted duplicates (#EDB_DUPSORT) the data item must still
1508      *      sort into the same place. This is intended to be used when the
1509      *      new data is the same size as the old. Otherwise it will simply
1510      *      perform a delete of the old record followed by an insert.
1511      *  <li>#EDB_NODUPDATA - enter the new key/data pair only if it does not
1512      *      already appear in the database. This flag may only be specified
1513      *      if the database was opened with #EDB_DUPSORT. The function will
1514      *      return #EDB_KEYEXIST if the key/data pair already appears in the
1515      *      database.
1516      *  <li>#EDB_NOOVERWRITE - enter the new key/data pair only if the key
1517      *      does not already appear in the database. The function will return
1518      *      #EDB_KEYEXIST if the key already appears in the database, even if
1519      *      the database supports duplicates (#EDB_DUPSORT).
1520      *  <li>#EDB_RESERVE - reserve space for data of the given size, but
1521      *      don't copy the given data. Instead, return a pointer to the
1522      *      reserved space, which the caller can fill in later - before
1523      *      the next update operation or the transaction ends. This saves
1524      *      an extra memcpy if the data is being generated later. This flag
1525      *      must not be specified if the database was opened with #EDB_DUPSORT.
1526      *  <li>#EDB_APPEND - append the given key/data pair to the end of the
1527      *      database. No key comparisons are performed. This option allows
1528      *      fast bulk loading when keys are already known to be in the
1529      *      correct order. Loading unsorted keys with this flag will cause
1530      *      a #EDB_KEYEXIST error.
1531      *  <li>#EDB_APPENDDUP - as above, but for sorted dup data.
1532      *  <li>#EDB_MULTIPLE - store multiple contiguous data elements in a
1533      *      single request. This flag may only be specified if the database
1534      *      was opened with #EDB_DUPFIXED. The \b data argument must be an
1535      *      array of two EDB_vals. The mv_size of the first EDB_val must be
1536      *      the size of a single data element. The mv_data of the first EDB_val
1537      *      must point to the beginning of the array of contiguous data elements.
1538      *      The mv_size of the second EDB_val must be the count of the number
1539      *      of data elements to store. On return this field will be set to
1540      *      the count of the number of elements actually written. The mv_data
1541      *      of the second EDB_val is unused.
1542      * </ul>
1543      * @return A non-zero error value on failure and 0 on success. Some possible
1544      * errors are:
1545      * <ul>
1546      *  <li>#EDB_MAP_FULL - the database is full, see #edb_env_set_mapsize().
1547      *  <li>#EDB_TXN_FULL - the transaction has too many dirty pages.
1548      *  <li>EACCES - an attempt was made to write in a read-only transaction.
1549      *  <li>EINVAL - an invalid parameter was specified.
1550      * </ul>
1551      */
1552 int  edb_cursor_put(EDB_cursor *cursor, EDB_val *key, EDB_val *data,
1553                 unsigned int flags);
1554 
1555     /** @brief Delete current key/data pair
1556      *
1557      * This function deletes the key/data pair to which the cursor refers.
1558      * This does not invalidate the cursor, so operations such as EDB_NEXT
1559      * can still be used on it.
1560      * Both EDB_NEXT and EDB_GET_CURRENT will return the same record after
1561      * this operation.
1562      * @param[in] cursor A cursor handle returned by #edb_cursor_open()
1563      * @param[in] flags Options for this operation. This parameter
1564      * must be set to 0 or one of the values described here.
1565      * <ul>
1566      *  <li>#EDB_NODUPDATA - delete all of the data items for the current key.
1567      *      This flag may only be specified if the database was opened with #EDB_DUPSORT.
1568      * </ul>
1569      * @return A non-zero error value on failure and 0 on success. Some possible
1570      * errors are:
1571      * <ul>
1572      *  <li>EACCES - an attempt was made to write in a read-only transaction.
1573      *  <li>EINVAL - an invalid parameter was specified.
1574      * </ul>
1575      */
1576 int  edb_cursor_del(EDB_cursor *cursor, unsigned int flags);
1577 
1578     /** @brief Return count of duplicates for current key.
1579      *
1580      * This call is only valid on databases that support sorted duplicate
1581      * data items #EDB_DUPSORT.
1582      * @param[in] cursor A cursor handle returned by #edb_cursor_open()
1583      * @param[out] countp Address where the count will be stored
1584      * @return A non-zero error value on failure and 0 on success. Some possible
1585      * errors are:
1586      * <ul>
1587      *  <li>EINVAL - cursor is not initialized, or an invalid parameter was specified.
1588      * </ul>
1589      */
1590 int  edb_cursor_count(EDB_cursor *cursor, edb_size_t *countp);
1591 
1592     /** @brief Compare two data items according to a particular database.
1593      *
1594      * This returns a comparison as if the two data items were keys in the
1595      * specified database.
1596      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1597      * @param[in] dbi A database handle returned by #edb_dbi_open()
1598      * @param[in] a The first item to compare
1599      * @param[in] b The second item to compare
1600      * @return < 0 if a < b, 0 if a == b, > 0 if a > b
1601      */
1602 int  edb_cmp(EDB_txn *txn, EDB_dbi dbi, const EDB_val *a, const EDB_val *b);
1603 
1604     /** @brief Compare two data items according to a particular database.
1605      *
1606      * This returns a comparison as if the two items were data items of
1607      * the specified database. The database must have the #EDB_DUPSORT flag.
1608      * @param[in] txn A transaction handle returned by #edb_txn_begin()
1609      * @param[in] dbi A database handle returned by #edb_dbi_open()
1610      * @param[in] a The first item to compare
1611      * @param[in] b The second item to compare
1612      * @return < 0 if a < b, 0 if a == b, > 0 if a > b
1613      */
1614 int  edb_dcmp(EDB_txn *txn, EDB_dbi dbi, const EDB_val *a, const EDB_val *b);
1615 
1616     /** @brief A callback function used to print a message from the library.
1617      *
1618      * @param[in] msg The string to be printed.
1619      * @param[in] ctx An arbitrary context pointer for the callback.
1620      * @return < 0 on failure, >= 0 on success.
1621      */
1622 typedef int (EDB_msg_func)(const char *msg, void *ctx);
1623 
1624     /** @brief Dump the entries in the reader lock table.
1625      *
1626      * @param[in] env An environment handle returned by #edb_env_create()
1627      * @param[in] func A #EDB_msg_func function
1628      * @param[in] ctx Anything the message function needs
1629      * @return < 0 on failure, >= 0 on success.
1630      */
1631 int edb_reader_list(EDB_env *env, EDB_msg_func *func, void *ctx);
1632 
1633     /** @brief Check for stale entries in the reader lock table.
1634      *
1635      * @param[in] env An environment handle returned by #edb_env_create()
1636      * @param[out] dead Number of stale slots that were cleared
1637      * @return 0 on success, non-zero on failure.
1638      */
1639 int edb_reader_check(EDB_env *env, int *dead);
1640 /** @} */
1641 
1642 #ifdef __cplusplus
1643 }
1644 #endif
1645 /** @page tools EXDB Command Line Tools
1646     The following describes the command line tools that are available for EXDB.
1647     \li \ref edb_copy_1
1648     \li \ref edb_dump_1
1649     \li \ref edb_load_1
1650     \li \ref edb_stat_1
1651 */
1652 
1653 #endif /* _EXDB_H_ */