|
|
@ -1214,11 +1214,12 @@ struct MDB_txn { |
|
|
|
* @ingroup internal |
|
|
|
* @ingroup internal |
|
|
|
* @{ |
|
|
|
* @{ |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
#define DB_DIRTY 0x01 /**< DB was modified or is DUPSORT data */ |
|
|
|
#define DB_DIRTY 0x01 /**< DB was written in this txn */ |
|
|
|
#define DB_STALE 0x02 /**< Named-DB record is older than txnID */ |
|
|
|
#define DB_STALE 0x02 /**< Named-DB record is older than txnID */ |
|
|
|
#define DB_NEW 0x04 /**< Named-DB handle opened in this txn */ |
|
|
|
#define DB_NEW 0x04 /**< Named-DB handle opened in this txn */ |
|
|
|
#define DB_VALID 0x08 /**< DB handle is valid, see also #MDB_VALID */ |
|
|
|
#define DB_VALID 0x08 /**< DB handle is valid, see also #MDB_VALID */ |
|
|
|
#define DB_USRVALID 0x10 /**< As #DB_VALID, but not set for #FREE_DBI */ |
|
|
|
#define DB_USRVALID 0x10 /**< As #DB_VALID, but not set for #FREE_DBI */ |
|
|
|
|
|
|
|
#define DB_DUPDATA 0x20 /**< DB is #MDB_DUPSORT data */ |
|
|
|
/** @} */ |
|
|
|
/** @} */ |
|
|
|
/** In write txns, array of cursors for each DB */ |
|
|
|
/** In write txns, array of cursors for each DB */ |
|
|
|
MDB_cursor **mt_cursors; |
|
|
|
MDB_cursor **mt_cursors; |
|
|
@ -7230,7 +7231,8 @@ mdb_cursor_touch(MDB_cursor *mc) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int rc = MDB_SUCCESS; |
|
|
|
int rc = MDB_SUCCESS; |
|
|
|
|
|
|
|
|
|
|
|
if (mc->mc_dbi >= CORE_DBS && !(*mc->mc_dbflag & DB_DIRTY)) { |
|
|
|
if (mc->mc_dbi >= CORE_DBS && !(*mc->mc_dbflag & (DB_DIRTY|DB_DUPDATA))) { |
|
|
|
|
|
|
|
/* Touch DB record of named DB */ |
|
|
|
MDB_cursor mc2; |
|
|
|
MDB_cursor mc2; |
|
|
|
MDB_xcursor mcx; |
|
|
|
MDB_xcursor mcx; |
|
|
|
if (TXN_DBI_CHANGED(mc->mc_txn, mc->mc_dbi)) |
|
|
|
if (TXN_DBI_CHANGED(mc->mc_txn, mc->mc_dbi)) |
|
|
@ -8286,7 +8288,7 @@ mdb_xcursor_init1(MDB_cursor *mc, MDB_node *node) |
|
|
|
} |
|
|
|
} |
|
|
|
DPRINTF(("Sub-db -%u root page %"Yu, mx->mx_cursor.mc_dbi, |
|
|
|
DPRINTF(("Sub-db -%u root page %"Yu, mx->mx_cursor.mc_dbi, |
|
|
|
mx->mx_db.md_root)); |
|
|
|
mx->mx_db.md_root)); |
|
|
|
mx->mx_dbflag = DB_VALID|DB_USRVALID|DB_DIRTY; /* DB_DIRTY guides mdb_cursor_touch */ |
|
|
|
mx->mx_dbflag = DB_VALID|DB_USRVALID|DB_DUPDATA; |
|
|
|
if (NEED_CMP_CLONG(mx->mx_dbx.md_cmp, mx->mx_db.md_pad)) |
|
|
|
if (NEED_CMP_CLONG(mx->mx_dbx.md_cmp, mx->mx_db.md_pad)) |
|
|
|
mx->mx_dbx.md_cmp = mdb_cmp_clong; |
|
|
|
mx->mx_dbx.md_cmp = mdb_cmp_clong; |
|
|
|
} |
|
|
|
} |
|
|
@ -8310,7 +8312,7 @@ mdb_xcursor_init2(MDB_cursor *mc, MDB_xcursor *src_mx, int new_dupdata) |
|
|
|
mx->mx_cursor.mc_top = 0; |
|
|
|
mx->mx_cursor.mc_top = 0; |
|
|
|
mx->mx_cursor.mc_flags |= C_INITIALIZED; |
|
|
|
mx->mx_cursor.mc_flags |= C_INITIALIZED; |
|
|
|
mx->mx_cursor.mc_ki[0] = 0; |
|
|
|
mx->mx_cursor.mc_ki[0] = 0; |
|
|
|
mx->mx_dbflag = DB_VALID|DB_USRVALID|DB_DIRTY; /* DB_DIRTY guides mdb_cursor_touch */ |
|
|
|
mx->mx_dbflag = DB_VALID|DB_USRVALID|DB_DUPDATA; |
|
|
|
#if UINT_MAX < MDB_SIZE_MAX /* matches mdb_xcursor_init1:NEED_CMP_CLONG() */ |
|
|
|
#if UINT_MAX < MDB_SIZE_MAX /* matches mdb_xcursor_init1:NEED_CMP_CLONG() */ |
|
|
|
mx->mx_dbx.md_cmp = src_mx->mx_dbx.md_cmp; |
|
|
|
mx->mx_dbx.md_cmp = src_mx->mx_dbx.md_cmp; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|