]> git.sur5r.net Git - openldap/blobdiff - libraries/liblmdb/lmdb.h
ITS#7672 fix mdb_dbi_flags
[openldap] / libraries / liblmdb / lmdb.h
index 2076eb35faccd0ca6803b24fea331db743dffc1d..b2c3861ac99bf4f1632e3c27c5e1ab52a2f89500 100644 (file)
  *       cause further writes to grow the database quickly, and
  *       stale locks can block further operation.
  *
- *       Fix: Terminate all programs using the database, or make
- *       them close it.  Next database user will reset the lockfile.
+ *       Fix: Check for stale readers periodically, using the
+ *       #mdb_reader_check function or the mdb_stat tool. Or just
+ *       make all programs using the database close it; the lockfile
+ *       is always reset on first open of the environment.
  *
  *     - On BSD systems or others configured with MDB_USE_POSIX_SEM,
  *       startup can fail due to semaphores owned by another userid.
  *     ...when several processes can use a database concurrently:
  *
  *     - Avoid aborting a process with an active transaction.
- *       The transaction becomes "long-lived" as above until the lockfile
- *       is reset, since the process may not remove it from the lockfile.
+ *       The transaction becomes "long-lived" as above until a check
+ *       for stale readers is performed or the lockfile is reset,
+ *       since the process may not remove it from the lockfile.
  *
- *     - If you do that anyway, close the environment once in a while,
- *       so the lockfile can get reset.
+ *     - If you do that anyway, do a periodic check for stale readers. Or
+ *       close the environment once in a while, so the lockfile can get reset.
  *
  *     - Do not use MDB databases on remote filesystems, even between
  *       processes on the same host.  This breaks flock() on some OSes,
 extern "C" {
 #endif
 
+/** Unix permissions for creating files, or dummy definition for Windows */
 #ifdef _MSC_VER
 typedef        int     mdb_mode_t;
 #else
@@ -166,7 +170,7 @@ typedef int mdb_filehandle_t;
 /** Library minor version */
 #define MDB_VERSION_MINOR      9
 /** Library patch version */
-#define MDB_VERSION_PATCH      6
+#define MDB_VERSION_PATCH      7
 
 /** Combine args a,b,c into a single integer for easy version comparisons */
 #define MDB_VERINT(a,b,c)      (((a) << 24) | ((b) << 16) | (c))
@@ -309,7 +313,7 @@ typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *rel
 #define MDB_APPEND     0x20000
 /** Duplicate data is being appended, don't split full pages. */
 #define MDB_APPENDDUP  0x40000
-/** Store multiple data items in one call. */
+/** Store multiple data items in one call. Only for #MDB_DUPFIXED. */
 #define MDB_MULTIPLE   0x80000
 /*     @} */
 
@@ -382,11 +386,15 @@ typedef enum MDB_cursor_op {
 #define MDB_PAGE_FULL  (-30786)
        /** Database contents grew beyond environment mapsize */
 #define MDB_MAP_RESIZED        (-30785)
-       /** Database flags changed or would change */
+       /** MDB_INCOMPATIBLE: Operation and DB incompatible, or DB flags changed */
 #define MDB_INCOMPATIBLE       (-30784)
        /** Invalid reuse of reader locktable slot */
 #define MDB_BAD_RSLOT          (-30783)
-#define MDB_LAST_ERRCODE       MDB_BAD_RSLOT
+       /** Transaction cannot recover - it must be aborted */
+#define MDB_BAD_TXN                    (-30782)
+       /** Too big key/data, key is empty, or wrong DUPFIXED size */
+#define MDB_BAD_VALSIZE                (-30781)
+#define MDB_LAST_ERRCODE       MDB_BAD_VALSIZE
 /** @} */
 
 /** @brief Statistics for a database in the environment */
@@ -534,6 +542,10 @@ int  mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t
        /** @brief Copy an MDB environment to the specified path.
         *
         * This function may be used to make a backup of an existing environment.
+        * No lockfile is created, since it gets recreated at need.
+        * @note This call can trigger significant file size growth if run in
+        * parallel with write transactions, because it employs a read-only
+        * transaction. See long-lived transactions under @ref caveats_sec.
         * @param[in] env An environment handle returned by #mdb_env_create(). It
         * must have already been opened successfully.
         * @param[in] path The directory in which the copy will reside. This
@@ -546,6 +558,10 @@ int  mdb_env_copy(MDB_env *env, const char *path);
        /** @brief Copy an MDB environment to the specified file descriptor.
         *
         * This function may be used to make a backup of an existing environment.
+        * No lockfile is created, since it gets recreated at need.
+        * @note This call can trigger significant file size growth if run in
+        * parallel with write transactions, because it employs a read-only
+        * transaction. See long-lived transactions under @ref caveats_sec.
         * @param[in] env An environment handle returned by #mdb_env_create(). It
         * must have already been opened successfully.
         * @param[in] fd The filedescriptor to write the copy to. It must
@@ -707,6 +723,13 @@ 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.
+        *
+        * @param[in] env An environment handle returned by #mdb_env_create()
+        * @return The maximum size of a key. (#MDB_MAXKEYSIZE)
+        */
+int  mdb_env_get_maxkeysize(MDB_env *env);
+
        /** @brief Create a transaction for use with the environment.
         *
         * The transaction handle may be discarded using #mdb_txn_abort() or #mdb_txn_commit().
@@ -718,8 +741,8 @@ int  mdb_env_set_maxdbs(MDB_env *env, MDB_dbi dbs);
         * @param[in] parent If this parameter is non-NULL, the new transaction
         * will be a nested transaction, with the transaction indicated by \b parent
         * as its parent. Transactions may be nested to any level. A parent
-        * transaction may not issue any other operations besides mdb_txn_begin,
-        * mdb_txn_abort, or mdb_txn_commit while it has active child transactions.
+        * transaction and its cursors may not issue any other operations than
+        * mdb_txn_commit and mdb_txn_abort while it has active child transactions.
         * @param[in] flags Special options for this transaction. This parameter
         * must be set to 0 or by bitwise OR'ing together one or more of the
         * values described here.
@@ -742,6 +765,12 @@ int  mdb_env_set_maxdbs(MDB_env *env, MDB_dbi dbs);
         */
 int  mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **txn);
 
+       /** @brief Returns the transaction's #MDB_env
+        *
+        * @param[in] txn A transaction handle returned by #mdb_txn_begin()
+        */
+MDB_env *mdb_txn_env(MDB_txn *txn);
+
        /** @brief Commit all the operations of a transaction into the database.
         *
         * The transaction handle is freed. It and its cursors must not be used
@@ -889,6 +918,15 @@ int  mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *d
         */
 int  mdb_stat(MDB_txn *txn, MDB_dbi dbi, MDB_stat *stat);
 
+       /** @brief Retrieve the DB flags for a database handle.
+        *
+        * @param[in] txn A transaction handle returned by #mdb_txn_begin()
+        * @param[in] dbi A database handle returned by #mdb_dbi_open()
+        * @param[out] flags Address where the flags will be returned.
+        * @return A non-zero error value on failure and 0 on success.
+        */
+int mdb_dbi_flags(MDB_txn *txn, MDB_dbi dbi, unsigned int *flags);
+
        /** @brief Close a database handle.
         *
         * This call is not mutex protected. Handles should only be closed by
@@ -900,14 +938,12 @@ int  mdb_stat(MDB_txn *txn, MDB_dbi dbi, MDB_stat *stat);
         */
 void mdb_dbi_close(MDB_env *env, MDB_dbi dbi);
 
-       /** @brief Delete a database and/or free all its pages.
+       /** @brief Empty or delete+close a database.
         *
-        * If the \b del parameter is 1, the DB handle will be closed
-        * and the DB will be deleted.
         * @param[in] txn A transaction handle returned by #mdb_txn_begin()
         * @param[in] dbi A database handle returned by #mdb_dbi_open()
-        * @param[in] del 1 to delete the DB from the environment,
-        * 0 to just free its pages.
+        * @param[in] del 0 to empty the DB, 1 to delete it from the
+        * environment and close the DB handle.
         * @return A non-zero error value on failure and 0 on success.
         */
 int  mdb_drop(MDB_txn *txn, MDB_dbi dbi, int del);
@@ -1210,6 +1246,16 @@ int  mdb_cursor_get(MDB_cursor *cursor, MDB_val *key, MDB_val *data,
         *              correct order. Loading unsorted keys with this flag will cause
         *              data corruption.
         *      <li>#MDB_APPENDDUP - as above, but for sorted dup data.
+        *      <li>#MDB_MULTIPLE - store multiple contiguous data elements in a
+        *              single request. This flag may only be specified if the database
+        *              was opened with #MDB_DUPFIXED. The \b data argument must be an
+        *              array of two MDB_vals. The mv_size of the first MDB_val must be
+        *              the size of a single data element. The mv_data of the first MDB_val
+        *              must point to the beginning of the array of contiguous data elements.
+        *              The mv_size of the second MDB_val must be the count of the number
+        *              of data elements to store. On return this field will be set to
+        *              the count of the number of elements actually written. The mv_data
+        *              of the second MDB_val is unused.
         * </ul>
         * @return A non-zero error value on failure and 0 on success. Some possible
         * errors are:
@@ -1279,6 +1325,31 @@ int  mdb_cmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b);
         * @return < 0 if a < b, 0 if a == b, > 0 if a > b
         */
 int  mdb_dcmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b);
+
+       /** @brief A callback function used to print a message from the library.
+        *
+        * @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.
+        */
+typedef int (MDB_msg_func)(const char *msg, void *ctx);
+
+       /** @brief Dump the entries in the reader lock table.
+        *
+        * @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.
+        */
+int    mdb_reader_list(MDB_env *env, MDB_msg_func *func, void *ctx);
+
+       /** @brief Check for stale entries in the reader lock table.
+        *
+        * @param[in] env An environment handle returned by #mdb_env_create()
+        * @param[out] dead Number of stale slots that were cleared
+        * @return 0 on success, non-zero on failure.
+        */
+int    mdb_reader_check(MDB_env *env, int *dead);
 /**    @} */
 
 #ifdef __cplusplus