From ba29ae2cd257765615aaadd37feea3e6ef8425a0 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Thu, 7 Jan 2016 18:28:29 +0000 Subject: [PATCH] mdbx: backport - Add MDB_PREV_MULTIPLE. Logical counterpart to GET_MULTIPLE, NEXT_MULTIPLE Change-Id: I3f42cb1599997e79dbdc76bcf23b78314ededfc9 --- lmdb.h | 4 +++- mdb.c | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lmdb.h b/lmdb.h index 67a43b6c..8b137d57 100644 --- a/lmdb.h +++ b/lmdb.h @@ -384,7 +384,9 @@ typedef enum MDB_cursor_op { MDB_PREV_NODUP, /**< Position at last data item of previous key */ MDB_SET, /**< Position at specified key */ MDB_SET_KEY, /**< Position at specified key, return key + data */ - MDB_SET_RANGE /**< Position at first key greater than or equal to specified key. */ + MDB_SET_RANGE, /**< Position at first key greater than or equal to specified key. */ + MDB_PREV_MULTIPLE /**< Position at previous page and return key and up to + a page of duplicate data items. Only for #MDB_DUPFIXED */ } MDB_cursor_op; /** @defgroup errors Return Codes diff --git a/mdb.c b/mdb.c index 4f599dcb..8ad6ef35 100644 --- a/mdb.c +++ b/mdb.c @@ -6327,6 +6327,28 @@ fetchm: } } break; + case MDB_PREV_MULTIPLE: + if (data == NULL) { + rc = EINVAL; + break; + } + if (!(mc->mc_db->md_flags & MDB_DUPFIXED)) { + rc = MDB_INCOMPATIBLE; + break; + } + if (!(mc->mc_flags & C_INITIALIZED)) + rc = mdb_cursor_first(mc, key, data); + else { + MDB_cursor *mx = &mc->mc_xcursor->mx_cursor; + if (mx->mc_flags & C_INITIALIZED) { + rc = mdb_cursor_sibling(mx, 0); + if (rc == MDB_SUCCESS) + goto fetchm; + } else { + rc = MDB_NOTFOUND; + } + } + break; case MDB_NEXT: case MDB_NEXT_DUP: case MDB_NEXT_NODUP: