#define P_DIRTY_OVF 0x2000 /**< page has dirty overflow nodes */
#define P_LOOSE 0x4000 /**< page was dirtied then freed, can be reused */
#define P_KEEP 0x8000 /**< leave this page alone during spill */
+/** Persistent flags for page administration rather than page contents */
+#define P_ADM_FLAGS 0 /* later... */
/** @} */
uint16_t mh_flags; /**< @ref mdb_page */
#define mp_lower mp_pb.pb.pb_lower
} else {
txn->mt_flags |= MDB_TXN_ERROR;
}
+ ret->mp_flags = 0;
return ret;
}
/** Free a single page.
}
#endif
*mp = np;
+ np->mp_flags &= P_ADM_FLAGS;
return MDB_SUCCESS;
}
#endif
np->mp_pgno = pgno;
np->mp_txnid = txn->mt_txnid;
+ np->mp_flags = 0;
#if OVERFLOW_NOTYET
mdb_page_dirty(txn, np, ov);
#else
MDB_page *mp = mc->mc_pg[mc->mc_top], *np;
MDB_txn *txn = mc->mc_txn;
MDB_cursor *m2, *m3;
+ unsigned np_flags;
pgno_t pgno;
int rc;
return 0;
}
+ np_flags = np->mp_flags; /* P_ADM_FLAGS */
mdb_page_copy(np, mp, txn->mt_env->me_psize);
+ np->mp_flags |= np_flags | P_DIRTY;
np->mp_pgno = pgno;
- np->mp_flags |= P_DIRTY;
done:
np->mp_txnid = txn->mt_txnid;
xdata.mv_data = &dummy;
if ((rc = mdb_page_alloc(mc, 1, &mp)))
return rc;
+ fp_flags |= mp->mp_flags; /* P_ADM_FLAGS */
offset = env->me_psize - olddata.mv_size;
flags |= F_DUPDATA|F_SUBDATA;
dummy.md_root = mp->mp_pgno;
return rc;
DPRINTF(("allocated new mpage %"Yu", page size %u",
np->mp_pgno, mc->mc_txn->mt_env->me_psize));
- np->mp_flags = flags | P_DIRTY;
+ np->mp_flags |= flags | P_DIRTY;
np->mp_lower = (PAGEHDRSZ-PAGEBASE);
np->mp_upper = mc->mc_txn->mt_env->me_psize - PAGEBASE;
DKEY(newkey), mc->mc_ki[mc->mc_top], nkeys));
/* Create a right sibling. */
- if ((rc = mdb_page_new(mc, mp->mp_flags, 1, &rp)))
+ rc = mdb_page_new(mc, mp->mp_flags & (P_BRANCH|P_LEAF|P_LEAF2), 1, &rp);
+ if (rc)
return rc;
rp->mp_pad = mp->mp_pad;
DPRINTF(("new right sibling: page %"Yu, rp->mp_pgno));