Compare commits

...

5 Commits

Author SHA1 Message Date
Леонид Юрьев (Leonid Yuriev)
f53ab49e2c mdbx: запечатка и уведомление об окончании поддержки.
Поддержка куста 0.11 завершена, ветка переведена в архив.
Каких-либо исправлений и тем более выпусков больше не будет.

The 0.11 hive is end-of-life, support has been terminated and the branch has been archived.
There will be no more fixes, much less releases.
2025-05-27 15:32:02 +03:00
Леонид Юрьев (Leonid Yuriev)
ba0449339d mdbx-doc: исправление опечаток/повторов в комментариях. 2025-04-07 13:02:10 +03:00
Леонид Юрьев (Leonid Yuriev)
e2f6569a70 mdbx: fix GCC 13.x minor warnings (backport). 2023-05-28 13:57:59 +03:00
Леонид Юрьев (Leonid Yuriev)
0fae7f98da mdbx: fix reset of comparison functions on change MainDB flags (backport). 2023-05-28 13:32:49 +03:00
Леонид Юрьев (Leonid Yuriev)
61d19dcf95 mdbx: fix export of legacy API functions (backport). 2023-04-16 11:27:38 +03:00
5 changed files with 130 additions and 114 deletions

View File

@@ -1,6 +1,10 @@
ChangeLog
---------
Поддержка куста 0.11 завершена, ветка переведена в архив. Каких-либо исправлений и тем более выпусков больше не будет.
The 0.11 hive is end-of-life, support has been terminated and the branch has been archived. There will be no more fixes, much less releases.
## v0.11.14 (Sergey Kapitsa) at 2023-02-14
The stable bugfix release in memory of [Sergey Kapitsa](https://en.wikipedia.org/wiki/Sergey_Kapitsa) on his 95th birthday.

8
mdbx.h
View File

@@ -136,7 +136,7 @@ are only a few cases of changing data.
| _DELETING_|||
|Key is absent → Error since no such key |\ref mdbx_del() or \ref mdbx_replace()|Error \ref MDBX_NOTFOUND|
|Key exist → Delete by key |\ref mdbx_del() with the parameter `data = NULL`|Deletion|
|Key exist → Delete by key with with data matching check|\ref mdbx_del() with the parameter `data` filled with the value which should be match for deletion|Deletion or \ref MDBX_NOTFOUND if the value does not match|
|Key exist → Delete by key with data matching check|\ref mdbx_del() with the parameter `data` filled with the value which should be match for deletion|Deletion or \ref MDBX_NOTFOUND if the value does not match|
|Delete at the current cursor position |\ref mdbx_cursor_del() with \ref MDBX_CURRENT flag|Deletion|
|Extract (read & delete) value by the key |\ref mdbx_replace() with zero flag and parameter `new_data = NULL`|Returning a deleted value|
@@ -1372,7 +1372,7 @@ enum MDBX_env_flags_t {
* \ref mdbx_env_set_syncbytes() and \ref mdbx_env_set_syncperiod() functions
* could be very useful with `MDBX_SAFE_NOSYNC` flag.
*
* The number and volume of of disk IOPs with MDBX_SAFE_NOSYNC flag will
* The number and volume of disk IOPs with MDBX_SAFE_NOSYNC flag will
* exactly the as without any no-sync flags. However, you should expect a
* larger process's [work set](https://bit.ly/2kA2tFX) and significantly worse
* a [locality of reference](https://bit.ly/2mbYq2J), due to the more
@@ -4897,7 +4897,7 @@ LIBMDBX_API int mdbx_dbi_sequence(MDBX_txn *txn, MDBX_dbi dbi, uint64_t *result,
* This returns a comparison as if the two data items were keys in the
* specified database.
*
* \warning There ss a Undefined behavior if one of arguments is invalid.
* \warning There is a Undefined behavior if one of arguments is invalid.
*
* \param [in] txn A transaction handle returned by \ref mdbx_txn_begin().
* \param [in] dbi A database handle returned by \ref mdbx_dbi_open().
@@ -4922,7 +4922,7 @@ mdbx_get_keycmp(MDBX_db_flags_t flags);
* This returns a comparison as if the two items were data items of the
* specified database.
*
* \warning There ss a Undefined behavior if one of arguments is invalid.
* \warning There is a Undefined behavior if one of arguments is invalid.
*
* \param [in] txn A transaction handle returned by \ref mdbx_txn_begin().
* \param [in] dbi A database handle returned by \ref mdbx_dbi_open().

View File

@@ -819,7 +819,7 @@ struct LIBMDBX_API_TYPE slice : public ::MDBX_val {
/// \brief Checks whether the content of the slice is printable.
/// \param [in] disable_utf8 By default if `disable_utf8` is `false` function
/// checks that content bytes are printable ASCII-7 characters or a valid UTF8
/// sequences. Otherwise, if if `disable_utf8` is `true` function checks that
/// sequences. Otherwise, if `disable_utf8` is `true` function checks that
/// content bytes are printable extended 8-bit ASCII codes.
MDBX_NOTHROW_PURE_FUNCTION bool
is_printable(bool disable_utf8 = false) const noexcept;

View File

@@ -7373,14 +7373,6 @@ __cold int mdbx_env_sync_ex(MDBX_env *env, bool force, bool nonblock) {
return mdbx_env_sync_internal(env, force, nonblock);
}
#ifndef LIBMDBX_NO_EXPORTS_LEGACY_API
__cold int mdbx_env_sync(MDBX_env *env) { return __inline_mdbx_env_sync(env); }
__cold int mdbx_env_sync_poll(MDBX_env *env) {
return __inline_mdbx_env_sync_poll(env);
}
#endif /* LIBMDBX_NO_EXPORTS_LEGACY_API */
/* Back up parent txn's cursors, then grab the originals for tracking */
static int mdbx_cursor_shadow(MDBX_txn *parent, MDBX_txn *nested) {
for (int i = parent->mt_numdbs; --i >= 0;) {
@@ -8185,13 +8177,6 @@ int mdbx_txn_renew(MDBX_txn *txn) {
return rc;
}
#ifndef LIBMDBX_NO_EXPORTS_LEGACY_API
int mdbx_txn_begin(MDBX_env *env, MDBX_txn *parent, MDBX_txn_flags_t flags,
MDBX_txn **ret) {
return __inline_mdbx_txn_begin(env, parent, flags, ret);
}
#endif /* LIBMDBX_NO_EXPORTS_LEGACY_API */
int mdbx_txn_set_userctx(MDBX_txn *txn, void *ctx) {
int rc = check_txn(txn, MDBX_TXN_FINISHED);
if (unlikely(rc != MDBX_SUCCESS))
@@ -9994,10 +9979,6 @@ static __always_inline bool check_dbi(MDBX_txn *txn, MDBX_dbi dbi,
return dbi_import(txn, dbi);
}
#ifndef LIBMDBX_NO_EXPORTS_LEGACY_API
int mdbx_txn_commit(MDBX_txn *txn) { return __inline_mdbx_txn_commit(txn); }
#endif /* LIBMDBX_NO_EXPORTS_LEGACY_API */
/* Merge child txn into parent */
static __inline void mdbx_txn_merge(MDBX_txn *const parent, MDBX_txn *const txn,
const unsigned parent_retired_len) {
@@ -11635,10 +11616,10 @@ __cold static intptr_t get_reasonable_db_maxsize(intptr_t *cached_result) {
return *cached_result;
}
__cold LIBMDBX_API int
mdbx_env_set_geometry(MDBX_env *env, intptr_t size_lower, intptr_t size_now,
intptr_t size_upper, intptr_t growth_step,
intptr_t shrink_threshold, intptr_t pagesize) {
__cold int mdbx_env_set_geometry(MDBX_env *env, intptr_t size_lower,
intptr_t size_now, intptr_t size_upper,
intptr_t growth_step,
intptr_t shrink_threshold, intptr_t pagesize) {
int rc = check_env(env, false);
if (unlikely(rc != MDBX_SUCCESS))
return rc;
@@ -12010,28 +11991,6 @@ bailout:
return rc;
}
#ifndef LIBMDBX_NO_EXPORTS_LEGACY_API
__cold int mdbx_env_set_mapsize(MDBX_env *env, size_t size) {
return __inline_mdbx_env_set_mapsize(env, size);
}
__cold int mdbx_env_set_maxdbs(MDBX_env *env, MDBX_dbi dbs) {
return __inline_mdbx_env_set_maxdbs(env, dbs);
}
__cold int mdbx_env_get_maxdbs(const MDBX_env *env, MDBX_dbi *dbs) {
return __inline_mdbx_env_get_maxdbs(env, dbs);
}
__cold int mdbx_env_set_maxreaders(MDBX_env *env, unsigned readers) {
return __inline_mdbx_env_set_maxreaders(env, readers);
}
__cold int mdbx_env_get_maxreaders(const MDBX_env *env, unsigned *readers) {
return __inline_mdbx_env_get_maxreaders(env, readers);
}
#endif /* LIBMDBX_NO_EXPORTS_LEGACY_API */
__cold static int alloc_page_buf(MDBX_env *env) {
return env->me_pbuf
? MDBX_SUCCESS
@@ -13561,12 +13520,6 @@ __cold int mdbx_env_close_ex(MDBX_env *env, bool dont_sync) {
return rc;
}
#ifndef LIBMDBX_NO_EXPORTS_LEGACY_API
__cold int mdbx_env_close(MDBX_env *env) {
return __inline_mdbx_env_close(env);
}
#endif /* LIBMDBX_NO_EXPORTS_LEGACY_API */
/* Compare two items pointing at aligned unsigned int's. */
static int __hot cmp_int_align4(const MDBX_val *a, const MDBX_val *b) {
mdbx_assert(NULL, a->iov_len == b->iov_len);
@@ -14949,7 +14902,7 @@ int mdbx_cursor_get(MDBX_cursor *mc, MDBX_val *key, MDBX_val *data,
if (unlikely(rc != MDBX_SUCCESS))
return rc;
int (*mfunc)(MDBX_cursor * mc, MDBX_val * key, MDBX_val * data);
int (*mfunc)(MDBX_cursor *mc, MDBX_val *key, MDBX_val *data);
switch (op) {
case MDBX_GET_CURRENT: {
if (unlikely(!(mc->mc_flags & C_INITIALIZED)))
@@ -15325,7 +15278,7 @@ static int mdbx_cursor_touch(MDBX_cursor *mc) {
}
int mdbx_cursor_put(MDBX_cursor *mc, const MDBX_val *key, MDBX_val *data,
unsigned flags) {
MDBX_put_flags_t flags) {
MDBX_env *env;
MDBX_page *sub_root = NULL;
MDBX_val xdata, *rdata, dkey, olddata;
@@ -15854,7 +15807,7 @@ int mdbx_cursor_put(MDBX_cursor *mc, const MDBX_val *key, MDBX_val *data,
} else {
/* Data is on sub-page */
fp = olddata.iov_base;
switch (flags) {
switch ((unsigned)flags) {
default:
if (!(mc->mc_db->md_flags & MDBX_DUPFIXED)) {
offset = node_size(data, nullptr) + sizeof(indx_t);
@@ -19129,7 +19082,7 @@ done:
}
int mdbx_put(MDBX_txn *txn, MDBX_dbi dbi, const MDBX_val *key, MDBX_val *data,
unsigned flags) {
MDBX_put_flags_t flags) {
int rc = check_txn_rw(txn, MDBX_TXN_BLOCKED);
if (unlikely(rc != MDBX_SUCCESS))
return rc;
@@ -19752,7 +19705,7 @@ __cold static int mdbx_env_copy_asis(MDBX_env *env, MDBX_txn *read_txn,
}
__cold int mdbx_env_copy2fd(MDBX_env *env, mdbx_filehandle_t fd,
unsigned flags) {
MDBX_copy_flags_t flags) {
int rc = check_env(env, true);
if (unlikely(rc != MDBX_SUCCESS))
return rc;
@@ -19976,12 +19929,6 @@ __cold int mdbx_env_get_fd(const MDBX_env *env, mdbx_filehandle_t *arg) {
return MDBX_SUCCESS;
}
#ifndef LIBMDBX_NO_EXPORTS_LEGACY_API
__cold int mdbx_env_stat(const MDBX_env *env, MDBX_stat *stat, size_t bytes) {
return __inline_mdbx_env_stat(env, stat, bytes);
}
#endif /* LIBMDBX_NO_EXPORTS_LEGACY_API */
static void stat_get(const MDBX_db *db, MDBX_stat *st, size_t bytes) {
st->ms_depth = db->md_depth;
st->ms_branch_pages = db->md_branch_pages;
@@ -20153,13 +20100,6 @@ __cold int mdbx_dbi_dupsort_depthmask(MDBX_txn *txn, MDBX_dbi dbi,
return (rc == MDBX_NOTFOUND) ? MDBX_SUCCESS : rc;
}
#ifndef LIBMDBX_NO_EXPORTS_LEGACY_API
__cold int mdbx_env_info(const MDBX_env *env, MDBX_envinfo *info,
size_t bytes) {
return __inline_mdbx_env_info(env, info, bytes);
}
#endif /* LIBMDBX_NO_EXPORTS_LEGACY_API */
__cold static int fetch_envinfo_ex(const MDBX_env *env, const MDBX_txn *txn,
MDBX_envinfo *arg, const size_t bytes) {
@@ -20387,6 +20327,10 @@ static int mdbx_dbi_bind(MDBX_txn *txn, const MDBX_dbi dbi, unsigned user_flags,
/* make sure flags changes get committed */
txn->mt_dbs[dbi].md_flags = user_flags & DB_PERSISTENT_FLAGS;
txn->mt_flags |= MDBX_TXN_DIRTY;
/* обнуляем компараторы для установки в соответствии с флагами,
* либо заданных пользователем */
txn->mt_dbxs[dbi].md_cmp = nullptr;
txn->mt_dbxs[dbi].md_dcmp = nullptr;
} else {
return /* FIXME: return extended info */ MDBX_INCOMPATIBLE;
}
@@ -20732,12 +20676,6 @@ int mdbx_dbi_flags_ex(MDBX_txn *txn, MDBX_dbi dbi, unsigned *flags,
return MDBX_SUCCESS;
}
#ifndef LIBMDBX_NO_EXPORTS_LEGACY_API
int mdbx_dbi_flags(MDBX_txn *txn, MDBX_dbi dbi, unsigned *flags) {
return __inline_mdbx_dbi_flags(txn, dbi, flags);
}
#endif /* LIBMDBX_NO_EXPORTS_LEGACY_API */
static int mdbx_drop_tree(MDBX_cursor *mc, const bool may_have_subDBs) {
int rc = mdbx_page_search(mc, NULL, MDBX_PS_FIRST);
if (likely(rc == MDBX_SUCCESS)) {
@@ -21135,7 +21073,8 @@ mdbx_cleanup_dead_readers(MDBX_env *env, int rdt_locked, int *dead) {
return rc;
}
__cold int mdbx_setup_debug(int loglevel, int flags, MDBX_debug_func *logger) {
__cold int mdbx_setup_debug(MDBX_log_level_t loglevel, MDBX_debug_flags_t flags,
MDBX_debug_func *logger) {
const int rc = mdbx_runtime_flags | (mdbx_loglevel << 16);
if (loglevel != MDBX_LOG_DONTCHANGE)
@@ -21255,16 +21194,6 @@ __cold static txnid_t mdbx_kick_longlived_readers(MDBX_env *env,
return mdbx_find_oldest(env->me_txn);
}
#ifndef LIBMDBX_NO_EXPORTS_LEGACY_API
__cold int mdbx_env_set_syncbytes(MDBX_env *env, size_t threshold) {
return __inline_mdbx_env_set_syncbytes(env, threshold);
}
__cold int mdbx_env_set_syncperiod(MDBX_env *env, unsigned seconds_16dot16) {
return __inline_mdbx_env_set_syncperiod(env, seconds_16dot16);
}
#endif /* LIBMDBX_NO_EXPORTS_LEGACY_API */
__cold int mdbx_env_set_hsr(MDBX_env *env, MDBX_hsr_func *hsr) {
int rc = check_env(env, false);
if (unlikely(rc != MDBX_SUCCESS))
@@ -22360,16 +22289,6 @@ int mdbx_dbi_sequence(MDBX_txn *txn, MDBX_dbi dbi, uint64_t *result,
/*----------------------------------------------------------------------------*/
#ifndef LIBMDBX_NO_EXPORTS_LEGACY_API
__cold MDBX_NOTHROW_CONST_FUNCTION intptr_t mdbx_limits_pgsize_min(void) {
return __inline_mdbx_limits_pgsize_min();
}
__cold MDBX_NOTHROW_CONST_FUNCTION intptr_t mdbx_limits_pgsize_max(void) {
return __inline_mdbx_limits_pgsize_max();
}
#endif /* LIBMDBX_NO_EXPORTS_LEGACY_API */
__cold intptr_t mdbx_limits_dbsize_min(intptr_t pagesize) {
if (pagesize < 1)
pagesize = (intptr_t)mdbx_default_pagesize();
@@ -22473,16 +22392,6 @@ uint32_t mdbx_key_from_ptrfloat(const float *const ieee754_32bit) {
return float2key(ieee754_32bit);
}
#ifndef LIBMDBX_NO_EXPORTS_LEGACY_API
MDBX_NOTHROW_CONST_FUNCTION uint64_t mdbx_key_from_int64(const int64_t i64) {
return __inline_mdbx_key_from_int64(i64);
}
MDBX_NOTHROW_CONST_FUNCTION uint32_t mdbx_key_from_int32(const int32_t i32) {
return __inline_mdbx_key_from_int32(i32);
}
#endif /* LIBMDBX_NO_EXPORTS_LEGACY_API */
#define IEEE754_DOUBLE_MANTISSA_SIZE 52
#define IEEE754_DOUBLE_EXPONENTA_BIAS 0x3FF
#define IEEE754_DOUBLE_EXPONENTA_MAX 0x7FF
@@ -22642,11 +22551,11 @@ int64_t mdbx_int64_from_key(const MDBX_val v) {
UINT64_C(0x8000000000000000));
}
__cold MDBX_cmp_func *mdbx_get_keycmp(unsigned flags) {
__cold MDBX_cmp_func *mdbx_get_keycmp(MDBX_db_flags_t flags) {
return get_default_keycmp(flags);
}
__cold MDBX_cmp_func *mdbx_get_datacmp(unsigned flags) {
__cold MDBX_cmp_func *mdbx_get_datacmp(MDBX_db_flags_t flags) {
return get_default_datacmp(flags);
}
@@ -23036,6 +22945,109 @@ int mdbx_set_attr(MDBX_txn *txn, MDBX_dbi dbi, MDBX_val *key, MDBX_val *data,
}
#endif /* MDBX_NEXENTA_ATTRS */
/*------------------------------------------------------------------------------
* Legacy API */
#ifndef LIBMDBX_NO_EXPORTS_LEGACY_API
LIBMDBX_API int mdbx_txn_begin(MDBX_env *env, MDBX_txn *parent,
MDBX_txn_flags_t flags, MDBX_txn **ret) {
return __inline_mdbx_txn_begin(env, parent, flags, ret);
}
LIBMDBX_API int mdbx_txn_commit(MDBX_txn *txn) {
return __inline_mdbx_txn_commit(txn);
}
LIBMDBX_API __cold int mdbx_env_stat(const MDBX_env *env, MDBX_stat *stat,
size_t bytes) {
return __inline_mdbx_env_stat(env, stat, bytes);
}
LIBMDBX_API __cold int mdbx_env_info(const MDBX_env *env, MDBX_envinfo *info,
size_t bytes) {
return __inline_mdbx_env_info(env, info, bytes);
}
LIBMDBX_API int mdbx_dbi_flags(MDBX_txn *txn, MDBX_dbi dbi, unsigned *flags) {
return __inline_mdbx_dbi_flags(txn, dbi, flags);
}
LIBMDBX_API __cold int mdbx_env_sync(MDBX_env *env) {
return __inline_mdbx_env_sync(env);
}
LIBMDBX_API __cold int mdbx_env_sync_poll(MDBX_env *env) {
return __inline_mdbx_env_sync_poll(env);
}
LIBMDBX_API __cold int mdbx_env_close(MDBX_env *env) {
return __inline_mdbx_env_close(env);
}
LIBMDBX_API __cold int mdbx_env_set_mapsize(MDBX_env *env, size_t size) {
return __inline_mdbx_env_set_mapsize(env, size);
}
LIBMDBX_API __cold int mdbx_env_set_maxdbs(MDBX_env *env, MDBX_dbi dbs) {
return __inline_mdbx_env_set_maxdbs(env, dbs);
}
LIBMDBX_API __cold int mdbx_env_get_maxdbs(const MDBX_env *env, MDBX_dbi *dbs) {
return __inline_mdbx_env_get_maxdbs(env, dbs);
}
LIBMDBX_API __cold int mdbx_env_set_maxreaders(MDBX_env *env,
unsigned readers) {
return __inline_mdbx_env_set_maxreaders(env, readers);
}
LIBMDBX_API __cold int mdbx_env_get_maxreaders(const MDBX_env *env,
unsigned *readers) {
return __inline_mdbx_env_get_maxreaders(env, readers);
}
LIBMDBX_API __cold int mdbx_env_set_syncbytes(MDBX_env *env, size_t threshold) {
return __inline_mdbx_env_set_syncbytes(env, threshold);
}
LIBMDBX_API __cold int mdbx_env_get_syncbytes(const MDBX_env *env,
size_t *threshold) {
return __inline_mdbx_env_get_syncbytes(env, threshold);
}
LIBMDBX_API __cold int mdbx_env_set_syncperiod(MDBX_env *env,
unsigned seconds_16dot16) {
return __inline_mdbx_env_set_syncperiod(env, seconds_16dot16);
}
LIBMDBX_API __cold int mdbx_env_get_syncperiod(const MDBX_env *env,
unsigned *seconds_16dot16) {
return __inline_mdbx_env_get_syncperiod(env, seconds_16dot16);
}
LIBMDBX_API __cold MDBX_NOTHROW_CONST_FUNCTION intptr_t
mdbx_limits_pgsize_min(void) {
return __inline_mdbx_limits_pgsize_min();
}
LIBMDBX_API __cold MDBX_NOTHROW_CONST_FUNCTION intptr_t
mdbx_limits_pgsize_max(void) {
return __inline_mdbx_limits_pgsize_max();
}
LIBMDBX_API MDBX_NOTHROW_CONST_FUNCTION uint64_t
mdbx_key_from_int64(const int64_t i64) {
return __inline_mdbx_key_from_int64(i64);
}
LIBMDBX_API MDBX_NOTHROW_CONST_FUNCTION uint32_t
mdbx_key_from_int32(const int32_t i32) {
return __inline_mdbx_key_from_int32(i32);
}
#endif /* LIBMDBX_NO_EXPORTS_LEGACY_API */
/******************************************************************************/
/* *INDENT-OFF* */
/* clang-format off */

View File

@@ -666,7 +666,7 @@ typedef struct MDBX_reader {
/* The header for the reader table (a memory-mapped lock file). */
typedef struct MDBX_lockinfo {
/* Stamp identifying this as an MDBX file.
* It must be set to MDBX_MAGIC with with MDBX_LOCK_VERSION. */
* It must be set to MDBX_MAGIC with MDBX_LOCK_VERSION. */
uint64_t mti_magic_and_version;
/* Format of this lock file. Must be set to MDBX_LOCK_FORMAT. */