mirror of
https://github.com/isar/libmdbx.git
synced 2024-10-30 23:39:19 +08:00
mdbx: support keys and dupsort values upto maxnode (half of a page) size.
Change-Id: I7717d55a0d6a7fdc4dc3caba8f8d3ad46a132f61
This commit is contained in:
parent
d9e1d7f23a
commit
8291de71cb
@ -6285,7 +6285,7 @@ int __cold mdbx_env_get_maxkeysize(MDBX_env *env) {
|
|||||||
#define mdbx_nodemax(pagesize) \
|
#define mdbx_nodemax(pagesize) \
|
||||||
(((((pagesize)-PAGEHDRSZ) / MDBX_MINKEYS) & ~(uintptr_t)1) - sizeof(indx_t))
|
(((((pagesize)-PAGEHDRSZ) / MDBX_MINKEYS) & ~(uintptr_t)1) - sizeof(indx_t))
|
||||||
|
|
||||||
#define mdbx_maxkey(nodemax) (((nodemax)-NODESIZE - sizeof(MDBX_db)) / 2)
|
#define mdbx_maxkey(nodemax) ((nodemax)-NODESIZE - sizeof(MDBX_db))
|
||||||
|
|
||||||
#define mdbx_maxgc_ov1page(pagesize) \
|
#define mdbx_maxgc_ov1page(pagesize) \
|
||||||
(((pagesize)-PAGEHDRSZ) / sizeof(pgno_t) - 1)
|
(((pagesize)-PAGEHDRSZ) / sizeof(pgno_t) - 1)
|
||||||
@ -9329,6 +9329,11 @@ int mdbx_cursor_put(MDBX_cursor *mc, MDBX_val *key, MDBX_val *data,
|
|||||||
return rc;
|
return rc;
|
||||||
flags -= MDBX_CURRENT;
|
flags -= MDBX_CURRENT;
|
||||||
}
|
}
|
||||||
|
} else if (unlikely(LEAFSIZE(key, data) > env->me_nodemax)) {
|
||||||
|
rc = mdbx_cursor_del(mc, 0);
|
||||||
|
if (rc != MDBX_SUCCESS)
|
||||||
|
return rc;
|
||||||
|
flags -= MDBX_CURRENT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -9560,18 +9565,21 @@ int mdbx_cursor_put(MDBX_cursor *mc, MDBX_val *key, MDBX_val *data,
|
|||||||
/* Was a single item before, must convert now */
|
/* Was a single item before, must convert now */
|
||||||
if (!F_ISSET(leaf->mn_flags, F_DUPDATA)) {
|
if (!F_ISSET(leaf->mn_flags, F_DUPDATA)) {
|
||||||
|
|
||||||
|
/* Just overwrite the current item */
|
||||||
|
if (flags & MDBX_CURRENT) {
|
||||||
|
mdbx_cassert(mc, LEAFSIZE(key, data) <= env->me_nodemax);
|
||||||
|
goto current;
|
||||||
|
}
|
||||||
|
|
||||||
/* does data match? */
|
/* does data match? */
|
||||||
if (!mc->mc_dbx->md_dcmp(data, &olddata)) {
|
if (!mc->mc_dbx->md_dcmp(data, &olddata)) {
|
||||||
if (unlikely(flags & (MDBX_NODUPDATA | MDBX_APPENDDUP)))
|
if (unlikely(flags & (MDBX_NODUPDATA | MDBX_APPENDDUP)))
|
||||||
return MDBX_KEYEXIST;
|
return MDBX_KEYEXIST;
|
||||||
/* overwrite it */
|
/* overwrite it */
|
||||||
|
mdbx_cassert(mc, LEAFSIZE(key, data) <= env->me_nodemax);
|
||||||
goto current;
|
goto current;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Just overwrite the current item */
|
|
||||||
if (flags & MDBX_CURRENT)
|
|
||||||
goto current;
|
|
||||||
|
|
||||||
/* Back up original data item */
|
/* Back up original data item */
|
||||||
dupdata_flag = 1;
|
dupdata_flag = 1;
|
||||||
dkey.iov_len = olddata.iov_len;
|
dkey.iov_len = olddata.iov_len;
|
||||||
@ -10218,6 +10226,7 @@ static int __must_check_result mdbx_node_add_leaf(MDBX_cursor *mc,
|
|||||||
node_size += sizeof(pgno_t);
|
node_size += sizeof(pgno_t);
|
||||||
} else if (unlikely(node_size + data->iov_len >
|
} else if (unlikely(node_size + data->iov_len >
|
||||||
mc->mc_txn->mt_env->me_nodemax)) {
|
mc->mc_txn->mt_env->me_nodemax)) {
|
||||||
|
mdbx_cassert(mc, !F_ISSET(mc->mc_db->md_flags, MDBX_DUPSORT));
|
||||||
const pgno_t ovpages = OVPAGES(mc->mc_txn->mt_env, data->iov_len);
|
const pgno_t ovpages = OVPAGES(mc->mc_txn->mt_env, data->iov_len);
|
||||||
/* Put data on overflow page. */
|
/* Put data on overflow page. */
|
||||||
mdbx_debug("data size is %" PRIuPTR ", node would be %" PRIuPTR
|
mdbx_debug("data size is %" PRIuPTR ", node would be %" PRIuPTR
|
||||||
|
Loading…
Reference in New Issue
Block a user