]> git.sur5r.net Git - openldap/commitdiff
Add rudimentary MDB_MULTIPLE support for puts
authorHoward Chu <hyc@openldap.org>
Mon, 3 Oct 2011 18:25:31 +0000 (11:25 -0700)
committerHoward Chu <hyc@openldap.org>
Mon, 3 Oct 2011 18:28:14 +0000 (11:28 -0700)
Only for DUPFIXED DBs. Still could do better.

libraries/libmdb/mdb.c
libraries/libmdb/mdb.h

index 03dd6225af63b44e63ed382bac5a8b6c3dd4037b..1995ea82d53b099c63dd80a873e1e1e0a68e6add 100644 (file)
@@ -3875,6 +3875,7 @@ mdb_cursor_put(MDB_cursor *mc, MDB_val *key, MDB_val *data,
        MDB_page        *fp;
        MDB_db dummy;
        int do_sub = 0;
+       unsigned int mcount = 0;
        size_t nsize;
        int rc, rc2;
        char pbuf[PAGESIZE];
@@ -3950,6 +3951,7 @@ top:
                /* DB has dups? */
                if (F_ISSET(mc->mc_db->md_flags, MDB_DUPSORT)) {
                        /* Was a single item before, must convert now */
+more:
                        if (!F_ISSET(leaf->mn_flags, F_DUPDATA)) {
                                /* Just overwrite the current item */
                                if (flags == MDB_CURRENT)
@@ -4158,6 +4160,14 @@ put_sub:
                 */
                if (!rc && !(flags & MDB_CURRENT))
                        mc->mc_db->md_entries++;
+               if (flags & MDB_MULTIPLE) {
+                       mcount++;
+                       if (mcount < data[1].mv_size) {
+                               data[0].mv_data = (char *)data[0].mv_data + data[0].mv_size;
+                               leaf = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
+                               goto more;
+                       }
+               }
        }
 done:
        return rc;
@@ -5308,6 +5318,8 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
        if (nflags & MDB_APPEND) {
                mn.mc_ki[mn.mc_top] = 0;
                sepkey = *newkey;
+               nkeys = 0;
+               split_indx = 0;
                goto newsep;
        }
 
index d70f7b29a3233394bbbf9e674aaf8b1710b84ab5..9075c41e0c6d929f0556fdca2aed1d9df7e348dd 100644 (file)
@@ -195,6 +195,8 @@ typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *rel
 #define MDB_RESERVE    0x10000
 /** Data is being appended, don't split full pages. */
 #define MDB_APPEND     0x20000
+/** Store multiple data items in one call. */
+#define MDB_MULTIPLE   0x40000
 /*     @} */
 
 /** @brief Cursor Get operations.