]> git.sur5r.net Git - openldap/commitdiff
Add MDB_PREV_MULTIPLE (collected mdb.master changes)
authorHoward Chu <hyc@openldap.org>
Thu, 7 Jan 2016 18:28:29 +0000 (18:28 +0000)
committerHallvard Furuseth <hallvard@openldap.org>
Thu, 15 Dec 2016 21:27:32 +0000 (22:27 +0100)
Logical counterpart to GET_MULTIPLE, NEXT_MULTIPLE

libraries/liblmdb/lmdb.h
libraries/liblmdb/mdb.c

index 14a05462a3b09f63c41c58b2ecd7c5f2620cc348..bc3a29484c3f287139c5ec81b0c869a230f736b3 100644 (file)
@@ -388,7 +388,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
@@ -1095,8 +1097,9 @@ int  mdb_txn_renew(MDB_txn *txn);
         *              This flag may only be used in combination with #MDB_DUPSORT. This option
         *              tells the library that the data items for this database are all the same
         *              size, which allows further optimizations in storage and retrieval. When
-        *              all data items are the same size, the #MDB_GET_MULTIPLE and #MDB_NEXT_MULTIPLE
-        *              cursor operations may be used to retrieve multiple items at once.
+        *              all data items are the same size, the #MDB_GET_MULTIPLE, #MDB_NEXT_MULTIPLE
+        *              and #MDB_PREV_MULTIPLE cursor operations may be used to retrieve multiple
+        *              items at once.
         *      <li>#MDB_INTEGERDUP
         *              This option specifies that duplicate data items are binary integers,
         *              similar to #MDB_INTEGERKEY keys.
index 465cf0dc00adc04cc3ebf536752ecb5bd9ee6b49..7d34276566a27158c7b5632db72c36f83f104c98 100644 (file)
@@ -1437,7 +1437,7 @@ mdb_strerror(int err)
         *      and the actual use of the message uses more than 4K of stack.
         */
 #define MSGSIZE        1024
-#define PADSIZE 4096
+#define PADSIZE        4096
        char buf[MSGSIZE+PADSIZE], *ptr = buf;
 #endif
        int i;
@@ -6215,6 +6215,30 @@ 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_last(mc, key, data);
+               else
+                       rc = MDB_SUCCESS;
+               if (rc == MDB_SUCCESS) {
+                       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: