mdbx: fix mdbx_replace().

Always return `old_data`, even no changes.
This commit is contained in:
Leo Yuriev 2016-12-22 20:54:06 +03:00
parent 9b38d8d422
commit ef375647c7

11
mdbx.c
View File

@ -369,7 +369,7 @@ int mdbx_cursor_eof(MDB_cursor *mc)
return (mc->mc_flags & C_INITIALIZED) ? 0 : 1; return (mc->mc_flags & C_INITIALIZED) ? 0 : 1;
} }
static int mdbx_is_samedata(MDB_val* a, MDB_val* b) { static int mdbx_is_samedata(const MDB_val* a, const MDB_val* b) {
return a->iov_len == b->iov_len return a->iov_len == b->iov_len
&& memcmp(a->iov_base, b->iov_base, a->iov_len) == 0; && memcmp(a->iov_base, b->iov_base, a->iov_len) == 0;
} }
@ -462,14 +462,21 @@ int mdbx_replace(MDB_txn *txn, MDB_dbi dbi,
goto bailout; goto bailout;
} }
/* если данные совпадают, то ничего делать не надо */ /* если данные совпадают, то ничего делать не надо */
if (new_data && mdbx_is_samedata(&present_data, new_data)) if (new_data && mdbx_is_samedata(&present_data, new_data)) {
*old_data = *new_data;
goto bailout; goto bailout;
}
} else if ((flags & MDB_NODUPDATA) && mdbx_is_samedata(&present_data, new_data)) { } else if ((flags & MDB_NODUPDATA) && mdbx_is_samedata(&present_data, new_data)) {
/* если данные совпадают и установлен MDB_NODUPDATA */ /* если данные совпадают и установлен MDB_NODUPDATA */
rc = MDB_KEYEXIST; rc = MDB_KEYEXIST;
goto bailout; goto bailout;
} }
} else { } else {
/* если данные совпадают, то ничего делать не надо */
if (new_data && mdbx_is_samedata(&present_data, new_data)) {
*old_data = *new_data;
goto bailout;
}
flags |= MDB_CURRENT; flags |= MDB_CURRENT;
} }