mdbx: add branch-less flags_db2sub().

This commit is contained in:
Leonid Yuriev 2020-05-07 18:25:03 +03:00
parent e4ce115876
commit 9736a36efb

View File

@ -388,8 +388,7 @@ __cold intptr_t mdbx_limits_valsize_max(intptr_t pagesize, unsigned flags) {
if (flags & MDBX_INTEGERDUP) if (flags & MDBX_INTEGERDUP)
return 8 /* sizeof(uint64_t) */; return 8 /* sizeof(uint64_t) */;
if (flags & if (flags & (MDBX_DUPSORT | MDBX_DUPFIXED | MDBX_REVERSEDUP))
(MDBX_DUPSORT | MDBX_DUPFIXED | MDBX_INTEGERDUP | MDBX_REVERSEDUP))
return BRANCH_NODEMAX(pagesize) - NODESIZE; return BRANCH_NODEMAX(pagesize) - NODESIZE;
const unsigned page_ln2 = log2n(pagesize); const unsigned page_ln2 = log2n(pagesize);
@ -468,6 +467,25 @@ static __pure_function __always_inline size_t branch_size(const MDBX_env *env,
return node_bytes + sizeof(indx_t); return node_bytes + sizeof(indx_t);
} }
static __pure_function __always_inline uint16_t
flags_db2sub(uint16_t db_flags) {
uint16_t sub_flags = db_flags & MDBX_DUPFIXED;
/* MDBX_INTEGERDUP => MDBX_INTEGERKEY */
#define SHIFT_INTEGERDUP_TO_INTEGERKEY 2
STATIC_ASSERT((MDBX_INTEGERDUP >> SHIFT_INTEGERDUP_TO_INTEGERKEY) ==
MDBX_INTEGERKEY);
sub_flags |= (db_flags & MDBX_INTEGERDUP) >> SHIFT_INTEGERDUP_TO_INTEGERKEY;
/* MDBX_REVERSEDUP => MDBX_REVERSEKEY */
#define SHIFT_REVERSEDUP_TO_REVERSEKEY 5
STATIC_ASSERT((MDBX_REVERSEDUP >> SHIFT_REVERSEDUP_TO_REVERSEKEY) ==
MDBX_REVERSEKEY);
sub_flags |= (db_flags & MDBX_REVERSEDUP) >> SHIFT_REVERSEDUP_TO_REVERSEKEY;
return sub_flags;
}
/*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
static __pure_function __always_inline size_t pgno2bytes(const MDBX_env *env, static __pure_function __always_inline size_t pgno2bytes(const MDBX_env *env,
@ -12227,12 +12245,10 @@ int mdbx_cursor_put(MDBX_cursor *mc, const MDBX_val *key, MDBX_val *data,
fp_flags &= ~P_SUBP; fp_flags &= ~P_SUBP;
prep_subDB: prep_subDB:
nested_dupdb.md_xsize = 0; nested_dupdb.md_xsize = 0;
nested_dupdb.md_flags = 0; nested_dupdb.md_flags = flags_db2sub(mc->mc_db->md_flags);
if (mc->mc_db->md_flags & MDBX_DUPFIXED) { if (mc->mc_db->md_flags & MDBX_DUPFIXED) {
fp_flags |= P_LEAF2; fp_flags |= P_LEAF2;
nested_dupdb.md_xsize = fp->mp_leaf2_ksize; nested_dupdb.md_xsize = fp->mp_leaf2_ksize;
if (mc->mc_db->md_flags & MDBX_INTEGERDUP)
nested_dupdb.md_flags = MDBX_INTEGERKEY;
} }
nested_dupdb.md_depth = 1; nested_dupdb.md_depth = 1;
nested_dupdb.md_branch_pages = 0; nested_dupdb.md_branch_pages = 0;
@ -12421,8 +12437,10 @@ new_sub:
} }
mdbx_cassert(mc, mc->mc_xcursor->mx_db.md_entries < PTRDIFF_MAX); mdbx_cassert(mc, mc->mc_xcursor->mx_db.md_entries < PTRDIFF_MAX);
ecount = (size_t)mc->mc_xcursor->mx_db.md_entries; ecount = (size_t)mc->mc_xcursor->mx_db.md_entries;
if (flags & MDBX_APPENDDUP) #define SHIFT_MDBX_APPENDDUP_TO_MDBX_APPEND 1
xflags |= MDBX_APPEND; STATIC_ASSERT((MDBX_APPENDDUP >> SHIFT_MDBX_APPENDDUP_TO_MDBX_APPEND) ==
MDBX_APPEND);
xflags |= (flags & MDBX_APPENDDUP) >> SHIFT_MDBX_APPENDDUP_TO_MDBX_APPEND;
rc = mdbx_cursor_put(&mc->mc_xcursor->mx_cursor, data, &xdata, xflags); rc = mdbx_cursor_put(&mc->mc_xcursor->mx_cursor, data, &xdata, xflags);
if (flags & F_SUBDATA) { if (flags & F_SUBDATA) {
void *db = node_data(node); void *db = node_data(node);
@ -12951,7 +12969,6 @@ static int mdbx_xcursor_init1(MDBX_cursor *mc, MDBX_node *node) {
return MDBX_CORRUPTED; return MDBX_CORRUPTED;
MDBX_page *fp = node_data(node); MDBX_page *fp = node_data(node);
mx->mx_db.md_xsize = 0; mx->mx_db.md_xsize = 0;
mx->mx_db.md_flags = 0;
mx->mx_db.md_depth = 1; mx->mx_db.md_depth = 1;
mx->mx_db.md_branch_pages = 0; mx->mx_db.md_branch_pages = 0;
mx->mx_db.md_leaf_pages = 1; mx->mx_db.md_leaf_pages = 1;
@ -12963,12 +12980,11 @@ static int mdbx_xcursor_init1(MDBX_cursor *mc, MDBX_node *node) {
mx->mx_cursor.mc_flags = C_INITIALIZED | C_SUB; mx->mx_cursor.mc_flags = C_INITIALIZED | C_SUB;
mx->mx_cursor.mc_pg[0] = fp; mx->mx_cursor.mc_pg[0] = fp;
mx->mx_cursor.mc_ki[0] = 0; mx->mx_cursor.mc_ki[0] = 0;
if (mc->mc_db->md_flags & MDBX_DUPFIXED) { mx->mx_db.md_flags = flags_db2sub(mc->mc_db->md_flags);
if (mc->mc_db->md_flags & MDBX_DUPFIXED)
mx->mx_db.md_xsize = fp->mp_leaf2_ksize; mx->mx_db.md_xsize = fp->mp_leaf2_ksize;
if (mc->mc_db->md_flags & MDBX_INTEGERDUP)
mx->mx_db.md_flags = MDBX_INTEGERKEY;
}
} }
mdbx_debug("Sub-db -%u root page %" PRIaPGNO, mx->mx_cursor.mc_dbi, mdbx_debug("Sub-db -%u root page %" PRIaPGNO, mx->mx_cursor.mc_dbi,
mx->mx_db.md_root); mx->mx_db.md_root);
mx->mx_dbstate = DB_VALID | DB_USRVALID | DB_DUPDATA; mx->mx_dbstate = DB_VALID | DB_USRVALID | DB_DUPDATA;