]> git.sur5r.net Git - openldap/blobdiff - libraries/liblmdb/lmdb.h
Merge remote-tracking branch 'origin/mdb.master' into OPENLDAP_REL_ENG_2_4
[openldap] / libraries / liblmdb / lmdb.h
index b2c3861ac99bf4f1632e3c27c5e1ab52a2f89500..2ebd43f3daedf7817786deaddfb7f97821e168d9 100644 (file)
  *       BSD systems or when otherwise configured with MDB_USE_POSIX_SEM.
  *       Multiple users can cause startup to fail later, as noted above.
  *
+ *     - There is normally no pure read-only mode, since readers need write
+ *       access to locks and lock file. Exceptions: On read-only filesystems
+ *       or with the #MDB_NOLOCK flag described under #mdb_env_open().
+ *
+ *     - By default, in versions before 0.9.10, unused portions of the data
+ *       file might receive garbage data from memory freed by other code.
+ *       (This does not happen when using the #MDB_WRITEMAP flag.) As of
+ *       0.9.10 the default behavior is to initialize such memory before
+ *       writing to the data file. Since there may be a slight performance
+ *       cost due to this initialization, applications may disable it using
+ *       the #MDB_NOMEMINIT flag. Applications handling sensitive data
+ *       which must not be written should not use this flag. This flag is
+ *       irrelevant when using #MDB_WRITEMAP.
+ *
  *     - A thread can only use one transaction at a time, plus any child
  *       transactions.  Each transaction belongs to one thread.  See below.
  *       The #MDB_NOTLS flag changes this for read-only transactions.
@@ -170,7 +184,7 @@ typedef int mdb_filehandle_t;
 /** Library minor version */
 #define MDB_VERSION_MINOR      9
 /** Library patch version */
-#define MDB_VERSION_PATCH      7
+#define MDB_VERSION_PATCH      11
 
 /** Combine args a,b,c into a single integer for easy version comparisons */
 #define MDB_VERINT(a,b,c)      (((a) << 24) | ((b) << 16) | (c))
@@ -180,7 +194,7 @@ typedef int mdb_filehandle_t;
        MDB_VERINT(MDB_VERSION_MAJOR,MDB_VERSION_MINOR,MDB_VERSION_PATCH)
 
 /** The release date of this library version */
-#define MDB_VERSION_DATE       "January 10, 2013"
+#define MDB_VERSION_DATE       "January 15, 2014"
 
 /** A stringifier for the version info */
 #define MDB_VERSTR(a,b,c,d)    "MDB " #a "." #b "." #c ": (" d ")"
@@ -216,13 +230,13 @@ typedef struct MDB_cursor MDB_cursor;
 /** @brief Generic structure used for passing keys and data in and out
  * of the database.
  *
- * Key sizes must be between 1 and the liblmdb build-time constant
- * #MDB_MAXKEYSIZE inclusive. This currently defaults to 511. The
- * same applies to data sizes in databases with the #MDB_DUPSORT flag.
- * Other data items can in theory be from 0 to 0xffffffff bytes long.
- *
  * Values returned from the database are valid only until a subsequent
- * update operation, or the end of the transaction.
+ * update operation, or the end of the transaction. Do not modify or
+ * free them, they commonly point into the database itself.
+ *
+ * Key sizes must be between 1 and #mdb_env_get_maxkeysize() inclusive.
+ * The same applies to data sizes in databases with the #MDB_DUPSORT flag.
+ * Other data items can in theory be from 0 to 0xffffffff bytes long.
  */
 typedef struct MDB_val {
        size_t           mv_size;       /**< size of the data item */
@@ -249,8 +263,6 @@ typedef int  (MDB_cmp_func)(const MDB_val *a, const MDB_val *b);
 typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *relctx);
 
 /** @defgroup  mdb_env Environment Flags
- *
- *     Values do not overlap Database Flags.
  *     @{
  */
        /** mmap at a fixed address (experimental) */
@@ -265,15 +277,19 @@ typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *rel
 #define MDB_NOMETASYNC         0x40000
        /** use writable mmap */
 #define MDB_WRITEMAP           0x80000
-       /** use asynchronous msync when MDB_WRITEMAP is used */
+       /** use asynchronous msync when #MDB_WRITEMAP is used */
 #define MDB_MAPASYNC           0x100000
        /** tie reader locktable slots to #MDB_txn objects instead of to threads */
 #define MDB_NOTLS              0x200000
+       /** don't do any locking, caller must manage their own locks */
+#define MDB_NOLOCK             0x400000
+       /** don't do readahead (no effect on Windows) */
+#define MDB_NORDAHEAD  0x800000
+       /** don't initialize malloc'd memory before writing to datafile */
+#define MDB_NOMEMINIT  0x1000000
 /** @} */
 
 /**    @defgroup       mdb_dbi_open    Database Flags
- *
- *     Values do not overlap Environment Flags.
  *     @{
  */
        /** use reverse string keys */
@@ -486,6 +502,8 @@ int  mdb_env_create(MDB_env **env);
         *              and uses fewer mallocs, but loses protection from application bugs
         *              like wild pointer writes and other bad updates into the database.
         *              Incompatible with nested transactions.
+        *              Processes with and without MDB_WRITEMAP on the same environment do
+        *              not cooperate well.
         *      <li>#MDB_NOMETASYNC
         *              Flush system buffers to disk only once per transaction, omit the
         *              metadata flush. Defer that until the system flushes files to disk,
@@ -523,6 +541,38 @@ int  mdb_env_create(MDB_env **env);
         *              user threads over individual OS threads need this option. Such an
         *              application must also serialize the write transactions in an OS
         *              thread, since MDB's write locking is unaware of the user threads.
+        *      <li>#MDB_NOLOCK
+        *              Don't do any locking. If concurrent access is anticipated, the
+        *              caller must manage all concurrency itself. For proper operation
+        *              the caller must enforce single-writer semantics, and must ensure
+        *              that no readers are using old transactions while a writer is
+        *              active. The simplest approach is to use an exclusive lock so that
+        *              no readers may be active at all when a writer begins.
+        *      <li>#MDB_NORDAHEAD
+        *              Turn off readahead. Most operating systems perform readahead on
+        *              read requests by default. This option turns it off if the OS
+        *              supports it. Turning it off may help random read performance
+        *              when the DB is larger than RAM and system RAM is full.
+        *              The option is not implemented on Windows.
+        *      <li>#MDB_NOMEMINIT
+        *              Don't initialize malloc'd memory before writing to unused spaces
+        *              in the data file. By default, memory for pages written to the data
+        *              file is obtained using malloc. While these pages may be reused in
+        *              subsequent transactions, freshly malloc'd pages will be initialized
+        *              to zeroes before use. This avoids persisting leftover data from other
+        *              code (that used the heap and subsequently freed the memory) into the
+        *              data file. Note that many other system libraries may allocate
+        *              and free memory from the heap for arbitrary uses. E.g., stdio may
+        *              use the heap for file I/O buffers. This initialization step has a
+        *              modest performance cost so some applications may want to disable
+        *              it using this flag. This option can be a problem for applications
+        *              which handle sensitive data like passwords, and it makes memory
+        *              checkers like Valgrind noisy. This flag is not needed with #MDB_WRITEMAP,
+        *              which writes directly to the mmap instead of using malloc for pages. The
+        *              initialization is also skipped if #MDB_RESERVE is used; the
+        *              caller is expected to overwrite all of the memory that was
+        *              reserved in that case.
+        *              This flag may be changed at any time using #mdb_env_set_flags().
         * </ul>
         * @param[in] mode The UNIX permissions to set on created files. This parameter
         * is ignored on Windows.
@@ -656,14 +706,33 @@ int  mdb_env_get_flags(MDB_env *env, unsigned int *flags);
         */
 int  mdb_env_get_path(MDB_env *env, const char **path);
 
+       /** @brief Return the filedescriptor for the given environment.
+        *
+        * @param[in] env An environment handle returned by #mdb_env_create()
+        * @param[out] fd Address of a mdb_filehandle_t to contain the descriptor.
+        * @return A non-zero error value on failure and 0 on success. Some possible
+        * errors are:
+        * <ul>
+        *      <li>EINVAL - an invalid parameter was specified.
+        * </ul>
+        */
+int  mdb_env_get_fd(MDB_env *env, mdb_filehandle_t *fd);
+
        /** @brief Set the size of the memory map to use for this environment.
         *
         * The size should be a multiple of the OS page size. The default is
         * 10485760 bytes. The size of the memory map is also the maximum size
         * of the database. The value should be chosen as large as possible,
         * to accommodate future growth of the database.
-        * This function may only be called after #mdb_env_create() and before #mdb_env_open().
-        * The size may be changed by closing and reopening the environment.
+        * This function should be called after #mdb_env_create() and before #mdb_env_open().
+        * It may be called at later times if no transactions are active in
+        * this process. Note that the library does not check for this condition,
+        * the caller must ensure it explicitly.
+        *
+        * If the mapsize is changed by another process, #mdb_txn_begin() will
+        * return #MDB_MAP_RESIZED. This function may be called with a size
+        * of zero to adopt the new size.
+        *
         * Any attempt to set a size smaller than the space already consumed
         * by the environment will be silently changed to the current size of the used space.
         * @param[in] env An environment handle returned by #mdb_env_create()
@@ -671,7 +740,8 @@ int  mdb_env_get_path(MDB_env *env, const char **path);
         * @return A non-zero error value on failure and 0 on success. Some possible
         * errors are:
         * <ul>
-        *      <li>EINVAL - an invalid parameter was specified, or the environment is already open.
+        *      <li>EINVAL - an invalid parameter was specified, or the environment has
+        *      an active write transaction.
         * </ul>
         */
 int  mdb_env_set_mapsize(MDB_env *env, size_t size);
@@ -723,13 +793,47 @@ int  mdb_env_get_maxreaders(MDB_env *env, unsigned int *readers);
         */
 int  mdb_env_set_maxdbs(MDB_env *env, MDB_dbi dbs);
 
-       /** @brief Get the maximum size of a key for the environment.
+       /** @brief Get the maximum size of keys and #MDB_DUPSORT data we can write.
         *
+        * Depends on the compile-time constant #MDB_MAXKEYSIZE. Default 511.
+        * See @ref MDB_val.
         * @param[in] env An environment handle returned by #mdb_env_create()
-        * @return The maximum size of a key. (#MDB_MAXKEYSIZE)
+        * @return The maximum size of a key we can write
         */
 int  mdb_env_get_maxkeysize(MDB_env *env);
 
+       /** @brief Set application information associated with the #MDB_env.
+        *
+        * @param[in] env An environment handle returned by #mdb_env_create()
+        * @param[in] ctx An arbitrary pointer for whatever the application needs.
+        * @return A non-zero error value on failure and 0 on success.
+        */
+int  mdb_env_set_userctx(MDB_env *env, void *ctx);
+
+       /** @brief Get the application information associated with the #MDB_env.
+        *
+        * @param[in] env An environment handle returned by #mdb_env_create()
+        * @return The pointer set by #mdb_env_set_userctx().
+        */
+void *mdb_env_get_userctx(MDB_env *env);
+
+       /** @brief A callback function for most MDB assert() failures,
+        * called before printing the message and aborting.
+        *
+        * @param[in] env An environment handle returned by #mdb_env_create().
+        * @param[in] msg The assertion message, not including newline.
+        */
+typedef void MDB_assert_func(MDB_env *env, const char *msg);
+
+       /** Set or reset the assert() callback of the environment.
+        * Disabled if liblmdb is buillt with NDEBUG.
+        * @note This hack should become obsolete as lmdb's error handling matures.
+        * @param[in] env An environment handle returned by #mdb_env_create().
+        * @parem[in] func An #MDB_assert_func function, or 0.
+        * @return A non-zero error value on failure and 0 on success.
+        */
+int  mdb_env_set_assert(MDB_env *env, MDB_assert_func *func);
+
        /** @brief Create a transaction for use with the environment.
         *
         * The transaction handle may be discarded using #mdb_txn_abort() or #mdb_txn_commit().
@@ -757,7 +861,8 @@ int  mdb_env_get_maxkeysize(MDB_env *env);
         *      <li>#MDB_PANIC - a fatal error occurred earlier and the environment
         *              must be shut down.
         *      <li>#MDB_MAP_RESIZED - another process wrote data beyond this MDB_env's
-        *              mapsize and the environment must be shut down.
+        *              mapsize and this environment's map must be resized as well.
+        *              See #mdb_env_set_mapsize().
         *      <li>#MDB_READERS_FULL - a read-only transaction was requested and
         *              the reader lock table is full. See #mdb_env_set_maxreaders().
         *      <li>ENOMEM - out of memory.
@@ -1085,6 +1190,8 @@ int  mdb_get(MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data);
         *              reserved space, which the caller can fill in later - before
         *              the next update operation or the transaction ends. This saves
         *              an extra memcpy if the data is being generated later.
+        *              MDB does nothing else with this memory, the caller is expected
+        *              to modify all of the space requested.
         *      <li>#MDB_APPEND - append the given key/data pair to the end of the
         *              database. No key comparisons are performed. This option allows
         *              fast bulk loading when keys are already known to be in the
@@ -1330,7 +1437,7 @@ int  mdb_dcmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b);
         *
         * @param[in] msg The string to be printed.
         * @param[in] ctx An arbitrary context pointer for the callback.
-        * @return < 0 on failure, 0 on success.
+        * @return < 0 on failure, >= 0 on success.
         */
 typedef int (MDB_msg_func)(const char *msg, void *ctx);
 
@@ -1339,7 +1446,7 @@ typedef int (MDB_msg_func)(const char *msg, void *ctx);
         * @param[in] env An environment handle returned by #mdb_env_create()
         * @param[in] func A #MDB_msg_func function
         * @param[in] ctx Anything the message function needs
-        * @return < 0 on failure, 0 on success.
+        * @return < 0 on failure, >= 0 on success.
         */
 int    mdb_reader_list(MDB_env *env, MDB_msg_func *func, void *ctx);