mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-04 18:04:13 +08:00
mdbx: add mdbx_get_maxkeysize().
This commit is contained in:
parent
5c5ef256b3
commit
a2593625cc
1
mdbx.h
1
mdbx.h
@ -925,6 +925,7 @@ LIBMDBX_API int mdbx_env_set_maxdbs(MDB_env *env, MDB_dbi dbs);
|
|||||||
* Returns The maximum size of a key we can write
|
* Returns The maximum size of a key we can write
|
||||||
*/
|
*/
|
||||||
LIBMDBX_API int mdbx_env_get_maxkeysize(MDB_env *env);
|
LIBMDBX_API int mdbx_env_get_maxkeysize(MDB_env *env);
|
||||||
|
LIBMDBX_API int mdbx_get_maxkeysize(size_t pagesize);
|
||||||
|
|
||||||
/* Set application information associated with the MDB_env.
|
/* Set application information associated with the MDB_env.
|
||||||
*
|
*
|
||||||
|
44
src/mdbx.c
44
src/mdbx.c
@ -3586,14 +3586,42 @@ fail:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __cold mdbx_env_get_maxkeysize(MDB_env *env) {
|
||||||
|
if (!env || env->me_signature != MDBX_ME_SIGNATURE || !env->me_maxkey_limit)
|
||||||
|
return EINVAL;
|
||||||
|
return env->me_maxkey_limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline ssize_t mdbx_calc_nodemax(ssize_t pagesize) {
|
||||||
|
assert(pagesize > 0);
|
||||||
|
return (((pagesize - PAGEHDRSZ) / MDB_MINKEYS) & -(ssize_t)2) -
|
||||||
|
sizeof(indx_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline ssize_t mdbx_calc_maxkey(ssize_t nodemax) {
|
||||||
|
assert(nodemax > 0);
|
||||||
|
return nodemax - (NODESIZE + sizeof(MDB_db));
|
||||||
|
}
|
||||||
|
|
||||||
|
int mdbx_get_maxkeysize(size_t pagesize) {
|
||||||
|
if (pagesize == 0)
|
||||||
|
pagesize = mdbx_syspagesize();
|
||||||
|
|
||||||
|
ssize_t nodemax = mdbx_calc_nodemax(pagesize);
|
||||||
|
if (nodemax < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
ssize_t maxkey = mdbx_calc_maxkey(nodemax);
|
||||||
|
return (maxkey > 0 && maxkey < INT_MAX) ? (int)maxkey : -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
static void __cold mdbx_env_setup_limits(MDB_env *env, size_t pagesize) {
|
static void __cold mdbx_env_setup_limits(MDB_env *env, size_t pagesize) {
|
||||||
env->me_maxfree_1pg = (pagesize - PAGEHDRSZ) / sizeof(pgno_t) - 1;
|
env->me_maxfree_1pg = (pagesize - PAGEHDRSZ) / sizeof(pgno_t) - 1;
|
||||||
env->me_nodemax =
|
|
||||||
(((pagesize - PAGEHDRSZ) / MDB_MINKEYS) & -2) - sizeof(indx_t);
|
|
||||||
env->me_maxkey_limit = env->me_nodemax - (NODESIZE + sizeof(MDB_db));
|
|
||||||
assert(env->me_maxkey_limit > 42 && env->me_maxkey_limit < pagesize);
|
|
||||||
|
|
||||||
env->me_maxpg = env->me_mapsize / pagesize;
|
env->me_maxpg = env->me_mapsize / pagesize;
|
||||||
|
|
||||||
|
env->me_nodemax = mdbx_calc_nodemax(pagesize);
|
||||||
|
env->me_maxkey_limit = mdbx_calc_maxkey(env->me_nodemax);
|
||||||
|
assert(env->me_maxkey_limit > 42 && env->me_maxkey_limit < pagesize);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __cold mdbx_env_create(MDB_env **env) {
|
int __cold mdbx_env_create(MDB_env **env) {
|
||||||
@ -9066,12 +9094,6 @@ int mdbx_set_dupsort(MDB_txn *txn, MDB_dbi dbi, MDB_cmp_func *cmp) {
|
|||||||
return MDB_SUCCESS;
|
return MDB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __cold mdbx_env_get_maxkeysize(MDB_env *env) {
|
|
||||||
if (!env || env->me_signature != MDBX_ME_SIGNATURE || !env->me_maxkey_limit)
|
|
||||||
return EINVAL;
|
|
||||||
return env->me_maxkey_limit;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __cold mdbx_reader_list(MDB_env *env, MDB_msg_func *func, void *ctx) {
|
int __cold mdbx_reader_list(MDB_env *env, MDB_msg_func *func, void *ctx) {
|
||||||
unsigned i, snap_nreaders;
|
unsigned i, snap_nreaders;
|
||||||
MDB_reader *mr;
|
MDB_reader *mr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user