mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-30 13:30:57 +08:00
Merge remote-tracking branch 'origin/mdb.master'
This commit is contained in:
commit
fed9370fae
@ -1,5 +1,11 @@
|
||||
LMDB 0.9 Change Log
|
||||
|
||||
LMDB 0.9.13 Release (2014/06/18)
|
||||
Fix mdb_page_alloc unlimited overflow page search
|
||||
Documentation
|
||||
Re-fix MDB_CURRENT doc (ITS#7793)
|
||||
Fix MDB_GET_MULTIPLE/MDB_NEXT_MULTIPLE doc
|
||||
|
||||
LMDB 0.9.12 Release (2014/06/13)
|
||||
Fix MDB_GET_BOTH regression (ITS#7875,#7681)
|
||||
Fix MDB_MULTIPLE writing multiple keys (ITS#7834)
|
||||
|
@ -184,7 +184,7 @@ typedef int mdb_filehandle_t;
|
||||
/** Library minor version */
|
||||
#define MDB_VERSION_MINOR 9
|
||||
/** Library patch version */
|
||||
#define MDB_VERSION_PATCH 12
|
||||
#define MDB_VERSION_PATCH 13
|
||||
|
||||
/** Combine args a,b,c into a single integer for easy version comparisons */
|
||||
#define MDB_VERINT(a,b,c) (((a) << 24) | ((b) << 16) | (c))
|
||||
@ -345,16 +345,18 @@ typedef enum MDB_cursor_op {
|
||||
MDB_GET_BOTH, /**< Position at key/data pair. Only for #MDB_DUPSORT */
|
||||
MDB_GET_BOTH_RANGE, /**< position at key, nearest data. Only for #MDB_DUPSORT */
|
||||
MDB_GET_CURRENT, /**< Return key/data at current cursor position */
|
||||
MDB_GET_MULTIPLE, /**< Return all the duplicate data items at the current
|
||||
cursor position. Only for #MDB_DUPFIXED */
|
||||
MDB_GET_MULTIPLE, /**< Return key and up to a page of duplicate data items
|
||||
from current cursor position. Move cursor to prepare
|
||||
for #MDB_NEXT_MULTIPLE. Only for #MDB_DUPFIXED */
|
||||
MDB_LAST, /**< Position at last key/data item */
|
||||
MDB_LAST_DUP, /**< Position at last data item of current key.
|
||||
Only for #MDB_DUPSORT */
|
||||
MDB_NEXT, /**< Position at next data item */
|
||||
MDB_NEXT_DUP, /**< Position at next data item of current key.
|
||||
Only for #MDB_DUPSORT */
|
||||
MDB_NEXT_MULTIPLE, /**< Return all duplicate data items at the next
|
||||
cursor position. Only for #MDB_DUPFIXED */
|
||||
MDB_NEXT_MULTIPLE, /**< Return key and up to a page of duplicate data items
|
||||
from next cursor position. Move cursor to prepare
|
||||
for #MDB_NEXT_MULTIPLE. Only for #MDB_DUPFIXED */
|
||||
MDB_NEXT_NODUP, /**< Position at first data item of next key */
|
||||
MDB_PREV, /**< Position at previous data item */
|
||||
MDB_PREV_DUP, /**< Position at previous data item of current key.
|
||||
@ -1345,11 +1347,9 @@ int mdb_cursor_get(MDB_cursor *cursor, MDB_val *key, MDB_val *data,
|
||||
* @param[in] flags Options for this operation. This parameter
|
||||
* must be set to 0 or one of the values described here.
|
||||
* <ul>
|
||||
* <li>#MDB_CURRENT - overwrite the data of the key/data pair to which
|
||||
* the cursor refers with the specified data item. The \b key
|
||||
* parameter is not used for positioning the cursor, but should
|
||||
* still be provided. If using sorted duplicates (#MDB_DUPSORT)
|
||||
* the data item must still sort into the same place.
|
||||
* <li>#MDB_CURRENT - replace the item at the current cursor position.
|
||||
* The \b key parameter must still be provided, and must match it.
|
||||
* So must \b data if using sorted duplicates (#MDB_DUPSORT).
|
||||
* <li>#MDB_NODUPDATA - enter the new key/data pair only if it does not
|
||||
* already appear in the database. This flag may only be specified
|
||||
* if the database was opened with #MDB_DUPSORT. The function will
|
||||
|
@ -1790,7 +1790,7 @@ mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp)
|
||||
#else
|
||||
enum { Paranoid = 0, Max_retries = INT_MAX /*infinite*/ };
|
||||
#endif
|
||||
int rc, retry = Max_retries;
|
||||
int rc, retry = num * 20;
|
||||
MDB_txn *txn = mc->mc_txn;
|
||||
MDB_env *env = txn->mt_env;
|
||||
pgno_t pgno, *mop = env->me_pghead;
|
||||
@ -1823,7 +1823,7 @@ mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp)
|
||||
if (mop[i-n2] == pgno+n2)
|
||||
goto search_done;
|
||||
} while (--i > n2);
|
||||
if (Max_retries < INT_MAX && --retry < 0)
|
||||
if (--retry < 0)
|
||||
break;
|
||||
}
|
||||
|
||||
@ -5457,8 +5457,10 @@ set1:
|
||||
mc->mc_flags &= ~C_EOF;
|
||||
|
||||
if (IS_LEAF2(mp)) {
|
||||
key->mv_size = mc->mc_db->md_pad;
|
||||
key->mv_data = LEAF2KEY(mp, mc->mc_ki[mc->mc_top], key->mv_size);
|
||||
if (op == MDB_SET_RANGE || op == MDB_SET_KEY) {
|
||||
key->mv_size = mc->mc_db->md_pad;
|
||||
key->mv_data = LEAF2KEY(mp, mc->mc_ki[mc->mc_top], key->mv_size);
|
||||
}
|
||||
return MDB_SUCCESS;
|
||||
}
|
||||
|
||||
@ -5942,13 +5944,12 @@ mdb_cursor_put(MDB_cursor *mc, MDB_val *key, MDB_val *data,
|
||||
} else {
|
||||
/* there's only a key anyway, so this is a no-op */
|
||||
if (IS_LEAF2(mc->mc_pg[mc->mc_top])) {
|
||||
char *ptr;
|
||||
unsigned int ksize = mc->mc_db->md_pad;
|
||||
if (key->mv_size != ksize)
|
||||
return MDB_BAD_VALSIZE;
|
||||
if (flags == MDB_CURRENT) {
|
||||
char *ptr = LEAF2KEY(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top], ksize);
|
||||
memcpy(ptr, key->mv_data, ksize);
|
||||
}
|
||||
ptr = LEAF2KEY(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top], ksize);
|
||||
memcpy(ptr, key->mv_data, ksize);
|
||||
return MDB_SUCCESS;
|
||||
}
|
||||
|
||||
@ -5978,12 +5979,12 @@ more:
|
||||
if (mc->mc_dbx->md_dcmp == mdb_cmp_int && olddata.mv_size == sizeof(size_t))
|
||||
mc->mc_dbx->md_dcmp = mdb_cmp_clong;
|
||||
#endif
|
||||
/* if data matches, skip it */
|
||||
/* does data match? */
|
||||
if (!mc->mc_dbx->md_dcmp(data, &olddata)) {
|
||||
if (flags & MDB_NODUPDATA)
|
||||
return MDB_KEYEXIST;
|
||||
rc = MDB_SUCCESS;
|
||||
goto next_sub;
|
||||
/* overwrite it */
|
||||
goto current;
|
||||
}
|
||||
|
||||
/* Back up original data item */
|
||||
@ -6259,7 +6260,6 @@ put_sub:
|
||||
*/
|
||||
mc->mc_flags |= C_INITIALIZED;
|
||||
}
|
||||
next_sub:
|
||||
if (flags & MDB_MULTIPLE) {
|
||||
if (!rc) {
|
||||
mcount++;
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user