mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-02 00:34: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
|
||||
*/
|
||||
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.
|
||||
*
|
||||
|
44
src/mdbx.c
44
src/mdbx.c
@ -3586,14 +3586,42 @@ fail:
|
||||
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) {
|
||||
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_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) {
|
||||
@ -9066,12 +9094,6 @@ int mdbx_set_dupsort(MDB_txn *txn, MDB_dbi dbi, MDB_cmp_func *cmp) {
|
||||
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) {
|
||||
unsigned i, snap_nreaders;
|
||||
MDB_reader *mr;
|
||||
|
Loading…
x
Reference in New Issue
Block a user