mdbx: refine mdbx_cursor_set() around the exact-flag.

Change-Id: Ifbad6bb4a3a4eabaf85c7986f9566705d53c45b9
This commit is contained in:
Leonid Yuriev 2020-10-26 00:11:58 +03:00
parent 1b21703c7b
commit 77e84ccca8

View File

@ -11681,9 +11681,6 @@ int mdbx_get(MDBX_txn *txn, MDBX_dbi dbi, const MDBX_val *key, MDBX_val *data) {
int mdbx_get_equal_or_great(MDBX_txn *txn, MDBX_dbi dbi, MDBX_val *key,
MDBX_val *data) {
DKBUF;
mdbx_debug("===> get db %u key [%s]", dbi, DKEY(key));
int rc = check_txn(txn, MDBX_TXN_BLOCKED);
if (unlikely(rc != MDBX_SUCCESS))
return rc;
@ -11702,20 +11699,13 @@ int mdbx_get_equal_or_great(MDBX_txn *txn, MDBX_dbi dbi, MDBX_val *key,
if (unlikely(rc != MDBX_SUCCESS))
return rc;
MDBX_val save_data = *data;
int exact = 0;
rc = mdbx_cursor_set(&cx.outer, key, data, MDBX_SET_RANGE, &exact);
rc = mdbx_cursor_set(
&cx.outer, key, data,
cx.outer.mc_xcursor ? MDBX_GET_BOTH_RANGE : MDBX_SET_RANGE, &exact);
if (unlikely(rc != MDBX_SUCCESS))
return rc;
if (exact && (txn->mt_dbs[dbi].md_flags & MDBX_DUPSORT) != 0) {
*data = save_data;
exact = 0;
rc = mdbx_cursor_set(&cx.outer, key, data, MDBX_GET_BOTH_RANGE, &exact);
if (unlikely(rc != MDBX_SUCCESS))
return rc;
}
return exact ? MDBX_SUCCESS : MDBX_RESULT_TRUE;
}
@ -12187,9 +12177,10 @@ set1:
if (op == MDBX_SET || op == MDBX_SET_KEY || op == MDBX_SET_RANGE) {
rc = mdbx_cursor_first(&mc->mc_xcursor->mx_cursor, data, NULL);
} else {
int ex2 = 0, *ex2p = (op == MDBX_GET_BOTH) ? &ex2 : NULL;
int dummy = 0;
rc = mdbx_cursor_set(&mc->mc_xcursor->mx_cursor, data, NULL,
MDBX_SET_RANGE, ex2p);
MDBX_SET_RANGE,
(op == MDBX_GET_BOTH_RANGE) ? exactp : &dummy);
}
if (unlikely(rc != MDBX_SUCCESS))
return rc;
@ -12231,6 +12222,7 @@ set1:
if (rc) {
if (op != MDBX_GET_BOTH_RANGE || rc > 0)
return MDBX_NOTFOUND;
*exactp = 0;
rc = 0;
}
*data = olddata;
@ -12420,8 +12412,7 @@ int mdbx_cursor_get(MDBX_cursor *mc, MDBX_val *key, MDBX_val *data,
case MDBX_SET_RANGE:
if (unlikely(key == NULL))
return MDBX_EINVAL;
rc = mdbx_cursor_set(mc, key, data, op,
op == MDBX_SET_RANGE ? NULL : &exact);
rc = mdbx_cursor_set(mc, key, data, op, &exact);
break;
case MDBX_GET_MULTIPLE:
if (unlikely(data == NULL || !(mc->mc_flags & C_INITIALIZED)))