From 85bfb3c1d129f137d455b7208bac285dfa9c6b2d Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Mon, 3 Oct 2011 11:25:31 -0700 Subject: [PATCH] Add rudimentary MDB_MULTIPLE support for puts Only for DUPFIXED DBs. Still could do better. --- libraries/libmdb/mdb.c | 12 ++++++++++++ libraries/libmdb/mdb.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index 03dd6225af..1995ea82d5 100644 --- a/libraries/libmdb/mdb.c +++ b/libraries/libmdb/mdb.c @@ -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; } diff --git a/libraries/libmdb/mdb.h b/libraries/libmdb/mdb.h index d70f7b29a3..9075c41e0c 100644 --- a/libraries/libmdb/mdb.h +++ b/libraries/libmdb/mdb.h @@ -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. -- 2.39.5