+static int
+mdb_cursor_touch(MDB_cursor *cursor)
+{
+ MDB_pageparent mpp;
+ unsigned int i;
+ int rc;
+
+ mpp.mp_parent = NULL;
+ mpp.mp_pi = 0;
+ for(i=0; i<cursor->mc_snum; i++) {
+ mpp.mp_page = cursor->mc_stack[i].mp_page;
+ if (!F_ISSET(mpp.mp_page->mp_flags, P_DIRTY)) {
+ rc = mdb_touch(cursor->mc_txn, cursor->mc_dbi, &mpp);
+ if (rc) return rc;
+ cursor->mc_stack[i].mp_page = mpp.mp_page;
+ }
+ mpp.mp_parent = mpp.mp_page;
+ mpp.mp_pi = cursor->mc_stack[i].mp_ki;
+ }
+ if (cursor->mc_xcursor)
+ return mdb_cursor_touch(&cursor->mc_xcursor->mx_cursor);
+ return MDB_SUCCESS;
+}
+
+int
+mdb_cursor_put(MDB_cursor *cursor, MDB_val *key, MDB_val *data,
+ unsigned int flags)
+{
+ MDB_ppage *top;
+ MDB_node *leaf;
+ int rc, exact;
+
+ if (flags == MDB_NODUPDATA) {
+ rc = mdb_cursor_set(cursor, key, data, MDB_GET_BOTH, &exact);
+ if (rc == 0)
+ return MDB_KEYEXIST;
+ if (rc != MDB_NOTFOUND)
+ return rc;
+ } else if (flags != MDB_CURRENT) {
+ rc = mdb_cursor_set(cursor, key, NULL, MDB_SET, &exact);
+ if (flags == MDB_NOOVERWRITE && rc == 0)
+ return MDB_KEYEXIST;
+ if (rc != MDB_NOTFOUND)
+ return rc;
+ } else if (!cursor->mc_initialized) {
+ return EINVAL;
+ }
+ /* Cursor is positioned, now make sure all pages are writable */
+ rc = mdb_cursor_touch(cursor);
+ if (rc) return rc;
+
+ top = CURSOR_TOP(cursor);
+
+}
+