From 08faeda43065ca49f5808afb9919df0f94d68866 Mon Sep 17 00:00:00 2001 From: Leonid Yuriev Date: Mon, 24 Aug 2020 13:31:52 +0300 Subject: [PATCH] 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 --- src/core.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/core.c b/src/core.c index 430e031a..3070f0f5 100644 --- a/src/core.c +++ b/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 (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; } @@ -18338,8 +18341,8 @@ int mdbx_replace_ex(MDBX_txn *txn, MDBX_dbi dbi, const MDBX_val *key, } } /* если данные совпадают, то ничего делать не надо */ - if (new_data && - cx.outer.mc_dbx->md_dcmp(&present_data, new_data) == 0) { + if (new_data && /* the cmp_lenfast() must be used, see above */ + cmp_lenfast(&present_data, new_data) == 0) { *old_data = *new_data; goto bailout; } @@ -18355,8 +18358,8 @@ int mdbx_replace_ex(MDBX_txn *txn, MDBX_dbi dbi, const MDBX_val *key, } } else { /* если данные совпадают, то ничего делать не надо */ - if (new_data && - cx.outer.mc_dbx->md_dcmp(&present_data, new_data) == 0) { + if (new_data && /* the cmp_lenfast() must be used, see comment above */ + cmp_lenfast(&present_data, new_data) == 0) { *old_data = *new_data; goto bailout; }