From fcbfc265c3631cbf5acba9552a23968d1ee4edd6 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sat, 13 Feb 2021 14:56:13 +0300 Subject: fixes #2721 (Dbx_mdbx: direct cursors skip the first record found) --- plugins/Dbx_mdbx/src/dbevents.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'plugins/Dbx_mdbx/src') diff --git a/plugins/Dbx_mdbx/src/dbevents.cpp b/plugins/Dbx_mdbx/src/dbevents.cpp index 7e895c7e0b..cbbc3faa58 100644 --- a/plugins/Dbx_mdbx/src/dbevents.cpp +++ b/plugins/Dbx_mdbx/src/dbevents.cpp @@ -649,17 +649,25 @@ public: { mdbx_cursor_bind(m_pOwner->StartTran(), m_pOwner->m_curEventsSort, m_pOwner->m_dbEventsSort); + MDBX_cursor_op op = (m_bForward) ? MDBX_NEXT : MDBX_PREV; + MDBX_val key = { &m_key, sizeof(m_key) }, data; switch (mdbx_cursor_get(m_pOwner->m_curEventsSort, &key, &data, MDBX_SET)) { - case MDBX_SUCCESS: case MDBX_NOTFOUND: + // for forward cursors we're already on the first record after set + // for reverse cursors that means that we moved a pointer after last record, so we need to fetch + if (m_bForward) + op = MDBX_GET_CURRENT; + break; + + case MDBX_SUCCESS: break; default: return 0; } - if (mdbx_cursor_get(m_pOwner->m_curEventsSort, &key, &data, (m_bForward) ? MDBX_NEXT : MDBX_PREV) != MDBX_SUCCESS) + if (mdbx_cursor_get(m_pOwner->m_curEventsSort, &key, &data, op) != MDBX_SUCCESS) return 0; DBEventSortingKey dbKey = *(const DBEventSortingKey *)key.iov_base; -- cgit v1.2.3