![]() |
|
|||
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_ */
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.1.0 LXR engine. The LXR team |
![]() ![]() |