mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-21 18:08:21 +08:00
mdbx: refine mdbx_replace_ex().
We can skip update only when a data exactly the same, but user's md_dcmp() may returns zero even data is NOT matches byte-to-byte. So to skip update the cmp_len fast() should be used instead of md_dcmp(). Change-Id: I6ad0f7cfc6a18722b46e565deef3a544ddf9968a
This commit is contained in:
parent
88a4b8cb9b
commit
08faeda430
13
src/core.c
13
src/core.c
@ -18304,7 +18304,10 @@ int mdbx_replace_ex(MDBX_txn *txn, MDBX_dbi dbi, const MDBX_val *key,
|
|||||||
|
|
||||||
if (new_data) {
|
if (new_data) {
|
||||||
/* обновление конкретного дубликата */
|
/* обновление конкретного дубликата */
|
||||||
if (cx.outer.mc_dbx->md_dcmp(old_data, new_data) == 0)
|
/* (!!!) We can skip update only when a data exactly the same, but user's
|
||||||
|
* md_dcmp() may returns zero even data is NOT matches byte-to-byte.
|
||||||
|
* So to skip update the cmp_len fast() should be used. */
|
||||||
|
if (cmp_lenfast(old_data, new_data) == 0)
|
||||||
/* если данные совпадают, то ничего делать не надо */
|
/* если данные совпадают, то ничего делать не надо */
|
||||||
goto bailout;
|
goto bailout;
|
||||||
}
|
}
|
||||||
@ -18338,8 +18341,8 @@ int mdbx_replace_ex(MDBX_txn *txn, MDBX_dbi dbi, const MDBX_val *key,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* если данные совпадают, то ничего делать не надо */
|
/* если данные совпадают, то ничего делать не надо */
|
||||||
if (new_data &&
|
if (new_data && /* the cmp_lenfast() must be used, see above */
|
||||||
cx.outer.mc_dbx->md_dcmp(&present_data, new_data) == 0) {
|
cmp_lenfast(&present_data, new_data) == 0) {
|
||||||
*old_data = *new_data;
|
*old_data = *new_data;
|
||||||
goto bailout;
|
goto bailout;
|
||||||
}
|
}
|
||||||
@ -18355,8 +18358,8 @@ int mdbx_replace_ex(MDBX_txn *txn, MDBX_dbi dbi, const MDBX_val *key,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* если данные совпадают, то ничего делать не надо */
|
/* если данные совпадают, то ничего делать не надо */
|
||||||
if (new_data &&
|
if (new_data && /* the cmp_lenfast() must be used, see comment above */
|
||||||
cx.outer.mc_dbx->md_dcmp(&present_data, new_data) == 0) {
|
cmp_lenfast(&present_data, new_data) == 0) {
|
||||||
*old_data = *new_data;
|
*old_data = *new_data;
|
||||||
goto bailout;
|
goto bailout;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user